Skip to content

Commit 8b0ea49

Browse files
committed
fix(docs): 口径数字按全量实测更正为 56
Task 1 评审的 Important:我写的「Get-Content 少算最多 45 行」与实测不符 —— 45 只是前端子集的最大值;评审者全量实测 868 个文件的真实最大值是 56 (live_session_pause.rs 353->297)。这不是量级笔误而是判定风险:按「<=45」 推断,读数 297 会让人以为真值 <=342,而真值 353 已越 300 红线却被读成达标。 一并修掉评审的 3 条 Minor/Nit: - 计划里残留的「ReadAllLines / 字节 0x0A」双重判据(其中一处会被 Task 5 写进 v0.22) - v0.22「陷阱 1」的 45 与双重判据 - 计划 Task 1 Step 4 的 Expected「命中 3 行」实为 4 行 - refactoring.md 补回被顺带删掉的「待专项重构」承诺(0-C2/0-C3)
1 parent 189f9a5 commit 8b0ea49

4 files changed

Lines changed: 9 additions & 8 deletions

File tree

‎AGENTS.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939

4040
1. **模块化**:单文件 ≤300 行(>600 行必须硬拆;300-600 行登记豁免清单);纯逻辑与副作用物理分离;显式依赖注入。
4141
**行数口径(唯一有效)**:文件**全部行数**(含空行),以 `[System.IO.File]::ReadAllLines(path, UTF8).Count` 为准 —— 即 `scripts/line-limits.mjs` 的 `countLines()`。
42-
⚠️ **不要用**:`Get-Content`(本机 PowerShell 5.1 + 码页 `gb2312` 会按 GBK 解码、吞换行、**少算最多 45 行**)· `Measure-Object -Line`(**只数非空行**)· **字节 `0x0A` 计数**(对**末尾不带换行**的文件会少算 1;本仓实测有 8 个这样的源文件,含 `NotesPage.tsx`)。
42+
⚠️ **不要用**:`Get-Content`(本机 PowerShell 5.1 + 码页 `gb2312` 会按 GBK 解码、吞换行、**少算可达 56 行** —— 实测最大 `live_session_pause.rs` 353→297,**足以把越 300 红线的文件读成达标**)· `Measure-Object -Line`(**只数非空行**)· **字节 `0x0A` 计数**(对**末尾不带换行**的文件会少算 1;本仓实测有 8 个这样的源文件,含 `NotesPage.tsx`)。
4343
判定一律以 `node scripts/line-limits.mjs` 为准。
4444
2. **强类型契约**:业务术语贯穿全栈;禁止 `any`/无类型;入参出参必须定义类型(TS interface / Rust struct)。
4545
3. **上下文注释**:注释解释 Why 不解释 What;公共函数/模块必须含 `@ai-context` 业务背景注释;标注副作用与边界条件;Magic Number/Hack 必须说明原因。

‎docs/standards/refactoring.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,6 @@
159159

160160
本文档的通用重构手法在本项目受以下硬性约束(详见 [ai-coding.md](./ai-coding.md) 第二部分):
161161

162-
- **§1 单文件 ≤300 行**:"过大类/文件"坏味道在本项目有明确阈值——>600 行必须硬拆;300-600 行登记豁免清单。行数口径见 AGENTS.md §3.1(全部行数,以 `node scripts/line-limits.mjs` 为准)
162+
- **§1 单文件 ≤300 行**:"过大类/文件"坏味道在本项目有明确阈值——>600 行必须硬拆;300-600 行登记豁免清单**待专项重构**(该项已排为批 0 的 `0-C2` 前端 5 个 / `0-C3` Rust 10 个拆分)。行数口径见 AGENTS.md §3.1(全部行数,以 `node scripts/line-limits.mjs` 为准)
163163
- **§6 自底向上重构顺序**:拆分遵循 原子层(纯函数/类型)→ 业务层(hook/service)→ 系统层(页面/装配);公共 API 保持零改动(兼容 re-export)
164164
- **已验证拆分模式**:React 页面 → 纯展示组件 + 域 hook + 组合层;Python 巨型模块 → 包化 + Mixin + schemas 提取;Go 巨型 handler → 同包多文件职责拆分

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
## Global Constraints
1414

1515
- **本次范围仅「口径 + 登记表 + 守卫」**:`0-C1` **不拆任何文件**。15 个 >600 文件的拆分是 `0-C2`(前端 5 个)与 `0-C3`(Rust 10 个)两份独立计划,本计划交付的是它们的**测量仪器与验收依据**。
16-
- **测量口径(唯一有效)**:行数 = 文件**全部行数**(含空行),以 `[System.IO.File]::ReadAllLines(path, UTF8).Count` 为准(即 `scripts/line-limits.mjs` 的 `countLines()`)。**不要用** `Get-Content`(本机 PowerShell 5.1 + 码页 `gb2312` 会按 GBK 解码、吞掉换行、最多少算 45 行/文件)· `Measure-Object -Line`(只数非空行)· **字节 `0x0A` 计数**(对末尾不带换行的文件会**少算 1**;本仓实测有 8 个这样的源文件,含 `NotesPage.tsx` 602/601)。
16+
- **测量口径(唯一有效)**:行数 = 文件**全部行数**(含空行),以 `[System.IO.File]::ReadAllLines(path, UTF8).Count` 为准(即 `scripts/line-limits.mjs` 的 `countLines()`)。**不要用** `Get-Content`(本机 PowerShell 5.1 + 码页 `gb2312` 会按 GBK 解码、吞掉换行、**少算可达 56 行**/文件 —— 实测最大 `live_session_pause.rs` 353→297)· `Measure-Object -Line`(只数非空行)· **字节 `0x0A` 计数**(对末尾不带换行的文件会**少算 1**;本仓实测有 8 个这样的源文件,含 `NotesPage.tsx` 602/601)。
1717
- **硬限范围为实测 15 个**(用户 2026-09-11 裁决):前端 5 个 + Rust 10 个。规格原文的「4 个」只扫了前端且漏掉 `SessionListPanel.tsx`,本计划一并更正。
1818
- 单文件 ≤300 行(AGENTS.md §3)—— **本计划新增的脚本自身也必须满足**;若 `line-limits.mjs` 超过 300 行,必须拆分而不是登记。
1919
- 零新增依赖(`package.json` 的 `dependencies`/`devDependencies` 不得变化)。
@@ -84,7 +84,7 @@
8484
```
8585
1. **模块化**:单文件 ≤300 行(>600 行必须硬拆;300-600 行登记豁免清单);纯逻辑与副作用物理分离;显式依赖注入。
8686
**行数口径(唯一有效)**:文件**全部行数**(含空行),以 `[System.IO.File]::ReadAllLines(path, UTF8).Count` 为准 —— 即 `scripts/line-limits.mjs` 的 `countLines()`。
87-
⚠️ **不要用**:`Get-Content`(本机 PowerShell 5.1 + 码页 `gb2312` 会按 GBK 解码、吞换行、**少算最多 45 行**)· `Measure-Object -Line`(**只数非空行**)· **字节 `0x0A` 计数**(对**末尾不带换行**的文件会少算 1;本仓实测有 8 个这样的源文件,含 `NotesPage.tsx`)。
87+
⚠️ **不要用**:`Get-Content`(本机 PowerShell 5.1 + 码页 `gb2312` 会按 GBK 解码、吞换行、**少算可达 56 行**)· `Measure-Object -Line`(**只数非空行**)· **字节 `0x0A` 计数**(对**末尾不带换行**的文件会少算 1;本仓实测有 8 个这样的源文件,含 `NotesPage.tsx`)。
8888
判定一律以 `node scripts/line-limits.mjs` 为准。
8989
```
9090

@@ -117,7 +117,8 @@ Run(仓库根):
117117
Select-String -Path AGENTS.md,docs/standards/refactoring.md -Pattern 'line-limits.mjs'
118118
node scripts/docs-check.mjs
119119
```
120-
Expected: 命中 3 行(AGENTS.md 两处 + refactoring.md 一处);`docs-check` ✅
120+
Expected: 命中 **4** 行(`AGENTS.md:41` 与 `:43` 同一节两处 + `AGENTS.md` §11 一处 + `refactoring.md:162`);`docs-check` ✅
121+
(⚠️ 计划初稿写「3 行」是**我的计数错**:§3.1 的口径块里 `line-limits.mjs` 出现两次。**不要为了对齐这个 Expected 去删掉任一处** —— 两处各有作用:一处指出权威实现,一处规定判定动作。)
121122

122123
- [ ] **Step 5: 提交**
123124

@@ -601,7 +602,7 @@ git commit -m "ci: 行数红线接入提交门禁与 CI"
601602
**把注记改写为已裁决的状态**:
602603
```
603604
1. **15 个 >600 行文件 → 0**(实测值:前端 5 + Rust 10;规格原文的「4 个」只扫了前端且漏掉 `SessionListPanel.tsx`);>300 行 **100% 在豁免表内且数值与实测一致**。
604-
> **2026-09-11 用户裁决**:范围取实测 15 个;口径取「全部行数」(`ReadAllLines` / 字节 `0x0A`),**禁用 `Get-Content` 与 `Measure-Object -Line`**。
605+
> **2026-09-11 用户裁决**:范围取实测 15 个;口径取「全部行数」,**以 `[System.IO.File]::ReadAllLines(path, UTF8).Count` 为准**(即 `scripts/line-limits.mjs`),**禁用 `Get-Content`(少算可达 56 行)· `Measure-Object -Line`(只数非空行)· 字节 `0x0A` 计数(末尾无换行时少算 1)**。
605606
> 执行机制:`node scripts/line-limits.mjs`(本地提交门禁 + CI `--full` 守数值),>600 用**棘轮**只减不增 —— 拆分由 0-C2(前端 5)/ 0-C3(Rust 10)推进,每拆完一个从 `FROZEN_OVER_LIMIT` 删一行。
606607
```
607608

‎docs/versions/v0.22.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@
111111

112112
**陷阱 1 · 行数 —— `Get-Content` 会少算**
113113

114-
本机 harness 的 `pwsh` 实为 **Windows PowerShell 5.1**(ANSI 码页 `gb2312`),`Get-Content` 会按 GBK 解码 UTF-8 文件并**吞掉换行、把行数少算**(实测:`index.ts` 19→12、`paths.test.ts` 130→112、`NoteListView.tsx` 654→609,最多少 **45** 行)。
115-
⇒ **AGENTS.md §3 的「≤300 / >600」必须以字节 `0x0A` 或 `[System.IO.File]::ReadAllLines(path, UTF8)` 计量,禁用 `Get-Content` 数行。** 该失真已造成一次真实险情(据此误判 `IconName` 未导出)。
114+
本机 harness 的 `pwsh` 实为 **Windows PowerShell 5.1**(ANSI 码页 `gb2312`),`Get-Content` 会按 GBK 解码 UTF-8 文件并**吞掉换行、把行数少算**(实测:`index.ts` 19→12、`paths.test.ts` 130→112、`NoteListView.tsx` 654→609;**全量 868 文件实测最大少算 56 行**:`live_session_pause.rs` 353→297 —— **足以把越 300 红线的文件读成达标**)。
115+
⇒ **AGENTS.md §3 的「≤300 / >600」以 `[System.IO.File]::ReadAllLines(path, UTF8).Count` 为唯一口径**(即 `node scripts/line-limits.mjs`);禁用 `Get-Content`、`Measure-Object -Line`(只数非空行)与**字节 `0x0A` 计数**(对末尾无换行的文件会少算 1,本仓实测 8 个这样的源文件)。该失真已造成一次真实险情(据此误判 `IconName` 未导出)。
116116
治理侧(口径未定义、15 个 >600 硬限违规、豁免表数值过期)见 [tech-debt/review-2026-09-11.md](../tech-debt/review-2026-09-11.md);工具侧见批 0-B 台账。
117117

118118
**陷阱 2 · 退出码 —— `2>&1 | …` 会把成功的原生命令报成失败**

0 commit comments

Comments
 (0)