# 0.6.5 计划：AP 自动继承 + CLIP 多模态检索 + 设计库卡片包

> 状态：**已实现（0.6.5）** · 目标版本：`0.6.5` · 前置：`0.6.4`（AP 硬闸门 / hybrid / 以图搜图 / 审美模板）
> 范围：AP 自动继承、CLIP/多模态以图搜图（含文本→图）、设计库卡片包 export/import。

## 1. AP 自动继承

- 判据/检查引用 `designRefs`（DSG-*）时，卡上的 `antiPatterns` **自动进入审计清单**：
  - 不写回 spec.json（保持冻结包不变）；每次 spec 校验 / audit 都从设计库派生；
  - 派生链：`criterion.designRefs[] → card.antiPatterns[]`，与显式 `antiPatternRefs` 取并集；
- 闸门：
  - `dwguard_spec`：继承链上的 AP 不存在（`E_ANTIPATTERN_INHERITED_UNKNOWN`）或被 block
    （`E_ANTIPATTERN_INHERITED_BLOCKED`）直接拒绝；
  - `dwguard_audit`：同样拒绝继承链上的缺失/blocked AP；
- 报告与 JSON：
  - 报告「反模式对照」列对继承项标 `（继承 DSG-xxxx）`；
  - `audit-<n>.json` 的 `design.antiPatterns[]` 增加 `source: explicit|inherited` 与
    `inheritedFrom`；
- spec.md 增加「自动继承的反模式」小节，列出 `判据 ← 设计参考 → AP` 关系。

## 2. CLIP / 多模态以图搜图

- 配置（默认关闭）：
  - `designClipEndpoint`（多模态 embedding 端点；空 = 关闭）
  - `designClipModel`（默认 `clip-vit-base-patch32`）
  - `designClipApiKeyEnv`（默认 `DWG_DESIGN_CLIP_KEY`）
  - `designClipTimeoutMs`（默认 8000）
  - `designClipWeight`（0–1，默认 0.5）
- 端点契约（文档化）：`POST {model, images?: [dataUrl], texts?: [string]}` →
  `{imageEmbeddings?: number[][], textEmbeddings?: number[][]}`；
- `search image:`：pHash/直方图分数与 CLIP 余弦归一化分融合
  `(1-w)×perceptual + w×(cos+1)/2`；结果表多一列 CLIP；
- `search imageText:`：文本→图片，需要 CLIP；只比对卡片图片的语义相似度；
- 图片/文本向量缓存于 `clip-embeddings.json`（model + sha256 键）；
- 失败策略：图片检索 CLIP 失败 → 回退 pHash/直方图并注明；文本→图失败 → 明确报错；
- `query.mjs` 仍为词法，不含 CLIP（无端点/凭据）。

## 3. 设计库卡片包

- `dwguard_design` 新增 `pack`：`list / export / import`；
- 全局目录 `designPacksDir`，默认 `~/.dsh/dwguard/design-packs`；
- `pack export`：只导出 active 卡片；图片复制到 `<pack>/refs/<sha>`；`pack.json` 保存完整卡片；
- `pack import`（需 `confirmed: true`）：
  - 新 id（DSG/AP 命名空间各自分配），保留 kind/品牌/tokens/来源/清单等字段；
  - 语义去重（标题 + 来源 + tokens + rationale 的 sha256），重复导入自动跳过；
  - 图片按 sha256 复制进当前库 `refs/`，导入后重建 chunks/index；
- `pack list` 列出全局包。

## 验收标准（可证伪）

| ID | 判据 | 验证方式 |
| --- | --- | --- |
| AP-I-1 | 仅引用 DSG 卡（无显式 AP）时 spec 写入成功且 spec.md 列出继承关系 | 单测：读 spec.md |
| AP-I-2 | 审计报告/JSON 把继承 AP 标为 inherited 并带 inheritedFrom | 单测：读 acceptance/audit JSON |
| AP-I-3 | 继承链上的 AP 被 block / 不存在时，audit 与 spec 都拒绝 | 单测 |
| PK-1 | pack export/import 跨项目保留卡片字段、图片与 AP 引用（重映射后） | 单测 |
| PK-2 | 重复 import 按语义去重；未 confirmed 拒绝 | 单测 |
| CLIP-1 | `imageText` 通过端点按语义排序（红图排第一） | 单测：loopback stub |
| CLIP-2 | `image` 在 CLIP 开启时融合 pHash 与语义分并写入缓存 | 单测：CLIP 列/缓存文件 |
| CLIP-3 | 缓存避免重复请求；端点不可达时 image 回退、imageText 报错 | 单测 |

## 已知边界

- CLIP 端点契约是自定义的简化协议；不是官方 OpenAI 接口，需要自备小服务；
- AP 继承是只读派生，不冻结进 spec.json；设计库后续变化会影响下一次 audit（这是有意的）；
- pack 只导出 active 卡片与图片，不含 feedback 历史/基线；导入总是产生新 id；
- query.mjs 不参与 CLIP/以图搜图/AP 继承。

## 兼容性

- 新字段/配置全部可选；旧 spec/audit/library 无需迁移；
- `DESIGN_ENGINE_VERSION` → `0.6.5`；`clip-embeddings.json` 缺失会自动重建；
- 默认不联网：未配置 CLIP 时行为与 0.6.4 一致。
