# Execution-First Mockup Authoring + Review Discipline — 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.
>
> **Supersedes** [`2026-06-12-rule-registry-p1.md`](./2026-06-12-rule-registry-p1.md) — owner reframe 2026-06-12「重要的是如何做，不是如何约定」否决了"建注册表让 AI 查"，改为执行优先（把检查内嵌进执行器一跑全跑）。registry 若留最多是配角，本计划不建它。

**Goal:** 让"按 TVU 流程做/审 mockup"真正跑全——把分散在文档里、AI 靠记忆触发（"很少遵守"）的规则，内嵌进**做这件事的执行器**（authoring 预防 + review 检测），能机检的上 gate；并加一层 task-execution 路由让小/大/不同类型任务确定性定位 scope。

---

## ⚠️ 2026-06-15 Triage & Disposition（authoring 侧收口）— 本表为权威状态，下方各 Step 的 `- [ ]` 原文保留作历史轨迹

> 起手实查（非信 checkbox）：W1/W3/W5/W6 + W2-Step3 已随 0.10.x 段 shipped；W2-Step1/2/4 与 W4 三件按 triage 纪律逐项判"仍需 vs 已覆盖"。结论：**净真缺口仅 1（R-A5 机检 substance）+ 1 薄改善（R-A1 显著性）+ 1 owner live 实查补的真缺口（hook 错路由）**；R-A2/R-A4 + W4 文档/onboarding 档为 superseded（重造会犯反模式 #7 + 触发器 J 查重）。

| 项 | 状态 | 证据 / 落点 |
|---|---|---|
| **W1** binding-source-map 实查 | ✅ SHIPPED (2026-06-12) | `figma-data/normalized/binding-source-map.json`（25KB，4 原语 + 语义色） |
| **W2-Step1 R-A1** catalog-driven 发现 | ✅ 收口（substance 已覆盖 + SKILL 显著性指针 added） | substance 真源：meta 反模式 #6 + mockup-conventions §组件取数优先级(L79/84/90) + §库归属验证(L92-95) + M49.1(L2331)；本轮在 `skills/tvu-design-mockup/SKILL.md` step 4 加"读发布目录全集/禁扫在用集"指针（指路非复述） |
| **W2-Step2 R-A2** token-first 四原语 | 🔁 SUPERSEDED | M49.1(L2329-2335) 四原语全覆盖 + `binding-source-map.json` 真源 + D16 `audit-mockup-binding-fidelity` 机检(B-SEM/TYPO/EFFECT/SCALE) + C5；"originate vs 事后吸附"end-state 已被 D16 gate，另立 section = 复制 M49.1（触发器 J 命中） |
| **W2-Step3 R-A3** §C5 语义色优先 | ✅ SHIPPED (2026-06-12) | mockup-conventions §C5 (L379-394) + D16 B-SEM |
| **W2-Step4 R-A4** 越界处理 | 🔁 SUPERSEDED | ① off-scale→吸附+不自动扩库 = M49.1 L2333 原话；② 可复用模块→提案 owner = M6(design-process L838-847)+M36；"永不静默改库" = AGENTS §Figma 库 master 契约(L476-493)+硬规则#1+figma-write-scope |
| **W2-Step5 R-A5** 复用 substance | ✅ DONE（机检缺口已补） | M0 表 substance 已有 catalog 索引列 + 人工 gate；本轮升级 `scripts/design-kickoff.mjs` §9 `--check` 从"≥1 行非空"(form)→**每行须有 source+catalog-verified evidence**(substance, `component-mapping-unverified`) + `tests/design-kickoff-component-mapping.test.ts`(6 cases) |
| **W3** review 三轴 + §0 ledger | ✅ SHIPPED (2026-06-12/15) | design-walkthrough §5.7/§5.8/§0 Axis Ledger + D16 + `visual-quality-dimensions-2026-06-12.md`；stale path 已清 |
| **W4-Step1** task-execution-routing.md | 🔁 SUPERSEDED（勿建文档）| classify→route 已在 design-process US-N 决策树(L84-94)+code-conventions 场景1-4(L429-432)+skill triggers；新建 routing 文档 = 被 owner 否决的 rule-registry 同型"关于约定的约定" |
| **W4-NEW** detect-figma-task hook 错路由修复 | ✅ DONE（owner 2026-06-15 live 实查补）| `.claude/hooks/detect-figma-task.sh` 按方向 classify：mockup-write 信号→注入 Mockup Write Gate 协议（tvu-design-mockup + 4 步前置，L1 自律升 hook-injected）；code 信号→原 code 协议不动；真源单一复用 AGENTS §Mockup Write Gate。7 路由场景验证通过 |
| **W4-Step2** onboarding 外科手术档 tier | 🔁 SUPERSEDED/DEFER | 渐进加载已由 US-5.S/US-5 微改路径(design-process L73-97)+两层 L-core/L-ref 提供；加第三档有"误判 surgical 漏加载"风险（gate 存在的理由）+ 与 2026-06-10 两层化简化相悖 |
| **W4-Step3** 各 skill scope-locator | 🔁 SUPERSEDED (2026-06-15 owner 拍) | scope 已由 skill §适用场景 + conventions §作用域 + US-N/场景表定位；它防的"改漏孪生文件"已被 pre-commit audit（component-affordances / figma-library-vs-canonical / render-verification-coverage / docs-site）**非 silent 兜底**。按 [[feedback_reactive-correction-over-preemptive-rules]]「prevention 规则只为 silent+重复 失败而设」→ 不补；token 增量可忽略但会摊薄起手注意力 + 踩反模式 #7「加了不用」。owner 撞到 audit 未覆盖的孪生缺口（如忘加 test）时再精准补单点 |
| **W5** 反模式 #6 #7 + invariant | ✅ SHIPPED (2026-06-12) | meta-rules 反模式 #6(L54)/#7(L55) + 触发器 F 7 条(L239-240) |
| **W6** D16 机检 verifier | ✅ SHIPPED (2026-06-12) | `scripts/audit-mockup-binding-fidelity.mjs` + `tests/mockup-binding-fidelity.test.ts`(8) + 接 `audit:mockup-conformance` |

**Architecture:** 三层执行器 + 一条贯穿原则。① **authoring 执行器**（`tvu-design-mockup` skill + `mockup-conventions`）= 预防层，从源头不产生问题（catalog 驱动发现 / token-first 四原语绑定 / 语义色优先 / 复用分析强制）。② **review 执行器**（`skills/design-walkthrough`）= 检测兜底，三轴 comprehensive 但 scope-gated。③ **task-execution 路由**（classify→route→scope-locate）= 决定每个任务加载多少。真源层级：Figma 发布库 = SoT，mockup 服从它，AI 永不静默改库（但反复复用的通用模块要提案给 owner 判断）。

**Tech Stack:** Markdown skill/convention 编辑为主；Node ESM zero-dep（受 `audit:scripts-stdlib` 约束）+ vitest 用于 #6 verifier；Figma MCP（`get_variable_defs` / `search_design_system` / `get_libraries` / `use_figma`）用于 #1 实查 + #6 live 验证。

---

## 贯穿原则（spine）+ 本计划解决的"母题"

本 session 反复撞到同一根因：**规则写在文档里，但做这件事的执行器不强制跑它 → 很少遵守**（invariant：写了 ≠ 执行；"加了不用 = 没做"）。活样本：
- D1-D15 一致性尺子加进了 system-review prompt，**没接进** per-mockup F1 走查。
- M0/M6/M48/M50 复用分析机制齐全，gate 却只查 packet **form** 不查 **substance**，且分析本身用"扫在用集/凭印象"（enumerate-from-usage）→ State Pill 自画类复发。
- token 绑定只 color 有纪律；typography/effect 是 Style 不是 Variable，执行器无协议 → "找不到"假阴性；颜色绑 Grey 原语而非语义色。

**正解**：检查内嵌进执行器（一跑全跑）+ 能机检上 gate + 资源发现一律读发布 catalog（不扫在用集）+ 双向核对每个维度真被执行器消费。

---

## File Structure

| 文件 | 职责 | 动作 |
|---|---|---|
| `figma-data/normalized/binding-source-map.json` | #1 产出：4 原语 + 语义色的发布 catalog 真值（名/key/可绑性），喂 authoring + review | Create |
| `skills/tvu-design-mockup/SKILL.md` | authoring 执行器：起手协议加 catalog-driven 发现 + 四原语绑定 + 语义色优先 + 复用分析强制 | Modify |
| `docs/internal/mockup-conventions.md` | refine M-COLOR C1（语义优先）+ M0/M6（catalog 驱动 + substance）+ 新增 R-A1 反模式锚点 | Modify |
| `skills/design-walkthrough/SKILL.md` | review 执行器：三轴 comprehensive（A 一致性 + B 视觉质量 + C 既有 6 section），scope-gated | Modify |
| `docs/internal/design-process.md` | 修 stale 路径（`~/.claude/agents/design-walkthrough.md` → skill）+ 走查档位/路由指针 | Modify |
| `docs/internal/visual-quality-dimensions-2026-06-12.md` | B 轴 7 维尺子（外锚 Tufte/Gestalt/Material），review 引用 | Create |
| `docs/internal/task-execution-routing.md` | classify→route→scope-locate 框架 + 各执行器 scope 定位法 | Create |
| `.claude/hooks/onboarding-checklist.sh` + STATUS/AGENTS | onboarding 加 tier 分支（外科手术档） | Modify |
| `docs/meta-rules.md` | 新反模式：enumerate-from-usage ≠ enumerate-from-published-catalog | Modify |
| `scripts/audit-mockup-binding-fidelity.mjs` | #6 D16 机检 verifier（live Figma `boundVariables`/`styleId`/on-scale/semantic-first） | Create |
| `tests/mockup-binding-fidelity.test.ts` | #6 verifier 纯函数测试 | Create |

---

## Workstream 1 — Discovery：live catalog 实查（前置，喂后续真名） — ✅ SHIPPED (2026-06-12)

**Why first:** R-A1~A4 + D16 都要引用 Figma 发布目录的**真实**名/key/可绑性。本步一次实查产出 `binding-source-map.json`，兑现前面欠的 live-verify，且**不拿提取产物反推 Figma 结构**（[[feedback_extract-output-not-figma-truth]]）。

**Files:** Create `figma-data/normalized/binding-source-map.json`

- [ ] **Step 1: 取库 fileKey**

Run: `grep -o 'FIGMA_FILE_KEY=.*' .env | head -1`（仅取 key 字符串，不打印 token）
Expected: 拿到发布库 fileKey。

- [ ] **Step 2: 实查发布目录（建议派 subagent，输出大）**

用 Figma MCP 对库文件查并**只回报结构化结论**：
1. **语义色集**：是否有 `Color Type/Text|Icon|Background|Line/*` 变量集？逐条列 name → 解析值 → 对应 code token（`--text-*`/`--icon-*`/`--bg-*`/`--line-*`）。
2. **Grey 原语集**：`UX/Grey/grey-N`（fallback 层）逐条。
3. **Number Variables**：spacing/radius/size 是否为**可绑定** Number Variable（`tvu design system.spacing.*` / `basic size.*`）？列 name + id。
4. **Text Styles**：7 个 `Roboto/NN ...`，每个能否 `importByKeyAsync`（取 key）。
5. **Effect Styles**：`L1/L2/L3 shadow` 等，取 key。

Expected: 每类回报 {figmaName, value/已绑, code-token, key/id, bindable?}。

- [ ] **Step 3: 写 `binding-source-map.json`**

结构：`{ semanticColors:{text:[...],icon:[...],background:[...],line:[...]}, greyPrimitives:[...], numberVars:{spacing:[...],radius:[...]}, textStyles:[{name,key,canonicalToken}], effectStyles:[{name,key,canonicalToken}], _meta:{verifiedAt,fileKey,method:"published-catalog-read"} }`。每条带 `bindApi`（`boundVariable` / `setTextStyleIdAsync` / `setEffectStyleIdAsync`）。

- [ ] **Step 4: 校验 JSON 合法 + Commit**

Run: `node -e "JSON.parse(require('fs').readFileSync('figma-data/normalized/binding-source-map.json','utf8'));console.log('valid')"`
Expected: `valid`
```bash
git add figma-data/normalized/binding-source-map.json
git commit -m "feat(figma-data): binding-source-map from published catalog (4 primitives + semantic colors)"
```

> ⚠️ 决断点（实查后回报 owner）：若 #1 发现 spacing/radius **不是**可绑 Number Variable（只是文档 scale）→ R-A2 间距修法从"绑变量"降级为"用 on-scale 裸值 + 标注"，需 owner 确认。

---

## Workstream 2 — Authoring 执行器（预防层，真 payload） — ✅ 收口 (Step1 指针 + Step3/C5 shipped；Step2/4 SUPERSEDED；Step5 机检 substance DONE 2026-06-15)

**Files:** Modify `skills/tvu-design-mockup/SKILL.md` 起手协议；Modify `docs/internal/mockup-conventions.md`（M-COLOR C1 / M0 / M6）

- [ ] **Step 1: R-A1 catalog-driven 资源发现（治 enumerate-from-usage）**

在 `tvu-design-mockup` SKILL.md 起手协议「catalog 轻索引」段后加硬约束：
> **资源发现一律读发布目录（`binding-source-map.json` + `figma-component-catalog.md` + 产品文件 Local Components section 的发布列表），禁"扫当前文件在用集 / 凭印象"**。原因：usage-scoped 枚举结构上漏掉"已发布未使用"的资产（实证：20/24 Text Style、既存 State Pill）。

Verify: `grep -n "发布目录\|enumerate-from-usage\|在用集" skills/tvu-design-mockup/SKILL.md` → 命中。

- [ ] **Step 2: R-A2 token-first 四原语绑定（预防，非事后吸附）**

mockup-conventions 加一节「自建件属性 token-first 四原语」：建节点时**起手即从档位/Style 取值**，按原语用对 API：
| 原语 | 来源 | API |
|---|---|---|
| 颜色 | 语义色集（见 R-A3）→ Grey fallback | `setBoundVariable` |
| 间距/圆角/尺寸 | scale 档位（`binding-source-map.numberVars`） | `setBoundVariable`（或 #1 降级则 on-scale 裸值 + 标注） |
| 字体 | Text Style（`binding-source-map.textStyles`） | `importByKeyAsync` → `setTextStyleIdAsync` |
| 阴影 | Effect Style（`binding-source-map.effectStyles`） | `importByKeyAsync` → `setEffectStyleIdAsync` |
**禁 originate 裸数值再吸附**（吸附是事后补救，预防优先）。

- [ ] **Step 3: R-A3 语义色优先（refine M-COLOR C1）**

mockup-conventions §M-COLOR C1 现仅"绑 Color Variable vs 裸 hex"。追加：
> **按元素角色绑语义色**：文字→`Color Type/Text/*`(`--text-*`)、图标→`Icon/*`(`--icon-*`)、背景→`Background/*`(`--bg-*`)、线→`Line/*`(`--line-*`)。**Grey 原语 `UX/Grey/grey-N`(`--color-grey-N`) 仅 fallback**（语义集无对应角色时）。绑原语 = 丢语义 + 角色 mapping 变不跟随（语义色与 grey 同 hex，绑错"看起来对"）。

Verify: `grep -n "语义色\|Color Type/Text\|仅 fallback" docs/internal/mockup-conventions.md` → 命中。

- [ ] **Step 4: R-A4 越界处理（纠正"永不扩库"）**

mockup-conventions 加：
> **mockup 服从库 scale，AI 永不静默改库。** 区分：① **任意 off-scale 单值** → 吸附最近档位 + 标 delta（先对发布 catalog 复核非假阴性）。② **反复复用、可能跨产品通用的模块/pattern** → 走 M6：标记 + **提案交 owner 判断**是否入库（不实做、不静默扩库）。

- [ ] **Step 5: 复用分析强制 substance（M0/M6，owner 最新点）**

修 `mockup-conventions` §M0 + `design-process` §M6 + `design:kickoff` packet 要求：M0 element→component 映射表**每行必须**含「候选既有组件（来自发布 catalog 查证，非印象）+ 命中/缺件证据」；结构相似且跨 frame 重复 ≥N 的模块**必须**进 M6 reuse-proposal。`design:kickoff --check` 从查"packet 存在/填了"升级为查"每个 element 有 catalog-查证的复用判定"（substance，非 form）。

> 实证锚：2026-05-20 State Pill 自画（"起手没扫 Local Components 凭印象自画"）+ 2026-05-14 跳 M0 → 4 违例。

- [ ] **Step 6: Gates + Commit**

Run: `pnpm audit:mockup-conformance --file <fileKey>`（聚合 mockup audit 不回归）+ `grep` 双向核对每条 R-A 在 skill/conventions 真落字。
```bash
git add skills/tvu-design-mockup/SKILL.md docs/internal/mockup-conventions.md docs/internal/design-process.md
git commit -m "feat(authoring): catalog-driven discovery + token-first 4-primitive binding + semantic-color-first + substantive reuse gate"
```

---

## Workstream 3 — Review 执行器（检测兜底） — ✅ SHIPPED (2026-06-12/15)

**Files:** Modify `skills/design-walkthrough/SKILL.md`；Create `docs/internal/visual-quality-dimensions-2026-06-12.md`；Modify `docs/internal/design-process.md`（修 stale 路径）

- [ ] **Step 1: 修 stale 路径**

`design-process.md` L43/L66 的 `~/.claude/agents/design-walkthrough.md`（不存在）→ `skills/design-walkthrough/SKILL.md`。
Verify: `grep -rn "agents/design-walkthrough" docs/internal/design-process.md` → 0 命中。

- [ ] **Step 2: Create B 轴视觉质量尺子**

`visual-quality-dimensions-2026-06-12.md`：7 维各写**可测判定句**（非"保持层级"病句）+ 外锚：B1 视觉层级 / B2 信息密度(Tufte data-ink) / B3 强调预算(≤1 语义色行+≤2 灰 hint+1 CTA，BM-1047 雏形) / B4 视觉权重平衡 / B5 留白节奏(Gestalt proximity) / B6 可扫描(F/Z) / B7 渐进披露。

- [ ] **Step 3: design-walkthrough 加三轴 section（scope-gated）**

在现有 6 section 后加：**轴 A 一致性**（D1 跨变体[已有 M-VARIANT-CONSISTENCY 强化] / D2 跨组件[已有 M-IA-ONE-HOME] / D6 a11y / D9 运行态 / D13 主题对等 / **D16 token-binding 保真**：查 `boundVariables` 语义优先 + `styleId` + on-scale）；**轴 B** 引用 #3-Step2 七维。Step 0 page-type 仍 gate 哪些维度 fire（外科手术档触发极小子集）。

- [ ] **Step 4: invariant 双向核对 + Commit**

Verify: `grep -nE "D1|D2|D6|D9|D13|D16|B1|B7|visual-quality" skills/design-walkthrough/SKILL.md` → 每维真在执行器正文（不只声明）。用一张样本 mockup 跑走查确认新 section 真 fire。
```bash
git add skills/design-walkthrough/SKILL.md docs/internal/visual-quality-dimensions-2026-06-12.md docs/internal/design-process.md
git commit -m "feat(review): comprehensive 3-axis walkthrough (consistency+visual-quality+existing), scope-gated; fix stale path"
```

---

## Workstream 4 — Task-execution 路由层（classify→route→scope-locate） — 🔁 文档/onboarding 档 SUPERSEDED；实 route 修在 hook（2026-06-15 detect-figma-task.sh 错路由 DONE）

**Files:** Create `docs/internal/task-execution-routing.md`；Modify `.claude/hooks/onboarding-checklist.sh` + STATUS/AGENTS 指针；各 skill 加 scope-locator 声明

- [ ] **Step 1: Create 路由框架文档**

`task-execution-routing.md`：① classify（design-process 决策树 US-N + code-conventions 场景 1-4 + 外科手术档判定 → `{type,tier}`）；② route（skill trigger = 路由表，列各 task→skill）；③ scope-locate（每执行器的文件定位法：组件改=`src/components/X/`+`canonical/X.vue`+`tests/X.test.ts`+`figma-to-code-mapping.json` 里 X node；docs 改=该页+`site-review-manifest.json`；链接分析=拉链接、不碰 repo）。附 task→classify→scope→flow→onboarding 表。

- [ ] **Step 2: onboarding gate 加 tier 分支（外科手术档）**

`onboarding-checklist.sh` + STATUS §起手必读链路 + AGENTS §Onboarding Gate：加第三档「有界小改（命名产物）→ 精准加载该产物 § + 触发的微规则，跳 status/roadmap/goal」。precise ≠ 零加载（affordance/几何微规则仍读）。

- [ ] **Step 3: 各执行器 skill 声明 scope-locator**

`tvu-design-code` / `tvu-design-mockup` / `design-discovery` / `design-walkthrough` 各加一句"我的 scope 怎么定位"（治"不读全项目时不知道改哪些"）。

- [ ] **Step 4: Commit**
```bash
git add docs/internal/task-execution-routing.md .claude/hooks/onboarding-checklist.sh docs/STATUS.md AGENTS.md skills/*/SKILL.md
git commit -m "feat(routing): task-execution routing (classify→route→scope-locate) + surgical-edit onboarding tier"
```

---

## Workstream 5 — 反模式固化 + invariant 协议 — ✅ SHIPPED (2026-06-12)

**Files:** Modify `docs/meta-rules.md`

- [ ] **Step 1: 加反模式**

> **enumerate-from-usage ≠ enumerate-from-published-catalog**：凡从"工作文件里已出现的东西"建可用资源清单，必漏"已发布未使用"的资产（实证：20/24 Text Style、State Pill）。资源发现一律拉发布 catalog。（[[feedback_name-search-absent-fallacy]] 的可测子型）

- [ ] **Step 2: 加 invariant 双向核对协议**

> 任何"该检查的维度/该用的资源"必须**双向核对**真被执行器加载/跑——不只声明端有，还要消费端（agent/gate/skill 正文）确实 load。"加了不用 = 没做"。

- [ ] **Step 3: Commit**
```bash
git add docs/meta-rules.md
git commit -m "docs(meta-rules): enumerate-from-catalog anti-pattern + invariant bidirectional-consumption protocol"
```

---

## Workstream 6 — D16 机检 verifier（治本 follow-on，最重） — ✅ SHIPPED (2026-06-12)

**Files:** Create `scripts/audit-mockup-binding-fidelity.mjs`；Create `tests/mockup-binding-fidelity.test.ts`

- [ ] **Step 1: 写失败测试（纯函数 `classifyBindingViolations`）**

输入 node 列表（带 `boundVariables`/`textStyleId`/`effectStyleId`/raw 值 + 角色），输出违规：raw 颜色未绑 / 绑 grey 原语而非语义角色 / raw 字体未套 Text Style / raw 阴影未套 Effect Style / off-scale 间距。断言各类被抓。

- [ ] **Step 2: 跑测试确认失败** — Run: `pnpm vitest run tests/mockup-binding-fidelity.test.ts` Expected: FAIL（函数未定义）

- [ ] **Step 3: 实现 verifier** — `classifyBindingViolations` 纯函数 export + live Figma CLI runner（`--file <key>`，读 `binding-source-map.json` 比对）。

- [ ] **Step 4: 跑测试确认通过 + live smoke** — Run: `pnpm vitest run ...` Expected: PASS；`node scripts/audit-mockup-binding-fidelity.mjs --file <key>` 对一张样本跑通。

- [ ] **Step 5: 接进 `audit:mockup-conformance` + Commit**

---

## 依次优化顺序

**1 (discovery) → 2 (authoring 预防, 真 payload) → 3 (review 兜底) → 4 (routing) → 5 (反模式) → 6 (verifier 治本)**。预防优先把 #2 作为重心；#1 是其廉价前置；#3 检测层依赖 #2 知道查什么。#2/#3/#4/#6 各自独立可交付。

---

## Self-Review

- **Spec coverage**：执行优先决断→全计划基调；三轴 review→#3；D16/token 绑定（Variables vs Styles + 语义优先 + catalog 发现）→#1+#2+#6；R-A4 纠正（提案非永不扩库）→#2 Step4；复用分析 substance（M0/M6 owner 最新点）→#2 Step5；task 路由（小/大/类型）+外科手术档→#4；反模式+invariant→#5。✓
- **Placeholder scan**：#1 实查后才能填的真名/key 已显式标为数据依赖（非 placeholder，是正确时序）；`<fileKey>`/`<key>`/N 为运行期参数。
- **Type consistency**：`binding-source-map.json` 结构在 #1 定义、#2/#6 消费；`classifyBindingViolations` 在 #6 内自洽。
- **风险点**：#1 若证 spacing 不可绑 → #2 Step2 间距修法降级（已标决断点回报 owner）；编辑随 `tvu` plugin 发的共享 skill → 每个 commit 前给 diff 等 owner ack（标准闭环）。
