plan playbook 同步:澄清指纹传 null,别再从 observation 抄

上一提交把两个指纹改成 Runtime 从原 delivery 补齐,但 plan 根 Supervisor
的 playbook 第 4 步还写着「并提交 observation 给出的 questionsSha256、
answersSha256」——正是这条指令让它去手抄 128 个十六进制字符。改成明确
传 null 并说明由 Runtime 补齐,加一条断言钉住。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-23 16:48:11 +00:00
parent 535eef8b58
commit af6c044851
2 changed files with 18 additions and 1 deletions
@@ -3,7 +3,7 @@
1. 本 run 第一轮只调用一次 `agent.goal_contract` 冻结目标合同:outcome 概括用户原话意图,`preferences` 必须传空数组,`acceptanceNodes` 提交 Runtime 指定的固定单节点。这一轮不做任何其它调用。
2. 冻结后立即用一次 `agent.delegate` 把任务委派给 `project-planning``expectedArtifacts``game/fast_gdd.md``repairOfDelegationId``runId``continuationOfDelegationId``questionsSha256``answersSha256` 全传 null。已有委派尚未收束时不要重复委派。
3. 等待子 Agent 期间不得调用 `respond_to_user`。Runtime 会通过 delegate 完成屏障保持同一父 run,回执到达后再继续。
4. 子 Agent 以问询信封退出时,决策卡由 Runtime 直接按信封原文呈现给用户,**不需要你调用任何工具**——你根本不会在那一刻被恢复。用户答完之后你才会拿到答案,届时为该原 delivery 创建且仅创建一次 continuation 委派,`continuationOfDelegationId``repairOfDelegationId` 都指向该原 delivery,并提交 observation 给出的 `questionsSha256``answersSha256`。子 Agent 在 continuation 里**再次**以信封退出时,对那条新 delivery 重复同一动作:「仅创建一次」约束的是单条 delivery,不是整条链,澄清预算未用尽时这个循环继续。Runtime 会在委派 task 末尾写明已用轮次与上限,不需要你自己数,也不要替它宣布预算已尽。
4. 子 Agent 以问询信封退出时,决策卡由 Runtime 直接按信封原文呈现给用户,**不需要你调用任何工具**——你根本不会在那一刻被恢复。用户答完之后你才会拿到答案,届时为该原 delivery 创建且仅创建一次 continuation 委派,`continuationOfDelegationId``repairOfDelegationId` 都指向该原 delivery`questionsSha256``answersSha256` 传 null——Runtime 会从该原 delivery 补齐权威指纹,你不要自己抄。子 Agent 在 continuation 里**再次**以信封退出时,对那条新 delivery 重复同一动作:「仅创建一次」约束的是单条 delivery,不是整条链,澄清预算未用尽时这个循环继续。Runtime 会在委派 task 末尾写明已用轮次与上限,不需要你自己数,也不要替它宣布预算已尽。
5. 回执 contractStatus=evidence-ready 且 GDD 已提交时,用 `file.read` 从第 1 行读到 `game/fast_gdd.md` 末尾取证,每次都传 `maxLines: 240`(上限),尽量一页读完;确实需要第二页时从上一页的下一行开始,不要重复读同一段。每次 `file.read` 的 observation 末尾都带着 `sourceAgentId` / `sourceRunId` / `sourceActionId` 三个字段,把它们原样抄成 evidence 的 `{agentId, runId, actionId}`,用一次 `agent.acceptance_update` 一并提交即可——evidence 是按这三个字段整体查回执的,回忆错任何一个都会被判成"缺少持久动作回执"。不要为了取这些字段再去查动作历史。取证完成前审批卡不会出现。
6. 用户在审批卡上选择修改或退回时,先用 `agent.run_status` 按原 delegationId 取回已认领的权威委派合同,把其中的 acceptanceCriteria 与 expectedArtifacts 逐字照抄进返工委派(`runId` 传 null),再把用户原话完整附在 task 里;同一原委派只能返工一次。用户通过后只做一句简短收尾。
@@ -1568,6 +1568,23 @@ mod tests {
assert!(!plan_common.contains("才能调用 respond_to_user 收束"));
}
/// 澄清 continuation 的两个指纹由 Runtime 从原 delivery 补齐,playbook 不得再
/// 要求 Supervisor 从 observation 里抄过来。实测正是那条指令让它手抄 128 个
/// 十六进制字符,抄错后工具计划格式修复两次仍失败,整个 plan 根 run 判 failed
/// 用户已提交的澄清回答全部作废。
#[test]
fn plan_supervisor_playbook_leaves_clarification_fingerprints_to_the_runtime() {
let plan = required_runtime_prompt_section("planSupervisorPlaybook");
assert!(
plan.contains("Runtime 会从该原 delivery 补齐权威指纹"),
"playbook 必须写明指纹由 Runtime 补齐:{plan}"
);
assert!(
!plan.contains("提交 observation 给出的"),
"playbook 仍在要求 Supervisor 手抄澄清指纹:{plan}"
);
}
/// 「不得替用户预先裁定产品取舍」这段同时写进两条 lane 的 playbook。
///
/// 执行层只单向拦住 plan 根(`立项策划根 Run 只能委派 project-planning`),