6.7 KiB
PI runner 环境错配(MISSING_TARGET)测试报告
一、 测试背景 (Background)
test 环境用户发送「1」确认推进后,对话返回 INTERNAL_ERROR / fatal,upstream 为 step step_03_regulatory failed: MISSING_TARGET(requestId req_1790558986255320703,session sess-p5-u32)。
已证实根因:test 服务器进程的 PI_AGENT_RUNNER_URL 来自根 .env 的 dev sidecar http://127.0.0.1:18865,压过 configs/.env.test 的端口约定 18866。dev sidecar 的 resolveWorkspace 把 data/test/workspaces/... 重写到 data/dev/workspaces/... 影子目录。影子目录没有 context/、template.md、blackboard.json,模型无法写出 output.md,runner 报 MISSING_TARGET,步骤按 permanent-missing 不再重试。
二、 测试目标 (Test Objectives)
- test 进程连到本环境 sidecar
18866,不再使用根.env泄漏的18865。 - 发往 runner 之前,工作区必须位于该 runner
data_dir之下;不一致时 fail-fast,错误码RUNNER_MISMATCH。 - 与故障同构的确认「1」推进 V0.5 时,
bd_research(含原先失败的step_03_regulatory)在data/test/workspaces本地执行并成功,且不在data/dev/workspaces生成影子目录。
三、 测试方案与环境 (Test Plan & Environment)
- OS:Linux;test 后端
bin/agent-server-testpid1222963,ENV=test,DATA_DIR=/home/weichen/projects/Agent-System/data/test。 - 启动:worktree 内
env -u PI_AGENT_RUNNER_URL ./scripts/launch-single.sh test。sidecar18866已健康,脚本未重启 sidecar。 - 层级:
go test覆盖 agent/stream/errcode;产品验收为 test 环境真实 PI runner(MiniMax-M2.7-highspeed),对话sess-p5-u32发送「1」,命中ADVANCE_STAGE/EXPECTATION_HIT,目标阶段V0.5_feasibility。 - 验收会话为一次性
auth_sessions行(user 32),验收后已revoked_at。令牌未写入本报告。
四、 预期结果 (Expected Results)
- 进程环境
PI_AGENT_RUNNER_URL=http://127.0.0.1:18866;18866的data_dir为data/test/workspaces。 - 首次
/v1/run前日志出现pi runner data_dir check passed。 bd_research七步completed,step_03_regulatory/output.md非空,且路径在 test 工作区。- 不出现
MISSING_TARGET/RUNNER_MISMATCH。 - 单测:data_dir 不一致时不调用
/v1/run;一致时透传;分类码为RUNNER_MISMATCH且不泄漏路径。
五、 实际测试结果与判定 (Actual Results & Evaluation)
用例 1:进程指向与健康检查
- 输入:重启后读
/proc/1222963/environ,GET /health,GET两个 sidecar/health。 - 输出:
PI_AGENT_RUNNER_URL=http://127.0.0.1:18866;DATA_DIR=.../data/test;应用 healthschema_version=78、agent_backend=pi-agent;18866data_dir=.../data/test/workspaces;18865 仍为.../data/dev/workspaces。见assets/2026-09-28-pi-runner-env-mismatch/unit-and-runtime.txt。 - 判定:PASS。
- 说明:新二进制首次启动把 test 库 schema 从 77 升到 78(
00078只新增error_events,加法迁移)。这是基线已有迁移随本次二进制生效,不是 runner 修复本身。
用例 2:真实对话推进(与故障同构)
- 输入:
POST /api/v1/chat/stream,session_id=sess-p5-u32,project_id=5,message=1,client_turn_id=e2e-pi-runner-20260928。 - 输出:
- HTTP 200,
X-Request-Id: req_1790565623110640277。 - 意图
ADVANCE_STAGE,分支EXPECTATION_HIT,目标V0.5_feasibility。 - 服务器日志三次
pi runner data_dir check passed(并行前三步)。 - sidecar 工作区全部位于
data/test/workspaces/bizdev/stage_V0.5_feasibility_1790565623120057798/...。 bd_research七步均为completed;tasks/03_regulatory/output.md19851 字节;工作区含context/knowledge/hits.md。- 同名目录在
data/dev/workspaces不存在。 - SSE
done.status=completed,duration_ms=1046800。对话流中无MISSING_TARGET、INTERNAL_ERROR、RUNNER_MISMATCH。 chat_turns.id=32状态completed。
- HTTP 200,
- 判定:PASS(本次缺陷:错配导致的 MISSING_TARGET 未再现,原先失败步骤在 test 工作区成功)。
- 耗时:整段 SSE 1046.8s(03:20:23Z–03:37:49Z)。
step_03_regulatory阶段事件耗时 151081ms。
摘录:assets/2026-09-28-pi-runner-env-mismatch/sse-phases.txt、server-data-dir-check.txt、sidecar-workspace-lines.txt。
用例 3:阶段链在质量门禁处停止(非本次缺陷)
- 实际:
bd_research质量门禁 100/100 后,bd_feasibility_dev两步执行完成,门禁 85/100,原因「缺少必填章节: 输入摘要」。classifyStageTaskHalt按既有规则停止阶段链,后续bd_feasibility_reg、bd_user_requirements、bd_prelim_design未启动。 - 对话文案仍写「已为您成功推进并完成了【V0.5…】」。协调器在
ExecuteStage返回err=nil时不读取Success=false(internal/coordinator/engine_stage.go)。数据库projects.id=5的current_stage仍为V0.1_triage。 - 判定:不计入本次修复 FAIL。这是质量门禁停链与成功文案不一致,超出本任务范围(不改
resolveWorkspace、不改 phase 归类、不改质量门禁)。
数据质量警示
2026-09-28 01:40 与 01:56(UTC)两次在错配 runner 下生成的 V0.5 产物未读 test 侧 context/。本任务不清洗、不自动重跑,由业务 owner 决定是否作废重做。
六、 自动化测试套件汇总 (Test Suite Execution)
在 worktree fix/pi-runner-env-mismatch-2026-09-28 执行:
go test ./internal/agent/ ./internal/stream/ ./internal/errcode/ -count=1:三包ok。go test -run TestPiAgentRemoteRunner_DataRoot与TestClassifyError_RunnerDataRootMismatch:PASS。完整输出见assets/2026-09-28-pi-runner-env-mismatch/unit-and-runtime.txt。
未跑全仓 go test。产品链路以第五节真实 PI 为准,不用 stub。
七、 测试结论与后续优化建议 (Conclusion & Next Steps)
本次授权范围内的缺陷已关闭:test 进程连接 18866,工作区与 runner data_dir 一致,bd_research 全步骤(含原 MISSING_TARGET 的法规初筛)在 test 工作区成功。
残留(不在本任务实施):
- 质量门禁未通过时阶段链停止,但协调器文案仍宣称阶段完成;项目阶段列未更新。
- 错配期间已生成的文档需要业务 owner 决定是否重跑。
五态(收口时填写):review_state=accepted;integration_state 以合入结果为准;deployment=test 环境已用本 worktree 二进制重启(schema 78);cleanup=pending;remote_sync=not_requested。