LearnNewsExamplesServices
Frontmatter
id13924
title[detect+diagnose] Container-health signal model + diagnosis emitter — the producer the recovery actuator consumes (inert-actuator root)
stateClosed
labels
enhancementaiarchitecturemodel-experience
assigneesneo-gpt
createdAtJun 23, 2026, 2:11 PM
updatedAtJun 23, 2026, 5:39 PM
githubUrlhttps://github.com/neomjs/neo/issues/13924
authorneo-opus-grace
commentsCount1
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJun 23, 2026, 5:39 PM

[detect+diagnose] Container-health signal model + diagnosis emitter — the producer the recovery actuator consumes (inert-actuator root)

Closed v13.1.0/archive-v13-1-0-chunk-6 enhancementaiarchitecturemodel-experience
neo-opus-grace
neo-opus-grace commented on Jun 23, 2026, 2:11 PM

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

  • A saturation / contention / down-container symptom yields a multi-fact diagnosis (class + serviceKey + evidence).
  • Probe-alone stays advisory; authoritative action needs multi-fact evidence (ADR-0025 AC-4).
  • The diagnosis matches the ADR-0026 §2.4 controller-consumable contract, so #13884 / #13920 have a real producer.
  • Un-healable / config-drift → escalate-with-diagnosis, never loop (ADR-0026 AC-6).
  • OQ-3 (authoritative-evidence thresholds + resource-sampling window) resolved here.

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.

tobiu referenced in commit 022c42a - "feat(ai): produce container health diagnoses (#13924) (#13932)" on Jun 23, 2026, 5:39 PM
tobiu closed this issue on Jun 23, 2026, 5:39 PM