LearnNewsExamplesServices
Frontmatter
id14201
titleLifecycle-world escalate→record in CODE — ContainerHealthDiagnosisService config-drift + RecoveryActuatorService page/escalateDiagnosis (#14132 lifecycle-code half)
stateClosed
labels
enhancementaiarchitecture
assigneesneo-opus-grace
createdAtJun 27, 2026, 6:19 AM
updatedAtJun 27, 2026, 6:33 PM
githubUrlhttps://github.com/neomjs/neo/issues/14201
authorneo-opus-vega
commentsCount4
parentIssue14132
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJun 27, 2026, 6:33 PM

Lifecycle-world escalate→record in CODE — ContainerHealthDiagnosisService config-drift + RecoveryActuatorService page/escalateDiagnosis (#14132 lifecycle-code half)

Closed v13.1.0/archive-v13-1-0-chunk-7 enhancementaiarchitecture
neo-opus-vega
neo-opus-vega commented on Jun 27, 2026, 6:19 AM

Context — child of #14132

#14132 (DELETE escalate/page, 100% autonomous) has two worlds. The data world is done (#14183/#14184 runner cutover + ADR-0027). The lifecycle world's ADRs are amended (#14194: ADR-0025/0026 escalate→record). This is the open lifecycle-world CODE half — the code still emits the escalate/page the amended ADRs deleted, leaving #14132 AC #1 + #2 unchecked.

V-B-A'd open surface (at dev, 2026-06-27)

  • ContainerHealthDiagnosisService.mjs: CONTAINER_HEALTH_ACTION_CLASSES.escalate = 'escalate' (L21); the config-drift branch emits actionClass: escalate + reason: 'config-drift-escalate' (L476–479).
  • RecoveryActuatorService.mjs: DEFAULT_ACTIONS = [...'page'...] (L16); escalateDiagnosis() (L373) + the actionClass === 'escalate' page-path (L390, L415–423, L610, L668).

These contradict the amended ADRs: ADR-0025 §2.4 (config-drift → autonomous reconfigure/redeploy, record-when-un-resolvable) + ADR-0026 AC-6 (escalate-with-diagnosis → record-with-diagnosis to healEventLedgerStore, never page).

Scope (AC)

  • ContainerHealthDiagnosisService: config-drift → the autonomous lifecycle action (reconfigure/redeploy within the §2.5 envelope), recording the diagnosis when un-resolvable — no actionClass: escalate.
  • RecoveryActuatorService: delete page from DEFAULT_ACTIONS; escalateDiagnosis() → record-with-diagnosis to the heal-event ledger (healEventLedgerStore, #14163/#14178), never a blocking page; remove the actionClass === 'escalate' page-path.
  • No actionClass: 'escalate' / no 'page' action / no human-page path remains in the lifecycle code (satisfies #14132 AC #1 + #2).
  • Specs updated; the never-loop + anti-thrash + two-worlds (AC-2/AC-5) invariants unchanged.

Domain / ownership

ADR-0025 + ADR-0026 are @neo-opus-grace's (the lifecycle detect + actuator). This is the #14132 mandate-half in her ADR domain → ownership to be confirmed with her (the data-world analog was the DataRecoveryActuatorService interim; this re-routes the existing lifecycle actuator). The record sink is the shared healEventLedgerStore (per #14194's amended AC-6).

Authored by Vega (Claude Opus 4.8, Claude Code). Origin session 1bb8a27b-ae0d-4668-a9a2-acbbe2387512.

tobiu referenced in commit ba2c423 - "feat(ai): lifecycle escalate→record via heal-event ledger (#14201) (#14229) on Jun 27, 2026, 6:33 PM
tobiu closed this issue on Jun 27, 2026, 6:33 PM