上游 2026-09-18 同步与 ProjectAgent 校验迁移
状态:implemented 类型:architecture Owner:backend/package/yuxi/services/agent_request_service.py
问题
上游 23 个 commit 重构了 Agent 请求接入与运行上下文准备(a7f10198 等),删除 backend/package/yuxi/services/run_submission_service.py 并新增 agent_request_service.py。元垒的项目数字员工提交边界校验和项目覆盖读取落在被删除或被重构的文件中,直接接受上游会丢失"绑定 Agent 只能在绑定项目内运行"的 fail-closed 语义。同步还涉及 agent_repository.py、agent_router.py、chat_service.py、agent_run_manifest_service.py、scheduled_agent_service.py、context_compression_service.py、run_worker.py 与工程契约脚本的双侧修改。上游同时移除了 agent_manager、改用 get_agent_backend,并把内置角色落库重构为 AgentPreset,元垒新文件必须跟随。
决策
- 接受上游请求接入重构:删除
run_submission_service.py,请求校验与持久化归agent_request_service.submit_agent_request。ProjectAgent 范围校验保留双侧:intake 在重放与新建两条路径调用ensure_agent_project_scope,执行侧在agent_run_manifest_service.prepare_run_execution与chat_service._resolve_agent_runtime校验。 - 项目覆盖读取迁移到上游新路径:
agent_request_service._persist_request在resolve_agent_run_config前加载load_project_agent_override;prepare_run_execution在context.update_config前合并覆盖;context_compression_service同样合并;resume 继续继承父 Run 的input_payload。 - 上游执行准备入口
prepare_run_execution接收git_repositories与project_git_enabled,写入 Context 并进入 manifest;run_worker统一通过prepare_and_record_run_execution固化清单与指纹,删除元垒旧入口build_run_manifest_result。 - 冲突文件按「上游结构 + 元垒语义」合并;
verify_engineering_contracts.py同时保留上游as_posix路径修复与元垒双 decision 根校验。 - 上游 MCP 远程化、
AgentPreset内置角色、子智能体独立观察、审批中断骨架恢复、.xls解析等 R1 变更全部接受。 - 顺手修正 HTTP 层
api_token的长度上界(str,1~4096),与 service 既有校验一致,使分支上既有红色测试恢复为真;service 校验保留为纵深防御。
替代方案
- 只保留 intake 校验:拒绝。执行入口不限于 Web Chat,resume、定时任务与主动上下文压缩都可能到达执行边界,单点校验会留下绕过路径。
- 保留
run_submission_service.py兼容层:拒绝。会形成第二个请求接入 Owner,与上游重构后的单一入口冲突。 - 保留
build_run_manifest_result作为元垒入口:拒绝。上游PreparedRunExecution同时拥有 Context 与 manifest,双入口会造成两套执行准备语义。 - 把项目范围校验放进 repository 查询:拒绝。repository 只拥有可见性查询,绑定语义与有效配置合并属于 service 用例。
- 暂缓同步直到元垒功能冻结:拒绝。基线会继续漂移,冲突面随上游重构扩大。
后果
- ProjectAgent 语义落在新入口的 intake 与既有执行边界;上游后续修改请求接入、执行准备或 manifest 时以本记录和功能索引为准。
- manifest schema 版本保持 3:合并上游 v2 演进与元垒
git_repositories身份快照。 - 上游单测需要适配元垒 scope 与项目覆盖:
test_agent_request_service、test_chat_service_sync、test_agent_run_manifest_service、test_context_compression_service、test_agent_run_service已更新,并在请求队列测试中新增项目覆盖断言。 - 基线更新到
5a1bdc3c;合并完成时上游跟踪引用已前进到1946c3d7,下一次同步报告会显示该差异。 test_schema_migration_version.py的 2 个 PJ1 基线失败与技能并发 flake 不是本次合并引入,保持既有未验证状态。- HTTP 层拒绝超长 Token 后,非法请求不再进入 service;响应与日志仍只包含固定脱敏文案。
验证
- 后端全量 unit:
docker compose exec -T api uv run --no-sync --group test pytest test/unit -m "not slow" -q:2293 passed、57 skipped。环境缺少新增依赖xlrd,通过uv run --with "xlrd>=2.0.1"覆盖提供;这是环境补齐,不是测试豁免。 - PostgreSQL integration:
test_schema_migration_version.py10 passed、2 个既有 PJ1 失败;test_agent_request_queue_concurrency.py与test_project_agent_api.py8 passed、4 skipped(缺TEST_USERNAME/TEST_PASSWORD)。 - Web:
pnpm run lint:check、pnpm run test:unit(367 passed)、pnpm run build全部通过。 - Ruff(pinned 0.16.4):
ruff check package、ruff format package --check、ruff check --select I package全部通过。