From 01a783b8d5bf742ad131fee2dedf524fc2d1d02d Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 16 Sep 2026 15:45:08 +0000 Subject: [PATCH] test(swboot): SWBOOT-09 L1 suite and acceptance report Update catalog size expectations to five workflows and archive the unit-test report; sync FEATURE-MATRIX and task docs without merging to dev. Co-authored-by: Cursor --- .doc/ops/CURRENT.md | 2 +- ...ftware-project-bootstrap-implementation.md | 15 +- .../2026-09-16-software-project-bootstrap.md | 24 ++-- .doc/status/FEATURE-MATRIX.md | 2 +- ...-software-project-bootstrap-test-report.md | 135 ++++++++++++++++++ internal/server/project_workflow_api_test.go | 8 +- 6 files changed, 168 insertions(+), 18 deletions(-) create mode 100644 .doc/test-reports/2026-09-16-software-project-bootstrap-test-report.md diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 6e4aa175..18c72e19 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -13,7 +13,7 @@ | owner | task | branch | worktree | mutex | status | |-------|------|--------|----------|-------|--------| -| Cursor-Auto | 2026-09-16-software-project-bootstrap | feature/software-project-bootstrap | - | workflow-design | in_progress | +| Cursor-Auto | 2026-09-16-software-project-bootstrap | feature/software-project-bootstrap | .worktrees/feature-software-project-bootstrap | workflow-design | in_progress | | Cursor | 2026-09-16-full-backlog-override | docs/override-nogo-full-backlog | - | architecture-docs | in_progress | | Cursor | 2026-09-16-gitea-nightly-docker-datadir | fix/gitea-nightly-docker-datadir | - | ci | done | | Cursor | 2026-09-16-gitea-nightly-host-tools | fix/gitea-nightly-host-tools | - | ci | done | diff --git a/.doc/ops/long-term/2026-09-14-software-project-bootstrap-implementation.md b/.doc/ops/long-term/2026-09-14-software-project-bootstrap-implementation.md index eff609ea..5dc1915a 100644 --- a/.doc/ops/long-term/2026-09-14-software-project-bootstrap-implementation.md +++ b/.doc/ops/long-term/2026-09-14-software-project-bootstrap-implementation.md @@ -1,6 +1,6 @@ --- title: "纯软件项目自举工作流实施" -status: planned +status: in_progress created: 2026-09-14 updated: 2026-09-16 --- @@ -22,6 +22,19 @@ updated: 2026-09-16 - 真实 PI 和 Ubuntu 无头浏览器黄金项目验收通过; - 未实现受控代码执行前,系统不会直接修改项目仓库。 +## 实施进度(2026-09-16) + +| Epic | 状态 | 说明 | +|------|------|------| +| SWBOOT-00 | done(契约) | ADR `.doc/adr/2026-09-16-software-project-bootstrap-keys.md` | +| SWBOOT-01 | done(迁移) | goose `00048` additive;活验待集成槽 | +| SWBOOT-02..04 | done(L1) | manifests + catalog 五 key;医疗三门禁保留 | +| SWBOOT-05..08 | partial | 后端 catalog/creation-preview/create 字段;七步 UI / 对话路由未做 | +| SWBOOT-09 | partial | L1 单测报告已出;真实 PI/UI NOT RUN | +| SWBOOT-10 | stub only | allowlist + fail-closed;无真实 patch/merge | + +分支:`feature/software-project-bootstrap`(**未合 dev**)。 + ## 实施拆分 | Epic | 范围 | 依赖 | 验收 | diff --git a/.doc/ops/short-term/2026-09-16-software-project-bootstrap.md b/.doc/ops/short-term/2026-09-16-software-project-bootstrap.md index 2f2785b7..1707ad4d 100644 --- a/.doc/ops/short-term/2026-09-16-software-project-bootstrap.md +++ b/.doc/ops/short-term/2026-09-16-software-project-bootstrap.md @@ -5,7 +5,7 @@ created: 2026-09-16 updated: 2026-09-16 owner: Cursor-Auto branch: feature/software-project-bootstrap -worktree: "-" +worktree: ".worktrees/feature-software-project-bootstrap" mutex: workflow-design --- @@ -33,23 +33,25 @@ mutex: workflow-design ## 步骤 1. [x] 认领 CURRENT + short-term -2. [ ] ADR -3. [ ] goose 00048 -4. [ ] manifests + catalog allowlist -5. [ ] create-project wizard hooks + SWBOOT-10 stub -6. [ ] unit tests + test-report +2. [x] ADR +3. [x] goose 00048 +4. [x] manifests + catalog allowlist +5. [x] create-project wizard hooks + SWBOOT-10 stub +6. [x] unit tests + test-report 7. [ ] push feature 分支 ## 验收标准 -- [ ] 医疗三工作流目录与校验无回归 -- [ ] 软件两 key 可选且无医疗默认语义 -- [ ] 迁移 additive,旧项目不误分类 -- [ ] SWBOOT-10 仅 stub,拒绝真实执行 -- [ ] 测试报告落盘 +- [x] 医疗三工作流目录与校验无回归(L1) +- [x] 软件两 key 可选且无医疗默认语义 +- [x] 迁移 additive,旧项目不误分类(SQL 已写;活验 NOT RUN) +- [x] SWBOOT-10 仅 stub,拒绝真实执行 +- [x] 测试报告落盘 ## 相关链接 +- ADR: `.doc/adr/2026-09-16-software-project-bootstrap-keys.md` - 设计: `.doc/system-design/2026-09-14-software-project-bootstrap-workflow.md` - Backlog: `.doc/ops/long-term/2026-09-14-software-project-bootstrap-implementation.md` - Checklist: `.doc/ops/checklists/2026-09-14-software-project-bootstrap-acceptance.md` +- Test report: `.doc/test-reports/2026-09-16-software-project-bootstrap-test-report.md` diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index 61987c24..19369d13 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -55,7 +55,7 @@ | 对话数据治理(D7) | 留存/删除口径、库·备份·日志控制、敏感字段加密边界 | deferred | deferred_enhancement(违规则升 blocker) | [计划](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) Scope Boundaries | 先数据分类与现状盘点;确认当前基线违规 → 立即写 gap-matrix | `chat` | | 智能体小队 | 角色-任务-工作区-黑板 | done | non_blocker | [agent-squad](../system-design/agent-squad/);[test 2026-09-07](../test-reports/2026-09-07-dynamic-squad-planning-test-report.md) | 非关键步骤降级(A5/A6)属 backlog | `squad` | | 工作流治理 | 三正式工作流、设置页/DutyMode、动作级鉴权、真实 PI 三工作流 E2E、full/none 混合长链 | done | non_blocker | [三工作流整改](../remediation/2026-09-12-three-workflows-strict-governance-remediation.md);[409/职责](../test-reports/2026-09-14-workflow-plan-409-frozen-and-optional-duties-test-report.md);[鉴权](../test-reports/2026-09-14-governance-action-level-authz-test-report.md);[PI E2E](../test-reports/2026-09-16-pi-three-workflow-e2e-test-report.md);[Wave2 full/none](../test-reports/2026-09-16-wave2-real-pi-evidence-test-report.md) | full 跨用户审批 + none 免审批不阻塞已签。纯软件自举仍独立 planned | `workflow` | -| 纯软件项目自举 | 软件项目创建、Bootstrap、Delivery、受控工程交接 | planned | deferred_enhancement(明确不挡首发) | [设计](../system-design/2026-09-14-software-project-bootstrap-workflow.md);[调研](../ops/research/2026-09-14-software-project-bootstrap-current-state.md);[总控](../ops/short-term/2026-09-16-full-backlog-override.md) | **覆盖授权实施中**:SWBOOT-00…09;SWBOOT-10 仅 stub | `workflow-design` | +| 纯软件项目自举 | 软件项目创建、Bootstrap、Delivery、受控工程交接 | partial | deferred_enhancement(明确不挡首发) | [设计](../system-design/2026-09-14-software-project-bootstrap-workflow.md);[ADR](../adr/2026-09-16-software-project-bootstrap-keys.md);[L1 报告](../test-reports/2026-09-16-software-project-bootstrap-test-report.md);[总控](../ops/short-term/2026-09-16-full-backlog-override.md) | SWBOOT-00…09 L1 已落 `feature/software-project-bootstrap`(未合 dev);SWBOOT-10 stub only;真实 PI/UI NOT RUN | `workflow-design` | | IAM / 鉴权 | 项目级 API 鉴权 + RBAC;会话/阶段授权 | done | 加固 | [v3 full inventory](../audit/authorization-matrix-v3-full.md);[session 中断](../test-reports/2026-09-16-iam-route-inventory-test-report.md);[fail-closed](../test-reports/2026-09-16-wave1-iam-fail-closed-test-report.md);[410 策略](../audit/2026-09-16-bug11-410-retire-decision.md);[R13](../audit/2026-09-16-r13-data-safety-checklist.md) | 全路由 inventory + session 中断负例 + 410 冻结 + R13 基线已签 | `authz` | | 文档治理 | 法定文档生命周期 + 租约 + 受控正文读取 | done | non_blocker | [docgov](../test-reports/2026-09-08-docgov-lifecycle-and-claiming-framework-test-report.md);[正文 UI](../test-reports/2026-09-14-controlled-content-ui-acceptance.md);[canonical hash](../remediation/2026-09-14-controlled-content-canonical-hash-remediation.md) | 项目 143 只读;不终止 | `docgov` | | 文档版本 baseline | 账本、人工修订、确定性 diff+lineage、运行时 UI、负责人通知 | done | non_blocker | [管理](../test-reports/2026-09-13-document-revision-management-test-report.md);[Round20 UI](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[ADR](../adr/2026-09-13-document-version-boundary.md) | **before**:完整 PI narrative 混入 → **after**:迁「PI change-report 叙事」。fallback 报告是本行内显式行为,不是缺口 | `docgov` | diff --git a/.doc/test-reports/2026-09-16-software-project-bootstrap-test-report.md b/.doc/test-reports/2026-09-16-software-project-bootstrap-test-report.md new file mode 100644 index 00000000..93dfb47f --- /dev/null +++ b/.doc/test-reports/2026-09-16-software-project-bootstrap-test-report.md @@ -0,0 +1,135 @@ +# 纯软件项目自举(SWBOOT-00..09)测试报告 + +## 一、 测试背景 (Background) + +工作流引擎已声明 `non_medical_software`,但正式目录与创建入口仍硬编码医疗三工作流。本轮在 `feature/software-project-bootstrap` 落地 SWBOOT-00..09 契约、迁移、manifest、目录白名单、创建向导后端钩子,以及 SWBOOT-10 allowlist stub(无真实 patch/merge)。医疗既有三工作流保持不变。 + +## 二、 测试目标 (Test Objectives) + +- `software_bootstrap` / `software_delivery` manifest 可校验且无医疗默认语义污染 +- 正式可选 key 扩展为 5,医疗固定文档数门禁仍仅约束医疗三 +- 创建预览拒绝 `controlled_patch` 与 controlled/privacy+solo 冲突 +- SWBOOT-10 stub 对非 allowlist 路径与 patch/merge fail closed +- `go vet` + 相关包 `-short` 单测通过;不冒充真实 PI / UI 验收 + +## 三、 测试方案与环境 (Test Plan & Environment) + +| 项 | 值 | +|----|-----| +| OS | Linux 7.0.0-31-generic | +| Go | go1.27.1 linux/amd64 | +| Branch | `feature/software-project-bootstrap` | +| Commit | `f6034fa`(报告提交前基线;含后续 test/docs 提交) | +| 实测时间 | 2026-09-16T15:44:30Z | +| 层级 | L1 单元 / 包级回归;L2+ PG 空库迁移、真实 PI、Ubuntu UI 本轮 **NOT RUN** | +| 后端 | stub 允许用于本轮工程门禁;禁止作为最终产品验收 | + +## 四、 预期结果 (Expected Results) + +| 用例 | 预期 | +|------|------| +| UC-01 Official keys | 5 keys;医疗 3 + 软件 2 | +| UC-02 Domain filter | `software_*` 拒 `medical_device`;空 domain 不过滤 | +| UC-03 Manifest validate | bootstrap/delivery `ValidateDefinitionV2` PASS;标题无临床/NMPA/CDMO | +| UC-04 Creation preview | solo+standard 出 `creator_acknowledgement`;privacy+solo 与 controlled_patch 失败 | +| UC-05 Repo allowlist stub | 非白名单拒;白名单路径仍拒 ExecuteControlledPatch/ApproveMerge | +| UC-06 Software create | `non_medical_software` 落库字段;阶段 `S0_boundary`;不发明医疗 device 字段 | +| UC-07 Medical regression | main v2 固定 7 文档校验仍 PASS;server API lifecycle 期望挂载 5 | + +## 五、 实际测试结果与判定 (Actual Results & Evaluation) + +### UC-01 Official keys + +- **测试输入 (Input)**:`go test -short ./internal/workflowdef/ -run TestOfficialWorkflowKeys` +- **实际输出 (Actual Output)**:`ok chat-agent-system/internal/workflowdef` +- **评价判定 (Evaluation / Verdict)**:PASS +- **性能与耗时 (Duration & Latency)**:~0.003s + +### UC-02 Domain filter + +- **测试输入 (Input)**:`TestCompatibleWithProductDomain` +- **实际输出 (Actual Output)**:包含于 workflowdef 包 PASS +- **评价判定 (Evaluation / Verdict)**:PASS +- **性能与耗时 (Duration & Latency)**:含于包耗时 + +### UC-03 Manifest validate + 去污染 + +- **测试输入 (Input)**:`TestValidateDefinitionV2_SoftwareManifests` +- **实际输出 (Actual Output)**:bootstrap/delivery 校验通过;医疗词扫描无命中 +- **评价判定 (Evaluation / Verdict)**:PASS +- **性能与耗时 (Duration & Latency)**:含于包耗时 + +### UC-04 Creation preview + +- **测试输入 (Input)**:`go test -short ./internal/swboot/ -run 'TestBuildCreationPreview|TestProjectTypesCatalog'` +- **实际输出 (Actual Output)**:`ok chat-agent-system/internal/swboot` +- **评价判定 (Evaluation / Verdict)**:PASS +- **性能与耗时 (Duration & Latency)**:~0.002s + +### UC-05 Repo allowlist stub + +- **测试输入 (Input)**:`TestRepoAllowlistStub` +- **实际输出 (Actual Output)**:非 allowlist → `ERR_REPO_PATH_NOT_ALLOWLISTED`;patch/merge → `ERR_SWBOOT10_STUB_ONLY` +- **评价判定 (Evaluation / Verdict)**:PASS +- **性能与耗时 (Duration & Latency)**:含于 swboot 包 + +### UC-06 Software create + +- **测试输入 (Input)**:`TestCreateSoftwareProject_NoMedicalDefaults` +- **实际输出 (Actual Output)**:`ok chat-agent-system/internal/projectworkflow` +- **评价判定 (Evaluation / Verdict)**:PASS +- **性能与耗时 (Duration & Latency)**:~0.003s + +### UC-07 Medical regression + server API + +- **测试输入 (Input)**:`go test -short ./internal/server/ -run TestProjectWorkflowAPI_Lifecycle` 及全包 short +- **实际输出 (Actual Output)**:挂载/目录数量期望已更新为 5;`ok chat-agent-system/internal/server` +- **评价判定 (Evaluation / Verdict)**:PASS(医疗语义与旧 API 行为保留;仅目录容量扩展) +- **性能与耗时 (Duration & Latency)**:server 包 ~10.9s + +### 未执行(明示) + +| 项 | Status | +|----|--------| +| PostgreSQL 空库/旧库升级到 schema 48 活验 | NOT RUN | +| 真实 PI Agent Runner 文档生成 | NOT RUN | +| Ubuntu Playwright UI-SW-00..14 | NOT RUN | +| 受控 patch worktree 真实执行 | NOT RUN(仅 stub) | + +## 六、 自动化测试套件汇总 (Test Suite Execution) + +命令: + +```bash +go vet ./internal/swboot/ ./internal/workflowdef/ ./internal/projectworkflow/ ./internal/workflow/ ./internal/server/ +go test -short -count=1 \ + ./internal/swboot/ \ + ./internal/workflowdef/ \ + ./internal/workflow/ \ + ./internal/projectworkflow/ \ + ./internal/projectinstance/ \ + ./internal/archtest/ \ + ./internal/server/ +``` + +结果摘要(真实控制台): + +```text +ok chat-agent-system/internal/swboot 0.002s +ok chat-agent-system/internal/workflowdef 0.003s +? chat-agent-system/internal/workflow [no test files] +ok chat-agent-system/internal/projectworkflow 0.003s +ok chat-agent-system/internal/projectinstance 0.004s +ok chat-agent-system/internal/archtest 0.143s +ok chat-agent-system/internal/server 10.881s +``` + +`go vet`:无输出(PASS)。 + +通过率:上述包 100%(workflow 无测试文件不计失败)。 + +## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) + +- **结论**:SWBOOT-00..09 工程门禁(L1)达到合入候选标准;**未**达到完整验收清单完成定义(真实 PI / UI / PG 迁移活验仍为 NOT RUN)。 +- **未合 `dev`**:按要求仅推送 feature 分支。 +- **后续**:schema 48 在集成槽位对空库/旧库升级;七步 UI;对话路由与软件 profile;SWBOOT-10 真受控执行独立 Epic。 diff --git a/internal/server/project_workflow_api_test.go b/internal/server/project_workflow_api_test.go index 8043b051..5af9cd78 100644 --- a/internal/server/project_workflow_api_test.go +++ b/internal/server/project_workflow_api_test.go @@ -74,7 +74,7 @@ func TestProjectWorkflowAPI_Lifecycle(t *testing.T) { require.NoError(t, err) assert.NotEmpty(t, projList) - // 4. 查询项目挂载的工作流清单 -> 包含 3 个默认工作流 + // 4. 查询项目挂载的工作流清单 -> 包含医疗三 + 软件两默认工作流 reqWFs := httptest.NewRequest(http.MethodGet, "/api/v1/projects/1001/workflows", nil) recWFs := httptest.NewRecorder() handler.ServeHTTP(recWFs, reqWFs) @@ -83,7 +83,7 @@ func TestProjectWorkflowAPI_Lifecycle(t *testing.T) { var wfList []*projectworkflow.ProjectWorkflow err = json.Unmarshal(recWFs.Body.Bytes(), &wfList) require.NoError(t, err) - assert.Equal(t, 3, len(wfList)) + assert.Equal(t, 5, len(wfList)) // 5. planning 项目禁止旧式切换 -> 409 Conflict bodySwitchBlocked, _ := json.Marshal(projectworkflow.ActivateWorkflowInput{ @@ -119,7 +119,7 @@ func TestProjectWorkflowAPI_Lifecycle(t *testing.T) { require.Equal(t, http.StatusOK, recKeyedWFs.Code) var keyedWFs []*projectworkflow.ProjectWorkflow require.NoError(t, json.Unmarshal(recKeyedWFs.Body.Bytes(), &keyedWFs)) - assert.Equal(t, 3, len(keyedWFs)) + assert.Equal(t, 5, len(keyedWFs)) bodySwitchCreator, _ := json.Marshal(projectworkflow.ActivateWorkflowInput{ WorkflowKey: "product_manager", @@ -141,7 +141,7 @@ func TestProjectWorkflowAPI_Lifecycle(t *testing.T) { var defs []*projectworkflow.Definition err = json.Unmarshal(recDefs.Body.Bytes(), &defs) require.NoError(t, err) - assert.Equal(t, 3, len(defs)) + assert.Equal(t, 5, len(defs)) // 9. 触发工作流运行 -> 200 OK bodyRun, _ := json.Marshal(map[string]any{