Four surfaces state the gate set as three commands; CI now enforces four — one PR must move all four, and three of them are governed - #77
Conversation
…ated PR #72 (#67) added `pnpm lint:i18n-gate` to `.github/workflows/ci.yml`, so CI enforces four gates. `package.json`'s `verify` has composed four for some time. The documents were the last thing in the repository saying three. Five surfaces, not the four the card listed — a repository-wide grep for the gate set also turned up `docs/backlog/README.md`, the acceptance floor every work card inherits. All five now state the same list in the same order: validate -> lint -> typecheck -> lint:i18n-gate. `AGENTS.md` "Verify your work" is rewritten rather than appended to: the count was welded into the prose twice ("all three exit non-zero", "the three green tails"), so a bare fourth command would have left the section contradicting itself within three lines. The replacement prose is deliberately count-free, so a fifth gate cannot reopen this defect there. The enumerations are kept; collapsing any of them to `pnpm verify` is a judgement the PR body raises and does not take. Documentation only. No gate reads any of these files. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R3n3GGzobdegM4HUzah1iR
维护者速读(席位定稿)
改了什么 —— 仓库里五处告诉贡献者「闸门是三道」的地方,一次改齐成四道,全部是 markdown,一行代码没动。四处是卡片点名的( 为什么改 —— PR #72(#67)已经把 漏掉的偏偏是最不该漏的那道。漏一个 一处值得单独看的做法 —— 风险与代价(含回滚) —— 极低。纯文档:四道闸门全部退出码 0;而且 dev 做了消融证明 —— 把这四个文档同时削成两行垃圾( 代价:贡献者从此被要求跑第四道闸门 —— 而这道闸门本来就在 席位意见 —— 建议合。这是文档追赶一个已经生效的强制面,方向和 PR #40 一致(那次是设计文档追赶已发布的现实)。 你要做的 —— 确认「四道闸门」就是你要的贡献者门槛(CI 已经这么跑了),确认无误就合并。 两件已裁、不需要你处理的:
Generated by Claude Code |
Fixes #73
AGENTS.md,CLAUDE.md) and is left OPEN for the maintainer to merge. PerAGENTS.md→ Delivery process → Governed surface, the seat reviews it, records an ACCEPT on the issue, and stops there. Nothing here is urgent and nothing here is risky; see 维护者速读 at the bottom.What changed
PR #72 (#67) added
pnpm lint:i18n-gateto.github/workflows/ci.yml, andpackage.json'sverifyhas composed all four for some time. The documents were the last thing in the repository still saying three. They now all say the same four, in the same order —validate→lint→typecheck→lint:i18n-gate.README.md46–51pnpm lint:i18n-gateis wider than the old comment columnCLAUDE.md8–10AGENTS.md29–37## Verify your work— block + proseAGENTS.md130docs/backlog/README.md29–30AGENTS.md"Verify your work" is a rewriteThe count was welded into the prose twice — 「All three exit non-zero」 and 「Paste the three green tails」. Appending a fourth command without touching those would have left the section contradicting itself inside three lines, which is the exact defect class this card fixes.
The replacement is deliberately count-free:
"Each" and "all of them" bind to the block above them rather than to a number, so a fifth gate cannot reopen this defect there. The block itself still enumerates — deliberately; see the judgement call.
The grep — run here, reported in full
The card's four rows came from a grep, so I ran my own rather than trusting the list. Four spellings, whole tree, tracked files:
It returned five documentary statements of the gate set, not four. The fifth is
docs/backlog/README.md29 — 「Every card inherits the same acceptance floor:pnpm validate && pnpm lint && pnpm typecheckgreen」 — the floor every dispatched card inherits and the PM loop reads. I moved it with the other four. Leaving it at three would have produced precisely the trade the card forbids: a uniform understatement swapped for a genuine contradiction, with the backlog telling a dev three whileAGENTS.mdtold it four. It is ungoverned, off every exclusion list in the card, mechanically identical to the other four, and disjoint from #71's file surface.One further occurrence, deliberately not touched:
DESIGN.md354, the M1 milestone acceptance cell — 「validate/lint/typecheck绿」.DESIGN.mdis excluded by this card and governed byAGENTS.md128/131/132, so it needs aneeds-user-decisioncard rather than a rider. It also reads differently from the other five: it records what a delivered milestone was accepted against, not what a contributor should run today. Flagged for the seat; not filed, because filing the governed-surface decision is the PM seat's act, not mine.Nothing else. Every other hit is an incidental mention of a single command —
pnpm validatereports 9 objects (docs/backlog/02,03), thelint:i18n-gatedesign notes insrc/**andscripts/,package.json,ci.yml— none of them states the gate set, and none was touched.The judgement call:
pnpm verifyvs enumeration — recommended, not takenThe card asked me to state a reading and not act on it. My reading:
AGENTS.md130 anddocs/backlog/README.md29 should eventually saypnpm verifyand nothing else;README.mdandAGENTS.md29–33 should keep enumerating.The two that should collapse are the two that name the set only to say "this is the bar". They carry no per-command information, they are pure restatements of
package.json'sverify, and restatement is the mechanism that drifted — five copies, one edit toci.yml, five wrong.pnpm verifycannot drift: it is the definition.The two that should not collapse are the two whose job is to show a reader what runs.
README.md's block exists so a newcomer sees the four things and what each catches;AGENTS.md's block does the same for an agent, with a per-gate comment explaining whylintis not a second spelling ofvalidate. Replacing those with one composed word costs a reader the whole point of the block and saves a drift risk that the count-free prose rewrite has already largely defused.I did not act on any of this. The enumerations are all still here, all four commands, right order. If the maintainer wants the collapse, it is a two-line follow-up card.
Gate output — all four green, exit codes captured before any pipe
Run in a dedicated worktree off
19a8a4c, on4560611. Each gate written to its own log and$?read directly, never through a pipe:One green tail per gate, as the rewritten
AGENTS.mdnow asks:validateandlintwarnings are pre-existing onmainand untouched by this diff, which is markdown only.Demonstration: no gate reads these files
Asserting it is not evidence, so here is the measurement. All four documents were reduced to two lines of garbage at once, all four gates were run against the corrupted tree, and the tree was restored under
trap … EXIT INT TERMwith absolute paths fromgit rev-parse --show-toplevel, then verified by state — never by an exit code.Every gate stayed green with all four documents destroyed, so no gate reads any of them. A second, independent line of evidence agrees:
tsconfig.json14 is"include": ["objectstack.config.ts", "src/**/*"], andvalidate/lintwalk the metadata graph fromobjectstack.config.ts. The ablation is the measurement; the tsconfig line is the explanation.Edits verified on disk by spelling counts, never by an editor's exit code
Counted per file, before and after, on disk:
lint:i18n-gateREADME.mdCLAUDE.mdAGENTS.mddocs/backlog/README.mdRepo-wide, the old composed spelling is gone entirely:
Scope
Documentation only:
README.md,CLAUDE.md,AGENTS.md,docs/backlog/README.md. No.github/, nopackage.json, nosrc/, noDESIGN.md, noLICENSE, noCHANGELOG.md, nodocs/design/**. Disjoint from #71, which is in flight onsrc/dashboards/andsrc/datasets/. What the gates are and the order they run in are unchanged. No changeset (this repo has no changeset gate). No browser run owed — no surface a human touches was changed.Acceptance notes
19a8a4c, the tree this branches from, not copied from the card's table (which was taken on30fd863).DESIGN.md354's M1 milestone acceptance cell still spells three gates. Governed surface, excluded by this card, and arguably a historical record rather than an instruction — the seat's call whether it becomes aneeds-user-decisioncard.docs/backlog/14-release.md14 already sayspnpm verifygreen, which is the composed form this PR recommends for the two restatement surfaces. It is correct today and needs no change.维护者速读(草稿)
改了什么:仓库里凡是「告诉贡献者要跑哪几条 gate」的地方,全部从三条改成四条,补上
pnpm lint:i18n-gate,顺序与package.json的verify、.github/workflows/ci.yml完全一致。共五处:README.md、CLAUDE.md、AGENTS.md两处、docs/backlog/README.md。其中AGENTS.md的「Verify your work」一节是重写而非追加——原文两次把「三」写死在散文里,只加命令会让同一节在三行之内自相矛盾;新写法不再出现数字,下次再加第五条 gate 时那段散文不会再错。为什么改:PR #72 让 CI 真的跑四条,
verify也早已是四条,文档成了仓库里最后还说三条的东西。照文档跑的贡献者不会出错,只会漏跑一条——是遗漏不是错误,所以这不是缺陷,是文档追上已经移动的执行面。风险与代价:零。纯 Markdown,没有任何 gate 读这四个文件——不是断言,是量出来的:把四个文件同时毁成两行乱码,四条 gate 依然全部 exit 0,然后在 trap 下按
git hash-object逐个比对 HEAD blob 还原并验证(见上面的 Demonstration)。回滚就是git revert这一个 commit,无迁移、无数据、无依赖。席位意见:(留给席位填写)
你要做的:看一眼
AGENTS.md那段重写读起来是否还是你要的语气,然后合并。另有两件事等你定夺,都不阻塞本 PR:①AGENTS.md表格与 backlog 的验收底线要不要干脆改成只写pnpm verify(本 PR 只建议、没有动手,理由见上面的判断题一节);②DESIGN.md354 的 M1 验收格里还写着三条,属受管面,需要一张needs-user-decision卡才能动。🤖 Generated with Claude Code
https://claude.ai/code/session_01R3n3GGzobdegM4HUzah1iR
Generated by Claude Code