Repository navigation
pm-dispatch: three measured readings — the statesTheSet census, the enqueue instant, and the battery's cap-sized runtime - #18287
Conversation
…ded statesTheSet census The two rows said the ledger's `mustName` is not exclusive, so a seventh registry row could not redden this surface, and concluded that a green gate vouches for nothing here. Both were true before the census landed: the `platform-readings.md` entry of `INSTRUCTION_SURFACES` in `scripts/check-required-contexts.mjs` now declares `statesTheSet: true`, so that array must equal the required-context registry EXACTLY — count and membership — and every literal in it must appear verbatim in this file. An enrolment that does not follow this table is red on the enrolling PR. What survives is narrower and measured: the COUNT WORD introducing the list is ordinary prose and is not pinned — the gate's own header records the reading (the numeral reverted while every literal stays listed runs green), so it stays hand-followed. Line-neutral: two rows rewritten in place, 117 B and 108 B. Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr Co-authored-by: Claude <noreply@anthropic.com>
…t, not the landing One row added to the readings ledger's merge-queue block, beside the rows about the squash commit the queue lands. In a merge-queue repository the queue writes that commit onto its own queue ref at ENQUEUE and later fast-forwards `main` onto the same object, so its committer date never moves: it is the enqueue instant. `merged_at`, the `merged` timeline event and `removed_from_merge_queue` carry the fast-forward instant instead — identical across one merge group, and measured 15 to 26 minutes later on eight landings. A landing instant is therefore read from `merged_at` or the `merged` event, never from `git log`. The ceiling moves 465 to 466 for that one line, recorded as the SEVENTEENTH `ruledRaises` record under the standing one-file exception, quoted verbatim and untranslated as every record before it does; the accounting comment beside the ceiling names the added row and the three in-place rewrites, which buy nothing. Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr Co-authored-by: Claude <noreply@anthropic.com>
…easured The row said the battery EXCEEDS the container's 600-second foreground cap and prescribed running it detached with `tail --pid`. Measured on one box, under sibling load, on merged heads: 433.3 s, 432.4 s and 435.7 s from one session, 434.8 s from another, and 450.2 s from this branch with a second agent running the same battery in a sibling worktree — five verdicts (1730 cases pass), none a cap-kill. The stated basis is conditional rather than false: since the battery's discovery pass was memoised it is CAP-SIZED, not over the cap. The prescription is unchanged and stands on the corrected basis: the cap is a property of the CALLER's container and the margin a property of how contended it is — the spread from 432 s to 450 s is that contention, measured — neither of which the battery can see, and an agent box runs several agents at once. So detached is still the form that cannot be cut off, and a timeout remains a non-reading. No fleet reading is taken and the row claims none. Line-neutral, 119 B. Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Reviewing seat: ① Derived judgments
② Semver levelNot applicable — nothing published moves; ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
|
Landing provenance — skills seat, session Generated by Claude Code |
… sibling does (objectstack-ai#18291) Fixes objectstack-ai#18288 ## What changed `scripts/pm/dispatch-gates.mjs`'s header comment, in the "## Run --self-test DETACHED on an agent container" section, stated the pre-memoisation basis for the detach prescription: the battery "makes the full run longer than the container's foreground command cap, which SIGTERMs a run past it" — true before the family-discovery memoisation, no longer the measured basis today. The clause now matches the corrected basis its sibling `check-dispatch-gates.mjs` carries at :43-:48 (added after objectstack-ai#18201 collapsed the battery's own tree-discovery to one pass per process): the battery is cap-SIZED on a quiet box — the cap belongs to the CALLER's container and the margin to how contended it is, neither of which this file can see, and an agent box runs several agents at once. The prescription is unchanged: detach and poll the log (`tail --pid` or otherwise); a timeout is not a reading. Section shape, the `nohup`/`tail` example command, and the `objectstack-ai#14281` reference are all kept as-is; only the outdated basis clause is rewritten. ## Comment-only, no behaviour change git diff origin/main -- scripts/pm/dispatch-gates.mjs | grep -E '^[-+]' | grep -v -E '^(\+\+\+|---)' | grep -v -E '^[-+]\s*\*' prints nothing on this branch — every changed line is a ` * ` comment line. ## Measured This run's own `pnpm check:pm-dispatch-gates`: 434.5s, 1730 cases pass, no cap-kill — one more point alongside the six already on the register row this reading is drawn from (432.4 / 433.3 / 434.8 / 435.7 / 447.4 / 450.2s, all verdicts, none a cap-kill; see PR objectstack-ai#18287's fold of `platform-readings.md`). --- _Generated by [Claude Code](https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr)_ Co-authored-by: Claude <noreply@anthropic.com>
Fixes #18248
Fixes #18274
Fixes #18283
One folded dispatch of three cards, all on the same cell of the seat's readings
ledger:
.claude/skills/pm-dispatch/references/platform-readings.md. Each card isone commit; each row is checkable by its own control word. Three rows are
rewritten in place (a rewrite buys no lines) and one row is added, so the ledger's
ceiling moves 465 to 466 with a single
ruledRaisesrecord — the SEVENTEENTH —quoting the standing one-file exception verbatim and untranslated.
Rows
mustNamedeclaresstatesTheSet, so it must equal the required-context registry exactly, and a registry row enrolled without following this table is redmerged_ator themergedevent, never fromgit logLedger: 465 lines before, 466 after; every row at or under 120 bytes; no issue
number in operative text.
Why each row moved
The
mustNamepair. Both rows were true on the tree they were writtenagainst. The
platform-readings.mdentry ofINSTRUCTION_SURFACESinscripts/check-required-contexts.mjsnow declaresstatesTheSet: true— anentry that must name the registry EXACTLY, count and membership, with every
literal present verbatim in the ledger's own prose. So the old row's conclusion
("a seventh enrolment cannot redden this surface") is the opposite of what the
gate does. What survives is narrower and is recorded as a residual in that
gate's own header: the numeral that introduces the list is ordinary prose, and
pinning it needs the arbitrary-literal recognition that scan measured as out of
reach. Both halves are proved below rather than argued.
The enqueue instant. In a merge-queue repository the queue writes the squash
commit onto its own queue ref at enqueue and later fast-forwards
mainonto thesame object, so the commit's committer date never moves: it is the ENQUEUE
instant.
merged_at, themergedtimeline event andremoved_from_merge_queuecarry the fast-forward instant instead, identical across one merge group. The
card carries the table of eight landings this seat measured, where the gap ran
15 to 26 minutes. The 120-byte line rule does not hold all of that, so the row
carries the mechanism and the prescription; the table stays on the card, which
is this file's convention for provenance.
The battery row. Its stated basis — the battery EXCEEDS the container's
600-second foreground cap — is contradicted by five runs on one box: 433.3 s,
432.4 s and 435.7 s from one session, 434.8 s from another, and 450.2 s from
this branch with a second agent running the same battery in a sibling worktree
(1730 cases pass). None was a cap-kill. The basis is conditional, not false, so
the row is re-conditioned rather than deleted: cap-sized, with the cap a
property of the caller's container and the margin a property of how contended it
is — the 432 to 450 spread IS that contention, measured. The prescription is
unchanged, because it is right either way.
Dedupe, per card
Each subject was grepped on
origin/mainwith a lit control word beforeanything was written.
origin/mainstatesTheSet0 hits under.claude/;mustName, 排他 and 手跟改 hit only the two rows being rewrittenrequired checkslit at :393committer date0 hits under.claude/; 入队时刻 0 hits; 快进 hits onlydispatch-runbook.md, in the unrelated sense of fast-forwarding a local checkoutmerged_atlit at ledger :22 and SKILL.md :489;git loglit at ledger :152 :155 :281check:pm-dispatch-gates, 600 and detach hit only the row being rewrittentail --pidlit at.claude/agents/os-dev.md:342 andguard-process-kill.sh:74Nothing was duplicated, and no fact already carried elsewhere was restated.
Reverse verification
Control words. Each touched row greps back exactly once by a word unique to
its new text, and every superseded phrase greps to zero in the file and in the
repository:
statesTheSet1, 数量词未钉 1, 贴调用方容器上限 1, 入队时刻 1;不要求排他 0, 门绿不是本行已对的读数 0, 计数行只能手跟改 0, 逾容器 600 秒前台上限 0.
Three ablation legs, each mutating a file on disk with the mutation proved by
an occurrence count and a
git hash-objectreading, each restored bygit checkout HEAD -- pathunder anEXIT INT TERMtrap and each restore provedby
git diff HEADempty plus a hash equal to the HEAD blob. Direction predictedbefore the run in every case.
check-required-contextsexit 0REQUIRED_CONTEXTS, the ledger left unfollowedRestores: leg A and leg B back to blob
d9bd0fd, leg C back to blob90f3993,each equal to its HEAD blob, with a post-restore control run at exit 0. No test
file and no fixture is left behind.
Gates
Derived on the changed paths with
node scripts/pm/dispatch-gates.mjs --commands(no hand-written path list: the tool took the change set off the merge base) and
reconciled with
--ran. Exit codes were captured by redirect before any pipe.check:pm-skill-ratchetcheck:required-contextscheck:pm-skill-id-lintcheck:pm-governed-prosecheck:skill-frame-synccheck:nul-bytescheck:pm-governed-mergescheck:pm-dispatch-gatestail --pid: 450.2 s, "dispatch-gates self-test: 1730 cases pass"@objectstack/lint check:doc-formula-expressions@objectstack/formula, which is not built in this worktree); nothing in this diff reaches itReconciliation verdict, verbatim:
The one family with no exit code is the battery itself: it was started detached,
so its shell status was not captured. Its criterion is the verdict it printed,
which is the reading this repository prescribes over a bare code.
skip-changeset: nothing published moves. Both changed paths are outside everypackage's
files[]— one is a.claude/reference under the ratcheted PMsurface, the other a
scripts/pm/gate source.Acceptance notes
scripts/pm/check-dispatch-gates.mjs:17 andscripts/pm/dispatch-gates.mjs:25 both still open with the pre-memoisationclause "on an agent container that makes a full run longer than the container's
foreground command cap". Neither was touched. The first file's NEXT section
already carries the corrected basis in the words this PR's row now uses — "The
battery now fits inside a quiet container's cap with room to spare" and "The cap
is a property of the CALLER's container and the margin is a property of how
contended it is" — and it opens by marking the earlier section as written
against the old battery, so the header states the cap as the container's
property already and the card's conditional edit does not fire. The sibling
tool's copy is outside this claim's declared file surface. Carrier: the skills
seat, which owns both headers and lands this PR.
Thread-read:; that idanswers 404. The correction comment on the card names 5675921529 as the one
meant, and that is the comment that was read. Recorded as NOT MEASURED for the
cited id rather than as an absence of evidence.
维护者速读(草稿)
改了什么 — 派发台账
platform-readings.md的三行按实测改写、一行新增:①mustName那两行原说本表不排他、加一个必查项不会让门禁变红,而statesTheSet普查落地后恰恰相反,改写成门禁今天真正做的事,只把「数量词」这半句留作手跟改;②
新增一行:合并队列仓里 squash 提交的 committer date 是入队时刻,落地时刻要读
merged_at或merged事件,不能读git log的日期;③ 那条说check:pm-dispatch-gates超容器 600 秒上限的行,五次实测都在上限之内(432–450 秒),改写成「贴上限、上限
归调用方容器」,detach 的处方原样保留。台账上限 465 → 466,一行一条记账。
为什么改 — 台账是席位下判断的事实表,三条里两条的依据已被实测推翻(一条被落
地的门禁推翻,一条被五次计时推翻),留着会让下一个席位按错的理由行动;第三条是缺
口:整个车间今天按
git log日期记落地时刻,系统性早了 15–26 分钟。风险与代价(含回滚) — 纯文本改动,零已发布面,故
skip-changeset。风险只有一个方向:台账行写错会误导席位,故每行都用唯一控制词反查一次、被替换的旧话全仓归零,
并做了三条消融腿(改数量词→绿、删一个必查名→红、加第八个必查项→红)。回滚 = revert
这三个 commit,台账与上限一起回到 465,无迁移、无生成物。
席位意见 — (留空,待 contract-tier 审查填写)
你要做的 — 这是 references 层加
scripts/pm/**,按分层规则由 skills 席位审查后自行落地,不需要维护者点击;若你想复核,最值得看的是三条消融腿的方向是否与行文一致。
Generated by Claude Code