# Task 1 对账 —— `wt-fault` 建立 + 同环境全绿基线

**环境名：`wt-fault`** = `git worktree` detached @ `c1db57b8`，`~/.ai-ds-lab/wt-fault`
**三元组主键**：`(c1db57b8, claude-opus-5 → n/a（本 Task 全 T1 确定性）, pt-v1 → n/a)`
**DS 主仓 HEAD 本轮实测 `6d97866a`**（上轮收尾时 `8dd0388c`，⚠️ 会漂，按 sha 记）

## 1. 不变式（起）

| pin | dirty |
|---|---:|
| `71ac2711` / `339a72bf` / `4a68e02d` / `c1db57b8` | **0 / 0 / 0 / 0** ✅ |

`wt-fault` 建立后 dirty=0；`figma-data/mockup` **ABSENT**（与 P3 pin / CI 同口径，`lab:E47`）。
`node_modules` 走 APFS clone（`cp -Rc`，2.4 s）—— 与 P3 逐项一致（`.bin`=10 / 顶层=23 / 322 M），
**指回 P3 的 symlink 全量扫描 = 0 条** ⇒ ⛔ 无污染 P3 的通路。

## 2. 预注册对账

| # | 预测 | 结果 |
|---|---|---|
| **T1-P1** | 全绿全链 = 39 步 / exit 0 / `unresolved`=0，与 P3 逐步一致 | **先 MISS → 补 build 后 HIT**（见 §3） |
| **T1-P2** | `wt-fault` 全链热态总与 P3 的 8,976 ms 落在同一噪声地板（2σ=526） | **HIT** —— `totalWarmMs` = **8,849**，delta **−127 ms** |
| **T1-P3** | `audit:stale-anchors` 锚点 TOTAL = 767、exit 0 | **HIT** —— 逐字 `TOTAL 767` + `零孤儿` + `EXIT=0` |

⚠️ **T1-P2 执行时先用错了装置**：拿 DS runner 的 13,465 ms 去比 lab adapter 口径的 8,976 ms
（相差 4,489 ms，看起来像大 MISS）。预测文本本身写的是「全链热态总耗时」= lab adapter 口径，
**预测没错，是取数时跨了装置**。⇒ 同一份计划的 Step 5b 逐字写了「⛔ 耗时不比」，仍然踩了。

## 3. 🔴 新发现 `lab:E48` —— `dist/` 是 `lab:E47` 的第二个实例，且**更强**

首跑 DS runner：**EXIT=1**，第 **27** `audit:token-exports` 与第 **28** `audit:composition-exports`
逐字报 `dist/tokens/tokens.json 不存在，请先 pnpm build`。

| 事实 | 实测 |
|---|---|
| `dist/` 是否 tracked | **gitignored**（[.gitignore:2](../../.gitignore#L2)）· `git ls-files dist` = **0** |
| P3 pin | `dist/` **在**（tokens.json + composition.json 都在） |
| 新建 `wt-fault` | **ABSENT** —— `git worktree` 只 checkout tracked 文件 |

⇒ **与 `figma-data/mockup` 完全同形态，但后果更重**：
`figma-data/mockup` 只影响**耗时**（`lab:E47`），`dist/` 直接改变 **exit code**（2 步失败）。
⇒ **上轮报告 §4「两 pin 39 步全 exit 0」是在「dist 已构建」的环境上取的** ——
那是一个**此前从未被登记的 pin 环境维度**。
⇒ 操作口径：`chainEra` / `injectionEra` 之外，**闸链读数还须记「构建产物是否在场」**。
⛔ 换机器 / 新 worktree 上复现 lab 读数，不先 build 会拿到 EXIT=1 而误读成「闸炸了」。

### 3.1 连带：`pnpm build` 会弄脏 **tracked** 面 ⇒ ⛔ 不得在 pin 上跑

`pnpm build` 后 `git status` = **292** 条：`playground-dist/assets` **144 删 + 144 增**（内容哈希后缀变）
+ `react-pilot/dist` 5 + 其余 3。`playground-dist/` 与 `react-pilot/dist/` 是**刻意 tracked**
（[.gitignore:58](../../.gitignore#L58) 逐字 `react-pilot/dist is TRACKED on purpose (META-02)`）。

⇒ **构建产物不可复现**（同源码两次 build 产出不同哈希文件名）。
⇒ **正确姿势**（本轮已实测）：`pnpm build` → `git checkout -- .` + `git clean -fd playground-dist react-pilot`
⇒ tracked 面回到 **dirty=0**，gitignored 的 `dist/` **保留** ⇒ 第 27/28 步 `EXIT=0`。
⇒ ⛔ 这条正是「四个 pin 不能用来跑 build」的**量化理由**（此前只是不变式，现在有了机制）。

## 4. 基线读数（⛔ 两个装置分列，不并池）

### 4.1 被测对象 —— DS runner `node scripts/run-gate-chain.mjs`（`wt-fault` 口径）

| run | EXIT | 逐步表 | runner 自报总耗时 | `/usr/bin/time` real |
|---|---:|---:|---:|---:|
| r1（丢弃，AGENTS §3.6） | 0 | 39 | 13,546 ms | 13.57 s |
| r2 | 0 | 39 | 13,362 ms | 13.38 s |
| r3 | 0 | 39 | 13,465 ms | 13.48 s |
| r4 | 0 | 39 | 13,567 ms | 13.58 s |

**`BASELINE_MS` = 13,465 ms**（r2–r4 均值）· **σ = 102** · **2σ 噪声地板 = 205 ms**（`wt-fault` 口径）
逐步表含 `lint-skills`/`lint:ds` 标「非闸」⇒ **闸 37 条**（§5.4 E14 复证 ✅）
结尾**无失败摘要** ⇒ **处方 1 §5.1-c must-not-hit 复证 ✅**

### 4.2 lab 独立第二实现 —— `adapters/ds-gate-chain-run.mjs --ds wt-fault --repeat 3`

- 控制 **18/18 全绿** · `chainSource.key` = `gate-chain`、`era` = `gate-chain` · `unresolved` = 0
- `timing.totalWarmMs` = **8,849 ms**（逐步独立跑口径）
- `contractCoverage`: 分母 **39** · `parsedContract` **11** · `findingsReadable` **11** · `checkedUnitsReadable` **11**
- `emptyDenominator` = `["audit:figma-conformance"]` **一条** ⇒ **处方 2 must-not-hit ① 复证 ✅**

**11 条契约闸 `findings/checkedUnits` 与上轮 P3 pin 逐位相同 11/11：**
`0/644` · `19/74` · `0/72` · `0/0` · `9/38` · `0/38` · `3/8095` · `0/685` · `0/34` · `0/43` · `0/26`

⚠️ **两装置的耗时 ⛔ 不并池**：13,465（链内跑，含链开销）vs 8,849（逐步独立跑，各步中位数之和）。
前者是墙钟真值，后者是「各步最好情况之和」——**两个不同的构造，不是同一个量的两次测量**。

## 5. 🔴 本轮第 7 例装置故障（`lab:N48`）—— **首次由产物自带的控制抓到**

取读数时字段路径写错：`s.ms` / `s.findings` / `s.exit`，
真实是 **`s.warmMedianMs` / `s.contract.findings` / `s.exitCode`**。
返回值：**「0 ms 全链总 / 0 条契约步 / 39 个非 0 退出步」—— 三个都「看起来合理」**
（0 ms 像量具没测时间、39 个非 0 像全链炸了）。

⚠️ **与前六例的关键差别：这次不是靠人工警觉抓到的。**
同一份 JSON 里 `controls` 是 **18/18 全绿**、进程 `EXIT=0` ——
**「39 个非 0 退出步」与「控制全绿」直接矛盾**，矛盾本身暴露了装置故障。

⇒ **新操作口径（`lab:N48` 推论七）**：
**读数与同一份产物里的控制结论矛盾时，先疑自己的取数装置，⛔ 不先疑被测对象。**
产物自带控制 ⇒ 把控制结论与自己算出的读数**并排打印**，比事后人工复核便宜得多。

## 6. ⛔ 本 Task 未覆盖

1. 处方 1 §5.1/§5.2/§5.3/§5.5-b 的造故障格（Task 2–5）
2. 处方 2 造故障 A/B/MN②（Task 6）、单测逐格核（Task 7）
3. 处方 3 判据 2–8（Task 8–9）
4. ~~`lab:E48` 对其余三个 pin 的影响未查~~ ⇒ **本 Task 内已查清（见 §7）**。

## 7. `lab:E48` 的跨 pin 面（本 Task 内查清）

| pin | `dist/` | `node_modules` | 能否跑闸链 |
|---|---|---|---|
| `71ac2711`（P0） | **ABSENT** | **ABSENT** | ⛔ **跑不了** |
| `339a72bf` | 在 | 在 | ✅ |
| `4a68e02d`（P2） | 在 | 在 | ✅ |
| `c1db57b8`（P3） | 在 | 在 | ✅ |

⇒ ✅ **上轮 §18.3 的 P2↔P3 耗时对比两侧都有 `dist`，⛔ 未混入这一维** ——
那条 `+146 ms（+1.6%）` 与 `lab:E47` 的结论**不受本发现影响**。
⇒ ⚠️ 但 `71ac2711` 上**无法跑闸链**（连 `node_modules` 都不在）
⇒ 任何声称取自该 pin 的闸链读数都要单独核。**如实登记为边界，本轮不追。**
