# 设计系统跨 AI 协作机制硬化 — 审计诊断 + 优化设计

> **日期**：2026-06-25
> **类型**：机制层（AI 协作）系统性审计 + 优化设计 spec
> **状态**：审计 + 第一轮 live 核实 + **架构收敛（做减法）** 已完成。未进入真源文件更新阶段。
> **起因**：㉖（2026-06-18 激活层硬化）per-task review 判 clean，但消费产品设计持续暴露问题。owner 要求不信 clean 结论、重新独立审计。
> **北极星**：放任意 AI（Claude Code / Codex / Cursor / Claude.ai·ChatGPT·Gemini 网页 / Claude Design 插件）上都能准确按设计系统规则工作；小任务无大动作、中任务适时插流程、大任务走完整流程。
>
> **修订记录**：
> - 2026-06-25 初稿（af2d74ab）。
> - 2026-06-25 第一轮 live 核实修订（纠正过期实证 + §4 核实日志 + §5 待确认）。
> - 2026-06-25 **架构收敛**：以资深设计系统架构师视角做减法，剔除"为实现而实现"的过度机制（impact-trace/语义索引、单独 gate-map JSON、挡错-diff 脚本、live 闸 canary 注入层、五维健康审计系统、live 回归集强上 CI），治本动作改为复用已有 + 单一真源。剔除清单见 §2.7。

---

## Part 1 — 独立审计诊断（事实基础，不变）

### 1.1 方法
并行 3 subagent 扫三源（design-system 内部 / MicroApps / TVU Pack；tvu-saas-dashboard 空壳），证据驱动反向审计，统一根因 taxonomy：R1 规则缺失 / R2 激活失败 / R3 目测顶替 / R4 分档·语义判错 / R5 资产在却手搓 / R6 跨 AI·session 失效 / R7 audit 假阴性。

### 1.2 规模与分布（约 144 真实案例，未跨源精确去重，当量级看）
- design-system 内部 ~50：R7(~50) > R3(~35) > R2(~18)
- MicroApps ~64：R5(~45) > R2(~40) > R3(~35)；R7(~15)
- TVU Pack ~30：R2(~22) > R4(~11) > R5(~9)

**最重要的单一事实：R1（规则缺失）≈ 0。** 规则齐全，破口在规则没被调起、没被复用、没被真验证。

### 1.3 为什么"说没问题却出问题"
review 验"规则写了吗"（文本存在性），实做败在"规则有没有被激活"——两套不重叠检查面，可同时为真。R7 与 R3 同根：验证器和 AI 犯同一错，拿 derived（提取产物/REST 缓存/缩略图/CI 绿）当裁判。㉖ 判 clean 本身就是 R7。

### 1.4 五个系统性盲区
- **B1** authoring 侧无机器 gate（Figma 写在 repo 外，硬规则 #1），唯一兜底是用户走查。
- **B2** 规则可达性破洞（进正文没进路由表）。M23.14 个案已修（93fa53ee），但 `rule-load-map` 仍报 2 条 parentOnly 盲区（C4/M32.1）；且 working-principles / multi-session / component-review 三份**整份文档无机械触发入口**（baseline 实测）。
- **B3** 复用/discovery 失败（资产在却手搓/fabricate，R5 最高频之一）。discovery 只用在 PRD 阶段、没扩到 build。
- **B4** 兜底假阴性（与 R3 同根）。env 个案已部分修（45089b3d，仅总闸+connector）。真正"放行坏东西"的硬假阴极少（2 例）；绝大多数是闸没跑/没覆盖——问题是激活与覆盖。
- **B5** 跨 AI/session 靠 5 偶然条件叠加（memory+handoff+skill+唤醒词+audit），换环境就退化。hooks/skill 只对 Claude Code 生效。

### 1.5 R4 语义判错（~24 例）— 诚实区分
一部分机制能止血（交付前建样张 confirm、收尾走查）；一部分是 AI 对产品真实规则的固有无知，**必须 owner 在环**，靠"停下问 owner"强制节点止血，不假装全自动。

### 1.6 对 ㉖ 的复核（已 live 核实）
WS4（conformance 总闸聚 8 子审计）+ W5（handoff-evidence 挂 pre-commit 强制贴脚本输出）**已落地**；WS3（状态转移）部分落地（靠 prose）。㉖ 未触及的结构根因仍在：B1、B4 的 live 闸假阴层、B5 —— 本设计针对这三块。

---

## Part 2 — 优化设计（架构收敛后的最佳方案）

### 2.0 一句话架构

> **真问题是激活 + 复用 + 验证假阴 + 跨 AI，而规则几乎不缺。所以方案的灵魂是"单一真源 + 各受众引用 + 确定性验证 + 跨 AI 可移植"——不是加更多机制/工具/文件。** 凡是"给派生层打补丁、新增缓存/索引/JSON、为覆盖率硬造注入层"的，一律做减法剔除。

**enforcement 诚实分层**（贯穿）：
- **L1 机械闸**：真 oracle 验证脚本，可阻断 —— Claude Code / owner 本地（mockup 闸只能本地跑，§4 V4）。
- **L2 协议激活**：可移植契约，各平台注入口拉起 —— 全部 4 类 AI。
- **L3 人肉兜底**：owner 一键复跑 + 抽查 —— 目标从"每次都要"降到"抽查"。

### 2.1 骨架（保留下来的 4 块，都解决真问题且符合实际）

**① 可移植契约 = 6 步 authoring loop（方案核心，一块同时解决 B1/B2/B5）**
```
0 定档    答入口三问 → 按档位表确定该跑哪些闸 → 声明"本任务 US-X，依据…"
1 Probe   按档 probe：库里有无现成组件/变量/文案/同类页? 目标节点现状?
          → 列出 probe 结果。【没 probe 不许建】          〔治 B3 / R5〕
2 做      按档 scoped-load 对应规则真源（指针，不复述）   〔治 B2〕
3 验      按档只跑最小必跑闸 → 贴脚本输出。【禁"目测 OK"】〔治 B4 / R3〕
4 同步    改完图 → 改 PRD 真源 → 按 PRD 核 mockup 各派生视图〔治遗漏，见 ③〕
5 停      语义/产品规则吃不准 → 先建 1 样张或直接问 owner 〔治 R4 固有无知〕
```
- **不复述规则**（规则不缺），只放触发点 + 指针，刻意短（1–2 屏），长文件靠 scoped-load 按需加载。
- **强制留痕**：probe 结果 / 闸输出 / 定档依据都要留痕——跨 AI 唯一抽查抓手，没痕迹 = 没做。W5 已在 commit 环把"必须贴脚本输出"机械化。
- **不重造**：从现有 M-LIFECYCLE + M-DISCIPLINE.SYNC + WAKE-WORDS + onboarding 碎片**抽取提级成一份**，AGENTS.md 顶部钉为唯一入口，旧碎片改指针。净文件数不增反减。

**② 分档路由（入口三问 + 档位→闸表，写进契约，不单独建文件）**
```
Q1 新建 page/section/多节点布局?  —是→ US-1/2（全流程）
Q2 加换组件实例或动 auto-layout?  —是→ ≥ US-3
Q3 改色/间距/绑定/尺寸?           —是→ ≥ US-5
全否（只换文字、结构不变）        —→ US-5.S（最轻）
```
| 档 | 动手前 probe | 改完只跑 |
|---|---|---|
| US-5.S 纯文案 | 读节点字体/双语 | typography + bilingual-spacing(若双语) + overlap |
| US-5 单属性 | probe 该属性绑定 | 上面 + M-COLOR + binding-fidelity |
| US-3 加换组件 | discovery：库里有无现成件 | 上面 + library-origin + variant-consistency |
| US-1/2 新建页 | 全套 discovery | 全套 integrity + 全闸 + walkthrough |

- 防错分档靠**入口三问客观化 + 保守兜底（吃不准上调）**，不建"核 Figma diff"脚本（过度，见 §2.7）。

**③ PRD = 业务逻辑单一真源，mockup 是派生视图（治"改逻辑漏同步"，替代被剔除的 impact-trace）**
- "同一逻辑散落多副本"的根因是它被画进 mockup 多个视图。架构解不是追踪副本，而是**确立真源**：业务逻辑真源在 **PRD（已有 canonical 6 段结构）**，mockup 是 PRD 的派生视图。
- **改业务逻辑 → 先改 PRD → 拿 PRD 当 checklist 逐项核 mockup 各视图**（用已有 design-walkthrough，零新增工具/文件/缓存/索引，天然无 drift）。
- 纯视觉、PRD 无法文字表述的副本差异（如某 lane 禁用态样式），靠 walkthrough 的**状态枚举**（已有 M48 起手枚举全态）兜，仍不建索引。

**④ 真 oracle 验证（治 B4，低成本核心）**
- **真 oracle 对照**：每个闸的裁判钉死成 ground truth，禁 derived 冒充——Figma 维度用 live `use_figma` 实读（不用 REST 缓存/提取产物）；Code 维度用真浏览器 getComputedStyle；parity 用逐副本回画布实读（不用 handoff 声称）；consumer 用 fresh install 真渲染（不用 CI 绿/Packages API）。
- **coverage 计数（最高性价比）**：每个闸输出"实际检查了 N 个节点"，N=0 或前置缺失（缺 token/连接）= **硬 FAIL，绝不"跳过=通过"**。这一条低成本就治掉绝大多数假阴（审计实证：假阴几乎都是"没跑/没覆盖"而非"判定错"）。
- **canary 仅离线闸**：给 `library-binding` + `handoff-evidence` 两个离线闸喂已知坏样本自检（低成本）。10 个 live 闸**不建 fixture 注入层**（过度，见 §2.7），靠 coverage 计数兜底。
- **诚实分级**：每个闸标 `live-oracle 强` / `derived 弱`，弱的只能参考不能当 gate。

### 2.2 跨 AI 激活：单一真源 → 各平台 export（北极星，治 B5）

**灵魂**：做在任意平台，**"算数"只在过了 L1 闸之后**。弱平台做+留痕（L2），产物回 L1 终验才算交付。

| 平台 | 注入口 | 能达到 | 验证 |
|---|---|---|---|
| Claude Code | hook 注入契约+档位 | L1 全套 | 跑闸 + use_figma live |
| Codex / Cursor | file-based prompt / AGENTS 引用契约 | L2 + 部分 L1 | 提示跑闸 + owner 抽查 |
| Claude.ai / Gemini 网页 | Project Instructions 放精炼契约 + 上传 bundle | L2 + L3 | 留痕 + 抽查；回 L1 终验 |
| Claude Design 插件 | bundle 嵌契约精简版 | L2 reference | 回 L1 终验 |

- **反 drift 铁律**：各平台版本一律**从单一真源 export 生成**（像现有 `export:claude-design-bundle`），**绝不手抄**。
- **post-figma-write 是提醒非强制**（§4 V2）：连主力平台也是"提醒+事后跑"，无写前拦截（硬规则 #1 固有边界）。
- **Claude Design 瘦身**：bundle 只留（1）代码推断不出的隐性规则（M23/图标/domain）+（2）契约精简版；删它执行不了的（脚本逻辑/跨 session 协议/hook 配置）。

### 2.3 规则体系健康：只留"过期锚点轻校验"，其余并入主线（回应"怎么确认规则健康"，做减法后）

owner 问"怎么确认所有规则适用/有效/不冲突/不重复/不过期"——**不靠人工 review（=㉖ 假阴老路），但也不建庞大五维审计系统（过度）**。最小有用版：
- **过期（高价值，做）**：新增一个轻 audit，校验规则里引用的**锚点**（文件路径/脚本名/env/规则交叉引用/组件名）是否还存在——锚点没了=过期。这次手工就靠它挖出 M23.14/env，值得固化成脚本，挂 pre-commit/CI（纯离线，可上 CI）。
- **重复（baseline 已判，并入治本）**：实测重复以**跨受众分发型**为主（颜色/图标在 mockup/code/Claude Design 各写一遍），非意外 drift。治本 = **顶层原则单一真源 + 各受众文件指针**（与"契约单一真源+各平台引用"同构）；不是删落地差异。
- **孤儿（baseline 已判，并入 B2）**：实测孤儿集中在三份文档无机械触发入口（working-principles/multi-session/component-review）——这就是 B2 可达性，归"契约/路由表覆盖"解决，不单列。
- **有效**：= §2.1④ 的 coverage+canary + §2.4 回归集，已覆盖。
- **冲突**：无法全自动（诚实天花板），靠"同主题聚类 + 人工/AI 交叉比对"，不投入造检测器。

### 2.4 验证这套真生效（用实做面当裁判，不靠自检/新 fixture）
1. **真实失败回归集**：把 ~144 案例高频复发类（手搓 info-box / Q15 坐标 / parity 丢字段 / 目测顶替）做成回归集，验证新机制在那个点触发/拦截。**离线维度上 CI；live Figma 维度本地跑 + owner 抽查**（不为上 CI 强配 token secret+fixture，见 §2.7）。
2. **跨 AI 同任务实跑**：选轻档（改文案）+ 中档（改权限逻辑）两任务，4 平台各跑，判据=正确定档+probe 留痕+产物回 L1 终验 PASS。
3. **元 canary**（离线维度）：回归集塞一个该被拦的坏产物，没拦住=验证不通过。
4. **持续收紧**：消费侧每次再翻车 → 变回归集新案例（loop-until-dry）。

---

## Part 2.7 — 剔除清单（做减法，每条附理由）

| 剔除项 | 为何剔除（资深架构判断） | 替代 |
|---|---|---|
| **impact-trace 机制** | 给"mockup 多副本"派生层打补丁，没治真源 | PRD 单一真源 + walkthrough 按 PRD 核派生（§2.1③） |
| **自动语义索引（文件或查询）** | 又加 derived 缓存，膨胀且 drift——用会 drift 的东西防遗漏自相矛盾 | 同上；真要查时在已有提取产物实时查，但根本不需要（PRD 真源足够） |
| **task-tier-gate-map.json 单独文件** | 又一个新文件；分档表写进契约即可机读 | 档位→闸表写进契约（§2.1②） |
| **挡错分档"核 Figma diff"脚本** | 入口三问已客观化分档，再加 live 核 diff 是过度冗余、还要 live 连接 | 入口三问 + 保守兜底 |
| **为 10 个 live 闸建 canary fixture 注入层** | 大工程；live 闸假阴主要是"没跑/没覆盖"，coverage 计数已治 | coverage 计数兜底；canary 仅 2 离线闸 |
| **live Figma 回归集强上 CI（配 token secret+fixture）** | 为上 CI 造一堆基建，ROI 低 | live 维度本地跑 + owner 抽查 |
| **五维规则健康审计系统** | 过度系统化；多数维度并入主线即可 | 只留过期锚点轻校验（§2.3） |

**做减法后净效果**：从"加 7-8 个新机制/文件"瘦成"**1 份契约统领 + 复用已有（PRD/walkthrough/conformance 总闸/manifest）+ 2 个轻 gate（过期锚点、coverage 计数）+ 1 条纪律（PRD 单一真源）**"。符合单一真源、不给派生层打补丁、少即是多。

---

## Part 3 — 实施边界

### 3.1 非目标（YAGNI）
- 不为拆而拆文件（长不是根因，scoped-load 已在）。
- 不为简化而简化规则（零 R1、无冗余致错）。
- 不重造已有机制（M-LIFECYCLE/SYNC/WAKE-WORDS/conformance 总闸/PRD 结构/walkthrough/manifest 是复用对象）。

### 3.2 诚实天花板
- Figma 写在 repo 外：无写前拦截，最多写后提醒+事后跑闸。
- mockup 验证闸全是 live-oracle、只能本地手动跑（§4 V4/V5）。
- 网页版/Claude Design 无机器 gate：靠 L2 协议 + L3 抽查 + 回 L1 终验。
- R4 语义判错有不可消除部分：靠"停下问 owner"强制节点止血。
- 规则冲突检测无法全自动。

### 3.3 现有可复用资产（"不重造"清单，§4 V9）
- mockup 审计族：integrity/colors/overlap/bilingual-spacing/binding-fidelity/library-origin/connector/typography-icon/library-binding/handoff-evidence/**conformance 总闸（聚 8 子审计）**。
- render 族：render-verification-manifest（纯离线，**930** 条）+ drift-gate + coverage-gaps。
- 其它 audit：artifact-routing / canonical-compliance / rule-load-map / token-contract / icon-naming 等。
- manifest/map：render-verification-manifest / binding-source-map / components.manifest / docs-figma-members。
- PRD canonical 6 段结构（design-process Step B）+ design-walkthrough + M48 状态枚举。
- hooks：SessionStart→onboarding / UserPromptSubmit→detect-figma-task / PostToolUse→post-figma-write；`.husky/pre-commit` 条件式十余 gate。

---

## Part 4 — 核实日志（2026-06-25 第一轮 live 核实 + baseline，read-only）

| # | 核实项 | 结论 | 证据 |
|---|---|---|---|
| V1 | M23.14 路由表 | ✅ 已修 | 93fa53ee；rule-load-map EXIT=0；仍报 2 条 parentOnly（C4/M32.1） |
| V2 | post-figma-write 是否逼跑 | ⚠️ 仅提醒注入，非强制 | hook 脚本注释自承 |
| V3 | ㉖ WS3/4/5 | ✅ WS4/W5 已落地、WS3 部分 | conformance 总闸 + handoff-evidence 挂 pre-commit |
| V4 | CI/pre-commit + Figma 连接 | ✅ 离线闸可挂、live mockup 闸不行 | CI 无 token secret、无 nodeId |
| V5 | audit oracle 类型 | ✅ 10 live / 2 离线 / 0 fixture | 离线仅 library-binding + handoff-evidence |
| V6 | env fallback | ✅ 确认但仅总闸+connector | conformance.mjs:44-45；45089b3d |
| V7 | 语义索引能否离线生成 | ✅ 可（但已剔除该方案） | components-tokenized 含 characters（39/685） |
| V8 | RVM 生成 + 确数 | ✅ 纯离线，**930**（纠正 908） | generate-...mjs 无 live 调用 |
| V9 | 可复用资产 | ✅ 见 §3.3 | — |
| baseline | 规则重复/孤儿 | ✅ 重复=跨受众分发型为主；孤儿=三文档无机械入口 | 见 §2.3 |

> §5-1（消费产品文件离线缓存覆盖）核实被中断未完成——但该项服务的"语义索引"方案已剔除，**此待确认项随之作废**。

---

## Part 5 — 待确认清单（收敛后仅剩需 owner 拍板的真决策）

1. ✅ **过期锚点轻校验的范围**（owner 拍板 2026-06-29，已实施 commit `4da7c434`）：范围 = **Tier1+2**（file-path / fragment-slug / §rule-ref / script / env，**不含组件名** —— 组件名散落 prose 最噪、真源另有 catalog/manifest gate）；扫描文件 = mockup-conventions + code-conventions + meta-rules 三大文件。见下 §6.5 实施记录。
2. **契约碎片抽取提级的处置**：旧碎片（M-LIFECYCLE/SYNC/WAKE-WORDS/onboarding 段）提级成单一契约后，删除还是留指针？（影响历史链接）
3. **顶层原则单一真源落点**：颜色/图标等跨受众重复原则，单一真源放哪（working-principles？还是各建一节"原则真源"）？
4. **实施优先级**：契约提级（B1/B2/B5 一锅端）应是第一块；其余（过期 audit / coverage 计数补齐 / PRD 纪律落 walkthrough）排序待定。

> **下一步**：§5 逐条确认 → 回填 spec → 全部无误后据 spec 更新真源文件（不可遗漏）。本轮仍未动真源。

---

## Part 6 — 2026-06-25 续：逐条审查尝试 + 工具污染教训 + 核心防护原则

> 编号对齐说明：本 Part 在 06-25 work-log / handoff 中记为 "Part 8"，但 spec 实际结构止于 Part 5（历史上从无 Part 6/7），且该编号从未落盘。经 `git show` 核证，正确续号为 **Part 6**，内部小节随之对齐为 §6.x。

### 6.1 发生了什么

spec 定稿（ba5d681f）后，owner 要求对真源规则文件做逐条健康审查。派 4 个 subagent 深读 11 个文件，产出问题清单 H1-L7（冲突/过期/重复/歧义/不合理）。逐条确认第一条（H1）时，用 git show 核对干净原文，发现工具输出大段污染。

### 6.2 工具污染实证（本次最重要发现）

本 session 的 Read / Bash / subagent 输出会"安静地撒谎"——不只乱码，还读到看似合理实为虚假的内容：

- WAKE-WORDS §B 真实是「任务内场景路由表」且已声明"只镜像、真源在 mockup-conventions 顶部 jump 表"，被 subagent 读成"独立重复表"；
- subagent 报告"读了 docs/internal/multi-session-collaboration-rules.md 内容"，但该路径（误加 `internal/`，真源在 `docs/multi-session-collaboration-rules.md` 不带 `internal/`）根本不存在；
- AGENTS.md 某段被读成与 git show 严重不符的内容、凭空生成整屏空行 / 假注释。

结论：问题清单 H1-L7 全部作废（建立在污染读取上），需用 git show 重建。真源文件零破坏（改前 git show 核对 + 逐条 owner 确认拦住了）。

### 6.3 核心防护原则（后续永久适用，优先级最高）

最危险的不是看得见的乱码，是无征兆的"安静幻觉"。因此：

1. `git show HEAD:<file>` 是唯一 ground truth。下任何文件内容结论前、改任何东西前先 git show 核对——不等乱码才警觉。
2. 不轻信 Read / grep / subagent，关键事实 git show 交叉验证。
3. 改真源：Edit old_string 来自 git show 干净原文；Edit 失败=停+重核，绝不猜。
4. 逐条 owner 确认，绝不批量、绝不改错。
5. context 卫生：阶段成果及时落盘；出现混乱/重复/编造苗头即提示落盘换 session。
6. 工具污染到无法用 git show 稳定工作时，停止编辑、上报 owner。

### 6.4 当前状态 + 续跑

- 真源零破坏；spec 方法论 + 架构判断有效，但 spec 内具体行号/数字/H1-L7 需 git show 重核。
- 续跑：新 session 用 git show 逐文件重建可信问题清单 → owner 逐条确认 → 改。
- 本 Part 因当时 session 工具污染、无法安全 Edit spec，由 owner 手动 / 新 session 追加——本身即 §6.3 原则的实践。

---

## Part 6.5 — 过期锚点轻校验 实施记录（2026-06-29，commit `4da7c434`，推 Gitea+GitHub）

Part 5 决策 1 落地。owner 拍板 Tier1+2 + 三大文件后，新建 [`scripts/audit-stale-anchors.mjs`](../../../scripts/audit-stale-anchors.mjs)（zero-dep ESM，受 `audit:scripts-stdlib` 约束）+ [`tests/stale-anchors.test.ts`](../../../tests/stale-anchors.test.ts)（21 纯函数单测）。

**校验 5 类锚点（真 oracle 对照，对齐 §2.1④）**：
- `file-path` —— markdown 链接 `[..](path)` 目标文件须存在（**反引号路径刻意不校验**：basename 提及 / 外部仓路径 / `.figma.ts` 模式串混杂、误报率过高，无可靠信号分离）。
- `fragment` —— markdown 链接 `#slug` 用 github-slugger 算法比对目标 heading slug。**这是 #m230 / 触发器-q slug 漂移的精确拦截点**，本 audit 真动机。
- `rule-ref` —— `§M../§I../§C../§M-XXX/触发器 X` 比对跨文件规则定义注册表（**父族 fallback**：§M23.15 在 M23 族仍在时 PASS，避免合并/历史叙述误报；仅整族消失才 FAIL，对齐既有 `rule-load-map` parentOf 范式）。
- `script` —— `pnpm audit:foo` / `sync:bar` 比对 package.json scripts key。
- `env` —— `process.env.X` / `${X}` 精确信号比对 .env.example + CI-secret allowlist（三文件当前零真引用 → no-op 无噪；未来引入即生效。**naive ALLCAPS 反引号被否决**：三文件实测全是 Figma 节点类型 / 占位符，纯误报）。
- coverage 计数：每类输出"实际检查 N 个"；前置缺失（package.json/.env.example 读不到）= 硬 FAIL，绝不"跳过=通过"。当前 **335 锚点检查、零孤儿**。

**注册表来源（DEF_FILES，比 SCAN 宽）**：三大文件 + design-process.md + figma-technical-reference.md（§M48/§M49/§M22 定义在 design-process、Q* 在 figma-technical-reference，跨文件引用需并入注册表）。

**首跑 oracle 抓到 14 个真孤儿全修**（链接 slug 没跟上 heading 改名/加日期后缀）：
- 11 机械修（链接对齐现有 heading 正确 slug）：q5 / q6（去全角 ：，）/ m22（prefix→前置）/ m38（1-side→3-layer）/ m43×3（补 --2026-05-27-新增 后缀）/ 触发器-L（laiai→lai typo）/ r17 / r18 / r19（去杂质 " 同步" + 补全 slug）。
- 3 forward-ref（R20/R21/R22 从未在 code-conventions 建）：owner 拍板**去链接保留文字**（"R20（候选，code mirror 待补）"），锚点必断、去链接保"候选"语义最小正确。

**enforcement 三处（反模式 #7 双向核对：定义 + 消费）**：
- `package.json` → `audit:stale-anchors` script + 追加进 `prepublishOnly`（CI audit-matrix + release 都跑）。
- `.husky/pre-commit` 条件块：任一 DEF 文件或脚本变更即跑（heading 文本动会漂移 fragment slug，故 design-process / figma-technical-reference 也纳入触发）。
- `.github/workflows/stale-anchors.yml`：**zero-install** 独立 workflow，补 ci.yml `on.push.paths` 不含 `docs/internal/*.md` 的盲区（rule-doc-only commit + `--no-verify` 绕过 pre-commit 的服务端兜底）。

**遗留（非本线，未触碰）**：`audit:status-consistency` 在 committed HEAD 的 STATUS.md line 3 报 C2-stale-prep-marker（v0.10.1 published&verified 残留 in-progress marker），**pre-existing + STATUS.md 并行 session dirty**，本线不碰（待 owner / 并行 session 收口）。

**下一步**：Part 5 决策 2-4（契约提级 B1/B2/B5 一锅端 + 顶层原则单一真源落点 + coverage 计数补齐）—— owner 拍板后再动，改动面大。
