Files
Agent-System/.doc/ops/short-term/2026-09-26-swboot-closeout.md
T

4.6 KiB
Raw Blame History

workflow-swboot 收口:SWBOOT-10 非 stub + L5 真实 PI + L6 UI 二次验收(short-term)

  • task_id: swboot-closeout-2026-09-26
  • owner: pi
  • status: in_progress
  • 授权来源: 用户会话指令「把 FEATURE-MATRIX 中的 workflow-rdev、workflow-swboot 推进至完成…严格按规范」——构成 W5 关闭条件中「SWBOOT-10 非 stub + 真实 PI + UI 二次验收」的待授权项授权
  • write_scope: internal/swboot, internal/projectworkflow, internal/server, deploy/postgres/goose, .doc
  • mutex: workflow-design
  • base_dev_sha: d0f3f76f7e
  • capabilities: docs:publish, docs:approve, env:dev
  • policy_revision: AGENTS 2026-09 / agent-worktree-workflow r1 / validation-contract 2026-09-21 / swboot 设计 §12(受控代码执行层安全边界)
  • review_state: pending
  • integration_state: pending
  • deployment: pending
  • cleanup: pending
  • remote_sync: not_requested

一、当前进度分析

SWBOOT-00..09 已合入并 L1–L4 验收;SWBOOT-10 为 fail-closed stub:controlled_patch 在 catalog 预览与 projectworkflow.CreateProject 双双拒绝;RepoAllowlist.ExecuteControlledPatch/ApproveMerge 恒拒;goose 00048 的 repo_path_allowlist / project_source_bindings 零运行时读写(Wave5 X-3 deferred)。L5(真实 PI advisor)/ L6(UI 二次验收)pending auth。

二、方案(按设计 §12 安全边界的最小闭环)

2.1 SWBOOT-10 受控补丁执行器(fail-closed)

  1. DB allowlist(接线 goose 00048 表):swboot.PGRepoAllowlist 读 repo_path_allowlist(enabled 行);空表 = 拒绝一切(deny-all)。
  2. 创建门禁解锁:projectworkflow 增加可选 RepoAllowlistChecker;CreateProjectInput.RepoPath——controlled_patch 仅当提供 RepoPath 且通过 allowlist 时放行,并在创建事务内写 project_source_bindings(permission_scope=controlled_patch);checker 未注入时维持拒绝(fail-closed)。catalog 预览:controlled_patch 仅当 RepoAllowlisted=true 视为有效。
  3. 执行器 swboot.ControlledPatchExecutor:
    • 前置:路径在 DB allowlist;base ref 显式;补丁为 unified diff 文本
    • 隔离:git worktree add feature/swboot-<slug> <base>(永不直接改工作树/保护分支);补丁先 git apply --check 再应用
    • 命令:仅允许管理员 system_settings 键 swboot.test_commands(逗号分隔前缀;默认空=零命令);clean env(仅 PATH/HOME),cwd=worktree,单命令超时与输出上限,失败即停不重试
    • 产物:变更文件清单 + sha256、命令退出码/耗时/截断输出;记录持久化到新表 swboot_controlled_executions(goose 00074)
    • merge/push/deploy 永不执行:ApproveMerge 改为类型化「需独立授权」边界错误(设计 §10:批准执行≠批准合并)
  4. 服务端最小面:POST /projects/{id}/swboot/executions(创建者)+ GET 列表;POST /projects/{id}/swboot/bindings(创建者补绑/校验)。

2.2 L5 真实 PI

RUN_PI_E2E=1 go test ./internal/app/ -run TestPiSoftwareBootstrapAdvisor_LiveMiniMax(dev Runner :18865)在当前 HEAD 复验。

2.3 L6 UI 二次验收

新增 web/e2e/swboot-wizard.spec.ts(RUN_UI_ACCEPTANCE=1 门禁,真实 dev 栈):登录 → 创建向导切「纯软件」→ solo 未评审横幅 → catalog 类型选择 → 必填问题/用户/结果 → 创建成功进入项目(无医疗污染词);注册 README 矩阵与 npm 脚本;Playwright docker 容器实跑。

三、计划

  1. 分析(§一)
  2. 实现 §2.1(goose 74/75、PG allowlist、executor、projectworkflow/catalog 门禁、server 端点)+ 单测(dev 4965e74d,列名修复 70f3028c/86e0cf46)
  3. 工程门禁 + 候选集成 dev(含 app→swboot 边界登记)
  4. L5 复验(LiveMiniMax PASS 9.8s)+ L6 e2e 实跑(docker Playwright 1 passed)
  5. 测试报告 + 矩阵行升 done + 收口清理

四、结果登记

  • review_state: done(单测 9 项 + 工程门禁 + 既有契约更新)
  • integration_state: done(dev 4965e74d→86e0cf46 三轮候选合入)
  • deployment: dev_runtime_verified(schema 75;SWBOOT-10 全链 + 三负例 + L5/L6)
  • 验证结论: W5 关闭条件全满足,见 收口报告
  • 过程修复: 绑定列名 source_ref(创建 500 残留 + 端点 409 误报)
  • cleanup: 本任务 worktree 按门禁清理
  • remote_sync: not_requested(本地 dev 前进,未 push)