--- name: 回放评估正文质量 description: 执行正文 A/B/C 三臂隔离回放:构造并校验三臂 WriterContext、跑写手与盲评、结算预算与 raw 租约,产出逐样本脱敏结果。需要用真实作品验证卡索引对正文质量是否有增益时使用;不产生 Gate 终态,不把原书正文写进仓库。 disable-model-invocation: true --- # 正文回放执行(scenario: writer_replay | 三臂单变量 | 上下文=冻结到 as_of 的历史) 本 Skill 只做**正文侧**回放执行。细纲回放编排归 `回放评估细纲质量`;真实五章配置装配归 `准备正文回放数据`;评分口径归 `评估内容质量`;Gate 终态归 `判定质量是否合格`;角色调用、CAS 与 raw 归 `执行角色任务` 与 `记录运行证据`。依赖箭头只向下。 ## 输入 - `--config`:当前中文身份基线为 `configs/writer-gate-a-deep-space-v1-cn-skills.json`,预注册深空之影五章:489 战斗、321 人物对话、544 转折、199 信息揭示、523 老角色回归。该文件的运行探针为 `dry_run`,只能证明配置构建与哈希合同;真实 execute 必须先由 `验证角色运行能力` 取得 successful probe,再由 `准备正文回放数据` 重新装配仓外配置。角色、运行时、模型策略、prompt 或 schema 任一变化后,必须更新能力证明。不得根据候选结果换章、换场景分类或改冻结点;每个冻结点必须等于 `targetChapter-1`。 - `commonControls`:预注册选择器版本、选择器规范 JSON 原始字节的 SHA-256、`inputProvenance=oracle_reference_scaffold`、统一 `maxContextChars=140000`。五个样本的 A/C 补充原文预算统一预注册为 2000 Unicode code point,loader 在读库前机械核对,不得按实际文本抬高或降低。 - `writerContextInput`:仓内基础配置只允许 `contentMode=sanitized_contract_fixture`,为 A/C 各提供恰好 2000 code point 的合成脱敏补充原文,用于机械证明合同、冻结与创作输入差异;这些文本不得来自原书。真实临时配置必须改为 `canonical_frozen_prose`。 三臂都必须构造并校验完整 `WriterContext v1`,固定 `mode=diagnostic_only`、`purpose=evaluation`、`acceptanceEligible=false`。adapter 随后投影 `WriterCreativeInput v2`;writer 模型只看创作投影,看不到运行身份、manifest、hash、实验臂或验收状态: - A:`evidenceStrategy=historical_prose_only`,保留连续四章脱敏基线,不放 `indexHints`,`patternReferences` 恒空。 - B:`evidenceStrategy=card_index_only`,只放 `retrievalResult.indexHints` 与冻结公共 `patternReferences`,`proseEvidence` 为空;这是合同内可审计的诊断基线例外,不是生产旁路。 - C:`evidenceStrategy=card_index_plus_prose`,保留连续四章脱敏基线,并放冻结 `indexHints`、与 B 相同的公共 `patternReferences` 及配置中的补充原文证据。 A/C 单变量回执在 `WriterCreativeInput v2` 上比较。正式 Gate A 的 `allowedDifferencePaths` 必须非空,A/C `contextSha256` 必须不同,且所有路径只能位于 `factConstraints`、`proseExcerpts` 或预注册的 `patternReferences`;`indexHints` 等模型不可见字段的差异不能使样本合格。 篇幅只能用冻结点前连续四章汉字数经 `calculate_target_chars` 复算;Gate A 固定 `hardEventCount=1`、`foreshadowingActionCount=0`、`requiredSceneCount=0`,禁止读取目标章实际长度。`expectedLength` 必须等于机械目标的正负 30%,再受 2000-10000 边界限制。 ## 输出 逐样本脱敏结果,提交给 `判定质量是否合格` 构建 Gate 输入。本 Skill 不产生也不改写 Gate 终态。 `indexHints` 每项只能含 `cardId/name/type/content/sourceId/sourceVersion/asOf`,只用于 `diagnostic_only` 的 `evaluation/diagnostic`,不得进入 writer 或 semantic detector 的模型输入。可信组装器只能把经来源回读确认的内容转成 `factEvidence` / `factConstraints`;`eval_draft` 的 `content` 不能直接成为 `supported/pass` 依据。所有 `asOf` 与来源章号不得超过样本冻结点。 卡没有持久化 `sourceRefs` 时,允许把冻结线内最近三个里程碑章的整章 Canonical block 作为降级回读,但每个引用必须标记 `sourceType=card_chapter_proxy`、对应 `proseEvidence.purpose=card_chapter_proxy`,不得冒充精确片段;代理章必须实际出现卡规范名或选择器预注册的合法别名,否则失败关闭。 `newCharacterRatio` 是具名 `requiredCharacters` 中在 `asOfChapter` 前无记录的角色比例,由 loader 在同一只读事务内扫描冻结历史正文重算,卡内容不参与判定。泛称角色不猜:第 544 章的"内应"必须记 `newCharacterRatio=null` 与 `newCharacterRatioStatus=unresolved_generic_role`,不得默认成 0。 盲评走 `writer-blind-input-v4`,绑定预注册 `scenario` 与 `writer-replay-rubric-v2`;三位评委的场景或策略版本不一致时在模型调用前失败关闭。模型输入不得含 `indexHints`、卡 manifest、`evidenceStrategy`、真实 A/B/C、各臂 WriterContext、raw 路径、reviewer 身份、任何 hash 或其他评委结果。映射只留在编排器内存,评分完成后才去盲。 ## 数据边界 不直接连数据库;真实配置由 `准备正文回放数据` 在只读事务中装配后以文件传入。 原始 prompt、response、候选、标准事实摘要与完整输入只能留在**仓库外**受控 raw vault,受显式保留授权、租约与迁移回执约束。禁止把完整 Prompt/Response、供应商原始响应、原书正文、完整目标细纲、token、密钥或未脱敏授权资料写入 Git 仓库或安全摘要。 预算合同分为不可变 `plannedCalls` 与独立安全上限 `maxCalls`。Gate A 预注册 writer 60 次(15 基础 + 最多 45 篇幅修订)、semantic detector 24 次(15 基础 + 9 纠错/重试)、blind judge 45 次;各 `maxCalls=150`、单次 cap `$5`、总预算 `$2250`。启动预留只按 `plannedCalls * maxBudgetUsdPerCall`(`$645`)。每次调用前账本同时检查角色计划槽位、`maxCalls`、累计实际成本与未执行计划的最坏预留;调用后只能用可信 `RoleExecutionReceipt.totalCostUsd` 结算。缺回执成本、重复/错序结算、单次 cap 或总预算越界均失败关闭。 ## 用法 dry-run 只输出计划、manifest 与上下文摘要,不调用任何模型,不生成候选正文,也不得声称真实回放完成: ```bash PYTHONPATH=muse/lifecycle/quality/skills/replay/回放评估正文质量/scripts .venv/bin/python -m run_writer_replay \ --config muse/lifecycle/quality/skills/replay/回放评估正文质量/configs/writer-gate-a-deep-space-v1-cn-skills.json \ --dry-run ``` `--execute` 必须在创建 runner、raw vault 或调用模型前校验预算、授权、冻结快照、三角色 profile、schema、prompt、内容模式、调用计划与显式 runtime 认证;任一不一致失败关闭。固定 Opus profile 使用 `MUSE_ROLE_OPUS_BASE_URL` / `MUSE_ROLE_OPUS_AUTH_TOKEN`,模型不可用或认证缺失时返回受控阻断,不消耗预算槽位也不建立 raw vault。正式 execute 还必须显式传 `--raw-archive-dir <仓外绝对目录>`。 ## 红线 正式 `--execute` 会发起长时间、多角色的模型调用,**运行方式本身是合同的一部分**: - 正式 execute 必须由**持续等待的前台受控会话**运行,全程阻塞到进程自己退出并读到退出码;**禁止后台启动**。后台启动会被外部任务管理器在数分钟后按 `status=killed` 收掉,Python 来不及进 `finally`,留下 open raw lease、无 manifest、无费用回执。 - **禁止用不带 `pipefail` 的 `python ... | tail` 捕获退出码**:管道退出码默认取 `tail` 的,Python 的非零码被静默吞掉,失败关闭看起来像成功。 - 进程内对外部终止只承诺 SIGTERM / SIGINT 可收口:两者转成受控异常后迁移 raw、写安全 manifest、把在途且无回执的调用记为 `costUnknown=true` / `failureReason=EXECUTION_COST_UNKNOWN` 并禁止后续调用,最后非零退出。**SIGKILL 无法捕获**,只能事后靠 raw vault 迁移恢复与 CAS 扫描收敛残留。 - 受控终止进入最终迁移后,SIGTERM/SIGINT handler 必须保持 defer/ignore,覆盖 raw migration、CAS 收口与 manifest 原子写入;manifest 发布完成后才恢复调用方原 handler。 - 单个 raw lease 覆盖整轮串行回放。启动时按三角色中最长的单次 `timeoutSeconds + cleanupMargin` 校验剩余租期,每次模型调用前按当前角色同一公式复检,复检必须发生在消耗预算槽位和外发调用之前。租期不足时在下一笔调用前安全停止、迁移已有 raw 并保留未执行计划。 - 运行结束以 `rawDisposition.status=migrated` 与 `raw-vault-migration-receipt-v1` 证明产物已迁移,不再以删除后的 `closed` 作为完成条件。 - 生产 `--execute` 在创建 vault 或 runner 前拒绝脱敏夹具;脱敏夹具只可由离线评测适配器执行。 ## 复利合同 - **消费**:授权预算、冻结上下文与预注册样本;执行三角色回放。 - **回写**:本闸道不单独落 `example_lesson`;`status=completed` 的效果信号由 `回放评估细纲质量` 登记,盲评稳定性由 `评估内容质量` 登记。