12 KiB
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必须登记目标章结构化事实及首见章号;审计结果只允许输出路径和哈希。
冻结规则
- 章号支持整数和数字字符串,拒绝布尔值、浮点猜测、空值和无法证明上界的字符串。
- 里程碑按绝对章号过滤;未来条目、跨过
as_of的区间和无章号条目进入omittedSources,不改写成当前事实。 - 窗级大纲按
to_order过滤并按from_order排序;window_no只是展示字段,不能作为冻结键。 - 终态摘要、未来弧线、原始当前态等存储字段不能直接透传;只能保留安全历史并由后续消费方明确标记推导状态。
- 任何目标章事实、目标实体清单或目标章标签不得参与规划器侧来源选择。
输出合同
输出是临时 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 的唯一顺序产生,人工不得改写。