Make delivery and integration failures explicit

Persist reminder presentations and retry state, atomically complete collapsed deliveries, fall back across away reaches, and block permanent failures visibly (V-715, V-678). Fail closed when enabled integrations lack credentials and keep remote arms explicitly dark (V-691). Give mavweb one sanitized, request-correlated error contract (V-689). Owner explicitly requested direct commits to master.
This commit is contained in:
2026-08-13 02:50:59 +04:00
parent da9114b623
commit 35c6ff5a71
67 changed files with 3174 additions and 477 deletions
+16 -1
View File
@@ -78,7 +78,10 @@ vocabulary size. CW2's 51897 tokens shift seven special token ids. So CW2 is its
own transformers service on port 8081 (`deploy/cw2/serve.py`).
`stt.HTTPTranscriber` posts raw PCM to it with a bearer token, because audio is
the most sensitive thing that crosses this seam. The switch is `workstation.stt`
in `deploy/mavend.json`, and deleting the block sends every utterance to mavsttd.
in `deploy/mavend.json`. A LAN URL with an empty token fails config validation;
`workstation.stt.disabled: true` is the STT-only dark state;
`workstation.disabled: true` disables both remote arms. The model has its own
`model_disabled` switch because CW2 can remain live without the model proxy.
**mavgpud runs that service as a second child.** This is not an optimisation.
CW2 is a ROCm process on the same card, so it registers on the KFD like any
@@ -208,6 +211,18 @@ rule.
## Web UI conventions
Every HTTP response carries a server-generated `X-Request-ID`. Error responses
use `application/problem+json` with three fields: a sanitized `error`, a stable
low-cardinality `code`, and that `request_id`. `writeProblem` is the only error
writer: it records the full wrapped error beside the same ID in the mavweb log,
while implementation paths, transport messages and credentials never reach the
browser. A page that can usefully degrade instead of failing keeps HTTP 200 and
renders the same code/request reference beside its sanitized panel error.
The `/ecosystem` panel uses its HTTP request ID as `X-Correlation-ID` on its
direct Nexus, Praxis and Hexis reads. Calls routed through mavend retain
mavend's action-scoped correlation contract instead.
Server-rendered pages share `cmd/mavweb/static/ui.css` (served at `/ui.css`) and
the shell partial in `cmd/mavweb/shell.html`. A page opens with
`{{template "shellTop" "<page-key>"}}` and closes with `{{template "shellBottom"}}`,