Repository navigation
[finding] check-ratchet-remedy-authority's corpus note and why for check-i18n-walk-parity.mjs still say its ledger "ships EMPTY" — it now ships with three #15189
Description
Activity
分诊路由(本评论来自分诊座位)· R+150 ·
date -u实测 2026-09-04T20:07:28Z 一轮domain:devx·finding·priority:p3。落点scripts/check-ratchet-remedy-authority.mjs(仓库根scripts/)⇒ 车道表 devx。p3 判据:卡面自己写清了 —— 没有任何机械的东西读那两句话,门禁真正检查的字段是
expect: 'marked',而它未变且绿。⇒ 零行为影响、零门禁影响。⛔ 但也不是「不必修」:它是本仓明确当作 finding 处理的那一类 —— 一份手写的、描述另一个门禁状态的散文,自己没有门,在绿色构建下静默漂移。而下一个读者恰好会在要判断第四条条目是否异常的那一刻读到「该台账 ships EMPTY」。⭐ 卡面给的修法方向本席赞同,并且第二条更值得注意:改写而不是删除那两句(
marked而非refused的理由是承重的一半,必须原样留下);⚠️ 而卡面顺带提的那条才是长期解——「一份手写的、引用另一文件数字状态的描述」已经是第二次(#9915 在check-engine-double-contract.mjs上记过同一类)。⇒ 若第三次出现,便宜的修法是不再引用那个数字,而不是再同步一次。 本席把这条记在这里,以便第三次发生时有据可查,⛔ 不代裁。
Generated by Claude Code
分诊:补状态
pm:queue—— 并报告一件事:本卡预登记的那个触发条件已经触发了标签
findingdomain:devxpriority:p3维持不动 · 加tooling(落点是scripts/下的门禁脚本,与同族五张一致)· 类型 Task · 补pm:queueR+150 的分诊(
5545894486)已定车道与等级,唯独没写状态标签。⇒ 落在 SKILL.md:325 的「析取 ③」里;派发 backlog 默认按label:pm:queue过滤(:58) ⇒ 本卡此刻不在任何清单上。两句散文的改写、有具名落点、无可问之事 ⇒ SKILL.md:341 入队。
⭐ 本卡是这一族的登记处,而它写下的条件已经成立
R+150 在本卡上写下:
「一份手写的、引用另一文件数字状态的描述」已经是第二次(#9915 记过同一类)。⇒ 若第三次出现,便宜的修法是不再引用那个数字,而不是再同步一次。 本席把这条记在这里,以便第三次发生时有据可查。
**报告:第三次已经发生,而且不止第三次 —— 现在是第七个。**同一天稍晚的 R+150/R+152 三轮里又数出五个:
卡 站点 形状 #9915 check-engine-double-contract.mjs第一例 本卡 check-ratchet-remedy-authority.mjs说另一门禁台账「ships EMPTY」,实为 3第二例 #15208 partition-test-shards.mjsbanner 说「These five」,下有六个 pin第三例 #15231 check-wildcard-fallthrough打印 17,体内断言 18#15291 check-skill-compatibility-version.mjs打印 7,块里 6 ——⚠️ 高报#15310 COMPOUND_ANCHOR_LEDGERdocblock 说 22/15/7,表里 25/17/8#15313 check-driver-conformance.mjs比值陈旧且无日期 ——⚠️ 两处读数纸面互相矛盾⇒ 按本仓自己的「第三个实例即证据」门槛,这条早已越线。⭐ 通则的形状树上已有先例:
check-skill-frame-sync.mjs打印${popCases}而非字面量。⚠️ 但房规必须容纳两种终态,否则会做错:#15291 属于「绿行要报告跑了多少」⇒ 应当派生;本卡、#15208、#15313 属于「散文/论证不需要精确计数」⇒ 应当不写数字。⛔ 一条只允许派生的房规会逼着本卡去数另一个文件的台账条目数,那正是本卡诊断的病。⛔ 分诊席不代裁是否立房规 —— 但七个实例已列齐,第八次不必再从头论证。
⛔ 本卡自身的修法:改写,不是删除
卡面写明,上一席背书,我原样保留:
Rewrite both sentences to say what is now true — the ledger was filled to three by maintainer ruling and is shrink-only from three — rather than deleting the description. The reason the entry is
markedrather thanrefusedshould survive the edit unchanged; it is the load-bearing half.⇒ ⛔ 不要连着把
marked的理由一起删掉。两句要改的是描述,不是分类。分类本身不变:
marked仍是正确读数(存在一个正当的豁免行为,它缺的是一个属主),check-i18n-walk-parity.mjs里的⛔ MAINTAINER-ONLY标记不动。⚠️ 复量提醒:那三条(messages、settingsCommon、settings)与LEDGER_CEILING = 3是 #14653 维护者裁定(2026-09-04,5535827386,选项 A)之后的状态。⛔ 认领时现读KNOWN_NO_EXTRACTOR_FACE与LEDGER_CEILING,别用本卡的整数 —— 本族的病就是写下来的数字会过期,本卡自己的数字同样会。等级 p3 维持。没有任何机械的东西读那两句;门禁真正检查的字段是
expect: 'marked',未变且绿。⛔ 但也不是「不必修」:下一个读者恰好会在判断第四条条目是否异常的那一刻读到「该台账 ships EMPTY」。正确地没有在 PR #14763 里顺手修:那一轮声明的文件面是
scripts/check-i18n-walk-parity.mjs加冲突解决,本文件在面外;且已在 PR 正文的「One file outside the declared surface」里记过,使复审者在两处都能遇到它。本轮同族状态一并补齐:#15313 · #15310 · #15291 · #15208 同批补
pm:queue。⛔ 分诊席边界:不认领、不派发、不写码、不合并、不裁决。
Generated by Claude Code
os-try-charles commented
on Sep 19, 2026 CollaboratorMore actionsClaim: PM loop round 62
Session:session_017ef78bLdybu3AffehKkhfk
Branch:claude/issue-15189-ledger-no-longer-ships-empty
Worktree:objectstack-issue-15189
Domain:domain:devx
Seat:domain:devx#1
File surface:scripts/check-ratchet-remedy-authority.mjs(stop on breach; explain in the report)
Container & model:S 级机械卡,mode:subagent,model: opus(default tier —dispatch-gates --tier scripts/check-ratchet-remedy-authority.mjsrun in THIS act at 2026-09-19T00:14Z on treeorigin/main: "no path-derived mandate: the surface hits none of the 3 declared glob(s)", floor sonnet · default opus · ceiling fable)
Clause-②: no
Thread-read: 5585193441
Serial constraints cleared:none — 0 of 25 open PR(s) touch scripts/check-ratchet-remedy-authority.mjs or scripts/check-i18n-walk-parity.mjs; enumerated 2026-09-19T00:14Z
Serial-constraint reading, with its control. All 25 open PRs had their changed-file page enumerated in one pass at 2026-09-19T00:14Z: 342 distinct files, and the scan hits things (
packages/spec/api-surface-declarations/root.txton 4 PRs). Against that live control, both files read 0. ⛔ A zero with no control would not have been a reading.两句散文,一次改写 —— ⛔ 不是删除
scripts/check-ratchet-remedy-authority.mjs的手工分类语料里,关于check-i18n-walk-parity.mjs的两句把那个门禁的豁免台账描述成空的。本席在树上现读(origin/main,2026-09-19T00:14Z):scripts/check-ratchet-remedy-authority.mjs:887 // ledger that ships EMPTY by triage ruling — the author excusing themselves 同文件 :893 why: '… Its exemption ledger ships empty and only shrinks; …'而它描述的那个台账,现读:
scripts/check-i18n-walk-parity.mjs:209 const KNOWN_NO_EXTRACTOR_FACE = Object.freeze({ ← messages / settingsCommon / settings 同文件 :232 const LEDGER_CEILING = 3; 同文件 :194 … here with their reasons, and `LEDGER_CEILING` moved 0 → 3 in that same diff.⇒ 两句都对今天的树为假,而被描述的那个文件自己已经把 0 → 3 记下来了 —— 漂的只是另一个文件里的描述。
⛔⛔ 分诊在本卡上写死的那条,照抄下来
Rewrite both sentences to say what is now true — the ledger was filled to three by maintainer ruling and is shrink-only from three — rather than deleting the description. The reason the entry is
markedrather thanrefusedshould survive the edit unchanged; it is the load-bearing half.⇒ ⛔ 不要连着把
marked的理由一起删掉。 要改的是描述,⛔ 不是分类。expect: 'marked'不动;check-i18n-walk-parity.mjs里的⛔ MAINTAINER-ONLY标记不动;那个文件一个字都不改。⚠️ 本卡自己的病,会咬到你分诊逐字写着(本席认同,并且这是本轮派发令最要紧的一句):
⛔ 认领时现读
KNOWN_NO_EXTRACTOR_FACE与LEDGER_CEILING,别用本卡的整数 —— 本族的病就是写下来的数字会过期,本卡自己的数字同样会。⇒ 上面本席给的
3是本席在 2026-09-19T00:14Z 读到的。你落笔前再读一次,并在报告里写出你读到的值与时刻。若你读到的不是 3,以你的为准并说出差在哪,⛔ 不要照抄本席的。⭐ 而且值得想一层:新写的句子要不要再写一个数字? 卡面自己提了「若这一族出现第三次,便宜的修法是不再引用那个数字」,而分诊报告它已经是第七个。⛔ 本席不裁是否立房规(分诊明说不代裁),但这一句怎么写在你的自由度里:写「filled to three by maintainer ruling, shrink-only from there」是照分诊的字面;写成不含数字的形式也同样满足「说真话」。⇒ 二选一都接受,但要在报告里说你选了哪个、为什么。
硬后置条件
node scripts/check-ratchet-remedy-authority.mjs --self-testexit 0,前后各一次,两个断言数都引出来。⚠️ 本席本班亲手修过这个文件([finding] check-type-source-resolution's(via …)provenance annotation is FALSE for anincludeentry naming a bare directory — and that annotation is the doc-block's OWN test for which remedy limb an author is on #18373 那一轮),它有SELF_TEST_BATTERY_FLOOR与逐族计数 —— floor 与本条目所在族的计数前后各读一次并引出来;动了就是一条发现,⛔ 不是细节。- 裸调用
node scripts/check-ratchet-remedy-authority.mjsexit 0,前后各一次。⚠️ 本仓--self-test与裸调用是两套不同的电池,⛔ 不许把其中一个的绿报成另一个的。 - 残留读数带发火对照:改完后
ships EMPTY/ships empty在本文件里应为 0;对照取自被探的这个文件自身,且必须是一个你的 diff 没有碰过的词(git diff BASE HEAD -- PATH | grep -c TERM为 0 且文件里存在)。⛔ 预先挑好的对照不算测量,⛔ 别拿另一个文件的符号当对照。 expect: 'marked'与那条marked的理由在 diff 里必须原样存活 —— 引出你的 diff 里它们未被触碰的证据。
⛔ 出界
⛔
scripts/check-i18n-walk-parity.mjs(一个字都不改)· ⛔ 那条「要不要立一条房规,禁止在散文里引用别的文件的数字」—— 分诊列了七个实例并明说不代裁,那是另一张卡的事 · ⛔ 重新分类本条目 · ⛔ 改LEDGER_CEILING或台账内容。交付
changeset 按「有没有已发布的东西移动」判(根
scripts/发不出任何已发布字节 ⇒ 多半skip-changeset,但你自己验:读各包files[])。提交、推分支、开草稿 PR,正文第 0 行Fixes #15189,并带 裸写、行首、独占一行的Clause-②: no——⚠️ ⛔ 不加反引号、⛔ 不作标题、⛔ 不与别的内容同行。发os-dev-report到卡上并交回本席。门禁自己在工作树里推导:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack,按你真实的改动文件集跑它点名的。⛔ 按它自己的警告,那不是 CI 的完整账。⛔ 不转 ready、⛔ 不挂 auto-merge、⛔ 不合并 —— 上弦是本席的动作。
⛔ commit trailer 用 model-free 的:Co-Authored-By: Claude <noreply@anthropic.com>与Claude-Session: https://claude.ai/code/session_017ef78bLdybu3AffehKkhfk(本仓.githooks/pre-push拒绝带模型标识的,本班实测)。推进仓库的任何东西里⛔ 不得出现模型标识。
⛔ REST 写必带-H "Content-Type: application/json";MCP 写工具禁用,读工具可用。⚠️ 若卡面框架被测出是错的,说出来并停手 —— 本班六次都证明那是对的选择,其中三次错的是本席自己写的框架或本席自己立的卡。
Generated by Claude Code
Generated by Claude Code
os-try-charles commented
on Sep 19, 2026 CollaboratorMore actionsos-dev-report
{ "issue": 15189, "status": "done", "branch": "claude/issue-15189-ledger-no-longer-ships-empty", "pr": "https://github.com/objectstack-ai/objectstack/pull/19154", "premise_still_valid": true, "summary": "Rewrote the two false prose sentences in scripts/check-ratchet-remedy-authority.mjs's hand-classified corpus entry for check-i18n-walk-parity.mjs — the block comment's 'ships EMPTY by triage ruling' and the why string's 'ships empty and only shrinks' — to say that the ledger was filled by maintainer ruling on that gate's own first red and only shrinks from there. Nothing was deleted and nothing was re-classified: expect: 'marked' and the marked-rather-than-refused reason survive byte-identical, scripts/check-i18n-walk-parity.mjs was not touched, and LEDGER_CEILING and the ledger contents were not touched. LIVE LEDGER READING, taken in-worktree at 2026-09-19T00:16:13Z on origin/main @ 87f776bd7: KNOWN_NO_EXTRACTOR_FACE holds 3 keys (messages, settingsCommon, settings) at line 209, LEDGER_CEILING = 3 at line 232 — identical to the dispatch's 00:14Z reading, so there is no divergence to report; I read it myself rather than copying the card. NUMBER CHOICE: I took the number-free wording, not triage's literal 'filled to three … shrink-only from three'. Both are true today; the number-free one is the one that cannot go stale, and two facts make that more than a preference here — the ledger is shrink-only, so any count written into this file is only ever waiting to be wrong, and the file being described declares its 'settings' entry a DEFERRAL held on #15178, so the ledger is EXPECTED to shrink and a quoted 'three' would be stale by design. What the corpus entry has to carry is that the ledger is shrink-only and that growing it is the maintainer's act; its size never entered the marked-vs-refused reasoning. No house rule is proposed — that remains another card's question. The assignee field was set by the PM's dispatch atom; I did not write it. Changeset: skip-changeset, verified, see below.", "tests": "TWO BATTERIES, REPORTED SEPARATELY (they are not the same battery — the ablation below proves it empirically). (1) node scripts/check-ratchet-remedy-authority.mjs --self-test :: exit 0 BEFORE, exit 0 AFTER; both print the same OK line ('the lexer holds, messages are bounded, both offer word orders and path-named registries are reached, declaration registries are not, the authority token cannot anchor itself, refusal is told apart from discouragement, and the sweep still reaches every known instance'). (2) bare node scripts/check-ratchet-remedy-authority.mjs :: exit 0 BEFORE, exit 0 AFTER, with a byte-identical verdict line both sides: '257 scripts swept (scripts/*.{mjs,mts} + scripts/pm/*.{mjs,mts}); 15 mark the expanding remedy MAINTAINER-ONLY, 5 turn it down outright, 237 hand out no ratchet-expanding remedy. Control corpus: 30 hand-classified scripts, set-equality audited both ways.' — no verdict moved. ROSTER READINGS BEFORE AND AFTER: SELF_TEST_BATTERY_FLOOR = 21 before and after; roster size 21 entries before and after; sum of pinned per-battery counts 30 before and after; this entry's battery is '(16) The corpus-scale positive control, asserted here as well as in the run:', pinned count 1 before and after. NOTHING MOVED — no floor finding to report. The self-test's green is itself the assertion that every declared battery met its floor, so battery (16) registered at least its pinned 1 case in both runs. RESIDUAL READING WITH A FIRING CONTROL, control derived AFTER the diff existed by listing terms present in the probed file and absent from 'git diff BASE HEAD -- scripts/check-ratchet-remedy-authority.mjs' (not pre-picked, and taken from the probed file itself): 'ships EMPTY' 0, 'ships empty' 0, case-insensitive 'ships empty' 0; control term 'battery' — 48 lines in the file, 0 in the diff, so the control fires. VERBATIM SURVIVAL OF THE CLASSIFICATION, from my own diff: expect: 'marked' occurs 15 times in the file before and after and 0 of those lines appear as a +/- line in the diff; the marked-rather-than-refused comment block ('`refused` would be untrue: a group keyed by strings no stack config declares / genuinely has no extractor face, so there IS a legitimate act here.') is present exactly once before and after and appears as no +/- line; inside the single why line that did change, the trailing 174 bytes are byte-identical ('; emitting the group is the author's remedy and is offered first, while exempting one is a decision with an owner, so that path is named with its owner rather than denied.',) and only the leading false clause was replaced. ABLATION (extra, not asked for — it proves the corpus classification is live and that the two batteries differ): from the COMMITTED state, flipped this one entry to expect: 'refused'; on-disk proof of the mutation was a grep count of 6 occurrences of \"expect: 'refused',\" (5 pre-existing plus mine) and a changed blob hash fcaf6646 vs HEAD's 65668150; the BARE run then exited 1 with 'MISCLASSIFIED: scripts/check-i18n-walk-parity.mjs — the control says \"refused\", the sweep says \"marked\"' and echoed my NEW why text, while --self-test stayed exit 0. Restore leg: git checkout HEAD -- PATH under a trap with an absolute repo-root path; restored blob hash 65668150 equals the HEAD hash, git diff HEAD is empty, and both invocations are exit 0 again. ASYMMETRY WORTH KNOWING: the corpus verdict is guarded by the BARE run only — battery (16) asserts the sweep REACHES every instance, not that verdicts match — which is exactly why the card forbids reporting one battery's green as the other's. GATES: derived in-worktree with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack over the real changed-file set (1 path, merge base 87f776bd7): 28 commands, ALL 28 exit 0. Reconciled with --ran over a record carrying exit codes: '28 derived famil(ies) accounted for — 28 run, 0 NOT-MEASURED (a DERIVED zero — all 28 recorded an exit code and none of them is 3)'. Per the tool's own warning that is not a complete account of CI (it names 53 artifact-roster, 11 wide-population, 14 pending-changeset families and a path-scheduled job outside the derived total). LINT, the union rather than a narrowing — it fit in the foreground: npx eslint . --no-inline-config --format json at the final commit 311c62a44 :: exit 0, 6892 files in eslint's own population, 0 errors, 0 warnings. LOCAL SCOPE: no package build closure and no package test suite is owed — the edited path is repo-root scripts/, inside no workspace package, so item (1) and item (2) of the local-verification scope are empty; the edited file is a gate script, and git grep finds NO *.test.ts / *.spec.ts naming it, so its own test surface is its --self-test, which check:ratchet-remedy-authority runs ahead of the bare run and which is in the 28 above. Control-byte scan clean: grep -naP over the file found none, and check:nul-bytes is green over 8979 files.", "mcp_calls": "0 — no MCP GitHub tool was called, read or write.", "api_writes": "4 budgeted writes, nothing else: (1) git push — twice on the same branch, the pre-edit empty-branch routing probe and the commit push, both accepted; (2) POST /repos/objectstack-ai/objectstack/pulls — HTTP 201, draft: true, PR 19154; (3) POST /repos/objectstack-ai/objectstack/issues/19154/labels — HTTP 200, additive, skip-changeset; (4) POST /repos/objectstack-ai/objectstack/issues/15189/comments — this report. Label read-back is comparative: read set ['size/xs','skip-changeset'] equals union(read, target), so nothing was stripped; no re-apply was needed. PR body read back in full: byte-identical to what was sent except the trailing newline the platform strips, exactly one attribution footer, in the session-URL form, and zero less-than fragments. Clause-②: no is stored as a bare, line-start, own-line declaration, verified by reading the stored body back. DECLARED DEVIATION: the ablation's before/after runs are reported HERE but NOT in the PR body — adding them would need a PATCH of the body, which is outside the four-write budget and explicitly forbidden; the PR body already carries the two batteries, the residual reading with its control and the verbatim-survival evidence.", "open_questions": [], "out_of_scope_findings": [ "noted, not filed: the house-rule question the card names — whether prose in one file may ever quote a number that lives in another — is left exactly where triage left it, unruled, with seven instances listed. Successor: triage's own seven-instance list; the next PR touching any of those seven quoted numbers is what carries it. I neither filed it nor took a position on it in the code; the commit message records only why THIS sentence carries no number.", "noted, not filed: the entry's why value is a single very long string literal on one line, which is why a two-word correction inside it necessarily shows as a whole-line diff and the verbatim survival of the marked reason had to be proven by a byte-suffix comparison rather than by the diff alone. Style only, no gate cares, and re-wrapping it would enlarge the diff of a card whose whole point is that the classification must be seen to survive untouched. Successor: none — no PR and no person needs this file re-wrapped." ] }Attribution — H64 補記, added in place by the dispatching PM seat (the artefact's owner;
mode:subagent, so dev and PM share one session id): thisos-dev-reportwas written by the os-dev subagent of sessionsession_017ef78bLdybu3AffehKkhfk. ⛔ The text above is unchanged — this line is appended, not a rewrite.
Generated by Claude Code
os-try-charles commented
on Sep 19, 2026 CollaboratorMore actionsACCEPT —— PR #19154。
⚠️ 尚未武装:Lint & Repo Gates本轮仍in_progress,绿判据未成立 ⇒ 按契约读绿之后才上弦。domain:devx执行席(座位贴 #6023,seatdomain:devx#1)。复核取数 2026-09-19T00:50Z,逐条对着树与 GitHub 做,⛔ 不对终报自述做。⭐⭐ 头条:施工席没有照抄分诊那句字面,而它是对的 —— 本席现读核实并背书
分诊在本卡上写的是「filled to three by maintainer ruling and is shrink-only from three」。施工席改成了不含数字的写法:
scripts/check-ratchet-remedy-authority.mjs:894(PR head 311c62a44) why: 'PR for #14653. Its exemption ledger was filled by maintainer ruling on its own first red and only shrinks from there; emitting the group is the author's remedy …'它给的理由是「那个台账预期会缩,所以写下的三会按设计过期」。本席去核实了这一条,它逐字成立 —— 被描述的那个文件里,台账第三条自己写着:
scripts/check-i18n-walk-parity.mjs:218 settings: 同文件 :221-223 … no consumer asks for per-app settings translations today. **A DEFERRAL, not a fact** — the terminal state (a registry-driven emitter …, or **removal from the per-app schema**) is held on **#15178**.⇒ ⭐ 台账的第三条是一个 deferral,它的终态之一就是「移除」。 所以在另一个文件里写下「three」,不是可能过期,是按设计一定会过期 —— 而本卡诊断的病恰恰就是这个。
⇒ 施工席守住了分诊那句的承重半(改写而非删除;
marked的理由原样存活),放掉了附带半(引那个数字),并给了一条可核的理由。⭐ 这比照抄指令更好,本席背书。 ⛔ 它也没有借此去立那条房规(七个实例那件事仍在分诊那里未裁),这个边界也守对了。本席自己验到的四条
① 形状与围栏。 1 个文件,
scripts/check-ratchet-remedy-authority.mjs+5/-4;标size/xs·skip-changeset;正文第 0 行Fixes #15189;Clause-②: no裸写、行首、独占一行。⛔scripts/check-i18n-walk-parity.mjs一个字未动。② 残留读数。 PR head 上
ships empty/ships EMPTY读 0。⚠️ 文件里另有一处'only shrinks'(:623)—— 本席看了上下文:它是SHRINK_TESTIMONY这个施加在别的门禁脚本散文上的谓词,⛔ 不是一条针对本文件自身语料的针 ⇒ 新措辞里的「only shrinks」不会去满足它。③ 分类原样存活,而且这一条是靠字节后缀证的而不是靠 diff。
expect: 'marked'在文件里出现 15 次,0 次作为 ± 行出现在 diff 里;marked而非refused的那段理由前后各出现一次、也不在 diff 里。⚠️ 那条why是一行超长字符串,所以一次两词改写必然显示为整行 diff ⇒ 施工席用尾部 174 字节逐字相同来证明只有开头那句假话被换掉了。⭐ 这个证法是对的:diff 的粒度不够时,就换一个够的读法。④ 两套电池分开报,而且它用一次消融证明了它们不同。
--self-test前后 exit 0;裸调用前后 exit 0 且判词行逐字相同(15 mark … 5 turn it down … 237 hand out no ratchet-expanding remedy—— 15+5+237 = 257,与扫过的脚本数一致 ⇒ 没有任何分类移动)。消融:把本条目翻成expect: 'refused'⇒ 裸调用 exit 1 并打出MISCLASSIFIED: scripts/check-i18n-walk-parity.mjs,而--self-test仍然 exit 0。⇒ ⭐⭐ 那次消融正好证明了本卡派发令里那条禁令是有实质的:语料判词只由裸调用守着,
(16)那条电池断言的是「sweep 能触达每个实例」而不是「判词对得上」。⛔ 把其中一个的绿报成另一个的,在这个文件上会漏掉整个语料层。Floor 与名册,前后各读一次:一个都没动
SELF_TEST_BATTERY_FLOOR21 → 21;名册 21 → 21 条;各族 pin 计数之和 30 → 30;本条目所在那族(16) The corpus-scale positive control…pin 1 → 1。⇒ ⛔ 无 floor 发现。门禁与 lint
dispatch-gates --commands按真实改动集推出 28 族,全部 exit 0,并用--ran对账:「28 derived famil(ies) accounted for — 28 run, 0 NOT-MEASURED(a DERIVED zero — all 28 recorded an exit code and none of them is 3)」。⭐ 那个括注是对的:0 NOT-MEASURED 本身也要是一个派生出来的读数,而不是一句没跑过的宣称。npx eslint .在最终提交上 exit 0,6892 个文件、0 error 0 warning —— 它取的是并集而不是一次收窄,并说明了「因为它在前台跑得完」。两条 noted-not-filed,本席同意都不立卡
房规那件事(散文能不能引另一个文件的数字)原样留在分诊那里未裁,承接是「下一个碰那七个数字之一的 PR」 —— ⭐ 施工席没有借本卡去立它,也没有在代码里替它表态,只在 commit message 里记了这一句为什么不带数字 · 那条
why是一行超长字符串(样式问题,无门禁在意,重排会放大一张「必须让人看见分类原样存活」的卡的 diff)。一条声明性偏离,本席接受
消融的前后读数只在终报里,⛔ 没有进 PR 正文 —— 补进去要 PATCH 正文,超出它给自己定的四次写预算且被明令禁止。⇒ PR 正文已带两套电池、带对照的残留读数与分类存活证据;消融是额外做的,不是派发令要求的。⭐ 声明而不是默默塞进去,这是对的。
下一步
读绿 →
ready_for_review→ 回读且total_count必须真的动过 →auto_merge→ 跟到 MERGED 并在确认 MERGED 的同一动作里取双读数、清状态(Fixes⇒ 自动关闭 ⇒ 摘pm:dispatched+ 清 assignee)。
Generated by Claude Code
Generated by Claude Code
os-try-charles commented
on Sep 19, 2026 CollaboratorMore actions落地记录 · PR #19154 →
8b8258d91结论:已落地。 卡片由
Fixes自动关闭,状态标签与 assignee 已清空(tooling·domain:devx·priority:p3· 0 assignees)。第一读数:队列与时间线
时间线一页枚举到 12 个事件(2026-09-19T01:36:54Z),其中落地五步齐备:
ready_for_review 01:00:58Z→added_to_merge_queue 01:02:07Z→removed_from_merge_queue 01:31:47Z→merged 01:31:48Z(commit_id 8b8258d91)→closed 01:31:48Z→head_ref_deleted 01:31:49Z。这一读的控制项来自同一次枚举:12 个事件里另外 6 个是labeled/assigned一类的非落地事件,枚举确实看得见事件,不是一个空读。⛔ 本席没有用merged布尔值,也没有用 head-sha 祖先关系。分支侧走满 12 页、1148 个分支(2026-09-19T01:37:16Z):
pr-19154的队列分支 ABSENT,head 分支 ABSENT。⭐ 同一次枚举仍列出main,并且仍列出另一条队列分支gh-readonly-queue/main/pr-19158-8b8258d910dbf861369700bbfa213b9a7489d82e—— 两个控制项都在同一份读数里开火,所以这两个 ABSENT 是真的空,不是翻页翻漏了。顺带一句:那条 #19158 的队列分支正是架在8b8258d91上的,这本身就是「本次合并已在 main 上」的独立旁证。第二读数:重取
origin/main的内容探针探针工作树移到
8b8258d91,落地 diff 为 1 个文件、+5/-4(2026-09-19T01:36:26Z)。scripts/check-ratchet-remedy-authority.mjs的前后对照,before 取自git show 8b8258d91^:PATH(2026-09-19T01:36:38Z):ships EMPTY1 → 0、ships empty1 → 0、filled by maintainer ruling0 → 1。开火控制项在落地当刻机械地从被探文件自身挑出 —— 落地 diff 里命中 0、而文件里确实在场的四个词:battery(diff 0 / 文件 48)、SELF_TEST_BATTERY_FLOOR(0 / 3)、MAINTAINER-ONLY(0 / 3)、SHRINK_TESTIMONY(0 / 2)。⚠️ expect: 'marked'不是控制项:它在落地 diff 里命中 1,只能当读数用 —— 前后都是 15,自检行没有增减。两条电池在
origin/main上都是 exit 0(2026-09-19T01:36:40Z):--self-testOK;裸判决257 scripts swept … 15 mark … ⛔ MAINTAINER-ONLY, 5 turn it down outright, 237 hand out no ratchet-expanding remedy,15 + 5 + 237 = 257 ⇒ 没有任何一条脚本的归类被这次改动挪动过。本轮真正的标题不是这行文案
开发席拒绝了分诊给出的字面指令(「引用『三条』」),理由比指令本身更好,本席逐字核对后背书:那本账册的第三条,按
scripts/check-i18n-walk-parity.mjs:221-223自己的话,是settings:……A DEFERRAL, not a fact — the terminal state (a registry-driven emitter on the metadataForms precedent, or removal from the per-app schema) is held on #15178.编者按(上面这段是引文,时间戳按 H44 写在引文之外的同一段里):在
8b8258d91这棵树上读到:209 const KNOWN_NO_EXTRACTOR_FACE = Object.freeze({恰好 3 个键(messages/settingsCommon/settings)、:232 const LEDGER_CEILING = 3;(2026-09-19T01:38:07Z)。所以写死一个数字会按设计就是过期的 —— 第三条的终态挂在 #15178 上,随那张卡的裁决就会消失,而账册天花板与真实大小此刻正好咬合。措辞取「无数字」是对的。
Generated by Claude Code
- added a commit that references this issue
on Sep 28, 2026
What drifted
scripts/check-ratchet-remedy-authority.mjscarries a hand-classified control-corpus entry forcheck-i18n-walk-parity.mjs. Two sentences in it describe that gate's exemption ledger as empty:whystring: "Its exemption ledger ships empty and only shrinks; …"Both were true when written. As of the maintainer ruling on #14653 (2026-09-04, comment 5535827386, option A) that ledger ships with three entries —
messages,settingsCommon,settings— andLEDGER_CEILINGis 3. The two sentences are now false about the tree they describe.Why it is worth a card rather than a shrug
Nothing mechanical reads either sentence. The field the gate actually checks is
expect: 'marked', which is unchanged and green —pnpm check:ratchet-remedy-authoritypasses on the branch that filled the ledger. That is precisely the shape this repo treats as a finding: a hand-written description of another gate's state, with no gate of its own, drifting silently under a green build. The next reader of that corpus entry is being told the ledger is empty at exactly the moment they might be deciding whether a fourth entry is unusual.Note the classification itself does not change:
markedis still the right reading (a legitimate exempting act exists, and what it needs is an owner), and the⛔ MAINTAINER-ONLYmarking incheck-i18n-walk-parity.mjsis untouched. Only the two descriptive sentences are stale.Where
scripts/check-ratchet-remedy-authority.mjs— the comment block and the'check-i18n-walk-parity.mjs'entry in the hand-classified control corpus (search the file forcheck-i18n-walk-parity.mjs).KNOWN_NO_EXTRACTOR_FACEandLEDGER_CEILINGinscripts/check-i18n-walk-parity.mjs.Suggested shape
Rewrite both sentences to say what is now true — the ledger was filled to three by maintainer ruling and is shrink-only from three — rather than deleting the description. The reason the entry is
markedrather thanrefusedshould survive the edit unchanged; it is the load-bearing half.Worth considering while there: a description of another file's numeric state, hand-written and ungated, is the same class as the one #9915 recorded for
check-engine-double-contract.mjs. If that recurs a third time, the cheap fix is to stop quoting the number at all rather than to re-sync it.Provenance
Found while landing the ruling on #14653 (PR #14763). Not fixed there: that patch round's declared file surface was
scripts/check-i18n-walk-parity.mjsplus merge-conflict resolution only, and this file is outside it. Recorded in that PR's body under "One file outside the declared surface" so a reviewer meets it in both places.