本轮已经补齐并实际验证了两个硬门槛:
test 环境会 fail-closed。第三个硬门槛——“真实旧版输入 → Qwen → Phase 1/2/3 → MySQL 原子发布 → 旧 detail API 回读”——尚未完整通过。目前真实链路已经稳定推进到:
真实旧版输入 → Phase 1 → Direction ACCEPT/发布 → Phase 2 → Structure Worker →
Structure Validator passed → Structure ACCEPT → Paragraph 规划
Paragraph 之后的 Compose、CandidatePortfolio、Phase 3 Root、Final UoW 和旧 detail 回读还没有在同一条真实运行中全部通过。因此当前不能宣称“真实 E2E 已完成”。
用户明确要求暂不做数据库账号/权限隔离,本轮没有扩大该范围。
2026-07-20 推送前补充:最新全量回归发现 Host 有 7 项失败,详见第 6.1 节。 这些失败尚未修复;用户随后明确要求停止测试、记录现状并提交推送。因此本报告和 对应代码只能作为有已知失败的调试交付,不能视为发布门禁通过。
execution_id=50、topic_build_id=230、topic_id=400、
account_name=创业邦。.local/agent-data 下的 Trace、Task Ledger、Artifact、owner lock 和
E2E report。127.0.0.1:13306 的受管隧道连接真实输入/测试输出库。收到停止指令后已执行:
stopping,stopped_operation_ids=[];.local/agent-data/e2e-reports/20260720T081451Z-8233aee0.json。这里的 stopping 而非 stopped 是一个需要继续修的恢复问题:原 Planner 所在进程
先被终止,另一个临时 Host 可以写 stop/fence,但不能等待已经消失的进程内 Planner
Task 正常收尾。它不代表模型仍在后台运行;当前没有 internal_e2e 进程。
| 硬门槛 | 当前状态 | 已有证据 | 剩余工作 |
|---|---|---|---|
| 真实 Runtime Factory + Auth | 已实现,针对性测试通过 | 真实 Qwen tool-call smoke 成功;内部 Runtime/Auth 测试通过;非 test 环境 fail-closed | 最终全量门禁 |
| 16 个角色模型配置 | 已实现,针对性测试通过 | manifest 覆盖 16 个 preset,Validator/Worker 温度和迭代上限可冻结 | 最终全量门禁 |
| 可执行真实全链路 E2E | 部分通过 | 真实输入、Phase 1、Direction、Phase 2 Structure 已跑通 | Paragraph→Compose→Portfolio→Phase 3→MySQL final→legacy detail |
16 个 preset 为:
script_plannerscript_direction_workerscript_pattern_retrieval_workerscript_decode_retrieval_workerscript_external_retrieval_workerscript_knowledge_retrieval_workerscript_retrieval_validatorscript_candidate_validatorscript_structure_workerscript_paragraph_workerscript_element_set_workerscript_candidate_compare_workerscript_compose_workerscript_candidate_portfolio_workerscript_root_workerscript_root_validator此前生产装配要求外部注入 Runner、PrincipalProvider 和 BuildAuthorizer,但项目内没有 一条可以直接运行真实 Qwen E2E 的内部装配路径。
修复:
AgentRunner、Qwen LLM call 和 FileSystemTraceStore;environment=test,其他环境直接拒绝启动;验证:内部 Runtime/Auth 针对性测试通过,真实 Qwen tool-call smoke 约 2.01 秒成功。
默认 thinking 会显著增加工具型调用的延迟;SDK 没有项目级请求超时和瞬态失败重试。
900016 的真实运行遇到一次 provider InternalServerError,因为当时 max_retries=0
直接中断。
修复:
create_qwen_llm_call 新增 enable_thinking、request_timeout_seconds、
max_retries;extra_body,不会丢失调用方参数。验证:Qwen Runtime options 单测和真实 tool-call smoke 通过。
真实 Runner 注册工具时,部分注解因 from __future__ import annotations 仍是字符串,
以及 A | B Union 没有完整展开,导致模型看到的工具 schema 不准确。
修复:使用 get_type_hints 解析实际类型,并补齐 PEP 604 Union schema。
验证:Agent 工具 schema 新增针对性测试并通过。
早期 E2E poll 把 mission endpoint 的 404/500 都当成“刚启动,继续等”,持久错误会表现 成假卡死。
修复:只允许启动阶段前 5 次 404/500,之后立即暴露原始 HTTP 错误。
验证:
当前 internal_e2e 每次都创建新 build,所以每发现一个后段问题,都要重新付出 Phase 1
和 Phase 2 前段的模型时间。
当前只完成了问题确认,尚未修复。详见第 7 节提速方案。
BLOCKED 子任务误认为终态900017 中 Retrieval 子任务被 Planner BLOCK 后,父 Direction 一直处于
waiting_children。Framework 中 BLOCKED 是可恢复状态,不会关闭父任务。
修复:
CANCEL,不能用 BLOCK 丢弃;BLOCK 只用于 Host 定义的 Root phase boundary;TASK_CHILD_BLOCKED,提示
CANCEL 或 UNBLOCK。验证:blocked-child 不关闭父任务的针对性测试通过。
900018 中 Direction/候选 Validator 无法读取正在验证的 artifact,只能反复查询不相关的 evidence,最终既浪费 token 又不能形成可靠 verdict。
修复:
query_validation_evidence 返回 validation snapshot 中的 current_artifacts;current_artifacts 是当前 Attempt 的精确冻结业务产物;current_evidence 返回;current_artifacts,只有存在 raw artifact ref 才读取原图。验证:候选 Validator 工具面和 frozen artifact 读取测试通过;后续真实 Structure Validator 已经用该路径给出 passed。
Runner 会累计多轮 input/output token。原 Task 32k、Phase 2 2m 上限对真实工具型运行过低, 正常验证也会被误判为 budget exhausted。
修复:
max_tokens=1,000,000;这不是要求模型必须消耗这些 token,而是防止 Host 用不现实的测试阈值误杀正常运行。
旧统计按最早 started 到最晚 completed 的墙钟跨度计算,多个阶段之间 Planner 思考和等待 也被计费,导致尚未运行很久的 Task 被判超时。
修复:只累加每个 Attempt/Validation 自己的 completed_at - started_at 区间。
验证:跨两小时但实际阶段合计 20 秒的回归测试通过。
900019 中 Planner 创建空 CandidatePortfolio/Compose 后立即 dispatch;这些容器在 adoption closure 为空时本来不可执行。随后模型试图 CANCEL 唯一 Portfolio,破坏 Phase 2 闭合路径。
修复:
验证:唯一 Portfolio 不可取消测试通过;900020/900021 已不再出现提前 dispatch/cancel。
900020 中 Portfolio scope 没有与 accepted Direction 对齐,Compose/本地候选 scope 也没有 正确嵌套;同时模型把业务 scope 当成 workspace 写路径,导致输入合同和 SQL workspace 分别失败。
修复:
scope_ref 必须等于 accepted Direction scope;write_scope=["script-build://writes"];验证:900021 已成功创建 scope 正确的 Portfolio、Compose 和 Structure。
900020 中 Worker 在多个工具之间循环,消息数和 token 快速增长。
修复:Structure prompt 写明精确步骤:读取冻结输入 → 创建各 Paragraph shell → 检查 workspace → 保存唯一 Structure artifact → submit Attempt。Paragraph、Compose 和 Portfolio 也分别补了最短工具路径。
验证:900021 的 Structure Worker 收敛到约 22 条消息、约 33k token,并通过独立 Validator 和 Planner ACCEPT。
900021 中 Structure scope 为:
.../compose/candidate-1/structure/main
5 个 Paragraph 被规划为它的兄弟:
.../compose/candidate-1/paragraph/p1 等。
Paragraph 又把 accepted Structure 作为 immutable input,因此 producer/consumer scope
既不相等也不互相包含,必然触发 INPUT_SCOPE_MISMATCH。两个 Worker 已失败,另外三个
也开始重复同一错误,所以该轮被停止。
修复:
{structure_scope}/paragraph/p1;验证:新增回归测试证明兄弟 Paragraph scope 在 Worker dispatch 前被拒绝;相关 32 个 Phase 2/Internal E2E 针对性测试全部通过。该修复尚未进行新的真实 Paragraph 运行,因为 用户要求先停止并出报告。
900022 使用同一真实输入重新启动,在收到停止指令时仍处于 Phase 1 Retrieval 阶段:Root
从 needs_replan 进入 waiting_children,3 个 Retrieval 子任务已开始。没有发现新的业务
缺陷;该轮仅因调整测试策略而人工停止。
| Build | 推进位置 | 停止原因 | 对应动作 |
|---|---|---|---|
| 900001–900015 | Runtime/E2E bring-up 的早期批次 | 均为人工取消;当前 JSON 报告只有 CancelledError,不足以可靠逐条还原 |
不对缺少证据的批次编造错误归因;其问题已按代码修复类别归入第 4 节 |
| 900016 | Phase 1 | 百炼/OpenAI-compatible provider 瞬态 5xx,SDK 无重试 | 增加 timeout/retries |
| 900017 | Phase 1 Direction 等待 children | Retrieval 被 BLOCK 后父任务永远不闭合 | BLOCK/CANCEL 语义和 dispatch guard |
| 900018 | Direction/候选 validation | Validator 看不到当前 frozen artifact;budget 偏小 | current_artifacts + budget 修正 |
| 900019 | Phase 2 容器创建 | 提前 dispatch 空容器,随后 CANCEL 唯一 Portfolio | 7 步生命周期 + Host guard |
| 900020 | Phase 2 Structure | business scope/write scope 混用;Structure Worker 循环 | scope policy + 精确 Worker 工具顺序 |
| 900021 | Phase 2 Paragraph | Paragraph 与 accepted Structure 为兄弟 scope | 四边界 accepted-input scope guard |
| 900022 | Phase 1 Retrieval | 用户要求停止,切换为局部调试策略 | 已终止进程并写 stop/fence |
所有 E2E JSON 都位于 .local/agent-data/e2e-reports/。这些文件被设计为本机运行证据,
不应提交包含环境细节或大体积 Trace 的 .local 目录。
本轮已执行并通过:
真实运行已经证明:
尚未证明:
在拆分本轮提交后、执行 push 前,实际运行了 Agent 和 Host 全量测试。结果为:
258 passed in 29.34s;201 passed, 5 skipped, 7 failed in 49.55s。7 个 Host 失败分为两类。
第一类共 6 项,均为 scripted real-runner 的 phase boundary 回归:
test_real_runner_creative_exploration_order_does_not_choose_adoption_order
的 element-first、paragraph-first、structure-first 三个参数;test_mission_service_real_runner_auto_continues_phase_one_to_phase_two_boundary;test_historical_partial_advances_via_http_and_reenters_after_filestore_reload;test_real_runner_phase_one_to_three_final_publication_and_legacy_readback。直接表现是 run_phase_one() 期望 Root 停在 PHASE_ONE_CAPABILITY_BOUNDARY,但
scripted Planner 已继续执行 Phase 2,最终停在 PHASE_TWO_CANDIDATE_PORTFOLIO_READY,
Host 因此抛出 ProtocolViolation: mission did not stop at the phase-one boundary。
已定位根因:本轮把 Phase 2 的完整七步说明及
PHASE_TWO_CANDIDATE_PORTFOLIO_READY 常量写进了所有阶段共用的基础
script_planner.md。scripted LLM 通过消息中是否出现该常量识别 Phase 2,因此在 Phase 1
就被错误激活。这不只是测试适配问题,也说明 Phase 2 指令没有严格隔离到 Host 的 signed
policy continuation,存在真实 Planner 越阶段风险。
计划修复但尚未完成:把 Phase 2 专属说明移出基础 Planner prompt,只在
build_phase_two_policy() 生成的 continuation system policy 中注入;同时在 Host 的 Root
规划入口根据受保护 phase context 强制 Phase 1 只能创建 Direction、Phase 2 只能创建
CandidatePortfolio。中断前产生的半成品 prompt 拆分已经撤销,没有纳入提交。
第二类共 1 项:
test_sql_phase_two_dynamic_replacement_compose_portfolio_and_boundary。直接表现是 ElementSet replacement 同时引用自己的旧 ElementSet 和已接受 Paragraph 时,
新 _guard_accepted_input_scopes() 报
INPUT_SCOPE_MISMATCH: element-set scope must equal or nest within accepted paragraph scope。
已定位根因:新增的 planning-time guard 比既有 authoritative
AcceptedInputResolver._validate_consumer_input() 更严格,遗漏了 ElementSet 将跨 scope
Paragraph 用于 placement 的明确合法例外。该 guard 原本用于在 Worker 启动前阻断 900021
的非法 Paragraph→Structure 兄弟 scope,但不能改变既有 ElementSet 组合合同。
计划修复但尚未完成:planning guard 必须复用或完全镜像 authoritative resolver 的 scope compatibility 规则,只为 ElementSet→Paragraph placement 保留既有例外,同时继续 拒绝 Paragraph 以兄弟 Structure 作为 base artifact 的 900021 场景。
按用户明确指示,本节记录完成后不再运行测试。因此:
不是 token 成本,而是调试循环粒度不合理:
/resume 重点覆盖 Phase 3,不能重新启动已有 Phase 2 Planner;run_phase_two 一旦检测到已存在 Phase 2 模型输出,会 fail-closed 为
MissionRecoveryRequired,这是安全设计,但缺少后续受控 replan 入口;现有代码不是完全不能恢复:
recover_operations 能把崩溃中状态归一化;/resume 可以处理 already-complete、finalize-only、Root blocked continuation;--script-build-id;stopping;CancelledError,缺少 last checkpoint、
root/task/operation 摘要和最后稳定 DomainError。后续不再采用“每修一个小问题就从真实输入 start 一遍”的方式。
Direction ACCEPT → Structure ACCEPT checkpoint;这一层应在秒级到分钟级完成,不调用真实模型。
新增内部测试能力,但不放松生产 fencing:
--script-build-id 和 --resume;recover_operations;Structure ACCEPT 测 Paragraph→Compose→Portfolio;Portfolio ACCEPT 测 Phase 3 Root;Root ACCEPT 单独测 finalize→publication→legacy detail;局部段全部通过后,再新建一个干净 build,执行:
真实旧版输入 → 真实 Qwen → Phase 1 → Phase 2 → Phase 3 → Root ACCEPT →
MySQL Final UoW → publication/artifacts published → accepted pointer → branch0 digest →
build success → legacy detail readback
随后统一运行 Agent 全量、Host 全量、MySQL release gate、Ruff、format check、strict
mypy、compileall 和 git diff --check。只有这些全部通过,第三个硬门槛才标记为完成。
这是调试预估,不是完成承诺。后半段尚未首次真实跑通,任何新的框架级缺陷都会增加时间; 但采用分段和恢复后,不再为同一个后段错误重复支付整个前半程时间。