carlos / platform Public

Isolated exec spec: revision 12, codex accept with corrections applied

Round 11 findings committed unedited; verdict accept with corrections.
The one correction: the probe fixture in /etc/carlos comes from
tmpfiles at bootstrap and the control service verifies its ownership
and mode before accepting a verdict.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YZ1ZvWj7naf73GjTX8MBv5
Paul Campbell pushed by paul@keymail.dev 0a69448de47f8da6d9681a84c11854d834970170 parent c539372
2 files changed, +48 −4
  • docs/superpowers/specs/2026-09-11-isolated-exec-design.md +19 −4
  • docs/superpowers/specs/CODEX-FINDINGS-ISOLATED-EXEC-R11.md +29 −0

CI passed — run details

diff --git a/docs/superpowers/specs/2026-09-11-isolated-exec-design.md b/docs/superpowers/specs/2026-09-11-isolated-exec-design.md
index c0af6bf55..25e7ed0de 100644
--- a/docs/superpowers/specs/2026-09-11-isolated-exec-design.md
+++ b/docs/superpowers/specs/2026-09-11-isolated-exec-design.md
@@ -1,7 +1,9 @@
# Isolated exec — every exec-backed instance in its own namespace
-**Date:** 2026-09-11 · **Status:** revision 11, after codex rounds 1 to 10
-(19 + 14 + 7 + 4 + 3 + 1 + 1 + 1 + 2 + 1 findings, all accepted; §13) · **Requested by:** discussion
+**Date:** 2026-09-11 · **Status:** revision 12; codex verdict after
+round 11 is **accept with corrections**, and the one correction is
+applied here (54 findings over 11 rounds, all accepted; §13); awaiting
+Paul's review · **Requested by:** discussion
#126 (Tito, with box evidence), approved in direction by Paul on
2026-09-11
@@ -437,6 +439,7 @@ d /data/instances 0755 carlos carlos -
d /data/layout 0700 carlos carlos -
d /run/carlos/.instances 2750 carlos carlos-sockets -
d /run/carlos/.logs 0700 carlos carlos -
+f /etc/carlos/probe-secret 0640 root carlos - probe
d /run/carlos/instances 2750 carlos carlos-sockets -
d /run/carlos/logs 0700 carlos carlos -
d /run/carlos-control 0750 root carlos -
@@ -1662,8 +1665,16 @@ verdict line:
- a write to `cgroup.kill` under any cgroup directory it can name
(its own included) fails with `EROFS`;
- `/etc/carlos` cannot be opened (`EACCES` or `ENOENT`, never a
- listing), and a fixture file the control service stages beforehand
- as `root:carlos 0640` at `/etc/carlos/probe-secret` cannot be read;
+ listing), and the fixture `/etc/carlos/probe-secret` cannot be read.
+ The fixture is **not** written by the control service, whose
+ `ProtectSystem=strict` makes `/etc` read-only to it (codex R11-1); it
+ is a tmpfiles line (§3.2, `f /etc/carlos/probe-secret 0640 root
+ carlos - probe`) applied by bootstrap and by `update-platform-binary.sh`'s
+ `systemd-tmpfiles --create`, before any probe runs. The control
+ service, before it accepts a probe verdict, `stat`s the fixture and
+ requires `root:carlos 0640`; a missing or differently-owned fixture is
+ itself a `not ready` verdict line (`probe fixture absent`), never a
+ vacuous pass;
- `/proc` lists only itself, and its own pid is 1;
- a symlink it creates in its directory is refused with `ELOOP`, and
`/proc/self/mountinfo` shows `nosymfollow` on both bound directories;
@@ -2091,3 +2102,7 @@ rollback runs the old binary).
- **Round 10** (codex, `CODEX-FINDINGS-ISOLATED-EXEC-R10.md`, 1 new
finding, every prior item resolved, verdict request changes). Accepted:
R10-1 `InaccessiblePaths=/etc/carlos` in the templates and the probe; the audit extends to credential inputs a `carlos`-group process reads (§4.1, §8.5, §9).
+- **Round 11** (codex, `CODEX-FINDINGS-ISOLATED-EXEC-R11.md`, 1 new
+ finding, every prior item resolved, **verdict accept with
+ corrections**). The correction is applied in this revision:
+ R11-1 the probe fixture comes from tmpfiles at bootstrap, and the control service verifies its ownership and mode before accepting a verdict (§3.2, §8.5).
diff --git a/docs/superpowers/specs/CODEX-FINDINGS-ISOLATED-EXEC-R11.md b/docs/superpowers/specs/CODEX-FINDINGS-ISOLATED-EXEC-R11.md
new file mode 100644
index 000000000..40ab36e69
--- /dev/null
+++ b/docs/superpowers/specs/CODEX-FINDINGS-ISOLATED-EXEC-R11.md
@@ -0,0 +1,29 @@
+| Prior finding | Disposition at `c5393728` |
+|---|---|
+| R10-1 | **Resolved for the credential exposure.** All tenant roles hide `/etc/carlos`; §9 extends the audit to credential reads. The new probe setup has a separate defect below. |
+| R5-2 | **Resolved.** Downgrade checks every row’s paths regardless of flags and requires completed reversal; unflagging nested rows is refused (§8.2). |
+| R5-3 | **Resolved.** Directory, socket, unit and slice names consistently use bounded `InstanceID(host)` (§§3.1, 5.3). |
+| R2-4 | **Resolved.** Blocking seed execution and `RemainAfterExit=yes` retain invocation identity and results through capture (§§4.2, 5.3). |
+| R2-5 | **Resolved.** Completion requires terminal state and cgroup emptiness, including foreign invocations; uncertain stops retain the lease (§§6.3, 6.5). |
+| R2-7 | **Resolved.** Recovery derives both endpoints from journal direction, completes that transaction, then converges to current intent (§8.2). |
+| R2-9 | **Resolved.** Flat minting, explicit reversal, env asides and completed-reversal downgrade guards cover the reported failures (§§8.1–8.2). |
+| R2-14 | **Resolved at spec level.** The IPv6 exception is explicit, bounded, rechecked and reported (§8.5). |
+| R1-4 | **Resolved.** Log EOF does not establish termination; blocking observations remain outside the activator mutex (§§6.4–6.7). |
+| R1-5 | **Resolved.** Seed preparation, execution budget, cancellation, result retention and termination-before-cleanup are specified (§§6.1–6.5). |
+| R1-8 | **Resolved under the recorded decision.** Shared tier limits remain; per-service OOM families are an explicit difference (§4.3). |
+| R1-12 | **Resolved.** Named consumer fences and bidirectional journal recovery cover interrupted migration (§8.2). |
+| R1-13 | **Resolved.** Reverse recovery and completed-reversal downgrade guards address the reported defects (§8.2). |
+| R1-15 | **Resolved for the reported PID/IMDS defects.** No unsafe fallback remains; the behavioural gate is specified (§8.5). |
+| R1-18 | **Resolved under the recorded ruling.** Remote operations and reporting are specified; the `foreign` repair residual remains explicitly accepted (§§8.3–8.4). |
+
+**R11-1 — P2 — §§5.2, 8.5: The control service’s sandbox prevents creation of the new probe fixture.**
+
+Retain §5.4’s process-authenticated control service.
+
+[§8.5 requires the control service to stage `/etc/carlos/probe-secret`](/home/paulca/amadan.net/carlos/platform/.claude/worktrees/isolated-exec-spec/docs/superpowers/specs/2026-09-11-isolated-exec-design.md:1664) as `root:carlos 0640` before running the probe. But [the supplied control-service unit](/home/paulca/amadan.net/carlos/platform/.claude/worktrees/isolated-exec-spec/docs/superpowers/specs/2026-09-11-isolated-exec-design.md:857) sets `ProtectSystem=strict` without a writable exception for that path. This makes `/etc` read-only inside the service; ordinary file creation fails with `EROFS` despite running as root. [systemd execution semantics](https://raw.githubusercontent.com/systemd/systemd/v257/man/systemd.exec.xml).
+
+On a clean rollout, the mandatory fixture therefore cannot be prepared as specified. Honouring the setup failure prevents readiness; proceeding without the fixture makes its unreadability check vacuous.
+
+**Correction:** assign fixture creation to root bootstrap/tmpfiles, ordered before the probe. Have the control service verify that the fixture exists with the required ownership and mode before accepting the probe result. Keep `/etc/carlos` inaccessible in every tenant template.
+
+**Verdict: accept with corrections.**
\ No newline at end of file