muse-agent-example/docs/2026-07-24-Gate-A-正文智能体职责重构记录.md
zizi b0bc7a8745 框架: 技能按动作-对象重组 + 先审后入创作闭环
一、技能重组(动作-对象命名)
- 旧目录 clean/confirm/continuation/db/detect/embed/… 重组为
  clean-book-text/decide-candidate/write-next-chapter/access-database/
  check-content-consistency/embed-knowledge/…(git 识别为 rename,内容保持)
- agents/*.md、AGENTS.md/CLAUDE.md 收编、example_skill 登记表同步新名

二、先审后入创作闭环(本次核心)
正文接受从"机械门一过就写正典"改为"机械门+语义审查双通过+用户批准+单事务原子提交",
DB 级兜底,编排层跳步即被硬拒。
- candidate_cas.py + example_candidate_cas(109):持久化 CAS 状态链
- fact_delta.py + example_fact_delta/example_fact_ledger(106):结构化事实增量,
  模型只提六型闭集增量+正文证据引文,仅用户批准的增量随正文同事务入账本
- projection_registry.py + example_projection_run(107):投影登记与恢复
- acceptance_state.py:接受前置实时状态重读
- lesson_registry.py + example_lesson(108):经验升格链,禁止自动升格
- DDL 105:example_candidate 增 semantic_status/semantic_report_sha256
- write_canonical.accept:语义兜底+同事务合并增量+登记投影;
  run_writer_pipeline/persist_writer_run/run_writer_semantic_detector/step2 接入全链
- claude_runtime:兼容新 CLI modelUsage 信息字段

三、审查修复(独立子代理四维审查后)
- 事实增量 propose→approve 翻态正道,不撞唯一键
- 冻结配置探针重刷(CLI 2.1.211→2.1.231 漂移),profileSha256/adapterVersion 再登记
- 可视化合同悬空路径/五六空间矛盾、 SoT 旧技能名漂移、行尾空白清理

测试:离线 65 套 + 真实库集成 5 套(CAS/接受故障注入/事实增量/投影/经验升格)+ 回放 79 项全绿。
创作内容(docs/design、生成正文 artifacts)按"框架与创作分开"未入本提交。
2026-08-14 10:24:08 +08:00

6.7 KiB
Raw Blame History

Gate A 正文智能体职责重构记录

类型:历史执行记录,非 SoT。 日期:2026-07-24 用途:保留 Gate A 调试证据、问题定位、用户决策和当时的实现漂移。不得使用本文替代稳定合同或推断代码运行态。

权威来源

  • Writer、冻结和输出合同:父仓专题-03。
  • Gate 裁决:父仓专题-04。
  • adapter 隔离和执行边界:父仓专题-05。
  • Gate A 具体执行配置:.claude/skills/evaluate-frozen-replay/configs/writer-gate-a-deep-space-v1.json。

背景

Gate A 用《深空之影》5 个固定样本检查正文回放链路:489 战斗、321 人物对话、544 转折、199 信息揭示、523 老角色回归。每个样本冻结到 targetChapter-1,对比 A 通用原文检索、C 卡索引后回读原文和 B card-only 负对照。

work8 的 116 个升格窗口完成后,Gate A 进入正式执行前调试。该背景只说明执行顺序,不代表 Gate A 已通过。

旧 Writer 输出问题

当时的 WriterOutput v1 要求 writer 在一次 Claude 调用中同时输出:

  • 一章 candidateBody;
  • claimLedger[];
  • evidenceRequests[];
  • newSettingDeclarations[];
  • selfCheck;
  • run/context/candidate 版本与接受状态;
  • candidate/context hash;
  • claim 的 Unicode code point offset 和重复 candidate hash。

这个合同把正文创作、事实抽取、补证规划、新设定申报和密码学/索引计算混在一轮。对于约 6000-7000 汉字正文,这些机械事项增加了大量非创作负载。

还发现一个事实合同矛盾:Gate A 的 A/C/B factEvidence[] 可能为空,而旧 claim ledger 要求 writer 填写 factEvidenceId。没有事实证据时,writer 既无法生成合法引用,也不应虚构 ID。indexHints 只是诊断索引,不能被当作事实证据。

运行调试证据

以下均是当时保留的受控调试事实,不代表后续配置或稳定合同的状态:

  1. Claude CLI 路径为 /Users/qingse/.nvm/versions/node/v24.15.0/bin/claude,版本 2.1.211,二进制 SHA-256 为 5a728a76198b6eca7f3c7cdbff43bab44b77b48c2108f7a3107d889773382629,模型别名 opus 解析为 claude-opus-4-8[1m]。
  2. 早期两次极小 Opus 探针等待约 177 秒和 186 秒后因 API 503 失败;响应同时出现 subtype=success、is_error=true、terminal_reason=api_error。因此 subtype=success 不能单独代表调用成功。
  3. 一次旧 profile 的成功 structured-output 能力探针记录单次成本 $0.003885,证明 CLI envelope、完整模型 ID 和回执字段可解析。该回执绑定旧 schema/prompt,不能证明其他合同一致。
  4. 一次小 writer smoke 在 600 秒 deadline 内约 90.8 秒完成,记录成本 $0.097686,输出通过当时的结构校验。
  5. 544-A 长输入约 47.9k 字符,在 300 秒 deadline 下返回 WRITER_TIMEOUT;将 deadline 增加到 600 秒后仍返回 WRITER_TIMEOUT。
  6. 将 544-A 的 deadline 增加到 1200 秒且单次 cap 设为 $0.666666 时,返回 WRITER_BUDGET_EXCEEDED。
  7. 在一次临时调试中将单次 cap 提高到 $6.666666、deadline 保持 1200 秒,返回 WRITER_SCHEMA_INVALID。该结果只证明旧大 JSON 合同未稳定交付,不证明正文文学质量不可用。

raw prompt/response 被允许保留于仓库外受控 raw vault;本文不包含 raw 内容、raw 路径或认证 token。

预算决策与口径修正

用户批准 Gate A 总预算 $300,并将 writer、semantic detector、blind judge 的单次 Claude cap 设为 $5。三角色各最多 150 次是独立安全授权上限,不是 Gate A 的实际调用清单。

Gate A 5 个样本的预注册调用是:

角色 每样本 5 样本预注册上限
writer A/B/C 各 1 次 15
semantic detector 每候选 1 次 15
blind judge 2 次,不稳定时第 3 次 15

最多 45 次预注册角色调用在 $5/次 cap 下的启动预留为 $225。当时的预算预检代码使用 maxCalls * cap,计算出 $2250并阻断启动。该口径混淆了“预注册调用清单”和“独立安全上限”。

职责重构决策同时要求:启动时按预注册调用清单预留;每次调用前同时检查累计实际成本、未结算预留和角色调用数;任一即将超过 $300 或对应 maxCalls 时,在下一调用前停止。补证、返修和重跑必须建立新的显式调用清单和预算预留。

职责重构决策

2026-07-24 确认的方向:

  1. writer 的唯一创作输出是一章 candidateBody;可使用最小单字段 JSON envelope 适配 Claude structured output。
  2. deterministic candidate adapter 在 writer 返回后负责 NFC/LF 规范化、candidateSha256、run/context/version/acceptance 绑定、篇幅检查和回执;adapter 不得创作或改写正文。
  3. semantic detector 使用独立 fresh Claude 调用,输出事实 claims、证据/硬约束 verdict、新设定候选和证据缺口。模型不计算 hash 或 Unicode offset;它返回可定位 quote,adapter 确定性解析区间,歧义时失败关闭。
  4. blind judge 的每个 reviewer 使用独立 fresh 调用,只评分和判定,不改正文、不代替 detector 做事实抽取。
  5. detector/coverage gate 发现缺口后,由编排器生成新检索快照并启动新 writer 调用;不在旧 writer 输出中混入补证请求。
  6. factEvidence[] 为空时,detector 显式输出 gap/unknown/unsupported;writer 不虚构 factEvidenceId,indexHints 不作为事实证据。

记录结束时的实现漂移

本记录形成时,agent-example 中的 writer schema/prompt/adapter、semantic detector 合同、judge 合同和预算启动预检仍主要面向旧合同。职责重构方向尚未形成与父仓唯一 SoT 一致的完整代码、schema、prompt、profile hash 和离线测试证据。

因此,该时点的 Gate A 不得继续使用旧大 JSON Writer 合同做正式执行,也不得从 dry-run、探针或单个 smoke 结果推断正文层已通过。

后续动作(历史待办)

  1. 由父仓 Writer 合同唯一 owner 更新稳定设计,避免 agent-example/docs 产生第二份 SoT。
  2. 依唯一 SoT 更新 writer/detector/judge 的 schema、prompt、adapter 和预算累计。
  3. 为单一职责、空 factEvidence、quote 歧义、预算边界、raw vault 和 GateInputBuilder 增加离线测试。
  4. 使用新 schema/prompt/profile 重新绑定 runtime probe。
  5. 主代理复核代码差异、离线测试、预算合同和 dry-run 后,再决定 Gate A 正式执行。