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 <cursoragent@cursor.com>
This commit is contained in:
weichen
2026-09-16 15:45:08 +00:00
co-authored by Cursor
parent f6034fad37
commit 01a783b8d5
6 changed files with 168 additions and 18 deletions
+1 -1
View File
@@ -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 |
@@ -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 | 范围 | 依赖 | 验收 |
@@ -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`
+1 -1
View File
@@ -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` |
@@ -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。
+4 -4
View File
@@ -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{