# Codex Prompt: Phase 6.3.5 — Canonical 层反向 audit（read-only 报告）

Phase 6.3 已收口 Notification 的 `success` status 和 legacy `type` 轴这两项"自创未登记"。Phase 6.3.5 做**反向全量审计**：对 `src/canonical/*.vue` 里的每一个 prop / prop 枚举值，验证它要么对得上 Figma 原始属性，要么已在登记体系中（`prop-aliases.md` / `divergences.md` / `runtime-additions.md`），否则标为"未登记"。

**本任务严格 read-only**——只产出报告文件，不修改任何 .vue / .ts / .md / .json 源码。修复方案由主 Session 接到报告后另行决定。

---

## 必读前置

1. `docs/working-principles.md`（**重点是原则 0 和原则 6**）
2. `src/design-system/translation/prop-aliases.md`（已登记的 alias 表，41 行级别）
3. `src/design-system/translation/divergences.md`（组件级映射 + 设计态属性 + 已确认的非映射）
4. `docs/internal/runtime-additions.md`（Phase 6.4 待实现的运行时能力清单）
5. `figma-data/normalized/canonical-components.json`（Figma 侧 canonical spec，properties / variants 真源）
6. `figma-data/normalized/components.manifest.json`（Figma component set 清单与映射）
7. `docs/conformance-issue-log.md` [001]–[046]（历史台账，避免把已确认的非映射当成 bug）

---

## 审计输入

被审目录：`src/canonical/`

29 个 .vue 文件 + `index.ts` + `generated/` 子目录。

**审计范围**：
- 仅审 `src/canonical/*.vue` 文件本体（不进 `generated/`，generated skeleton 由 `generated-skeleton-promotion-plan.md` 单独管）
- 不审 ButtonBridge.vue（已是 non-public draft，单独样板链路）

也就是实际审 28 个 canonical 组件（剔除 `ButtonBridge.vue`）。

---

## 任务 1：逐组件提取 props 与 emits

对每个 canonical .vue 文件，提取：

1. **Props**（来自 `defineProps<{...}>` 或 `defineProps({...})`）
   - prop 名
   - prop 类型（typescript 类型 / Vue 类型）
   - prop 默认值（来自 `withDefaults`）
   - 如果是字面量联合类型（如 `'default' | 'error' | 'disable'`），把每个枚举值都列出来

2. **Emits**（来自 `defineEmits<{...}>` 或 `defineEmits([...])`）
   - emit 名
   - emit 参数（如有类型）

3. **Component 名**（文件名去 `.vue`）

输出格式为机器可读 JSON 中间产物（写到 `figma-data/normalized/canonical-component-api.json`，本任务唯一允许新增的非文档产物）：

```json
{
  "extractedAt": "ISO 时间戳",
  "components": [
    {
      "componentName": "Notification",
      "filePath": "src/canonical/Notification.vue",
      "props": [
        {
          "name": "status",
          "type": "'default' | 'error' | 'success' | 'warning'",
          "enumValues": ["default", "error", "success", "warning"],
          "default": "'default'"
        }
      ],
      "emits": [
        { "name": "close", "args": [] }
      ]
    }
  ]
}
```

---

## 任务 2：对每个 prop / 枚举值做四向匹配

对任务 1 提取出的每个 prop（含每个枚举值），按下面顺序判定其登记状态：

### 类别 A — Figma 直接匹配（exact-match）

- 在 `figma-data/normalized/canonical-components.json` 找到同名组件
- 该组件的 `properties` 里有同名属性（大小写、空格差也算 alias，**不算 exact**）
- 枚举值在 Figma 属性的 `values` 列表中

→ 标 `A: figma-exact`

### 类别 B — 已登记 alias

- prop 名或枚举值出现在 `prop-aliases.md` 表格中
- 状态是 `approved alias` 或 `exact match`

→ 标 `B: alias-registered`

### 类别 C — 已登记 divergence

- prop 在 `divergences.md` 里被显式说明（设计态不映射 / 组件级聚合 / 命名差等）
- 包括"已确认并接受"的历史决议

→ 标 `C: divergence-registered`，注明出处段落

### 类别 D — 已登记为 Phase 6.4 运行时新增

- prop 在 `runtime-additions.md` 出现（`Input.showCount` / `Select.multiple` / `Select.editable` / `Input.XL` 这类）

→ 标 `D: planned-runtime-addition`

### 类别 E — 未登记（**这是本次 audit 的目标产物**）

- A / B / C / D 都不命中

→ 标 `E: UNREGISTERED`

对类别 E 进一步给出**初步分类建议**（仅建议，不修复）：

- `E1: likely-vue-idiom` — Vue 生态约定（如 `modelValue` / `v-model:xxx` / `disabled` 通用），建议补登记到 `prop-aliases.md`
- `E2: likely-figma-axis-rename` — Figma 有同概念但命名不同，建议补 alias
- `E3: likely-design-only` — 看起来是设计态（单值或装饰开关），建议补 divergences 说明
- `E4: likely-invented` — 既不是 Figma 概念也不是 Vue 约定，**疑似自创**（Phase 6.3 收口的同类）
- `E5: needs-human-judgment` — 信息不足，需要人工判定

---

## 任务 3：写报告 `docs/internal/phase-6.3.5-reverse-audit-report.md`

格式：

```markdown
# Phase 6.3.5 Canonical 反向 Audit 报告

跑时间：YYYY-MM-DD HH:MM:SS

## Summary

| 类别 | 说明 | 数量 |
|---|---|---|
| A: figma-exact | Figma 属性同名同值 | N |
| B: alias-registered | 已登记 prop-aliases | N |
| C: divergence-registered | 已登记 divergences | N |
| D: planned-runtime-addition | runtime-additions 已规划 | N |
| **E: UNREGISTERED** | **未登记，本轮目标** | **N** |

类别 E 子类分布：

| 子类 | 数量 |
|---|---|
| E1 likely-vue-idiom | N |
| E2 likely-figma-axis-rename | N |
| E3 likely-design-only | N |
| E4 likely-invented | N |
| E5 needs-human-judgment | N |

## E 类未登记项明细（重点）

按组件分组，每项给出：组件 / prop 或枚举值 / 子类 / 推荐处置 / 证据（在 Figma JSON 哪里找过、为什么没找到）。

### Component: <ComponentName>

- **prop `xxx`** 类型 `'a' | 'b'`
  - 子类：E4 likely-invented
  - 推荐处置：复核是否进 6.3 同类清理
  - 证据：Figma `canonical-components.json` 中 `<ComponentName>.properties` 无同名/同义属性；prop-aliases.md / divergences.md / runtime-additions.md 也未登记
- **prop value `xxx` of `status`** 
  - 子类：E2 likely-figma-axis-rename
  - 推荐处置：登记 alias
  - 证据：Figma 同 prop 有值 `xxx-renamed`，疑似命名差

（依此类推）

## A / B / C / D 类摘要

不必逐项列，**给出每类的统计与典型样例 3–5 条**即可，让报告聚焦在 E 类。

## 异常项（如有）

- 无法解析的 .vue 文件
- 无法在 Figma JSON 中找到的组件（疑似 manifest 漏登）
- 提取过程中发现的可疑写法（如 `defineProps<any>`、动态 prop 名）

## 处置建议汇总

按 E 子类给出后续 Phase 建议，例如：

- E1 / E2 → 建议进 Phase 6.3.5b：补登记到 prop-aliases.md
- E3 → 建议进 Phase 6.3.5c：补登记到 divergences.md "设计态"段
- E4 → 建议进 Phase 6.3.5d：参照 6.3 流程做清理
- E5 → 主 Session 拍板
```

---

## 任务 4：自验

```bash
# 验证中间 JSON 有效
node -e "console.log(Object.keys(JSON.parse(require('fs').readFileSync('figma-data/normalized/canonical-component-api.json','utf8'))).join(','))"

# 验证报告可读
ls -la docs/internal/phase-6.3.5-reverse-audit-report.md
wc -l docs/internal/phase-6.3.5-reverse-audit-report.md

# 不要跑 pnpm test / build——本轮无代码改动
```

---

## 任务 5：自己 commit

由你（Codex）自己 commit 本轮产物。

### commit 范围（精确，仅 3 个文件）

包含：
- `figma-data/normalized/canonical-component-api.json`（任务 1 中间产物）
- `docs/internal/phase-6.3.5-reverse-audit-report.md`（任务 3 报告）
- `docs/internal/_prompts/phase-6.3.5-canonical-reverse-audit.prompt.md`（本 prompt 归档）

不要 commit：
- 任何 `src/` 下文件
- 任何 `figma-sync/` 脚本
- `docs/session-handoff.md` / `docs/conformance-issue-log.md`（主 Session 自己改）
- `figma-data/published/icons/manifest.json`（如出现，仅时间戳变化，git restore）
- `docs/internal/published-vs-code-audit.md` / `figma-data/normalized/published-vs-code.audit.json`（如出现，audit 副作用，git restore）

### commit message

```
chore(audit): Phase 6.3.5 canonical reverse audit (read-only report)

Reverse audit on src/canonical/*.vue (28 components, excluding
ButtonBridge.vue draft) to find props / enum values that are NOT
registered in any of:
- src/design-system/translation/prop-aliases.md
- src/design-system/translation/divergences.md
- docs/internal/runtime-additions.md
- Figma normalized canonical-components.json (exact match)

Output:
- figma-data/normalized/canonical-component-api.json (machine
  readable extraction of all canonical props/emits)
- docs/internal/phase-6.3.5-reverse-audit-report.md (human-
  readable findings, with E-class unregistered items grouped
  by component and sub-classified E1–E5 with remediation
  recommendations)

No source code changes. Remediation decided by main session
based on this report.

Co-Authored-By: Codex
```

---

## 禁止

- ❌ 不修改任何 `src/canonical/*.vue` / `src/components/*` / `src/icons/*`
- ❌ 不修改 `prop-aliases.md` / `divergences.md` / `runtime-additions.md`（即使 audit 发现明显该补登记，也只在报告里建议，不直接补）
- ❌ 不修改任何 `figma-sync/*.mjs` 脚本
- ❌ 不修改 `figma-data/published/*`（已发布原始数据是只读的）
- ❌ 不更新 `docs/session-handoff.md` / `docs/conformance-issue-log.md`（主 Session 接手）
- ❌ 不要把 6.3.5b / 6.3.5c / 6.3.5d 的实际登记或清理工作 sneak 进本轮
- ❌ 不要因为某个 prop "看起来像 Vue 标准"就跳过审，**所有 prop 都必须给出归类**
- ❌ 报告里 E 类必须给"证据"——证明在 Figma JSON 哪个 key 下找过、为什么不命中

---

## 完成后

1. 报告 + 自 commit 完成后 STOP
2. 把报告路径和 E 类总数告诉用户
3. 等主 Session 决定怎么处理 E 类（拆 6.3.5b/c/d 还是合并处理）

完成后 STOP。
