# 工单 Lane C — KAP 无限画布：变体/选定/Gate 审核面审计（KMC 采纳闭环 + KGR 盲选）

## 0. 任务性质
**只读审计批，非修码批。** 产出 = 审计报告 markdown 文件，唯一允许写入 = 报告文件本身。
最终目标：变体选定（select-winner）与 Gate 审核是 KMC 的资产采纳闭环（P04 角色→P07 场景→P11 首尾帧逐级选定后下游才能消费）和 KGR 的盲选定谳机制（Kai 盲选票→ Winner 回写→ 批次收敛）。这条链上的缺陷 = 采纳决策丢失或盲选作废。

## 1. 背景已知事实（实测锚点，直接采用勿重新推导；与实探冲突处以实探为准）

- 仓：`/data/workspace/kais-aigc-platform`，分支 `feat/ui-direct-action-fix`，HEAD `333df7b6`
- 核心文件（后端）：
  - `src/routes/canvas/v2/select-winner.ts`（278 行）——变体选定回写
  - `src/routes/canvas/v2/review-gate.ts` + `gate-ops.ts` + `gate-state.ts` + `g15-ops.ts`——审核 Gate 链
  - `src/routes/canvas/v2/gold-gap.ts`（632 行）——B 轨金标 gap 对比
  - `canvas_variant_groups` / `canvas_branches` / `kv_audit` 表（data/db2.sqlite，**只读** `file:...?mode=ro`）
- 前端：`packages/infinite-canvas/src/store/variantOps.ts`、`store/qcVerdict.ts`、`store/gateStore.ts`、`components/ReviewCard.tsx`、`ReviewActionButtons.tsx`、`components/gate/`、`v3/__tests__/selectWinnerMountContract.test.ts`
- 业务语义（审计基准）：
  1. 变体组语义 = 「同一资产位的 N 个候选，恰好 1 个 Winner」；three_state（选定/待选/淘汰）应与 winner 状态一致
  2. 盲选页= 臂身份匿名，判定串回传后开盲；GT 参照板必须显性
  3. Gate 链（AIGC 标识/资源门/帧差门）任一 reject 应阻断下游且可 rollback
  4. Kai 纪律：「评审页=评价框随串回传」「统计显著≠感知显著，人工感知终审门不可绕」
- 历史线索（逐条验证现状）：P09 各 phase 的 list output 共享 asset id 前缀曾致画布节点覆盖（变体组污染）；qcVerdict 曾有「NULL 待审态条件对齐统计口径」修复（commit 7c575949，读它的 diff 了解修了什么，检查同类遗漏）

## 2. 审计任务（C1-C6）

- **C1 select-winner 全链**：选定请求 → variant_groups 状态机 → canvas_nodes 回写 → 下游消费（KMC P11 读选定资产 / KGR 读 Winner）。验证：恰好 1 Winner 约束的执行点（DB 约束？应用层？可否被并发双选破坏？）；选定后撤销/重选的语义；three_state 与 winner 不一致的可能路径。
- **C2 review-gate / gate-state**：Gate 提交→awaiting_review→resolve（approve/reject/contest）→rollback_to 的状态机完整性；reject 后的 rollback 目标解析正确性；gate 状态与 canvas 节点状态的双向同步缺口。
- **C3 gold-gap.ts 632 行**：金标 gap 的计算真值来源（gold 集从哪读）、gap 指标口径、A 轨（人眼盲选）与 B 轨（gold-gap）的分流逻辑；「统计显著≠感知显著」在该模块的体现（是否把统计判定当终审）。
- **C4 前端审核组件**：ReviewCard/ReviewActionButtons 的判定提交链（乐观更新？失败回滚？）；qcVerdict 统计口径（读 7c575949 diff）之后仍存在的口径漏洞；盲选场景下臂身份泄漏风险（前端字段/排序/URL 泄漏甲乙身份）。
- **C5 并发与竞态**：双开画布 tab 同时选定/同时判定的行为；kv_audit 与 canvas_variant_groups 的写入时序；socket 事件（useCanvasSocket）驱动的状态刷新与本地乐观更新的竞态。
- **C6 改进建议**：每条标注服务对象（KMC 采纳闭环可靠性 / KGR 盲选定谳效率 / Kai 终审体验）与成本（S/M/L）。

## 3. 红线（违反=交付作废）

1. **绝对只读**：禁改文件；禁 POST/PUT；禁 sqlite 写；禁重启；禁任何形式的评审提交（即使测试目的）。
2. sqlite 一律只读连接。git 允许只读操作（git show/diff/log 读历史 commit）。
3. 唯一写入 = `/tmp/kap-canvas-review/report-C.md`。

## 4. 输出契约

报告写 `/tmp/kap-canvas-review/report-C.md`，结构：
1. 执行摘要（≤200 字 + P0 清单）
2. 问题清单：P0/P1/P2，每条 = 现象 → 证据（文件:行号 / SQL 输出 / commit diff）→ 根因 → 对 KMC/KGR 的影响 → 修复建议（成本 S/M/L）
3. 历史线索核查表（第 1 节两条 + selectWinnerMountContract.test.ts 契约覆盖度评估）
4. 改进建议（标注服务对象）
5. 验证方式
6. 硬性证据约束：所有结论引用文件:行号或实测输出；不确定标「待验证」。结尾附 ≤300 字摘要。
