Skip to content

Commit 49f953f

Browse files
committed
docs(batch2): flag overlong commit subjects
1 parent af57dab commit 49f953f

2 files changed

Lines changed: 9 additions & 2 deletions

File tree

‎docs/superpowers/plans/2026-09-11-frontend-redesign-batch2-bundle.md‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,8 @@ git diff --stat # 只应有 scripts/bundle-eager-graph.mjs
400400
git commit --only -m "build(scripts): add first-screen reachability probe" -- scripts/bundle-eager-graph.mjs
401401
```
402402

403+
> **2026-09-12 更正(Task 12 回写)**:上面这个 subject **51 字符,超 `AGENTS.md` §5 的 ≤50 字上限**,且**照抄落地**了(`e46e0e82`)。**门禁不会拦**:`commitlint.config.js` 的 `header-max-length` 沿用 config-conventional 的 **100**,未覆盖为 50。**Task 2 Step 5 的 subject 同样是 51 字符**(同一处失误,已实测入库 `f0592654`)。⇒ 抄写提交命令前请人工数字符数。
404+
403405
**Verification(本任务的验收,逐条给命令与期望)**
404406

405407
| # | 命令 | 期望 |
@@ -582,6 +584,8 @@ git diff --stat
582584
git commit --only -m "build(scripts): add first-screen bundle budget gate" -- scripts/check-bundle-budget.mjs
583585
```
584586

587+
> **2026-09-12 更正(Task 12 回写)**:上面这个 subject **51 字符,超 `AGENTS.md` §5 的 ≤50 字上限**,且**照抄落地**了(`f0592654`)。**门禁不会拦**(`commitlint.config.js` 的 `header-max-length` = **100**)。**Task 1 Step 7 的 subject 同为 51 字符**(`e46e0e82`);本批计划里超限的提交命令共 **3 处**(第三处是 Task 7 Step 5 的 53 字符)。
588+
585589
**Verification**
586590

587591
| # | 命令 | 期望 |
@@ -1356,7 +1360,8 @@ git diff --stat
13561360
git commit --only -m "perf(app): lazy-load capture float and overlay panels" -- app/src/App.tsx
13571361
```
13581362

1359-
> **2026-09-12 更正(Task 12 回写)**:上面这个 commit subject **53 字符,超 `AGENTS.md` §5 的 ≤50 字上限**。交付时改用 **42 字符**的 `perf(app): lazy-load window variant panels`(`63536018`,同一动作、同一显式路径)。⚠️ 本仓 pre-commit 有 commitlint 时该行**会**被拦;后续批次派发词里的提交命令请**先数字符数**。
1363+
> **2026-09-12 更正(Task 12 回写)**:上面这个 commit subject **53 字符,超 `AGENTS.md` §5 的 ≤50 字上限**。交付时改用 **42 字符**的 `perf(app): lazy-load window variant panels`(`63536018`,同一动作、同一显式路径)。
1364+
> ⚠️ **Task 12 逐条普查(码点计数,脚本 `tmp/task12/subject-len.mjs`)发现:计划里超限的提交命令不是 1 处而是 3 处** —— 本行(53)· **Task 1 步骤(L400,51)** · **Task 2 Step 5(L582,51)**;后两条**被逐字照抄落地**(`e46e0e82` / `f0592654`)。**根因是这条规则没有任何机器门禁**:`commitlint.config.js` 沿用 `@commitlint/config-conventional` 的 `header-max-length = 100`,**未覆盖为 50**,故 51 字符的提交**能通过 commit-msg 钩子**(已实测:两条确实入库)。⇒ 后续批次派发词里的提交命令**必须人工数字符数**(或另立一条 `header-max-length` 规则 —— 登记批 8)。
13601365

13611366
**Verification**
13621367

@@ -1903,6 +1908,7 @@ git commit --only -m "docs(batch2): close bundle governance batch" -- docs/super
19031908
| 11 | Task 2 注 | 守卫的**嵌套路径盲区**(静默假绿,真实构建复现)+ 输出把「非首屏」说成「仅动态可达」的**假文案** |
19041909
| 12 | Global Constraints 仪器纪律 | 追加**第 6–13 类仪器陷阱**(累计 13 类) |
19051910
| 13 | Global Constraints 门禁基线注 | clippy 判据 = **集合比对**,**禁止比 Task 1 的 sha256**(BOM+CRLF vs LF,永远假红) |
1911+
| 14 | Task 1 Step 7 / Task 2 Step 5 / Task 7 Step 5 注 | 计划里**超 ≤50 的提交命令共 3 处**(**51 / 51 / 53** 字符,脚本 `tmp/task12/subject-len.mjs` 逐条普查),其中**两处被照抄落地**(`e46e0e82` / `f0592654`);根因 = `commitlint.config.js` 的 `header-max-length` 沿用默认 **100**,**该规则无机器门禁** |
19061912
19071913
**规格与台账同步(Task 12 同批提交)**:规格 §2 包体行 / §10 批 2 行 + 口径注 + 瓶颈清单指针 / §11 验收 9 进度注 / §13 风险表 / §14 交付记录落点行;`docs/versions/v0.22.md` 新增 `### 批 2 · 包体治理` 节(含七段固定结构与 v0.22.2 行、验收门槛 9 的进度标记)。
19081914
@@ -1914,6 +1920,7 @@ git commit --only -m "docs(batch2): close bundle governance batch" -- docs/super
19141920
| 16 | `scripts/**/*.mjs` **不在 `line-limits` 的扫描域**(`SOURCE_EXT` 不吃 `.mjs`、`SCAN_DIRS` 只有两处)⇒ 本批两个新脚本(299 / 86 行)**无门禁保护** | 批 8 |
19151921
| 17 | `app/vite.config.ts` **同时**不在 `line-limits` 扫描域**与** `tsc --noEmit` 的 program(`--listFilesOnly` 879 文件 0 命中,正样本 `main.tsx` = 1)⇒ 只靠 `vite build` 兜底 | 批 8 |
19161922
| 18 | 计划自带的「子串碰撞」反例**恒假红**(`@xyflow/react` 的 id 里没有连续子串 `node_modules/react`)· `@types/katex` 覆盖闸必然红(`dependencies` 实为 **14** 个,计划写 12)· V3 判据「Δ ≤3 kB」实测 −4.39 kB 突破 ⇒ 已改判为「**只许变小 ∧ modules 不变**」 | 已就地更正(批 8 只承接 F4:把 `@types/*` 挪 `devDependencies`) |
1923+
| 19 | **`AGENTS.md` §5 的「subject ≤50」是一条无门禁的约定** —— `commitlint.config.js` 未覆盖 `header-max-length`(默认 **100**),故 51 字符的提交能过 commit-msg 钩子并被照抄落地(本批 2 例)。建议加一条 `'header-max-length': [2, 'always', 50]`,或至少在派发词里要求人工数字符数 | 批 8 |
19171924
19181925
> **Task 12 未验证(诚实单列)**:① 真 WebView 的时序 / 网络抓包 / 两窗变体实测(静态推理 + 守卫读数,未在真机跑);② CSS 三文件加载顺序未做 WebView 实测;③ `dist` 未做安装包级实测(字体 1,072,948 B 一字节未动 ⇒ 安装包体积未改善);④ 本批的 `Circular chunk` 归零只在**规则层**被守卫,**构建日志仍无门禁看管**(登记批 8);⑤ 收口门禁跑在**工作树**而非导出提交树(`node_modules` 不在归档内,故 `tsc`/`vitest`/`cargo` 无法在导出树上复跑 —— 与 Task 1 同一限制)。
19191926

‎docs/versions/v0.22.md‎

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

168168
**本批新增/确认的读数陷阱(累计 13 类,逐条见批 2 计划 Global Constraints 的仪器纪律注)**:含中文的搜索模式经 PowerShell 字符串层被 **GBK 误解码**(给出 0 命中的假阴性)· 无 BOM 的 UTF-8 中文 `.ps1` 被 `-File` 按 GBK 解码(连脚本内 `cmd` 行一起毁)· **整树 ripgrep 遵守 `.gitignore` ⇒ 对被忽略目录整体失明**(同一仪器实测 0 vs 19 命中)· PS 5.1 `>` 重定向写 UTF-16LE · **Tauri 命令名不是唯一 chunk 标记** · **chunk 依赖边是「模块图」的性质、不是「归属表」的性质**(环的根因:只挪模块不挪它自己的依赖闭包)· `git archive` 在未跟踪子目录出 10240 B 空归档 + exit 0 · 解包树里 `git grep` 静默 0 命中 · `Copy-Item` 保留 mtime ⇒ cargo 回放陈旧诊断(还原后先 `touch`)· **A/B Δ 恰为 0 先当仪器故障**、自证仪器能测出已知差异再下结论。
169169

170-
**未做(登记,逐条带归属)**:路线 A 叶级懒加载(被 B′ 在首屏上完全包含 · 测试面更险)→ **批 5** · 页级错误边界 / 懒 chunk 加载失败重试(`PageSlot` 的 `<Suspense fallback={null}>` 之上只有**全局** `AppErrorBoundary` ⇒ 一次失败卸载整个 `MainShell`、已访问页状态一起丢,**这是本批新增的失败模式**)→ **批 3/4** · 两个窗口变体分支**没有错误边界**(chunk 加载失败 = 空白窗)→ **批 3/4** · 首访加载态 `fallback={null}` → L1 `Loading` 原语 → **批 3/4** · 变体首屏**正式**度量口径(本批只给实测值 + 证明 `< 60 kB` 不可达)→ **批 3** · `structuredBlocks.ts` 整模块存废 + `katex` 版本偏斜(含 `@types/katex`)→ **批 7** · `@codemirror/lang-markdown` 传递链(懒 chunk **−84.04 kB**)+ `basicSetup` 附带件(**−45.10 kB**)两条**耦合**,须一起裁决 → **批 4/5** · 59 个 KaTeX 字体 1,072.95 kB(仅 `.woff2` 可省 816.78 kB)→ **批 8** · 批 6 装 GSAP **必须** `import()` 且核对 `vendor-gsap` 不在首屏(槽位已预留并被单测钉住)→ **批 6** · `check-bundle-budget.mjs` 接线 `.husky/pre-commit` / CI(本批有意不接:它要跑真实构建并写 `app/dist/`)→ **批 8** · 守卫的**嵌套输出路径盲区**(`assets/vendor/*.js` 既不计首屏也不计懒,**仍打印 ✅ 达标 + exit 0**;已用真实构建复现)→ **批 8** · 守卫把「非首屏」一律说成「仅动态可达」的**假文案**(从未验证动态可达性)→ **批 8** · **没有任何门禁看构建日志里的 `Circular chunk`**(环本批已断:1 → **0** 条,但「依赖升级可能让死边复活」⇒ 建议纳入某处判据)→ **批 8** · 两个贴限文件:`scripts/check-bundle-budget.mjs` **299/300**、`app/src/build/manualChunks.test.ts` **292/300** ⇒ **任何新增必须按语义拆分**(守卫拆「口径 / CLI」,测试拆「分组规则 / 反例」)→ **批 8 · 下次改动者当次拆** · `.gitignore` 的 `build/` **锚定语义**未动(本批只点状取反)→ **批 8** · `scripts/**/*.mjs` **不在 `line-limits` 扫描域**(`SOURCE_EXT` 不吃 `.mjs`、`SCAN_DIRS` 只有 `app/src` + `app/src-tauri/src`)⇒ 本批两个新脚本**无门禁保护** → **批 8** · `app/vite.config.ts` **同时**不在 `line-limits` 扫描域**与** `tsc --noEmit` 的 program(`--listFilesOnly` 879 文件 0 命中,正样本 `main.tsx` = 1)→ **批 8** · F4 把 `@types/*` 挪 `devDependencies`(依赖卫生)→ **批 8**。**本批未复核「批 0 其余部分」的落地状态**(本文档「批 0 其余部分(未落地)」节写于 2026-09-11)→ **批 8** 复核。
170+
**未做(登记,逐条带归属)**:路线 A 叶级懒加载(被 B′ 在首屏上完全包含 · 测试面更险)→ **批 5** · 页级错误边界 / 懒 chunk 加载失败重试(`PageSlot` 的 `<Suspense fallback={null}>` 之上只有**全局** `AppErrorBoundary` ⇒ 一次失败卸载整个 `MainShell`、已访问页状态一起丢,**这是本批新增的失败模式**)→ **批 3/4** · 两个窗口变体分支**没有错误边界**(chunk 加载失败 = 空白窗)→ **批 3/4** · 首访加载态 `fallback={null}` → L1 `Loading` 原语 → **批 3/4** · 变体首屏**正式**度量口径(本批只给实测值 + 证明 `< 60 kB` 不可达)→ **批 3** · `structuredBlocks.ts` 整模块存废 + `katex` 版本偏斜(含 `@types/katex`)→ **批 7** · `@codemirror/lang-markdown` 传递链(懒 chunk **−84.04 kB**)+ `basicSetup` 附带件(**−45.10 kB**)两条**耦合**,须一起裁决 → **批 4/5** · 59 个 KaTeX 字体 1,072.95 kB(仅 `.woff2` 可省 816.78 kB)→ **批 8** · 批 6 装 GSAP **必须** `import()` 且核对 `vendor-gsap` 不在首屏(槽位已预留并被单测钉住)→ **批 6** · `check-bundle-budget.mjs` 接线 `.husky/pre-commit` / CI(本批有意不接:它要跑真实构建并写 `app/dist/`)→ **批 8** · 守卫的**嵌套输出路径盲区**(`assets/vendor/*.js` 既不计首屏也不计懒,**仍打印 ✅ 达标 + exit 0**;已用真实构建复现)→ **批 8** · 守卫把「非首屏」一律说成「仅动态可达」的**假文案**(从未验证动态可达性)→ **批 8** · **没有任何门禁看构建日志里的 `Circular chunk`**(环本批已断:1 → **0** 条,但「依赖升级可能让死边复活」⇒ 建议纳入某处判据)→ **批 8** · 两个贴限文件:`scripts/check-bundle-budget.mjs` **299/300**、`app/src/build/manualChunks.test.ts` **292/300** ⇒ **任何新增必须按语义拆分**(守卫拆「口径 / CLI」,测试拆「分组规则 / 反例」)→ **批 8 · 下次改动者当次拆** · `.gitignore` 的 `build/` **锚定语义**未动(本批只点状取反)→ **批 8** · `scripts/**/*.mjs` **不在 `line-limits` 扫描域**(`SOURCE_EXT` 不吃 `.mjs`、`SCAN_DIRS` 只有 `app/src` + `app/src-tauri/src`)⇒ 本批两个新脚本**无门禁保护** → **批 8** · `app/vite.config.ts` **同时**不在 `line-limits` 扫描域**与** `tsc --noEmit` 的 program(`--listFilesOnly` 879 文件 0 命中,正样本 `main.tsx` = 1)→ **批 8** · F4 把 `@types/*` 挪 `devDependencies`(依赖卫生)→ **批 8**。**本批未复核「批 0 其余部分」的落地状态**(本文档「批 0 其余部分(未落地)」节写于 2026-09-11)→ **批 8** 复核 · **`AGENTS.md` §5 的「subject ≤50」是一条无机器门禁的约定** —— `commitlint.config.js` 沿用 config-conventional 的 `header-max-length = 100`,未覆盖为 50,故本批有 **2 条 51 字符提交**(`e46e0e82` / `f0592654`)照抄计划落地并顺利入库;建议加 `'header-max-length': [2, 'always', 50]` → **批 8**。
171171

172172
**瓶颈清单指针**:本批的瓶颈清单(14 行,每行含实测 gzip / 为什么降不下去 / **具名归属批次** / 复现命令)在批 2 计划 [2026-09-11-frontend-redesign-batch2-bundle.md](../superpowers/plans/2026-09-11-frontend-redesign-batch2-bundle.md) 的 **§收口回写**节,另有 **Task 12 收口终态**节(终态六门禁表 + 回写落点表 + 追加 follow-ups 15–18)。规格 §10 明写「后一批的细节依赖批 0–2 的实测结果(**尤其是包体治理量出的瓶颈清单**)」⇒ **批 3 的计划者请先读该清单**。
173173

0 commit comments

Comments
 (0)