Skip to content

chore(module-size): 抬 tree 行时漏改树下那条 file 行 —— 加一条交叉判据,让「登记做了一半」当场红并点名第几行 (#1435) - #1438

Merged
jinjunnn merged 1 commit into
alphafrom
feat/1435-ratchet-cross-check
Sep 24, 2026
Merged

jinjunnn merged 1 commit into
alphafrom
feat/1435-ratchet-cross-check

Conversation

@jinjunnn

@jinjunnn jinjunnn commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

体积检查最近在主干上自己超标了,查下来不是有人偷偷加代码,而是一次登记做了一半:三个月前那次改动把「总量」那一行的基线抬了、理由里还逐字写了某某文件的增量,却没改那个文件自己那一行。#1430 补完了那半边,但今天没有任何东西会发现下一次同样的漏 —— 所以它会再犯。

本 PR 加一条交叉判据:抬高「总量」那一行的时候,如果这次增量里有哪个被单独盯着的文件也变长了、而它那一行没跟着改,就当场红并点名是第几行。

① 判据(主要工作)

落点:scripts/assert-module-size.sh,判官测试只判它的行为。理由:

  • 这条判据要问的是「这一次有没有抬高某个 tree 行」—— 那是 push 时相对 origin/alpha 的分支事实。脚本已经持有 BASELINE_REF、已经逐行解析登记簿、已经量出每一行的实测值与它在 TSV 里的真行号;
  • 判官测试(packages/ui-mac/src/main/module-size-ratchet.test.ts)的夹具正好能造出「tree 抬了 / file 行没跟着改」这个状态,并把脚本本体复制进去跑 —— 它的角色是判脚本,不是自己变成第二个供数方;
  • 把判据写进测试,等于让 push 时真正跑的那道门继续瞎着。

判据:把本次登记簿与 origin/alpha 上那一份比 —— 某个 tree 行的基线被抬高了 ⇒ 那棵树下每个「实测已超自己基线、而自己那一行的基线一个字没动」的 file 行,逐条点名(第几行 + 路径 + 实测/基线/差值 + 本次抬的是第几行)并 exit 1。

为什么是 1 不是 2:半份登记不是「量到了、结果不好看」(那是 2 档),是登记簿在骗人,与「点名的路径不存在」同一族。它结构上到不了「主干恒红」:合并之后本次的登记簿 diff 归零,这一条自动闭嘴 —— 能红的只有正在改登记簿的那条分支,而那正是唯一能修它的人。取不到基准上的登记簿时明说「本次没比对」,不静默当绿。

② 订正错数字

tsv 里 tree 行 #1381 那段的「启停投影(+13)」→ +14(#1430 逐 commit 量过:329847979 = 3525 → ad3864206 = 3539)。file 行里引用那句原文的地方同时注明「原文那个数本身也错了」,否则改完两行互相矛盾、而被引的原句在文件里 grep 不到。

三行基线一个没动:diff <(git show origin/alpha:…tsv | awk 取前三列) <(工作树同上) 为空。

AC 证据(真仓 + 夹具,成对;都在最终这棵树上跑的)

AC3(现状) —— 三行全 = 基线、exit 0:

        ✓ packages/ui-mac/src/main/ext-install-planner.ts 3539 行(= 基线)
        ✓ packages/ui-mac/src/main/ext-transaction.ts 2825 行(= 基线)
        ✓ packages/ui-mac/src/main 59762 行(= 基线)
exit=0

AC1(真仓) —— 人为把 tree 行 59762 → 59769,并给 ext-install-planner.ts 加 7 行而不改它那一行:

    · ① 棘轮(scripts/module-size-ratchet.tsv,只许降不许升):
        ⚠ 超基线:packages/ui-mac/src/main/ext-install-planner.ts 实测 3546 行 > 基线 3539(+7)
        ✓ packages/ui-mac/src/main/ext-transaction.ts 2825 行(= 基线)
        ✓ packages/ui-mac/src/main 59769 行(= 基线)
    ✗ 登记只做了一半(#1435)—— 本次抬高了 tree 行,而树下被单独登记的那一行没跟着改:
        ✗ 第 27 行(packages/ui-mac/src/main/ext-install-planner.ts):实测 3546 行 > 这一行的基线 3539(+7),而这一行的基线一个字没动
          本次抬高的是第 29 行(packages/ui-mac/src/main:59762 → 59769)—— 把它撑大的那些行,至少有 7 行长在上面这个文件里
      → 在**同一个 PR、同一只手**里把上面点名的那一行也改成实测值(基线只能靠人手写的 diff 抬高,评审看得见)。
exit=1

点名的第 27 / 29 行是 TSV 的真行号(sed -n '27p' 直接对得上)。

AC2(真仓) —— 同一次把 file 行也改成 3546:三行全 = 基线、exit=0;还原后仍 exit=0。

判官夹具:AC1 反向用例(exit 1 + 逐字断到「第 2 行(…pinned-a.ts)」与「第 4 行(…/main:12 → 15)」)、AC2 控制组(同一次改了那一行 ⇒ 绿),外加两个控制组:抬 tree 行本身不许红(撑大它的行长在别的文件上)、取不到基准 ⇒ 明说没比对。

变异实测(逐个改生产脚本再还原 —— 先证明这几条测得出已知的坏):

变异 结果
点名了但去掉 exit 1 #1435 AC1 红(16 pass / 1 fail)
去掉「只在抬高时问」 既有的 ②③ 两条反向/控制组红(15 pass / 2 fail)—— 证明它不会在没抬 tree 的分支上乱响
去掉「没比对」那句 ⑰ 红(16 pass / 1 fail)
还原 17 pass / 0 fail

真实世界的两个真阴性(这条判据不会拦住合法的抬基线):最近两次真的抬了 tree 行的合并 —— #1436(59075 → 59117)与 #1426(59117 → 59762)—— 在 origin/alpha 上两个 file 行都仍恰好等于基线,登记是做完整的 ⇒ 这条判据对它们会保持沉默。

登记

  • scripts/gate-files.tsv 那一行的精确条数 13 → 17,并逐条写清新增四条守什么(闸门本身跑过:bun exit=0 · 实际通过 17 条 · 登记精确条数 17);
  • docs/runbooks/ci.md 第 [14/14] 行补上这条判据与 exit 1 的新成因;
  • scripts/alpha-check.sh 消费 exit 1 的那句总结补上新成因 —— 不补的话总结行会把这种红说成「路径不存在或行格式非法」。

本地门(真实输出)

pre-push 钩子跑的完整 alpha-check(没有 --no-verify)⇒ PUSH_RC=0:

  • [4/14] typecheck ✓
  • [5/14] ui-mac 全量 5362 pass / 0 fail;base(f2fe21b91,同一棵树、同样补齐 electron/{dist,path.txt} 与本树现编的 alpha_fence.node)= 5358 pass / 0 fail ⇒ 差 = +4,正是本 PR 新增的四条,零新红
  • [6/14] assert gate files ✓ 225 个闸门文件条数与登记精确一致
  • [8/14] docs gate ✓ 21 relative link(s) / 1 file
  • [14/14] ✓ 三行全 = 基线

总结行是 ⚠️ local gates passed, but 有一步这次没验成 —— 那是 [9/14](registry)/[10/14]/[11/14]/[13/14] 的网络降级档,与本改动无关,在 base 上同样如此。

合并须知:tsv 那一行会跟 alpha 冲突

本分支已两次 rebase(#1436 与 #1426 各抬过一次 tree 行基线)。只要 alpha 再抬一次那一行就会再冲突一次,解法是机械的:基线与别人的理由一律取 alpha 那一份,只把本票唯一的改动(#1381 段的 +13 → +14)重放上去;解完核对一句 diff <(git show origin/alpha:…tsv | awk 取前三列) <(工作树同上) 必须为空。截至最后一次 push,git merge-tree --write-tree origin/alpha HEAD 无冲突。

本票范围内主动没做的事

  • 不开 ext-install-planner.ts 的拆分票(#1435 已判:唯一能独立的 6 行挪走后本文件仍 3533 > 3525,而 tree 行一点不降 —— 正是要挡的「把行搬进新文件」式绕过);
  • 「抬了但抬不够」不在本条里升级(如 3525 → 3530 而实测 3539):那是另一种漏,该行确实被人动过,继续由 ① 的超基线告警(exit 2)点名。本条的措辞是「没跟着改」,判据得对得上措辞;
  • 没有 --update、没有任何运行时写回;没有重构棘轮脚本;没有抬任何基线。

Fixes #1435

🤖 Generated with Claude Code

…第几行 (#1435)

缺陷本体(实测链条,来自 `#1430` 的修复过程):`#1381` / PR `#1409` @ad3864206 把
tree 行从 57,542 抬到 59,055,理由列里**逐字写着**「ext-install-planner.ts 的启停投影」,
却**没改那个文件自己那一行**(仍 3525,实测已 3539)⇒ 主干自身超基线三个月,每条从
alpha 开出的分支都背一条不属于自己的 ⚠。`#1430` 补完了那半边登记,但**没有任何东西**
会发现下一次同样的漏 —— 抬 tree 行的时候,没人会被问一句「你抬的这些行,是不是也长在
某个被单独盯着的文件上」。

① 交叉判据落在 scripts/assert-module-size.sh(判官测试只判脚本的行为,不该自己变成
第二个供数方)。理由:这条判据要问的是「**这一次**有没有抬高某个 tree 行」,那是
push 时相对 origin/alpha 的分支事实;脚本已经持有 BASELINE_REF、已经逐行解析登记簿、
已经量出每行的实测值,而判官测试的夹具正好能造出「tree 抬了 / file 行没跟着改」这个
状态并复制脚本本体进去跑。把判据写进测试则等于让 push 时真正跑的那道门继续瞎着。

判据:把本次登记簿与 origin/alpha 上那一份比 —— 某个 tree 行的基线被**抬高**了 ⇒ 那棵树
下每个「实测已超自己基线、而自己那一行的基线一个字没动」的 file 行,逐条点名(第几行 +
路径 + 实测/基线/差值 + 本次抬的是第几行)并 exit 1。

为什么是 1 不是 2:半份登记不是「量到了、结果不好看」(那是 2 档),是**登记簿在骗人**,
与「点名的路径不存在」同一族。它结构上到不了「主干恒红」:合并之后登记簿 diff 归零,
这一条自动闭嘴 —— 能红的只有正在改登记簿的那条分支,而那正是唯一能修它的人。
取不到基准上的登记簿时**明说「本次没比对」**,不静默当绿(与 ⑪ 同一条纪律)。

② 顺带订正 tsv 里 `#1381` 那段理由的错数字:「启停投影(+13)」→ +14
(`#1430` 逐 commit 量过:329847979 = 3525 → ad38642 = 3539)。file 行里**引用**那句
原文的地方同时注明「原文那个数本身也错了」,否则两行互相矛盾。三行基线一个没动
(与 origin/alpha 逐字节比过)。

证据:
- 真仓 AC1:人为把 tree 行 59075 → 59085 并给 ext-install-planner.ts 加 10 行而不改它那行
  ⇒ exit 1,点名「第 27 行(...ext-install-planner.ts):实测 3549 > 基线 3539(+10)」
  与「本次抬高的是第 29 行(packages/ui-mac/src/main:59075 → 59085)」;
- 真仓 AC2:同一次把 file 行也改成 3549 ⇒ exit 0,三行全 = 基线;还原后仍 exit 0;
- 判官夹具 AC1/AC2 + 两个控制组(抬 tree 但树下 file 行都在基线内 ⇒ 绿;取不到基准 ⇒ 明说没比对);
- 变异实测(改生产脚本再还原):去掉 exit 1 ⇒ AC1 红;去掉「只在抬高时问」⇒ 既有的
  ②③ 两条反向/控制组红(证明它不会在没抬 tree 的分支上乱响);去掉「没比对」那句 ⇒ ⑰ 红。

登记:gate-files.tsv 那一行的**精确条数** 13 → 17 并逐条写清新增四条守什么;
docs/runbooks/ci.md 第 [14/14] 行补上这条判据与 exit 1 的新成因;
alpha-check.sh 消费 exit 1 的那句话补上新成因(否则总结行在骗人)。

Fixes #1435

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jinjunnn
jinjunnn force-pushed the feat/1435-ratchet-cross-check branch from 2f51a21 to 772ee7e Compare September 24, 2026 04:01
@jinjunnn
jinjunnn merged commit b8d56bf into alpha Sep 24, 2026
5 of 6 checks passed
jinjunnn pushed a commit that referenced this pull request Sep 24, 2026
`scripts/assert-module-size.sh` 量出本票让 packages/ui-mac/src/main 非测试源码 +41 行
(全部是说明注释;先把两处注释收紧过一轮,+53 → +41)。基线只能靠人手 diff 抬高,评审看得见。

起点 = 干净 origin/alpha@b8d56bf15 实测 59762,零遗留 ⇒ 这 41 行全部是本票的。
树下两条 file 行(ext-install-planner.ts / ext-transaction.ts)本票一行未动、实测均 = 基线,
所以按 `#1438` 新加的交叉判据只抬 tree 这一行(该判据自己的闸 17 pass / 0 fail)。

Refs #1414

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jinjunnn pushed a commit that referenced this pull request Sep 24, 2026
由编排者代解冲突(owner 2026-09-24 授权先合本 session、再帮另一 session 合)。
两处冲突:
- CHANGELOG.md:两条都是新增条目,都保留。
- scripts/module-size-ratchet.tsv 的 tree 行:基线与此前全部理由取 alpha 那侧
  (59,762,含 #1436 / #1426 两次抬高),本票增量按合并后实测重算 = 59,813(+51)。
  分支上原写的 59,126 是按旧基数算的,直接取会让门红。

合并后 assert-module-size 三行全 = 基线,且 #1438 新加的「半份登记」交叉判据未告警。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jinjunnn pushed a commit that referenced this pull request Sep 24, 2026
`scripts/assert-module-size.sh` 量出本票让 packages/ui-mac/src/main 非测试源码 +41 行
(全部是说明注释;先把两处注释收紧过一轮,+53 → +41)。基线只能靠人手 diff 抬高,评审看得见。

起点 = 干净 origin/alpha@78e751461 实测 59813,零遗留 ⇒ 这 41 行全部是本票的。基线与别人的
理由整份取 alpha 那一份,只重放本票这一段。树下两条 file 行(ext-install-planner.ts /
ext-transaction.ts)本票一行未动、实测均 = 基线,所以按 `#1438` 新加的交叉判据只抬 tree 这一行
(该判据自己的闸 17 pass / 0 fail)。

Refs #1414

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jinjunnn added a commit that referenced this pull request Sep 24, 2026
* feat(#1431): 让系统提示里的「能搜网」消费真闸的判决,而不是自己再判一遍

模型开场时被告知「你有搜网这个能力」,而它手里到底有没有这个工具是另一套逻辑决定的。
`#1414` 勘破 §6 测出全仓有四处在判「能不能搜网」,其中 `buildAlphaCapabilities` 把结论
**直接写进系统提示**,而它读的是 `ALPHA_WEBSEARCH_DISABLE` + `OPENCODE_ENABLE_EXA`,
与真闸(`applyWebSearchDenies` 的 deny 判决 + 云 MCP 定义的形状)**不同源** —— 于是可以
「提示说有、工具表里其实没有」,模型要么去调一个不存在的工具,要么凭印象编答案。

- `alpha-identity.ts`:`buildAlphaCapabilities` 的入参从「env 派生的三个布尔」换成
  「两条腿各自的**工具表在场性**」。它不再自己判,只把在场性折成提示事实;本模块必须保持
  零 import(ext 的登记簿直接 import 它),所以判据只能住在调用点。
- `alpha-config-injection.ts`:调用点改成**消费真闸自己的判决** —— 拿一个空壳 config 让
  `applyWebSearchDenies` 用同一组入参判一次再读判决,不手抄它的条件。云腿在场性读新增的
  `cloudMcpEnabled`(与写 `config.mcp` 那个三分支同一组输入)。顺带把同一函数里 26 行外
  重算一遍的 `Boolean(process.env.ALPHA_WEBSEARCH_DISABLE)` 换成已有的 `killSwitch` 常量。
- 新增四格闸门 `websearch-prompt-tool-parity.test.ts`(基线 §三 S4 / ADR-046 不变量的执行者),
  登记进 `scripts/gate-files.tsv`(精确条数 10)。四格 = 登出/BYOK · 登录有额度 · 登录无额度 ·
  kill-switch;keyless flag 当自由变量跑两遍,所以本闸对 `#1411` 前后两种 base 都成立。
  代付态那一格按 ADR-046 的目标态钉死(`#1411`/PR `#1442` 已合:代付一个 local deny 都不产生
  ⇒ 两条腿同时在模型工具表里);撤掉 `#1411` 的变异实测让这一格当场两臂全红。

`caps.websearch` 的取值与改动前逐格相同(`!kill && (keyless || platformPays)`,可代数化简
验证),所以这是一次同源化重构,不改任何账户态下的用户可见行为。

Refs #1414

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* chore(#1431): 按棘轮指示人手抬 tree 基线到实测值(59813 → 59854)

`scripts/assert-module-size.sh` 量出本票让 packages/ui-mac/src/main 非测试源码 +41 行
(全部是说明注释;先把两处注释收紧过一轮,+53 → +41)。基线只能靠人手 diff 抬高,评审看得见。

起点 = 干净 origin/alpha@78e751461 实测 59813,零遗留 ⇒ 这 41 行全部是本票的。基线与别人的
理由整份取 alpha 那一份,只重放本票这一段。树下两条 file 行(ext-install-planner.ts /
ext-transaction.ts)本票一行未动、实测均 = 基线,所以按 `#1438` 新加的交叉判据只抬 tree 这一行
(该判据自己的闸 17 pass / 0 fail)。

Refs #1414

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: jinjunnn <slmbaovanetti99@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

体积检查发现不了「登记做了一半」—— 同一个漏已经犯过一次,还会再犯

1 participant