# 场景路由单一真源（Scenario Routing Single Source）Implementation Plan

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** 两个问题一起治：① 给「已有 code 还原 Figma 效果图」场景（规则真源 = `mockup-conventions.md` §M24）补用户唤醒词——现在它有规则、无入口、无闸（激活层失败，A 表实测 12 行无它）；② 在 `docs/WAKE-WORDS.md` 新增 §D 场景总索引表（28 行纯指针），让散在 4 处（mockup §Task Entry Modes / code §R7 / WAKE-WORDS A·B 表 / skill frontmatter）的 19+ 使用场景第一次有一处能看全。

**Architecture:** 三层，全部复用既有机制、零脚本改动：
1. **激活层** —— M24 标题下加 `<!-- artifact-routing: ... -->` P2 自声明注释（在库先例：`mockup-conventions.md` §M23.0 / §M-DISCIPLINE.SYNC、`design-process.md` Step B）+ WAKE-WORDS.md A 表登记行；`scripts/audit-artifact-routing.mjs` 自动断言注释里每个 wakeWord 是 WAKE-WORDS.md 的**全文件子串**（`wakeWordsContent.includes(w)`，见脚本 `checkDocRuleDeclaration`）。
2. **总览层** —— WAKE-WORDS.md 新增 §D「场景总索引」，每行只有三列：场景一句 / 入口 / 规则真源指针。**表只做指针**，规则内容一个字不复述。
3. **防漂层** —— `docs/internal/doc-sync-map.json` 登记 3 条依赖边（mockup 场景段 ↔ §D、code 场景段 ↔ §D 双向），`pnpm run audit:doc-sync` 校验路径存在性；两闸都已挂 pre-commit（artifact-routing：`.husky/pre-commit:319-325`，staged 命中 WAKE-WORDS.md / mockup-conventions.md 即跑；doc-sync：`:243-249`，staged 命中 doc-sync-map.json 即跑）。

**Tech Stack:** 纯 Markdown + JSON 编辑 · `node scripts/audit-artifact-routing.mjs` · `pnpm run audit:doc-sync` · git（多 session 共享 index 纪律）。不新建脚本、不改任何 `.mjs`。

## 判据真源（owner 裁定记录 · 2026-08-12）

- **立项**：owner 2026-08-12 同意两问题合并立项（M24 激活层失败 + 场景散在 4 处无总览）。
- **修法依据**：AGENTS.md §Trigger-Drift 复盘协议——激活层失败的修法第一条 = 加唤醒词；唤醒词落地必须走 `audit-artifact-routing.mjs` P2 规则型自声明机制（脚本零改动）。
- **总索引纪律**：表只做指针，**禁止复述任何规则内容**——否则就是又一处会漂的镜像（这是本计划的失败判据，见 Global Constraints）。
- **落点**：`docs/WAKE-WORDS.md` 新增 §D。计划撰写时已实测确认推荐成立：该文件自述用途就是「日常查『什么场景 → 说什么 → 点亮什么』」（`docs/WAKE-WORDS.md:5`），且它本身就是 artifact-routing 闸的注册表——场景索引与唤醒词注册同文件，闸的扫描面天然覆盖。备选落点 `CONVENTIONS-OVERVIEW.md` 被否：其 §6 归并行计划管（见 Out of Scope），撞车。
- **防漂**：依赖对登记进 `doc-sync-map.json`（改 X 复查 Y），不新建闸。
- **边界**：`CONVENTIONS-OVERVIEW.md` §6 US 表、`docs/STATUS.md` 能力表措辞，本计划都不碰。STATUS 里「能力 3 DEFERRED」措辞的误导，由 §D 里「已有 code 还原效果图 → §M24 + docs/CAPABILITY_3_BYPASS.md」那一行解决，不改 STATUS。
- **⏸ 待 owner 一句确认（执行 Task 2 前）**：唤醒词默认 `@TVU 效果图`（候选排序与理由见 Task 2 Step 0；owner 可换成候选 2/3 或自定，换词只影响 Task 2/3 的字面量，不影响结构）。

## Global Constraints

每个 Task 的要求都隐含包含本节。

- **纯指针纪律（本计划失败判据）**：§D 场景索引表每行只有三列内容——场景描述一句 / 入口（唤醒词或自动路由触发一短句）/ 规则真源指针（文件名 + § 段名）。第三列出现任何规则正文复述（数值 / hex / 触发关键词清单 / 流程步骤 / 判断条件）= 计划失败。入口列的「自动路由（…）」括号内只允许一个短句说明怎么进来，不允许展开条件分支。
- **唤醒词三件套一次做齐**（Task 2，不许拆到多个 commit 之间留半截）：① M24 标题下 artifact-routing 自声明注释 ② WAKE-WORDS.md A 表行 ③ 跑 `node scripts/audit-artifact-routing.mjs` 转绿——且必须先做**故障注入**（只加注释、故意不登记 A 表行 → 亲眼看到闸红 exit 1）再补登记转绿，证明闸真的会红。
- **顺序硬约束**：故障注入（Task 2 Step 2）必须发生在 §D 表落盘（Task 3）**之前**——闸的断言是 WAKE-WORDS.md 全文件子串匹配，§D 一旦写入 `@TVU 效果图` 字样，「漏登记 A 表行」的故障就注不出来了（探针在场性被破坏，参照 fault-probe-name-must-be-absent 纪律）。
- **doc-sync 绿**：doc-sync-map.json 新增依赖边后 `pnpm run audit:doc-sync` 必须绿（它校验 recheck 路径存在性；边内 3 个路径都是现存文件）。
- **不新增规则编号**：本计划不新立任何 M/R/C/Q 号（M24 已有号，只加注释与登记行）——**不要跑 `pnpm rule:next`**，更不许顺手给 M24 换号或另立新 M-rule。
- **定位靠 § 段名，不靠行号**：本计划引用的行号（如 `mockup-conventions.md:47`）是撰写时快照，会漂；执行时以 § 名 / 标题文字 grep 定位，改前 Read 活源核对。
- **提交纪律**（本仓库常态多 session 并行、共享 git index）：先 `git diff --stat -- <路径…>` 核行数，再 `git commit -F <msg 文件> -- <显式路径…>`（`-F` 在 `--` 之前），**紧跟 `git reset -- <路径…>`**。⚠️ pre-commit 闸链可超 2 分钟——commit 用 `run_in_background` 跑；撞 `.git/index.lock` 是对方正在提交，等一下重来。本项目 commit 默认含 push。
- **纯 docs 改动不写 changeset**。
- **预期会被点亮的 pre-commit 闸**（不是故障）：artifact-routing（staged 有 WAKE-WORDS.md / mockup-conventions.md）+ doc-sync（staged 有 doc-sync-map.json）；其余 doc 链闸（doc-shape / rule-inventory / de-mirror 等）照常跑，红了先读输出再改，不许绕。

## Out of Scope

- **`docs/internal/CONVENTIONS-OVERVIEW.md` §6「Common usage scenarios (US-1 … US-6)」表不碰** —— 归并行计划 `docs/superpowers/plans/2026-08-12-rule-inventory-mirror-gate-extension.md`（撰写中，执行时可能尚未落盘）负责指针化。两计划同日并行，本计划任何 Task 都不得改该文件。
- `docs/STATUS.md` 不碰（能力表措辞的误导由 §D 指针行解决）。
- WAKE-WORDS.md 既有 A / B / C 三区**结构**不重排（A 表加 1 行、C 表加 1 行是登记，不是重排；B 表一字不动）。
- skills/*/SKILL.md frontmatter 不改（M24 是规则型制品，走 P2 doc 注释，不走 P1 frontmatter）。
- `scripts/audit-artifact-routing.mjs` / `scripts/audit-doc-sync.mjs` / `.husky/pre-commit` 零改动。
- role-ux / role-translator 等角色 skill 不入 §D（它们是全局角色，注册在 `~/.claude` 全局层，不是本仓库的任务场景）。

## File Structure

| 文件 | 责任 | 动作 |
|---|---|---|
| `docs/internal/mockup-conventions.md` | §M24 标题下加 artifact-routing 注释；顶部 jump 表 §M24 行补唤醒词 | 改 2 处 |
| `docs/WAKE-WORDS.md` | A 表加 1 行、C 表加 1 行、新增 §D 场景总索引（28 行） | 改 2 行 + 新增 1 节 |
| `docs/internal/doc-sync-map.json` | `edges` 数组追加 3 条依赖边 | 追加 |

---

## Task 1: 基线亲跑两闸 + 探针不在场检查

**Files:** 无修改（纯读 + 跑）

**Interfaces:**
- Consumes: 仓库当前态
- Produces: 两闸的绿基线（后续红/绿归因不被预存问题污染）+ 探针不在场证据（Task 2 故障注入的前提）

- [ ] **Step 1: 基线跑 artifact-routing 闸**

```bash
node scripts/audit-artifact-routing.mjs; echo "exit=$?"
```

判据：exit=0，末行 `✅ artifact-routing OK`。若基线就红 → STOP，先报 owner（预存问题不归本计划消化）。

- [ ] **Step 2: 基线跑 doc-sync 闸**

```bash
pnpm run audit:doc-sync; echo "exit=$?"
```

判据：exit=0。红同上 STOP。

- [ ] **Step 3: 探针不在场检查**

```bash
grep -c "效果图" docs/WAKE-WORDS.md
```

判据：输出 `0`（撰写时实测该文件 46 行内无「效果图」字样）。非 0 → 说明有并行 session 已动手或 owner 换了词，STOP 核对 `git log -3 -- docs/WAKE-WORDS.md` 再决定（参照 fetch-check-master 纪律：先 `git fetch && git log HEAD..origin/master --oneline -- docs/WAKE-WORDS.md`）。

---

## Task 2: M24 唤醒词三件套（故障注入先红、登记后绿）

**Files:**
- Modify: `docs/internal/mockup-conventions.md`（§M24 标题下 + 顶部 jump 表 §M24 行）
- Modify: `docs/WAKE-WORDS.md`（A 表加 1 行、C 表加 1 行）

**Interfaces:**
- Consumes: Task 1 的绿基线 + 探针不在场证据
- Produces: `@TVU 效果图` 成为已注册唤醒词 → Task 3 §D 的「已有 code 还原效果图」行引用它

- [ ] **Step 0: owner 一句确认唤醒词**（已预分析，直接给推荐等 ack，不弹窗）

候选排序：

1. **`@TVU 效果图`（推荐默认）** —— 与 `@TVU PRD` / `@TVU UX说明` / `@TVU mockup` 家族命名一致（用户已习惯 @TVU 前缀 + 场景词）；最短；直指产出物。「效果图」与 tvu-design-mockup 的自然语触发（「画一张效果图」）有词面重叠但**不构成冲突**——M24 本就是 mockup 任务的前置子规则，点亮 mockup 协议 + M24 前置是正确行为；greenfield 画效果图误触 M24 由 M24 自身触发条件 2（须真有 source code 可读）自兜底。
2. `代码还原效果图` —— 无前缀自然短语（先例 `同步交付物`），方向显式；缺点：无 @ 前缀发现性差，更适合作 A 表行内的别名而非主词（本计划已把「还原效果图」收进别名）。
3. `@TVU code还原` —— 方向最显式；缺点：@TVU 家族无中英混排先例，且易与已占用的 `@TVU code`（Path B）混记，混淆成本高于收益。

owner 确认 1 或改选后再动 Step 1；换词则本 Task 与 Task 3 的字面量全局同换。

- [ ] **Step 1: 【故障注入·上半】只加 M24 注释，故意不登记 WAKE-WORDS**

在 `docs/internal/mockup-conventions.md` 定位标题行（grep `### M24 — Code→Token Mapping Table`），在标题**紧邻下一行**插入（放置样式照抄 §M23.0 先例）：

```html
<!-- artifact-routing: wakeable=true; wakeWords=["@TVU 效果图", "还原效果图"] -->
```

- [ ] **Step 2: 【故障注入·下半】亲眼看闸红**

```bash
node scripts/audit-artifact-routing.mjs; echo "exit=$?"
```

判据（两条都要命中才算故障注入成立）：
- `exit=1`
- 输出含 `❌ docs/internal/mockup-conventions.md: 唤醒词未在 WAKE-WORDS.md 注册 → @TVU 效果图 / 还原效果图`

没红 = 闸没在守这个面（或探针已在场），STOP 排查，不许继续。**此红状态不许 commit。**

- [ ] **Step 3: WAKE-WORDS.md A 表登记行**

在 A 表（`## A) 用户唤醒词表`）「改完 mockup 后同步交付物」行之后插入：

```markdown
| 已有 code 还原 Figma 效果图 | `@TVU 效果图`（或 还原效果图 / 把 code 翻成 figma / match the code）| tvu-design-mockup 起手协议 + §M24 Code→Token mapping table 前置 | mockup-conventions §M24 |
```

⚠️ 别名「还原效果图」必须**逐字**出现在此行内（闸是全文件子串断言，注释里声明的每个词都要能在本文件搜到）。

- [ ] **Step 4: WAKE-WORDS.md C 表（盲区清单）登记补丁**

在 C 表末尾追加：

```markdown
| 已有 code 还原效果图（M24 有规则、无唤醒词） | ✅ 已补唤醒词 `@TVU 效果图` + §D 场景总索引（2026-08-12）|
```

- [ ] **Step 5: 亲眼看闸转绿**

```bash
node scripts/audit-artifact-routing.mjs; echo "exit=$?"
```

判据：`exit=0`，且输出含 `✅ docs/internal/mockup-conventions.md: [@TVU 效果图, 还原效果图] 已在注册表`。

- [ ] **Step 6: jump 表 §M24 行补唤醒词**

`docs/internal/mockup-conventions.md` 顶部「触发后再读」表中定位 `| §M24 |` 行（撰写时快照 `:47`），改为：

```markdown
| §M24 | "已有 code 还原效果图"场景前置；唤醒词 `@TVU 效果图` |
```

（jump 行已存在，本步只补唤醒词指路，不复述触发条件——触发条件真源在 §M24 本体。）

---

## Task 3: WAKE-WORDS.md 新增 §D 场景总索引表

**Files:**
- Modify: `docs/WAKE-WORDS.md`（文件末尾、C 表之后新增一节）

**Interfaces:**
- Consumes: Task 2 已注册的 `@TVU 效果图`（§D 引用它不再破坏探针——故障注入已完成）
- Produces: 全仓场景总索引 → Task 4 的 doc-sync 依赖边保护它

- [ ] **Step 1: 在 C 表之后追加整节**（下方内容逐字落盘；指针列用纯文本 § 引用，不用 md 链接——与 B 表风格一致，避免扩大 stale-anchors 闸面）

```markdown
## D) 场景总索引（全仓 19+ 使用场景 → 入口 → 规则真源）

> 行集判据：用户会用一句话发起的一类任务（或状态转移自动触发的一类前置），且有独立规则真源段 / skill。
> **本表只做指针，禁止复述任何规则内容**——触发条件 / 流程 / 数值一律去第三列指向的真源读。
> 防漂：本表与 mockup §Task Entry Modes、code §R7 场景段的依赖对已登记 `docs/internal/doc-sync-map.json`（`audit:doc-sync` 校验）。
> US 维度与 R7 场景维度的对应关系 → code-conventions.md §R7〈US↔场景映射表〉。

### D1) Mockup 侧（Path A — Figma）

| 场景 | 入口 | 规则真源 |
|---|---|---|
| Greenfield 产品 mockup | `@TVU mockup` | mockup-conventions.md §Task Entry Modes US-1 |
| Greenfield 单 frame mockup | `@TVU mockup` | mockup-conventions.md §Task Entry Modes US-2 |
| 既有产品 mockup 增 / 改 / 删 | `@TVU mockup` | mockup-conventions.md §Task Entry Modes US-3 |
| mockup 小调整（1-2 element） | `@TVU mockup` | mockup-conventions.md §Task Entry Modes US-5 |
| mockup review / audit | `@TVU mockup` | mockup-conventions.md §Task Entry Modes US-6 |
| 老产品 redesign 提案 | `@TVU mockup` | mockup-conventions.md §US-7 子流程 |
| 已有 code 还原 Figma 效果图（Code→Figma） | `@TVU 效果图` | mockup-conventions.md §M24 + docs/CAPABILITY_3_BYPASS.md |

### D2) Code 侧（Path B — 消费产品代码）

| 场景 | 入口 | 规则真源 |
|---|---|---|
| Greenfield 产品 / 单页代码 | `@TVU code` | code-conventions.md §Task Entry Modes US-1/US-2 + §R7 场景 3 |
| 既有产品代码增量 | `@TVU code` | code-conventions.md §Task Entry Modes US-3 + §R7 场景 2 |
| Figma → code 视觉 1:1 还原（非 TVU 视觉） | `@TVU code` | code-conventions.md §Task Entry Modes US-4a + §R7 场景 1 |
| Figma → code TVU 规范化翻译 | `@TVU code` | code-conventions.md §Task Entry Modes US-4b + §R7 场景 3 |
| TVU 规范校正 / 迁移（用户显式发起） | `@TVU code` | code-conventions.md §R7 场景 4 + migration-protocol.md |
| 代码 review / audit | `@TVU code` | code-conventions.md §Task Entry Modes US-6 |

### D3) 外围与全流程

| 场景 | 入口 | 规则真源 |
|---|---|---|
| 需求分析 / pre-design discovery | 自动路由（新 feature / 新 persona / 重大重设计） | skills/design-discovery/SKILL.md |
| 上游理解-分析 gate | 自动路由（产品设计任务最前置） | skills/upstream-gate/SKILL.md |
| 起草 / 更新 PRD | `@TVU PRD` | design-process.md Pre-Phase 0 Step B |
| 写 / 更新 UX 交付说明 | `@TVU UX说明` | mockup-conventions.md §M23.0 |
| 改完 mockup 后同步交付物 | `同步交付物` | mockup-conventions.md §M-DISCIPLINE.SYNC |
| 设计走查 | `design walkthrough` | skills/design-walkthrough/SKILL.md |
| 设计 QA loop（走查 + 自动修 + handoff gate） | `design done` | skills/design-qa-loop/SKILL.md |
| Persona 模拟（F2-early / F2-late） | `discovery done` / `persona simulation` | skills/persona-simulation/SKILL.md |
| 设计全流程编排 | `@TVU 设计全流程` | skills/tvu-design-pipeline/SKILL.md |
| 消费产品接入 DS（scaffold） | `初始化 TVU 消费产品` | skills/setup-tvu-consumer/SKILL.md |
| 同步 Figma 组件库 | `同步 Figma 库` | AGENTS.md（同名触发词条目） |
| 更新 Claude Design 文件包 | `更新 Claude Design 文件包` | docs/CLAUDE_DESIGN_SETUP.md |
| 规则回流 / 沉淀（新规则进哪个真源） | 自动路由（用户说「回流 / 沉淀 / 记录一条规则」） | mockup-conventions.md §M-DISCIPLINE.SOURCE |
| UI 文案 / 词库 | 自动路由（被 role-ux / role-translator / mockup Bridge step 引用） | skills/shared-vocab-rules/SKILL.md |
| consumer 收尾 / 复盘 | `收尾` | skills/consumer-product-conventions/SKILL.md |
```

- [ ] **Step 2: 逐行指针可解析自检**（机械，不靠目测）

```bash
# 文件级指针全部存在
for f in docs/internal/mockup-conventions.md docs/internal/code-conventions.md \
         docs/internal/design-process.md docs/internal/migration-protocol.md \
         docs/CAPABILITY_3_BYPASS.md docs/CLAUDE_DESIGN_SETUP.md AGENTS.md \
         skills/design-discovery/SKILL.md skills/upstream-gate/SKILL.md \
         skills/design-walkthrough/SKILL.md skills/design-qa-loop/SKILL.md \
         skills/persona-simulation/SKILL.md skills/tvu-design-pipeline/SKILL.md \
         skills/setup-tvu-consumer/SKILL.md skills/shared-vocab-rules/SKILL.md \
         skills/consumer-product-conventions/SKILL.md; do
  [ -f "$f" ] || echo "MISSING: $f"
done
# § 段名指针抽查（每份 conventions 至少核 §Task Entry Modes / §R7 / §M24 / §M23.0 / §M-DISCIPLINE 真实存在）
grep -c "## Task Entry Modes" docs/internal/mockup-conventions.md docs/internal/code-conventions.md
grep -c "R7 — 任务意图" docs/internal/code-conventions.md
grep -c "M24 — Code→Token" docs/internal/mockup-conventions.md
```

判据：无 `MISSING:` 行；三条 grep 计数均 ≥1。

- [ ] **Step 3: 纯指针纪律自检**（启发式红线，命中即改）

```bash
awk '/^## D\)/,0' docs/WAKE-WORDS.md | grep -nE '#[0-9a-fA-F]{6}|[0-9]+px|触发条件|判断流程|禁止用|必须用'
```

判据：零命中（§D 段内不许出现 hex / px / 条件句式等规则正文特征词）。这只是启发式，最终以人读逐行核「第三列只含 文件名 + § 段名」。

- [ ] **Step 4: 重跑 artifact-routing 闸确认 §D 未引入新破坏**

```bash
node scripts/audit-artifact-routing.mjs; echo "exit=$?"
```

判据：`exit=0`（§D 只会增加注册表内容，绿是预期；红则读输出定位）。

---

## Task 4: doc-sync-map.json 登记 3 条防漂依赖边

**Files:**
- Modify: `docs/internal/doc-sync-map.json`（`edges` 数组末尾追加）

**Interfaces:**
- Consumes: Task 3 落盘的 §D（边的保护对象）
- Produces: 「改场景段必复查 §D / 改 §D 必复查两份 conventions」的机械提醒面

- [ ] **Step 1: `edges` 数组末尾追加 3 条**（逐字，注意 JSON 逗号）

```json
{
  "whenYouEdit": "docs/internal/mockup-conventions.md §Task Entry Modes（US-1…US-7 增删改行）或 §M24 触发条件/唤醒词",
  "recheck": ["docs/WAKE-WORDS.md"],
  "why": "WAKE-WORDS §D 场景总索引的 D1 mockup 侧行逐行指向这些段；场景增删/改名后 §D 对应行必须同步，否则总索引成 stale 镜像（2026-08-12 场景路由单一真源计划立的防漂边）"
},
{
  "whenYouEdit": "docs/internal/code-conventions.md §Task Entry Modes（含 US-4a/4b）或 §R7（4 大场景 / 20 子场景 / US↔场景映射表）",
  "recheck": ["docs/WAKE-WORDS.md"],
  "why": "WAKE-WORDS §D 场景总索引的 D2 code 侧行逐行指向这些段；同上防漂（2026-08-12）"
},
{
  "whenYouEdit": "docs/WAKE-WORDS.md §D 场景总索引（增删行 / 改指针）",
  "recheck": ["docs/internal/mockup-conventions.md", "docs/internal/code-conventions.md"],
  "why": "§D 是纯指针索引，新行/改行的指针必须指向两份 conventions 里真实存在的段；§D 禁复述规则内容，指针失效即整行失效（2026-08-12）"
}
```

- [ ] **Step 2: JSON 合法性 + 闸绿**

```bash
node -e "JSON.parse(require('fs').readFileSync('docs/internal/doc-sync-map.json','utf8')); console.log('json ok')"
pnpm run audit:doc-sync; echo "exit=$?"
```

判据：`json ok` + `exit=0`。（doc-sync 只校验 recheck 路径存在性与 crossFileFacts 一致性；3 条边的 recheck 路径都是现存文件，绿是预期。）

---

## Task 5: 提交 + push + 远端验证

**Files:** 无新增修改（提交 Task 2-4 的累积改动）

- [ ] **Step 1: 逐文件过 diff + 核行数**

```bash
git status --short -- docs/internal/mockup-conventions.md docs/WAKE-WORDS.md docs/internal/doc-sync-map.json
git diff --stat -- docs/internal/mockup-conventions.md docs/WAKE-WORDS.md docs/internal/doc-sync-map.json
git diff -- docs/internal/mockup-conventions.md docs/WAKE-WORDS.md docs/internal/doc-sync-map.json
```

判据：只有这 3 个文件、改动内容与 Task 2-4 逐字一致；发现计划外 hunk → 是并行 session 的活，不卷进来（显式 pathspec 已隔离，但 diff 里若见到本计划没写的内容要 STOP 核对）。

- [ ] **Step 2: 写 msg 文件 + 显式路径提交（后台跑，pre-commit 闸链可 >2min）**

msg 文件（写到 scratchpad，勿入库）内容：

```
docs(routing): M24 补唤醒词 @TVU 效果图 + WAKE-WORDS §D 场景总索引 + doc-sync 防漂边

- mockup-conventions §M24：artifact-routing P2 自声明注释（wakeWords=[@TVU 效果图, 还原效果图]）+ jump 行补唤醒词
- WAKE-WORDS.md：A 表登记行 + C 表盲区补丁 + 新增 §D 场景总索引（D1 mockup 7 行 / D2 code 6 行 / D3 外围 15 行，纯指针）
- doc-sync-map.json：mockup 场景段 ↔ §D、code R7 场景段 ↔ §D 三条依赖边
- 验证：audit:artifact-routing 故障注入先红（漏登记 → exit 1）后绿；audit:doc-sync 绿
```

```bash
git commit -F <msg文件路径> -- docs/internal/mockup-conventions.md docs/WAKE-WORDS.md docs/internal/doc-sync-map.json
git reset -- docs/internal/mockup-conventions.md docs/WAKE-WORDS.md docs/internal/doc-sync-map.json
```

判据：commit 产生且 `git show --stat HEAD` 只含这 3 个文件；pre-commit 输出里能看到 `▶ pre-commit: artifact-routing` 与 `▶ pre-commit: doc-sync` 两段都跑且过。

- [ ] **Step 3: push + 远端落地验证**

```bash
git push origin master
git ls-remote origin master   # 以 ls-remote 的 SHA == 本地 HEAD 为准（瞬时 remote-rejected 可能是假象）
```

判据：`git ls-remote` 返回的 master SHA 等于 `git rev-parse HEAD`。

---

## Task 6: 收尾三查（自审，产出结论不产出文件）

**Files:** 无修改

- [ ] **查 1 — spec gap**：对照本计划 §判据真源逐条核：唤醒词三件套齐？故障注入红证留存（Task 2 Step 2 的 exit=1 输出）？§D 28 行全落？3 条边全登记？owner 确认点（唤醒词）有 ack 记录？
- [ ] **查 2 — 实现 bug**：终跑两闸各一遍（`node scripts/audit-artifact-routing.mjs` + `pnpm run audit:doc-sync`，都要 exit 0）；再跑一遍 Task 3 Step 3 的纯指针启发式 grep（零命中）。
- [ ] **查 3 — doc lag**：grep 全仓有没有别处还写着「M24 无唤醒词 / 无入口」的旧措辞（`grep -rn "无唤醒词" docs/ --include="*.md"` 抽查）；C 表那行的 ✅ 状态与实物一致。
- [ ] 输出 3 查结论给 owner（有 finding 主动报，不等问）。

---

## Verification（整计划完成判据汇总）

1. `node scripts/audit-artifact-routing.mjs` exit 0，输出含 `✅ docs/internal/mockup-conventions.md: [@TVU 效果图, 还原效果图] 已在注册表`。
2. 留存过一次真实的红：故障注入态 exit 1 + `❌ … 唤醒词未在 WAKE-WORDS.md 注册` 输出（证明闸活着）。
3. `pnpm run audit:doc-sync` exit 0。
4. WAKE-WORDS.md §D 存在、28 行、三列、零规则正文复述（启发式 grep 零命中 + 人读核对）。
5. commit 只含 3 个文件、已 push、`git ls-remote` SHA 与本地一致。
6. `CONVENTIONS-OVERVIEW.md` §6 与 `docs/STATUS.md` 的 `git diff` 为空（边界未破）。
