docs(pm-skill): the fifth readings increment — 26 measured platform facts - #16379
docs(pm-skill): the fifth readings increment — 26 measured platform facts#16379claude[bot] wants to merge 1 commit into
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 |
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)
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.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