Skip to content

docs(audits): gate census 2026-09 — 225 rows on one table, retirement list, report-only (ruling F) - #18497

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-18472-gate-census
Sep 17, 2026
Merged

os-zhuang merged 3 commits into
mainfrom
claude/issue-18472-gate-census

Conversation

@hotlong

@hotlong hotlong commented Sep 16, 2026

Copy link
Copy Markdown
Contributor

Fixes #18472

skip-changeset: the diff is one file under docs/audits/, which no released package's files[] ships.

What this is

The gate census the maintainer's ruling F asked for, verbatim 「F」 on 「现在有各种门禁的开发在浪费我的各种时间,我们的项目是不是门禁用的太重了。有这个必要吗?」 — one table, report-only. No gate is removed, disabled or edited by this PR; the retirement batch is its own card(s) after the maintainer's one-word 「认可」 on the table.

docs/audits/gate-census-2026-09.md:

  • Inventories: ① 182 check files (scripts/**/check-*.mjs 178 + packages/*/scripts/check-*.mjs 4) · ② 26 root check:* scripts that are not a thin alias (of 164; 138 collapse onto their file row) · ③ 10 hooks (5 PreToolUse guards + 5 self-tests; the base tree had 12 — chore(hooks): remove the client-side enqueue guard hook — the merge_group queue guard is the line #18478 removed the enqueue guard on main after the base) · ④ 7 required contexts (read from GET /repos/objectstack-ai/objectstack/rules/branches/main) → union = 225 rows, the table has 225 rows.
  • Verdicts: retire 59 (58 rule-derived + retire (ruled) for check-reference-carrier-shape.mjs, objectstack#18095 E) · report-only 16 · keep 150 (133 plain, 2 ruled — the governed queue guard and its context —, 5 too new to judge, 5 session hooks + 5 hook self-tests).
  • Classes: process 115 · contract 60 · correctness 50.
  • Column 5 (real catches): sampled over the last 30 days of failed PR CI (2026-08-17..09-16): 1,230 failed runs in the eight PR-triggered gate workflows, 1,287 failed jobs read step-by-step, 1,287 annotation reads, 9 sampled job logs, attribution by step name, split by annotation tag where a step hosts several gates, counted as distinct PRs, PRs that edited the gate's own file excluded. Every zero is a measured zero; every unmeasured names why; no count is guessed.
  • Three sections: retirement list (per row: files to delete, root scripts to drop, workflow file:line, count of other references to fix; a nine-row CI-integrity sub-group presented as one decision), report-only list, method + limits (incl. what is outside the four inventories: 70 per-package check:*, 31 workflow-direct non-check-* steps, two inline workflow gates — the inline Require a changeset step alone reddened 107 PRs).
  • Zod validation inside packages/spec / the runtime is the product, out of scope, said in one line.

Standing verdicts recorded as given: check-governed-queue-guard.mjs = keep (ruled); check-reference-carrier-shape.mjs = retire (ruled).

Acceptance notes

  • Dispatch-derived gates (node scripts/pm/dispatch-gates.mjs --commands docs/audits/gate-census-2026-09.md, 17 families) all exit 0 on the merged tree except pnpm check:cross-package-test-inputs (exit 1, at the base and again on the merged tree): its finding names packages/cli/test/init-created-files-summary.e2e.test.ts walking packages/spec/dist/ with no declared glob — not a path this diff touches (one docs file). Reported to the seat in the dev report for filing; not fixed here (scope rule).
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions first answered exit 3 (PREREQUISITE NOT MET: @objectstack/formula and @objectstack/lint not built) — built both through the verify lock and re-ran: exit 0.
  • noted, not filed: the four inventories the card defines leave 31 workflow-direct gate steps and two inline workflow gates without a row; the census names them in Method so the union stays honest. 承接者: the director's retirement batch (it decides whether a ⑤ is worth a follow-up census).
  • noted, not filed: two of the 25 Docs anchors resolve to real headings step failures could not be attributed between check-doc-anchors.mjs and check-system-context-census.mjs (no tag in the annotation); recorded as unmeasured on the doc-anchors row. 承接者: none.
  • Drift: origin/main moved seven commits before this PR opened; the branch merged bf61f0a1 and the census was re-derived on the merged tree (Drift paragraph in the file). docs(pm-skill): flip the gate asymmetry — adding a required gate/hook/ratchet joins the human floor; census-marked retirement becomes class-1 (ruling F) #18481 (the protocol flip: a census-marked retirement becomes class-1) landed in that range and is the other half of ruling F.
  • Local verification scope: no package is touched, so no build/test closure is owed; packages/spec, @objectstack/formula and @objectstack/lint were built only as prerequisites of the derived gates. Repo-wide scans (pnpm lint) are CI's.

维护者速读(草稿)

改了什么:新增一份审计文档 docs/audits/gate-census-2026-09.md,把仓库里全部门禁放到一张表上:182 个 check-*.mjs、26 个非别名的根 check:* 脚本、10 个 .claude/hooks 文件、7 个 main 分支必过的 CI 上下文,合计 225 行。每行六列:名字、类别(contract / correctness / process)、守的是什么契约、是否必过与波及面、落地以来真实抓到过几次(近 30 天 1,230 次失败的 PR 运行逐步归因,去掉门禁自己的 PR)、结论。⛔ 本 PR 不删、不停、不改任何门禁。

为什么改:您在直连通道的裁决 F(「门禁是不是用的太重了」→ 先普查、再按表退役)。这张表就是普查结果:59 行建议退役(其中 1 行 check-reference-carrier-shape#18095 已裁 E),16 行只是报告不拦合并,150 行保留(含您已裁定保留的治理队列守卫)。波及面最大的三处:check-changeset-no-major(Clause-② 等级规则,30 天红了 74 个 PR)、check-partof-closing-keyword(31 个 PR,但它只在非必过的工作流里跑)、check-system-context-census(必过、全仓,21 个 PR)。表外还有一个最大的红源:pr-automation.yml 里的内联「Require a changeset」步骤,30 天红了 107 个 PR。

风险与代价(含回滚):本 PR 只加一份文档,零运行时改动,回滚即删除该文件。真正的代价在下一步:退役清单里有 9 行是「CI 自身接线」的守卫(必过上下文名字钉、聚合器 needs 花名册、Node/pnpm 获取、self-test 接线等),按规则它们 30 天零抓获所以列为退役,但它们的价值是威慑而非抓获——表里把这 9 行单独成组,供您一次决定。抽样只有 30 天:一季度才响一次的门禁会读成零。

席位意见:(留空,席位定稿)

你要做的:读表,认可则回一个字「认可」;若对某行有异议(尤其 CI 接线 9 行组、以及 5 个会话 hook 的保留),点名该行即可,director 会把退役批次按您的意见立卡。


Generated by Claude Code

Every scripts/**/check-*.mjs and packages/*/scripts/check-*.mjs (182), every root
check:* that is not a thin alias (26), every .claude/hooks/* (12) and every
required context on main (7) on one six-column table, with the retirement list,
the report-only list and the method + limits. Real catches sampled over the last
30 days of failed PR runs (1,230 runs, 1,287 failed jobs, step-level attribution
with self-PR exclusion). No gate is removed, disabled or edited.

Claude-Session: https://claude.ai/code/session_01Wj1HUjzyeiBQ8atRf1ZhaL
Co-authored-by: Claude <noreply@anthropic.com>
origin/main moved seven commits before the PR opened; one of them removed the
client-side enqueue guard hook and its self-test, so the hook inventory is 10
and the union 225. Adds a Drift paragraph naming what moved and re-reads the
five changed scripts/pm gates from the merged tree.

Claude-Session: https://claude.ai/code/session_01Wj1HUjzyeiBQ8atRf1ZhaL
Co-authored-by: Claude <noreply@anthropic.com>

hotlong commented Sep 16, 2026

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)

总监席,session_01Wj1HUjzyeiBQ8atRf1ZhaL。席内复核 ACCEPT 记录在卡 #18472。这份不是受管面,但它是你裁决 F 的决策输入:拆除批要等你一个字,所以先挂 needs-user-decision、保持 draft,你要划的行就在这个 PR 里划。

改了什么 新增一份审计 docs/audits/gate-census-2026-09.md(400 行,只报告,一道门禁都没动):225 行清单 = 182 个 check 脚本 + 26 个非别名 check:* + 10 个 hook 文件 + 7 个必需状态检查;每行标类别(流程/契约/正确性)、守哪条契约、30 天里红了几个无关 PR(改门禁自身的 PR 排除)。结论:拆 59 / 只报告 16 / 保留 150

拆除清单压成五组,每组一个建议(拆 = 删文件、删 package.json 脚本、删 workflow 行,一批卡做;不动任何契约/正确性门禁,不动产品的 Zod 校验):

内容 席位建议
CI 自检 9 个(必需上下文名、聚合 needs: 名单、Node/pnpm 获取、if: 状态函数、自测接线、分片选择器) 保留:从不误红;守的是「门禁悄悄不跑」,正是舰队会犯的错
协议棘轮 2 个(SKILL.md 行数 812、skills 词元) 保留:防协议再长胖的带子;普查记零是方法盲区(棘轮命中 = 付地板的 PR,被「排除项」吃掉)
PM 工具的 CI 自测 8 个(label-writepost-stampedboard-snapshot、两个 sweep、changeset-deadline-censusclause2-carrierswidening-tells) 拆 CI 步骤,工具留下:席位落地时还在用;改工具的 PR 本地跑自测即可
其余流程门禁 40 个(文档 frontmatter/单 H1/导航标签/重定向、索引与计数一致性、注释掩码、拼写与标识符、closer/reaper/queue 结果核对、reference-carrier-shape(#18095 E 已裁)……) :零命中、不守任何已发布契约;每个都是特性 PR 的隐性税
只报告 16 个(咨询 workflow、--advisory、无人调用的工具) 不动;唯一例外 partof-closing-keyword:30 天红了 31 个 PR 却不拦人,建议一并

为什么改 你的裁决 F:「门禁用的太重了」。两个月里 182 个 check 脚本,168 个不满十周;上周 42% 的合并是机器在管机器。

风险与代价(含回滚) 本 PR 零风险(只加一个文档)。拆除批的风险:某道被拆的流程门禁守的东西再出错,只能靠人眼 —— 我按「不守契约、零命中」筛,这正是你要的取舍。回滚 = 恢复被删文件的一个 revert。

你要做的 一个字:「认可」(在这里 Approve,或直接对我说)= 五组按建议办。要改哪组,写组号 + 改法(例:「①拆」「④保留 docs 那几个」)。之后我落地本 PR、立拆除批卡。


Generated by Claude Code

@os-zhuang

Copy link
Copy Markdown
Contributor

门禁竟然已经开发了,拆的意义是什么?

hotlong commented Sep 16, 2026

Copy link
Copy Markdown
Contributor Author

答你 2026-09-16T16:45Z 的问题「门禁竟然已经开发了,拆的意义是什么?」—— 总监席,session_01Wj1HUjzyeiBQ8atRf1ZhaL · 2026-09-16T16:48Z

「已经开发了」不等于「不再花钱」。 我刚按文件逐个读了拆除清单上 56 个脚本文件的提交历史(REST commits?path=,全史):

读数
56 个文件落地后累计提交 455
落地后又改过 ≥3 次的文件 44 / 56
改过 ≥5 次的 36 / 56
最多的一个:check-skill-line-ratchet.mjs 87 次提交 / 35 天
其次:check-skills-token-ratchet.mjs 30 · check-clause2-carriers.mjs 29 · check-required-contexts.mjs 26 · check-ratchet-remedy-authority.mjs 21

每一次提交 = 一张 PR、一轮席位复核、一遍 CI —— 这就是一道建成的门禁的持续成本:树一变形,它就要被改一次;它守的东西越"流程",树变形得越勤,改得越勤。455 次里绝大多数不是在抓 bug,是在修门禁自己

所以拆的意义有三条,都是往后省的,不是往回省的:① 这 455 次那样的维护提交停掉;② 每张特性 PR 本地少跑几个家族、CI 少跑几十步;③ 舰队的注意力少分给「让门禁绿」。

两处按这个读数改口: 我速读里建议保留的第②组(两个协议棘轮)—— 它们是全表最贵的两个(87 + 30 次提交),而 SKILL.md 本就是受管面、每一处改动都要你亲手批,你的眼睛已经是上限,机械棘轮是重复的。改为建议一并拆。 第①组(CI 自检 9 个)里 check-required-contexts 26 次也不便宜;仍建议保留,但你划掉我不反对。

拆除批本身不花你的时间: 删的是 scripts/**.github/ 行,不是受管面;按 #18481 已经是一类自裁,席位派一轮 dev 就落,不需要你批。若你连那一轮都不想花,备选是「懒拆」:标 retire 的门禁下次要改时直接删、不修 —— 零前期成本,但那 40 多个门禁在被删前继续跑、继续收税。

请回一个字: 「拆」= 席位立拆除批(五组按速读,②改为拆)/ 「懒拆」= 不立批,下次改到再删 / 「不拆」= 普查只做记录。这份普查文档你已 Approve,与拆不拆无关,我先落地它。


Generated by Claude Code

hotlong commented Sep 16, 2026

Copy link
Copy Markdown
Contributor Author

Landing note — director seat, session_01Wj1HUjzyeiBQ8atRf1ZhaL · 2026-09-16T16:49Z

Approved by os-zhuang (review 5225584044 on head bf4d0c18, 2026-09-16T16:44Z); CI on that head 25 success · 15 skipped · 0 failed; needs-user-decision stripped 2026-09-16T16:48Z. The seat's ready_for_review + auto_merge call was refused by this session's harness classifier ([Merge Without Review], same as on #18480) — ⛔ not worked around. Approver: flip ready + enqueue (squash), as on #18476 / #18478 / #18481. Landing record follows on #18472 once MERGED.

The 「拆的意义」 answer is the comment above; the retirement batch waits on the one word there and is independent of this PR landing.


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 17, 2026 07:24
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 17, 2026
Merged via the queue into main with commit b79fae8 Sep 17, 2026
45 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-18472-gate-census branch September 17, 2026 07:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants