# DS 侧真待办清单 —— 由 9 份处方执行状态亲验产出（`lab:N93`，2026-09-01）

- **判定 pin**：`7fcca917`（DS 真源 `master`，本轮起手值）
- **判定方式**：pin 住的 worktree 上逐条取证，⛔ 未读 DS 工作区、⛔ 未改 DS 一个字节、⛔ 未实跑任何 DS 闸
- **前置**：本清单此前**结构上不存在** —— 9 份处方没有「执行状态」栏（§28.9/N59 判出的根因），
  必须先亲验才能知道 DS 侧还剩什么。⛔ 别照处方正文的未来时态读成「都没做」。
- **判否强度**：结论**只由 pin 上的源码/文档判读得出**。`geometry` 那条闸要真跑需 `--file <fileKey>`
  调 Figma REST（lab 明文禁止）⇒ ⛔ 不得把「源码里缺陷仍在」写成「已实测缺陷会发作」。

---

> ## 🟢 结清（2026-09-02，`lab:N93.3`）—— 本清单 5 条**全部落地**
>
> DS HEAD **`6a1f91c4` → `2541423f`**。
>
> | # | 结果 | 谁做的 | 证据 |
> |:-:|---|---|---|
> | **D1** | 🟢 已落地 | **DS**（`6a1f91c4`） | `inScopeIds` 已含 state frame id（成组 + 被丢弃）；lab 亲验：62/62 绿 + **故障注入 2 条红**（还原后回归绿）⇒ 判别力已证 |
> | **D2** | 🟢 已落地 | **DS**（`6a1f91c4`） | `scanned` 的 controls/buttons 已按家族条件化 |
> | **D3** | 🟢 已落地 | **DS**（`6a1f91c4`） | `collectStateFrameGroups` 返 `{groups, rejected, rejectedIds}`，落单帧计入 `rejected.singletonSize` 并留 id。⚠️ DS 主动守住边界：**分组键未改**（「状态帧允不允许不等高」是设计立场，不在范围）—— 正是 lab prompt 划的线 |
> | **D4** | ⛔ 不做 | — | 收益归零（唯一消费者 `extractRuleT` 随 v2/v3 停摆），见上方 D4 订正段。⛔ **不是被否决**，有能失败的重启条件 |
> | **D5** | 🟢 已落地 | **lab**（`2541423f`） | ⑤ 规则真源补豁免半句 · D5-a §M-VARIANT-AXIS + Acceptance · D5-b 判据真源 + 规则模块 + 14 条测试。对位闸终值 **`gated 28 · unclassified 59 = BASELINE`、exit 0** |
>
> 🔴 **落地过程中订正了本文件昨天给的判据形态**：D5-b 那条「⛔ 别照抄处方 §3.2，正确形态是匹配 `[data-theme]`」**是错的** ——
> Figma 侧没有程序化主题信号（`detectFrameTheme` 只有伪代码、全仓零实现），那个形态**要一个不存在的输入**。
> ⇒ 判据退回处方 §3.2 原本的「同一交付内一致」。**处方是对的，lab 的「改进」才是病。**
> ⇒ 由此产生一条**新的已知盲区**（⛔ 不是缺陷）：整份交付统一用错族，本闸抓不到；要覆盖它须先把
> `detectFrameTheme` 落成真实现 —— **属独立立项，⛔ 本轮不做**。
>
> ⚠️ **lab 自己被闸抓到一次**：首版漏了 `covers-acceptance:` 行 ⇒ `unclassified` +1，
> **亲手复制了处方 §3.1.2 警告的那个病**。补上后回落。⇒ 它是**闸抓到的、⛔ 不是 lab 自查到的**。
>
> ⚠️ **并行隔离**：起手发现 DS 工作区脏且有另一 session 的 staged 改动（含 `mockup-conventions.md`）
> ⇒ 全程走独立 worktree + rebase 后 push，⛔ 零风险卷入对方内容。

## 0. 一句话

9 份处方里 **6 份已执行、2 份未执行、1 份 DS 走了另一条路**。
真待办 **5 条**，其中 **3 条是纯工程、不取决于任何设计立场**（可立即动），
**2 条需要 owner 先拍一个设计/规则决策**。

---

## 1. 🟢 可立即动（⛔ 不取决于任何设计立场）

| # | 待办 | 出处 | 证据（@`7fcca917`） |
|:-:|---|---|---|
| **D1** | `inScopeIds` 补进 state frame 的 id | [`geometry-gate-denominator-defects`](../proposals/2026-08-27-geometry-gate-denominator-defects.md) 缺陷 **A′** | `scripts/audit-mockup-geometry-consistency.mjs:750-754` 仍只收 `controls` / `rowScan.groups` / `dividers` 的 id ⇒ `--probe` 对 G2 **全域不可断言可达性**（帧 id 在故障臂与正常臂上**恒红**＝零信息） |
| **D2** | `--family rows` 下别再把「从没看」印成「扫了零个」 | 同上 缺陷 **B** 的**另一半** | `:693` `const controls = wantControls ? collectControls(…) : []` ⇒ rows 跑法下 `controls` 恒空 ⇒ `:743-744` `scanned.controls/buttons` **结构上恒 0**，而 `:856` **无条件打印**。⚠️ DS 已在 `:726-738` 把**对称的另一侧**修好了（`rowScanned = wantRows ? {…} : {}`），**照抄那一侧的形态即可** |
| **D3** | `collectStateFrameGroups` 的**被丢弃面要登记** | 同上 缺陷 **A** 的**不含立场的那一半** | `:321-323` `if (frames.length >= 2)` ⇒ 落单的 frame 直接消失、**无任何登记** ⇒ 「没检查」被输出成「检查过、结果是 0」 |

> 🔴 **D1 是三条里最该先做的** —— 原处方逐字：「**A′ ⛔ 不取决于任何立场**」，
> 而它坏的是 `--probe` 的**可达性断言**本身，也就是「这条闸有没有在看」这个元问题。

---

## 2. ⚠️ 需 owner 先拍（⛔ lab 不代拍，`AGENTS §8`）

| # | 待办 | 要拍什么 | 出处 |
|:-:|---|---|---|
| **D4** | 触发器 T 的实证案例移出判据节 | 这是 DS 的**规则真源文本**，处方 §4 逐字「lab 不裁定」 | [`rule-text-decasing`](../proposals/2026-08-31-rule-text-decasing.md) |
| **D5** | 风格轴规则要不要进对位闸分母 | 见下方 §3 —— 有三个子决策 | [`variant-axis-rule-gap`](../proposals/2026-08-28-variant-axis-rule-gap.md) |

### D4 的现状（@`7fcca917`）

⚠️ **路径已漂**：`meta-rules.md` 从 `docs/internal/` 迁到了 **`docs/meta-rules.md`**
（处方与 `AGENTS §1.1` 引的 `meta-rules.md:975` 锚点因此失效，⛔ 别照抄行号）。

`docs/meta-rules.md:949` 起的「### 触发器 T」节内：

- **「实证 2026-08-31 TVU Pack LCD 提示文案总表」整段仍在判据节里**
  （含产品名 TVU Pack / LCD、含「文案一张卡、规则一张卡、出处一张卡」、含 owner 五轮纠正的叙述）
- 顶部「核心反模式」引用块里的「于是按「层」横切（**内容一处、规则一处、出处一处**）」亦原样未动
  —— 后者正是 `N84`/`N85` 记的 `SURVIVING_FOIL`

⇒ 下游程序化抽取（`extractRuleT()`）**仍会把实证案例一起吃进判据文本**，处方 §1 的结构问题原样存在。

⚠️ **⛔ 别把 D4 读成「lab 要求 DS 改」** —— 处方 §4 逐字「lab 不裁定」，
且处方 §2.5 那段射程限制（⛔ DS 侧读本处方时不得跳过）说明这条读数的适用面是窄的。

> #### 🔴 D4 订正：**lab 改判为「建议不做」**（2026-09-01 同日，`lab:N93.1`，⛔ 留痕不删上文）
>
> 本文件初稿把 D4 列为「需 owner 拍」的待办。**跑完推演① 后应改判为「不做」** —— 理由是**收益归零**，
> ⛔ **不是处方被否决**。
>
> **① 处方 §4 自己已经排掉了唯一能用来排优先级的理由**，逐字：
>
> > ⇒ **DS 不改，也不阻塞 lab** —— lab 已经绕过了这个问题。
> > ⚠️ **目前已知的消费者只有 lab 一家** —— ⛔ 本处方 ⛔ 不主张「所有其他下游消费者都受益」，
> > 那句话既是全称词，又预设了其他消费者的存在；**⛔ 请不要拿它来排优先级。**
>
> **② 而那个唯一消费者现在停了**：实测 `extractRuleT` 的使用面（`grep -rn`，⛔ 未截断）
> **全部 6 处都在 `adapters/llm-judge-container.mjs` 内**，服务的是 v2/v3/ladder 判据 ——
> 而 **v2/v3 线已由 owner 裁定停摆**（`N92`）。
> ⇒ lab 侧的绕过（`makeRuleVariant` R2/R3 档）**连跑都不再跑**
> ⇒ **收益从处方当时的「小」变成现在的「零」**。
>
> **③ 推演①**：D4 改完之后**没有任何可测指标会动**（唯一消费者停摆）⇒ 它是一个
> **改完无法验证有没有用**的改动。按 `AGENTS §1.1` 订正后的元指标口径
> （因子 2 =「采纳后指标实际改善的命中率」是靶心），**它在元指标上不可判读**。
>
> **④ 🟢 重启条件（客观可验证，⛔ 不依赖任何人的判断）**：
> 若 `grep -rn "extractRuleT"` 日后出现 **lab 之外的第二个消费者**，或 v2/v3 线按 `N92④` 重启
> ⇒ 收益恢复，届时重新提。🔴 **这条判据能失败**（grep 不到就不许重提）。

### D5 的现状：DS 解决了病灶，但走的是另一条路

🟢 **规则确实入册了**：`docs/internal/component-affordances.md:159`（SelectBoxLine）与 `:266`（InputBoxLine）
逐字「⛔ 同一表单 / 面板内不要 line 与 filled 混用 —— 一个界面只有一个主题，混用即为 bug」;
`STATUS-CHANGELOG.md:460` 记「owner 当轮裁定，repo **两处 SoT** 已落地」。

⚠️ 但口径是 **owner 2026-08-31 另行裁定的「族由主题定」**，
⛔ **不是**处方 §3.1.1 拍定的口径 A（「同一交付内直接放置的控件 variant 必须一致；复合组件内部豁免」）。
两者是**不同的规则** —— 前者更强（给了判定依据而非只要求一致），但**没覆盖复合组件那一层**。

三个子决策：

| | 决策 | lab 的读数 |
|:-:|---|---|
| **D5-a** | 这条规则要不要配 `**Acceptance**` 段进对位闸分母 | 🔴 **现在没有** —— 全仓检索 `M-VARIANT`（⛔ 未截断）命中的**全是既有的 `M-VARIANT-CONSISTENCY`**（多变体像素对齐，无关）⇒ 按处方 §3.1.2 自己的判据，**这条规则不在对位闸分母内**，正是那 67 条 `unclassified` 的形成机理 |
| **D5-b** | 挂不挂闸 | `scripts/` 下 ⛔ 无 variant/axis 闸。⚠️ 若挂，处方 §3.2 那条**豁免必须走组件边界、⛔ 不得用组件名白名单**仍成立（白名单失效方向是 fail open） |
| **D5-c** | `Pagination` 这个结构性混用源治不治 | 🔴 **见下方订正段 —— 它已经不是「要不要加严」，是 repo 里一条规则和一个组件互相矛盾** |

> #### 🔴 D5-c 订正（2026-09-01 同日，`lab:N93.1`，⛔ 留痕不删上面的表格行）
>
> **① 先订正本文件初稿引错的证据**：初稿把 `Pagination.vue:60` 的
> `pageButtonStyle`（`rimless` / `filling`）当成处方 §2.3 的主证据 —— **引错了**。
> 那是处方 **§3.3** 说的「同型问题」。§2.3 的主证据在 **`:59`**：
>
> ```
> :59   const pageControlVariant = computed(() => (isSmall.value ? 'line' : 'filled'))
> :169  <SelectBoxBase … :variant="pageControlVariant" />
> :232  <Input … :variant="pageControlVariant" />
> ```
>
> 两条都真实存在（`:59` 是 §2.3、`:60` 是 §3.3），初稿只报了后者却贴了前者的标签。
>
> **② 由此撞出的、比原处方更要紧的一件事**：`Pagination` 的 variant **按 `type` 定**
> （`isSmall ? 'line' : 'filled'`），而 owner 2026-08-31 已落地的规则是 **「族由主题定」**
> （深色 `:root` → filled、浅色 `[data-theme="light"]` → line，**混用即为 bug**）。
> ⇒ **`type="Small"` 的 Pagination 在深色主题下渲染 `line` 的 Input / SelectBox，
> 而同页面其他表单控件按规则应是 `filled`** ⇒ **开箱即混用，且违反的是已经写下的规则。**
>
> ⚠️ **检索面**：`component-affordances.md:699-705` 的 Pagination 段**完全没提** line/filled 或 variant；
> `:159`/`:266` 那两条「混用即为 bug」附近**无任何**复合组件 / Pagination 例外语。
> **判否强度：中等** —— 只核了这两处，⛔ 未逐份核 DS 全部 397 份文档是否别处写了豁免。
>
> **③ ⇒ 不治的代价，是这条规则在它最该抓的形态上抓不到自己的组件**
> —— 即「一条控制在它该抓的形态上无法失败」，**正是 `M-GATE-FALSIFIABILITY` 那个病**。
> ⇒ 🔴 **D5-c 应排在 D5-a / D5-b 之前**：先让事实一致，闸才有意义。
>
> **④ 🟢 修法比处方 §3.1 的 B / C 都小**：口径「族由主题定」意味着 **`[data-theme]` 就是那个页面级 context**，
> 而 `Pagination.vue:125-150` **已经有** `syncSelectTheme()` + `MutationObserver` 在监听它。
> ⇒ 把 `pageControlVariant` 从「按 `type`」改成「按当前 `[data-theme]`」即可复用现成机制。
> ⇒ **要 owner 拍的因此不是「B 还是 C」，而是一个具体得多的问题**：
> 🔴 **`type="Small"` 要不要保留 `line` 这个例外？**
> - **保留** ⇒ 必须在规则真源里登记豁免（否则规则与组件矛盾原样留着）
> - **不保留** ⇒ `pageControlVariant` 改按主题，**Small 态在深色主题下的视觉会变**（line → filled）
>
> ⛔ lab 不代拍 —— 这是设计决策（视觉会变），不是工程决策。

> #### 🟢 owner 裁定：**保留**（2026-09-01，`lab:N93.2`）
>
> owner 逐字答「**保留**」⇒ `type="Small"` 保持 `line`，`Pagination.vue:59` **⛔ 不改**。
> ⚠️ **如实记录：owner 直接选定，未另述理由** —— 与处方 §3.1.1 记 08-28 那次同一形态。
> ⇒ ⛔ 别把这条读成「owner 论证了 Small 该用 line」；他做的是**采纳**，不是**论证**。
> lab 上一轮提的两个候选理由（① 当初的视觉意图 ② 历史遗留）**都未被确认**，⛔ 不得代填。
>
> **① 🔴 推演② 命中：这个裁定不需要新造任何东西 —— 处方早就规定过它的形态**
>
> 「保留」⛔ **不是给 Pagination 开个案豁免**，而是回到 **owner 2026-08-28 已拍的口径 A**
> 里本来就有的那半句：「…；**复合组件内部控件豁免**」。`Pagination` 内部的
> `Input`/`SelectBoxBase`（`:169`/`:232`）**正是复合组件内部控件**，⛔ 不是「同一表单内并列放置」的控件。
> ⇒ 08-31 落地的「族由主题定」之所以与组件冲突，**是因为它落地时漏掉了口径 A 的这半句**，
> ⛔ 不是因为 Pagination 违规。
>
> **② ⇒ 由此，`reason` 字段的问题自动消失**：豁免走**结构判定**、⛔ 不进豁免表 ⇒
> **⛔ 不需要 `since`/`reason`/`fixDirection`** ⇒ owner 未述理由**不阻塞落地**。
> 处方 §3.2 逐字定了形态：「豁免的判定必须走**组件边界**（是不是某复合组件的后代），
> ⛔ **不得靠「组件名白名单」** —— 白名单会在加新复合组件时静默失效，且失效方向是**放行**（fail open）」。
>
> **③ ⚠️ 代价，连同裁定一起登记（⛔ 不复议）**：走类别级结构豁免 ⇒
> **任何复合组件内部的混用都合法** ⇒ 这条闸在「复合组件内部」这个形态上**不会失败**。
> ⛔ 这不是新引入的病，是**口径 A 本身的设计取舍**（处方 §3.1 已记：A 是 C 的子集、
> **是路径不是终点**）⇒ 要收紧须升到口径 C（页面级 form variant context），属新立项。
>
> **④ ⇒ 最终口径（三次裁定合并，⛔ 这是 D5-a/D5-b 的执行依据）**：
>
> ```
> 族由主题定（owner 2026-08-31）
>   ∧ 同一表单 / 面板内直接放置的表单控件 variant 必须与当前 [data-theme] 一致
>   ∧ 复合组件内部控件豁免 —— 判定走组件边界，⛔ 不得用组件名白名单（口径 A，owner 2026-08-28 + 09-01 确认）
> ```
>
> **⑤ 🔴 由此产生一件「立即该做、且与闸无关」的最小动作 —— 规则真源现在是自相矛盾的**
>
> `component-affordances.md:159`/`:266` 那两条只写了「⛔ 同一表单 / 面板内不要 line 与 filled 混用
> —— 一个界面只有一个主题，混用即为 bug」，**⛔ 没有复合组件豁免那半句**。
> ⇒ 照字面读，`Pagination`（内部就在混）**当场违规**，而 owner 已裁定它 ⛔ 不改。
> ⇒ **这两处必须补上豁免半句**，否则规则与组件的矛盾原样挂着 —— ⚠️ 且这与闸挂不挂**无关**，
> ⛔ 不应等 D5-b。
>
> 草案（供 owner 过目，⛔ lab 未代改 DS）：
>
> ```
> ⛔ 同一表单 / 面板内不要 line 与 filled 混用 —— 一个界面只有一个主题，混用即为 bug。
> ⚠️ 复合组件（如 Pagination）内部自带的控件不在此列 —— 它们的 variant 由该组件自己决定，
>    ⛔ 不计入「同一表单 / 面板内」的混用判定。（口径 A，owner 2026-08-28 拍定 / 09-01 确认）
> ```
>
> **⑥ D5-b 的闸判据形态（现已定死，⛔ 别照处方 §3.2 原样抄）**：
> 处方 §3.2 写的是「同一交付内出现 ≥2 种取值 ⇒ FAIL」—— 那是**口径 A 时代**的判据，
> ⛔ 与 08-31 落地的「族由主题定」不匹配。正确形态：
> **扫直接放置的表单控件，其 `variant` 是否匹配所在子树的 `[data-theme]`**
> （深色 `:root` → `filled`、浅色 `[data-theme="light"]` → `line`）；
> **复合组件后代整棵跳过**（走组件边界，⛔ 不用名单）。
> ⚠️ 必须配一条 `must-hit` 阴性对照（造一个真混用的探针，确认闸抓得到）——
> 否则这条 `must-not-hit` 单独存在时无法自证判别力（`N79.2`）。

⚠️ **命名撞车（新查，⛔ 不在原处方内）**：若按 §3.1.2 补建 `§M-VARIANT`，
它会与既有 `M-VARIANT-CONSISTENCY` 在检索与引用上高度混淆 ⇒ **建议改名 `§M-VARIANT-AXIS`**，⛔ lab 不代拍。

---

## 3. 📌 谁来做：`AGENTS §1.1` 改判后这份清单不必然由 DS 侧执行

owner 2026-09-01 已把边界改成 **lab 可直接 commit DS master**。⇒ 按「需不需要设计立场」分：

| 类别 | 条目 | 谁做 |
|---|---|---|
| 纯工程，⛔ 无设计立场 | **D1 · D2 · D3 · D5-b** | **lab 可自己做**（仍受全部纪律约束：改动前 `git pull`、逐文件 `git add`、闸红了按判据改而非绕过、收尾重取 HEAD） |
| 动规则真源文本 | **D4 · D5-a** | 需 owner 拍 |
| 动组件 / 需设计立场 | **D5-c**、以及 D3 之外的 **A 那一半**（「状态帧允不允许不等高」） | 需 owner 拍 |

🔴 **若 lab 自己做 D1/D2/D3/D5-b，须先在处方或预注册里写死承诺指标**
（哪个量会动、动到哪）—— 见 `AGENTS §1.1` 订正段：**因子 2 可判读的前提是承诺写在改动之前**。

---

## 4. ⛔ 本清单不覆盖什么（是边界，不是 TODO）

- ⛔ **未实跑任何 DS 闸**（`geometry` 需 Figma REST，lab 明文禁止）⇒ 三条 geometry 待办是**源码判读**结论。
- ⛔ **`retrospection-adr` 的提炼完整性未复核**：DS 实提 **66 条**、处方列 106 条，
  DS 自陈「106 条不是穷尽的，提炼也有 recall 缺口」⇒ **66/106 是 DS 的取舍，lab 没有逐条复核那 40 条**。
  另 §2.4 那批（自称「必记入册」）在提炼产物 `:74` 标「不在本文件」，**去向本轮未追**。
- ⛔ **`webcomponents-types-entry` §2.6 的五版本 JSX 矩阵未重跑**（要真装 5 个 `@types/react` 跑 tsc）⇒
  本轮只断言「豁免已消、类型文件在位」，⛔ 不断言「双写已正确落地、5 个版本都覆盖」。
- ⛔ **`claude-design-real-components` §4.2/§4.3** 本就登记为「lab 实测不了」，**本轮仍未验**。
