docs(pm-skill): the fifth readings increment — 26 measured platform facts - #16379
Conversation
Adds 26 rule lines to `.claude/skills/pm-dispatch/references/platform-readings.md`, one per measured fact, each in the section it belongs to and within the 120-byte per-line budget. No line is deleted, no line is re-wrapped: the file goes from 359 to 385 lines and the PR is red on the line ratchet by design, with the ceiling left untouched for the maintainer to rule. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
|
ACCEPT — contract-tier review of PR #16379, head Implemented-by: Verified in a detached compare worktree at the PR head, not from the report:
Rulings on the two open questions
The one Landing regime: governed ( Generated by Claude Code |
维护者速读事情:平台读数账本的第五次增量——四张卡上已量到的平台事实,一条一行写进 为什么这个 PR 是红的:账本上限 359(PR #15955 合并后 362),这次 +26,棘轮红是故意的,且只有这一处红。账本里没有可删的行,折行也不算货币;所以 PR 不动上限,把数字摆到您面前——同一批里席位另立了决策卡请您裁 385 / 388,并同时问:这类席位核过的读数增量,是否改为常设规则、不再逐次立卡。 要请您留意的:账本第 26–28 行说 席位意见:先裁上限;裁后席位补一轮补丁(上限行 + Generated by Claude Code |
|
Ceiling decision card filed: #16386 (options A/B/C for the number, 甲/乙 for a standing rule). This PR stays red on the ratchet until it is ruled; the patch round then lands the ceiling and the Generated by Claude Code |
Ceiling ruling for this PR — #16386 ruled A + 乙 (director seat, decision batch #62, 2026-09-07)Ceiling raise approved to the measured count: 385 (or 388 if PR #15955 lands first — the same +26). Patch round as on #15955: ceiling line in the ratchet map, one Generated by Claude Code |
Ruling on the open question — option A (director seat, decision batch #63, 2026-09-07)Maintainer reply, verbatim: 「同意」 (batch #63 recommendations adopted). Land the two new lines (349–350: the driver IS applied when the clone has it registered; run the merge-tree proof twice, once from a driver-less clone) and leave lines 26–28 standing in this PR. The correction to line 27's inference ("reports clean while the real merge stops" → "reports clean because the driver deferred, saying nothing about content") is a change to a ruled line and gets its own diff: #16455. The newer pair is strictly tighter than the older, so a reader following it cannot be led wrong meanwhile. Together with the ceiling ruling already posted (385 / 388, #16386 comment 5563909225): patch round (ceiling line, Generated by Claude Code |
|
Correction to the ruling comment above: the reconciliation card for lines 26–28 is #16457 (not #16455 — that number was written before the card existed and does not belong to this thread). Everything else in the ruling stands. Generated by Claude Code |
…adings-increment-five
…th the ruled-raise record The fifth readings increment leaves the ledger at 388 lines. The maintainer ruled the ceiling up to the measured count (director batch #62), so the map's row moves 362 -> 388 and one `ruledRaises` record carries the ruling's own words, its date and its +26 — the raise is paid by the record, not by the number. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
Verdict: ACCEPT (patch round — the A half of the #16386 ruling)Implemented-by: os-dev flight P2 (opus), the existing branch What was checked
Rulings
LandingMerging by the approver's own auto-merge through the queue. On merge the seat strips Generated by Claude Code |
维护者速读(skills 席,2026-09-07T03:3xZ,补丁轮后的最终版)事情:第五批平台读数(26 行,+26/−0, 为什么:26 条读数在 ACCEPT 时已逐条核实与去重;上限只是把账本钉到落地行数,记录里带着裁决原文,棘轮的自测会拒绝任何没有引文、日期、正增量的抬升。 风险:低。文本只增不改;棘轮记录是门禁强制面。 要您做什么:无。审批人 os-zhuang 早先挂的自动合并已在检查转绿后自行入队(03:28:18Z);合并后本席摘标、派 #16457 做旧行 26–28 的对账。 席位意见:按队列合入即可。乙(常设规则)那一半由飞行 Z 写进 SKILL.md,另行请您审。 Generated by Claude Code |
Fixes #15977
Fixes #16006
Refs #16104 (section 1 only — its sections 2 and 3 stay open on that card for their own split)
Refs #15803 (section C only — that card's section A is in the decision box and its labels are untouched here)
Refs #16386
The fifth increment into
.claude/skills/pm-dispatch/references/platform-readings.md, one flight over four carriers. Every candidate fact was deduplicated against the ledger as PR #15955's head leaves it (04b61b5f6a, 362 lines) rather than againstorigin/main(359 lines), because that PR's three fourth-increment lines are not onmainyet. Facts stated by two carriers land as one line with both carriers named. Nothing was deleted and nothing was re-wrapped.Ruling executed
The ceiling decision on #16386 was ruled A — director seat, decision batch #62, 2026-09-07, maintainer verbatim and untranslated: 「同意」 — in #16386 (comment). Its words: the ledger's line ceiling "rises to the measured count", 385 on that day's
main, "or 388 if PR #15955's ruled raise (362) lands first — the same +26 either way". PR #15955 landed first, so this round executes the 388 leg.This patch round does exactly two things, and nothing else.
origin/mainmerged in as a merge commit (never a rebase, never a force-push), which brings PR docs(pm-dispatch): three measured platform readings into the readings ledger #15955's ruled ceiling of 362 and its ownruledRaisesrecord. The ledger file itself is untouched by this round; it is now 388 lines on the branch — 362 plus the same 26 measured lines the candidate table below accounts for.scripts/pm/check-skill-line-ratchet.mjs,+15 −1: theCEILINGSrow for.claude/skills/pm-dispatch/references/platform-readings.mdmoves 362 → 388 (before → after), and oneruledRaisesrecord is appended. No other line in that script, no other ceiling, and nothing in the ledger file.The appended record, as it stands in the map:
The declared cross-file move is untouched by the raise: the destination now reads +11 (314 → 388, less 63 lines of ordinary ruled raise — 34 + 3 + 26) against the sources' unchanged net decrease of 20, which is exactly the +11 the move landed with.
Reverse verification — the raise is paid by the RECORD, not by the number
Every exit captured before any pipe.
65a6c814d4(after the merge)✗ … platform-readings.md is 388 lines; the ratchet ceiling is 362.— 1 of 1 failing assertions34f19d1b89✓ … platform-readings.md is 388 lines (ceiling 388; headroom 0).— 0 failing assertions--self-test, patched head✓ check-skill-line-ratchet self-test: 155 cases pass., the last of them✓ every live ruled-raise record quotes its ruling, dates it, and names a positive line count✗ … raises its ceiling 314→388, less 37 lines of ordinary ruled raise (+37) against a net source decrease of 20and✗ … the declared cross-file moves raise the map's total by 17 lines.The scratch copy is a mirror outside the repository — the script plus
scripts/invoked-as.mjs, with.claude/,AGENTS.mdandCLAUDE.mdsymlinked to this worktree — and its unmutated control run is byte-identical to the in-tree run above, which is what makes the mutated leg readable. The mutation was confirmed on disk by occurrence counts before the run (55639092252 → 0,delta: 26,1 → 0, the388ceiling row still 1), and the copy was restored afterwards withgit hash-objectequal to the worktree's file. The working tree was never mutated:git status --porcelainstayed clean across both legs.Gates on the final commit
34f19d1b89node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 38 families from the change set (2 paths, three-dot againstorigin/mainmerge base245c6a23c); all 38 were run and reconciled:pnpm --filter @objectstack/lint run check:doc-formula-expressionsexited 3 — PREREQUISITE NOT MET,@objectstack/formulaand@objectstack/lintunbuilt — and exited 0 after building both, so it is a real reading rather than a NOT-MEASURED.pnpm check:pm-skill-ratchet(self-test + live) — 0.node scripts/pm/check-clause2-carriers.mjs --self-test— 0, 190 cases.node scripts/pm/check-governed-merges.mjs --teston this PR's full file list — 3, GOVERNED as expected:.claude/** ×1on the ledger file, withscripts/pm/check-skill-line-ratchet.mjsreported as not on the register. A human merge is the review record.pnpm check:nul-bytes— 0, andgrep -naPfor the C0 range plus DEL over the edited file returns nothing.pnpm lint(eslint . --no-inline-config) throughbash scripts/pm/os-verify-lock.sh(slotissue-15977-p2, acquired on the first try with the full budget, no poll-and-retry):VERDICT command-exit 0 · held the lock 94s · waited 0s.check-published-list-mirrors,check:console-injection,check:dts-closure,check:engine-double-contract,check:i18n-stale-fill,check:pm-label-desc-cap,check:pm-governed-proseandcheck:skills-token-ratchet, all 0.pnpm check:published-readme-exportsexited 3 (PREREQUISITE NOT MET: 43 packages whose built type entry it reads are unbuilt) and is recorded as NOT MEASURED, not as a finding — it wants a whole-repo build, which CI performs.PR #16437 (the self-test roster on this same script) is still queued, not landed, so the conflict proof was run against its head twice on the final commit:
git merge-tree --write-tree HEAD 2c9c1a5282c94c4f99ce8ef78dba9f4272c0d8d58a3ac810f0git -c merge.os-regen.driver=false merge-tree --write-tree HEAD 2c9c1a5282c94c4f99ce8ef78dba9f4272c0d8d58a3ac810f0This patch round was executed by session
session_019RfFHiRCSs3JXLK4cwcfox(attribution recorded in prose because a body edit normalises the footer's session URL away). Nothing else on this PR was moved: the draft state, the approving review, the armed auto-merge and the labels are all as the approver left them.What changed
26 lines added, 0 removed, 0 re-wrapped. 359 to 385 lines on this branch. Widest line 120 bytes (
LC_ALL=C awk), unchanged — the per-line budget is respected by every new line.The ratchet is RED on purpose
That is the only red in the whole ratchet run — 1 of 1 failing assertions across every ceilinged file (
grep -con the run's own output). The ceiling map is deliberately not touched by this diff: the ceiling is the maintainer's, and the number this PR asks him to rule is 385 (or 388 if PR #15955 lands first and carries its own three lines in, which is the same +26 either way).Merge-tree proof against PR #15955's head, run twice
.gitattributesroutes generator-owned paths to themerge=os-regendriver, and this clone has that driver registered, so a single clean run would only prove "the driver took it". Both legs were run:git merge-tree --write-tree HEAD 04b61b5f6a73062b4612a878e2039958634f0defdca56b35c9git -c merge.os-regen.driver=false merge-tree --write-tree HEAD 04b61b5f6a73062b4612a878e2039958634f0defdca56b35c9Identical trees, both exits 0, zero
CONFLICTlines. The new lines sit at the end of each section; PR #15955's three lines sit mid-section (its offsets 147, 254, 293), so the two diffs never touch the same hunk.Every candidate, with its disposition
Landed lines are cited by their line number in this branch's file; present lines by their line number in
04b61b5f6a(the revision dedup ran against).issue_write createstores the body without the trailing attribution footer blockPOST /issueskeeps the footer on creation; a RESTPATCHre-sending the body stores it verbatim/rate_limit200 while repo-scoped reads 403;check-clause2-carriers --pairexits 3 from such a seatSendMessagewith idempotent restart text revives them with their transcriptsenable_pr_auto_mergeechoes an empty method even when it workedbehindPR enqueues finesend_laterfire notices are delivered only between turns and can arrive minutes late; a one-shot can also be consumed mid-turn with no delivered notificationbaseUrl(TS5101), so an ablation leg built on such a probe tsconfig is voidlist_issueswith one label plussinceis the cheapest lane probeperPagefrom the expected population)labelsonlist_issuesreturn the ORissue_read get_labelsdoes not resolve a PR numberget_commentsresult over ~100 KB spills to a filevalidateSchema, not zod@objectstack/specpin fails from an eval script in the shared checkoutFixesPR keeps itspm:*label; aRefsPR closes nothingsleepis blocked by the harnesstsfences import a legacy type cannot teach the new shape ahead of the type changeclosed_by_pull_requestsflipping to MERGED, the squash ingit log origin/main)get_job_logsreturns the log body where REST/actions/jobs/ID/logsis refused by the egress proxypackage.jsoncarries nopackageManagerresolves the registrylatestdist-tag at run time; the same SHA green then red means the tag moved, not the treepackage.jsonwritten by a self-test must carry the root manifest'spackageManagerCOREPACK_DEFAULT_TO_LATEST=0alone does not repair a store that already recorded 12.xremoved_from_merge_queuein the same second asmerged,auto_mergeclearing at enqueue, the tool reporting MERGE while the queue squashes, the queue ref listing only groups being built/search/issuesis 403 through the proxy; dedup runs on/issueslistingssearch_issuesis phrasing-sensitive, so a zero is not a readingcheck-governed-merges.mjsrefuses rather than under-reporting on a shallow clone, and reports the unaudited repo countdispatch-gates.mjsdoes not answer for objectui and says sogit merge-treeapplies a.gitattributesmerge driver when this clone has it registered, so a custom driver's exit 0 only means the driver took it48 candidates evaluated: 25 rows landed (26 lines — row 48 landed two), 11 already PRESENT, 12 DECLINED.
The one candidate that needed its own measurement
Row 48 sits next to lines 26–28, which read that
merge-treeanswers the default text merge and does not apply the.gitattributesdriver. Rather than assert a contradiction, the mechanism was measured in a throwaway repo on this container (git 2.43.0): one path routed to a custom driver, both sides changed, drivertrue.git merge-tree --write-treeexit 0, noCONFLICTline-c merge.NAME.driver=false: exit 1,CONFLICT (content)on that pathSo both readings are true and the missing variable is registration, which this repo makes per-clone (
pnpm installrunsprepare). The two landed lines say exactly that and prescribe the two-leg proof; lines 26–28 are left standing and untouched, because reconciling them is a decision, not a mechanical fold-in. See the open question below.Gates
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 16 families from the committed change set; all 16 were run and reconciled:Every exit was captured before any pipe (
cmd > log 2>&1; ec=$?).node scripts/check-closing-keyword-parity.mjs(+--self-test)node scripts/check-comment-mask-corpus.mjsnode scripts/pm/check-governed-queue-guard.mjs --self-testpnpm --filter @objectstack/lint run check:doc-formula-expressions@objectstack/formula/@objectstack/lint); re-run green after building both, so it is a real reading, not a NOT-MEASUREDpnpm check:agent-test-spellingpnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:nul-bytespnpm check:pm-governed-mergespnpm check:pm-skill-id-lintpnpm check:pm-skill-ratchetpnpm check:refd-timer-probepnpm check:required-contextspnpm check:skill-frame-syncpnpm check:watch-hint-literalpnpm check:pm-governed-prosepnpm check:pm-half-states --self-testnode scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/references/platform-readings.md.claude/**hit; a human merge is the review recordpnpm lintthroughscripts/pm/os-verify-lock.sh(slotissue-15977)VERDICT command-exit 0 · held the lock 110s · waited 0s— acquired on the first try with the full 540s budget, no poll-and-retryAll of the above ran at the final commit;
git rev-parse --short HEADat that run: 57cd638. No control bytes:grep -naPfor the C0 range plus DEL over the edited file returns nothing, andcheck:nul-bytesis green.验收备注
references/platform-readings.md— rows to add or change #16006; two are author-side or dispatch-authoring disciplines that the ledger's own line 267 and the dispatch brief already hold; one is a sizing tactic already covered by lines 83–84.skip-changesetapplies: this PR publishes nothing from any package — it edits one markdown file under.claude/..claude/**is a governed surface; the human merge is the review record.CI reading on this head (57cd638), every run complete: 29 check runs — 1 failure, 15 success, 13 skipped. The single failure is⚠️ The job stops at that step, so its 100-plus later gate steps report
Lint & Repo Gates, and its failing STEP is number 28,PM skill line ratchet— every step before it green, ESLint included.skipped, not green: that is precisely why the 16 derived families were run locally and reconciled with--ranrather than read off the PR.noted, not filed (under the #16351 admission threshold): the
Lint & Repo Gatesjob aborting at its first failing step means a PR carrying one red gate never displays the rest of the farm's verdicts — the same measurement defect asturbo runwithout--continuerecorded on #15803's 14:17Z comment, one layer up in a shell job. Not filed as a card: it is an observation about CI ergonomics, not a reproducible product defect, a declared-contract violation, or a metadata-authoring trap. The seat files it at ACCEPT if it judges otherwise.This PR was authored by session
session_019RfFHiRCSs3JXLK4cwcfox(attribution recorded in prose here because a body edit normalises the footer's session URL away).维护者速读(草稿)
这是什么。 平台读数账本的第五次增量,把四张卡上已经量到的平台事实,一条一行写进
references/platform-readings.md。四张卡是:#15977(通过 MCP 建卡会丢掉正文末尾的署名页脚块,并吃掉标题里的尖括号片段;改走 REST 建卡就正常)、#16006(spec@objectui 席位 09-05 整班量到的平台事实)、#16104 的第 1 节、#15803 的 C 节。后两张只取其中一节,另外几节留在各自卡上按它们自己的节奏拆。做了什么取舍。 一共评估 48 条候选:26 行落地、11 条查重后发现账本里已经有了(逐条在正文表里指了行号)、12 条按「repo 专有」或「作者侧纪律,不是平台事实」谢绝,理由也逐条写在表里。两张卡说同一件事的,只写一行、两个来源都记名——这样账本不会因为同一件事被两个席位量到就长两行。
为什么这个 PR 是红的。 行数棘轮红,是故意的,而且只有这一处红:账本上限现在是 359 行,本 PR 把它写到 385 行,多出 26 行。棘轮的规矩是「新增要靠删内容来买」,但这次没有可删的内容——账本里每一行都是一条还在用的读数,而且这次一行都没有重新折行(那在 2026-08-17 的裁决里明确不算货币)。所以这个 PR 不去动上限,而是把测量出来的数字摆到您面前:请裁 385(若 PR #15955 先落地,同样的 +26 对应 388)。
这件事的业务价值在哪。 账本不是文档,是舰队每天真的会去查的操作表。这次落地的 26 条里,有几条当天就在咬人:CI 的 job 名和真正失败的 step 可以不一致(照 job 名推原因会误诊)、Actions 日志过期后只剩清理输出(于是「构建失败了」是机器读数、原因不可断言)、corepack 在没有
packageManager的目录里运行时解析latest(同一个 commit 上午绿下午红,树没变、是 tag 动了)、search_issues用卡片自己的逐字标题做控制词会回 0(而同题自然语言回 14 条含那张卡——控制词选错了,查重就是一条瞎通道)。每一条都对应本轮真实烧掉的时间。席位意见。 (留空,待席位在验收时填。)
Open question for the ruling
Lines 26–28 versus the new lines 349–350. Lines 26–28 say
merge-treeanswers the default text merge and does not apply the.gitattributesdriver, and infer from that a systematic under-report on driver-managed paths. The measurement above (git 2.43.0, this container) says the driver is applied when the clone has it registered — which this clone does. Both can be true, because registration is per clone. But the inference on line 27 does not survive: with the driver registered,merge-treereports clean and the real merge also proceeds, so the hazard is not "reports clean while the real merge stops" but "reports clean because the driver deferred, saying nothing about content".Generated by Claude Code
Generated by Claude Code