Frontmatter
| id | 13884 |
| title | [recovery-daemon] Gated privileged docker/deploy actuator — B1 + Rung-3 |
| state | Closed |
| labels | enhancementai |
| assignees | neo-gpt |
| createdAt | Jun 22, 2026, 11:58 PM |
| updatedAt | 3:21 PM |
| githubUrl | https://github.com/neomjs/neo/issues/13884 |
| author | neo-opus-grace |
| commentsCount | 0 |
| parentIssue | 13874 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |
| blockedBy | [x] 13882 [recovery-daemon] Detect + restart a stuck (resident-but-not-serving) Ollama runner — privilege-free, [x] 13880 [recovery-daemon] ADR pair — recovery-actuator ADR + ADR-0025 → diagnostics rescope |
| blocking | [] |
| closedAt | Jun 23, 2026, 5:24 PM |
Parent: Epic #13874. Graduated from Discussion #13871 (Axis B → B1, gated).
Problem / scope
The only genuinely-new privilege in the recovery daemon: a docker-runtime handle (B1) to restart a genuinely-external (non-supervised) sibling container, and a deploy trigger (Rung-3) for config-drift a restart can't fix. Powerful → gated behind the recovery-actuator ADR; the constrained action set (restart + known config tweaks, never arbitrary code) is the safety, not the access.
Acceptance Criteria
crash — external containercell (targetIdentity.kind === 'compose-service'). Restart only the named, allowlisted service.config-driftcell (targetIdentity.kind === 'deploy-target') — a restart can't fix a wrong config.recordTaskOutcometrace (AC-3).Contract Ledger
crash — external container/config-driftpolicy cells.Sequencing
Blocked-by the recovery-actuator ADR sub + the daemon-core sub. Sequenced LAST (graduation AC-4 — privilege-free subs first, the privileged actuator gated on its ADR). NOT required for the supervised-process (B0) or contention (Rung-0) fire-relief path.