# 冻结清单 —— 这条线唯一的排期真源

> 🔴 **规则真源 = [`AGENTS.md` §0.1 停止规则](../AGENTS.md)**（owner 2026-09-14 拍定）。
> 本文件只是那条规则的**载体**：清单清零 = 这条线结束。

- **冻结时点**：lab `9e18683` · DS `9739ee16` · 2026-09-14
- **进度**：⇒ 🟢 **剩 4 条，且【全部是阻塞】**（owner **0** · lab **0** · 阻塞 **4**）——
  现取 **2026-09-15 第十轮收尾**（第八/九/十轮连续三轮同值 4，⛔ 但⛔ 别读成「没进展」——
  第九轮 B4/B3 各松一半、第十轮 B7 的阻碍从 2 个减到 1 个），
  口径 = §1.1/§1.2/§1.3 三节里**编号未划掉的表行**
  （⛔ 不含 §3，那节不排期）：**`B2 · B3 · B4 · B7`**，⛔ 无 O、⛔ 无 L。
  ✅ **这个数是程序化数出来的**（按各节最后一张 `| # |` 表头锚定逐行扫），⛔ 不是由标称数加减 ——
  ⚠️ 本行**又 stale 了两轮**（写着「13 条 · owner 3 · lab 4 · 阻塞 6」时，第七轮·续早已是 6 条、
  §1.1 与 §1.2 双双清零）⇒ **同一个形态第二次发作**，见下方那段已有的订正。
  ⚠️ 🔴 **数这个数时判定面会被自己污染**：§1.3 里现在有一张**第八轮小结表**也带 `| B2 |` 这类行
  ⇒ 幼稚地 grep 会数成 **8**（正好翻倍）。**口径必须锚到该节最后一张 `| # |` 表头之后**
  （`§2.21 推论二①` 的形态，这次是 lab 数自己的清单时踩的）。
  ~~`O1·O3·O6` + `L7·L13·L14·L15` + `B1·B2·B3·B4·B6·B7`。~~〔上一轮的名单，留痕〕
  ⚠️ 🔴 **本行此前 stale 过一轮**：写着「16 条 · lab 7」时实为 **14 条 · lab 5**（L8/L9 做完后
  只改了 §1.2 的标题、没回改本行）—— **`AGENTS §2.26` 推论一那个形态**（改分项的人只看那一段，
  文件级总述留在原地）。⇒ **口径写死：改完任一分项，回到本行重数一遍。**
  已做完 / 已销账 **20 条**：
  D1 · D2 · D3 · L1 · L2 + O4 · O5〔均 2026-09-14〕+ **L3 · L11 · L12 · L20 · L21**〔09-15 第一轮〕
  + **L17 · L19 · L24**〔09-15 第二轮〕+ **L10 并入 L8**〔登记重复，⛔ 不是两件活〕⇒ 逐条见 §2。
  另有 **3 条挪进阻塞**（L6 · L16 · L23 ⇒ B5/B6/B7）—— ⚠️ **挪阻塞 ⛔ 不等于销账**，是「做不下去了」。
  ⚠️ **⛔ 别把 10 读成工作量** —— 那 10 条里 **5 条的射程或前提已被订正**（见 §1.2 节首），
  照登记字面动手会做错东西；其中 **L22 一条就从 8 格缩到 1 格**。
  🔴 **「33 条」这个总数已订正为 36**（= 6 owner + 24 lab + 3 阻塞 + 3 存疑）——
  偏低 3 的根因在 §1.2 的标称数，见该节订正段。**⛔ 别再由标称数做加减，逐节数表行。**
- 🔴 **动手前必做（owner 2026-09-14 拍定，见 [`AGENTS.md` §0.2.2](../AGENTS.md)）**：
  **⛔ 不许直接照本清单的条目动手。** 先对那一条跑 `AGENTS §2.22` 的**五行块**
  （登记记的 / 现取的 / 前提还成不成立 / 它还该做吗 / lab 自己验过没）。
  ⚠️ **这不是建议** —— 同日按它核了 4 条，**3 条当场销账**（O1 / O2 / O4 / O5，见 §1.1）。
- 🔴 **判断「系统好没好」⛔ 不看本清单剩几条**（它是欠债表，且条数曾数错 3）。
  看 `node metrics/ratchet-watch.mjs --ds-root <被测仓>` ⇒ 标准与用法见 `AGENTS.md` §0.2.1。
- **⛔ 冻结之后不再新增**。新发现写进文末 §3，**只登记、⛔ 不排期**。
- **例外只有「阻碍」**：清单上某条**做不下去了**（前提塌了 / 依赖不存在 / owner 裁定不做）。
  ⚠️ 「我又发现一个更值得做的」⛔ 不是阻碍。

## §0 这次盘点的扫描面（⛔ 写死，免得下次不知道漏了什么）

| 面 | 文件 | 口径 | 原始条数 |
|---|---|---|---:|
| 处方 | `proposals/*.md`（18 份） | 头部「执行状态」栏 + 正文 ⏳ / 🔴 / 🟡 未完成分项 | 27 |
| 审查报告 | `docs/2026-09-09-ds-slim-optimize-review.md`（§1–§43） | 各格「交接给下一格 → 可直接接的」 | 11 |
| 决策队列 | `docs/decision-queue.md` | 按该文件自己的读法纪律（⛔ 不按符号猜） | 26 |

**归并后 = 本清单 §1 的条目数。** 去重掉的：跨份重复 3 组 · 已过期 2 条 · 本就自标「不是待做项」4 条。

**⛔ 没扫**（如实登记，⛔ 不是待补）：

- **DS 仓自己的 backlog / STATUS / meta-rules** —— 那是 DS 的账，⛔ 不是 lab 的射程。
- **任何新探查** —— 本次只收「lab 已登记但没做完的」。
  ⚠️ 要扩到「再查一遍 DS 找新问题」是**另一个决定**，得 owner 拍 —— 否则盘点自己就是又一轮无限优化。

🔴 **一处已知的覆盖缺口（⛔ 不补，如实记）**：审查报告的盘点对
**§1–§7 · §12–§14 · §18–§25 · §27–§30 · §33 · §36–§38.5** 只做了关键词 grep
（`交接给下一格` / `候选` / `可直接接的` / `仍未答` / `未重取` / `⏳` / `待办` / `未闭合` / `尚未`），
**未整段通读** ⇒ 那些区段若有不含上述措辞的待做项登记，本清单会漏。

🔴 **口径**：报告里「**边界（⛔ 是边界，不是 TODO）**」那类**⛔ 不进本清单**（是覆盖边界，不是欠账）；
「⛔ 别再翻」那类是**已完成**。

---

## §1 待做

### §1.1 🔴 只有 owner 能做的（lab 结构上做不了）—— ~~6 条~~ ~~⇒ 4 条~~ ~~⇒ 3 条~~ ⇒ 🟢 **0 条**（O2 挪进阻塞 B4；**2026-09-15 第七轮 owner 当轮把 O1 · O3 · O6 三条全拍了**）

> 🔴 **D1 已做完（2026-09-14，见 §2 那格）**：O4 / O5 **销账**（标的已落地，⛔ 不再待拍）·
> **O6 仍待拍但射程从 13 段缩到 6 段**。逐条读数与订正落在
> [`proposals/2026-08-31-unclassified-67-fix-directions.md` §5.1](../proposals/2026-08-31-unclassified-67-fix-directions.md)
> 与 `docs/decision-queue.md` 的 Q1-a 起草段。**⇒ owner 的活 = O1 · O3 · O6**（O2 当日又挪进阻塞 B4）。

| # | 事 | 出处 | 为什么只有你能做 |
|:-:|---|---|---|
| ~~O1~~ | ~~**那 175 条白底存量整改**~~ ⇒ ✅ **销账 —— owner 2026-09-15 拍「不做」** | `proposals/2026-09-02-mockup-default-white-bg.md` | ~~要**设计师排期改 Figma**~~ ⇒ 🔴 **2026-09-14 现取：这条的硬理由已经没了，问题要重新问**（owner 质疑「Figma 是真源，不修改」触发的复核）。**⛔ 仍不代拍**，但下面三条是事实层、⛔ 不是价值判断：<br>① **射程⛔ 不是那个真源库** —— 面是 **6 个消费产品的 mockup 文件**（处方 §0 逐字列了 fileKey），而 owner 2026-09-11 拍的「Figma 库权威且不改」指 **TVU UX Design System 那唯一一个设计组件库**（逐字「其他的都是消费产品的文件」）⇒ **两个「Figma」不是一个东西**。<br>② 🔴 **「判反」这个理由已被 owner 自己 09-09 的裁定消掉** —— 处方 §4 表里那 175 条的「改完的预期」逐字是「`detectFrameTheme` 由判反变判对」；而 `scripts/lib/detect-frame-theme.mjs:30-34` 现取逐字已改成**画序语义**「铺满的子图层**压过** frame 自身 fill」，并标 ✅「2026-09-09 DS owner 已认可（逐字『认：谁盖在上面算谁』）」，且**已有 3 个调用方**（`audit-mockup-variant-axis.mjs` · `mockup-rules/variant-axis.mjs` · npm key）⇒ ⛔ 不改稿也判对。<br>③ **剩下的只是「让信号显式」这个卫生诉求，且已被闸守住**：`audit-mockup-default-white-bg.mjs` 是 **shrink-only**，基线现取 **446**（6 个文件逐个计数）—— 规则① 基线外新增 ⇒ 红；规则② 改好了不删行 ⇒ **也红**（兑现即锁定）。⚠️ **但只保证止增、⛔ 无任何机制逼它减** ⇒ **不做的代价 = 446 停在 446，⛔ 不会增长**。<br>⇒ **要你拍的那一句变成**：这 446 条「白 fill 不携带意图」的历史债，值不值得为「显式」去动 175 个 frame（视觉零变化，因为它们本来就被子图层盖住）。**lab 的推荐：不做**（理由 = ② 已消掉唯一的硬收益）<br>✅ **owner 2026-09-15 拍「不做」** ⇒ 本条销账。**446 条历史债刷住不清，理由 = 改完的唯一硬收益（探测器判反变判对）已被 owner 自己 09-09 的裁定消掉**（探测器改走画序语义「谁盖在上面算谁」⇒ ⛔ 不改稿也判对），而闸是 shrink-only、**只许降不许增** ⇒ 不做的代价 = **446 停在 446，⛔ 不会长**。⚠️ ⛔ 但这不等于「问题没了」——**无任何机制逼它减**，这一条已如实登记在闸的基线里。|
| ~~O2~~ | ~~**CI secret**~~ ⇒ 🔴 **2026-09-14 改判：前件未到 ⇒ 挪进 §1.3 阻塞（B4）** | `decision-queue.md` Q6 `wire-ci` 行 | 逐字「CI secret 得你去仓库设置里加（**⛔ AI 不得处置密钥**）」**仍成立** —— ⛔ 但同一行同日已登记「**在增量机制做出来之前，设了也没用**」：按 owner 拍的射程实测，整库扫出 **629,268 条**存量违例，根因是那条闸的用法是**节点级增量**、⛔ 不是整库全扫（CI 上没有「刚触碰了哪个节点」这个信息）⇒ 设了 secret 只会让 CI 每次红 62.9 万条 = 零信号。⚠️ **这是我 2026-09-14 那格自己造的知情面分叉**：改了 Q6 那节、⛔ 没回改本行（`lab:N56`）|
| ~~O3~~ | ~~**逃生口 `LAB_CONSUMER_TASK_ACK=1` 合并实测**~~ ⇒ ✅ **销账 —— owner 2026-09-15 拍「用到时自然验」** | `review.md:1477` | 逐字「**刻意留给人跑** —— ⛔ AI 不得自设该变量」（同 `VISUAL_COMMIT_APPROVED` 的裁定形态）<br>✅ **销账依据（读数，⛔ 不是省事）**：**两半都已验过** —— 脚本分支由 `reject-consumer-design-task.selftest.sh` 验（`:80` `[ "${LAB_CONSUMER_TASK_ACK:-0}" = "1" ]` ⇒ 放行）· 「环境变量进得了 hook 进程」由 harness 探针的 `PROBE_ARM` 三臂实证；**两半之间⛔ 没有任何认名字的机制** ⇒ 合并那一格的残余不确定性极低。且**失效形态是当场可见、非破坏性的**（真坏了 = owner 发现放不行 ⇒ 当场修），⇒ 成本（一次 session 重启）> 收益。**已把这句写进 hook 注释当承载栏位**（`AGENTS §2.26`：⛔ 别只写报告）。|
| ~~O4~~ | ~~**闸的第四态**（`add-fourth-state`）拍不拍~~ ⇒ ✅ **销账（2026-09-14）** | `decision-queue.md` Q1-a 起草段 | 🔴 **标的已在 2026-09-07 同日落地**，走的是 `record-as-nmc`：闸 `:161` 逐字「52 → **51**…`#M23.10` 登记豁免（owner 拍定不上闸）」。且 agent 当时反对该支的理由（「会种下一句『脚本检不了』的假理由」）**实测未发生** —— 那条 `reason` 逐字自我排除了它。三个登记的代价逐条未发生 ⇒ **⛔ 不再待拍**（`lab:N54` 形态）|
| ~~O5~~ | ~~**那 67 条逐条人工判读「被测物在哪个面」**~~ ⇒ ✅ **销账（2026-09-14）** | `proposals/…-67-fix-directions.md` §5 第 3 行 | 🔴 **那个动作已由 agent 做掉**：`decision-queue` 逐字「59 段做了**全量**预分类（⛔ 不抽样）」⇒ `needs-owner` 只剩 **2 段**，**两段都已在 2026-09-07 拍完**（Q1-a + Q1-b ⇒ DS `bb9146af`）。棘轮实测 **59 → 35**、每步带归因 commit。⚠️ 逐条现状仍须重跑量具 = **L5/L6**，⛔ 不是 owner 的活 |
| ~~**O6**~~ | ~~**行内形态的 Acceptance 走 C1 还是 C2**~~ ⇒ ✅ **owner 拍 C1 并当轮做完（2026-09-15，DS `71d9405d`）** | 同上 §5 第 2 行 + §5.1 | 🟡 **仍待拍，取舍一个字没变**（`ITEM_RE` 现取仍只认 `^- `）。⚠️ **但射程已缩：13 段 ⇒ 6 段**（用闸自己的 `collectSections()` 现跑：段总数 133 · `items>0` 127 · **`items=0` 6**），6 段逐条在 §5.1 表里<br>✅ **owner 2026-09-15 拍 C1（改文档排版），当轮落地** —— **正文一字未改，只换排版**（原句整句搬进一个 `- ` 行，⛔ 未自行拆成 N 条 —— 那是重新解读）。6 段：`#C5` · `#M23.18` · `` #`Jira `` · `#M23.8.1` · `#M35` · `#M-DISCIPLINE.SYNC`。**`items=0` 段 6 → 0**（段总数 134 不变）· `unclassified` 32 持平 · 闸 EXIT=0 · 全量 **3568 passed / 0 failed**。<br>🔴 **危害是实测的，⛔ 不是推的**：这 6 段里 **5 段已显示 `gated`** 而 `items=0` ⇒ S4 对位**恒过**（`0===0`）⇒ 与第六轮判掉的假绿同形态。<br>🟢 **连带 4 条自陈 `[0]` → `[1]`，而那 4 条红【是哨兵按设计意图炸的】⛔ 不是被绕过**：`audit-commit-affordance-trace.mjs` 原注释逐字「写 `[0]` 是为了**有人给它加 checklist 时当场红**」—— 那件事今天发生了。已如实更新该注释，并登记 **`[N]` 的语义 = 「这段有几条核查项」的对位哨兵，⛔ 不是覆盖度声明**。<br>✅ **造故障三臂**：对照 `EXIT=0` · 给 `#C5` 加一条核查项 ⇒ S4 红（**这正是改排版买到的东西**）· 把 `#C5` 改回行内形态 ⇒ S4 **也红** ⇒ **对位是双向的**。还原 `cp`+`cmp` 字节一致、零残留 marker。<br>⚠️ **顺带订正 lab 自己一处读数**：处方写「改闸会让**所有**段的 `checkItems` 变动」—— 实测**只动 6 行 / 134（4.5%）**，**高估了一个数量级**；且改闸只修得了 5 段（`#M35` 是散文段 + 标题形态，改闸抓不到）⇒ **C1 是唯一单独就够的那条**。<br>**产物**：报告 [`reports/2026-09-15-o6-inline-acceptance-reformat.md`](../reports/2026-09-15-o6-inline-acceptance-reformat.md) |

✅ **那个「两张表对不上」的疑点已定案（2026-09-14，D1）：⛔ 不是矛盾，是口径不同。**
`decision-queue.md:6` 的「0 条」，口径由 `:8` 逐字写死 = 「本表**未标 ✅ 的编号行**」
⇒ 它数的是**顶部那张编号表的行**，而 O4 在 §2 正文的 `#### ⏳ 真正待拍的两条` 小节里、
O5/O6 在**处方自己那张表**里 ⇒ **三者都不在那个分母内**（`AGENTS §2.4`：引用分母必须带口径名）。
⚠️ **顺带查实**：`decision-queue` 里 Q1-b / Q1-c / Q1-d 三个 `####` 标题**至今仍带 ⏳**，
而三者的子节里都有 `##### ✅ … 已拍`（Q1-b ⇒ DS `bb9146af` · Q1-c ⇒ `acc4d715` · Q1-d ⇒ 表里 ✅ 6）
⇒ **那三个 ⏳ 是过期标记**（§26 推论一：改分项的人只看那一段）。⛔ 本格未回改那三个标题 —— 见 §3。

### §1.2 我能做的 —— ~~21~~ ~~19~~ ~~22~~ ~~17~~ ~~10~~ ~~9~~ ~~8~~ ~~7~~ ~~5 条~~ ~~4 条~~ ~~3 条~~ ~~2 条~~ ~~1 条~~ ⇒ 🟢 **0 条**（2026-09-15 两轮筛查 + 做掉 L5 · L22 · L18 · L8 · L9 · **L4**；**L13 挪进 §1.3 阻塞 B8**；**第七轮：L15 挪进 §1.3 阻塞 B9 · L7 销账并入 B4 · L14 做完**）

> **现取（程序化数，⛔ 不由标称数加减）**：未划掉的 `L` 行 = ~~L7 · L14 · L15~~ ⇒ 🟢 **0 条**（2026-09-15 **第七轮**重数）。
> ⚠️ 同批 `O` = ~~3~~ ⇒ 🟢 **0**（owner 当轮把 O1 · O3 · O6 全拍了）· `B` = ~~7~~ **6**（B1–B4 · B6 · B7；B9 当轮解除）
> ⇒ **清单合计 12 ⇒ 10 ⇒ 6 条**。
> 🟢 **§1.1「只有 owner 能做的」与 §1.2「我能做的」双双清零** —— **剩下的 6 条全部是等前件的阻塞**，
> ⛔ 没有一条是「现在就该做而没做」。
> 🔴 **第七轮动了两条，性质完全不同，⛔ 别合并成「做掉了 2 条」**：
> · **L15 ⇒ B9 是【改判挪节】，总数不变** —— 与第六轮 L13 同形态：按登记的字面做会落出一条
>   **有效分母 0 的恒绿闸**，⏳ 等 owner 拍出路后才谈做不做得掉。
> · **L7 是【真销账】，总数 −1** —— 它要取的读数**服务不了它要服务的决策**，
>   而那个决策真正需要的读数 lab 早已取过（629,268）⇒ `wire-release` 并入 **B4**。
> 🔴 **⛔ 别把这一步读成「L13 做掉了」** —— 它先**改判挪节**（L13 ⇒ B8，总数不变 13），
> 同一轮 owner 当场拍了出路 (a) ⇒ **B8 阻碍解除并做完**（DS `36554059`）⇒ 才 13 ⇒ **12**。
> 两步是两件事，⛔ 别合并成「L13 按登记做完了」（按登记做出来的会是一条假绿）。

> 🔴 **2026-09-15 · 第一轮（五行块【前两行】：登记记的 / 现取的）** —— 现取 lab `644028f` · DS `fe5555a3` 脏 6。
> **22 条 ⇒ 销 5（L3 · L11 · L12 · L20 · L21）⇒ 剩 17。**
>
> 🔴 **2026-09-15 · 第二轮（五行块【后三行】：前提还成不成立 / 它还该做吗 / lab 自己验过没）** ——
> 现取 **DS `499d32e2` 脏 6**；lab 登记面一律在**导出树 `644028f`** 上量（⛔ 不在工作树 —— 本轮自己写的内容会污染，`AGENTS §2.22` 推论五）。
> **17 条 ⇒ 销 3（L17 · L19 · L24）· 挪阻塞 3（L6 · L16 · L23 ⇒ B5/B6/B7）· 合并 1（L10 并入 L8）⇒ 剩 10。**
>
> ⚠️ **剩下这 10 条里有 5 条的【射程或前提】被订正了**，⛔ 别照登记的字面动手：
> **L4** 射程缩一行（撞到 2026-09-14 owner 终裁，lab 零处知情）· **L22** 射程 **8 ⇒ 1**（7/8 早已跑过）·
> **L15** lab 自己的读数比登记严（「三件前置一件没做」）· **L14** 第一件是回写⛔ 不是上闸 ·
> **L13** 登记的「零调用方」已失效（且 DS 自己的头注释同样 stale）。
>
> ⚠️ **两轮都是零动手** —— 只跑五行块，按 owner 2026-09-14「做之前先审查」的口径先报。

> 🔴 **2026-09-14 计数订正（⛔ 两个数都错过，留痕不删）**：本节标称过 **21**、我随后按
> 「21 − L1 − L2」改成 **19** —— **两个都与本节表里的行数不符**。
> 程序化数（`grep` L 编号 + `sort -u`）：**L1–L24 = 24 行**，划掉 2 ⇒ **剩 22**。
> ⇒ 原始「21」从冻结时就偏低 3，而我**只做了减法、⛔ 没核分母**，把错继承了下来。
> ⚠️ §0 那句「归并后 = 本清单 §1 的条目数」去重的是**原始 27/11/26 那一层**，
> ⛔ 不是 L 编号这一层 ⇒ 两层不可互相印证（`AGENTS §2.4`：引用分母必须带口径名）。
> ⇒ **口径写死：本节条数 = 表里未划掉的 `L<N>` 行数**，⛔ 不由上一个标称数做加减得出。

**A. 登记面回改（最便宜，先做）**

| # | 事 | 出处 |
|:-:|---|---|
| ~~L1~~ | ~~**Q11 的账要销**~~ ⇒ ✅ **做完（2026-09-14）** | 改了 4 处：`:59` 末栏 · 「⛔ 不许说 Q5 闭合了」那段 · **Q11 整节**（标题 + 节首订正块 + 表里那个过期值 + 「刻意没进闸」那句 + 节末「⏳ 待拍」）· 变更日志「Q11 新立」行两栏。⚠️ **清单原记的行号 `:1102`/`:1567`/`:1612` 已漂**（`:1102` 现取是 R20 无闸那句、与 Q11 无关）⇒ 靠 grep 现取定位，⛔ 没照行号动手 |
| ~~L2~~ | ~~**Q6 三支的下场未回改**~~ ⇒ ✅ **做完（2026-09-14）** | 真实位置是 **`#### Q6 剩下三支` 那张表**（`wire-ci` / `wire-release` 两行的「⏳ owner」+ 节末「这是 owner 唯一真需要拍的一处」），⛔ **不是**清单记的 `:1586`/`:1588`（那两行是变更日志里的别的条目）|

**B. 取数 / 重取（状态已过期，要现取）**

| # | 事 | 出处 | **2026-09-15 现取**（⛔ 只跑了五行块前两行）|
|:-:|---|---|---|
| ~~L3~~ | ~~**归档分诊那张双栏表逐项重取**~~ | `proposals/2026-08-24-archive-triage.md:4`（未漂）| ✅ **销账（现取 DS `fe5555a3`）** —— 双栏表表体现取在 `:52`，**6 行全部是终态**（🔴 DS 裁定不做 ×4 · ✅ DS 已执行 ×1 · ⛔ 已作废 `lab:E33` ×1），⛔ 无一行挂着待执行动作。三处归档目录**亲验**：`_design-kickoffs` **0** · `_archive/_archive` **0** · `superpowers/plans` **37**（阳性对照 ⇒ 命令活着），与表里逐行吻合；DS 裁定块仍在原位（`audit-plan-lifecycle.mjs:137-138` 逐字「⇒ **重开条件**：…⛔「docs 树看起来乱」不构成重开条件」）。⚠️ **边界**：靠的是 6 行的**下场**，⛔ 没逐行重取各自出处的行号 |
| ~~L4~~ | ~~designqa 那张**逐条对位表重取**（15 条逐条核闸）~~ ⇒ ✅ **做完（2026-09-15）** | `proposals/2026-08-27-designqa-gate-gap.md:5`（未漂）| 🟡 **仍成立** —— 头栏 `:3` 逐字仍「⏳ **未重取**」。⚠️ **判定面已大移**：`covers-acceptance:` 自陈在 `8183a1c6` 上 **0 行**、在 `fe5555a3` 上 **53 行**（口径 = `scripts/` 下含该串的**行数**，⛔ 不是闸数）；棘轮 67 ⇒ **35** ⇒ 表里 `n_a=5 / n_b=8` 几乎必然过期。⛔ 但「过期」≠「对方没做」—— 那 15 次逐条核闸 lab 一次都没做。<br>**后三行（09-15）**：🟡 **仍该做，⛔ 但射程要缩一行**。① **判定面又涨了**：`audit-*.mjs` 从登记时的 68 道 ⇒ 现取 **81 道**（`scripts/` 口径）⇒ +13 道没进过这张表。② 🔴 **撞到一条 owner 终裁，lab 零处知情**（`lab:N54`）：`scripts/audit-mockup-geometry-consistency.mjs:137-138` **亲验**逐字「🔴 **2026-09-14 owner 终裁：rows 家族维持「默认不开」，28 条存量偏差不逐条判，`CANONICAL-F104` 的 backlog entry 已整条删档。⛔ 别再把它当待办重新提。**」，归因 `0f50fcf3`（2026-09-14 17:38:31）⇒ **表里第 4 行（rows R1/R2/R3 归 (e)）不能再按「有闸」重取**。③ lab 侧八个措辞变体全 0 命中（判否未加 `head`），而现存登记 `round2-status.md:2179` 恰恰是反的（「DS 没替 owner 裁」）⇒ **必须先回改登记面**<br>**✅ 做完（2026-09-15，lab 本轮）**：新量具 `metrics/acceptance-item-gate-recheck.mjs`（`--self-check` **EXIT=0 · 6 条控制全绿**）+ 新 pin `7161df26`（dirty=0）⇒ **15 条逐条重取，每条带闸源码行号 + 逐字**。**只有第 15 条改判**（(a) ⇒ **(e)**：`binding-fidelity:21` 逐字自认「「字段 parity 表 / 反馈类 inventory / 强调预算」**本闸都不管**」）⇒ **`n_a 5⇒4` · `n_b 8` 持平 · `n_c 0` 持平 · `n_e 2⇒3`**（⛔ 全档并排）。判定面 **68 ⇒ 81 道**（`scripts/` 口径）。**第 4 行按射程未重取**（owner 终裁）。回改三处：处方头栏「执行状态」⏳⇒✅ · §2 表第 15 行 · §2 计数段（原文留痕不删）；报告 `reports/2026-09-15-l4-designqa-pairing-recheck.md`。<br>⚠️ **③ 那条「必须先回改登记面」起手现取发现【已经做完了】** —— `round2-status.md` 的 2026-09-15 订正块已在位 ⇒ **五行块第五行（`lab:N56`「我自己是不是已经干过了」）当场省掉一次重做。** |
| ~~L5~~ | ~~**那 67 条逐条现状重跑量具**~~ ⇒ ✅ **做完（2026-09-15，lab `b13457f` 起）** | `proposals/2026-08-31-unclassified-67-fix-directions.md:5`（未漂）| ✅ **三条验收标准逐条达成**（⛔ 全部现取，不带管道读退出码）：① `--self-check` **EXIT=0 · 12 条控制全绿**（⛔ 不是处方原写的 11 条）② `unclassified` **67 ⇒ 43**（< 67 ✅）③ **下降的 24 条逐条可定位** —— `acceptance-coverage-diff` 的 `transitions` 里 `from=unclassified` 正好 24 条：**17 → gated · 7 → not-machine-checkable**，每条带 id。<br>✅ **diff 量具自己的 5 条控制全绿**，含守恒（`kept 36 + 迁移 14 + 位移 67 + 消失 9 = 126 = from 126`）· delta 对账逐位吻合 · 0 条虚报 · 自 diff 全空（阳性对照）。<br>✅ **两个口径的关系当场对上**：`narrow 134`（闸口径）· `wide 142`（lab 量具口径）· `blind 8` ⇒ **43 − 35 = 8 = blind**，⇒ 处方 `:383-384` 那句「67 → 35 ⛔ 不是同一口径的减法」**实测成立且差额有解释**。<br>⚠️ **诚实读数**：`blind` **before 8 → after 8 · fixed []** ⇒ **ACC_RE 盲区一条没修**。<br>产物：新 pin `d10e151b` + `subjects/…/acceptance-coverage-d10e151b.json` + `…/unclassified-fix-triage-d10e151b.json` + 三份报告。<br>~~⚪ 需深挖 —— 结构上跑不动~~ 〔原判读保留留痕〕：量具活着（旧 pin `b3728d38` ⇒ `EXIT=0` · 12 条控制全绿 · `{F1:57,F2:0,F4:10}` 求和 67），但 ① **无 pin 对应现 HEAD**（最新 pin `7fcca917` = 2026-09-01，DS 已到 09-15）② 🔴 **量具 `:238` 把 67 写死**（`mine.length === 67 && …`）⇒ 换 pin 当场炸（`19e55102` ⇒ `EXIT=1` · 3 条控制 ✗ · stderr 逐字「❌ 控制未全绿 ⇒ 本次读数不可解读」）⇒ 要跑得先**建 pin + 改量具**，⛔ 不是「跑一遍就完」。<br>**后三行（09-15）**：🟡 **仍该做**。前提完整成立（处方 `:383-384` 自己逐字把「逐条现状」与「棘轮总数」分开记过）；DS 侧**无裁定挡重跑** —— `backlog.md:698` INFRA-F142 那条 hold 逐字是「**这批没有截止压力也不该硬推**…⛔ **别为了把数字做小而批量灌豁免**」，管的是「别硬推 / 别重查某几段」，⛔ 不是「别重跑量具」。lab 登记面自洽、⛔ 无分叉。<br>⚠️ **动手前必须先改量具那条 `ids-frozen-67` 的口径**（「集合大小 = 67」→「与本次 dump 逐字相等」），否则一跑就 EXIT=1 —— **与 B5（原 L6）是同一条改动** |
| ~~L6~~ | ~~**复跑量具确认「没人管」条数下降**（`--self-check` 须全绿）~~ ⇒ 🔴 **挪进 §1.3 阻塞（B5）** | 同上 `:364`（未漂）| 🔴 **属阻碍（前件不可达）—— 验收标准与量具控制结构互斥**。验收标准在 **`:427`**（⚠️ 交接单记的 `:431` **已漂**）逐字「**11 条控制全绿**，且 `unclassified` 条数 **< 67**」；而量具 `metrics/unclassified-fix-triage.mjs:233-241` 的 `must-hit-1/ids-frozen-67` 判据是 `mine.length === 67 && …` ⇒ **`< 67` 一旦成立该控制必 false ⇒ 「全绿」不可达**。⚠️ **第二处塌**：验收标准写「**11 条**控制」，实测量具有 **12 条**（口径 = `id: '(must-hit\|must-not-hit)…'` 条目数，行号逐个在案）⇒ 连条数都对不上（`AGENTS` 第 29 条推论四）。<br>⚠️ **⛔ 阻碍在 lab 自己手上，⛔ 不在 DS** —— 解除动作是一条：把 `:427` 的验收标准与 `:238` 的控制口径**同批**改（「集合大小 = 67」→「与本次 dump 逐字相等」·「11 条」→「全部控制」），⛔ 别只改一半 |
| ~~L7~~ | ~~`wire-release` 的**唯一未知**：跑一次 Figma 侧闸（**4 份** payload）看有多少违例~~ ⇒ ✅ **销账（2026-09-15 第七轮）—— 那个读数回答不了那个问题；`wire-release` 并入 §1.3 B4** | ~~`decision-queue.md:1233`~~（🔴 **本轮现取又漂了**，`:1233` 已是无关行 ⇒ 真身 `:61` / `:1243`，靠 grep 定位）| 🔴 **标的不成立（读数定的，⛔ 不进 owner 队列）**：DS 真源 `scripts/lib/figma-env.mjs:48-51` 逐字「`FIGMA_FILE_KEY` = **唯一的设计系统库**…`figma-data/mockup/<key>.json` 下其余 key **一律是消费产品文件**，由 `--file <key>` **逐个传入、⛔ 不从环境变量来**」；5 份 payload **逐份实读 `file.name`** = Touch Screen / Micro Apps / TX-IP / Config T / TPC ⇒ **全是消费产品文件**，`.env` 的 fileKey **不在其中**（⛔ 未打印值，只比对文件在不在）⇒ `release.mjs`（唯一入口是环境变量）**结构上够不到它们**。<br>⇒ 按 owner 2026-09-11 拍定的射程（DS 库），**同一条闸的读数 lab 早已取过 = 629,268 条**（5 处登记在案）⇒ 「若零违例即 B 档直接落」**两条路都不成立**，根因与 `wire-ci` 是**同一条闸、同一个射程、同一堵墙**（缺增量触发机制）⇒ **并入 B4**。<br>🔴 **失守点是【箭头】⛔ 不是【口径】**（`AGENTS §3.16`）：本行原文写「⛔ 不能顶替本条的 payload fixture 口径」——**那句是对的**，但它停在「口径不同」，没再问一句「payload fixture 口径回答的是 `wire-release` 的问题吗」。<br>✅ **顺带定案一处登记面自相矛盾**（本行原登记为「⛔ 未定案」）：`:129` vs `:61` 是**时间线差**（09-07 判断被 09-11 复核覆盖），⛔ 不是两处并存的真源；且 `:129` 的立论「`release.mjs` 无任何依赖 Figma 凭据的步骤」**现取已不成立**（`:166`/`:170` step 1e 要凭据，但是 non-blocking observer）⇒ 已就地标注，原文留痕。<br>**产物**：报告 [`reports/2026-09-15-l7-wire-release-reading-target.md`](../reports/2026-09-15-l7-wire-release-reading-target.md) · 回改 4 处（本行 · B4 · `decision-queue:61` `:129` `:1243`）<br>〔以下原判读留痕，⛔ 不删〕🟡 **仍成立** —— 该读数无人取过（`release.mjs` 至今未挂该闸：`grep -qiE 'mockup-conformance'` ⇒ `exit=1` 真零命中）。⚠️ **登记里的「4 份」已过期 ⇒ 现为 5 份**（合计约 1 GB，全部 gitignored）；⛔ 未证差因（新增 vs 当时数错）。⚠️ 另有一个 **629,268 条**的违例读数属 `wire-ci` **整库全扫**口径，⛔ 不能顶替本条的 payload fixture 口径。<br>**后三行（09-15）**：🟡 **仍该做**（读数可取、未取，且没有裁定挡「取读数」这个动作）。三条立项依据逐字全部成立（软/硬两档已在 `audit-mockup-conformance.mjs:296`/`:530`；owner 本机 `.env` 两个 key 各 1 行；`release.mjs` 未挂）。<br>⚠️ **但有一条裁定要先回改进 L7 的登记面**：`audit-mockup-conformance.mjs:7-9` 逐字「⛔ 刻意**不**进 `prepublishOnly`、也不挂 `.husky/pre-commit`：两处都给不出「当前该审哪个产品文件」这个输入…它们是**消费侧按需闸**，不是仓库侧提交闸」—— **具名挂点⛔ 不含 `release.mjs`**，但那句**理由**与**泛化**都覆盖得到它 ⇒ 它决定「读数取完之后那个『若零违例即 B 档直接落』还成不成立」。**⛔ lab 不代裁，只交出这个差。**<br>⚠️ **另一处 lab 登记面自相矛盾（⛔ 未定案）**：`decision-queue.md:129` 逐字「`wire-release` 判**留给 owner 是对的**」vs `:61` 逐字「2026-09-11 **撤出队列 → 转 agent 的活**」|

**C. 补闸 / 补测试 / 补判据**

| # | 事 | 出处 | **2026-09-15 现取**（⛔ 只跑了五行块前两行）|
|:-:|---|---|---|
| ~~L8~~ | 绿档 WARN 处方**剩 3 条** ⇒ ✅ **做完（2026-09-15）—— 处方 6/6 全部执行完毕** | `proposals/2026-09-14-green-warn-coverage-gap.md:16` | 🟡 **仍成立，⛔ 但前提已被处方自己改判**。三条确实一条没补（`tests/` 下阳性对照命中已执行的 3 条 `-cli.test.ts`；剩余三条只命中 `tests/mockup-binding-fidelity.test.ts` 一个且**非 `-cli` 形态**、其中 `403` 断言真零命中）。🔴 处方 `:17-21` 已逐字登记「剩下这 3 条**落在同一个命题里** —— 补哪条都**不改变任何闸的自动覆盖读数**…**⛔ 这不是「不该补」，是排序的前提变了**」⇒ **判「还该不该做」的材料已在处方里**，等 owner 或一次深挖。<br>**后三行（09-15）**：🟡 **仍该做**。三个前件逐个现取全部成立（三条 WARN 通路逐字仍在；`tests/` 面四个措辞各 0 行、阳性对照 46/32/11 行 ⇒ 判定面非空）；「无自动执行点」这一半**还加强了** —— `audit:mockup-colors` 这个 npm key **在 `package.json` 里根本不存在**（阳性对照 `audit:mockup-binding-fidelity` 在 `:130`）。DS 侧**零裁定**（措辞集跑完未截断）。⇒ 处方那句改判**只削弱排序理由，⛔ 没构成「不该做」** —— 它自己 `:20` 逐字也是这么写的。<br>⚠️ **第三条通路 = 原 L10，已并入本条**（同一个标的被登记了两次）<br>✅ **做完（2026-09-15）—— 三条通路各一个 commit（处方逐字要求⛔ 一条一个）**：`audit-mockup-colors` ⇒ DS **`774608ee`**（3 用例）· `audit-mockup-binding-fidelity` ⇒ DS **`8b57a4c2`**（3 用例 · 棘轮 **37→36**）· `export-claude-design-bundle` ⇒ DS **`7161df26`**（2 用例 · 不是闸 ⇒ 棘轮不动）。<br>✅ **每条都造故障两臂**（注入 `console.warn = () => {}` ⇒ 各自全红；干净对照臂 ⇒ 全绿）；还原走 `cp`+`cmp`，字节一致、零残留 marker。<br>🔴 **装置是新的**：`NODE_OPTIONS=--import <stub>` 覆写 `globalThis.fetch`，**零改动被测对象**（闸的 API 基址是写死常量、不可参数化，而 `INFRA-F138` 封死了改活闸那条路）⇒ 共享 harness `runGate` 加了**可选第 4 参 `env`**，不传时行为一字不变（35 份既有用户零影响），⛔ 没自建第四份 spawn。<br>🔴 **「stub 没生效」会造成整组假绿，已内建反制**：stub 不加载时闸会拿假 token 打真 API，**而真 API 对无效 token 同样返回 403** ⇒ WARN 照样打。⇒ 每份新面都断言一个**哨兵值**（本文件编的 nodeId / 变量名 / 确定条数），真 API 不可能返回。<br>⚠️ **`export-claude-design-bundle` 的 fixture 成本实测**（处方登记的未答项，本次答了）：要 **git 仓 + 20 个必需项**（19 文件 + 1 整目录），比同族贵一个数量级；其中 14 个由被测脚本自己 `export` 的 `REFERENCE_DOCS` 动态取 ⇒ 可维护。6 条 warnings 只覆盖 4 条，另两条已登记为边界 |
| ~~L9~~ | 🔴 **引擎 `audit-mockup-conformance.mjs:450` 那条新缺口**（要先换判据）⇒ ✅ **做完（2026-09-15，DS `52022864`）** | `review.md:6607`（未漂）| 🟡 **仍成立** —— `:450`@`fe5555a3` 逐字仍是 `process.stderr.write('Warning: /variables/local 403…依赖变量名的判据会 under-report\n')`；该文件自 09-13 起 **0 个 commit**；`tests/` 面 `under-report` 真零命中（阳性对照 `conformance` ⇒ 46 行 ⇒ 判定面非空）。⚠️ **边界**：这是**静态下界**，而 `review.md:6597` 自己逐字警告「判『有没有人守』**只认造故障**」⇒ ⛔ 别把这个静态 0 当结论。<br>**后三行（09-15）**：🟡 **仍该做，且比 L8 剩余两条重**。🔴 **新读数给了机制依据**：这条 WARN 与 L8 那两条**不在同一个挂载档上** —— `audit-mockup-conformance.mjs:3-6` 逐字「**L4 = .claude/hooks/post-figma-write.sh**（PostToolUse hook：每次 use_figma **写**操作后自动在后台跑一次本引擎…**这是本族闸历史上第一个自动执行点**）」，真调用在 `post-figma-write.sh:132` ⇒ **L8 那两条确实无自动执行点，而这条有**。DS 侧对这条 403 WARN **零裁定**（该文件 6 处 `刻意` 全是别的判定）。lab 登记面 ⛔ 无分叉。<br>✅ **做完（2026-09-15，DS `52022864`）—— `tests/audit-mockup-conformance-cli.test.ts` 3 用例 · 棘轮 `BASELINE` 36 → 35**（归因两臂：新面在 35 / 移开 36）。<br>🔴 **「先换判据」这句是对的，且原判据的无效是【结构性】的**：引擎的 `console.warn` 计数是 **0**，两处承载物是 `process.stderr.write`（不走 console）与规则模块返回的**结构化 `unverified` 字段**（根本不是发射）。换判据后实测 **此前两处都零人守**（各自注入 + 全量 ⇒ 3526 passed / **0 failed**）。<br>⚠️ **那个 `0` 有阳性对照撑着，⛔ 不是「装置坏了」的 0**（`AGENTS §2.15`）：fixture 里跑引擎三臂，两个量读数互不相同且**正交** —— 原样 `1/6` · 摘 `stderr.write` **`0/6`** · `unverified` 恒 null **`1/3`**。<br>✅ **造故障两臂同样正交**：摘 `stderr.write` ⇒ **只 D1 红** · `unverified` 恒 null ⇒ **只 D2 红** · 干净臂 ⇒ 3 passed ⇒ 两条判据各守各的。<br>⚠️ **登记的边界**：只钉 `colors` 这一条规则的 `unverified`；同批实测摘掉它后 stdout 里**仍有 3 处** under-report 字样来自别的规则模块 ⇒ **那几处本面看不见** |
| ~~L10~~ | ~~`export-claude-design-bundle` 的 **fixture 成本实测**~~ ⇒ ✅ **并入 L8（2026-09-15 第二轮）—— 登记面重复，⛔ 不是两件活** | `review.md:6428-6429`（未漂）| 🔴 **同一个标的登记了两次**：处方 `2026-09-14-green-warn-coverage-gap.md:105` 逐字「这一点与 `export-claude-design-bundle`（**整个不是闸**）**落在同一个命题里**」，而 `review.md:6428` 与本行各记了一遍 ⇒ 合并后按 **L8 的第三条通路**走。<br>✅ **顺带把「它不是闸」从自称升成口径证据**：npm key 是 `package.json:186` `"export:claude-design-bundle"` ⇒ **`export:` 前缀**，既不进元闸的 `PREFIXES`（文件名闭集 `audit-`/`smoke-`/`check-`）、也不进 `GATE_KEY_RE`（`gate-regression-face-inventory.mjs:106`）⇒ **两个口径都收不到它**。<br>⚠️ 它在 `.husky/pre-commit:277` 出现的是**触发条件里的文件名**（改了它就跑 `audit:reference-numbering`），⛔ 不是挂载它自己 |
| ~~L11~~ | ~~**几何闸 A：按 `WxH` 分组**~~ | `proposals/2026-08-27-geometry-gate-denominator-defects.md:13`（未漂）| ✅ **销账 —— DS 已裁定不做** —— 代码确实没改（`audit-mockup-geometry-consistency.mjs:366`@`fe5555a3` 仍是 `WxH` 键），⛔ 但 DS **三处逐字**把它登记成设计立场：源码 `:342` 亲验逐字「⛔ The grouping key is **DELIBERATELY unchanged** (still `WxH`)… it belongs to the **owner**」· 测试 `tests/audit-mockup-geometry-consistency.test.ts:151` 亲验钉住当前答案（`different-size frames are not state variants`）· 归因 `6a1f91c4` 正文逐字「⛔ 分组键**未改**…不在本次范围」。⇒ §0.1 铁律 3「owner 裁定不做」= 阻碍 ⇒ **销 lab 的账**。🔴 **⛔ 但这不是「问题没了」** —— 它变成一条**等 owner 拍的设计立场**（同一族问题就在 O1 隔壁）；⛔ 本格不替 owner 排期 |
| ~~L12~~ | ~~**几何闸 B：`scanned` 计数器纪律只守了一半**~~ | 同上 `:15`（未漂）| ✅ **销账 —— 已由 DS `6a1f91c4` 执行** —— **亲验**：`controlScanned` 在 `fe5555a3` 上 **2 次命中**、在 `7fcca917` 上不在 ⇒ 引入点已夹定；归因 commit 逐字 `fix(geometry-gate): 三处「从没看」被印成「扫了零个」的地方补齐`；打印侧现取 `if (probeKeys.some(k => !ROW_PROBES.includes(k)))` ⇒ `--family rows` 跑法**不再无条件打印**那两个计数。🔴 **为什么 2026-09-11 那次重取没看见**：那次的判据**定位在注释上**，而注释讲的是 rows 那一半、**一直为真** ⇒ 结构性看不见这次修复 —— `AGENTS §29` 推论八「定位面选窄」的又一实例 |
| ~~L13~~ | ~~`#M23.18` **接闸** + 两个前置（卡识别收窄 · 兜底循环自证）~~ ⇒ 🔴 **挪进 §1.3 阻塞（B8）—— 标的不成立（2026-09-15 第六轮）** | `decision-queue.md:376` `:484`（旧 `:348` `:357` `:465` **已漂**）| 🔴 **2026-09-15 第六轮五行块第四行当场翻掉本条：按登记的字面做 = 造一条假绿。** 现取 @ pin `7161df26`（dirty=0）：① **闸判 `gated` 纯靠自陈** —— `audit-acceptance-gate-coverage.mjs:15-16` 逐字「⛔ 本闸**不判**某条 Acceptance 该不该有闸 —— 那是语义判断」；② **该验收项的被测物不落仓库** —— `mockup-conventions.md:1023` 逐字「起手 **M48 self-check 清单**必含一行「…画布主题探测结果 = …」」，而 M48 是起手 Gate（`design-process.md:342`）、产物落**对话 / Figma 侧**；③ **两个前置判的是另一件事** —— 卡识别 / 兜底产品 frame 是 payload 侧判**规则正文的语义**，⛔ 不是验收项要求的「那句声明有没有写进起手清单」。<br>✅ **两臂坐实**（用闸自己的导出纯函数 `classify`，**零改动被测对象**、pin 收尾 dirty=0 已核）：臂 A 对照 ⇒ `unclassified` · counts 35；臂 B 注入**一行**自陈 `[0]` ⇒ **`gated`** · counts **34**。而该段 `Σ核查项 = 0` ⇒ `[0]` 的 S4 对位**恒过**（`0===0`）⇒ **写一行自陈棘轮就降 1，闸不会核那条自陈背后的判据判的是不是验收项要的东西**（`lab:N63` 推论七形态）。<br>✅ **09-08 lab 自己早已判对，只是登记面分叉**（`lab:N56`，量在 HEAD `92a0873` 导出面）：写「接闸是 agent 的活」**2 处**（`decision-queue.md:54` `:484`）· 写「判定面是 X 不落盘 ⇒ 分支 nmc」**4 处 / 3 份文件**（`2026-09-08-q1-b3-denominator-readings.md:17` `:25` · `…-48-classification.md:212` · `decision-queue.md:1676`）。⚠️ 🔴 **`:484` 正是我上一轮（第五轮）刚订正过的行** —— 订正了「零调用方」、**没核验收项的判定面** ⇒ `lab:N54`（事实全读对，存在理由已不成立）。<br>✅ **复核 09-08 那三条读数在本 pin 上全部仍成立**（判否类 grep，⛔ 未加 `head`/`-m`）：`M48 Rule-Coverage\|Rule-Coverage Self-Check` 在 `scripts .husky .gitea` **EXIT=1 零命中**（阳性对照 `handoff-deliverable-sections` **15 行** ⇒ 判定面非空）· `画布主题探测结果` 全仓**只命中规则自己那一行**。<br>🔴 **新读数（交给 owner 的材料，⛔ lab 不裁）**：豁免表 `acceptance-not-machine-checkable.json` 现有 **35 条**（段级 **34** · 文件级 **1**），其中 **19 条**段级的 `reason` 理由与本段**同型**（被测物落对话 / Figma / 非本仓 ⇒ 仓库侧零对象），逐字先例如 `code-conventions.md#R10`「被测物是对话行为与 AI response，仓库侧零对象」· `#R-DISCIPLINE`「被测物是 **AI 的对话 transcript 与 todo 状态**…仓库里不存在」。<br>⛔ **⛔ lab 不裁走哪条路**（`AGENTS §2.21`：可实测事实 lab 判、应然 lab 不裁）—— 三条出路各自动的东西不同：**(a)** 判 nmc 写进豁免表（动棘轮基线 = C4）· **(b)** 按 `#Canonical` 先例**降级规则**（owner 09-09 对同批另一半的处置逐字「删掉，并进已有那条」）· **(c)** 改 Acceptance 措辞让它落到可机检对象（owner 的措辞决定）。⚠️ 且 09-08 lab 已登记「分支 nmc（**登记属 C4 ⇒ owner**）」，Q1-d 提给 owner 时他的逐字是**质疑**「第二个确定有必要做吗」，⛔ **不是批准**。<br>〔原判读留痕，⛔ 不删〕⚪ **需深挖 —— 前提变了一半**。🔴 登记里那句「判据**零调用方**」**已不成立**：`detect-frame-theme.mjs` 现取 **3 个调用方**（`audit-mockup-variant-axis.mjs` · `mockup-rules/variant-axis.mjs` · 自身）。⛔ **但接的是另一条规则**（§M-VARIANT-AXIS ②，且 **report-only** ⛔ 不进 `exitCode`）；`#M23.18` **自己仍未接闸** —— 亲验 covers 自陈只有 `#M23.18.1`（`audit-mockup-colors.mjs:45`）与 `#M23.18.2`（`audit-mockup-default-white-bg.mjs:38`）两个**子号**，⛔ 无 `#M23.18` 本身；棘轮仍 **35**，⛔ 未降到登记预测的 34。⚠️ 两个前置的落地痕迹**未穷举**。<br>**后三行（09-15）**：🟡 **仍该做**（**实跑**该闸 `--json` 坐实：`{"id":"…#M23.18","line":1023,"state":"unclassified","items":0}`，而 `.1`/`.2` 已 `gated`；counts `gated 47 · nmc 51 · unclassified 35` 持平 ⇒ **预测 35→34 成立**；`#M23.18` 也不在豁免表里）。两个前置**仍成立**（卡识别仍只有图层名一条信号；payload 仍不进 git）。DS 对 `#M23.18` **本身零裁定**。<br>⚠️ **两条订正要回改**：① 登记的「**零调用方**」失效（真调用点 `mockup-rules/variant-axis.mjs:21` + `:66`）—— 🔴 **DS 自己的头注释也 stale**：`scripts/lib/detect-frame-theme.mjs:3` 逐字仍写「本模块目前**没有任何调用方**（刻意）」，而同仓 `backlog.md:47` 早已把那行划掉；② `items: 0` 意味着补自陈会落进「**散文形态 `[0]`**」那一档（`AGENTS §29` 推论九），自陈时要写明。<br>⚠️ **同族有一条已落的裁定，⛔ 别外推**：`backlog.md:48` 的「不升成阻塞」管的是 **§M-VARIANT-AXIS ②**，⛔ 不是 `#M23.18` |
| ~~L14~~ | ~~**1b 上闸**（判据形态已自拍，落地未做）~~ ⇒ ✅ **做完（2026-09-15 第七轮，DS `12dda7c1`）** | `decision-queue.md:56` `:437` `:485`（旧 `:430` `:466` **已漂**）| ✅ **owner 当场拍两问后落地**（⛔ lab 不裁，只摊原文 + 并列出路 + 一条推荐）。🔴 **登记那句「判据形态已自拍」把两件事压成了一件**：09-11 自拍的是「**要不要有**固定写法」，⛔ 不是「写法是什么」—— 后者**谁都没拍过**。<br>**owner 2026-09-15 拍：① 他亲自拍「要」**（⇒ 真源那句「owner 决定，⛔ agent 不自拍」**被满足、⛔ 不是被推翻** ⇒ **⛔ 不留下「agent 可自拍真源格式」的先例**）**② 形态 = 单段·扫描面**（首个 `>` 块必须有 `**扫描面**：`；未采纳两段式与双语标签 —— 理由取自 Acceptance 原文：它**只要一样东西**「扫了哪些对象」，且 8 份标题全中文 ⇒ 双语分支零信息）。<br>**落地**：新闸 `scripts/audit-report-scope-declaration.mjs`（⛔ 不用关键词匹配 —— 真源逐字给过假阳实例）· 挂载 **L4 pre-commit + L5 `pr-checks.yml`** · 存量 **8 份全部补齐**（每行逐字取自该报告自己的正文）· 整脚本回归面 **14 条** · `BASELINE_UNCLASSIFIED` **33 → 32** · 真源回写 2 处。<br>🔴 **部分覆盖，⛔ 不是「这一段守住了」**：该段 **8 条核查项**只覆盖 **1b**；**(1a) 结构性无闸**，其余 6 条无判据 ⇒ 自陈**刻意省 `[N]`**（先例 `#M41`+`#M12`）。**这条边界写在三处**（闸头注释 · acceptance 闸基线注释 · 规则真源），⛔ 不是只写报告。⚠️ **与本轮 L15 那个假绿的差别在【有效分母】**：L15 是 0（恒绿零牙），本闸是 **8 且真红过**。<br>✅ **造故障两组各三臂**：测试面 **正交**（摘接线⇒只 C 组 3 红 · 空集当合规⇒只 E 组 2 红 · 射程放宽⇒A 组 2+C 组 1；对照 14 passed）· 棘轮归因 **互不相同**（对照 EXIT=0/32 · 摘自陈 ⇒ `[S2] 33>32` EXIT=1 · 撤一份声明 ⇒ 新闸 EXIT=1）。还原走 `cp`+`cmp`，字节一致、零残留 marker。<br>🔴 **本格踩的一条（留痕，已写进闸头注释）**：初版只挂 L4，全量当场红 1 条 —— `audit:gate-ci-parity` 差集 = 1。**「刻意不进 `gate-chain`」⛔ 不蕴含「不用进 CI」**，那是两个挂载层，我没核这个箭头（`AGENTS §3.16`）⇒ 按闸给的默认修法接线 + 同步改头注释自声明，⛔ 没绕过、⛔ 没进 `STRUCTURAL_L4_ONLY`。✅ 是**闸自己抓到的**，⛔ 不靠我警觉。<br>**全量 vitest 3568 passed / 0 failed**（total **3582**，与注入前同值 ⇒ ⛔ 无整文件未被收集）。<br>**产物**：报告 [`reports/2026-09-15-l14-discipline-scope-1b-gate.md`](../reports/2026-09-15-l14-discipline-scope-1b-gate.md)<br>〔以下原判读留痕，⛔ 不删〕🟡 **仍成立** —— 射程分母对得上（`docs/internal/_reports/*.md` = **8**）；**无闸**（`covers-acceptance:.*DISCIPLINE.SCOPE` 真零命中；全仓 32 处 `M-DISCIPLINE.SCOPE` 全是引用）；DS 真源 `mockup-conventions.md:3608` 仍是**未勾选**复选框、逐字「⚠️ **判据形态未定，现在没有闸**」。🔴 **附带撞到一处两侧措辞冲突**（⛔ 不排期，已登记 §3）。<br>**后三行（09-15）**：🟡 **仍该做，⛔ 但第一件是回写、不是上闸**。🔴 **那处措辞冲突的成因是【时间线】，⛔ 不是越权**：`git blame -L 3626,3634 499d32e2` ⇒ DS 那句「owner 决定，⛔ agent 不自拍」整块来自 **`806a0a40`（2026-09-09 18:18）**，而 lab `decision-queue.md:56` 记的自拍时点是 **2026-09-11 17:2x**（owner 逐字反问「待拍的你不能给我拍吗」后）⇒ **DS 那句写在自拍之前 2 天**，自拍之后该块**一个字节没动**。⛔ **lab 不裁自拍是否越权**，两边原文与时点在此。<br>🔴 **`lab:N56` 三处分叉**：DS `:3633` 旧态 · lab `review.md:383-384` 旧态 · lab `queue:56` 新态 ⇒ 新态既没回改 DS、也没回改 lab 自己那处。且 DS 全仓 `固定写法` **仅 1 行** ⇒ **09-11 的裁定在 DS 侧零处登记**。<br>⚠️ 按 DS 侧字面前置未解除（`:3634` 逐字「在该形态拍定之前，**本段整体仍是 `unclassified`**…⛔ 别把「拆完了」读成「上闸了」」）⇒ **不回写，下一个读 DS 的人会照 `:3633` 再退回「等 owner」** |
| ~~L15~~ | ~~**B2 余 33 段**建判据（下一批抓手 `#M38`，分母 377 · 存量 0）~~ ⇒ 🔴 **挪进 §1.3 阻塞（B9）—— 标的不成立（2026-09-15 第七轮）** | `decision-queue.md:479`（旧 `:460` **已漂**）| 🔴 **三件前置做完 ⇒ 09-09 那三条立项依据一条不剩，详见 §1.3 B9 与报告。⛔ 别再照本行开工。**〔以下原判读留痕，⛔ 不删〕🟡 **仍成立** —— 判据一行都还没写：`covers-acceptance:.*M38` 与 `strokeLeftWeight` **两个都是真零命中**（不带管道）；`scripts/mockup-rules/` 下 17 个规则模块无 rail 相关；棘轮 **35** 与登记的「35 ← 现状」逐位相同 ⇒ **自 2026-09-09 起这条线一格未动**。<br>**后三行（09-15）**：🟡 **仍该做，⛔ 但必须先回改登记 —— lab 自己的读数比登记严得多**（`lab:N56`）。🔴 `docs/2026-09-09-q1-b2-remaining-33-stock-readings.md:148` **亲验**逐字「**⛔ 不许说「`#M38` 已确认可落」—— §3 那三件前置一件都还没做。**」三件是 `:131-137`（① 回活源核判据串 —— 那个 `/selected/i.test(name)` **是探针形态** ② 先量「3 层」另两层的分母，⛔ 别把「rail 合规」说成「M38 合规」 ③ **违例 0 是零信息的绿**，自陈里必须写明）；`decision-queue.md:1665` 逐字「**只量、零上闸** —— 连挑三段全落不了，而**三段撞的是同两堵墙** ⇒ 那是结构性约束、不是运气」。<br>⇒ 而本行只写「分母 377 · 存量 0」，**读起来像即刻可落** ⇒ **不回改，下一格会照它直接动手**。<br>✅ 顺带：**实跑**得 `#M38` = `{"line":2559,"state":"unclassified","items":5}` ⇒ 抓手本体在位且**有 5 条核查项**（比 `#M23.18` 的 0 条好落）；DS 侧零裁定、backlog 零 entry ⇒ 这条完全活在 lab 侧 |
| ~~L16~~ | ~~`5b` 把 npm key 改成非闸前缀（`report:`）+ 重量闸清单与棘轮~~ ⇒ 🔴 **挪进 §1.3 阻塞（B6）** | `decision-queue.md:64`（未漂）| 🔴 **属阻碍 —— ⛔ 不是「做不动」，是【登记的修法达不到它声称的目的】**。<br>🔴 **亲验推翻了 DS 自己写的那条「正解」**：`scripts/audit-gate-mount-declaration.mjs:174` 逐字「只因有 `audit:` 前缀的 **npm key** 才落进扫描面」—— **与它自己的代码不符**。该闸的扫描面实为 `SCAN_DIRS = ['scripts','figma-sync']`（`:71`）× `PREFIXES = ['audit-','smoke-','check-']`（`:83`），落地 `:281` `.filter(f => f.endsWith('.mjs') && PREFIXES.some(p => f.startsWith(p)))` ⇒ **收的是文件名前缀**。而标的文件名 `figma-sync/audit-component-attributes.mjs` **以 `audit-` 开头** ⇒ **改 npm key 完全不会把它移出扫描面**，它仍得留在 `KNOWN_SILENT`。<br>⚠️ **代价栏还一错一漏**：① 登记说会改「棘轮 BASELINE」—— **错**，该行实测 `blocking:false`（`report:gate-regression-face --json`），而棘轮判据是 `blocking === true 且 face ∉ {E,E-fx}`（`audit-gate-regression-ratchet.mjs:24`）⇒ **它从来不计入棘轮**；② **漏登记**：`tests/gate-regression-face-inventory.test.ts:183` 把该路径**写死**在 must-not-hit 表里 ⇒ 行一掉出清单**那条测试当场红**。<br>⇒ **先把这三条订正回写进 `decision-queue.md:64`，再重新定它要不要做。⛔ lab 不替 DS 选修法**（改文件名 / 只改 key 并同批改测试，两条都给得出）|
| ~~L17~~ | ~~**mockup 族的 `.githooks` 投放**~~ | `decision-queue.md:625`（旧 `:606` **已漂**）| ✅ **销账（2026-09-15 后三行）—— 载体选错了，而真问题已闭合** —— 🔴 **前提「mockup 族无消费侧执行点」不成立**：DS `backlog.md:138` 亲验逐字「**✅ 已闭合**…**B2** consumer 侧 `templates/audit-mockup-workflow.yml`」⇒ **mockup 族的消费侧执行点走的是 CI workflow 模板，⛔ 不是 `.githooks`**，且理由是结构性的（`templates/audit-mockup-workflow.yml:16-19` 逐字「它要 Figma REST token **加**一个具体 fileKey，而 DS 仓的 pre-commit / prepublishOnly / CI 三处都给不出…**consumer 仓能给**」）。⇒ 「往 `.githooks` 投放」这个**载体从来没有任何一侧拍过**。<br>✅ **顺带证实 lab `:628` 那条区分是对的**：owner 的「不装」裁定**主语是消费仓 `TVU Pack`**（F62 spec 裁定表第 5 行亲验逐字「⛔ **不装 `.githooks` 到 `TVU Pack`**」）= **启用**，⛔ 不覆盖 DS 侧模板目录的**投放**。<br>⚠️ **销的是「投放」这一格**；「某个消费仓有没有真去 copy 那份 workflow」= 启用，⛔ 不在判定面内、⛔ 别一起销 |
| ~~L18~~ | `audit:rule-number-collision` 的 **S1–S4 单测** | `decision-queue.md:1549`（旧 `:1523` **已漂**）| 🟡 **仍成立** —— 测试文件 `tests/audit-rule-number-collision.test.ts` 共 **13 条**（口径 = `^\s*(it\|test)\(` 静态字面数，**并已程序化排除表驱动展开**：`for(`/`forEach`/`of [` 在该文件零命中 ⇒ 静态数 = 运行时数；⛔ 未实跑 vitest）；S1/S2/S4 的命中**全在注释里**、⛔ 无一条是断言。🔴 **DS 自己在 `:13-14` 逐字登记了这条缺口**（「⛔ S1–S4 …仍无单测…别把本文件读成「这条闸有测试了」」）⇒ 这是**对方已如实登记边界**，⛔ 不是「对方已做」。<br>**后三行（09-15）**：🟡 **仍该做，前提完全成立且有结构性证据**。🔴 **比数 `it(` 强的那条**：该测试 `:16-20` 只 import 三个符号，而闸 `scripts/audit-rule-number-collision.mjs` 全文 `^export ` **只有 2 个**（`:195` `:226`）**正是 S5/S6**；**S1–S4 全在 `main()` 里、零导出** ⇒ 按符号导入**结构上够不到**。阻碍现取仍在（`:150` `REMOTE_REF = 'origin/master'`、`:246` `--require-remote`），且 DS `tests/` 全仓**没有任何一处造过 git remote** ⇒ 没有可抄的范式。<br>🔴 **但「属独立提案」那句是空指针** —— DS `backlog.md` 上 `rule-number-collision` / `rule-number` **0 命中**（阳性对照同文件 `audit-` **73 行** ⇒ 判定面非空）；全仓 43 行提及**无一条是立项 entry** ⇒ **提案不存在**。⇒ 登记要改成「**提案未立，两侧 backlog 零命中**」，⛔ 别让下一格去找一条不存在的 entry（`lab:N62` 推论四形态）。<br>✅ **做完（2026-09-15，DS `cc361d4b`）—— 新建整脚本回归面 `tests/audit-rule-number-collision-cli.test.ts`（10 条用例）**。🔴 **真正的成因是【形态】⛔ 不是「难」**：S1–S4 全在 `main()` 里零导出 ⇒ 旧那份按符号 import 的测试**结构上够不到**；fixture 自带**本地 bare repo** 当 `origin/master`（DS `tests/` 此前零处造过 remote，范式是新写的）。<br>✅ **四臂造故障实测**（⛔ 不是「跑一遍绿就算验证」）：拆 S1 ⇒ **2 failed** · 拆 S2 ⇒ **2 failed** · 拆 S3 ⇒ **1 failed** · 拆 S4 ⇒ **1 failed** · 干净对照臂 ⇒ **10 passed** ⇒ **判别器成立**。还原走 `cp`+`cmp`（⛔ 不用 `git checkout --`，那会冲掉并行 session 的改动），字节一致、工作树无残留。<br>🔴 **造故障当场抓到我自己写的一条假绿**：S1 那条初版断言 `toBe(1)` + `toContain(号)` + 宽正则 `/S1|…/`，而我构造的场景**同时满足 S5** ⇒ 把 `collisions.push` 整条拆掉后**测试照样绿**。⇒ 改成钉死 `✗ FAIL（S1）` 精确文案 + 加一条 `--json` 断言 S1/S5 分工。**教训已写进那条用例的注释。**<br>🎉 **本轮第一次让标准 ① 的读数真的动了**：`audit-gate-regression-ratchet` 的 `BASELINE` **38 ⇒ 37**（该闸 `face` 由非 E 变 `E-fx`）。**归因两臂照惯例测过**：新测试**移开** ⇒ 现取 38 PASS · **放回** ⇒ 现取 37 ⇒ 这 −1 由这一条承载，⛔ 不是别的改动顺带的、⛔ 也不是靠改判据或塞豁免做绿。<br>✅ 同批订正旧测试 `:13-14` 那条登记（⛔ 划掉留痕不删），并纠正「属独立提案」—— **那个提案不存在** |
| ~~L19~~ | ~~**4 周止损引信**机制未落~~ | `review.md:221`（未漂）| ✅ **销账（2026-09-15 后三行）—— 三条独立理由** —— ① 🔴 **前件在立规当天就已自标不成立**：登记原句的**下一行** `review.md:222` 逐字「⚠️ 更正它的前件 —— 09-09 当天 DS 实际合并 **13 个 commit**…⇒ 「发现不落地」目前**不是**失效模式」；09-15 复核仍不成立（DS 自 09-08 起 109 个 commit · `origin/master..master` = 0 · 09-14 当日执行 lab 处方 3 条）。② **到期日在本轮射程外**：立规 `e18f9a6` = 2026-09-09 17:06 ⇒ 到期 **2026-10-07**，还差 22 天 ⇒ 即便落了也一次都不会触发。③ 🔴 **它要提供的那个判断标准已被 owner 2026-09-14 换掉**（`AGENTS §0.2` 两条标准 + `§0.1`「清单清零 = 这条线结束」）⇒ **⛔ 不需要第二套**。<br>⚠️ **附带**：lab 全树 `止损` 仅 2 行 ⇒ **「冻结成只跑 sweep」这个动作连规格都没定义过** —— 这条待办从来没有可执行的内容 |
| ~~L20~~ | ~~**`INFRA-F146` ② 两臂造故障**~~ | `review.md:717`（未漂）| ✅ **销账 —— 同格已做，登记面没跟着改** —— `:717` 那一栏的两个理由（「② 两臂造故障」+「接线本轮未做」）都被**同一份文件**的 §10.4.1 消掉：`:632` 标题亲验逐字「② **已接线**（DS `5d1116f8`）—— report-only，**三臂实测**」，`:646-652` 三臂表（故障臂 mismatches **1** / 对照臂 **0** / unknown 臂 unverified **1**），`:654` 逐字「⇒ 三臂读数**互不相同** ⇒ **判别器成立，⛔ 不是恒红也不是恒绿**」；DS `backlog.md:30` 亲验独立复述「🟢 2026-09-10 已接线（report-only）…工程部分闭合」；归因 `5d1116f8` **就是** `:717` 那格自己报的「止」commit ⇒ `lab:N56`（知情面与登记面分叉）。⚠️ **词义边界**：「两臂造故障」在 `:717` 上**没有定义**，对位靠「三臂 ⊃ 故障臂 + 对照臂」这个解释；⛔ 若当初指的是**闸脚本级**的整脚本回归两臂，则此销账不成立 |
| ~~L21~~ | ~~**Q8 附带那条 A 档一行改动**（裸号 → `#slug` 锚点）~~ | `decision-queue.md:1425-1426`（旧 `:1398` **已漂**）| ✅ **销账 —— DS 已改** —— 标的行号已漂（`code-conventions.md:1619` 现取是 Truncation detection 一节、⛔ 与 M-DISCIPLINE 无关），真身在 **`:1740`**，**亲验**逐字已是 `#slug` 锚点且**就地自陈**「⚠️ **2026-09-07 从裸号改成 `#slug` 锚点**：**事实本来就没写错**，但裸号按 `audit:stale-anchors` 的口径…不校 ⇒ 改成锚点才进射程」；全文 `M-DISCIPLINE` 仅 2 行命中（`:1689` 标题 · `:1740`）⇒ ⛔ 无残留裸号 |

**D. 验收清单没跑完**

| # | 事 | 出处 | **2026-09-15 现取**（⛔ 只跑了五行块前两行）|
|:-:|---|---|---|
| ~~L22~~ | `gate-output-contract` §4 那 **8 个 `- [ ]` 未逐条跑**（没跑全链、没验 `auditId` 集合、没构造 §3.2 五种组合）| `proposals/2026-08-24-gate-output-contract.md:26`（未漂）| 🟡 **仍成立** —— `- [ ]` 现取 **8 行**（口径 = 该文件含未勾选框的行数），逐行在 `:160` `:162` `:163` `:164`（§4.1）· `:168` `:170` `:171` `:172`（§4.2），⛔ 一个都没勾；头栏 `:9` 的 09-11 重取**只核了 DS 落地物在不在**、⛔ 没碰这 8 条（它们是 **lab 侧**的验收动作）。⚠️ **成本⛔ 不是「勾个框」**：8 条里至少 5 条要跑一次全链，而**现无对应 pin**（同 L5）。<br>**后三行（09-15）**：🟡 **仍该做，⛔ 但射程 8 ⇒ 1**。🔴 **「8 个未跑」这个主语严重过期 —— 实测 7/8 已跑，证据在 `reports/2026-08-25-round2-step7-7b-delta.md`**（`:273-285` 11 条五项对照表 · `:287` 逐字「**`auditId` 集合无重复、无缺失**（11 个各不相同，实跑核过）」· `:290` findings=0 也带 totals · `:310` 全链跑且两个独立解析器都读出 11/11 · `:312` must-not-hit · `:313` 两条 must-hit）；第 `:171` 条当时记「⚠️ 部分成立」，缺口已转 `proposals/2026-08-25-crosscheck-denominator-gap.md` 并**已由 DS 落地**（亲验 pin `7fcca917`，修法在 `gate-output-contract.mjs:239` + `tests/gate-output-contract.test.ts:199` 一整个 describe）。<br>⇒ **⛔ 勾没打 ≠ 没跑**。处方 `:26-27` 那三句自我登记里**有两句半与实测相反** ⇒ `lab:N56`。<br>🔴 **真实剩下的只有 `:164`**「任一条闸的阻断行为（exit code）与合并前逐条一致」（该报告全文 `阻断` 仅 1 处且语义无关）。⚠️ **动手前先答**：「合并前」= pin `339a72bf`（2026-08-24），距今 21 天且闸链大改 ⇒ **⛔ 别拿现 HEAD 当「合并后」比**，否则量到的是 21 天的无关漂移（`AGENTS §2.13`）。<br>✅ **做完（2026-09-15，lab `3bcf3f5` 起）—— 8/8 全部有据并已逐个勾选**：真正剩的那 1 格（`:164` 阻断行为与合并前逐条一致）由**新量具** `metrics/chain-exit-parity.mjs` 跑出 —— `--from chain-run-339a72bf --to chain-run-4a68e02d` ⇒ **交集 39/39**（`onlyFrom 0 · onlyTo 0` ⇒ 步骤集合完全相同）· **exitCode 不一致 `0`** · `exitStable=false` `0`。<br>✅ **量具自带 4 条控制全绿**，含**阳性对照**（注入 +99 ⇒ 报出恰好 1 条 ⇒ ⛔ 不是恒绿）· **对照臂**（自比 0 差异 ⇒ ⛔ 不是恒红）· **判定面非空** · **parity 只算交集**（边界①的落地钉子）；fail-closed 造故障（喂缺 `exitCode` 的产物）⇒ `EXIT=1` 且消息点名到具体 npmKey。<br>⚠️ **量具登记的两条边界**：① 新增/消失的步骤**没有对照面** ⇒ 那是「无从比较」⛔ 不是「一致」（本次两侧集合恰好相同，这条没咬到）；② **exit code 相同 ⛔ 不等于行为相同**（findings 变化不在射程内）。<br>🔴 **顺带立了一条口径**：跑完一格**当场勾一格并标证据出处**，⛔ 别攒 —— 攒着的代价是「下一格读它时会重跑 7 个已经跑过的东西」，本条正是那个活例子 |
| ~~L23~~ | ~~`mockup-gate-merge` **B1 只验到「hook 文件存在」**~~ ⇒ 🔴 **挪进 §1.3 阻塞（B7）** | `proposals/2026-08-24-mockup-gate-merge.md:26-28`（未漂）| 🔴 **属阻碍（前件对 lab 双重不可达）** —— ① **owner 明文禁止**：F62 spec 裁定表第 3 行**亲验**逐字「⛔ **不写 Figma**…owner 逐字：「不要修改 Figma 里面的内容，除非我主动让你写」。**作为机制副作用的自动写入尤其不行**」；② **取证成本**：DS `post-figma-write.selftest.sh:9` 逐字「**发起分支要 Figma token + 真 fileKey，不在此验**」。⚠️ **两个阻碍性质不同，⛔ 别写成同一个**。<br>🔴 **且登记的谓语写窄了两档**（`lab:N49` 推论四）：lab 2026-08-25 实际验到的是**静态接线可证**（`reports/…7b-delta.md:212-215` 逐字给了 `post-figma-write.sh:79,83,117-118` 与 `detect-figma-task.sh:37-50`），⛔ 不是「只验到 hook 文件存在」。<br>✅ **§5.5 第 2 条（fileKey 从 URL 捕获）现取成立**：`detect-figma-task.sh:64` 落盘 + `post-figma-write.sh:100` 读取，⛔ 无写死常量。<br>⚠️ **四态要分开，⛔ 别互相冒充**：`hook 文件存在` < `静态接线可证`（lab 已验）< `模拟输入下引擎真跑`（DS 已给，`STATUS-CHANGELOG:5477-5488`）< `真实 use_figma 写操作触发`（**至今零证据**）|
| ~~L24~~ | ~~`mockup-gate-merge` **§5.5 第 4 条未验**~~ | 同 `:29`（未漂）| ✅ **销账（2026-09-15 后三行）—— 对方已做，且 lab 的登记把主语写错了** —— 🔴 **DS 已给出两条缺陷各自的前后对照**：`docs/internal/STATUS-CHANGELOG.md:5497-5501` 亲验在案，逐条带**修前 / 修后 + 阴性对照**（缺陷 1：修前 `EXIT=2 missing required --file`、修后单条 `node` 调用 `EXIT=0`「规则 3/10 条」；缺陷 2：修前 `node 1:2,3:4 not found`、修后单一解析口 + 显式打印「未覆盖 3:4」+ 节点不存在时 `EXIT=2` 不静默全绿）。<br>🔴 **且登记那句「缺陷 2 一字未核」是假的** —— lab `reports/2026-08-25-round2-step7-7b-delta.md:215` 2026-08-25 就静态核过（修法现取仍在，`audit-mockup-conformance.mjs:524-528`，行号从 `:523-524` 漂）。<br>⚠️ **`lab:E50` 主语错**：同一行把「另一条」写成了「postinstall 教人配一个模板永远不读的 secret」，而处方 `:178` 的缺陷 1 逐字是「`audit:consumer-mockup` 这条 npm 别名结构上跑不通」⇒ **两件事，登记搬错了**。<br>⛔ **剩余部分不该由 lab 做**：重跑修前态要真调 Figma REST，owner 明文禁止 ⇒ 只能走 `AGENTS §24`「用对方装置复现」那一档，**永远证不了判据对不对** |

### §1.3 阻塞（⛔ 不排期，等前件）—— ~~3~~ ~~4~~ ~~7 条~~ ~~6 条~~ ~~7 条~~ ~~6 条~~ ~~7 条~~ ~~6 条~~ ⇒ **4 条**（O2 ⇒ B4 · 2026-09-15 挪来 L6/L16/L23 ⇒ B5/B6/B7，其中 **B5 阻碍已解除并做完**；**第六轮挪来 L13 ⇒ B8，当轮 owner 拍定后 B8 也已解除并做完**；**第七轮挪来 L15 ⇒ B9，当轮 owner 拍定后 B9 也已解除并判 hold**；**第八轮对全部 6 条跑五行块 ⇒ B1 · B6 两条销账**）

🔴 **第八轮（2026-09-15）对这 6 条逐条跑了五行块，结果分两档 —— ⛔ 别把「仍阻塞」读成「没查」**：

| 条 | 阻碍解没解除 | 凭什么这么判（现取）|
|:-:|---|---|
| ~~B1~~ | 🔴 **销账** | 前件**已被 owner 裁定不会到来**（O1 拍「不做」⇒ `M` 恒空），⛔ 不是「还没到」|
| B2 | ⛔ 未解除 | 三条重开条件**逐条实测全未达成**（正则自 `cddb16dd` 未动 · figma-sync 具名豁免仍 3 条 · owner 未回来拍）|
| B3 | 🟡 **性质变了、⛔ 未解除** | lab **现有 `DesignSync` 通道** ⇒ §4.2 已可实测，但那是**写 owner 远端项目**的外部动作 ⇒ **要一句授权**；§4.3 仍不可达 |
| B4 | ⛔ 未解除 | 分叉两半**都仍成立**；并补跑了上一轮**路径写错而空判**的第三个面，结论不变 |
| ~~B6~~ | 🟢 **解除并定案「不做」⇒ 销账** | 第一步本就是**回改**（从未被阻塞）；三条订正现取全成立，且早已回写 DS 真源 `d10e151b` |
| B7 | ⛔ 未解除 | owner 禁令 + 取证成本**两个都仍在**；⛔ 且不得拿另外两条裁定去松动它 |

| # | 事 | 卡在哪 |
|:-:|---|---|
| ~~B1~~ | ~~`P2a+P2b ≤ 20`（改完仍未判对）~~ ⇒ ✅ **销账（2026-09-15 第八轮）—— 前件⛔ 不是「还没到」，是【已被 owner 裁定不会到来】** | ~~**前件不可达**：触发条件是「已改完的子集 M」，2026-09-03 实测 `\|M\| = 0` ⇒ 卡在 **O1**~~<br>🔴 **O1 本轮已被 owner 拍「不做」并销账** ⇒ 那 175 条永不整改 ⇒ 定义域 `M` **恒空** ⇒ 该承诺指标**结构上永不触发**。⚠️ 这已经不是「等前件」，而是 [[conditional-commitment-antecedent-reachability]] 那条形态：**「当 X 时 Y ≤ Z」的 X 够不着，它就是一条不能失败的控制** ⇒ ⛔ 不该继续占一个阻塞位。<br>⚠️ **⛔ 别读成「这个指标当初立错了」** —— 它的形态是对的（承诺落在**和**上，正是为了防「设计师把 fill 改成中段灰让 P2a 归零而屏幕照样没修好」，处方 `:101-103` 逐字）。它只是**随 O1 一起失效**。<br>**销账⛔ 不是新判断，是 owner 那次裁定的直接推论**（读数能定 ⇒ ⛔ 不回头再问他）。**重开条件**：owner 改主意、那 175 条开始整改 ⇒ `\|M\| > 0` 时本条自动重开。真源 `proposals/2026-09-02-mockup-default-white-bg.md:93` |
| B2 | `⏸ 5a` 元闸的「第三种声明形态」 | **owner 2026-09-11 明示挂起** —— 逐字「5a 那个不知道用哪个，先不管了」。三条重开条件已写明。⛔ 不计入待拍<br>🟡 **2026-09-15 第八轮现取：三条重开条件【全部未达成】⇒ 仍是真阻塞，⛔ 不动。** ① 「有人要动那两个正则」—— `MOUNT_ARTIFACT_RE` / `PARENT_GATE_RE` 最后一次实质改动是 **2026-08-26 `cddb16dd`**，09-11 之后该文件仅 2 个 commit 且**都是注释订正**（`87cddd09` 订正写死条数 · `d10e151b` 本 lab 第五轮的机制订正）；② 「编排链上又出现第 4 条给不出 D1/D2 的闸」—— `figma-sync/` 下具名豁免现取仍是 **3 条**（`KNOWN_SILENT` 总 38 条），⛔ 未出现第 4 条；③ owner 未回来拍。<br>🟡 **2026-09-15 第十轮复核：三条重开条件【仍全未达成】⇒ 真阻塞，⛔ 不动。** ① 用 `git log -L` 逐行追：`MOUNT_ARTIFACT_RE` 最后实质改动 **`4a68e02d`（2026-08-25）**、`PARENT_GATE_RE` **`c5be4efc`（2026-08-17）**；09-11 之后该文件**只有 1 个 commit**（`d10e151b`，本 lab 第五轮的注释订正），⛔ 没碰那两行 · ② `figma-sync/` 下具名豁免仍 **3 条**（`KNOWN_SILENT` 总 **38** 条，判定面已定位到 `:110`，解析器 fail-closed）· ③ 本轮 owner 未就此表态。<br>🔴 **一处登记归因订正（⛔ 不是结论变化）**：上一轮写「最后一次实质改动是 **2026-08-26 `cddb16dd`**」—— 现取那两行的最后实质改动**都不是它**。`cddb16dd` 确实改了那个文件（subject 含「元闸扩面到 figma-sync」），但**没改那两行** ⇒ **「改了文件」被当成了「改了那两行」**。⚠️ 方向上让结论**更强**（最后改动更早），⛔ 但仍要订正 —— 下一轮拿 `cddb16dd` 当基准会算错「多久没人动过」。 |
| B3 | `claude-design-real-components` §4.2 上传体积上限 / §4.3 沙箱能否加载 bundle 内相对路径 JS | 处方原文即登记「**lab 实测不了**」<br>🟡 **2026-09-15 第八轮现取：阻碍的【性质变了】，但⛔ 未解除 —— 分两半记，⛔ 别合并。** 处方 `:177` 逐字的理由是「只能由人在界面里试」，而**本 session 实际持有 `DesignSync` 通道**（`write_files` 支持 `localPath` 直传，契约逐字「the tool reads from disk, encodes, and uploads」）⇒ ✅ **§4.2（单文件 3.13 MB 超不超限）结构上已可实测**，⛔ 不再是「lab 无法实测」；❌ **§4.3（预览沙箱的 CSP / 资源解析）仍不可达** —— 那是产品界面行为，工具契约里零字段。<br>⛔ **但 §4.2 的实测是【写 owner 远端 claude.ai/design 项目】的外部可见动作** ⇒ 按外部动作纪律**要 owner 先批**，⛔ agent 不自作主张 ⇒ **阻碍从「做不到」变成「要一句授权」**。<br>⚠️ **顺带一个对不上的数，⛔ 别急着判谁错**：处方 §4.2 写「单次上传 **≤ 500 entries**（DS 2026-06-11 实测）」，而工具契约逐字 **max 256 files per call**（`write_files` / `delete_files` / `register_assets` 同值）⇒ **两个数差 1.95×**，但**主语可能不同**（`entries` vs `files`）且相隔 3 个月产品可能已变 ⇒ 并排登记，⛔ 不改处方那句（`lab:E50` 主语错的预防）。<br>🟢 **2026-09-15 第九轮：owner 逐字批「先小后大」⇒ §4.2 当轮实测完毕、答案是【⛔ 不超限】。⚠️ 但 B3 ⛔ 不销账 —— §4.3 仍不可达，阻碍面减半、⛔ 没消失。**<br>**两臂**（同目录 · 同 `localPath` 通道 · 同为 gitignored 产物 ⇒ 臂 2 若失败，归因锁死在**体积**上，⛔ 不会被误读成通道没接对）：臂 1 `tvu-web-components.d.ts` **26,373 B** ✅ · 臂 2 `tvu-web-components.umd.cjs` **3,157,175 B** ✅ ⇒ **3.01 MiB / 3.16 MB 的单文件写得进去**。<br>**证据⛔ 不取自工具自述**：写后 `list_files` 独立列出两个路径 · 清理后 `get_file` 两个都 **404** 且 `list_files` 里连探针目录都不剩 ⇒ **owner 项目零残留**。⚠️ 404 单独看也可能是「从来没写成功过」（第二种 0），靠**写后那次 `list_files`** 才闭合证据链。<br>⛔ **三条边界**：① 只证明**服务端接受并列进索引**，⛔ 未证明远端字节与本地逐字节相同（`get_file` 上限 256 KiB）② **一次观测** —— 只知 3.16 MB 在限内，⛔ 不知限在哪 ③ 与 §4.3 无关。<br>✅ **已回改处方正文 5 处**（§4.2 本体 + 「10 分钟人工动作」那句 + §6 判据 1 + §7 未知表第 2 行 + 头栏执行状态）—— 处方才是 DS 侧的入口（`AGENTS §2.25` 推论三）。<br>🟡 **2026-09-15 第十轮复核：§4.3 仍不可达 ⇒ 真阻塞，⛔ 不动。但登记的【理由】要订正。** 上一轮逐字写「工具契约里**零字段**」—— 把 `DesignSync` 契约逐条摊开后，**⛔ 不是零字段**，而是「**有产品侧产物、但没有一个携带那个读数**」：`_ds_manifest.json`（契约逐字「compiled by the **app's self-check**」）携带的是 **`@dsCard` marker 的解析结果**，⛔ 不是运行时资源加载 · `report_validate` 的方向是 **lab 上报给服务端**，⛔ 不回传读数 · `get_file` 读回的是**我自己写上去的字节**。⇒ **结论不变、理由更精确。**<br>⚠️ **⛔ 别把这条读成「§4.3 也快能测了」** —— 上一轮 §4.2 的反转是因为**通道真的到手了**；这一轮是**把不可达的理由查准**，两件事。<br>⛔ **边界**：判「不可达」是从契约的方法表推的，⛔ **没做实验**（传一个带相对路径 JS 的 preview 去试属外部动作，且即便传了也看不到渲染结果）。 |
| **B4** | **CI secret**（原 **O2**，2026-09-14 从 §1.1 挪来）| **前件未到**：`wire-ci` 实测整库扫 **629,268 条**存量违例 ⇒ 真正缺的是**增量触发机制**（闸产物里已有 `figmaLastModified` 可做输入）。⛔ 在那之前设 secret 只会让 CI 每次红 62.9 万条 = 零信号。⇒ 卡在那条增量机制（~~已转 DS backlog，⛔ 不在本清单~~ ⇒ 🔴 **2026-09-15 订正，见下**）<br>🔴 **「已转 DS backlog」这句在我查的三个面上没兑现，且两侧各自以为在对方那儿**：DS `docs/internal/backlog.md:133` 逐字「「要不要把 Figma 凭据放进 CI secrets」是 lab `docs/decision-queue.md` ⏳ 第 `2` 行（Q6 `wire-ci`），**仍待 owner 拍**」——⚠️ 而那个状态 lab **09-14（L2）就已改掉**；反向，lab 那个关键读数 `629,268` / `整库扫` 在 DS `backlog.md` 与 `meta-rules.md` 上**都真零命中**（`STATUS.md` 在该 sha 上不存在 = 第二种 0）。⚠️ **边界：只查了 3 个面**，可能转到别处了<br>🔴 **2026-09-15 第八轮复核：分叉【两半都仍成立】，⛔ 阻碍未解除；但上一轮那三个面里有一个是【空判】。**<br>· **前半仍成立**：DS 侧那句现取仍逐字「**仍待 owner 拍**」（@`71d9405d` 行号已从 `:133` 漂到 **`:206`**），而 lab 侧 09-14 就已改掉 ⇒ 两侧仍各自以为在对方那儿。<br>· **后半仍成立**：`629,268` / `629268` / `增量触发` / `CI secret` / `wire-ci` 在 `backlog.md` · `STATUS.md` · `meta-rules.md` **三个面全零命中**（判否类 ⛔ 未加 `head`/`-m`；阳性对照 `wire-ci`@backlog=1 · `conformance`@backlog=19 · `触发器`@meta-rules=83 ⇒ **判定面非空**，那些 0 ⛔ 不是第四种 0）。<br>🔴 **上一轮踩的**：`docs/internal/meta-rules.md` **在该 sha 上根本不存在**，真身是 **`docs/meta-rules.md`**（`docs/` 下，⛔ 不在 `internal/`）⇒ 上一轮那个面实为**第二种 0**、结论在它上面不成立。本轮补跑后**结论不变**（仍零命中）。⚠️ 这与 `AGENTS §23 口径二`记过的坑**同一个**（当年是 `docs/meta-rules/` 目录 vs `docs/meta-rules.md` 文件）⇒ **同一个路径坑踩了第二次**。<br>~~⚠️ **回改 DS 侧那句【本轮刻意未做】**：`docs/internal/backlog.md` 当前在 DS 工作区**是脏的**（并行 session 未提交改动），`git commit --only` 会把别人没写完的东西一起提交 ⇒ **留到 DS 工作区干净时再回改**，⛔ 不硬改（`lab:N70`）。~~ ⇒ ✅ **2026-09-15 第九轮已做（DS `d4c387f2`）** —— 那个阻碍是**工作区脏**，本轮起手实测 `git status --porcelain -- docs/internal/backlog.md` **为空** ⇒ 阻碍消失、当场做掉。⚠️ **⛔ 但这⛔ 不解除 B4 本身**：回改消掉的是**登记面分叉**，B4 卡的是**增量触发机制** —— 两件事，⛔ 别合并读。<br>🔴 **回改的形态：那句有两半，只有一半过期 ⇒ ⛔ 不整句删**（`lab:E50` 主语错的预防）。**过期的半 = 指路**（lab 队列第 `2` 行 09-14 起已是 ✅、已转 backlog）；**仍成立的半 = 凭据**（secret 确实仍要 owner 去仓库设置里加，⛔ AI 不得处置密钥）。⇒ 按 DS 惯例用 `~~` 划掉原句留痕（`backlog.md:286` 逐字「划线只用在正文行」）+ 补三条：① 指路订正 ② 凭据那半仍成立、但⛔ 别读成「设了就能接」 ③ **把 `629,268` 这个读数写进去**。🟢 **⇒ 分叉的前后两半一次消掉** —— 前半（两侧互指）由 ① 消，后半（lab 的关键读数在 DS 三个面零命中）由 ③ 消。<br>🔴 **格内 DS HEAD 又漂了一次（`71d9405d` → `98d3e0b8`），而本条的【两个被验载体都在那次 diff 里】**（`backlog.md` · `STATUS.md`；B6 的 5 个载体全部未漂）⇒ **已在新 sha 上原样重跑，结论不变**：那句仍在（行号 `:206` → **`:214`**，⚠️ **两轮之内漂了两次** ⇒ ⛔ 别引裸行号）· 三个面对 `629,268`/`629268`/`增量触发` 仍全零命中（阳性对照 `wire-ci`@backlog=1 · `闸`@STATUS=22 · `触发器`@meta-rules=83 ⇒ 判定面非空）。⚠️ 顺带一条口径：`CI secret` 这个词@`98d3e0b8` 命中 **1**（就是 `:214` 那句自己），而上一跑在 `71d9405d` 上得 0 —— **那不是 DS 新增了内容，是我两跑的判定面不同**（上一跑只喂了 `meta-rules.md` 单文件）⇒ **⛔ 别把口径差读成变化**。<br>🔴 **2026-09-15 第七轮并入第二个受阻标的：`wire-release`（原 L7）** —— 与 `wire-ci` 是**同一条闸、同一个射程（`FIGMA_FILE_KEY` = 唯一的设计系统库）、同一堵墙**，只是挂载点不同（`release.mjs` vs CI）。⇒ **B4 一解除，两个挂载点一起解除**；⛔ 在增量触发机制做出来之前，两个都落不了。⚠️ L7 原登记的「跑 5 份 payload fixture」那个读数**服务不了这个决策**（那 5 份全是消费产品文件，`release.mjs` 传不进去），详见 [`reports/2026-09-15-l7-wire-release-reading-target.md`](../reports/2026-09-15-l7-wire-release-reading-target.md)<br>🟡 **2026-09-15 第十轮复核：前件【仍未到】⇒ 真阻塞，⛔ 不动。** `figmaLastModified`（可做增量输入的那个字段）现取只在 **3 个闸 + 3 个测试**里；**CI workflow 里 0 命中**（阳性对照：`.github/workflows/` 下有 `ci.yml` `gates.yml` `source-discipline.yml` `stale-anchors.yml` 四个文件 ⇒ 判定面非空）⇒ **增量触发机制仍未接进 CI**。<br>🔴 **本轮抓到一处【判定面自污染】，⛔ 别下次再踩**：`grep -c '增量触发' docs/internal/backlog.md` = **1**，看起来像「DS 侧已有增量触发的登记」—— `git log -S'增量触发'` 追出引入 commit 是 **`d4c387f2`**，即**我自己上一轮写进去的那句**。⇒ **量自己写过的登记面时，必须追引入 commit 才分得清「对方做了」和「我写的」**（`AGENTS §2.27` 推论四同族）。 |
| ~~**B5**~~ | ~~**复跑量具确认「没人管」条数下降**~~ ⇒ ✅ **阻碍已解除并做完（2026-09-15，lab `b13457f`）** | ✅ **修法⛔ 不是放松控制**（`AGENTS §3.2` 推论四）：5 条写死当轮读数的控制改成**按 pin 查预注册表的三档判据**（同 pin 断言写死值**且**断言一致性 · 跨 pin 只断言一致性并显式印「⚠️ 跨 pin」· dump 缺失/损坏 fail closed 抛），`must-not-hit-2` 则改成按**本次总行数**算（那一条本就不该分档）。<br>🔴 **同批查出并修掉一个更深的缺陷**：`must-hit-1` 比的两个集合**同源**（`rows = unclassified.map(...)` 一一对应）⇒ `JSON.stringify` 那个比较**恒真**，写死的 67 是它**唯一**的信息量来源；根因是 **`--dump` 参数声明了却从没被读**（只进过 `dumpSource` 字符串）⇒ 已让它真读外部 dump 文件。**这是 `N81.1` 的第二个实例**（上次只发现 `must-hit-0`）。<br>✅ **三臂 + 四个 fail-closed 分支 + 一次错配造故障，全部实测**：同 pin `EXIT=0`（仍断言 67）· 跨 pin `EXIT=0`（只断言一致性）· 篡改 1 个 id `EXIT=1`（`id 集合逐字相等 = false`）· pin/dump 错配 `EXIT=1` ⇒ **判别器成立，⛔ 不是恒绿也不是恒红**。<br>✅ **验收标准同批订正**：「11 条控制」实测 **12 条** ⇒ 改成「**退出码为 0**」，⛔ 不写死条数（`AGENTS §2.13` 推论二）。<br>~~**前件不可达（⛔ 阻碍在 lab 自己手上）**~~〔原判读留痕〕：验收标准 `proposals/2026-08-31-…-67-fix-directions.md:427` 逐字「**11 条控制全绿**，且 `unclassified` 条数 **< 67**」与量具 `metrics/unclassified-fix-triage.mjs:233-241` 的 `must-hit-1/ids-frozen-67`（`mine.length === 67 && …`）**结构互斥**；且「11 条」实测是 **12 条**。⇒ 解除动作 = 把验收标准与控制口径**同批**改，⛔ 别只改一半。⚠️ **与 L5 是同一条改动** |
| ~~**B6**~~ | ~~**`5b` npm key 改 `report:` 前缀**（原 **L16**，2026-09-15 从 §1.2 挪来）~~ ⇒ ✅ **阻碍解除并定案「不做」⇒ 销账（2026-09-15 第八轮）** | ✅ **阻碍本就不在「做不动」上** —— 登记写的第一步是**回改**（把三条订正写进 `decision-queue.md:64`），而回改**从来没被阻塞**，三条订正也全是现成读数。<br>✅ **三条订正 @`71d9405d` 全部现取成立**（pin `tvu-ds-71d9405d`，dirty=0）：① 扫描面收**文件名**前缀（`KNOWN_SILENT` 现取 38 条，`figma-sync/` 下 3 条）· ② 该行实测 `{"blocking": false, "face": "M"}`，棘轮口径同口径复算 **35**（与 `ratchet-watch` 吻合 ✅ 交叉验证锚）⇒ 从不计入棘轮 · ③ `tests/gate-regression-face-inventory.test.ts:183` 写死该路径（产物 `hits.M` 里它是**唯一**的钉子）。<br>🔴 **且三条订正 lab 早已回写进 DS 真源** —— `scripts/audit-gate-mount-declaration.mjs:178-195`，引入 commit **`d10e151b`**（2026-09-15，subject 逐字标「ai-ds-lab 复核」），原话用 `~~` 划掉留痕 ⇒ **对方会读的那份文件已经对了**，没跟上的只有 lab 自己的 `decision-queue.md:64` ⇒ **`lab:N56` 知情面分叉**（本轮已回改）。<br>**⇒ 定案「不做」的三条依据**（按 §1.1 自查：不扩豁免〔反而是删行〕· 不需 owner 独有物 · 无真源冲突只有**一份陈述过期** ⇒ **错法 2 ⇒ 归 agent 拍**）：**(ii) 只改 npm key** 达不到目的 ⇒ 纯负收益；**(i) 改文件名** 是唯一真能移出扫描面的路，但改动面实测**跨 3 类载体 ≥ 9 处**，而**对标准 ① 零影响**（棘轮不动 · 「没人守」不动）；**(iii) 不做** 已是正确终态（具名豁免 + 真源写清理由）。<br>🟢 **横着对过推荐，⛔ 不自相矛盾**（第七轮踩过的那条）：本条判「不做」与 **O1 判「不做」**（闸已止增、不做的代价 = 停在原地）、**B9 判 hold** 同向 —— 三条的共同判据都是「**改动对标准 ① 零影响 + 代价真实**」。<br>⚠️ **⛔ 别把 (a) 那两条编排链闸的裁定套过来**：它们是**真闸只是形态表达不了**（= B2/5a），本条是**本来就不是闸**（第 1 行逐字 `MANUAL BASELINE TOOL, NOT A GATE.`）⇒ 主语不同。<br>**重开条件**：① 该文件真变成闸 · ② 元闸 `PREFIXES` 改成按 npm key 收 · ③ 有人要走出路 (i)。<br>〔原判读留痕，⛔ 不删〕**登记的修法达不到它声称的目的**：那条闸收的是**文件名前缀**（`PREFIXES = ['audit-','smoke-','check-']` × `f.startsWith(p)`），⛔ 不是 npm key 前缀 ⇒ 标的文件名以 `audit-` 开头 ⇒ **改 key 移不出扫描面**。代价栏另有一错（棘轮 BASELINE 不会动，该行 `blocking:false`）一漏（`tests/gate-regression-face-inventory.test.ts:183` 写死该路径 ⇒ 掉出清单即红）。⇒ **先把三条订正回写进 `decision-queue.md:64`，再重新定要不要做** |
| **B7** | **`mockup-gate-merge` B1 的真实 `use_figma` 写操作证据**（原 **L23**，2026-09-15 从 §1.2 挪来）| **对 lab 双重不可达**：① **owner 明文禁止** —— F62 spec 裁定表第 3 行逐字「⛔ **不写 Figma**…owner 逐字：「不要修改 Figma 里面的内容，除非我主动让你写」」；② **取证成本** —— 要 Figma token + 真 fileKey（DS 的 selftest 也逐字「不在此验」）。⚠️ **两个阻碍性质不同，⛔ 别写成同一个**；⚠️ 且 lab 实际已验到「**静态接线可证**」这一档，⛔ 不是登记写的「只验到 hook 文件存在」<br>🟡 **2026-09-15 第八轮现取：两个阻碍【都仍在】⇒ 真阻塞，⛔ 不动。** ① owner 那条禁令（F62 spec「不要修改 Figma 里面的内容，除非我主动让你写」）现取仍在、⛔ 未被任何后续裁定放宽 —— ⚠️ 且本轮把三条一直被混用的裁定分开核过后更清楚了：那条的主语是 **AI 的写操作**，⛔ 与「Figma 是真源」（主语 = 变量定义方向）、「射程裁定」（主语 = 哪个文件是库）无关 ⇒ **⛔ 不能拿后两条来松动它**；② 取证成本（真 token + 真 fileKey）现取未变。<br>🔴 **2026-09-15 第十轮：两个阻碍【一个翻了、一个变强了】⇒ 性质变了，⛔ 但不销账。**<br>· **② 取证成本 ⛔ 不成立了**：`whoami` 实测 **MCP 通道已鉴权**（`Nancy Zeng` · TVU Networks · pro · Full seat）· `.env.example:13` 的真 fileKey `YbsPRUVmNdsbN40NNwh1Gn` **实读成功**（返回 3 个顶层页面）· hook 的 matcher 逐字 `mcp__(claude_ai_Figma\|plugin_figma_figma)__use_figma` ⇒ **第一个分支正是 lab 持有的工具名**。⚠️ **查出它靠补一层扫描面**：环境变量 `FIGMA_TOKEN`/`FIGMA_PAT`/`FIGMA_ACCESS_TOKEN`/`FIGMA_FILE_KEY` **本机全 unset** ⇒ 只扫载体这一层会得到**与事实相反**的结论（`AGENTS §3.14` 能力通道的种类 ≠ 实现载体）。⛔ **边界**：只证了读通道 + 鉴权 + fileKey，⛔ **未证**写调用一定成功。<br>· **① owner 禁令【比登记写的更强】—— 无只读旁路**：PostToolUse 的 matcher 只看**工具名**、⛔ 不看读写，而 `use_figma` 契约明说也能跑只读 JS ⇒ lab 曾推「只读调用照样触发 ⇒ 可不碰禁令拿到证据」。**把那个箭头单独跑了一遍，推理被 DS 自己的代码翻掉**（`AGENTS §3.16`）：`post-figma-write.sh:33` 有写信号正则、不匹配即 `:34 exit 0`，`:108` 注释逐字「⛔ **只读调用在 :30/:34 已提前 exit 0**，走不到这里 ⇒ marker 只记写信号」⇒ **要那档证据必须真写。**<br>✅ **顺带核掉一个该核的风险**：那条 hook **自己⛔ 不写 Figma**（`:154` 只注入提醒文本，让 AI 去跑 `audit:mockup-conformance` 与只读的 `checkConnectorOrthogonality`）⇒ F62 那句「作为机制副作用的自动写入尤其不行」**未被违反**。<br>🔴 **⛔ 不销账（与 B1 的差别要写清）**：B1 销账是因为前件**已被 owner 裁定不会到来**；B7 的禁令逐字留了口子（「**除非我主动让你写**」）⇒ **前件可达，只是要他拍** ⇒ 仍占阻塞位。<br>~~🟡 **⇒ 已摊给 owner，带推荐「⛔ 不批」**（两条出路 + 各动什么，见报告 §6）。~~ ⇒ 🔴 **2026-09-15 第十轮·续改判：owner 反问「为什么需要写这个？是为了解决什么问题」，据此重核，⇒ 【不需要专门写】，那个授权问题本身撤回。**<br>**owner 问的那一点，lab 上一版三条理由⛔ 没答到** —— 它们答的是「代价划不划算」，而他问的是「解决什么问题」。补核三个读数：<br>· ① **这条链断了会自己喊出来，⛔ 不会静默**：`stop-figma-conformance.sh:128` 逐字「⛔ §M-LIFECYCLE 第②时点：本 session 有 `${n}` 次 Figma 写操作**没有任何机检跑过**（post-figma-write 因缺 fileKey 或未定位仓库而没发起）…（⛔ 别报 done）」⇒ **真实写操作下接不上 ⇒ 收尾被阻塞并当场报出**。<br>· ② **⛔ 不是一条从没启动过的死链**：本机 `${TMPDIR}/tvu-mockup-conformance/` 下 **13 个 session 目录** ⇒ 跑过。⚠️ **边界**：其中有 `testsess` / `t3` 这类名字 ⇒ 只证「跑过」，⛔ **不证「真实写操作下跑过」**；且 TMPDIR 随重启清 ⇒ 这个数是**下界**。<br>· ③ ⇒ **专门造一次写，买到的只是「提前几天知道」** —— 那份证据会在**下一次本来就要发生的 Figma 写操作**里免费到手（届时贴一下 hook 注入的文本 + 引擎 report 路径即可）。<br>🔴 **⇒ B7 的阻碍第三次改判**：从「双重不可达」⇒「只差 owner 一句话」⇒ **「等一次自然发生的 Figma 写操作」**。**⛔ 仍不销账**（那份证据确实还没有），⛔ 但**不再占 owner 的判断位**，也⛔ 不该为它专门动 Figma 真源。<br>**⇒ 下次在 DS 仓里真写 Figma 时，顺手记两样**：① hook 实际注入的文本 ② 引擎的 report 路径（`${TMPDIR}/tvu-mockup-conformance/<session>/report-*.json`）⇒ B7 当场销账。<br>✅ **这条改判是读数定的，⛔ 没回头再问 owner**（[[dont-queue-what-readings-can-settle]]）。⛔ **全程 lab 未调 `use_figma`** —— 本轮 Figma 调用只有 `whoami` / `get_metadata` 两次只读。<br>✅ **同批已回改处方正文 2 处**（`proposals/2026-08-24-mockup-gate-merge.md:26,28`），⛔ 不只写报告。读数：[`reports/2026-09-15-round10-blockers-recheck.md`](../reports/2026-09-15-round10-blockers-recheck.md) §4 |
| ~~**B8**~~ | ~~**`#M23.18` 那条 Acceptance 的下场**（原 **L13**，2026-09-15 第六轮从 §1.2 挪来）~~ ⇒ ✅ **阻碍已解除并做完（2026-09-15，DS `36554059`）** | ✅ **owner 当场拍 (a)**，逐字选「**判 not-machine-checkable**」（三条出路摊开后拍的）⇒ 段级豁免已写入 `figma-data/audit-allowlist/acceptance-not-machine-checkable.json`（35 ⇒ **36** 条）+ `BASELINE_UNCLASSIFIED` **34 ⇒ 33**（只许降、降了就锁住，注释同批写明「⛔ 这一格不是上了闸，是判定它仓库侧没有对象可扫」）。<br>✅ **三臂造故障**（还原走 `cp`+`cmp`，具名 marker 零残留）：对照臂 `EXIT=0` · `state=not-machine-checkable` · 33=33 ｜ 删掉该豁免行 ⇒ `EXIT=1` `[S2] unclassified 34 > BASELINE 33` ｜ id 改成不存在的段 ⇒ `EXIT=1` **`[S2]`+`[S3]`**（shrink-only 要求删行）⇒ **三臂读数互不相同 ⇒ 判别器成立**。<br>✅ **标准 ① 真的动了**：`没人守` **34 ⇒ 33** · 具名豁免 **52 ⇒ 53** · 基线 **34 ⇒ 33**；`audit-acceptance-gate-coverage` 仍绿。全量 **3554 passed / 0 failed**，已 push。<br>⛔ **未动规则正文** —— §M23.18 的纪律一字未改，只登记「这一条仓库侧测不了」；**重开条件**写进 reason（M48 清单一旦有仓内落盘产物 / 或措辞改成指向可扫对象）。<br>〔原判读留痕，⛔ 不删〕**登记的动作（接闸）结构上达不成它声称的目的** —— 该验收项的被测物是「起手 M48 self-check 清单里的一句声明」，落**对话 / Figma 侧**，仓库侧零对象（三条读数带阳性对照，见 §1.2 原 L13 行）。而闸判 `gated` **纯靠自陈**（头注释逐字「⛔ 本闸不判某条 Acceptance 该不该有闸」）⇒ 两臂实测：注入一行自陈 `[0]` ⇒ `unclassified` **35 ⇒ 34**、`Σ核查项=0` 使 S4 对位恒过 ⇒ **接闸 = 假绿**。<br>**卡在 owner**：三条出路 **(a)** 判 nmc 入豁免表（动棘轮基线 = C4；⚠️ 表里已有 **19 条**同型段级先例）· **(b)** 按 `#Canonical` 先例降级规则 · **(c)** 改 Acceptance 措辞 —— 三条都动真源或动棘轮基线。⚠️ 09-08 lab 已登记「分支 nmc **属 C4 ⇒ owner**」，Q1-d 提给 owner 时他逐字是**质疑**「第二个确定有必要做吗」，⛔ 不是批准。<br>⚠️ **⛔ 别把本条读成「detectFrameTheme 白做了」** —— 那个模块已接进 §M-VARIANT-AXIS ②（report-only，DS `backlog.md` INFRA-F146 工程部分已闭合），⛔ 与本条是两件事 |

| ~~**B9**~~ | ~~**B2 余 33 段的下一批抓手怎么选**（原 **L15**，2026-09-15 第七轮从 §1.2 挪来）~~ ⇒ ✅ **owner 当轮拍定 ⇒ 阻碍解除、判 hold（2026-09-15 第七轮）** | 🔴 **登记的标的「下一批抓手 `#M38`」不成立 —— 按字面做出来是一条有效分母 0 的恒绿闸。** 三件前置做完后，09-09 那三条立项依据**一条不剩**：① 规则逐字的 `strokeLeftWeight` 在 **462,618 个节点 0 命中**（Plugin API 名 ≠ REST 的 `individualStrokeWeights.left`）② 「377 / 0」**不可复现**（三份未动 payload 已 **409 > 377**）③ 「零存量」是**口径造出来的** —— 原生射程 `State=Selected|Active` 下 **分母 2 · 违例 2 · 合规 0%**。且 3 层里只有 **L1 的值**判得了（L1 缺失射程 97.1% 假阳 · L2 判不了变量身份 · L3 **无对照态**）⇒ 可诚实覆盖 = **5 条验收项里 1 条的一半**，而一行自陈就让该段变 `gated`、棘轮降 1 ⇒ **与第六轮 L13 同形态**。<br>⛔ **lab 不裁走哪条路**（`AGENTS §2.21`）。三条出路：**(a)** 换抓手、重筛 24 段未读 · **(b)** 🟢 **推荐** —— owner 先在 Figma 把 `3705:5040` / `3705:5051` 的 `left: 2` 改成 `4`，再落只判 L1 off-token 值的半条闸（自陈⛔ 不写 `[N]`、逐字写明「零信息的绿 + 只覆盖 1/5」）· **(c)** 判整段 hold 入豁免表（⚠️ 现有 35 条里**没有这一型**理由）。<br>**产物**：报告 [`reports/2026-09-15-l15-m38-three-layer-denominators.md`](../reports/2026-09-15-l15-m38-three-layer-denominators.md) · 量具 `metrics/m38-three-layer-denominators.mjs`（`--self-check` **EXIT=0 · 26 项断言 + 阳性对照 + fail-closed 全绿**；真判定面 **EXIT=0 · 11 条控制全绿**）· 新 pin `~/.ai-ds-lab/pins/tvu-ds-36554059`（dirty=0）<br>🟢 **owner 2026-09-15 裁定（逐字）：「不用因为消费产品的错误设计来让我修改 DS 设计系统」** ⇒ **整条 `#M38` 判 hold：⛔ 不上闸、⛔ 不入豁免表、⛔ 棘轮不动**（该段维持 `unclassified`）。<br>🔴 **⛔ 理由是 owner 这条裁定，⛔ 不是 lab 原来那条「只有一层机检得了」** —— 那 2 条真违例（`3705:5040` / `3705:5051`）**全在消费产品的稿里**（`Micro Apps 20250923`），而这与 owner 2026-09-11 的射程裁定一致：DS 侧的射程 = 那**唯一一个设计组件库**，消费产品的稿由**消费侧**的 `templates/audit-mockup-workflow.yml` 审（见 L17 的结论）。<br>⚠️ **lab 当轮撤回过一条自己的推荐，留痕**：原推荐是「owner 先在 Figma 把那 2 条 2px 改 4px，再落半条闸」——**它与同一批里 O1（175 白底）判「不做」的处置不一致**（那条的理由正是「闸已止增、不做的代价 = 停在原地」）。owner 质疑「为什么又让我修改 Figma？不是说 Figma 上的是真源吗」后撤回。<br>✅ **顺带把三条被混用的裁定分开登记**（逐字，⛔ 别再混）：**①「Figma 是真源」**= `docs/PROJECT_GOAL.md:51`「Figma 是真源，Code 是拿到 Figma 导出的数据后定义的」⇒ 主语是**变量/token 的定义方向**（code 跟 Figma），⛔ 不是「Figma 里每一格都对」；**②「⛔ 不写 Figma」**= F62 spec「不要修改 Figma 里面的内容，除非我主动让你写」⇒ 主语是 **AI**；**③ 射程裁定**（2026-09-11）= 哪个文件是设计系统库。<br>**重开条件**：若该规则的违例出现在**设计系统库本身**（⛔ 不是消费产品稿），本条重开。|

### §1.4 状态存疑 —— ✅ **三条全部定案（2026-09-14）**，⛔ 无剩余

| # | 疑点 | 定案 |
|:-:|---|---|
| ~~D1~~ | ~~**O4/O5/O6 到底还待不待拍**~~ | ✅ **两张表⛔ 不矛盾，是口径不同**（`:6` 的「0 条」只数顶部编号表的行）。逐条：**O4 销账**（标的 2026-09-07 已走 `record-as-nmc` 落地，反对该支的理由实测未发生）· **O5 销账**（59 段已全量预分类，`needs-owner` 那 2 段已拍完，棘轮 59→35）· **O6 仍待拍，射程 13 段 ⇒ 6 段**。⇒ **owner 的活 6 条 → 4 条** |
| ~~D2~~ | ~~`hand-rolled-cli-entry-guards` **P1–P3 做完没有**~~ | ✅ **处方对，`decision-queue` 那句过期。** 处方头栏 2026-09-14 逐字：P1/P2 **判定不做**（存在理由被 DS 三处明文裁定推翻 ⇒ `lab:N54`）· P4 已做（DS `3ac0d15a`）· P3′ 已做（DS `ddebae9d`）⇒「全部执行完毕」。那句「P1–P3 仍待做」是 **09-08 变更日志里的括注**，此后 09-11 / 09-14 两次更新都没回改它（`lab:N56`）⇒ **已回改**。⚠️ 附带：「156 个里 36 个」也过期 —— 09-11 重取 **61**（召回缺口 +69%），09-14 定案 61 个**全在治理面外** ⇒ **待修 0**，⛔ 别把 61 读成工作量 |
| ~~D3~~ | ~~`webcomponents-types-entry` §2.6 **五版本矩阵**~~ | ✅ **⛔ 不需要估成本 —— 那件事已经做完两次了**，就写在 §2.6 自己正文里：**`lab:L3`**（2026-09-03，在 DS 真发出的 719 行 d.ts 上重取，12 格逐格相同 + 补 3 个当年未测的 `G` 格）· **`lab:L4`**（同日，把 tsc 轴也关闭，12 条 tsc 线 × 5 版本 = **60/60 全绿**）。两份报告已亲验存在且读数可复核。过期的是**文件头那句「未重跑」** ⇒ **已回改**。⚠️ 这是 `lab:N56` **在同一份文件内部**发作（正文已验 / 文件头总述没跟着改）|

---

## §2 做完的（划掉留痕，⛔ 不删）

<!-- 完成的条目移到这里，保留原文 + 完成时的 commit -->

### 2026-09-15 第十一轮 · 零漂复核 ⇒ 清单 **4 ⇒ 4** · 🔴 **本格零动作，且这是【对的】**

📊 **全线复盘报告（owner 当轮要的）**：[`reports/2026-09-15-optimization-retrospective.html`](../reports/2026-09-15-optimization-retrospective.html)
—— ⚠️ 射程是**十一轮全线**（⛔ 不只本格）：内容层 DS 侧 11 笔逐笔 · 流程层 5 项 ·
标准 ① 前后对比（每个量标清谁挣的）· 6 条边界。
🔴 **写它时证了一个计数器**：`Co-Authored-By: Claude` 口径同期数出 **48 笔**，
而 **lab 只有 11 笔**，其余是并行 session（它也用 Claude）⇒ ⛔ 别把 48 读成 lab 的产出
（`AGENTS §2.18.7` 第 12 次生效）。

🔴 **这一格⛔ 没有重跑上一轮那些读数 —— 重跑会是【确定性复算】，⛔ 不构成独立证据**
（`AGENTS §24` 推论一）。取而代之的是**证明「前提不可能变」**：

| 条 | 前提为什么必然未变（现取）|
|:-:|---|
| **B2** | 判定面全在 DS 仓内 · 载体 `audit-gate-mount-declaration.mjs` 最后改动 **`d10e151b`** < 起手 HEAD · **DS 零漂** ⇒ 三条重开条件必然仍未达成 |
| **B3** | 只剩 §4.3（预览沙箱 CSP / 资源解析）= **产品界面行为**，⛔ 不随 DS 仓变；本轮未获任何新通道 |
| **B4** | **唯一实跑的一条**：`figmaLastModified` 在 `.github/workflows/` 下 **4 个文件全 0 命中**（阳性对照：4 个文件各自被读到并报 0 ⇒ 判定面非空）⇒ 增量触发机制仍未接进 CI |
| **B7** | 销账条件是「等一次自然发生的 Figma 写操作」—— `${TMPDIR}/tvu-mockup-conformance/` 下 **18:00 后零新 report**（最新 `17:32`）⇒ 未发生。⛔ 全程零 Figma 调用 |

**零漂的证据**：`git log 2609161d..HEAD`（DS）为空 · lab 自上一轮止只有 2 个**登记面** commit
（`f506196` 回填止栏 · `3454704` B7 改判），⛔ 未碰任何被验载体。

#### 一 · 🔴 这条线已经收敛 —— 建议停轮（⛔ 不是建议销账）

**读数**：清单条数 `12 → 10 → 6 → 4 → 4 → 4 → 4 → 4`
（第六 / 七 / 七·续 / 八 / 九 / 十 / 十·续 / **本轮**）⇒ **连续四轮零销账**。

而四条的重开条件**全部是 lab 控制不了的外部事件**：

| 条 | 等什么 | 谁能让它发生 |
|:-:|---|---|
| B2 | 有人要动那两个正则 / 出现第 4 条给不出 D1/D2 的闸 / owner 回来拍 | DS 侧或 owner |
| B3 | §4.3 要在 claude.ai/design 界面里试 | 产品能力 |
| B4 | 增量触发机制接进 CI | DS 侧工程 |
| B7 | 一次自然发生的 Figma 写操作 | 日常工作自己会带来 |

⇒ **⛔ 不该再为它们单独开轮次** —— 再开一轮的产出上限就是本格这几行「前提未变」。
✅ **正确姿势**：等重开条件里的事件**自然发生**时再回来；B7 尤其 ——
下次在 DS 仓真写 Figma 时顺手贴两样（hook 注入文本 + `report-*.json` 路径）即当场销账。

⚠️ **⛔ 这⛔ 不是说这 4 条可以销账** —— 它们的标的都还在，只是**排期意义上已无动作可做**（§0.1 铁律 3：
「阻碍」的定义就是「清单上某条做不下去了」，四条**全部**落在这一档）。

#### 二 · 起手 → 止

| | 起手 | 止 |
|---|---|---|
| **lab** | `3454704` clean | **本条的提交 commit**（⚠️ 本格零动作 ⇒ ⛔ 不另起一个回填 commit，上一轮那个占位坑就是这么来的）|
| **DS** | `2609161d` · 脏 6（⛔ 全非我方）| **`2609161d`** · 脏 6 —— 🟢 **格内零漂** |
| **标准 ①**〔**工作区**面，⛔ 不是 pin〕| 没人守 **32** · 基线 **32** · 135 段 · 红 1（`render-drift-gate-react`，连续 **53** 次）| **全部持平**（自跑 `ratchet-watch` `EXIT=3`，读数与 `SessionStart` 逐项相同）|

🟢 **标准 ① 没动，而这是【对的】**（§0.2.3）：本格**全部动作是只读核验**，⛔ 未碰 DS 任何字节
⇒ 它**结构上就不该动**（`lab:N71`）。那条红**非我方账**（已登记 §3，归因 = 并行 session 改了
`react-pilot/src/demos/*` 而渲染验证报告未重跑）。

---

### 2026-09-15 第十轮 · 对 4 条阻塞跑五行块 ⇒ 清单 **4 ⇒ 4，零销账**；B7 的两个阻碍【一个翻了、一个变强了】

🔴 **⛔ 别把这一格读成「又白跑一轮」** —— 条数没动，但 **B7 的性质变了**：
它登记的两个阻碍里，「**取证成本**」实测**不成立了**，「**owner 禁令**」反而**比登记写的更强**。
⇒ B7 从「对 lab **双重**不可达」变成「**只差 owner 一句话**」，与第九轮 B3 **同构**。

**报告**：[`reports/2026-09-15-round10-blockers-recheck.md`](../reports/2026-09-15-round10-blockers-recheck.md)

| 条 | 阻碍解没解除 | 凭什么这么判（现取，pin `tvu-ds-d4c387f2` dirty=0）|
|:-:|---|---|
| B2 | ⛔ 未解除 | 三条重开条件**逐条实测全未达成**；**并订正一处归因** —— 上一轮的 `cddb16dd` **没改那两行**，真值是 `4a68e02d`(08-25) / `c5be4efc`(08-17) |
| B3 | ⛔ 未解除 | §4.3 仍不可达；**并订正理由** —— 上一轮的「契约**零字段**」不准确，实为「**有产品侧产物、但没一个携带那个读数**」|
| B4 | ⛔ 未解除 | 前件未到（CI workflow 里 `figmaLastModified` **0** 命中）；**并抓到一处判定面自污染** —— backlog 里那 1 处「增量触发」是**我自己上一轮写的** |
| **B7** | 🟡 **⛔ 未解除，但阻碍从 2 个减到 1 个** | ② **取证成本翻了**（MCP 通道已鉴权 + 真 fileKey 可读 + matcher 逐字点名本 session 的工具名）；① **禁令仍在且无只读旁路** |

#### 一 · B7 —— 本轮的实质发现

**② 取证成本 ⛔ 不成立了。** `whoami` = `Nancy Zeng` · TVU Networks · **pro · Full seat**；
`.env.example:13` 的真 fileKey `YbsPRUVmNdsbN40NNwh1Gn` **实读成功**（3 个顶层页面）；
hook matcher 逐字 `mcp__(claude_ai_Figma|plugin_figma_figma)__use_figma` ⇒ **第一个分支正是 lab 持有的工具名**。

⚠️ **查出它靠补一层扫描面**：`FIGMA_TOKEN` / `FIGMA_PAT` / `FIGMA_ACCESS_TOKEN` / `FIGMA_FILE_KEY`
**本机全 unset** ⇒ **只扫载体这一层会得到与事实相反的结论**（`AGENTS §3.14`）。

🔴 **① 禁令比登记写的更强 —— 我试着找旁路，被 DS 自己的代码翻掉了（留痕）。**
PostToolUse 的 matcher 只看**工具名**、⛔ 不看读写，而 `use_figma` 契约明说也能跑只读 JS
⇒ 我推「只读调用照样触发 ⇒ 不碰禁令也能拿证据」。**把那个箭头单独跑一遍就不成立**
（`AGENTS §3.16`）：`post-figma-write.sh:33` 有写信号正则、不匹配即 `:34 exit 0`，
`:108` 逐字「⛔ **只读调用在 :30/:34 已提前 exit 0**，走不到这里 ⇒ marker 只记写信号」
⇒ **要那档证据必须真写。**

✅ 顺带核掉一个该核的风险：那条 hook **自己⛔ 不写 Figma**（`:154` 只注入提醒文本）
⇒ F62 那句「作为机制副作用的自动写入尤其不行」**未被违反**。

🔴 **⛔ 不销账**：B1 销账是因为前件**已被裁定不会到来**；B7 的禁令逐字留了口子
（「**除非我主动让你写**」）⇒ **前件可达，只是要 owner 拍** ⇒ **已摊给他，带推荐「⛔ 不批」**（报告 §6）。

#### 二 · 三处登记面回改（⛔ 不只写报告）

| 面 | 改了什么 |
|---|---|
| `proposals/2026-08-24-mockup-gate-merge.md:26,28` | ① 谓语窄两档（「只验到 hook 文件存在」⇒ 实为**静态接线可证**）② 「那需要 live Figma，lab 够不到」**逐半订正** —— 前半成立、后半实测不成立 |
| `docs/frozen-worklist.md` B2/B3/B4/B7 四行 | 各自补本轮现取 + 三处订正 |

⚠️ **回改形态：逐半改，⛔ 不整句删**（`lab:E50`）—— `:28` 那句的「需要 live Figma」是真的。

#### 三 · 本轮踩的两条（留痕）

1. 🔴 **清单计数量具第一跑吐 `0`，而真值是 4。** 根因：节边界正则写 `^## §1\.4`，
   而真实标题是 `### §1.4` ⇒ §1.3 的边界吞掉 §1.4 ⇒ 「最后一张 `\| # \|` 表头」取成了 §1.4 的。
   ⚠️ **那个 `0` 在这个位置会被读成「清单清零了」** —— 正是 `lab:N48` 那条形态。
   修正后得 **4**，且量具改成**逐条列名**（`B2 B3 B4 B7`）⇒ 比只给一个数更能交叉验证。
2. 🔴 **格内 DS HEAD 又漂了一次**（`d4c387f2` → `2609161d`，并行 session 8 个文件），
   而 **B4 的载体 `backlog.md` 正在那次 diff 里** ⇒ 已在新 sha 上**原样重跑**，
   结论不变（「增量触发」仍命中 1 且引入 commit 仍是我自己的 `d4c387f2`；
   CI workflow 仍 0 命中，阳性对照 `ci.yml` 306 行 ⇒ 判定面非空）。

#### 四 · 起手 → 止

| | 起手 | 止（收尾真重取）|
|---|---|---|
| **lab** | `134be6f` clean | **`520a27e`** clean（⚠️ 本行是**回填**，回填本身又是一个 commit ⇒ 止栏值天然落后自己一步）|
| **DS** | `d4c387f2` · 脏 6（⛔ 全非我方）| **`2609161d`** · 脏 6（⛔ 全非我方）· 🔴 **格内漂 1 次，已核载体并重跑** |
| **标准 ①**〔**工作区**面，⛔ 不是 pin〕| 没人守 **32** · 基线 **32** · 135 段 · 红 1（`render-drift-gate-react`，连续 **47** 次）| **全部持平** —— 没人守 32 · 基线 32 · 135 段 · 红 1（连续 **48** 次）|

🟢 **标准 ① 没动，而这是【对的】**（§0.2.3 要求说清为什么没变）：本格**全部动作是只读核查 +
lab 侧登记面回改**，⛔ 未碰 DS 任何判据 / 闸 / 规则正文 ⇒ 它**结构上就不该动**（`lab:N71`）。
那条红**非我方账**，已登记 §3。

---

### 2026-09-15 第九轮 · 两条阻塞各松了一半（B4 的回改做掉 · B3 的 §4.2 实测答掉）⇒ 清单 **4 ⇒ 4**

🔴 **⛔ 别把这一格读成「做掉了两条」** —— 清单**条数一个没少，两条都⛔ 不销账**：

- **B4**：做掉的是它名下**唯一那个不被阻塞的动作**（回改 DS 侧那句）。B4 本身卡的是**增量触发机制**，⛔ 没解除。
- **B3**：owner 当轮批了授权 ⇒ **§4.2 实测答掉**。但 B3 名下还有 **§4.3（预览沙箱）仍不可达**
  ⇒ **阻碍面减半、⛔ 没消失**。

---

#### 一 · B4 —— 那个被「工作区脏」挡住的回改

**五行块（后三行是有牙的那三行）**

| 行 | 结果 |
|---|---|
| 登记记的 | 上一轮逐字「`docs/internal/backlog.md` 当前在 DS 工作区**是脏的**…⇒ **留到 DS 工作区干净时再回改**」 |
| 现取 | `git status --porcelain -- docs/internal/backlog.md` **为空** ⇒ **干净**；那句仍在（`:214`，本轮**未再漂**）；lab `decision-queue.md:60` 现取已是 **`✅ 2`** |
| **前提还成不成立** | 🟢 **「文件脏」那一半⛔ 不成立了**（阻碍消失）· **「两侧各自以为在对方那儿」仍成立** ⇒ 该做 |
| **它还该做吗** | **该做。** 那句所属条目是 **INFRA-F146**，其裁定块（标题 + 重开条件）管的是「§M-VARIANT-AXIS 不升成阻塞」⇒ **与这句无关**，⛔ 没有任何 DS 侧裁定要它保持原样 |
| **lab 自己验过没** | **没干过。** lab 仓内命中 **2 处**（`frozen-worklist:190` · 上一轮报告 `:110`），**全是登记「未做」，零处说「已回改」** |

| | 起手 | 止（收尾真重取）|
|---|---|---|
| **lab** | `bfed71f` clean | **`07b61f1`** clean · 已 push（⚠️ 本行是**回填**，回填本身又是一个 commit ⇒ 止栏值天然落后自己一步，`AGENTS §2.27` 推论四同族）|
| **DS** | `98d3e0b8` · 脏 8 · `ahead 1`（**并行 session 的**）| **`d4c387f2`**（我方）· 脏 6（⛔ 全非我方）· **已 push**（Gitea + GitHub）。🔴 **格内漂了一次**：`98d3e0b8` → `d8588c7b`（并行 session 2 个文件）⇒ 已核**本条载体 `backlog.md` ⛔ 不在那次 diff 里**，并在新 sha 上原样重跑（仍干净 · 那句仍在 `:214`）。✅ **push 的时机⛔ 不是随手**：起手 `ahead 1` 是别人未推的 commit ⇒ 当时 push 会**连带推走别人的东西**；收尾重取时他们已自行 push ⇒ `git log origin/master..HEAD` 实测**只剩我那一个**，这才推（⛔ 别只看 `ahead` 的数字，要看它是谁的）|
| **标准 ①**〔**工作区**面，⛔ 不是 pin〕| `没人守` **32** · 基线 **32** · 135 段 · 红 1（`render-drift-gate-react`，连续 **41** 次）| **全部持平** —— `没人守` 32 · 基线 32 · 135 段 · 红 1（连续 **42** 次）|

🟢 **标准 ① 没动，而这是【对的】**（§0.2.3 要求说清为什么没变）：本格在 DS 侧只改了
**一条 entry 的正文行**，⛔ 未碰规则真源、⛔ 未碰任何闸、⛔ 未碰判据 ⇒ 它**结构上就不该动**
（`lab:N71`：计数指标沉默时，先答「它的口径数的是什么」）。那条红**非我方账**，已登记 §3。

🔴 **回改的形态值得单记：那句有两半，只有一半过期 ⇒ ⛔ 不整句删**（`lab:E50`）

- **过期的半（指路）**：「lab `decision-queue.md` ⏳ 第 `2` 行」—— 该行 09-14 起已是 **✅**、已转 backlog。
- **仍成立的半（凭据）**：「CI secret 要不要设」**确实仍要 owner**（⛔ AI 不得处置密钥）。
  ⇒ 整句删会把一个**仍然成立的事实**一起抹掉。

🟢 **顺手把分叉的【后半】也消了** —— 上一轮实测 lab 的关键读数 `629,268` 在 DS 侧
`backlog.md` · `STATUS.md` · `meta-rules.md` **三个面全零命中**。本轮把它连同归因
（**用法不匹配**：闸是节点级增量，CI 上没有「刚触碰了哪个节点」这个信息）一起写进 DS 真源
⇒ **两侧互指 + 关键读数缺失，一次消掉。**

✅ **验证有效、以后照做**：**「刻意未做」类登记必须写清【阻碍是什么】，⛔ 不能只写「暂不做」。**
上一轮写的是具体的可测条件（「工作区脏」）⇒ 本轮**一条 `git status --porcelain -- <path>`**
就判完了，零成本。若当初写成「时机不合适」，这一轮就得整格重查。

🔴 **本轮踩的一条（留痕）**：`git commit … | tail -30; echo "EXIT=$?"` —— 读到的是 **`tail` 的**
退出码，⛔ 不是 git 的（`lab:N47` 推论三逐字警告过，又踩）。本次靠输出里
`[master d4c387f2] 1 file changed` 才判得出真结果，**而那个 `EXIT=0` 本身不算数** ⇒
已另跑无管道的 `git log -1 --name-only` 复核（确认只含 `docs/internal/backlog.md` 一个文件）。

---

#### 二 · B3 —— owner 批了授权，`§4.2` 当轮答掉

**阻碍的性质上一轮就变了**（从「lab 做不到」变成「要一句授权」），本轮 owner 逐字批
**「先小后大」** ⇒ 当轮做完。

| 臂 | 文件（`dist-wc/`） | 字节 | 结果 |
|:-:|---|--:|---|
| **1（小）** | `tvu-web-components.d.ts` | **26,373** | ✅ 写入成功 |
| **2（大）** | `tvu-web-components.umd.cjs` | **3,157,175** | ✅ **写入成功 ⇒ ⛔ 不超限** |

🟢 **「先小后大」买到的正是归因**：两臂**同目录、同 `localPath` 通道、同为 gitignored 产物**
⇒ 臂 2 若失败，臂 1 的成功把归因锁死在**体积**上，⛔ 不会被读成「通道 / 参数没接对」
（`AGENTS §3.9`）。⚠️ 这也是 owner 那个选择比「直接传大的」强的地方，⛔ 不是多跑一轮。

🔴 **证据⛔ 不取自工具自述**（`AGENTS §4`）：`write_files` 只回一句 `written: 1` ——
靠**写后 `list_files` 独立列出两个路径**才算数；清理后 `get_file` 两个都 **404**、
`list_files` 里连探针目录都不剩 ⇒ **owner 项目零残留**。
⚠️ **404 单独看也可能是「从来没写成功过」**（第二种 0）—— 是**写后那次 `list_files`** 闭合了证据链。

⛔ **三条边界，⛔ 别外推**：① 只证明**服务端接受并列进索引**，⛔ 未证明远端字节与本地逐字节相同
（`get_file` 上限 256 KiB，读不回来比对）② **一次观测** —— 只知 3.16 MB 在限内、⛔ 不知限在哪
③ **与 §4.3 无关**，那条仍不可达。

⚠️ **口径**：处方写「3.13 MB」，现取 **3,157,175 B = 3.01 MiB = 3.16 MB**（两个进制都给，⛔ 别混）
⇒ 量级相同、判据不变，**⛔ 不改处方那句原文**。
⚠️ 另一个对不上的数照旧**并排登记、⛔ 不裁**：处方「≤ 500 entries」vs 契约「max 256 files per call」
⇒ 差 1.95×，**主语可能不同**（`lab:E50`）。

✅ **判出「已测」⇒ 当场回改处方正文 5 处**（§4.2 本体 · 「10 分钟人工动作」那句 · §6 判据 1 ·
§7 未知表第 2 行 · 头栏执行状态）—— **处方才是 DS 侧的入口**，⛔ 只写报告不算
（`AGENTS §2.25` 推论三）。

🟢 **这是 memory [[measure-negative-claims-too]]「否定性断言也要实测」第六次兑现** ——
处方逐字的「**lab 无法实测**」「只能由人在界面里试」，在体积这一半上**是假的**。
⚠️ 但**另一半是真的**：§4.3 确实不可达 ⇒ **⛔ 别把这次的反转外推成「那句整个错了」。**

---

**产物**：DS **`d4c387f2`**（`docs/internal/backlog.md`，+6/−1，pre-commit 全绿）·
lab 登记面回改（B4 行 · B3 行 · 处方 5 处 · 本节）。⛔ **未动 DS 任何判据 / 闸 / 规则正文。**

### 2026-09-15 第八轮 · 对【全部 6 条阻塞】跑五行块 ⇒ 清单 6 ⇒ **4**，🟢 **剩下的全是真阻塞**

**⛔ 这一格没有「挑一条做」** —— 上一轮收尾时清单已只剩阻塞，所以本格做的是
**对每一条问「阻碍解没解除」**。结果分两档，⛔ 别合并成「做掉了 2 条」：

| | 条 | 性质 | 总数 |
|:-:|---|---|:-:|
| 1 | **B1** | **前件已被裁定不会到来** —— ⛔ 不是「还没到」。O1 本轮被 owner 拍「不做」⇒ 定义域 `M` 恒空 ⇒ 那条承诺指标**结构上永不触发** ⇒ 销账 | **−1** |
| 2 | **B6** | **阻碍本就不在「做不动」上** —— 它登记的第一步是**回改**，而回改从未被阻塞 ⇒ 解除后按读数定案「不做」⇒ 销账 | **−1** |
| 3 | **B2 · B4 · B7** | **现取仍是真阻塞** —— 三条都拿到了新读数，⛔ 不是「没查」 | 不变 |
| 4 | **B3** | 🟡 **性质变了但未解除** —— 阻碍从「lab 做不到」变成「**要 owner 一句授权**」 | 不变 |

| | 起手 | 止（收尾真重取）|
|---|---|---|
| **lab** | `fd7a091` clean | 本轮交付 commit |
| **DS** | `71d9405d` · 脏 9（5 M + 4 `??`，⛔ 零我方）| **`98d3e0b8`** · 脏 6（⛔ 仍零我方）。🔴 **格内漂了一次**，且**这次漂到了被验载体上** —— `backlog.md` / `STATUS.md` 正是 B4 的两个载体 ⇒ **已在新 sha 原样重跑，结论不变**；B6 的 5 个载体全部未漂 |
| **pin** | `8b226335` / `36554059`（旧） | 新建 **`tvu-ds-71d9405d`**（dirty=0）|
| **标准 ①** | `没人守` **32** · 基线 **32** · ratchet **35** · 红 1 | 🔴 **止栏有两个读数，⛔ 别只写一个**：**① 收尾重取**（`98d3e0b8` · 工作树脏 6）= `没人守` **32** · 基线 32 · ratchet 35 · **红 1** ⇒ 全部持平；**② 提交时刻**（pre-commit，同一个 `98d3e0b8` · 工作树脏 0→换了一批）= `没人守` **33 > 基线 32** ⇒ **红 2**。差额成因**实测**：并行 session 正往规则真源加一段 `#### M23.20`（未提交、未上闸）⇒ 段 134→135。**⛔ 非我方账**，已登记 §3 |

🟢 **标准 ① 没动，而这是【对的】**（§0.2.3 要求说清为什么没变）：本格**一个字节都没改被测仓** ——
产出全是 **lab 侧登记面的回改**。⛔ 「读数没动」在这里不等于「这一格没效果」，效果是
**清单从 6 条缩到 4 条，且剩下 4 条各自拿到了新读数**。

🔴 **而那条在提交时刻冒出来的红，是 `lab:N70` 第 4 次实证、也是最强的一次** ——
前几次工作树漂到的是无关文件，**这次直接漂到了标准 ① 的判定面本身**，把一条棘轮从绿弄成红，
而 `HEAD` 一动没动。⇒ **口径再加一句：`ratchet-watch` 读的是【工作区】、lab 的测量读的是【pin】，
两者在「HEAD 相同」时仍可能给出不同读数 ⇒ 引用棘轮读数必须标是哪一个面。**

**三条一句话结论**

1. **B1** —— 它是 O1 的**验收指标**（`P2a+P2b ≤ 20` on `M` = 已改完的子集）。owner 拍 O1「不做」
   ⇒ `M` 恒空 ⇒ 这条承诺**永不触发**，正是 [[conditional-commitment-antecedent-reachability]]
   那个形态。**销账⛔ 不是新判断，是那次裁定的直接推论。**
   ⚠️ ⛔ 别读成「指标当初立错了」—— 它的形态是对的（承诺落在**和**上防「改成中段灰让 P2a 归零」）。
2. **B6** —— 三条订正现取全成立，而且**早在第五轮就回写进 DS 真源了**（`d10e151b`，subject 逐字
   「ai-ds-lab 复核」）⇒ **对方会读的那份文件一直是对的，没跟上的是 lab 自己的 `decision-queue.md:64`**
   ⇒ `lab:N56` 知情面分叉。定案「不做」：出路 (ii) 实测达不到目的、(i) 代价跨 3 类载体 ≥ 9 处
   而**对标准 ① 零影响**、(iii) 现状已是正确终态。
3. **B3** —— 处方逐字「lab 实测不了 / 只能由人在界面里试」，而**本 session 实际持有 `DesignSync`
   通道**（`write_files` 支持 `localPath` 直传）⇒ §4.2 已可实测。**但那是写 owner 远端项目的
   外部动作** ⇒ ⛔ 不自作主张。这是 memory「[[measure-negative-claims-too]] 否定性断言也要实测」
   第六次兑现 —— 与 Q11 那次（「token 签不出来」被 `use_figma` 通道推翻）**同一个形态**。

🟢 **验证有效、以后照做的两条**（⛔ 不只记教训）

· **五行块第四行「它还该做吗」第三轮连续有牙** —— 本轮翻掉 **B1**（事实读对：`|M|=0` 仍成立，
  塌的是**存在理由**）。**第五行「lab 自己验过没」这次抓到了 B6**（已回写真源却没回改自己的入口）。
· **「横着对一遍推荐」这条上轮新立的口径，本轮第一次主动用上**：B6 判「不做」之前先与
  同族的 O1「不做」、B9「hold」对齐 —— 三条共用同一条判据（**改动对标准 ① 零影响 + 代价真实**）
  ⇒ ⛔ 没有再出现第七轮那种自相矛盾。

🔴 **本轮踩的三条（留痕）**

1. **数自己的清单时，判定面被自己刚写的小结表污染** —— 幼稚 grep 数出 **8**（正好翻倍），
   真值 **4**。⇒ 口径必须锚到该节**最后一张** `| # |` 表头之后（`§2.21 推论二①`，这次栽在自己家）。
2. **同一个路径坑踩了第二次** —— 上一轮登记的 `docs/internal/meta-rules.md` **在该 sha 上不存在**，
   真身是 `docs/meta-rules.md` ⇒ 那个面上一轮实为**第二种 0**（本轮补跑后结论不变）。
   ⚠️ `AGENTS §23 口径二` **早就记过这个坑**（当年是目录 vs 文件）。
3. **`node -e` 内嵌带引号代码被 zsh 吃掉** —— `lab:N73` 逐字警告过，本轮又踩，改 heredoc 写文件才过。
   ⚠️ 同轮另有一次：`npm key ≠ 文件名`（`report:gate-regression-face` 真身是
   `scripts/gate-regression-face-inventory.mjs`），我按同名猜路径 ⇒ `MODULE_NOT_FOUND`
   ⇒ **那是装置故障，⛔ 不是被测对象**（`§2.25 推论八` 已立过「先建 key→文件 解析表」）。

**产物**：登记面回改 **9 处**（`frozen-worklist` 文件头进度行 + §1.3 节标题 + 新增小结表 +
B1/B2/B3/B4/B6/B7 六行 · `decision-queue.md:64` 一处定案）· 新 pin `tvu-ds-71d9405d`（dirty=0）·
报告 [`reports/2026-09-15-b-blockers-five-line-sweep.md`](../reports/2026-09-15-b-blockers-five-line-sweep.md)。
⛔ **未改被测仓一个字节。**

### 2026-09-15 第七轮·续 · owner 当轮把 4 条全拍了 ⇒ 清单 10 ⇒ **6**，🟢 **§1.1 也清零**

**⇒ 现在清单上⛔ 没有一条是「该做而没做」的 —— 剩下的 6 条全部是等前件的阻塞。**

| 条 | owner 拍的 | 下场 |
|---|---|---|
| **B9**（`#M38` 上不上闸）| 逐字「**不用因为消费产品的错误设计来让我修改 DS 设计系统**」| **判 hold** —— ⛔ 不上闸、⛔ 不入豁免表、⛔ 棘轮不动 |
| **O1**（175 白底）| **不做** | **销账** —— 446 停在 446，闸 shrink-only 只许降 |
| **O3**（逃生口合并实测）| **用到时自然验** | **销账** —— 判据已写进 hook 注释当承载栏位 |
| **O6**（行内 Acceptance）| **改文档排版** | ✅ **当轮做完**（DS `71d9405d`）|

| | 起手 | 止（收尾真重取）|
|---|---|---|
| **lab** | `fec8ade` clean | 本轮交付 commit |
| **DS** | `12dda7c1` · 脏 6 | **`71d9405d`** · 脏 6（⛔ 仍零我方）· 已 push。⚠️ 格内又漂一次（`12dda7c1` → `3bb612e4`，并行 session 8 个文件）—— **我这格 6 个载体全部未漂** |
| **标准 ①** | `没人守` **32** · 基线 **32** · ratchet **35** | **同上，全部持平**（本批动的是 `items`/S4 那一维，⛔ 不是 `state` 那一维 —— `lab:N71`）|

🔴 **B9 的理由必须记 owner 的原文，⛔ 别记成 lab 原来那条**「只有一层机检得了」。
那 2 条真违例全在**消费产品的稿**里（`Micro Apps 20250923`），而这与 owner 2026-09-11 的射程裁定一致：
DS 侧的射程 = 那**唯一一个设计组件库**，消费产品的稿由**消费侧** workflow 审。

⚠️ **lab 本轮撤回过一条自己的推荐，留痕（这是本轮最该记的一条）**：
B9 原推荐是「owner 先在 Figma 把那 2 条 2px 改 4px，再落半条闸」——
🔴 **它与同一批里 O1 判「不做」的处置自相矛盾**（O1 的理由正是「闸已止增、不做的代价 = 停在原地」）。
owner 质疑「为什么又让我修改 Figma？不是说 Figma 上的是真源吗」后我才发现。
⇒ **口径：同一批问题一起问时，先把自己那几条推荐横着对一遍**，⛔ 别逐条各自最优。

✅ **顺带把三条一直被混用的裁定分开登记**（逐字，⛔ 别再混）：
① **「Figma 是真源」**（`docs/PROJECT_GOAL.md:51`）主语是**变量/token 的定义方向**（code 跟 Figma），⛔ 不是「Figma 里每一格都对」·
② **「⛔ 不写 Figma」**（F62 spec）主语是 **AI** ·
③ **射程裁定**（2026-09-11）管的是**哪个文件是设计系统库**。

🟢 **O6 那一格买到的东西，用一句话说**：6 段的 `items` 从 0 变 1 ⇒
**S4 对位从「恒过」变成「活的双向哨兵」**（造故障三臂坐实：加一条红 · 改回行内也红）。
而那 4 条 `[0]` 自陈的红**是哨兵按设计意图炸的** —— `audit-commit-affordance-trace.mjs` 的注释
逐字等的就是这一天。

**产物**：报告 [O6](../reports/2026-09-15-o6-inline-acceptance-reformat.md) ·
DS `71d9405d`（6 段排版 + 4 条自陈 `[0]`→`[1]` + 哨兵注释如实更新）·
lab hook 注释补 O3 的销账判据（`AGENTS §2.26`：纪律要有承载栏位）·
登记面回改 **6 处**（§1.1 三条 + §1.3 B9 + 两个节标题 + 现取块）。

### 2026-09-15 第七轮 · 一格动三条（L15 改判 · L7 销账 · L14 做完）⇒ 清单 12 ⇒ **10**，🟢 **§1.2 清零**

**三条的性质完全不同，⛔ 别合并成「做掉了 3 条」**：

| | 条 | 性质 | 总数 |
|:-:|---|---|:-:|
| 1 | **L15** ⇒ **B9** | **改判挪节** —— 标的「下一批抓手 `#M38`」不成立，按字面做会落出**有效分母 0 的恒绿闸** | 不变 |
| 2 | **L7** ⇒ 并入 **B4** | **真销账** —— 它要取的读数**服务不了它要服务的决策**，而那个决策要的读数 lab 早已取过 | **−1** |
| 3 | **L14** | ✅ **真做完**（DS `12dda7c1`）—— owner 当场拍两问后上闸 | **−1** |

| | 起手 | 止（收尾真重取）|
|---|---|---|
| **lab** | `3568a87` clean | 🔴 **`5efc501`**（本轮 3 个交付 commit：`70dc0d4` L15 · `21aed1e` L7 · `5efc501` L14 + 第七轮小结）· 全推 |
| **DS** | `36554059` · 脏 9（⛔ 零我方）| **`12dda7c1`** · 脏 6（⛔ 仍零我方）· 已 push。⚠️ **格内漂了一次**（`36554059` → `2dc67009`，并行 session 4 个文件）—— 已按 `lab:N58` 推论四核过：我这两格的 **5 个被验载体全部未漂** ⇒ ⛔ 无需重建 pin 重跑 |
| **pin** | `8b226335`（上一轮的）| 新建 **`36554059`**（dirty=0）|
| **标准 ①** | `没人守` **33** · 基线 **33** · ratchet **35** · 红 1 | 🟢 `没人守` **32** · 基线 **32** · ratchet **35 持平** · 红 1（`render-drift-gate-react`，§3 已登记非我方账）|

🔴 **两条棘轮的变化分开归因**：
· `没人守` 33 → 32 —— ✅ **L14 挣的**（归因三臂：对照 EXIT=0/32 · 摘自陈 `[S2] 33>32` EXIT=1 · 撤一份声明 ⇒ 新闸 EXIT=1）。
· `gate-regression-ratchet` **35 持平** —— ✅ **这是对的，⛔ 不是「没效果」**：新闸自带整脚本面 ⇒ `face = E-fx` ⇒ 按它自己的判据本就不计入（`lab:N71`）。
  ⚠️ **反过来说 —— 不写那份测试它会 +1，把这一格的收益抵消掉。**

**三条的一句话结论**

1. **L15** —— `#M38` 的三条立项依据**一条不剩**：规则逐字的 `strokeLeftWeight` 在 **462,618 个节点 0 命中**（Plugin API 名 ≠ REST 名）· 「377/0」**不可复现**（三份未动 payload 已 **409**）· 「零存量」是**口径造出来的**（原生射程 `State=Selected|Active` 下 **2/2 全违例**）。⇒ 等 owner 拍三条出路。
2. **L7** —— 那 5 份 payload **全是消费产品文件**，而 DS 真源逐字定死 `FIGMA_FILE_KEY` = 唯一的设计系统库、其余 key **⛔ 不从环境变量来** ⇒ `release.mjs` **结构上够不到它们**。而按 owner 拍定的射程，同一条闸的读数 lab 早已取过 = **629,268** ⇒ 与 `wire-ci` 同一堵墙 ⇒ 并入 **B4**。
3. **L14** —— 真源逐字「往真源发明新格式 ⇒ **owner 决定，⛔ agent 不自拍**」，而 09-11 agent 自拍过一次。**本轮交回 owner 重拍** ⇒ owner 拍「要」+「单段·扫描面」⇒ 上闸落地。**⛔ 不留下「agent 可自拍真源格式」的先例。**

🟢 **验证有效、以后照做的两条**（⛔ 不只记教训，`AGENTS §复盘拆分记录`）：
· **第六轮那个问法再次兑现** —— 摊原文 + 并列出路 + 每条动什么 + **一条推荐**，owner **当轮就把两问都拍了**（对比：同类问题 09-09 用「要不要批 X」问，悬置 7 天）。
· **五行块第四行「它还该做吗」再次有牙** —— 本轮它**翻掉两条**（L15 的标的 · L7 的标的），而两条的**事实全部读对**，塌的都是**存在理由**（`lab:N54`）。

🔴 **本轮踩的一条（留痕）**：L14 初版只挂 L4，全量当场红 1 条 —— `audit:gate-ci-parity` 差集 = 1。
**「刻意不进 `gate-chain`」⛔ 不蕴含「不用进 CI」**，那是两个挂载层，我没核这个箭头（`AGENTS §3.16`）。
✅ 是**闸自己抓到的**，⛔ 不靠警觉；按它给的默认修法接线，⛔ 没绕过。

**产物**：三份报告（[L15](../reports/2026-09-15-l15-m38-three-layer-denominators.md) · [L7](../reports/2026-09-15-l7-wire-release-reading-target.md) · [L14](../reports/2026-09-15-l14-discipline-scope-1b-gate.md)）·
新量具 `metrics/m38-three-layer-denominators.mjs`（`--self-check` EXIT=0 · 26 项断言全绿）·
新 pin `tvu-ds-36554059`（dirty=0）· 登记面回改 **10 处**（`frozen-worklist` 5 · `decision-queue` 4 · 09-09 读数 2 · `review.md` 1，含 DS 侧 2 处真源回写）。

### 2026-09-15 第六轮 · L13 改判「接闸不成立」⇒ owner 当场拍 (a) ⇒ 落地（清单 13 ⇒ 12）

**⛔ 没有按登记的字面做那件事。** 按 `AGENTS §0.2.2`「做之前先审查」跑五行块，**第四行（它还该做吗）当场翻掉本条**。
**两步，⛔ 别合并成一件**：① L13 从 §1.2 **改判挪进** §1.3 **B8**（13 ⇒ 13，⛔ 不是做掉）；
② 把三条出路摊给 owner，**他当场拍 (a)「判 not-machine-checkable」** ⇒ **B8 阻碍解除并做完**
（DS `36554059`）⇒ **13 ⇒ 12**。
🔴 **按登记的字面做出来的会是一条假绿；按 owner 拍的做出来的是一条诚实的 nmc 登记 —— 棘轮同样降 1，性质完全不同。**

| | 起手 | 止（收尾真重取）|
|---|---|---|
| **lab** | `92a0873` clean | 本轮交付 commit |
| **DS** | `7161df26` · **脏 13** | 🔴 **`36554059`** · **脏 8** —— 格内漂 +2（并行 session 建 `audit:mockup-language-isolation`）**再 +2 本格**（`c22d44bb` 头注释回写 · `36554059` nmc 登记），均已 push |
| **pin** | `7161df26` dirty=0 | 同 **＋ 新建 `8b226335` dirty=0** |
| **标准 ①** | 🔴 红 2 · 绿 2 · `没人守` **34** · 基线 **34** | 🟢 **红 1 · 绿 3**（exit 3）· `没人守` **33** · 具名豁免 **52 ⇒ 53** · 基线 **33** |

🔴 **标准 ① 的两段变化必须分开归因，⛔ 别合并成「本轮把红从 2 降到 1 还降了基线」**：
· **红 2 ⇒ 红 1** —— ⛔ **不是本格挣的**，是并行 session 提交了他们那道新闸（顺带**独立印证了上一轮的两臂归因**）。
· **`没人守` 34 ⇒ 33（基线同降）** —— ✅ **是本格挣的**，归因见 B8 那行的三臂。
· 剩下的 `render-drift-gate-react` 仍红（`§3` 已登记非我方账，连续 28+ 次跑）。

**结论一句**：**给 `#M23.18` 接闸，在当前规则措辞下无法诚实达成 —— 真去做就是造一条假绿。**
闸判 `gated` **只看有没有自陈**（`audit-acceptance-gate-coverage.mjs:14` 逐字「⛔ 本闸**不判**某条
Acceptance 该不该有闸」），而这一段的验收项要判的是「**起手 M48 self-check 清单里有没有写那句声明**」
—— M48 是起手 Gate、产物落**对话 / Figma 侧** ⇒ **仓库侧零对象**。

✅ **两臂**（用闸自己的导出 `classify()`，零改动被测对象）：注入**一行**自陈 `[0]`
⇒ `unclassified → gated`、总数 **34 → 33**；而该段 `Σ核查项 = 0` ⇒ `[0]` 的 S4 对位**恒过**（`0===0`）
⇒ **一行自陈就降棘轮，且没有任何判据会响**（`lab:N63` 推论七）。

🔴 **`lab:N54` + `lab:N56` 同时命中，且都在我自己身上**：登记的事实**全部仍成立**
（自陈确实只有子号 · state 确实 unclassified），塌的是**存在理由**；
而 lab **09-08 就判对过**（4 处写「判定面是 X 不落盘 ⇒ 分支 nmc」），与 2 处「接闸是 agent 的活」分叉 ——
⚠️ **其中 `decision-queue.md:484` 正是我上一轮（第五轮）刚订正过的行**：我订正了「零调用方」，
**没核验收项的判定面**。

🔴 **DS 在格内漂了 +2，且两个被验载体（`mockup-conventions.md` 与闸脚本本身）都在漂移的
`--name-only` 里** ⇒ 按 `lab:N58` 推论四**建新 pin 原样重跑**：三条读数 **@`8b226335` 逐字全部仍成立**
（②「一字未变、行号也没漂」），两臂结论相同、只有基线口径整体平移 1（35→34 ⇒ 34→33）。
⚠️ ⇒ **引「接闸后降 1」必须带 sha**。

✅ **owner 当场拍 (a)，落地三臂实证**（DS `36554059`）：段级豁免入表（35 ⇒ 36 条）+
`BASELINE_UNCLASSIFIED` **34 ⇒ 33**（只许降、降了就锁住）。三臂：对照 `EXIT=0`·`nmc`·33=33 ｜
删豁免行 ⇒ `[S2] 34 > 33` ｜ id 改成不存在段 ⇒ **`[S2]`+`[S3]`** ⇒ **三臂互不相同 ⇒ 判别器成立**。
⛔ **未动规则正文**；重开条件写进 `reason`。全量 **3554 passed / 0 failed**。

**产物**：报告 [`reports/2026-09-15-l13-m2318-gate-target-recheck.md`](../reports/2026-09-15-l13-m2318-gate-target-recheck.md) ·
新 pin `~/.ai-ds-lab/pins/tvu-ds-8b226335`（dirty=0）· 登记面回改 **4 处**
（本文件 L13 行 + §1.3 新增 B8 + 两个节标题条数 · `decision-queue.md:54` `:484`）·
**DS 回写 1 处**（`c22d44bb` —— `scripts/lib/detect-frame-theme.mjs` 头注释补「『仍未接闸』⛔ 不蕴含
『那就去接闸』」，⛔ 只写事实那一半 + 三条出路待 owner，**⛔ 未代裁**；`node --check` OK ·
`DetectFrameTheme.test.ts` 54/54 · pre-commit 全量 **3554 passed / 0 failed** · 已 push）。

✅ **交给 owner 的那一问，当轮就有了答案**（⛔ lab 不裁、只摊出路，`AGENTS §2.21`）：
三条出路 **(a)** 判 nmc 入豁免表（⚠️ 表里已有 **19 条**同型段级先例）· **(b)** 按 `#Canonical` 先例降级规则 ·
**(c)** 改 Acceptance 措辞 —— 摊开后 **owner 逐字选 (a)「判 not-machine-checkable」**。
⚠️ **留痕**：同一结论 lab **09-08 就判出过**并登记「分支 nmc 属 C4 ⇒ owner」，而 09-09 Q1-d 提问时
owner 的回应是反问「第二个确定有必要做吗」、⛔ 不是批准 ⇒ **该问悬置 7 天**。
🔴 **为什么这次拍得下来、上次拍不下来**：这次摊的是**三条并列出路 + 各自动什么 + 一条推荐**，
⛔ 不是「要不要批一个豁免」这种单选题 —— 对应 memory `recommend-one-value-not-a-menu`
与 `ask-owner-with-source-text-not-jargon`。**这条做法验证有效，以后照做。**

### 2026-09-15 第五轮 · L4 逐条对位表重取

**做完 1 条清单项 = 15 条逐条核闸。** 清单 **14 ⇒ 13**（lab 5 ⇒ 4）。

| | 起手 | 止（收尾重取）|
|---|---|---|
| **lab** | `79f923c` clean | **`7a2d6a8`**（主交付，已推 origin）+ 本行回填那一笔 |
| **DS** | `7161df26` · **脏 6** | **`7161df26`**（HEAD 零漂）· 🔴 **脏 6 ⇒ 11** —— 收尾重取时并行 session 正在建一道新闸（`audit-mockup-language-isolation` + 规则模块 + 测试 + `package.json` + `mockup-rules/index.mjs`）。**我零改动 DS。** |
| **标准 ① 读数** | BASELINE 35 · 🔴 红 1 · 绿 3 · 跳过 1 · 61/82 | 🔴 **红 2 · 绿 2**（`gate-regression-ratchet` 新红）· `没人守` **35 ⇒ 34** · 判据脚本 **82 ⇒ 83** —— **⛔ 不是我的账**，两臂归因见下 |
| **判定面** | `scripts/audit-*.mjs` = **81 道**（处方登记时 68 道）| 同 |

🔴 **§0.2.3 收敛判据：标准 ① 的读数【没动】，而这是【结构上就该没动】**（`lab:N71`）——
L4 是**纯重取**，⛔ 未改 DS 一个字节、⛔ 未增减任何闸；棘轮数的是「blocking 闸的接线零覆盖条数」
⇒ **它对「重取一张登记表」这类动作零敏感。** ⛔ 别读成「这次优化没效果」，
**也⛔ 别读成「它该动而没动 ⇒ 闸有问题」** —— 按它自己的口径它是对的。
**本格的效果落在另一处**：一张此前逐字写着「⏳ 未重取」的对位表变成有据的现状表，并**改判了一条**。

**读数**：15 条里**只有第 15 条改判**（(a) ⇒ **(e)**）⇒ `n_a` **5⇒4** · `n_b` 8 持平 ·
`n_c` 0 持平 · `n_e` **2⇒3**（⛔ 全档并排）。改判依据 = `audit-mockup-binding-fidelity.mjs:21`
**逐字自认**「§M52 那 2 条里「字段 parity 表 / 反馈类 inventory / 强调预算」**本闸都不管**」
⇒ 有闸（B-SCALE / B-COVERAGE 覆盖四清单**前两项**）、判定面窄于规则 = **(e)**。

🔴 **本格最强的一条发现（已登记进 §3，⛔ 不排期）**：`covers-acceptance:` 自陈的粒度是**段**、
⛔ 不是**条目** ⇒ **8 条 (b) 里有 5 条所在的段【是被自陈覆盖的】**，只看自陈会把它们读成「已覆盖」。

🔴 **三次「差点骗过自己」，全部由控制 / 现取当场抓住（⛔ 登记不删）**：

1. **`MN1` 第一版写成「已知假阳零命中」⇒ 直接红。** 成因：`hug` 在**真命中**
   （`geometry-consistency:15/:480` 讲「按钮 hug 纪律」）与**假阳**（`ZH hugs its EN` /
   `intrinsic/huge size`）里都出现 ⇒ 把词写窄会连真命中一起丢。**改法**：显式排除那两串并
   **钉住排除数 = 4**（具名事实）—— ⛔ 不写成「零命中」，否则 DS 改掉措辞时控制仍绿（`lab:E45`）。
2. **`MN3` 第一版断言「宽尺 ⊇ 窄尺」⇒ 9 条红，而红在【我的断言】、⛔ 不在被核对象。**
   宽尺是「几何族通用词」，对 #10–#14 那批 **handoff 记录类**条目结构上不可能是上界。
   ⇒ 改成双向差集都输出、都由人解释，控制改钉「窄尺没退化成全命中」。
3. **`zsh` 又咬一次**（`AGENTS §3.9` 同族）：`grep --include=*.md` 不加引号被 zsh 当 glob 展开
   ⇒ 8 个关键词全报 `no matches found`，**长得像「规则真源没了」**。加引号后 15 条锚全部现取到。

✅ **五行块第五行（`lab:N56`）当场省掉一次重做**：L4 登记的前置③「必须先回改登记面」，
起手现取发现 `round2-status.md` 的 2026-09-15 订正块**已在位** ⇒ 那件事早做完了。

🔴 **收尾时撞到 `lab:N70` 第三种形态（HEAD 零漂 ⛔ 不蕴含被验环境没变），并两臂归因**：
本格交付推完后重取，DS **HEAD 一动没动**、**工作树却从脏 6 涨到 11** ——
并行 session 正在建一道新闸 ⇒ 标准 ① 当场多一条红。**归因靠两臂，⛔ 不靠推**：

| 臂 | 树 | `gate-regression-ratchet` | `没人守` | 判据脚本数 |
|---|---|:-:|:-:|:-:|
| **A** | **干净 pin** `@7161df26`（dirty=0） | 🟢 **绿** | 35 | 82 |
| **B** | DS 工作区（脏 11） | 🔴 **红** | **34** | **83** |

⇒ 新红**完全由那 5 项未提交改动造成**，**⛔ 不是 lab 的账**（我零改动 DS）。
⛔ **未改对方文件去凑绿、⛔ 未 `--no-verify`** —— 按纪律只如实登记。
⚠️ 顺带：那道新闸让 `没人守` **35 ⇒ 34**（对方在缩基线，是**好事**），
但它自己进判定面后**接线零覆盖** ⇒ 棘轮红。**这是对方那一格要收的口，⛔ 不在本轮射程。**

✅ **本格自己的读数不受这次漂移影响** —— 全部测量都在 pin 上做（`AGENTS §1` 只读边界的意义正在此）：
量具在漂移**之后**原样复跑，与交付产物 **逐字节空 diff**。

**产物**：新量具 `metrics/acceptance-item-gate-recheck.mjs`（6 条控制全绿 · 同 sha 复跑**空 diff**）·
新 pin `~/.ai-ds-lab/pins/tvu-ds-7161df26`（dirty=0）·
候选面 `subjects/tvu-ds/inventory/acceptance-item-gate-recheck-7161df26.json` ·
报告 `reports/2026-09-15-l4-designqa-pairing-recheck.md` · 处方回改三处（原文留痕不删）。

⚠️ **CI ⛔ 不能说「全绿」**（沿用 §3 已登记）：GitHub CI 持续 failure 且 job `steps=0`、
Gitea API 要鉴权取不到。本格**未跑 DS 全量 vitest**（零改动 DS ⇒ 无需）。

### 2026-09-15 第四轮 · 绿档 WARN 收口（L8 + L9）

**做完 2 条清单项 = 4 条通路，⛔ 一条一个 commit。** 清单 **16 ⇒ 14**。

| | 起手 | 止（收尾重取）|
|---|---|---|
| **lab** | `e2b2013` clean | 见本轮末尾 commit |
| **DS** | `505884f6` · 脏 6 | **`7161df26`** · 脏 6（⚠️ **脏项与起手逐项相同** ⇒ 并行 session 本格未再写；我的 4 笔全已推两个远端）|
| **标准 ① 读数** | 🔴 红 1 · 绿 3 · 跳过 1<br>`gate-regression-ratchet` **BASELINE 37** | 🔴 红 1 · 绿 3 · 跳过 1（**同一条红**，见 §3 已登记的非我方账）<br>🎉 **BASELINE 35**（−2）|
| **判据脚本有测试** | **58/82** | 🎉 **61/82**（+3）|
| **全量 vitest** | 3520 passed | **3531 passed · 0 failed** |

🎉 **§0.2.3 收敛判据：标准 ① 的读数【真的动了】** —— `BASELINE` **37 ⇒ 36 ⇒ 35**，
两格各由一条新面承载，**归因两臂/四臂逐格实测**（⛔ 不是推的）：
· 36 由 `audit-mockup-binding-fidelity` 承载（四臂：两面都在 36 / 只移开本条 37 / 只移开 colors 面 36 / 都移开 37）
· 35 由 `audit-mockup-conformance`（引擎）承载（两臂：新面在 35 / 移开 36）
⚠️ **两条闸缩不动它，⛔ 别读成「没效果」**（`lab:N71`）：`audit-mockup-colors` 与
`export-claude-design-bundle` **都不在棘轮的 91 条闸清单里**（前者没有自己的 npm key，
后者根本不是闸）⇒ **结构上不进分母**。它们的效果在各自的造故障两臂上。

🔴 **L9 那句「要先换判据」是对的，而且原判据的无效是【结构性】的**：
引擎的 `console.warn` 计数 = **0**，两处承载物是 `process.stderr.write`（不走 console）
与规则模块返回的**结构化 `unverified` 字段**（根本不是发射）。换判据后实测
**此前两处都零人守**（各自注入 + 全量 ⇒ **0 failed**）。
⚠️ 那个 `0` 有**阳性对照**撑着（⛔ 不是「装置坏了」的 0）：三臂两个量正交 ——
原样 `1/6` · 摘 `stderr.write` `0/6` · `unverified` 恒 null `1/3`。

🔴 **新装置（零改动被测对象）**：`NODE_OPTIONS=--import <stub>` 覆写 `globalThis.fetch`。
三条 403 闸的 API 基址是写死常量、不可参数化，而 `INFRA-F138` 逐字封死了「为了让 harness
能用去改活闸」⇒ 这是唯一入口。共享 harness `runGate` 加**可选第 4 参 `env`**
（merge 进 `gitCleanEnv`，不传时行为一字不变 ⇒ 35 份既有用户零影响，已用全量证过）。

🔴 **三次「差点骗过自己」，都是当场抓住的（⛔ 登记不删）**：

1. **「stub 没生效」会让整组假绿，且极难看见** —— stub 不加载时闸会拿**假 token** 去打
   **真**上游 API，而真 API 对无效 token **同样返回 403** ⇒ 那句 WARN 照样打出来
   ⇒ 只断字符串的用例会通过，而它测的是真网络。**反制**：每份新面都断言一个**哨兵值**
   （本文件编的 nodeId / 变量名 / 确定条数），真 API 不可能返回它。
2. **我自己的注释把一条闸弄红了，而红的位置离原因很远** —— harness 与新测试的头注释里
   引用了闸源码的 `const API = 'https://api.figma.com/v1'`，而那**正是**
   `audit:figma-env-single-source` 的 S5/S6 标记（它逐字声明「出现在**注释**里也算命中…
   这是刻意的 fail-closed 方向」）⇒ 全量红 1 条。**⛔ 没绕闸**：harness 本就不解析凭据，
   是我制造了误报源 ⇒ 去掉字面量并就地留痕防下一个人加回来。
   ⚠️ 第一次只改了一处就复跑 ⇒ **还红**；`grep` 标记才发现第 33 行还有一处
   ⇒ **`AGENTS §2.21` 推论一「grep 要跑完」的又一实例，这次栽在自己身上。**
3. **`"unverified"` 字段计数三臂全不变（17/17/17）** —— 差点拿它当 colors 那条的证据。
   实为输出契约里**每条规则都有**的字段位（值为 null 也计）⇒ 零判别力。
   **并排打三个量才看出来**（另两个量正交地动了）。

⚠️ **CI ⛔ 不能说「全绿」**（沿用 §3 已登记）：GitHub CI 持续 failure 且 job `steps=0`、
Gitea API 要鉴权取不到 ⇒ **本机全量 3531 passed / 0 failed ⛔ 不等于两侧 CI 绿。**

### 2026-09-15 第三轮 · 执行阶段（owner 逐字「1. 回写 2. 继续」）

**从盘点转入执行。** 做完 **4 条 + 1 次跨仓回写**，清单 **20 ⇒ 16**。

| | 起手 | 止（收尾重取）|
|---|---|---|
| **lab** | `f86d2eb` clean | **`5cf8abea`** clean · 本轮 8 commit 全已推 |
| **DS** | `2a8fb2b8` · 脏 6 | **`505884f6`** · 脏 6（⚠️ 格内漂 **4 次**，我的 2 笔 + 并行 session 的 2 笔）|
| **标准 ① 读数** | 🔴 红 1 · 绿 3 · 跳过 1<br>`gate-regression-ratchet` **BASELINE 38** | 🔴 红 1 · 绿 3 · 跳过 1<br>🎉 **BASELINE 37** |
| **清单** | 20 条（3 / 10 / 7）| **16 条**（owner 3 · lab **7** · 阻塞 6）|

🎉 **§0.2.3 收敛判据：标准 ① 的读数【真的动了】** —— `audit-gate-regression-ratchet`
的 `BASELINE` **38 ⇒ 37**。⚠️ **⛔ 不是我说它降就降** —— 是 `pre-commit` 那条闸**自己拦住我**、
逐字要求「BASELINE 必须跟着缩（shrink-only）」，我照它的判据改；
**归因两臂**照仓里惯例做过（新测试移开 ⇒ 38 PASS · 放回 ⇒ 37）。

✅ **跨仓回写（DS `d10e151b`，已推 Gitea + GitHub 两个远端）**：
① `scripts/lib/detect-frame-theme.mjs` 的「本模块目前没有任何调用方（刻意）」已失效 ⇒ 订正，
**并写清一层区分**：接线接的是 §M-VARIANT-AXIS ② 且 report-only，**`#M23.18` 本身仍未接闸**
⇒ 原文那句「别把前置解除读成已接闸」**对它仍然成立**，只是理由换了。
② `scripts/audit-gate-mount-declaration.mjs:174` 的机制描述与自身代码不符 ⇒ 订正 + 补两条代价
（不会动棘轮 · 漏了「测试写死了该路径」），**两条修法方向都给出、⛔ 不替 owner 选**。

🔴 **两次「差点骗过自己」，都是造故障当场抓住的（⛔ 登记不删）**：

1. **修 L5 时差点把一条控制放松掉** —— 本打算去掉写死的 `67`，查出 `must-hit-1` 比的两个集合
   **同源**（`rows = unclassified.map(...)`）⇒ 那个比较**恒真**、写死的 67 是它唯一的信息量来源。
   根因是 **`--dump` 参数声明了却从没被读**。⇒ 改成真读外部 dump 文件才有真判据（`N81.1` 第二例）。
2. **L18 的 S1 用例被我写成了假绿** —— 初版用宽正则 `/S1|…/`，而构造的场景**同时满足 S5**
   ⇒ 把 `collisions.push` 整条拆掉后**测试照样绿**。⇒ 改成钉死 `✗ FAIL（S1）` 精确文案。

⇒ **两条都印证：跑一遍绿 ⛔ 不算验证**（`AGENTS §3.8` / `§26` 推论十）。

⚠️ **CI ⛔ 不能说「全绿」**（已登记 §3）：DS 的 GitHub CI 持续 failure 且 job `steps=0`
（= 没启动，3–5s 结束），最近 4 笔全红、**3 笔在我推之前** ⇒ ⛔ 不是我的账；
Gitea API 要鉴权取不到。⇒ **本机全量 3520 passed / 0 failed ⛔ 不等于两侧 CI 绿。**

**本格自己踩的（⛔ 登记不删）**：① `git status -sb | head -1` 只取分支行 ⇒ 把一次
**staged 未提交**误读成「改动没了」（又一次「命令的输出面」）；② `grep -o 'fail-closed.*'`
先命中 node 堆栈打印的**源码行**、而不是求值后的 Error ⇒ 差点判成「模板没求值」。

### 2026-09-15 第二轮 · 五行块【后三行】（owner 逐字「继续跑」）

**口径**：对第一轮剩下的 17 条跑**后三行**（前提还成不成立 / 它还该做吗 / lab 自己验过没）。
🔴 **判定面分两个，⛔ 别混**：DS 侧 = **`499d32e2`**；lab 登记面 = **`git archive 644028f` 导出树**
（⛔ 不在工作树 —— 本轮自己刚写的内容会污染，`AGENTS §2.22` 推论五；已用阳性对照证过该树不含本轮新写的段）。

| | 起手 | 止 |
|---|---|---|
| **lab** | `f86d2eb` clean | 本格交付 commit |
| **DS**（本格**零改动**）| **`499d32e2`** · 脏 **6** ⚠️ **格内从 `fe5555a3` 漂了 1 个 commit** | `499d32e2` · 脏 **11**（收尾重取）|
| **标准 ① 读数** | 🔴 红 **1** · 绿 3 · 跳过 1 | 🔴 红 **1** · 绿 3 · 跳过 1 |
| **lab 的活** | 17 条 | **10 条** |

🔴 **收尾重取抓到两处格内漂，⛔ 两处都不是 sha 能看见的**（`lab:N70`）：
① **工作树脏 6 → 11**（HEAD **一动没动**）—— 并行 session 新改了 `docs/STATUS.md` / `backlog.md` /
`figma-technical-reference.md` / `render-excused-fields.json` / `figma-sync/variable-map.mjs`。
✅ **本格结论不受影响**：我的读数**全部用 `git grep <sha>` / `git show <sha>:path` 在树上取**，
判定面是 `499d32e2` ⛔ 不是工作树。
② **两次实跑的读数变了**：收尾重跑 `audit-acceptance-gate-coverage --json` 得
`{gated 47 · not-machine-checkable **52** · unclassified **35**}`，而格中实跑时 nmc 是 **51**
⇒ 并行 session 期间加了一条豁免。✅ **`unclassified` 仍 35 ⇒ 棘轮仍绿、L13 的「预测 35→34」不受影响**；
`gate-regression-face-inventory --json` 收尾重跑逐位相同（`blocking:false · face:"M"` · 闸清单 **91** 条）。
⚠️ **边界**：收尾只重取了 counts，⛔ 没重取 `#M23.18` / `#M38` 的逐条 JSON
（我的取数脚本对返回契约猜错，`j.sections` 不是数组 —— 又一次「调导出函数前先读返回契约」）。

✅ **那次格内漂已核，⛔ 不是肉眼判断**：只改 `docs/internal/backlog.md`，而**上一轮 L20 的销账证据就在那个文件**
⇒ 把装置在新 sha 上**原样重跑并 diff**（`AGENTS §2.25` 推论五）：`:30` 那行两个 sha **逐字相同**，
唯一差异是**另一条 entry 的行号 332→335**（内容一字未变），且那次改动里 `INFRA-F146` 出现 **0** 次
⇒ **L20 的销账在新 sha 上仍成立。**

**17 条 ⇒ 销 3（L17 · L19 · L24）· 挪阻塞 3（L6 · L16 · L23）· 合并 1（L10 ⇒ L8）⇒ 剩 10。**

🔴 **本轮最有价值的三条读数**（均已亲验，⛔ 未采信 subagent 文字）：

1. **撞到一条 2026-09-14 的 owner 终裁，而 lab 零处知情**（`lab:N54`）——
   `scripts/audit-mockup-geometry-consistency.mjs:137-138` 逐字「🔴 **2026-09-14 owner 终裁：rows 家族维持
   「默认不开」，28 条存量偏差不逐条判，`CANONICAL-F104` 的 backlog entry 已整条删档。⛔ 别再把它当待办重新提。**」
   （归因 `0f50fcf3`，2026-09-14 17:38:31 —— 比 lab 接手时点早 **15.5 小时**）。
   ⇒ 它**缩掉了 L4 的一行射程**，而 lab 现存登记 `round2-status.md:2179` 恰恰写着反的。
2. 🔴 **亲验推翻了 DS 自己写的一条「正解」**（L16 ⇒ B6）——
   `audit-gate-mount-declaration.mjs:174` 逐字说「只因有 `audit:` 前缀的 **npm key** 才落进扫描面」，
   而它自己的代码 `:71`/`:83`/`:281` 收的是**文件名前缀** ⇒ **改 npm key 移不出扫描面**。
   ⇒ 这条不是「做不动」，是**登记的修法达不到它声称的目的**。
3. **`L22` 的射程从 8 格缩到 1 格** —— 7/8 早在 2026-08-25 就跑过并留证，
   而处方 `:26-27` 那三句自我登记里**有两句半与实测相反**（`lab:N56`）。

**分组走 subagent（3 组按主题分），全部 🟢/🔴 结论逐条亲验。** 本轮 subagent 未发现报错。

**本格自己踩的（⛔ 登记不删，三条**全部由自核抓到，⛔ 没有一条是复盘想出来的**）**：

1. **归因错** —— 按关键词 `增量` 在 DS backlog 上 grep 到一条「增量档…另一条 C1 提案」，
   看起来与 B4 的描述严丝合缝，实为 **INFRA-F146 的重开条件②**，⛔ 与 CI secret 无关
   （`AGENTS §2.18.7`「先证自己的计数器」—— 这次栽在**按关键词认领归属**上）。
2. **编辑失误** —— 一次 Edit 把新行**追加**在旧行后面而非替换，留下**两行 L10**；自核数条数时发现。
3. 🔴 **修 ② 时写的 python 又错了一次，且错在【分隔符假设】** —— 按 `' | '`（**带空格**）split 表格行，
   而原行里是 `（未漂）| 🟡`（**无前置空格**）⇒ 切不开，**旧结论整段被当成「出处栏」带了过去**，
   那一行变成 7 个竖线。⚠️ **它长得完全正常**（渲染出来只是多了一栏），
   是**列数自核**（剥转义竖线后数 `|`）把它抓出来的 ⇒ **又一个「装置故障伪装成正常读数」**。

### 2026-09-15 第一轮 · 五行块【前两行】（owner 派的活：**盘点，⛔ 不动手**）

**口径**：对 lab 那 22 条**只跑 `AGENTS §2.22` 五行块的前两行**（登记记的 / 现取的），⛔ 不逐条深挖。
起因是 09-14 那轮实测 **4 条 owner 项里 3 条已不必做** ⇒ 存量里很可能还有同类。

| | 起手 | 止 |
|---|---|---|
| **lab** | `644028f` clean | 本格交付 commit |
| **DS**（本格**零改动**）| `fe5555a3` · **脏 6** | `fe5555a3` · **脏 6**（收尾重取，两半都核）|
| **标准 ① 读数** | 🔴 红 **1** · 绿 3 · 跳过 1 | 🔴 红 **1** · 绿 3 · 跳过 1 |
| **lab 的活** | 22 条 | **17 条**（销 5）|

🔴 **§0.2.3 收敛判据：标准 ① 读数【没变】，而这是对的** —— 本格是**盘点**，零改动被测仓
⇒ 棘轮读数结构上就不该动。**⛔ 别把「读数没变」读成「本格没效果」**（`lab:N71` 同族）；
本格的效果在**另一个量**上：**lab 的活 22 → 17**，且 17 里 7 条标 ⚪。

**批量读取走 subagent（CLAUDE.md 纪律），3 组按出处文件分。5 条 🟢 全部亲验**，
⛔ 未采信 subagent 的文字总结 —— 并因此抓到它**两处错**（⛔ 登记不删）：

| 错 | subagent 报的 | 亲验真值 | 性质 |
|---|---|---|---|
| ① 环境读数 | DS 脏 **4** 项 | **6** 项（漏列 2 个 `??` 目录）| 少列，⛔ 不是环境漂了（我重取 `git status -sb` 两半核过）|
| ② 归属 | `covers-acceptance: …#§M-VARIANT-AXIS` 在 `scripts/mockup-rules/variant-axis.mjs:13` | 真身在 **`scripts/audit-mockup-variant-axis.mjs:13`** | **行号对、文件名错**；该文件不在脏项里 ⇒ ⛔ 不是工作树 vs sha 树的差异 |

⇒ 两处均**不改变实质结论**，⛔ 但都说明「subagent 报的条数 / 行号不直接采信」这条是**在兑现的**，⛔ 不是形式主义。

**本格自己踩的（⛔ 登记不删）**：① **管道吞退出码** —— `git grep … | cut -c` 后读的 `$?` 是 `cut` 的
（`AGENTS §2.12` 推论三），害我把一次 `EXIT=1` 读成 `exit=0`；不带管道重跑才判出 `variant-axis.mjs`
的 covers 自陈是**真零命中**（阳性对照 `EXIT=0` / 2 行 ⇒ 判定面非空）。
② **容器类型数错** —— 数 O1 白底基线时用 `Object.keys(v).length` 数到的是**字段名个数**（7），
⛔ 不是条目数；**6 个文件恰好都是 7** 这种整齐触发了自查（`AGENTS §2.21` 推论二②），
摊开结构后改数 `count` ⇒ **446**，且 `count === nodeIds.length` 逐文件断言通过。

### 📌 2026-09-14 session 的「起手 → 止」两栏（`AGENTS §2.25` 推论五 · §0.2.3 收敛判据）

| | 起手 | 止 |
|---|---|---|
| **lab** | `922c2e5` clean | **`c70eaf4`** clean · 6 commit 全已推 |
| **DS**（本轮**零改动**）| `4532f289` · 脏 15 | **`fe5555a3`** · 脏 6 · 零 `subjects` 残留 ✅ |
| **标准 ① 读数** | 🔴 红 **2** · 绿 2 · 跳过 1 | 🔴 红 **1** · 绿 **3** · 跳过 1 |
| **标准 ②** | 🔴 **无载体** | ✅ 两处自动跑 · ledger 累计 **7** 次 |
| **owner 的活** | 6 条 | **3 条**（O1 · O3 · O6）|

⚠️ 红从 2 降到 1 **⛔ 不是本轮的功劳** —— `acceptance-gate-coverage` 是**并行 session** 修绿的
（登记了 `#M43.3`，豁免 50→51 · unclassified 36→35）。⛔ 不推断因果（⛔ 无法证实是否因看到本轮报告）。
⇒ 仍红着 **1** 条：`audit-render-drift-gate-react`（S9 指纹陈旧，ledger 记「连续 5 次跑」）。

### 2026-09-14 · 补上标准 ② 的缺口（owner 拍「需要，补上」）

**⛔ 新条目，owner 明确点头后才做**（§0.1 铁律 2 的例外）。上一格如实登记了「标准 ② 无载体」，
owner 拍「补上」⇒ 做完就停，⛔ 没顺着往下做第二件。

| | before | after |
|---|---|---|
| 标准 ②「红了多久才被看见」| 🔴 **无载体** | `SessionStart` + `pre-commit` 两处自动跑 + ledger 记连红 |
| lab 的 git hook | **一个都没有**（全 sample、`core.hooksPath` 未设）| `.githooks/{pre-commit,ratchet-watch.sh}`，已 `git config core.hooksPath .githooks` |
| 「这条红持续多久了」| 答不出 | 逐条显示「**lab 自 `<ts>` 起就记录到它红（连续 N 次跑）**」|

🔴 **⛔ 铁律：永远 exit 0，绝不阻塞。** 红多半不是 lab 的账；会挡我又无权修的闸只会被绕过
⇒ 退化成恒红 = 零信息（`lab:N58`）。
🔴 **ledger 测的是「lab 第一次记录到」，⛔ 不是「实际开始红」** ⇒ 它是**发现延迟的上界**。
⚠️ **上限**：只让 lab 侧看见，**改 DS 规则真源的那个人看不到** ⇒ ⛔ 不是自动告警。

**本格自己踩的一个真污染（⛔ 登记不删，已清净）**：ledger 的 `resolve()` 原本在
`process.chdir(ROOT)` **之后** ⇒ 相对路径解析到了**被测仓**，真往 DS 写进了
`subjects/tvu-ds/ratchet-ledger.jsonl`（untracked）。**当场发现靠的是 `cat` 在 lab 侧找不到那个文件。**
⇒ 已删、已核残留（DS 脏项回到起手的 6 项、`git status` 零 `subjects`），
并把它变成一条结构性断言 **MN8**：`--ledger` 落在被测仓内即抛（两臂已验：故障臂抛 / 对照臂不抛）。

⚠️ **收尾时被测仓的状态变了（⛔ 非我所为）**：`audit-acceptance-gate-coverage`
**从红转绿** —— 豁免 50→51、`unclassified` 36→35 ⇒ 并行 session 把 `#M43.3` 登记进豁免表了。
⛔ **不推断因果**（⛔ 无法证实是否因为看到本轮报告）。⇒ ledger 里 acceptance 的连红就此断开，
`audit-render-drift-gate-react` 累计到「连续 4 次跑」。

### 2026-09-14 · 换判断标准（owner 拍定）—— 一次优化，效果可见

**⛔ 不在冻结清单射程内** —— 这是 **owner 当日的新裁定**，压过 §0.1 铁律 1（铁律是他立的，他可以改）。

| | before | after |
|---|---|---|
| **判断「系统好没好」靠什么** | 数本清单还剩几条（**欠债表**，且当天刚查出条数数错 3）| `node metrics/ratchet-watch.mjs --ds-root <仓>` 一条命令 |
| **「有几条棘轮正破着」这个问题** | **答不出** —— 要翻仓库、逐个跑 | **1 秒跑出**：🔴 红 2 · 🟢 绿 2 · ⏭ 跳过 1（要凭据）|
| **owner 的活** | 6 条 | **3 条**（O1/O2/O4/O5 按五行块核完后 3 条销账、1 条挪阻塞）|

🔴 **第一次跑就抓到 2 条正红着的棘轮，其中 1 条是此前完全不知道的**：
· `audit-acceptance-gate-coverage` —— 当前 36 > 基线 35，**从 16:30 起红、跨 5 个 commit 已进 master**
  （归因 `4a0dc0e4`「add M43.3」：新增规则带 Acceptance 段但没上闸也没登记豁免）
· `audit-render-drift-gate-react` —— S9 逐字「输入集内容已变 —— 这份 report **没见过**现在这份代码」
  （并行 session 今天改了 `react-pilot/src/demos/*`）。⚠️ 该 session 工作树仍脏 ⇒ **可能在处理中**，
  ⛔ 与上面那条性质不同（那条已提交进 master）。
⇒ **两条都⛔ 不是 lab 的账，⛔ 也不排期**（§0.1 铁律 2），已登记 §3。

**量具自己踩到并修掉的一个坑（⛔ 登记不删）**：被测对象的 `SCAN_FILES` 是**相对路径**，
不 `chdir` 时 6 份进 `missing`，而 **`AGENTS.md` 读到了 lab 自己那份** ⇒ 会产出一个
「看起来合理」的读数。**拦住它的是那条 `missing` 断言** ⇒ 已写进量具注释，标「⛔ 别删」。

### 2026-09-14 · 一格做完 5 条（D1 · D2 · D3 · L1 · L2）

**口径**（`AGENTS §2.25` 推论五：**两栏各记 sha + 脏项数**，⛔ 不许只写一个值）：

| | lab | DS HEAD | DS 脏项 |
|---|---|---|---:|
| **起手** | `922c2e5`（clean）| `4532f289` ⚠️ 交接单写的 `9739ee16` 起手就已漂 | 15 |
| **止** | 本格交付 commit（`922c2e5` 的下一笔）| **`d3b7729b`**（格内 +2 commit）| 6 |

**本格零改动 DS。** 那 2 个 commit 与全部脏项都是并行 session 的（`INFRA-F148` DemoRenderer + 收尾）。
✅ **漂移已核，⛔ 不是肉眼判断**：`git diff --name-only 4532f289..d3b7729b` 13 个文件与本格判定面
（那支闸 / 豁免表 / `variables.css` / `code-conventions` / `figma-env`）**求交集 = 空**；
并把装置在新 sha 上**原样重跑**，程序化比对三个数 **133 / 127 / 6 逐位吻合**，
`BASELINE_UNCLASSIFIED = 35` · `variables.css:386 = rgba(0, 0, 0, 0.2)` · `reopenWhen` 计数 `0` 全部复现
⇒ **本格结论在止 sha 上仍成立。**

| 条 | 结果 | 关键读数（全部现取，⛔ 不转引） |
|:-:|---|---|
| **D1** | ✅ 定案 ⇒ **owner 的活 6 条 → 4 条** | 两张表⛔ 不矛盾（口径不同）· O4 销账（`record-as-nmc` 已落地，反对理由实测未发生）· O5 销账（59 段已全量预分类，棘轮 **59→35**）· O6 仍待拍但 **13 段 ⇒ 6 段** |
| **D2** | ✅ 定案 ⇒ **处方对，队列那句过期** | 处方 P1/P2 判定不做 · P4 `3ac0d15a` · P3′ `ddebae9d` ⇒ 已回改队列括注；附带订正「36 → 61 → 待修 0」|
| **D3** | ✅ 定案 ⇒ **⛔ 不需要估成本，已做完两次** | `lab:L3` 12 格逐格相同 + 补 3 格 · `lab:L4` **60/60 全绿**（12 条 tsc 线）；两份报告亲验存在 ⇒ 已回改处方头栏 |
| **L1** | ✅ 销账 4 处 | `--mask-overlay` 现取 `rgba(0, 0, 0, 0.2)`（`variables.css:386`）· `53dfc91f` 在 **两侧 master** |
| **L2** | ✅ 销账 3 处 | `wire-ci` 转 backlog（整库扫 **629,268** 条 ⇒ 缺增量触发）· `wire-release` 转 agent（软档已在代码里）|

**本格自己踩的、⛔ 登记不删**：① O6 起手**主语窄化**（把射程读成 `ACC_RE` 抽不到段，而标的是 `ITEM_RE`
抽不到核查项 —— 处方逐字警告过「两者不可合并处理」）② 自写正则漏 2 个措辞变体 ⇒ 最终**改用闸自己的解析器**
③ 自核脚本的 `MH1b` 阈值是我编的（10000）⇒ 报了一次**假红**，改成判「剥 fence 的比例是否合理」
④ 假设 `collectSections()` 返回数组 ⇒ fail-closed 当场拦住（真实契约 `{ sections, missing }`，
且 `missing` 静默 ⇒ 已补显式断言）⑤ 一次 `sed` 撑爆输出 43.9KB ⇒ 改 `cut -c` 限宽。

---

## §3 冻结之后发现的（⛔ 不在本轮射程）

> 🔴 **只登记、⛔ 不排期。** 往这里加东西**不算**给自己派活。
> 要把其中某条挪进 §1，**必须 owner 明确拍**。

- **`decision-queue.md` 多处自相矛盾未回改** —— Q11 在 `:59` 标「结案」、在 `:1567`/`:1612` 仍标「待拍」；
  Q6 同族。⚠️ 其中**可机械回改的两条已收进 §1.2 的 L1/L2**〔✅ **2026-09-14 已做完**〕；
  余下的「这份文件整体需不需要一次对账」⛔ **不在本轮射程**。

〔以下 1 条为 **2026-09-15 第八轮提交时**由 pre-commit 撞出来的，⛔ **只登记、不排期**〕

- 🟡 **`audit-acceptance-gate-coverage` 出现一条新红：`没人守` 33 > 基线 32 ——
  ⛔ 不是我的账，是【并行 session 未提交的中间态】。**
  归因是实测的、⛔ 不是推的：提交那一刻 DS **HEAD 零漂**（仍 `98d3e0b8`）而**工作树脏项换了一批** ——
  `git diff -U0 -- docs/internal/mockup-conventions.md` 逐字新增一段标题
  `#### M23.20 — 交付物用人话写…— 2026-09-15 owner 回流`（净 +38/−1 行），**尚未提交、尚未上闸、
  尚未入豁免表** ⇒ 规则段 **134 → 135**、`没人守` **32 → 33** ⇒ 棘轮红。
  ⚠️ 而我这一格**一个字节都没改被测仓**（产出全是 lab 侧 4 个文件）。
  🔴 **这是 `lab:N70` 第 4 次实证，且是最强的一次** —— 前几次工作树漂到的是无关文件，
  **这次直接漂到了标准 ① 的判定面本身（规则真源）**，把一条棘轮从绿弄成红，而 `HEAD` 一动没动。
  ⇒ **口径再加一句**：`ratchet-watch` 读的是**工作区**、lab 的测量读的是 **pin**，
  两者在「HEAD 相同」时**仍可能给出不同读数** ⇒ **引用棘轮读数必须标【工作区 还是 pin】**。
  ⛔ **不排期、⛔ 不代改**：并行 session 很可能正准备给该段上闸或入豁免表（这正是 owner 回流后的
  常规下一步）。**重开条件**：该段提交后若仍 `unclassified` 且基线未同批调整 ⇒ 那时才是一条真缺口。

〔以下 1 条为 **2026-09-15 做 L4 时**撞到的，⛔ **只登记、不排期**〕

- 🔴 **「Acceptance ↔ 闸」对位登记的粒度是【段】，⛔ 不是【条目】** —— DS 侧已建的
  `// covers-acceptance: <段 id> [N]` 机制现取 **50 行 / 22 道闸**（`scripts/audit-*.mjs` 口径），
  但 `[N]` 是**变更探测的锚、不是覆盖度声明**：三道闸（`geometry-consistency:16` /
  `binding-fidelity:20-21` / `mockup-overlap:13`）**各自逐字**写了「⛔ 别读成『这 N 项都有闸』」。
  ⇒ L4 重取实测：**8 条 (b) 里有 5 条所在的段【是被自陈覆盖的】** —— 段有闸、条目无闸，
  **只看自陈会把这 5 条读成「已覆盖」**。
  ⇒ 即处方 §4 那条结构性缺口**在段这一层已有机制、在条目这一层仍然零机制**。
  ⚠️ **⛔ 不排期**：要不要把粒度推到条目级是 DS / owner 的取舍（新增一处会漂的镜像面 vs
  发现不了「根本没有闸的那些条」—— 处方 §4 已把 (i)/(ii) 两形态原样上呈，DS 侧
  `STATUS-CHANGELOG` 逐字「**原样上呈，未替 owner 裁**」）。lab 只补上了**读数**。

〔以下 4 条为 **2026-09-14 做 D1/D2/D3 时**撞到的，⛔ **只登记、不排期**〕

- **`decision-queue` 的 Q1-b / Q1-c / Q1-d 三个 `####` 标题仍带 ⏳，而三者都已拍**
  （子节里各有 `##### ✅ … 已拍`：Q1-b ⇒ DS `bb9146af` · Q1-c ⇒ `acc4d715` · Q1-d ⇒ 顶部表 ✅ 6）。
  ⇒ §26 推论一「改分项的人只看那一段」的又一实例。**⛔ 本格未改**（不在 D1 射程内 —— D1 的射程
  逐字是「O4/O5/O6 还待不待拍」，这三个标题是**另外三条**）。
- **那 67 条的处方 §5 表里第 1 行未核** —— 「是否接受『先解 N-D1 → 再放宽 `ACC_RE` → 最后补自陈』
  这个顺序（§2.5）」标 **DS owner ⬜ 待拍**，而它**不在本清单 §1.1 的 owner 项里** ⇒ 冻结时漏登记。
  ⚠️ 它究竟还待不待拍**未核**（要核就是又一格 D1）。
- **给闸加第四态 / 强制 `reopenWhen` 字段** —— 原 O4 的标的已消（走了 `record-as-nmc`），
  但「豁免表的重开条件只写在 `reason` 正文里、⛔ 无结构化字段」这件事实测成立
  （该表 `reopenWhen` 现取计数 **0**）⇒ 这是一个**新问题**，⛔ 不是原来那条待拍项。
- 🔴 **第二条正红着的棘轮：`audit-render-drift-gate-react`**（2026-09-14 由 `ratchet-watch` 首跑抓到）。
  S9 逐字「输入集内容已变 —— 这份 report **没见过**现在这份代码」，要求重跑
  `pnpm test:render-verification-react`。成因：并行 session 今天改了 `react-pilot/src/demos/*`
  （`8b70fe63` INFRA-F148）而渲染验证报告未重跑。
  ⚠️ **先证过⛔ 不是缺构建产物**（§2.14 推论二那类）—— 它红在指纹陈旧，⛔ 不在前置缺失。
  ⚠️ 该 session 工作树仍脏 ⇒ **可能正在处理中** ⇒ ⛔ 与下面那条性质不同。**⛔ 不是 lab 的账。**
- 🔴 **DS 有一条闸正红着，从 2026-09-14 16:30 起，无人发现**（本轮答 owner「系统好没好」时撞到）。
  **归因确凿、⛔ 非推理**：复现树（`git clone --local`）上逐 commit 跑那条闸 ——
  `aae0d915`(16:14) `EXIT=0 · unclassified=35` → **`4a0dc0e4`(16:30) `EXIT=1 · unclassified=36`**，
  此后 `9739ee16` / `4532f289` / `8b70fe63` / `d3b7729b` **一路 EXIT=1**。
  该 commit subject 逐字「docs(conventions): add M43.3 — 标题句嵌变量时允许多行 + 左对齐」
  ⇒ **新增一条规则带 Acceptance 段，但没上闸、也没登记豁免** ⇒ 破棘轮 S2，
  闸自己逐字印 `[S2] unclassified 36 > BASELINE 35（+1）`。
  ⚠️ **为什么没人看见**：该闸在 `.husky/pre-commit` 是**条件触发**（staged 里要有那 7 份规则真源 /
  任一 audit 脚本 / 豁免表 / 闸自身），而 16:30 之后那 4 个 commit 改的都是别的文件 ⇒ 一路静默 skip。
  它**在 L5 `gate-chain` 里**（40 步之一，`prepublishOnly` 会跑）⇒ **下次发版必红**。
  🔴 **⛔ 这不是 lab 的账**（本轮零改动 DS），⛔ 也不排期 —— 但它是「闸有效 / 看见无效」
  这个区分的**活例子**，见本轮给 owner 的回答。
〔以下 2 条为 **2026-09-15 做 L8/L9** 时撞到的，⛔ **只登记、不排期**〕

- 🔴 **`audit-mockup-colors` 那句 WARN 的文案对 C2 说反了方向**（两臂实测，⛔ 非读码推断）。
  闸逐字写「Bound-variable names will be unresolved; **C2/C3 may under-report**」，而实测：
  | 判据 | 403（变量名解析不出） | 200（解析得出） |
  |---|---|---|
  | C3 | 守卫 `if (varName)` 挡住 ⇒ **一条都报不出**（真 under-report）| 正常报出 |
  | C2 | `!varName` 分支命中 ⇒ **把合规的 `:hover` 节点报成违例**（**over**-report），且闸 **exit 1** | 正常放行 |
  ⇒ **后果方向完全相反**：漏报给的是假绿，误报给的是假红，而文案只提了前者。
  ✅ **真实行为已如实钉进 `tests/audit-mockup-colors-cli.test.ts` 的 B3**（DS `774608ee`）
  ⇒ 任何人改 C2 的守卫或改那句文案时会当场看见这个差。
  ⚠️ **lab ⛔ 不主张文案该怎么改**（改文案 / 改 C2 的守卫，是两个不同的决定）——
  这是被测仓的事，两个方向的读数已摆出来。
- **引擎里另有 3 处 `under-report` 字样来自别的规则模块，未逐条钉** —— 造故障实测：
  把 `colors` 那条的 `unverified` 恒设 null 后，引擎 stdout 里仍有 **3 处**该字样。
  ⇒ 那几处各自有没有人守，**lab 未答**（本轮只钉了 `colors` 这一条，已写进那份测试的边界表）。

- **R21 的数值判据仍未进闸** —— Q11 已结案（值 = 0.2），但 `decision-queue` 那句
  「⛔ **数值判据刻意没进闸**」**至今成立**。⛔ **未现取它现在为什么没进**，⛔ 不推断。
  ⚠️ ⛔ 别把「Q11 结案」读成「数值判据上闸了」。

〔以下 3 条为 **2026-09-15 批量必要性筛查**时撞到的，⛔ **只登记、不排期**〕

- 🔴 **L14（1b 上闸）的两侧措辞现在是冲突的** —— lab `decision-queue.md:56` 记的是
  **agent 已自拍**「同意固定写法」，而 DS 真源 `docs/internal/mockup-conventions.md:3634` 逐字写着
  「只剩「要求首行按一个固定写法写」这一条路，而那属**往真源发明新格式** ⇒ **owner 决定，⛔ agent 不自拍**」。
  ⇒ 形态是 `lab:N56`（lab 拍完**没回改对方会读的那份文件**）。
  ⚠️ **⛔ 未判哪边对** —— 有可能是 lab 自拍越权、也可能是拍完漏回改，两种的处置完全不同。
- **`decision-queue.md` 顶部编号表读法纪律里的数已过期** —— `:8-9` 逐字「本表**未标 ✅ 的编号行 6 行**，
  真待拍 5 条」是 **2026-09-09** 的读数；现取同口径是 **8 行**（此后新增了 `~~12~~` / `⏸ 5a` / `~~5b~~` 等行）。
  ⚠️ **口径本身仍可用、⛔ 只是那个数陈旧**；且表头 `:6` 的「真待拍 **0 条**」按该口径逐行核**仍自洽**
  （`4`(:62) 逐字「本条已解，保留行仅为对账」· `⏸ 5a`(:63) 逐字「挂起，⛔ 不再计入待拍数」）。
  ⇒ 与 §26 推论一同族：**改分项的人只看那一段**。
- **L7 登记的 payload 份数已过期** —— 逐字「**4 份** payload」，现取 `figma-data/mockup/*.json` = **5 份**
  （合计约 1 GB，全部 gitignored）。⛔ **未证差因**（新增了一份 vs 登记当时就数错）。
  ⚠️ 已写进 L7 那一行的现取栏，此处只做**新发现**留痕。

- 🔴 **`ratchet-watch` 的 `dirtyFiles` 在 `pre-commit` 环境下读数错**（本格提交时当场撞到）——
  同一时刻两个读数打架：**pre-commit 打出的巡检表报「工作树脏 0 项」**，
  而手动 `git status --porcelain`（不带管道）实测 **6 项**、`HEAD` 两边都是 `fe5555a3`
  ⇒ **⛔ 不是并行 session 清了工作树**（我当场重取核过）。
  ⚠️ **范围（⛔ 别读成「量具坏了」）**：错的只有 `dirtyFiles` 这**一个显示量**（`:158-160`，另写进 ledger）；
  **五条闸的判定读数与 HEAD 全部正确**（与同日 `SessionStart` 逐条相同）⇒ ⛔ 不造成假绿 / 假红。
  ⚠️ **成因未定，且我的第一个假说已被自己的两臂推翻**：猜「git hook 导出 `GIT_DIR` ⇒ 污染带
  `cwd` 的 git 调用」，实测**故障臂**（`GIT_DIR=<lab>/.git` + `cwd=<DS>`）得 **775**、
  **对照臂**得 **6** ⇒ 两臂都不是 0 ⇒ **该假说解释不了这个 0**（`lab:N48`：0 出现在一个
  「看起来合理」的位置时必须先证判定面）。
  ⇒ **操作上的含义**：⛔ 别拿 `pre-commit` 打出来的那个脏项数当「起手核环境」的读数，
  手动 `git status -sb` 两半各取一次（`lab:N70`）。

〔以下 4 条为 **2026-09-15 第二轮（五行块后三行）**撞到的，⛔ **只登记、不排期**〕

- 🔴 **两处需要回改到【对方会读的那份文件】，⛔ 本轮未改**（`AGENTS` 第 25 条推论三；本轮 owner 派的活是盘点，
  ⛔ 未授权改 DS）：
  ① **`scripts/lib/detect-frame-theme.mjs:3` / `:37` 的头注释 stale** —— 逐字仍写「本模块目前**没有任何调用方**（刻意）」
     「**接闸本身仍未做**（本模块至今零调用方）」，而同仓 `backlog.md:47` 早已把那行划掉、真调用点在
     `mockup-rules/variant-axis.mjs:21` + `:66`。⚠️ **活量具的头注释是下一个读者的入口，比报告里的同一句更危险**（`AGENTS §3.14`）。
  ② **`audit-gate-mount-declaration.mjs:174` 的机制描述与自身代码不符**（见 B6）。
- **`scripts/audit-handoff-deliverable-sections.mjs:142` 那行已陈旧** —— 逐字「投放到消费仓 `.githooks/` 是本条的
  **剩余待办**（见 backlog INFRA-F123）」，而 handoff 族镜像 2026-09-08 起就在模板里、
  `tests/consumer-hook-mirror-parity.test.ts` 钉着。⛔ 未现取它为什么还留着，⛔ 不推断。
- **lab 侧一处登记面自相矛盾（⛔ 未定案）** —— `docs/decision-queue.md:129` 逐字「同一轮里 `wire-release` 判
  **留给 owner 是对的**」vs 同文件 `:61` 逐字「**2026-09-11 撤出队列 → 转 agent 的活**」。两句并存，⛔ 未判哪句是现行。
- **B4 那条「已转 DS backlog」没兑现，且两侧各自以为在对方那儿** —— 详见 §1.3 的 B4 行订正段。
  ⚠️ 这不是新条目（B4 本就在清单里），是**对已有条目的现取订正**。

〔以下 1 条为 **2026-09-15 push DS 后查两侧 CI** 撞到的，⛔ **只登记、不排期**〕

- 🔴 **DS 的 GitHub CI 持续 failure，且 job `steps=0`（= 根本没启动）** —— ⛔ **不是 lab 的账**，
  也**⛔ 不是我那笔改动引起的**：`gh run list` 现取最近 4 笔**全是 failure**、耗时 **3–5s**，
  其中 **3 笔在我推之前**（并行 session 的 commit）。逐 job 查：`docs-overflow` / `render-gate` /
  `audit-matrix (22)` / `framework-parity` / `a11y-report` **全部 `conclusion=failure` 且 `steps=0`**
  ⇒ **不是测试失败，是任务没启动**（配额 / runner / 权限一类）。`--log-failed` 取不到日志。
  ⚠️ **Gitea 侧取不到**：`statuses/<sha>` API 返回逐字「Only signed in user is allowed to call APIs.」
  ⇒ 需要鉴权。
  ⇒ 🔴 **操作含义：本机全绿 ⛔ 不等于两侧 CI 绿** —— 本轮 DS 那笔（`d10e151b`）本机
  全量 vitest **3510 passed / 0 failed**、相关闸与两条棘轮全绿，**但⛔ 不能说「CI 通过」**。
