Files the pure autonomous heal-action dispatch core — the actuator's safety-gate + injected-execution decision, the foundation the wired DataRecoveryActuatorService (#14134) composes. Graduated substrate (Discussion #14032 → #14134).
Why a separate leaf from #14134
#14134 is the wired actuator (the service + the snapshot/validation envelope — focused-block work). This leaf is the pure dispatch core it wires: the placement-neutral safety-gate + dispatch, reviewable independently of the wiring (mirrors the ADR #14140 split). Already committed + 14/14 green on grace/14134-heal-action-dispatch.
Scope
decideHealAction — the safety-gate: fail-closed on unknown actions; non-mutating containment (freeze / quarantine) always executes; mutating actions are rate-limited + anti-thrash-bounded per action+collection.
dispatchHeal — injected execution: held → hold outcome (the operation is never called); healed + records the run; no-wired-operation → deferred (the missing-logic gap, autonomous, no page); throwing → failed (recorded, never escalated); status+detail carried through.
HEAL_ACTIONS vocabulary + the frozen MUTATING_HEAL_ACTIONS split + DEFAULT_DISPATCH_BOUNDS.
Acceptance
Refs #14134 (the wired service), #14132 (DELETE-escalate umbrella). Related: #14039 (v13.1 epic), #14032 (graduated Discussion).
Authored by Grace (Claude Opus 4.8, Claude Code).
Files the pure autonomous heal-action dispatch core — the actuator's safety-gate + injected-execution decision, the foundation the wired
DataRecoveryActuatorService(#14134) composes. Graduated substrate (Discussion #14032 → #14134).Why a separate leaf from #14134
#14134 is the wired actuator (the service + the snapshot/validation envelope — focused-block work). This leaf is the pure dispatch core it wires: the placement-neutral safety-gate + dispatch, reviewable independently of the wiring (mirrors the ADR #14140 split). Already committed + 14/14 green on
grace/14134-heal-action-dispatch.Scope
decideHealAction— the safety-gate: fail-closed on unknown actions; non-mutating containment (freeze/quarantine) always executes; mutating actions are rate-limited + anti-thrash-bounded per action+collection.dispatchHeal— injected execution: held → hold outcome (the operation is never called); healed + records the run; no-wired-operation →deferred(the missing-logic gap, autonomous, no page); throwing →failed(recorded, never escalated); status+detail carried through.HEAL_ACTIONSvocabulary + the frozenMUTATING_HEAL_ACTIONSsplit +DEFAULT_DISPATCH_BOUNDS.Acceptance
healOperations+ the collection-keyedrecentRuns/recordRun).Refs #14134 (the wired service), #14132 (DELETE-escalate umbrella). Related: #14039 (v13.1 epic), #14032 (graduated Discussion).
Authored by Grace (Claude Opus 4.8, Claude Code).