Skip to content

Commit c9a7455

Browse files
committed
docs(plans): Task 3 评审两条 Important 与根因入册
两条 Important 根因都在计划设计里,写入计划以免后来者照抄错误代码: 1) --write 缺规模自检(只给 check() 加过):SCAN_DIRS 失效时 --write 会 exit 0 打印 「✅ 已重写」,把 179 行的表塌成 41 行 —— 另一个入口在报平安,而 0-C2/C3 会反复 执行 --write。修法:抽共用守卫 + 逐目录断言(只坏一个目录时会刷上百条「→ 删除该行」 把人引向删棘轮)。 2) 超硬限行的 why 被常量整列替换:丢了 15 条 ≥1009 字人工理由(含 TD 编号), 而表头与 docblock 都宣称「两列由人工维护、按路径保留」。修法:常量前缀 + 追加人工 理由,且必须幂等(读回先剥前缀)。注意:那 15 条已被上一次重建丢掉,须从 git show a4cb549:... 捞回。
1 parent 1df0983 commit c9a7455

1 file changed

Lines changed: 32 additions & 0 deletions

File tree

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,38 @@ git commit -m "docs(standards): 重建行数豁免登记为快照表"
585585
586586
---
587587
588+
### Task 3 修复轮(**Task 4 的前置**,两个提交):评审的 2 条 Important
589+
590+
Task 3 评审结论 **NEEDS_FIXES**。两条 Important **根因都在本计划的设计里**,不是执行问题 —— 记在这里,以免后来者照抄上面的代码块。
591+
592+
**★ Important 1:`--write` 缺规模自检 —— 另一个入口在"报平安"。**
593+
本计划给 `check()` 加了 `measured.size === 0` 守卫(Task 2 修复轮),**但 `writeTable()` 没有**。评审者实测:把 `SCAN_DIRS` 指向不存在路径后跑 `--write` → **`exit 0`、stderr 0 字节、stdout 打印「✅ 已重写 …:>600 硬限 0 · 301–600 档 0」**,而登记表从 **179 行塌到 41 行**(138 条与全部理由清空,只剩表头与历史节)。git 可还原,但 **✅ + exit 0 掩盖了破坏** —— 而且恰在 0-C2/C3 会**反复执行 `--write`** 的窗口里。
594+
⇒ **修法**:把规模自检**抽成两个入口共用的守卫**,`writeTable()` 必须在 `writeFileSync` **之前** `exit 1`;并**逐目录断言**(存在 + 至少贡献 1 个文件)——否则只坏一个目录时仍会刷出上百条「`(b)` 冻结名单里的文件已不存在 → 从 `FROZEN_OVER_LIMIT` 删除该行」「`(d)` … → 删除该行」,**把人引向删棘轮/删条目**(与已修的 Minor 2 同类误导)。
595+
596+
**★ Important 2:超硬限行的「豁免理由」人工文字被常量整列丢弃。**
597+
本计划把超硬限行写成 `row(p, n, \`超硬限(>N 行),不允许豁免\`, reasons.get(p)?.split)` —— **只保留了 `split`,把 `why` 换成常量**。于是旧表那 15 条理由(**≥1009 字**,含 `TD-2026-09-09-D` / `TD-2026-08-30-A` / `TD-2026-09-09-A` 编号、「超限为预存债务」、`lib.rs` 的「拆分会破坏注册可读性」等)在新表里**出现 0 次**;而**表头与脚本 docblock 都宣称「两列由人工维护,生成器按路径保留」** —— 自述与行为不符,且下次 `--write` 会继续吞掉按表头指引写进该列的理由。
598+
⇒ **修法**:保留常量前缀**并追加**人工理由,且**必须幂等**(读回时先剥掉生成器自己加的前缀,否则每次 `--write` 会层层叠加):
599+
600+
```js
601+
const OVER_PREFIX = `超硬限(>${HARD_LIMIT} 行),不允许豁免`;
602+
/** 幂等:先剥掉生成器自己加的前缀,否则每次 --write 都会叠加一层 */
603+
const stripOverPrefix = (t) =>
604+
t.startsWith(OVER_PREFIX) ? t.slice(OVER_PREFIX.length).replace(/^\s*——\s*/, '').trim() : t.trim();
605+
const overWhy = (p) => {
606+
const human = stripOverPrefix(reasons.get(p)?.why ?? '');
607+
return human ? `${OVER_PREFIX} —— ${human}` : OVER_PREFIX;
608+
};
609+
```
610+
611+
⚠️ **光改代码 + 重跑 `--write` 恢复不了那 15 条** —— 它们**已被上一次重建丢掉**,必须先从 git 旧版捞回:`git show a4cb549d:docs/standards/line-limit-exemptions.md`,按路径取出原文写回,再跑 `--write` 验证「跑一次后仍在」且「第二次运行 SHA256 不变」。
612+
613+
**本修复轮的验收**:① `SCAN_DIRS` 全失效 → 两个入口**都** `exit=1` 且**登记表字节不变**(SHA256 对照);② `SCAN_DIRS` 部分失效(只留 `app/src`)→ `exit=1` 且报「扫描目录不存在」,**不再**刷 (b)/(d) 的"→ 删除该行";③ 15 条人工理由**全部捞回**(旧/新字数对照,证明零丢失);④ 连跑两次 `--write` **SHA256 相同**(前缀不叠加);⑤ 默认与 `--full` 仍 `exit=0`、`138` 条。
614+
**提交**:`fix(scripts): write 入口补规模守卫并保留超硬限人工理由` + `docs(standards): 恢复 15 条超硬限人工理由并重生成`。
615+
616+
**遗留 Nit(不处理)**:迁入历史节的 3 条散注里只有 121 是逐字,117/119 被**改写**(原文内容保住并补上复核结论)—— 与计划「逐字迁入」的字面不符,但**结果更好**(补了复核数字),不影响合并。
617+
618+
---
619+
588620
### Task 4: 接线(本地提交门禁 + CI)
589621

590622
**Files:**

0 commit comments

Comments
 (0)