# 迭代平台规格 v2 · 无限画布双轨迭代决策板

> 2026-08-27 v2.0 | 状态: **M1+M2 已实施落库** KAP commit 78b0864e(14文件 +1504/-15);后端 node:test 12 绿、前端 vitest 513/513、tsc 除 diagnose-60 预存债务外零新增;消费器 v0 shared/scripts/blind-votes-consumer.py 已实测;通道开关 KMC_MANIFEST_TRANSPORT=fs 已补双 .env。遗留: ①画布 UI 真实 episode 全流程盲选冒烟(需 :10588 在跑) ②M3 金标轨 ③M4 kst 外环
> v1 (单轨盲选) → v2 变更依据: Kai 裁决 ①全覆盖·文字类最重要 ②入口仅画布 overlay(移动端走 Tailscale 看画布) ③增加金标准数据集迭代轨,支持人工审核或全自动化

## 0. 一句话定位

**迭代平台 = 候选池 + 双选择器（人眼盲选 / 金标准距离）+ 统一决策账本 + 落地执行协议（forge/lab 既有纪律）。**

| 轨道 | 选择器 | 输出 |
|---|---|---|
| A · 人工判定迭代 | 盲选 overlay 蒙眼投票 → 揭晓对照 | blind-vote 事件 |
| B · 金标准迭代 | gold-gap 打分（确定性指标优先 + Agent 质量判读）→ 自动择优或提请人工确认 | gold-select 事件 |

两轨产出同构：都是「环节候选 + 一个选定决策」进同一本账本，差别只在谁按的按钮。

## 1. 证据锚点（全部 2026-08-27 实查）

### KAP 侧（选定主干道已在役）
| 能力 | 位置 |
|---|---|
| 选定事务(winner/is_winner/幂等/locked保护/reviewBridge/写回队列重放) | `routes/canvas/v2/select-winner.ts` |
| 5 源候选统一信封 + score 三档 scale | `lib/candidateEnvelope.ts`: p01_hook/p03_nbest/p11a0_flf/p11a_preview/p11b_take |
| 变体组派生 (groupKey 词表) | `lib/candidateGrouping.ts`; `shot:{id}:first/last`, `name:{dir}/{base}` |
| KMC 工作区 FS 回写 | `lib/manifestWriteback.ts`; 开关 `KMC_MANIFEST_TRANSPORT=fs`; iframe 首尾帧 + hook-candidates 已覆盖 |
| 画布再生回流留痕 | `appendCanvasTakeFlowback()` → `canvas-takes.jsonl`(never-throws 模式,本方案照抄此模式写账本) |

### KMC/学习侧（金标轨的原料与既有方法论）
| 能力 | 位置/现状 |
|---|---|
| 标准集实体 | `~/learning_sets/golden-standard-xiaojianghu-ep01/` (p00-p09 全相 JSON + diff-report/) |
| 标准集生产者 | kst 工程(kais-shot-timeline)逆向优秀作品 → golden-standard-*; detected_shots+transcribe 实测节奏分布 |
| 四步闭环方法论 | `kais-movie-iteration`: Agent三层diff(结构/质量/根因A-E分类)→定位→注入优化(few-shot/schema/校准/代码/路由)→验证 |
| 相位手术与锁定语义 | `kmc-phase-forge`: 手术重跑(setup_phase_rewind)、seed回锚点=commit、locked_phases、AUTOPILOT夜班显式授权模式 |
| 单相 A/B 机械层 | `phase-ab-lab`: run_arm/judges/metrics.py(punch/时长分布/覆盖) |
| 反馈进化账本先例 | `kais-feedback` queue.jsonl + approve 流 |

## 2. 数据契约

### 2.1 统一决策事件 `<episode>/.pipeline-assets/blind-votes.jsonl`

```jsonc
{
  "schema": "decision/v1",
  "vote_id": "bv_20260827T223001_a3f2",
  "recorded_at": "2026-08-27T22:30:01+08:00",
  "project_id": 12,
  "episodes_id": 34,
  "episode_refs": ["ep-zhongkui-ep01"],
  "session_id": "bsess_20260827_evening",      // A轨:一次盲选会话;B轨:auto-run id
  "track": "human_blind",                       // human_blind | gold_auto | gold_gated
  "group_key": "shot:S3_4:first",               // 与 candidateGrouping 词表字节一致
  "source": "p09_shotlist",                     // 扩枚举见 2.2
  "candidates_shown": [{"node_id":"n1","position":1}],
  "winner_node_id": "n2",
  "was_blind": true,                            // 揭晓后改票→追加 was_blind:false 事件
  "selector": {
    // human_blind 轨: operator_note + reason_tags(D1-D5词表子集)
    "operator_note": "", "reason_tags": ["光感","姿态语义"],
    // gold 轨: 打分明细全部封存防事后污染
    "standard_ref": "golden-standard-xiaojianghu-ep01",
    "score_breakdown": {"metrics_punch_delta": 0.82, "duration_median_ratio": 0.71,
                        "agent_layer2_gap": "narrow"},
    "ai_scores_snapshot": {"n1":{"scale":"ten","overall":6}},
    "human_vs_ai_agree": false
  },
  "revealed_after_vote": true,
  "revoked": false                              // 翻案=新事件,旧行置true;从不物理删行
}
```

预定义聚合口径（记账即定死）：人vs AI 一致率按 source 分组；位置效应=`position==1` 当选率 vs 1/N；翻案率；**B轨 gap 收敛曲线**（每 cycle 的 min gold-gap 时序——金标轨自己的完播指标就是它）。

### 2.2 信封扩展

`candidateSourceSchema` 扩枚举：`p02_outline / p03_script / p06_spatio / p09_shotlist`（zod enum 直改向后兼容）。文字类候选以 script 型节点入组，extras 承载 `{field_rows:[{field,a,b,delta}]}` 字段级行对齐渲染数据。

### 2.3 不新建的表

候选清单真值=`canvas_variant_groups`+extras；AI 分不用另存（投票时快照进事件）；推进状态仍归 forge-manifest/checkpoint 管。金标准目录只读——diff 报告写在 `learning_sets/<gs>/diff-report/`，永不回写标准集本身。

## 3. 金标准轨（Track B）设计要点

```
候选从哪来？  forge/lab 手术臂多臂再跑 + p01/p03 既有 N-best + 管线自然多版本
打分怎么算？  分两类,能确定性的绝不托付给LLM:
  ① 确定性: P09 类用 metrics.py 分布指标 vs 金标实测分布(punch/中位时长/≤3s占比);
     P02 用节拍覆盖率分层计算(坑表教训:分母按 event_type)
  ② Agent 判读: kais-movie-iteration Layer2 质量 gap(narrow/moderate/wide/critical)
     映射数值,只用于 ①覆盖不到的维度(潜台词密度/felt_intent 质量)
谁拍板？     gold_auto: argmin(gold_gap) 自动选定;
             gold_gated: 给出排名+理由,等人确认(默认慢镜头从不自动锁)
落几层？     两级门:
  APPLY 层  写 chosen_variant_id/manifest 字段 —— 自动化可到达(工作态,可逆)
  LOCK 层   seed 回锚点+locked_phases+推进下一相 —— 沿 forge 红线:
            默认必须人工;仅当次夜班获得 Kai 显式 AUTOPILOT 授权时例外
护栏         收敛预算/每晚上限、gap 单调改善才继续否则升级评审、全程 ledger+journal
             (kmc-forge-night-journal.html 固定文件名模式,Kai 晨间审阅)
```

与既有角色分工完全一致：诊断/跑臂/验证=Hermes，改码=GLM 老司机（07-26 定规），人工锁定红线=forge。

## 4. 交互设计

- 入口：画布顶栏「🔮 盲选」+「🥇 金标」两个入口；移动端 Kai 走 Tailscale 直接开画布,不另做 TG 投票端。
- 盲选会话（A轨）：只呈现有待选分歧的组；随机序会话内固定（记入 candidates_shown）；AI 分/来源标签 voting 阶段 DOM 层不渲染；点图→揭晓页(来源+AI分对照+分歧标记)→维持/改选/跳过。
- 文字类卡片：字段级行对齐双栏（移植 forge 左旧右新 HTML 规范：table 左右 td 同字段并排+差异 `<mark>` 高亮+页顶 KPI delta 徽章），React 组件化。
- 金标面板（B轨）：各 phase 的 gap 收敛曲线、当前瓶颈相位高亮、diff-report 入口链接；gold_gated 待确认队列卡（候选排名+score_breakdown 可展开+一键采纳）。

## 5. 实施里程碑（修正后）

| 期 | 内容 | 备注 |
|---|---|---|
| **M1** 决策内核 | 账本 schema v1 + appendBlindVoteEvent(贴 canvas-takes 模式) + select-winner 挂钩 blind 字段 + Hermes 消费器 v0(tail→TG 通知我) | 文字/视觉通用底座 |
| **M2** 文字类全覆盖 | 信封扩 4 枚举 + 文字候选生产线(forge/lab 臂产物自动注册成 script 组) + 字段行对齐渲染组件 + 文字类盲选会话 | **最高优先**(Kai 裁决①) |
| **M3** 金标轨 | gold-gap 打分服务(metrics 确定性件 + Agent layer2 判读包装) + gold_auto/gold_gated 选择器 + 两级门(APPLY/LOCK) + 夜班 journal 集成 | 复用 kais-movie-iteration 四步闭环,不重造 |
| **M4** kst 外环回路 | 新标准集自动入库为可选 reference + 成片节奏保真度复测(kst shots.json vs p09 意图)反馈进 gap 曲线 | 闭环"迭代了但渲染是否保真"的最后一公里 |

验收口径 M1：真实 episode 完成 ≥1 次全流程盲选→事件字节正确落盘→load-v2 winner 一致→fs transport 配通时 iframe-manifest/chosen_variant_id 如实更新→消费器送达 TG。
验收口径 M3：对 xiaojianghu 标准集做一轮 gold_auto 择优,P09 gold-gap 较基线收敛且全部决策在 ledger 可追溯。

## 6. 风险与守门

| 风险 | 守门 |
|---|---|
| save-v2 无乐观锁,多写者互删 | winner 写入全走 select-winner 单端点收口(D-09),禁旁路手拼 graph |
| 通道未开通丢票 | writebackQueue 重放与 canvas-takes 同路;UI 本地留 last-N 未确认事件,drain 成功后清 |
| 盲选被剧透 | 独立 overlay 渲染裸候选,不复用带"✅已选"标签组卡组件 |
| 翻案破坏下游事实 | revoke-only;locked 成员 WR-09 本就拒选,沿用 |
| LLM 打分漂移冒充客观分 | 确定性维度必须用 metrics.py 数值,score_breakdown 里逐项标注生产者(metrics/agent),聚合时分开统计 |
| 全自动化越权锁定 | LOCK 层默认人工红线;AUTOPILOT 仅限当次显式授权,结束自动回退(与 forge 夜班同一纪律) |
| 金标过拟合单一作品 | 标准集引用进事件(standard_ref),M4 多集入库后按题材分组打分,禁止跨题材错配 |

## 7. 点火顺序建议

M1+M2 合并成一个 GLM 老司机 fix-batch 先行（账本是两者共同地基，文字类组件是 Kai 定的最高优先）；M3 第二批（依赖 M1 账本就绪）；M4 视 kst 新标准集产出节奏排期。


> 进度 2026-08-27: M3 金标轨已交付（KAP commit c8dd8942，gold-gap 打分+APPLY 门+GoldPanel）。真实数据复算 overall_gap01=0.6764。

> 进度 2026-08-27 深夜: 遗留全清——①M1+M2+M3 全部上线 :10588(systemd 托管, 端口绑定验证过) ②M3 金标轨交付(KAP c8dd8942, 真实数据复算 0.6764) ③画布冒烟抓出两缺口并修复: Fix-1 纯变体族成组(KAP 7953490d, 她从深渊回来命名组 0→9, 历史项目盲选解锁) + Fix-2 migrate 伪造 winner(派发中); ④M4 kst 外环交付(KAP 7953490d, 钟馗v3 真实 EDL 11-clip 保真度复测 overall_gap01=0.7650, GET /standards + POST /score-kst 生产验证过)。
