# DS 自动化体系 —— 架构现状读数（为「瘦身 + 优化」那一轮准备）

> 本文件是 **2026-09-09 下半场对话调研**的落盘物。每一条都注明是**查证过的**还是**推断**。
> ⛔ 别把它当活源 —— 它是一份**导航**，动手前每条都要回原文再核一次
> （本轮我自己就因为「没核就答」错了两次，见 §5）。

---

## 0 一句话

**「自动设计 / 自动检查 / 自动验收」三段都已经有装置并在跑；缺的不是能力，是「有没有牙」和「跑没跑」。**

---

## 1 装置盘点（全部查证过，⛔ 非推断）

### 1.1 流水线：`skills/` 下 11 个 skill

总入口 `tvu-design-pipeline`（`skills/tvu-design-pipeline/SKILL.md`，64 行），唤醒词 `@TVU 设计全流程`。

> 🔴 **2026-09-09 下午更正**：下表「前置」那一行**是错的** —— 当时的 `tvu-design-pipeline/SKILL.md` 流水线表
> **没有**这一行，`grep -i upstream` 在 pipeline / design-qa-loop / design-walkthrough / design-discovery / `.claude/agents/`
> **全部零命中**。upstream-gate 自称「最前置、不可静默跳过」，但没有任何编排文件调它。本文件头部说「全部查证过」，
> 这一行没有 —— 它是从 upstream-gate skill 的自述推断来的。⇒ 已于 DS 同日补进流水线表（见瘦身审查报告 §3.3）。

| # | 阶段 | 调哪个 skill |
|---|---|---|
| ~~前置~~ | ~~上游理解-分析 gate~~（**当时不存在**，09-09 下午补上） | `upstream-gate` |
| 0 | Intake（列完整状态清单） | — |
| 1 | 用户体验地图 | `design-discovery` |
| 2 | IA 验证（F2-early） | `persona-simulation` |
| 3 | 全状态 mockup | `tvu-design-mockup` |
| 4 | UX 交付层 | 同上 |
| 5 | 走查 + 角色测试（F1 + F2-late，**带 auto-fix loop**） | `design-qa-loop` / `design-walkthrough` / `persona-simulation` |
| 6 | PRD + Jira 同步 | — |
| 7 | Handoff Gate | `design-qa-loop` |

其余：`tvu-design-code`（消费仓写代码）· `consumer-product-conventions` · `shared-vocab-rules` ·
`setup-tvu-consumer` · `role-ux` · `role-translator`。

⚠️ 分档（`tvu-design-mockup §6-JIRA.W`）：只有 **W3**（跨 ≥2 页面 / 有前后步骤顺序）走全流程；W1/W2 走单 skill。

### 1.2 agent 层：`.claude/agents/` 已有 2 个

| agent | 建于 | 干什么 | 值得学的设计 |
|---|---|---|---|
| `design-review`（21KB） | 2026-08-25 | Stage 5 的 F1 + F2-late **只读那一半** | **`tools:` 里无 Write/Edit/use_figma ⇒ 结构上改不了它要审的东西**，auto-fix 留主线。这比在 skill 里写「你只审不改」硬一个量级 |
| `affordance-search`（6KB） | 2026-05-18 | 选图标前强制扫库（M35/R13） | 在 code 侧被 `detect-figma-task.sh` 显式点名要 spawn |

### 1.3 hook 层：`.claude/hooks/` 4 个已挂（`settings.json` 现取）

| 事件 | hook | 干什么 | **有牙吗** |
|---|---|---|---|
| SessionStart | `onboarding-checklist.sh` | 起手清单 | — |
| **UserPromptSubmit** | `detect-figma-task.sh`（150 行） | **grep 检测 Figma URL + 关键词 ⇒ 注入一整段强制起手协议** | ❌ 输出 `systemMessage` 后 `exit 0`，**不拦** |
| PostToolUse(`use_figma`) | `post-figma-write.sh` | **那 16 条 mockup 机检跑在这里** | ❌ 逐字 `exit 0`（3 处）、后台跑、结果**下一轮**注入 |
| Stop | `stop-figma-conformance.sh` | 收尾前取回最后一轮机检结果 | 退出码 2 可阻塞。~~「harness 真的触发它并尊重 exit 2」未观测~~ ✅ **2026-09-09 下午已观测**：scratch 项目 + 探针 Stop hook + `claude -p`（Claude Code **2.1.251**）⇒ Stop 触发 2 次、首次 `exit 2` 被尊重（模型按 stderr 续跑回 `PROBE-ACK`）、输入含 `stop_hook_active`（首次 false / 续行 true）。⚠️ 同日发现该 hook 头注释「输入没有 `stop_hook_active`」是错的（docs 也逐字写有），已订正 |

🔴 **关键结论**：**触发判定已经程序化了**（grep，不靠模型自觉），**但「照做」仍然大半靠模型自觉** ——
UserPromptSubmit / PostToolUse 两条 `exit 0`；**唯一有牙的是 Stop**（已观测），且 09-09 下午补了它的一块判定面
（「写了却一次机检没跑」此前静默放行）。

---

## 2 三层架构 —— ⛔ 瘦身前必须先分清这三层

| 层 | 有什么 | 绑不绑工具 | 有没有牙 |
|---|---|---|---|
| **谁在跑** | skill · agent · hook · TodoWrite | **必然绑** —— 每个工具各一套 | 靠自觉 |
| **留下什么** | artifact（`upstream-gate.<feature>.md`）· validator（node 脚本）· report | **不绑** | 看挂在哪 |
| **哪里拦** | git hook · CI（`pr-checks.yml`）· pre-commit | **不绑** | **真牙** |

🔴 **agent 比 skill 更绑工具，⛔ 不是更通用**。实证：`design-review` 的 `tools:` 里把同一批 Figma 工具
**写了两遍**（`mcp__claude_ai_Figma__*` 和 `mcp__plugin_figma_figma__*`），只因 Claude Code 里 Figma MCP
有两种装法。skill 的**内容**是纯 markdown 可以搬走，agent 的 `tools:` 白名单 + `subagent_type` dispatch
在别的工具里**没有对应物**。

⇒ **工具无关性来自第 2、3 层，永远不来自第 1 层。**

---

## 3 🔴 本轮最要紧的读数：upstream-gate 那条链路**零产出**

路线 B（TRIG-03 的推荐主线）要复用的就是它，spec 逐字称其为「**已验证的**双层防假闸范式」。

| 组件 | 状态 |
|---|---|
| `scripts/validate-upstream-gate.mjs`（16KB，2026-09-07 还在改） | ✅ 存在 |
| `scripts/upstream-gate.schema.json` + npm key `audit:upstream-gate` | ✅ |
| 挂 Gitea `.gitea/workflows/pr-checks.yml:409`（**L5 CI**） | ✅ |
| 随包发（`package.json` files 第 70–71 行） | ✅ |
| 消费仓模板 `templates/consumer-product/docs/specs/_upstream-gate.template.md` | ✅ |
| **真实产出的 `upstream-gate.<feature>.md`** | 🔴 **0** |

分母查法（本轮现取，⛔ 别抄结论，重跑）：

```bash
cd ~/Documents/AICoding/VS_Code
for d in MicroApps NOC RPS TPC-Service "TVU Pack" tvu-host-monitor tvu-saas-dashboard tvu-design-system; do
  echo "$d $(find "$d" -name 'upstream-gate.*.md' -not -path '*/node_modules/*' 2>/dev/null | wc -l)"
done
# ⇒ 2026-09-09 现取：8 个仓全部 0
```

实测那条闸此刻的行为：

```
$ pnpm run -s audit:upstream-gate
validate-upstream-gate OK — 未发现 upstream-gate.<feature>.md（非产品设计 PR，no-op PASS）
EXIT=0
```

⇒ **恒绿、零信息。** no-op PASS 的设计本身合理（不是每个 PR 都是设计 PR），
问题是**从来没有一个 PR 让它非 no-op 过** ⇒ 「已验证」那三个字站不住。

⚠️ **这条读数对「瘦身」的含义**：装置齐全 ≠ 在用。瘦身时**先量每个装置的真实产出**，
⛔ 别按「它属于哪一层 / 看起来重不重要」删。

### 3.1 ⛔ 验这条链路**不需要**等一个真需求 —— 这是本轮我立错又撤掉的一个假前提

我当时说「产出第一份 artifact 需要一个真实的产品设计需求，造个假 feature 去填就是
『报警读自己写的值』」。**那个论证过度了**，owner 当场反问后撤回：

- 那条纪律管的是「**判据不能读它自己产生的数据**」；而 validator 校的是 **artifact 的
  结构合法性**（阶段顺序、必填字段、产出引用能不能解析），它**不校**这个 feature 是不是真的。
- **本仓的反例就在手边**：那 16 条 mockup 判据的单测**全部**用合成节点树
  （真 payload 不进 git ⇒ 任何单测都不能断言它们）。**用合成输入验量具，是这个仓一直在做的事。**

⇒ **可以现在就验**：拿一个**已经做完**的历史需求（`V4-2333` LCD 传输测试 / `FB-8926` 竖屏模式
等 payload 里能查到的）按 `_upstream-gate.template.md` **追溯回填**一份，跑 validator。

⚠️ **如实登记的边界（⛔ 两条都要写进那份 artifact 的头部）**：
① 它是**追溯填写**，⛔ 不许声称「这个流程当时真的走过了」；
② 它验的是**量具能不能跑**，⛔ 不是「这条规则被遵守了」。

⚠️ **顺序（owner 2026-09-09 拍）**：**先审查 + 瘦身 DS，再拿真需求跑一次** ——
现在拿真需求跑的是**未优化的**流水线，撞出的问题里有一部分本来就是要删掉的东西；
且「第一次真跑」只有一次机会，留给优化后的版本更值。

---

## 4 TRIG-03 的 DEFER 挂在一个写错对象的前件上

`docs/superpowers/specs/2026-07-17-trig-03-pipeline-orchestration-tool-agnostic-tracking-design.md`（134 行）

- §3 逐字：「**B 为推荐主线**」·「**C 为可选增强**…**无独立价值时不单独做**」·「A 是 B/C 的必要基座」
- §4.3「前提就绪信号」逐字：「**F61 consumer 冒烟 chokepoint + F62 变体 B produce 侧落地后**」

查这两个前件：

| 前件 | 现取状态 |
|---|---|
| F62 变体 B **produce 侧** | `backlog.md` 逐字「**不是待决策而是已接受的结构性缺口**…这是接受的边界」⇒ **永远不到达** |
| F61 consumer 冒烟 | 「**唯一残余，另一量级，建议单独一轮**」，触发条件「启动支柱② consumer 冒烟时」⇒ 未排期 |

🔴 **但那是路线 C 的前件，而推荐主线 B 不依赖它们** —— B 复用的是 upstream-gate（INFRA-F55）那条链路。
⇒ **§4.3 拿 C 的前件 DEFER 了整个 TRIG-03。**
（⚠️ 不过 §3 的读数出来后这条的实际意义变了：B 真正的依赖是那条**零产出**的链路，见 §3。）

**§4.3 还有第二条 DEFER 理由，它属 C2（频次/痛感），只有 owner 能拍**，逐字：

> 当前 owner 单人主力、**主要在 Claude Code 里跑全流程**…缺口只在「同事用 Codex/claude.ai 跑完整
> pipeline」这一**尚未高频发生**的场景才真正咬人

⇒ **owner 2026-09-09 确认这个前提仍成立** ⇒ 工具通用化继续 DEFER，本轮范围收窄到 Claude Code。

---

## 5 ⛔ 给下一轮的四条保护（前两条是本轮真踩的）

### 5.1 「只保留 Claude Code 相关」有两种读法，一种是灾难

| 读法 | 删什么 | 判 |
|---|---|---|
| (a) 删「**为其它 AI 工具准备的适配器/文档**」—— Codex file-prompt · claude.ai Project-Instructions bundle · TRIG-03 那类 DEFERRED 的跨工具 spec | 第 1 层里**别的工具**那几套 | ✅ 合理 |
| (b) 删「**不绑任何工具的机制**」—— git hook · CI gate · validator · artifact 规范 · `templates/consumer-product/.githooks/` | 第 2、3 层 | 🔴 **灾难** |

🔴 **要害**：**最有牙的那些恰恰是「工具无关」的** —— 它们不属于 Claude Code，但 Claude Code 的产出
也要过它们。照 (b) 删 = 把唯一有牙的层删掉，只留下靠自觉的那层。
⇒ **瘦身第一步是给每个待删对象标出它在 §2 三层里的位置**，⛔ 不是按「跨不跨工具」一刀切。

### 5.2 瘦身 ≠ 删除；且删之前先比丰度

本仓已登记 [[dedupe-check-which-copy-is-richer]]：**真源可能是更薄的那份，删副本会删掉唯一存在的规则**。
⇒ 归档（移到 `docs/archive/` + 留指针）优先于删除；真要删，先跑一次「这段内容在别处还有没有」。

### 5.3 装置齐全 ≠ 在用 —— 每个待优化对象先量真实产出

§3 那条 upstream-gate 就是活例子：validator + schema + CI + 模板 + 随包发**全齐**，真实 artifact **0**。
⇒ 判「这个装置该留该改该删」的输入是**它的产出数**，⛔ 不是它的完成度。

### 5.4 🔴 ⛔ 别照本文件的字面动手 —— 我自己本轮就因此错了两次

| # | 错 | 根因 |
|---|---|---|
| 1 | 推荐「路线 C」，而 spec 逐字写 C「无独立价值时不单独做」、**B 才是主线** | 那份 spec **只有 134 行**，我 grep 了目录结构却**没读 §3** |
| 2 | 断言「自动设计一点没碰、自动验收没开始」 | **只需要 `ls skills/`** 就能看到 11 个 skill；我拿自己几轮的工作范围推断了整个体系 |

⇒ 两次的信息**都在手边、都没去拿**。而本轮做对的每一条（§3 的零产出 · §4 的前件 · 「296 不是分母」）
**靠的都是去量**。
⇒ **同一个模型，查了就对、没查就错。** 这条对下一轮同样成立，与用哪个模型无关。

---

## 6 ⛔ 这份文件不能说的话

- ⛔ 不许说「三段都做完了」—— 说的是**都有装置**，而牙的分布极不均匀（§1.3）。
- ⛔ 不许说「upstream-gate 链路是坏的」—— 它没坏，是**没人用过**。两者的修法完全不同。
- ⛔ 不许说「agent 化没价值」—— 它买干净 context、买结构性能力剥夺（`design-review` 那个 `tools:` 设计）、
  买并行；它买不到的只是**工具无关**。
- ⛔ 不许拿 §1 那张表当活源去动手 —— 每个 skill 的真实内容要回 `SKILL.md` 读。
- ⛔ 不许说「那 16 条机检没用」—— 它们判据都有造故障两侧证据，问题在**挂载点**，不在判据。
