# System Design Review — 元层合理性审计（2026-06-10）

> **性质**：审整个设计系统的**流程 / 规则 / 逻辑 / 引用方式 / 场景覆盖**是否合理 —— 不是 code-review（不找代码 bug）。
> **方法**：按 [`system-design-review.prompt.md`](../_prompts/system-design-review.prompt.md) 执行。Opus 4.8 + High；维度 A-F + onboarding 链路 fan-out 给 6 个独立 reader agent（owner 授权 Workflow），每维结构化产出 → 对抗性 verify panel 逐条造反例复核 → 汇总去重。共 29 agent。
> **纪律**：先读真源再判断，每个 finding 带 `文件:行` 证据；对抗 verify 已 **DROP 5 条 / 降级 6 条**（造反例打破的不计入）。
> **IN-FLIGHT 排除**：Notification 组件双轴重构（`status → form+type+booleans`，Figma 进行中、未 publish/未进 code）相关 finding 一律不深审，以 Notification session 结果为准；本报告未对其状态轴或迁移中间态报任何缺陷。
> **本报告只读不改** —— review 与 fix 分离，改不改由 owner 拍板。

---

## 0. 总评（维度 F · 系统当前健康度）

**整体健康度：良好，但有一条系统性主病灶。**

正面：deterministic 验证机制（render-verification manifest 908 entries + render-drift-gate）已建并接 CI；Figma 真源原则文档化彻底；翻译层 divergence 有结构化登记；版本号三角（package.json / STATUS / CHANGELOG）有 `audit:status-consistency` 把守；canonical/base 双源逻辑自洽；onboarding 链路目标文件**全部存在无断链**（仅 1 处路径多一层 `../`）。对抗 verify 还证明若干"看似缺口"其实**已被文档诚实标注或被等价机制覆盖**（能力3 反向 CLI、截图输入、规则 sprawl、token-missing 降级 —— 见 §4 DROP 清单），说明系统的"诚实度"比第一印象高。

**唯一系统性病灶（维度 B 根因）**：项目把大量"机制兜底"承诺**建在一个可绕过的本地 pre-commit hook + Owner-direct-master 上**。CI（`publish.yml`）只在 tag/手动触发，无 push/PR gate，无 pre-push。于是"文档化 ≠ 强制化"不是个别疏漏，而是结构性的——凡声称"gate 兜底"但实际只在 pre-commit 子集或纯 AI 手动跑的规则，进 master 前都没有真护栏。最尖锐的实例是 4 个独立维度 agent **都**抓到的同一条：`AGENTS.md:463` 谎称 D/E/F/G 有 pre-commit 兜底。

**Top 3 该动的（按 ROI）**：

1. **修 `AGENTS.md:463` 的虚假 gate 承诺**（P1-01）—— 要么把 D/F/G 真挂进 pre-commit 条件 gate，要么把文字订正为"靠 AI 手动跑 self-audit-phase2，无机制兜底"。当前文字会让 AI/同事误以为有自动防线而放松手检，是病灶的最毒实例。**最低成本、最高澄清价值。**
2. **给规则/审计加"enforcement 层级"可见性**（横切 P1-01 / P2-hard-rule-6 / rule-sprawl）—— 每条 R/M-rule + 每个 audit 标注"有无自动 gate / 哪个 gate / 是 L1 自律还是 L4 hook"。一次性消除"7 条硬规则同等强""有这个 audit 即被覆盖"的系统性错觉。
3. **统一 onboarding 链路 + 对齐 lazy-load 原则**（P1-06 / P1-07）—— STATUS 与 AGENTS 现在是两套不一致的必读清单，且强制全量 Read（~225KB 非mockup / ~530KB mockup）与仓库自身 lazy-load 原则正面冲突、与"~30min"严重失真。fresh AI 要么真读不完违规、要么默认跳读使 gate 形同虚设。

---

## P1 — 应优先处理

### P1-01 · `AGENTS.md:463` 谎称 D/E/F/G 由 pre-commit hook 兜底（A/B/C/F 四维共识）

实际只有 E（hard-rule）+ H + export-coverage + I 在 pre-commit 条件 gate；**D（canonical-compliance）/ F（render-verification-coverage）/ G（figma-library-vs-canonical）+ 整条 `audit:self-audit-phase2` 不被任何 hook / CI / prepublishOnly 引用**，纯靠 AI 按 Sprint 收尾协议手动跑。

- `AGENTS.md:463` — "机械化执行：D/E/F/G 4 类 audit script 必须 exit 0 才能进 sprint 收尾 commit …（pre-commit hook 兜底，可 --no-verify 绕过）"
- [.husky/pre-commit:91-128](../../../.husky/pre-commit) — 条件 gate 仅 `audit-component-affordances`(H) / `audit-hard-rule-compliance`(E) / `audit-export-coverage` / `audit-icon-canonical-names`(I)
- `package.json:117` — `audit:self-audit-phase2` = D+E+F+G+I，grep `.husky/.github/package.json` 确认**无任何 caller**
- `package.json:50` — prepublishOnly 15 闸不含 D/F/G

> **对抗 verify**：confirmed；severity 从 P0 校准为 **P1**（是文档↔机制不一致 + gate 缺位，不是数据损坏/已发布产物破坏；且有 self-audit-phase2 手动 fallback）。注意 `publish.yml:80` 的 `audit:render-drift-gate` 是**同名近邻但不等于** F 的 `render-verification-coverage`，不构成 F 的兜底。

**建议（接 gate / 补强 二选一，推荐 a）**：(a) 把 D/F/G（或整条 self-audit-phase2）挂进 pre-commit 条件 gate（staged 命中 `src/canonical|components/*.vue` 时跑，与 E/H/I 同模式），使文档声明成真——与 [[feedback_audit-pre-commit-gate]] 一致；(b) 若刻意只靠人工，订正 `AGENTS.md:463` 为"仅 E/H/I/export-coverage 有 pre-commit 兜底；D/F/G 无机制 gate"。

### P1-02 · master 无 server-side gate —— "文档化 ≠ 强制化"的结构性根因

- [.github/workflows/publish.yml:3-10](../../../.github/workflows/publish.yml) — 触发器仅 `push tags 'v*.*.*'` + `workflow_dispatch`；无 `on.push.branches` / `on.pull_request`
- 无 `.husky/pre-push`（`ls .husky` 仅 `pre-commit`）
- `AGENTS.md:154`"master 受分支保护，任何代码改动必须走 PR" 与 `AGENTS.md:272`"Owner 任何改动直 commit master" 并存 → Owner 路径绕过 PR review，唯一兜底是本地 pre-commit（可 `--no-verify` 绕过）

**所有 sprint-self-audit 规则的"机制兜底"承诺都站在一个可绕过的本地 hook 上**。这是 P1-01 及后续多条的同一根因。

> **caveat（保留诚实边界）**：团队真源是 Gitea（`origin`，GitHub 为个人镜像，见 [[reference_gitea-repo]]），Gitea 可能配了 PR-checks 分支保护，本仓库无法 inspect。但因 Owner-direct-master override + admin 绕过是默认路径，"Owner 日常 commit 仅本地 pre-commit 护栏"这一结论不受 Gitea 配置影响。

**建议（重构 / 补强）**：若要让 D/E/F/G/token-contract 真正成为"进 master 前"的 gate，需 server 侧机制（Gitea pr-checks 或 GitHub `on:push` CI）。本地 pre-commit 对 Owner-direct + `--no-verify` 不可靠。

### P1-03 · F 与 G 对同 3 个 canonical 各维护一份独立 exempt 名单 —— latent 分叉

- [scripts/audit-render-verification-coverage.mjs:64-68](../../../scripts/audit-render-verification-coverage.mjs) — `COVERAGE_EXEMPT = SelectBoxBase / InputBoxBase / PillCounter`（2026-06-10 commit `6e57aea8` 新增）
- [scripts/audit-figma-library-vs-canonical.mjs](../../../scripts/audit-figma-library-vs-canonical.mjs) ~:92 — `KNOWN_CANONICAL_NO_MAPPING = InputBoxBase / SelectBoxBase / PillCounter`（pre-existing，同三个）

豁免理由文字几乎一致（composition base / code-first BRIDGE-MOCKUP-003）。owner 2026-06-10 已**手动同步过一次**——正是分叉征兆（恰是 prompt §维度C 点名的"audit 之间矛盾"同类）。

> **对抗 verify**：confidence 0.9，deterministic，未被打破。

**建议（重构去重）**：抽到单一共享模块（如 `figma-data/audit-allowlist/canonical-exempt.json`），F 和 G 同时 import。否则下次增删一个 base wrapper 只改一处 → 两脚本判定分叉。

### P1-04 · STATUS.md Active 块 "Backlog (active) (4)" vs backlog.md 实际 19 条 —— 5x SoT drift 无 gate

- `docs/STATUS.md:85` — `Backlog (active) (4)` 仅列 4 个 ID
- `docs/internal/backlog.md` `## Active` 段实跑 awk：35 个 `###` 中 16 个已闭，**剩 19 条真 active**
- [scripts/audit-status-consistency.mjs:77](../../../scripts/audit-status-consistency.mjs) — C3 只匹配含 `minor|stable|Infrastructure` 的行，`Backlog (active)` 这行连正则都不命中；即便命中也只判 `n>20`，不与 backlog.md 实际条数 cross-check

这正是 prompt §维度D 关注的"version-number 历史冻结 7 版"同类未捕获镜像（blind spot #2 的具体实例）。

**建议（补强 / 接 gate）**：要么把措辞改为 `Backlog headline (4 of ~19)` 明示为精选非全量计数；要么给 `audit-status-consistency` 加 C4：解析 backlog.md `## Active` 段非闭合 `###` 计数与 STATUS `(N)` 比对，drift 即 exit 1。

### P1-05 · 文档站三视图（Design Spec / Status Matrix / Use Cases）是 PROJECT_GOAL 硬契约，却 0 gate + 大面积缺失（非开发受众盲点 #3）

- `docs/PROJECT_GOAL.md:83-87` — §3 文档站"必有结构"明确要求每组件含 Design Spec + Status Matrix + Use Cases（多角色，不止开发视角）
- grep：33 个 `*Page.vue` 中仅 **9 个**用 `StatusMatrix`；仅 **1 页**（FormItemPage）含 "Design Spec" 段；**0 页**含 "Use Cases" 段
- [figma-sync/audit-docs-site-readiness.mjs:31-37](../../../figma-sync/audit-docs-site-readiness.mjs) — `audit:docs-site`（prepublishOnly 第 5 闸）只 `classifySourceType`，**完全不校验三视图存在性**

> **对抗 verify**：confidence 0.92，deterministic。

**建议（补强 / 接 gate）**：要么把 §3 三视图显式降级为"P0 交互组件优先"承认非全量；要么给 `audit:docs-site` 加 manifest 驱动的三视图覆盖检查（每交互组件页 assert StatusMatrix + Use Cases 段）接进 prepublishOnly。延展性风险：缺则每个新组件复制缺口。

### P1-06 · a11y 是 v1.0 DoD 第 (d) 条但零自动化 gate

- `docs/V1_RELEASE_CHECKLIST.md:18` — v1.0 定义 (d) "a11y CI 跑通"
- `package.json:63` `test:a11y`、`package.json:112` `audit:token-contrast` 脚本都在
- grep `.github/workflows/` + `.husky/`：`test:a11y` / `audit:token-contrast` / `playground.a11y` **均无引用**；render-gate job 只跑 render-verification + render-drift-gate

**建议（接 gate）**：把 `test:a11y`（或至少 `audit:token-contrast`）接进 CI render-gate 或新增 a11y job 作 v1.0 publish 前置。否则"a11y CI 跑通"这条 DoD 永远靠人肉手跑。注：43 条 color-contrast 违例是已 track 的 known debt（V1 checklist:69），非新缺陷。

### P1-07 · 两条"起手必读链路"不一致 + 失真（onboarding 作为审计对象）

- `docs/STATUS.md:98` — "step 0–5，共 7 份；总 ~30min"
- `AGENTS.md:112-136` — AGENTS §必读链路是**另一套**（PROJECT_GOAL / PROJECT_MAP / working-principles / 4 个 translation 文件 / retrospection / backlog + mockup §7-10），与 STATUS 7 份清单不同集
- STATUS step4 把整个 "AGENTS §0-10" 塞进"1 份 10min"，但 AGENTS §0-6 就额外拉入 PROJECT_MAP(8KB)+working-principles(11KB)+4 translation(50KB)——STATUS 的 7 份计数完全没体现
- `tracker` = 64KB，STATUS step3a 标 "4min" —— 不现实
- **本审计亲历佐证**：我自己 onboarding 时即撞上"7 vs 6"步数歧义（见 INFO-01）+ 必须分页读 64KB tracker（cap 25000 token）

**建议（重构）**：让 STATUS 链路与 AGENTS 链路成为单一 SoT（其一引用另一，不各列一套）；STATUS step4 如实展开计入份数与时长，或明示"此步递归拉入约 10 份真源"。

### P1-08 · Onboarding Gate 强制全量 Read + 禁 grep，与仓库自身 lazy-load 原则正面冲突

- `docs/STATUS.md:98-103` — "必须按下表顺序读完全部必读项" + 违反信号"grep 替代完整 Read → 错"
- `docs/internal/mockup-conventions.md:10` — "## 🤖 AI 读取指引（**按需加载，避免全量吞**）"；同文件 step9 却被要求全文读（160KB）
- `docs/internal/design-process.md:1016` — "## Lazy Reference Loading"
- 总量：非 mockup ~225KB（含 tracker 64KB + AGENTS 55KB），mockup 再 +~270KB → 与 "7份/30min" 数量级不符；与 [[project_loading-strategy]] / [[feedback_reactive-correction-over-preemptive-rules]] 张力

> **对抗 verify**：confirmed P1 —— 两份真源对**同一文件**给出矛盾指令（全量读 vs 按需读），且无 reconciling clause。gate 要么被例行违反（跳读）要么不可持续，自我消解。

**建议（精简 + 对齐原则）**：Onboarding Gate 分层——核心导航层（FIGMA_SOT/STATUS/PROJECT_GOAL/pickup ~40KB）mandatory full-Read；大体量真源（tracker/AGENTS/mockup-conventions/code-conventions/meta-rules）改"索引必读 + 按任务 section 深读"，与 lazy-load 原则一致。

### P1-09 · `RELEASING.md` 仍写 "10 strict audits"，实际 15 + 漏 render-gate job

- `docs/RELEASING.md:19` / `:107-120` — "10 strict audits" + "All 10 audits are strict gates" 只列 10 条
- `package.json:50` — 实际 prepublishOnly = **15 条**（多 docs-single-theme / token-contract / lint-skills / scripts-stdlib / status-consistency）
- `docs/RELEASING.md:50` — "CI will run … 10 strict audits" stale，且未提 render-gate job（`publish needs [audit-matrix, render-gate]`，`publish.yml:83`）

维护者按此做 pre-release checklist 会漏跑 5 个 gate，误判"本地全绿"——`STATUS.md:39` 实证 v0.7.0 首推 tag 即挂在未列入的 `status-consistency` 上。

**建议（补强）**：RELEASING.md 同步到 15 条 + 增列 render-gate job。

---

## P2 — 应处理但不紧急

### P2-01 · `changeset:version` 全靠手动，CI 不代劳；7 个积压 changeset 为活证据
- `docs/RELEASING.md:73-83` Step 2 要求人工跑 `pnpm changeset:version`；`publish.yml` grep 无 changeset 引用
- `.changeset/` 积压 7 个未消费 `.md`（g1-g4 / popupbox / select-teleport，全 2026-06-10）
- `audit-status-consistency.mjs:31-45` C1b 只比 CHANGELOG 顶 vs package.json，**不校验 git tag 一致、不校验 changeset 已消费**（忘 bump 时两者都停旧值，C1b 反而 pass）
> 对抗 verify：confirmed P2（忘 bump 会被 registry 拒重复版本号，loud-fail 非静默损坏）。**建议**：prepublish 加一条"`.changeset/*.md`（非 config）应为空"检查，或 RELEASING.md 显式标注"tag 前必跑 changeset:version，CI 不代劳"。

### P2-02 · `sync:figma-library` 14-step 无 SIGINT/rollback
- [figma-sync/sync-figma-library.mjs:265-279](../../../figma-sync/sync-figma-library.mjs) — Step 2/2.5/3/4 顺序写 figma-data/，无 `process.on('SIGINT')`/trap；Step 9 count-verify 是事后检测
> 对抗 verify：confirmed，幂等 + 重跑覆盖使其非 P0。注意中断恰在 Step 2-4 时，今日 report（Step 10 才生成）尚不存在，故 pre-commit 的 figma-data 放行信号 B 通常**不会**误放行半成品（比初判更安全）。**建议（doc-only）**：SUMMARY/文档明示"中断后必须完整重跑，勿手 commit 半成品 figma-data"。

### P2-03 · `audit:component-attributes` 完全 unwired 孤儿脚本
- `package.json:91` 定义；grep `.husky/.github/figma-sync/` **0 命中**；只被离线 `triage-component-attribute-findings.mjs` 消费，docs 引用全是历史 baseline
> 对抗 verify：confirmed —— 一次性 designer-figma-binding-drift baseline 工具，命名近似已挂 pre-commit 的 `component-affordances` 但是不同工具。**建议（精简/归档）**：若已被 affordances + figma-vs-sot 覆盖，注释为"manual baseline 非 gate"或删 package.json 入口，消除"有覆盖"错觉。

### P2-04 · 硬规则 #6（canonical SoT）无 enforcement，硬规则表无"层级"列
- `AGENTS.md:147` 硬规则 #6 纯 doc-only（约束 AI 生成时取数源，本质 L1 不可机械化）；对比 #4 有 `no-hardcoded-design-tokens`(prepublishOnly)、#1 有 pre-commit figma-data block
> 对抗 verify：核心成立但略高估 —— `eslint-plugin/rules/no-base-component-import.js:10,38` 显式引用硬规则 #6，对 consumer import-path 有 L4-partial 强制（但 DS 仓不 dogfood，且检不到"新写组件"场景）。**建议**：硬规则表加"enforcement 层级"列，让 #1(L4 partial)/#4(L4 prepublish)/#6(L1) 真实强度可见，杜绝"7 条同等强"错觉。

### P2-05 · 自研 eslint-plugin（G1/G2）不 dogfood 自己的 src
- `package.json:29` exports `./eslint-plugin`；根目录**无** `eslint.config.*`/`.eslintrc*`，scripts 无 `lint` 入口
> 对抗 verify：从 P1 **降级** —— DS 侧 spacing 已由 `audit:no-hardcoded-design-tokens`(prepublishOnly) 覆盖、native-element 由 `audit:canonical-compliance`(手动) 覆盖，**非 dead-enforcement**。残留问题：plugin 规则逻辑本身从未在真实 src 上跑过（untested path）。**建议（补强，低优先）**：DS 加 `eslint.config.js` 用 `tvuPlugin.configs.recommended` lint `src/canonical|components`，挂 pre-commit/prepublishOnly。

### P2-06 · `STATUS.md:33` 安装链接路径错（多一层 `../`）
- `docs/STATUS.md:33` — `[GETTING_STARTED.md](../GETTING_STARTED.md)`，STATUS 在 `docs/`，`../` 解析到 repo root；实际文件在 `docs/GETTING_STARTED.md`
> confirmed 确定性断链，无 link-check gate 覆盖 STATUS.md。**建议（精简）**：改 `./GETTING_STARTED.md`。

### P2-07 · `PROJECT_GOAL.md` 阶段路线块冻结在 v0.6.0（frozen-mirror 复发）
- `docs/PROJECT_GOAL.md:108-127` 标"截至 2026-05-13"止于 v0.6.0；`STATUS.md:26` 已 v0.7.0 shipped
- `AGENTS.md:581` 已对同款 antipattern de-mirror（"曾冻结 ~7 个版本"），**PROJECT_GOAL 漏修**
> confirmed P2（带 dated snapshot 戳 + 指向 tracker，blast radius 低）。**建议（精简）**：照 AGENTS.md:581 范式，把版本进度块换成一句"逐版本进度真源见 STATUS + tracker"。

### P2-08 · 组件状态完整性（empty/loading/error/0数据/超长文本）逐组件随缘
- `PROJECT_GOAL.md:62` QA 受众契约含"状态矩阵(…empty 等)、边界条件"
- `playground/docs/components/StatusMatrix.vue:23-25` 注释明确"只建模 Figma 导出状态，empty/:hover/:focus 从不建模"；TablePage/SelectPage 无 empty/loading/error/skeleton demo
> 对抗 verify：从 P1 **降级** P2 —— 超长文本截断 **已** 被 `mockup-conventions.md` M43 部分规定（但仅 mockup-scoped + 手动 checklist，不覆盖文档站 runtime 态）；empty/loading/error/0数据 确无系统覆盖也无 gate。**建议**：(a) 若只对数据类组件(Table/Select)要求，在 QA 视图 spec 显式 scope；(b) 若系统化，建"组件→必备状态清单" manifest + audit。

### P2-09 · Path A mockup 强制闸 `audit:mockup-conformance`（G4）在 DS 仓纯手动 + skill 收尾未接线
- `package.json:66` npm script；grep `.husky/.github/sync-figma-library.mjs` 0 命中
- `CONSUMER_AUDIT_SETUP.md:181-183` 明示设计上 DS 仓不在 commit 时 gate（**合理**：无 Figma 产物可 commit-time gate）；但 grep `skills/tvu-design-mockup/` 等 **0 命中** conformance 收尾 step
> 对抗 verify：confirmed P2 —— "master gate" 措辞略 overstated（它是 consumer 侧 event-driven gate，已接进 consumer `audit:mockup`），DS 仓 by-design 不 gate。真缺口是 **mockup skill 收尾 checklist 未把"产出后跑 audit:mockup-conformance --file <key>"列为 mandatory**。**建议**：在 mockup skill / pickup 收尾 checklist 显式接线；STATUS/changeset 把"master gate"降级为"手动总闸"表述。

---

## INFO / 文档卫生（低危，可顺手）

- **INFO-01** · onboarding 步数表述打架：`STATUS.md:98`"7 份" vs `AGENTS.md:58`"6-step"（与 P1-07 同源；统一为"7 项 0/1/2/3a/3b/4/5"）。
- **INFO-02** · `working-principles` 实为 **9 条**（原则 0-8），但 `AGENTS.md:115` + `FIGMA_AS_SOURCE_OF_TRUTH.md:120` 仍写"7 条"。
- **INFO-03** · `STATUS.md:6` 仍称 divergences §time/calendar"现已 stale 待 follow-up"，但该 stale **已在** `divergences.md:123` 修复（`Calender→Calendar` closure）—— 这句本身现在是"stale 的 stale-claim"，可删。
- **INFO-04** · `token-contract`(J) 文档声明准确（在 prepublishOnly + sync Step 8.5），但 pre-commit 不跑 → Owner 直 commit `variables.css` primitive drift 要到 release 才暴露。可选：staged 命中 `variables.css` 时跑（hardening，非 bug）。
- **INFO-05** · R-rules 多为 consumer-side L1 AI 行为规则，DS 仓内零机制强制 —— **by design**（触发器 K 明文承认"AI 自我约束 L1 可接受"），文档 Meta-K 层级声明已落地，非缺陷。仅建议 code-conventions.md 顶部一句"R-rules enforcement = L1，consumer 侧机制走 audit:consumer-code"防误读 R8/R12 的 self-declared L3。

---

## §4 · DEPTH-FLAG（硬推理子问题待 owner 拍板）

**无存活项。** 本审计瓶颈是广度+交叉引用而非推理深度，High 档足够；唯一打了 depthFlag 的子项（`E-token-missing-downgrade-asymmetric`，code 侧 audit 无 token-missing ERROR 路径）在对抗 verify 阶段被判定为 **category error**（G4 的"ERROR(could not run)"是 missing-audit-input guard 非 token-missing guard；code 侧无外部数据依赖故无"could not run"语义；`spacing-token-map.js:78 if(!token) continue` 是 FP 纪律而非降级洞）→ **DROP**。故无需 owner 开 Extra High 或起对抗 panel 重做任何子项。

---

## §5 · 对抗 verify 打破 / 降级清单（透明记录，不计入 finding）

| 原 finding | 原级 | 裁决 | 理由 |
|---|---|---|---|
| `agents-master-push-rule-contradiction` | INFO | **DROP** | `AGENTS.md:154` 是 non-Owner baseline，`:272` 显式标 broader override，`:293/:325` 已自洽说明 Owner 经 admin/豁免绕过；非未解矛盾。且"实际无分支保护"误查 GitHub 镜像，未证 Gitea。|
| `r1-merged-into-r15-stale-refs` | INFO | **DROP** | R1 = R15 的 icon 子条款（`code-conventions.md:954-959` 明定），现行引用是设计而非 stale；且所引"规则适用矩阵含 R1 行"经查**事实错误**（该矩阵无 R1 行）。|
| `E-screenshot-input-modality` | P2 | **DROP→INFO** | `code-conventions.md:456` 子场景 1.3"按截图 1:1 实现" + `design-process.md:228-237` Step A Intake Gate"截图…任意组合"已是文档化输入入口；多模态合成被 PROJECT_GOAL:24 显式 scope 为 T3/T4 未来。|
| `E-token-missing-downgrade-asymmetric` | P2(depthFlag) | **DROP** | category error（见 §4）。|
| `E-reverse-code-to-figma-cli-missing` | P2 | **降 INFO** | `CAPABILITY_3_BYPASS.md:67-75` 透明标注"proposed/not yet implemented"，PROJECT_GOAL:24 scope 为未来；machine-readable mapping 完整、对 AI 受众 bypass 已足。|
| `F-rule-audit-sprawl` | P2 | **降 INFO** | M-rule 计数被 stub/迁移锚点灌水约 2x（实际 active ~24 M / ~15 R）；§精简/合并建议已由 `CONVENTIONS-OVERVIEW.md`（umbrella 合并 + 层级 tagging + script→rule→gate 映射）落地。|
| `B-token-contract-pre-commit-gap` | P2 | **降 INFO-04** | J 文档声明准确，prepublishOnly 在发布前已捕，是 defense-in-depth gap 非洞。|
| `E-component-state-completeness` | P1 | **降 P2-08** | 超长文本已被 M43 部分覆盖。|
| `A/B-eslint-plugin-not-dogfooded` | P1/P2 | **降 P2-05** | spacing/native-element 已被其它 DS 侧 audit 覆盖，非 dead-enforcement。|

---

## 附 · 场景覆盖矩阵（维度 E）

| 场景 | 覆盖? | 强制? | 证据 | 缺口 |
|---|---|---|---|---|
| AI 做 mockup (Path A) | yes | doc-only | `mockup-conventions.md:100`+M0/M30/M32 | 强制闸 DS 仓纯手动（P2-09）|
| AI 写产品代码 (Path B) | yes | **gate** | consumer eslint 6 规则 + audit-product-code R1/R2/R15/R16 | DS 仓自身不 dogfood；消费侧要实接线 |
| 改既有 mockup/clone (M46) | yes | doc-only | `mockup-conventions.md:34` M46/M42 | clone 绑定自检纯 doc，靠 AI 起手读 |
| 同步 Figma 库 | yes | **gate** | `sync:figma-library` + prepublishOnly 闸 | self-audit-phase2 不在闸内（P1-01）|
| canonical 保真度修正 | yes | **gate** | `publish.yml:77-80` render-gate | coverage 只验 mapping 存在不验状态 |
| 跨 session 续跑 | yes | doc-only | STATUS 链路 + status-consistency | onboarding 完成度无法 gate（P1-07/08）|
| 能力1 npm 消费 | yes | **gate** | published-vs-code + docs-site + export-coverage | export-coverage 仅 pre-commit 条件 |
| 能力2 Figma URL→code | yes | **gate** | `figma-url-to-canonical.mjs` + figma-conformance | 正向已 ship，无缺口 |
| 能力3 code→Figma | partial | doc-only | `CAPABILITY_3_BYPASS.md:67` | 反向 CLI 未实现（透明标注，INFO）|
| 能力4 多模态 | partial | none | `design-process.md:228` Step A 接受任意组合 | 无单一"多模态合成 pipeline"（scope 为未来）|
| 能力5 溯源 | partial | doc-only | `figma-to-code-mapping.json` 正向可跑 | code→Figma 反查无 CLI，只能手读 manifest |
| 消费接入 + G1-G4 | yes | **gate** | `ds-enforcement-scenarios-spec.md:74` 场景感知 | 要 setup-tvu-consumer 实跑才生效 |
| release / 版本迁移 | yes | **gate** | tag-push CI audit-matrix+render-gate | Packages 实物验证靠人肉（已知）|
| a11y/主题/i18n | partial | doc-only(a11y) | 主题/i18n 在 prepublishOnly | **a11y 有脚本零 gate（P1-06）** |
| 错误恢复/中断/并行 session | partial | doc-only | pickup dirty 协议 + INFRA-F42 | 并行 dirty 无机制锁，纯 doc 约定 |

---

*生成方式：6 维度 reader agent fan-out（Opus High）→ 对每条 uncertain/P0 finding 派对抗 verifier 造反例 → 汇总。完整 agent transcript：本 session workflow `wf_63b441d3-e15`。*
