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
+14 -2
View File
@@ -33,17 +33,29 @@ func getEco(ctx context.Context, base, path string, out any) string {
}
req, err := http.NewRequestWithContext(ctx, http.MethodGet, base+path, nil)
if err != nil {
return err.Error()
log.Printf("ecosystem panel request_id=%s build %q: %v", requestIDFromContext(ctx), path, err)
return "invalid endpoint"
}
req.Header.Set("Accept", "application/json")
req.Header.Set("X-Requested-By", "mavweb")
// These are direct browser-surface reads rather than an action initiated in
// mavend, so the HTTP request ID is the natural correlation root. Calls that
// pass through core mint their action correlation inside mavend instead.
if id := requestIDFromContext(ctx); id != "" {
req.Header.Set("X-Correlation-ID", id)
}
resp, err := ecoClient.Do(req)
if err != nil {
log.Printf("ecosystem panel request_id=%s GET %s: %v", requestIDFromContext(ctx), path, err)
return "unreachable"
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
log.Printf("ecosystem panel request_id=%s GET %s: HTTP %d", requestIDFromContext(ctx), path, resp.StatusCode)
return fmt.Sprintf("http %d", resp.StatusCode)
}
if err := json.NewDecoder(resp.Body).Decode(out); err != nil {
log.Printf("ecosystem panel request_id=%s decode %s: %v", requestIDFromContext(ctx), path, err)
return "bad json"
}
return ""
@@ -111,7 +123,7 @@ func handleEcosystem(w http.ResponseWriter, r *http.Request, urls ecoURLs, core
if core == nil {
d.Calls.Err = "not configured"
} else if rows, err := core.RecentEcosystemTraces(ctx, 50); err != nil {
log.Printf("ecosystem traces: %v", err)
log.Printf("ecosystem traces request_id=%s: %v", requestIDFromContext(ctx), err)
d.Calls.Err = "core read failed"
} else {
d.Calls.Rows = rows