LearnNewsExamplesServices
Frontmatter
id14055
title#14030 AC1 producer-core: supervised-task failure/overdue diagnosis helpers
stateClosed
labels
enhancementaiarchitecture
assigneesneo-opus-vega
createdAtJun 26, 2026, 6:03 AM
updatedAtJun 26, 2026, 9:31 AM
githubUrlhttps://github.com/neomjs/neo/issues/14055
authorneo-opus-vega
commentsCount0
parentIssue14030
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[ ] 14064 Consume supervised-task diagnosis helper in backup escalation
closedAtJun 26, 2026, 9:31 AM

#14030 AC1 producer-core: supervised-task failure/overdue diagnosis helpers

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

Context

#14030 AC1 (alert on backup failure/overdue) converged with @neo-gpt (https://github.com/neomjs/neo/issues/14030#issuecomment-4806173915): a sibling task-diagnostics producer (NOT bolted into ContainerHealthDiagnosisService, NOT a pageable recovery-actuator target) that emits a recovery-diagnosis event with targetIdentity:{kind:'supervised-task', id} + details.actionClass:'escalate', routed through a narrow diagnosis-escalation sink.

The Fix (this slice — the producer-core)

Pure functions in ai/daemons/orchestrator/services/taskOutcomeDiagnosis.mjs:

  • detectTaskOverdue({lastRunAt, intervalMs, graceMs, now}){overdue, overdueByMs} (interval<=0 disables).
  • buildSupervisedTaskDiagnosis({taskName, outcome, observedAt, details}) → a recovery-diagnosis event (via the existing createRecoveryDiagnosisEvent contract): failedcrash, overdueambiguous recovery class; supervised-task targetIdentity; actionClass:'escalate'. Never restarts/retries — detection only.

Acceptance Criteria

  • detectTaskOverdue returns the overdue verdict (past lastRunAt+intervalMs+graceMs); <=0 interval never overdue.
  • buildSupervisedTaskDiagnosis emits a contract-valid recovery-diagnosis event (supervised-task identity, escalate actionClass, crash/ambiguous class) and rejects invalid outcomes/missing taskName.
  • Unit coverage for both.

Out of Scope (the next AC1 slice — live wiring)

  • The ProcessSupervisorService.recordTaskOutcome('<task>','failed', …) hook (line 412 etc.) calling the producer for the alert-on-failure task set.
  • The scheduling-loop overdue check (scheduling/backup.mjs lastRunAt+interval) calling detectTaskOverdue.
  • The narrow escalateDiagnosis(diagnosisEvent) sink in RecoveryActuatorService (NOT apply('backup','page')page is deploy-target-only).

Contract Ledger Matrix

Consumed surface Field Type / values Change Consumer impact Fallback / semantics
detectTaskOverdue() return (exported from taskOutcomeDiagnosis.mjs) verdict overdue: Boolean · overdueByMs: Number (≥0) New exported function (additive) Intended consumer: the scheduling-loop overdue check (next slice) → feeds buildSupervisedTaskDiagnosis. Pure; intervalMs <= 0{overdue:false, overdueByMs:0} (periodic disabled); absent lastRunAt treated as 0.
buildSupervisedTaskDiagnosis() return recovery-diagnosis event conforms to createRecoveryDiagnosisEvent: type:'recovery-diagnosis' · recoveryClass: 'crash' (failed) / 'ambiguous' (overdue) · targetIdentity:{kind:'supervised-task', id} · confidence:1 · details.actionClass:'escalate' + details.outcome New exported function (additive); reuses the existing recovery-diagnosis wire contract Intended consumer: the escalateDiagnosis sink (next slice). Producer-only — emits the event; never restarts/retries. Throws TypeError on invalid outcome (not failed/overdue) or missing taskName.
  • Docs: both functions' JSDoc documents the verdict/event shapes + the detection-only (no restart/retry) guarantee.
  • Evidence: L2 unit — detectTaskOverdue verdicts + the failedcrash / overdueambiguous event shapes + invalid-input rejection.

Related

Authored-by: @neo-opus-vega (Vega, Claude Opus 4.8)

tobiu referenced in commit 0c6ca39 - "feat(ai): supervised-task failure/overdue diagnosis producer-core (#14055) (#14056) on Jun 26, 2026, 9:31 AM
tobiu closed this issue on Jun 26, 2026, 9:31 AM