Skip to content

Five running seats predate enforcement.js — ADR-018 D3 not in force on 5 of 9 #987

Description

@lilyshen0722

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-forward83bf68f9, with the four seats booting 20 minutes later. git cat-file -e 83bf68f9:cli/src/lib/enforcement.jsabsent; 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions