zizi fa922f8cc5 实现: 装配正文五章真实冻结评测
将卡稳定选择器、冻结历史正文和目标 scaffold 绑定到同一只读快照;固定上下文预算并净化诊断索引,收紧盲评输入边界,防止目标事实和选卡信息泄漏。
2026-07-21 16:09:23 +08:00

12 KiB
Raw Blame History

name, description, disable-model-invocation
name description disable-model-invocation
replay-eval 回放评测的冻结与结果边界合同。把参考作品冻结到 as_of 章号,生成可审计的输入清单,并在生成/评分前阻断未来信息、未授权来源和全文留存。 true

回放评测

本 skill 只负责确定性的评测编排边界,不调用模型、不替代统一读取器,也不写正式规划或知识。细纲回放见 docs/2026-07-19-回放评测-细纲首跑设计与计划.md;正文回放的唯一任务 SoT 是 docs/2026-07-20-正文智能体正式优化设计与计划.md。

真实参考作品配置由 scripts/load_reference_work.py 在 REPEATABLE READ READ ONLY 事务中从实验库组装;它只取作品元数据、窗级大纲、章级细纲摘要和预注册卡 ID 对应的候选卡历史。候选卡必须标记为 eval_draft,不能当作生产知识检索结果。

来源版本只认原文件证明链:example_reference_work.source_file 必须唯一匹配成功 import task 和未软删 knowledge document,三方文件名一致,文档 file_hash 为 64 位小写 SHA-256,且 import command_id 以该 hash 前 16 位开头。sourceHash=sha256:<hash>,sourceVersion=raw-file-v1:sha256:<hash>;作品 revision 和导入章数不得改变原文件版本。

输入合同

  • reference_work:参考作品标识和版本。
  • as_of:冻结章号,必须是正整数;所有历史证据只能来自绝对章号 <= as_of。
  • snapshot_version:不可变的快照版本。
  • 作品大纲窗口:使用 from_order / to_order,只允许完整窗口 to_order <= as_of。
  • 实体卡和里程碑:必须带可验证的绝对章号;无明确上界的区间不进入快照。
  • 来源合同:每个来源要有 sourceId、sourceVersion、用途授权快照和来源状态。
  • 内容审计合同:leakageAudit.targetFacts.forbiddenFacts 必须登记目标章结构化事实及首见章号;审计结果只允许输出路径和哈希。

冻结规则

  1. 章号支持整数和数字字符串,拒绝布尔值、浮点猜测、空值和无法证明上界的字符串。
  2. 里程碑按绝对章号过滤;未来条目、跨过 as_of 的区间和无章号条目进入 omittedSources,不改写成当前事实。
  3. 窗级大纲按 to_order 过滤并按 from_order 排序;window_no 只是展示字段,不能作为冻结键。
  4. 终态摘要、未来弧线、原始当前态等存储字段不能直接透传;只能保留安全历史并由后续消费方明确标记推导状态。
  5. 任何目标章事实、目标实体清单或目标章标签不得参与规划器侧来源选择。

输出合同

输出是临时 snapshot_manifest:记录来源 ID/版本、SHA-256、字符数、字段裁剪、来源省略和快照版本,不保存原书正文。三臂的 manifest 除卡注入分区外必须字节一致;不一致时整组作废。

授权、来源版本、目标章禁读或内容级泄露检查任一失败,都必须 fail-closed,返回明确的阻断状态,不靠重试绕过。

run_replay.py 会同时审计公共快照和三臂卡注入区。没有 leakageAudit 配置、发现未来章记录、目标事实完整匹配,或原子事件子句达到多强锚点与覆盖率门时,不生成 snapshot_manifest,也不进入 planner。

产物边界

  • 原始候选、标准事实摘要和完整输入只能留在临时运行目录或 /tmp。
  • 最终报告只允许评分、摘要、章节定位、失败类别和哈希。
  • 禁止写入原书正文、完整目标细纲、完整 Prompt/Response、供应商原始响应、token、密钥或未脱敏授权资料。

编排入口

  • scripts/run_replay.py --mode dry_run:只执行授权、来源、冻结和三臂 manifest 预检,不调用模型;这是首个机制 smoke 入口。
  • scripts/load_reference_work.py:从 PostgreSQL 只读事务组装仓库外临时配置;读取 example_reference_authorization_snapshot 当前原文件版本的最新快照,组装 authorization 外层与 snapshot。缺授权记录仍生成可审计配置,但送入 run_replay 后必须保持 blocked_authorization。
  • scripts/run_replay.py --mode execute:在全部前置门通过后,依次执行三臂 planner、整组 schema、逐臂盲 detector、两个独立盲 judge、rubric 校验、稳定性门和去盲汇总;--output-dir 必须位于仓库外的临时目录。
  • detector 输入输出均为 JSON;输入只有匿名候选 ID、候选和公共冻结到 as_of 的规划上下文,不含 arm 名、cardInjection、cardManifest、任何臂特有卡内容、目标章 proxy 或其他评委结果。卡注入合法性只由确定性预检负责。任一 high 严重度发现整组标记 detector_blocked,judge 调用数必须为 0;报告不合约时标记 detector_invalid。
  • 两个 judge 使用不同 judgeId 和独立无会话进程。第二个 judge 的匿名候选顺序必须与第一个完全相反;任何 rubric 不合约标记 judge_invalid,任一同维差值大于 0.5 标记 judge_unstable,两者都不得标记 completed。
  • 只有三臂 schema、detector、双 judge rubric 和稳定性门全部通过,才去盲生成逐维 B-A / C-A 差值矩阵并标记 completed。--detector-bin、--judge-primary-bin、--judge-secondary-bin 可分别指定本地 runner;未指定时复用 --planner-bin,测试只能使用 fake binary。
  • planner、detector、judge 子进程统一受 --timeout-seconds 限制,默认 300 秒;任一超时分别落盘 planner_timeout、detector_timeout、judge_timeout,不得继续进入后续阶段或标记 completed。
  • scripts/write_report.py:从 run_result.json 生成独立严格 schema 的安全摘要,只接受受限标识符、枚举、数字、短安全摘要和 SHA-256;不会读取候选正文,也不会把候选路径以外的原始响应写入报告。

真实作品运行前必须先从权威来源取得不可变授权快照。当前 work=8 已有 research_only 且 allowedPurpose=["offline_evaluation"] 的有效记录;升格入口增加里程碑章号与所标章节原文短引的机械绑定并重抽第 84 窗后,真实 489 dry-run 已达到 ready、内容泄露发现为 0。首次模型执行因外部 Opus 网关 503 No available accounts 在第一臂 planner 前失败,未产生候选且费用为 0;通道恢复后必须完整重跑三臂。其他作品缺记录时继续保持 blocked_authorization,不得伪造为 licensed。

正文 A/B/C 回放

正文 Gate A 固定配置为 configs/writer-gate-a-deep-space-v1.json,预注册深空之影五章:489 战斗、321 人物对话、544 转折、199 信息揭示、523 老角色回归。不得根据候选结果换章、换场景分类或修改冻结点;每个冻结点必须等于 targetChapter-1。

真实五章装配还必须在 commonControls 预注册选择器版本、选择器规范 JSON 的原始字节 SHA-256、inputProvenance=oracle_reference_scaffold 和统一 maxContextChars=140000。loader 在数据库读取前机械核对这些值:选择器篡改、来源标记变化或样本预算与公共控制不一致都失败关闭;loader 不得根据实际文本抬高预算。连续四章基线装不下时由 assembler 阻断,弱补充原文由 assembler 按预算裁剪。

每个样本必须提供 writerContextInput。仓内配置只允许 contentMode=sanitized_contract_fixture,recentChapters 只能放连续四章的脱敏合成短文本,用于证明 WriterContext 合同、章号冻结和 A/B/C 差异策略;它不是历史原文,不证明真实正文完整性或文学质量。配置可以记录细纲硬约束、主要实体、预期篇幅、新角色比例和泄漏哨兵,但不得包含原书全文、完整目标细纲或标准答案。

三臂都必须构造并校验 WriterContext v1,且固定 mode=diagnostic_only、purpose=evaluation、acceptanceEligible=false:

  • A:evidenceStrategy=historical_prose_only,保留连续四章脱敏基线,不放 indexHints。
  • B:evidenceStrategy=card_index_only,只放 retrievalResult.indexHints,proseEvidence 为空;这是合同内可审计的诊断基线例外,不是生产旁路。
  • C:evidenceStrategy=card_index_plus_prose,保留连续四章脱敏基线,并放冻结 indexHints 与配置中的补充原文证据。

indexHints 每项只能包含 cardId/name/type/content/sourceId/sourceVersion/asOf,只能用于 diagnostic_only 的 evaluation/diagnostic,不得进入生产上下文;claimLedger 不得引用它。eval_draft 的 content 只能编码卡名、类型和实际回读章号,不得透传里程碑台阶;生产 Canonical 卡行为不变。所有 asOf 和来源章号不得超过样本冻结点。

卡没有持久化 sourceRefs 时,允许把冻结线内最近三个里程碑章的整章 Canonical block 作为降级回读,但每个引用必须标记 sourceType=card_chapter_proxy,对应 proseEvidence.purpose=card_chapter_proxy,不得冒充精确片段。每个代理章必须实际出现卡规范名或选择器预注册的合法别名,否则失败关闭。

每个样本必须记录 frozenRecentHanCounts 和 targetLengthBasis。篇幅只能使用冻结点前连续四章汉字数,经 calculate_target_chars 复算;当前 Gate A 固定 hardEventCount=1、foreshadowingActionCount=0、requiredSceneCount=0,禁止读取目标章实际长度。expectedLength 与 WriterContext 的输出合同必须等于机械目标的正负 10%,再受 2000-10000 边界限制。

newCharacterRatio 定义为:具名 requiredCharacters 中,在 asOfChapter 前无记录的角色比例。真实 loader 必须在同一 REPEATABLE READ READ ONLY 事务内直接扫描冻结历史 Canonical 正文,按名字返回首次命中章和命中章集合,再重算 knownBeforeAsOf/absentBeforeAsOf/newCharacterRatio;卡内容不得参与这个判定。泛称角色不参与猜测;例如第 544 章的“内应”无法确定具体身份,必须记录 newCharacterRatio=null 和 newCharacterRatioStatus=unresolved_generic_role,不得默认成 0。

盲评使用独立的 writer-blind-input-v1 内容边界。judge 只能看到 blind-1/2/3 候选正文/哈希,以及所有臂完全相同的 sharedEvaluationReference:细纲严格四字段 sourceRef/hardConstraints/adjustableBeats/declaredNewFacts、必需角色、伏笔、章末钩子和冻结点前连续四章历史原文基准;不得增加 entities。共同参考可以在真实运行时临时传给 judge,但不能进入安全摘要。它不得包含 indexHints、各臂补充原文、卡 manifest、evidenceStrategy、真实 A/B/C 映射、各臂 WriterContext、raw 目录或任何包含 candidate-A/B/C 的路径;卡的正确性只能由共同历史原文基准验证,不能把被测卡本身当裁判。映射只保留在编排器内存中,评分完成后才去盲。

正文 dry-run 命令:

.venv/bin/python .claude/skills/replay-eval/scripts/run_writer_replay.py \
  --config .claude/skills/replay-eval/configs/writer-gate-a-deep-space-v1.json \
  --dry-run

dry-run 只输出计划、manifest 和上下文摘要,不调用 writer、semantic detector 或 judge,不生成候选正文,也不得声称真实回放完成。当前 CLI 的 --execute 因真实 semantic detector 和 judge adapter 尚未接线而失败关闭;只有实现并验证这两个受控 adapter 后,才可在预算确认后启用真实模型回放。

正文 Gate 输入

writer_gate.py 只信任 gate-input.json.samples[] 的逐样本脱敏结果。有效样本数、作品数、场景覆盖、C 臂硬门统计、C-A 五维增量、退化比例和五类混淆项全部由判定器内部计算;顶层传入的同名聚合值和聚合 confounds 不参与裁决。五类混淆项是:假阴、假阳、泄露、评委不稳定、新角色无卡。

真实回放未接线期间不能生成合法 Gate 输入,也不能运行 Gate A/B 得出通过结论。Gate A/B 的终态只能由 writer_gate.py 按任务 SoT 的唯一顺序产生,人工不得改写。