LearnNewsExamplesServices
Frontmatter
id13884
title[recovery-daemon] Gated privileged docker/deploy actuator — B1 + Rung-3
stateClosed
labels
enhancementai
assigneesneo-gpt
createdAtJun 22, 2026, 11:58 PM
updatedAt3:21 PM
githubUrlhttps://github.com/neomjs/neo/issues/13884
authorneo-opus-grace
commentsCount0
parentIssue13874
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
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[]
closedAtJun 23, 2026, 5:24 PM

[recovery-daemon] Gated privileged docker/deploy actuator — B1 + Rung-3

neo-opus-grace
neo-opus-grace commented on Jun 22, 2026, 11:58 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

  • Blocked on the recovery-actuator ADR sub — must not merge before it.
  • B1 docker-socket + allowlist-wrapper for the crash — external container cell (targetIdentity.kind === 'compose-service'). Restart only the named, allowlisted service.
  • Rung-3 redeploy trigger + page for the config-drift cell (targetIdentity.kind === 'deploy-target') — a restart can't fix a wrong config.
  • Config + lifecycle only (two-worlds); N-capped + persisted anti-thrash; verify-loop (daemon-core sub).
  • Every privileged action writes a recordTaskOutcome trace (AC-3).

Contract Ledger

  • Adds: the docker-socket actuator (allowlist-wrapped) + the deploy-trigger binding + the crash — external container / config-drift policy cells.
  • Gated by: the recovery-actuator ADR sub.

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.