75 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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` 的效果信号由 `回放评估细纲质量` 登记,盲评稳定性由 `评估内容质量` 登记。