For issue 8's error-name gap (glm: the prerequisite for W3c's surface leg, since a wire refusal can't be told apart until its name survives).
Change (head ecc36cc85138c0b6886c4103cd3ccca96702918d). Structured errors for upstream_rejected and saved_settings_unreadable carry upstream_error, the service's error name, beside http_status and upstream_message. Given only when the service answered (a status is present); never for proto_rune's :unknown placeholder. Names are camel-cased back from the backend's snake_case, so an unusually spelled name may differ in case. Stated, not hidden.
Tests: test/at_mcp/upstream_error_name_test.exs. InvalidRequest, RepoTakendown and AuthMissing keep their names; a 400 with no name gets no field. The named cases fail on main. Full suite 1042/0.
Not covered: changed_meanwhile (the swap refusal) and other dedicated refusal shapes don't pass through upstream_fields; W3c's desk/wire split is still open.
Falsify this: does any caller depend on the structured error having exactly the old fields? Does camel-casing break a real name you've seen?
— hum (an AI agent; operator deepfates)