Summary
Five of the nine commonly agent run processes on the fleet host booted before cli/src/lib/enforcement.js existed. They are running a wrapper with no ADR-018 D3 enforcement at all — no claim-before-act, no cascade cap, no length gate — and will keep doing so until they are restarted.
Measured
Seat boot times from process uptime (ps -eo pid,etime,command, 2026-08-18T09:25:24Z):
| seat |
booted (UTC) |
enforcement |
| fable-lead, codex-impl, cl-strategist, cl-critic |
2026-08-04T07:54:23Z |
absent |
| hq-support |
2026-08-05T08:21:38Z |
absent |
| sprint-impl |
2026-08-12T11:57:13Z |
present |
| pod-architect |
2026-08-16T03:30:57Z |
present |
| sprint-review |
2026-08-16T03:40:48Z |
present |
| ux-lead |
2026-08-18T06:10:34Z |
present |
enforcement.js was created by 8f4450d (#894, deterministic wrapper enforcement — claim, stand-down, cascade cap, length gate (ADR-018 D3)) at 2026-08-12T07:30:52Z. It has exactly four commits in its history: #894, #905, #907 (all 08-12), then 63c94de (#973).
Pinned to the imported commit rather than inferred from dates. Seats import the CLI through an npm link into a git worktree, and that worktree's HEAD reflog gives what was checked out at each boot:
HEAD@{2026-08-04 00:34:19 -0700}: pull -q origin main: Fast-forward → 83bf68f9, with the four seats booting 20 minutes later. git cat-file -e 83bf68f9:cli/src/lib/enforcement.js → absent; agent.js at that commit contains 0 references to cascadeGovernor or createClaimKeeper.
- hq-support's boot falls after
HEAD@{2026-08-04 13:13:05 -0700} → 3988df42 on fix/heartbeat-opt-in. Same result: file absent, 0 references.
Independently corroborated: no commit on main before 2026-08-12T07:30Z contains the file at all.
Why it matters
ADR-018 D3 is ratified and its enforcement is deployed to main, but "deployed to main" and "running" are different states here. There is no auto-pull and no auto-restart (checked: no launchd job, no crontab entry, no fswatch/watchman/entr process, no non-sample git hooks — with positive controls on each), so a seat runs whatever it imported at boot, indefinitely. The oldest of these has been up 14 days.
Consequences on those five seats:
- No claim-before-act. In any multi-agent pod they share, duplicate work is unguarded — the exact failure D3 exists to prevent.
- No cascade cap. Agent-triggered turns are unbounded per pod.
- No length gate, so document-sized replies post as chat rather than taking the attach path.
Not in scope: none of the five is a member of the pod whose governor behaviour prompted this, so the cascade-cap analysis in #980 is unaffected. This is a separate, wider gap that surfaced from the same measurement.
What would close it
Restart those five seats against a current worktree. That is the same operation the CLI queue already needs for #973's grace (and #981's knobs, once merged) to reach any seat — the worktree is pinned at 0a190af7, 19 commits behind origin/main, and no seat has restarted since #973 merged at 08:35:40Z.
Worth considering separately: nothing today makes a seat's enforcement version legible without this kind of archaeology. #981 adds a boot log of the resolved cascade constants, which is the same shape of answer one level in — a seat with no enforcement.js at all would simply print nothing.
Not verified
Whether any of the five shares a pod with another agent today (which is what turns "no claim gate" from latent into active), and whether any has a restart mechanism I did not find.
Summary
Five of the nine
commonly agent runprocesses on the fleet host booted beforecli/src/lib/enforcement.jsexisted. They are running a wrapper with no ADR-018 D3 enforcement at all — no claim-before-act, no cascade cap, no length gate — and will keep doing so until they are restarted.Measured
Seat boot times from process uptime (
ps -eo pid,etime,command, 2026-08-18T09:25:24Z):enforcement.jswas created by 8f4450d (#894, deterministic wrapper enforcement — claim, stand-down, cascade cap, length gate (ADR-018 D3)) at 2026-08-12T07:30:52Z. It has exactly four commits in its history: #894, #905, #907 (all 08-12), then 63c94de (#973).Pinned to the imported commit rather than inferred from dates. Seats import the CLI through an npm link into a git worktree, and that worktree's
HEADreflog gives what was checked out at each boot:HEAD@{2026-08-04 00:34:19 -0700}: pull -q origin main: Fast-forward→83bf68f9, with the four seats booting 20 minutes later.git cat-file -e 83bf68f9:cli/src/lib/enforcement.js→ absent;agent.jsat that commit contains 0 references tocascadeGovernororcreateClaimKeeper.HEAD@{2026-08-04 13:13:05 -0700}→3988df42onfix/heartbeat-opt-in. Same result: file absent, 0 references.Independently corroborated: no commit on
mainbefore 2026-08-12T07:30Z contains the file at all.Why it matters
ADR-018 D3 is ratified and its enforcement is deployed to
main, but "deployed to main" and "running" are different states here. There is no auto-pull and no auto-restart (checked: no launchd job, no crontab entry, nofswatch/watchman/entrprocess, no non-sample git hooks — with positive controls on each), so a seat runs whatever it imported at boot, indefinitely. The oldest of these has been up 14 days.Consequences on those five seats:
Not in scope: none of the five is a member of the pod whose governor behaviour prompted this, so the cascade-cap analysis in #980 is unaffected. This is a separate, wider gap that surfaced from the same measurement.
What would close it
Restart those five seats against a current worktree. That is the same operation the CLI queue already needs for #973's grace (and #981's knobs, once merged) to reach any seat — the worktree is pinned at
0a190af7, 19 commits behindorigin/main, and no seat has restarted since #973 merged at 08:35:40Z.Worth considering separately: nothing today makes a seat's enforcement version legible without this kind of archaeology. #981 adds a boot log of the resolved cascade constants, which is the same shape of answer one level in — a seat with no
enforcement.jsat all would simply print nothing.Not verified
Whether any of the five shares a pod with another agent today (which is what turns "no claim gate" from latent into active), and whether any has a restart mechanism I did not find.