Skip to content

Commit a41b17f

Browse files
committed
docs(plans): Task 2 评审两条 Minor 定为 Task 3 前置
评审 APPROVE 无 Important,但两条 Minor 必须在 Task 4 接线前修掉: Minor 1(有未来触发条件):(c)/(d) 依赖 measured/rows 非空,而 (a)/(b) 只依赖 FROZEN_OVER_LIMIT。实测双失效时问题数从 47 塌缩到 15(仍红);但一旦冻结名单被清空 (0-C2/C3 拆完的目标状态),同样的双失效会给出 exit 0 绿灯 —— 工具坏了却报平安。 修法:check() 开头加 measured.size === 0 的规模自检。 Minor 2:扫描根失效时报 117 条「(d) 条目指向不存在的文件」,把「内容树没扫到」 说成「登记行该删」,会误导人去删行。修法:显式判定登记表是否存在并给专用提示。 Nit(writeFileSync 未用)由 Task 3 的写分支自然消解,不单独处理。
1 parent 5b39771 commit a41b17f

1 file changed

Lines changed: 51 additions & 0 deletions

File tree

‎docs/superpowers/plans/2026-09-11-frontend-redesign-batch0c1-line-limit-governance.md‎

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,57 @@ git commit -m "feat(scripts): 行数红线测量与棘轮校验工具"
356356
357357
---
358358
359+
### Task 2 修复轮(**Task 3 的前置**,单独提交):两条 Minor
360+
361+
Task 2 评审结论 **APPROVE**(无 Important),但给出两条 Minor。**它们必须在 Task 4 接线之前修掉** —— 否则将来会变成静默通过路径。
362+
363+
**Minor 1(真问题,有明确的未来触发条件)**:`check()` 的 `(c)`/`(d)` 全部依赖 `measured` / `rows` 非空,而 `(a)`/`(b)` 只依赖 `FROZEN_OVER_LIMIT` 非空。评审者实测三种失效组合:
364+
365+
| 失效组合 | 问题数 | exit |
366+
|---|---|---|
367+
| 扫描域(`SCAN_DIRS`)不存在 | 132(15 个 `b` + 117 个 `d`) | 1 |
368+
| 登记表不存在 | 138(全走 `c`) | 1 |
369+
| **两者同时失效** | **15(只剩 `b`)** | 1 |
370+
371+
⇒ 问题数从 47 塌缩到 15 时**仍是红的**,**但一旦 `FROZEN_OVER_LIMIT` 被清空(正是 0-C2/0-C3 拆完后的目标状态),同样的双失效会给出 `exit 0` 绿灯** —— "工具坏了却报平安",而且恰好发生在没人再盯它的时候。
372+
373+
**修法**:在 `check()` **最开头**(`scanTree()` 之后、任何不变式之前)加规模自检:
374+
375+
```js
376+
// 规模自检:没有它,扫描域失效会让 (a)/(c) 静默通过、(d) 反把 117 条登记行报成"指向不存在的文件"。
377+
// 更危险的是未来:FROZEN_OVER_LIMIT 被清空(0-C2/C3 拆完后)时,双失效会给出 exit 0 绿灯。
378+
if (measured.size === 0) {
379+
console.error(
380+
`❌ line-limits:扫描域为空 —— ${SCAN_DIRS.join(' / ')} 下没有匹配 ${SOURCE_EXT} 的文件。\n` +
381+
` 这几乎总是路径写错或工作目录不对,**不是"没有超限文件"**。`,
382+
);
383+
process.exit(1);
384+
}
385+
```
386+
387+
**Minor 2(诊断误导)**:扫描根失效时日志报 117 条「`(d)` 条目指向不存在的文件」——把真实原因(内容树没扫到)说成"登记行该删",**会把人引向删行**;登记表缺失时则逐条报「未登记」,却不提示"登记表不存在"。
388+
389+
**修法**:在 `parseTable()` 之前显式判定登记表是否存在,并给专用提示:
390+
391+
```js
392+
const tableAbs = join(ROOT, TABLE_PATH);
393+
if (!existsSync(tableAbs)) {
394+
console.error(`❌ line-limits:登记表不存在 —— ${TABLE_PATH}。先运行 --write 生成,或检查路径。`);
395+
process.exit(1);
396+
}
397+
```
398+
399+
(扫描根缺失由 Minor 1 覆盖;两者合起来就不再产生那 117 条误导性的 `(d)`。)
400+
401+
**Nit(不单独处理)**:`writeFileSync` 目前 import 未用、docblock 已宣称 `--write` —— **Task 3 Step 1 加上写分支后自然消解**。(这是计划 Step 1 逐字如此,非实施者擅自增删。)
402+
403+
**本修复轮的验收**:
404+
1. 默认校验**行为不变**:仍报 **47** 处、`exit=1`
405+
2. 三条失效组合各自给出**专用提示**(依次把 `SCAN_DIRS` 指向不存在路径、把 `TABLE_PATH` 指向不存在文件、两者同时;**每次都要用 `Copy-Item` 备份还原**,验完 `git diff --stat` 为空)
406+
3. **单独提交**:`fix(scripts): 校验器补规模自检与失效诊断` —— **不要**与 Task 3 的重建混在一个提交里
407+
408+
---
409+
359410
### Task 3: 重建登记表(把历史日志变成快照登记)
360411
361412
**Files:**

0 commit comments

Comments
 (0)