Parent epic: #13860 (diagnostics) · Grounds: ADR-0025 §2.4 + the named [detect] / [diagnose] subs of #13860; feeds the ADR-0026 recovery actuator via the diagnosis contract.
Problem — the inert-actuator root
ADR-0026's recovery actuator (B0 #13900 shipped, B1 #13884, L0 #13920) consumes a diagnosis — but nothing emits one. ADR-0025's two named subs — [detect] (the deployment container-health signal model) and [diagnose] (the symptom→cause→action-class mapping) — are unfiled and unbuilt. So the recovery half is being built toward an empty input: the actuator is inert (cf. #13912's callerless applyDiagnosis). This is the structural gap behind "the healing daemons are not done" — we have the act half and no detect/diagnose half.
Scope
[detect] — multi-fact signal model (ADR-0025 §2.4): sample sibling-container health —
- resource saturation + contention (via the per-model throughput / attribution probe, sibling ticket),
- config-correctness,
- lifecycle-state — a container down / restart-looping (e.g. the
memory container observed down on cloud);
multi-fact and false-positive-safe (probe-alone stays advisory — ADR-0025 AC-4).
[diagnose] — map the evidence → a diagnosis {class, serviceKey, evidence} the ADR-0026 §2.4 controller consumes:
- transient-crash → restart, contention → throttle/shed, config-drift → escalate, lifecycle-down → restart/escalate.
Acceptance Criteria
May split into separate [detect] + [diagnose] subs during build; filed together as the producer gap. This is the highest-impact missing piece: without it, the entire recovery epic (#13874) cannot auto-heal anything.
Parent epic: #13860 (diagnostics) · Grounds: ADR-0025 §2.4 + the named [detect] / [diagnose] subs of #13860; feeds the ADR-0026 recovery actuator via the diagnosis contract.
Problem — the inert-actuator root
ADR-0026's recovery actuator (B0 #13900 shipped, B1 #13884, L0 #13920) consumes a diagnosis — but nothing emits one. ADR-0025's two named subs — [detect] (the deployment container-health signal model) and [diagnose] (the symptom→cause→action-class mapping) — are unfiled and unbuilt. So the recovery half is being built toward an empty input: the actuator is inert (cf. #13912's callerless
applyDiagnosis). This is the structural gap behind "the healing daemons are not done" — we have the act half and no detect/diagnose half.Scope
[detect] — multi-fact signal model (ADR-0025 §2.4): sample sibling-container health —
memorycontainer observed down on cloud); multi-fact and false-positive-safe (probe-alone stays advisory — ADR-0025 AC-4).[diagnose] — map the evidence → a diagnosis
{class, serviceKey, evidence}the ADR-0026 §2.4 controller consumes:Acceptance Criteria
class+serviceKey+evidence).May split into separate [detect] + [diagnose] subs during build; filed together as the producer gap. This is the highest-impact missing piece: without it, the entire recovery epic (#13874) cannot auto-heal anything.