Skip to content

Commit d0ada78

Browse files
committed
docs(standards): 落账批 7 的豁免表历史与门禁盲区
依据 = §C16.2 的强制登记第 3 条(「T21 的规格/技术债回写:把『豁免表历史上第 N 次连带落库』+ 本次机理(`--only` 取工作树)写进该表的历史节(照批 5 体例)」)+ §C51.7①(末尾换行门禁盲区)+ §C11.8 ③(散文探针 = 批 8 候选闸)+ §C41.4 U2(探针进 paths-filter 缺口名单)+ §C54.5①(贴边件清单与路径更正)。 形态 = **纯追加**(在 `## 已拆分 / 登记移除记录` 节末追加一段 `> 🔴 批 7 收口就地加注` 块;上面全部原文一字未改)⇒ 本提交 **+12 行 / −0 行**。 【逐字对照:改了哪几行 / 原文是什么】 - **改前(保留,一字未动)**:文件末行 = 「> **未做(如实登记)**:全部调用点迁移(20 弹层 / 44 空态 / 85 加载 / 196 错误行 / 4 toast / 2 confirm / 上千处内联 style)属**批 4**;动效 token(`--ed-dur-*` / `--ed-ease`)真源属**批 6**(本批只在 `primitives/motion.css` 落同名临时块,届时**整块删除**)。」 - **改后**:该行之后追加 `---` + 一段六条 bullet 的批 7 收口加注(连带落库的事实/机理/裁定 + 提交机制两条改进 + 门禁盲区 + 探针登记 + 贴边件清单互指与路径更正)。 - 🔴 **未触碰**:301–600 档表任何一行 · `app_commands.rs` 那行(`:44`,散文「311 条」/ 行数 478 均由 T19 落库,**T21 只读复核**)· 批 0-D / 批 6 的历史块 · `--write` **未跑**(避免把并行单元的在飞行连带落库)。 【本提交落账的六条】 1. **连带落库第 N 次**(§C16.2):`fa45caf1` 带走 T4 的两行表格改动(3 个 hunk 的归属逐条给出);机理 = `git commit --only -- <paths>` **只按路径取工作树内容、不看暂存区**;后果 = `fa45caf1` / `f7ac5d0f` 两棵树 **(e) `exit 1`**(声明 476/447、代码 479/443),`39f74e4f` 起自洽、**最终树自洽**;裁定 = **接受 + 强制登记,不重写历史**。 2. **提交机制的两条改进**:共享文件用 **blob 构造 + `update-index --cacheinfo`**;真实索引已有他人暂存内容时用 **私有索引 + `commit-tree` + `update-ref`(带旧值守卫)**;自证看 `git diff HEAD --`;**提交前看 `git status --porcelain` 首列**;**私有索引提交后必须重新对齐真实索引**(§C41.2 / §C54.2)。 3. **门禁盲区**(§C51.7①):`app/src-tauri/src/commands_video.rs` 末尾**无换行**(T21 实测 `endsWith("\n") === false`,`countLines()` = **356**)而 **`countLines()` 不变** ⇒ 本表与 `line-limits --full` **都看不见**;结论 = 纯搬迁/拆件的等价性**不许只靠行数**(批 7 已升级为 `Buffer.equals` + digest/sha256);登记为技术债。 4. **散文探针 = 批 8 候选闸**(§C11.8 ③ / §C41.4 U2):`scripts/check-exemption-prose.mjs`(112 行)**入库但不入八闸/CI/husky** ⇒ 手工跑;**同进 paths-filter 缺口名单**;并记录它**按路径定位、不按死锚行号**(本表 `:45` → `:44`)。 5. **贴边件清单互指**:10 条(余量 ≤5)落在 `v0.22` 批 7 节「诚实代价」,**任何后续编辑必须先拆件**(母本体例 = 批 4 的「9 个贴边文件」)。 6. 🔴 **一处台账路径更正**:`NotesReadingColumn.tsx` 实为 **`app/src/components/notes/`**;`rulings.md` §C49.5① 与派发语写的 `app/src/views/note/NotesReadingColumn.tsx` **不存在**(T21 实测)⇒ 以 `components/notes/` 为准。 【门禁读数(串行,工作树)】 - `node scripts/line-limits.mjs --full` ⇒ **exit 0** ·「>600 硬限 **0**(棘轮内)· 301–600 档 **121** · 登记条目 **121**」(**本表零改动其表体** ⇒ 121/121 逐字不变) - `node scripts/check-exemption-prose.mjs` ⇒ **exit 0** ·「✅ 散文「**311 条**」== 门禁「定义 311」(`docs/standards/line-limit-exemptions.md:44`)」+「✅ `App.tsx` 登记 549 == `countLines` 549(`:23`)」 - `node scripts/docs-check.mjs` ⇒ **exit 0** · 扫描 **281** / 检查 **181**,五项全 ✅ - `node scripts/check-command-registry.mjs` ⇒ **exit 0** ·「定义 **311** / 注册 **311** / 重复 **0**」 - `git diff --numstat` ⇒ 本文件 **12 / 0**;`git diff` 的 `^-` 行数 = **0** 【诚实边界】 - 本条**不修**门禁盲区(不改 `countLines()`)—— **只登记**;修它属批 8 治理(会动 `scripts/**`,撞本批的写集边界)。 - 「3 个 hunk 的归属」「两棵树 (e) exit 1」是 **T1 的自报 + §C16.2 的裁定**(后续由 R-2 实测复现)⇒ 本提交是**落账**,不是 T21 的独立复现。 - 🔴 **本节是计划 Task 21 卡之外的追加提交**(卡只给 3 条提交信息,其第 3 条已由 `816c5105` 兑现)—— 本条的依据是 §C16.2 的**强制登记第 3 条**(明文要求「写进该表的历史节」),**拆成独立提交**是为满足 AGENTS.md §5「一个提交只做一件事」。**已在 `task-21-report.md` 逐字登记这一偏离。**
1 parent 816c510 commit d0ada78

1 file changed

Lines changed: 12 additions & 0 deletions

File tree

‎docs/standards/line-limit-exemptions.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,3 +232,15 @@
232232
> **本批配套改动(不涉行数登记,仅为溯源)**:① `--ed-shadow-1/2` 定值(亮档投影 / **暗档反相描边** `0 0 0 1px rgba(255,255,255,.06)`)落在生成器真源 `app/scripts/gen-tokens.mjs` 与产物 `app/src/ui/tokens.css`(`--ed-shadow-card` 被取代,实测 0 处代码引用 ⇒ 不留兼容别名);② **`ui/tokens.css` 入口接线** = `app/src/main.tsx:5` 的 `import "./ui/tokens.css";`(此前该文件从未被 import ⇒ 原语的 `var(--ed-*)` 运行时无值;该文件只有 `:root`/`[data-theme]` 自定义属性、无选择器 ⇒ 零视觉变化;防回归断言在 `tokens.drift.test.ts`);③ `--ed-due` 亮档第二次修正 `#A05F10 → #9F5E10`(剪报底 4.4950 → **4.5571**,纸 4.9309 / 面 5.1436);④ **守卫**(零颜色字面量 · `--ed-stamp` 不作底色 · reduced-motion **基类名单** · CSS 接线)+ 三条补充判据(联合契约锚 · 退场时长三方对拍 · **`animation` 落点含伪元素必须逐字进 reduced-motion 名单**)落在上述三个 `.test.ts`;⑤ `app/src/App.css`(123 行、非 UTF-8、**从未被 import** 的死样式)由 Task 13 删除 —— 它**本就不在** 301–600 档表内(`.css` 不在 `SOURCE_EXT` 管辖内),故删除对计数的贡献为 **0**。
233233
>
234234
> **未做(如实登记)**:全部调用点迁移(20 弹层 / 44 空态 / 85 加载 / 196 错误行 / 4 toast / 2 confirm / 上千处内联 style)属**批 4**;动效 token(`--ed-dur-*` / `--ed-ease`)真源属**批 6**(本批只在 `primitives/motion.css` 落同名临时块,届时**整块删除**)。
235+
236+
---
237+
238+
> 🔴 **批 7 收口就地加注 · 豁免表历史上又一次「连带落库」+ 一处门禁盲区 + 探针登记(§C16.2 / §C51.7① / §C11.8 ③;2026-09-13,**上面全部原文一字未改**)**:
239+
>
240+
> - **这一次的形态与批 5 同源,机理已定位**:批 7 首波的提交 A **`fa45caf1`**(`refactor(app): 抽出 PageSlot 与 AiToast 两个装配件`)**带走了 T4 的两行表格改动** —— `git show fa45caf1 -- docs/standards/line-limit-exemptions.md` = **3 个 hunk**:`@@ -20` 是 T1 自己的(`app/src/App.tsx | 599 → 537`),而 `@@ -42`(`app/src-tauri/src/app_commands.rs | 479 → 476` + 散文 `**313 条**` → `**310 条**`)与 `@@ -53`(`app/src-tauri/src/commands_session.rs | 443 → 447`)**都是 T4 的**。⇒ T4 自己的提交 `39f74e4f` 因此**只含 2 个 `.rs` 文件**(表格改动不在它里面)。
241+
> - 🔴 **机理(关键,必须记住):`git commit --only -- <paths>` 对点名路径取的是「工作树内容」,不是暂存区内容** —— T4 的表格改动是在 T1 同步表格**之后**、T1 提交**之前**落进**同一棵工作树**的,于是被一并带走。**后果(实测)**:`fa45caf1` 与 `f7ac5d0f` 两棵树的 **(e) 判据**(声明值 == 实测值)**`exit 1`**(表声明 476/447、代码仍 479/443);自 T4 的 `39f74e4f` 落库起恢复自洽,**最终树自洽**。🔴 **不得**声称「7a 段每个中间提交都过 (e) 判据」(§C16.2 的强制登记;另见 `v0.22` 批 7 节的「诚实代价」)。
242+
> - **裁定**:**接受「内容正确、提交边界错位」+ 强制登记,不重写历史**(§C16.2;批 5 已有同款先例被接受并逐字登记)。amend / force-push 被批纪律禁止,且其后已有 4 个提交依赖此历史 ⇒ 重写是净损失。
243+
> - 🔴 **顺带的机制结论(本批在提交机制上的两次实质改进,写进本节以备后来者)**:① 共享文件改用 **blob 构造 + `update-index --cacheinfo`**(`git show HEAD:<path>` 取 **LF 规范版本** → 只改自己那几行 → `hash-object -w` → 挂索引 → 提交,**不用 `--only`**);② 真实索引里已有别人暂存内容时改用**私有索引**(`GIT_INDEX_FILE` + `read-tree <HEAD>` + `add -- 只自己的路径` + `write-tree` + `commit-tree -p $(git rev-parse HEAD)` + `update-ref` **带旧值守卫**)—— **比 `--only` 安全**(不碰真实索引、不碰工作树)。**自证要看 `git diff HEAD -- <shared path>`**(`git diff --cached` 防不住 `--only`);**提交前先看 `git status --porcelain` 的「首列」**(出现 `M `/`A ` 且不是你的路径 ⇒ 索引里有别人的东西 ⇒ **必须**改用私有索引,否则 `git commit` 一定连带落库);**私有索引提交后必须 `git add -- <你的路径>` 重新对齐真实索引**,否则下一个人一裸提交就**回退**你的提交(§C41.2 连带回退 / §C54.2)。
244+
> - 🔴 **门禁盲区一例(§C51.7①)**:`app/src-tauri/src/commands_video.rs` 的**末尾换行被吞**(T21 实测 `s.endsWith("\n") === false`,`countLines()` = **356**)而 **`countLines()` 不变** ⇒ **本表与 `line-limits --full` 都看不见**。机理 = `countLines()` 的定义(`s.split("\n").length - (s.endsWith("\n") ? 1 : 0)`)**对「有无末尾换行」不敏感** —— 这是**口径的性质**,不是缺陷;但 🔴 **任何「逐字节一致」的纯搬迁 / 拆件声明都不许只靠行数**(批 7 的判据已升级为 **`Buffer.equals` 逐字节对拍 + `digest` / `sha256`**,§C26.4 / §C29)。**登记为技术债**(批 8 可考虑加一条「末尾换行 / EOF 形态」的机器判据)。
245+
> - 🔴 **散文对拍探针 = 批 8 的候选闸(§C11.8 ③)**:`scripts/check-exemption-prose.mjs`(批 7 T11 新建,**112 行**;口径 = `countLines()` 同源实现)把**本表的散文数字与 `check-command-registry.mjs` 的门禁读数对拍**(如「散文『311 条』== 门禁『定义 311』」;两态都成立、中途未同步期为**真阳性** `EXIT=1`)。🔴 **已入库,但不入八闸 / CI / husky**(理由:八闸的集合是批 8 治理收口的对账基线,本批扩闸会让逐字对账漂移;散文数字天然易漂 ⇒ 硬门禁会频繁假红)⇒ **手工跑**(`--help` 与头注都自述「非门禁」)。**并进入 `pr-check.yml` 的 paths-filter 缺口名单**(§C41.4 U2;**缺口形态未变、逃逸文件集合 +1** —— 同源事实见 [`performance.md`](performance.md) 的懒侧门禁节)。⚠️ **探针按路径定位、不按死锚行号**(本表的 `:45` 因 T6 删行已下移为 **`:44`**,即 `app_commands.rs` 那行,其散文现为 **「311 条」**、行数值 **478**,T21 实测两者与门禁读数一致)。
246+
> - 🔴 **本批的贴边件清单(余量 ≤5,共 10 条)落在 [`v0.22` 批 7 节的「诚实代价」](../versions/v0.22.md)**(母本体例同批 4 的「9 个贴边文件」):**任何后续编辑必须先拆件**。其中 `app/src/components/notes/NotesReadingColumn.tsx` 的路径在批 7 台账(`rulings.md` §C49.5①)与派发语里被写成 `app/src/views/note/NotesReadingColumn.tsx` —— 🔴 **该路径不存在**(实测该文件在 `components/notes/`)⇒ **以 `components/notes/` 为准**。

0 commit comments

Comments
 (0)