# INFRA-F149 ② 取证量具与读数

⛔ **这不是闸，也不是 `scripts/` 的一员。** 一次性探针，放这里只为让报告里的读数**可复跑**
（纪律：完成声明必须给「读数表 + 可复跑命令」，⛔ 不收文字总结）。

- **预注册**（取数前 commit）= [`../2026-09-15-f149-product-frame-evidence-preregistration.md`](../2026-09-15-f149-product-frame-evidence-preregistration.md)
- **读数报告** = [`../2026-09-15-f149-product-frame-evidence-stage1.md`](../2026-09-15-f149-product-frame-evidence-stage1.md)

## 文件

| 文件 | 是什么 |
|---|---|
| `selfcheck.mjs` | 已知向量自证。⛔ 这一关不过，后面读数整批作废 |
| `stage1.mjs` | Stage 1 描述性清点（17 文件 `depth=3` REST 现取） |
| `selfcheck.json` | 自证读数。**含 66 个违例 id 的完整集合**（此前真源只记了 3 个）⇒ 下一轮的已知向量 |
| `stage1-derived.json` | 每文件的计数、SECTION 名清单、REFERENCE 命中 |

`stage1-raw.json`（2.1 MB，含 7427 个 topFrame 的逐条 id / name / 尺寸 / 挂载）**刻意不进仓** ——
跑一次 `stage1.mjs` 就能重建，且它会随 Figma 活树变化，存进来只会变成一份很快过期的快照。

## 复跑

需要 `FIGMA_TOKEN` / `FIGMA_PERSONAL_ACCESS_TOKEN`（本机在**主工作树**的 `.env`，gitignored，mode 600
⇒ 在 worktree 里跑要显式指过去）。

```bash
# 在主工作树取 token（唯一凭据解析点 = scripts/lib/figma-env.mjs）
TOKEN=$(node -e "import('./scripts/lib/figma-env.mjs').then(m=>process.stdout.write(m.requireFigmaToken()))")

# 1) 自证 —— 必须先过
FIGMA_PERSONAL_ACCESS_TOKEN="$TOKEN" node docs/internal/_spikes/f149-evidence/selfcheck.mjs . /tmp/f149-out

# 2) Stage 1 清点
FIGMA_PERSONAL_ACCESS_TOKEN="$TOKEN" node --max-old-space-size=8192 \
  docs/internal/_spikes/f149-evidence/stage1.mjs . /tmp/f149-out
```

⛔ **别 pipe 到 `head` 再取 `$?`** —— 取的是 `head` 的退出码。本条线已踩过一次。

## ⚠️ 自证向量是快照 —— 而且当天就红过一次

期望值是 **2026-09-15 17:25 CST 的活树快照**。Figma 上那 7 页一旦被编辑，V3/V4 会红 ——
那时该做的是**回去核实改了什么**，⛔ 不是把期望值改到能过。

**这不是假设，当天就发生了**：写完本 README 后逐字复跑，**2/16 不过**
（`10166:2` product 45→54 · 违例 42→51 · 合计 66→75）。查因 = LCD 文件 `lastModified`
在两次运行之间从 `09:26:26Z` 走到 `09:32:10Z`，有人正在编辑。⇒ **真实编辑，⛔ 不是量具随机性。**

同时量到：同一次编辑下**结构层纹丝不动**（CANVAS 68 / SECTION 48 / topFrame 525 三项全同）。

🔴 **⇒ 已登记的设计问题：向量该拆两档，本轮未做。**

| 档 | 内容 | 性质 |
|---|---|---|
| **结构档** | 帧尺寸（V1）· topFrame / SECTION / CANVAS 计数 | 对内容编辑免疫 ⇒ Stage 1 该挂这一档 |
| **内容档** | 三分计数 + 66 个违例 id（V3/V4） | 快照 ⇒ 红了回去核实，⛔ 别连坐结构档 |

现在两档混在一起 ⇒ **任何一次无关的文案编辑都会让整批结构读数「作废」，而它们其实完好。**
Stage 2 开工前应先拆。
