fix(#3412): swarm-controller answers errors as RFC 9457 problem+json
Its three error paths returned a bare string with a status code, which forces a caller to treat the whole body as prose. hive-c0re converted some time ago, so swarm-controller was the last backend on the old shape -- and it is the one behind the hive status page's 503, where the body is frequently the entire diagnosis rather than a summary. Adds the commitment to docs/conventions.md, since it was implied by the code in one daemon and written down nowhere: an endpoint of ours answering with a bare string is a bug to file, not something callers work around. The test asserts the rendered response -- media type plus an addressable detail -- rather than the problem_details value, because a handler that built the value correctly and then returned it as a string would satisfy a test written against the type alone.
This commit is contained in:
parent
1d9a06482a
commit
58588a6866
4 changed files with 90 additions and 8 deletions
|
|
@ -318,6 +318,28 @@ refactor's concern. The dashboard frontend parses via
|
|||
`util.js::epochSec` wherever it needs arithmetic and feeds the string
|
||||
straight to `new Date(s)` for display.
|
||||
|
||||
### HTTP error bodies
|
||||
|
||||
Every HTTP API in this repo answers failures with **RFC 9457
|
||||
`application/problem+json`** (`{ type, title, status, detail }`), with the
|
||||
human-readable cause in `detail`. An endpoint of ours returning a bare string
|
||||
or a bespoke error shape is a **bug to file against the backend**, not
|
||||
something for the caller to work around.
|
||||
|
||||
Use the `problem_details` crate (`features = ["axum"]`), which the daemons
|
||||
already depend on: type a handler `Result<_, ProblemDetails>` and hand
|
||||
`ProblemDetails::from_status_code(...).with_detail(...)` to `Err`.
|
||||
|
||||
The reason is the consumer, not tidiness. The UIs show errors through one
|
||||
shared component with a copy button, so a caller has to know **which part of
|
||||
the body is the message**. A bare string forces it to treat the whole payload
|
||||
as prose, which is the difference between offering "copy the cause" and
|
||||
dumping a response — and the cause is frequently the entire diagnosis (a
|
||||
JetStream permission refusal, a TLS chain failure) rather than a summary.
|
||||
|
||||
Not in scope: the `hivectl` host-admin and in-agent unix sockets. Those are a
|
||||
JSON-line protocol with their own result types; RFC 9457 is an HTTP format.
|
||||
|
||||
## Tool groups
|
||||
|
||||
The MCP tool surface an agent receives is derived from a set of named
|
||||
|
|
|
|||
Loading…
Reference in a new issue