From 954da76c0a9d5bb00c985cd7a8ac3b70c7f6665a Mon Sep 17 00:00:00 2001 From: weichen Date: Mon, 21 Sep 2026 06:48:37 +0000 Subject: [PATCH] docs(test): record workflow document key unification on dev MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 项目 6579 已收成 7 条 bd_*,旧 intake 行进了归档表。管理员复测不再出现作用域 409。 Co-authored-by: Cursor --- .doc/ops/CURRENT.md | 12 ++-- ...2026-09-21-workflow-doc-key-unification.md | 12 ++-- .doc/status/FEATURE-MATRIX.md | 2 +- ...orkflow-doc-key-unification-test-report.md | 56 +++++++++++++++++++ .../after.txt | 17 ++++++ .../before.txt | 12 ++++ .../health.json | 1 + 7 files changed, 99 insertions(+), 13 deletions(-) create mode 100644 .doc/test-reports/2026-09-21-workflow-doc-key-unification-test-report.md create mode 100644 .doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/after.txt create mode 100644 .doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/before.txt create mode 100644 .doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/health.json diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index d98795b9..ef0dc44c 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -1,19 +1,19 @@ # 当前焦点 **更新**: 2026-09-21 -**production_ready**: yes(门禁 B1–B4 已签;dev schema **59**,test/main 仍为 **58**。P0 热修 done;rdev 种子热修 done,见 [报告](../test-reports/2026-09-20-rdev-seed-hotfix-test-report.md)) +**production_ready**: yes(门禁 B1–B4 已签;dev schema **60**,test/main 仍为 **58**。P0 热修 done;rdev 种子热修 done,见 [报告](../test-reports/2026-09-20-rdev-seed-hotfix-test-report.md)) ## 焦点 -1. **dev 四问题修复**:近似说法可启动摸底表;刷新后重放任务进度;继续任务走 resume;模板态显示「模板预览」。见 [报告](../test-reports/2026-09-21-dev-deep-test-four-issues-test-report.md)。test/main 未晋升。 -2. **需求与影响已改为对话**:常驻面板已从 dev 页面移除;新待复核与下游影响写入已有项目会话。见 [报告](../test-reports/2026-09-21-trace-panel-to-chat-test-report.md)。test/main 未晋升。 +1. **工作流文档键已收成 7 条**:项目 6579 的旧键 `intake` 已归档,管理员列表为 7 条 `bd_*`。见 [报告](../test-reports/2026-09-21-workflow-doc-key-unification-test-report.md)。test/main 未晋升。 +2. **dev 四问题修复**:近似说法可启动摸底表;刷新后重放任务进度;继续任务走 resume;模板态显示「模板预览」。见 [报告](../test-reports/2026-09-21-dev-deep-test-four-issues-test-report.md)。test/main 未晋升。 3. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`;`SEMANTIC_SUMMARY_REPLACE` 不随 W2 开启;FAV live 观察窗证据驱动;`FAV_DEGRADED_READ=false`;项目 143 只读;SWBOOT-10 保持 fail-closed stub;D7 对话 ADR 仍待合规签字(追踪表留存类别已定为 `record`,不授权物理删除);**不改 `production_ready`**;模块解耦批次 A–G 与回溯实施切片未单独认领前保持 `planned`。 ## 并行认领 | owner | task | branch | worktree | mutex | status | |-------|------|--------|----------|-------|--------| -| Cursor | 2026-09-21-workflow-doc-key-unification | fix/workflow-doc-key-unification-2026-09-21 | .worktrees/fix-workflow-doc-key-unification-2026-09-21 | docgov+web | in_progress | +| Cursor | 2026-09-21-workflow-doc-key-unification | fix/workflow-doc-key-unification-2026-09-21 | .worktrees/fix-workflow-doc-key-unification-2026-09-21 | docgov+web | done | | Cursor | 2026-09-21-dev-deep-test-four-issues | fix/dev-deep-test-four-issues-2026-09-21 | - | web+intent+taskrun | done | | Cursor | 2026-09-21-trace-panel-to-chat | feature/trace-panel-to-chat-2026-09-21 | - | trace-impact+web | done | | Cursor | 2026-09-21-taskrun-scope-persist | fix/taskrun-scope-persist-2026-09-21 | - | projectinstance+taskrun | done | @@ -177,7 +177,7 @@ | holder | phase | since | scope | queue | |--------|-------|-------|-------|-------| -| Cursor | merging | 2026-09-21 | fix/workflow-doc-key-unification-2026-09-21:doc_proj 发布键唯一与列表归并 | - | +| - | idle | 2026-09-21 | 文档键统一已合入并重建 dev;`/health` schema_version=60;项目 6579 为 7 条 bd_* | - | **phase**: `idle` | `merging` | `smoke` | `e2e` @@ -187,7 +187,7 @@ | 环境 | 端口 | schema | 状态 | |------|------|--------|------| -| dev | 8080 | **59** | healthy(阶段回溯 `00059` 已迁移;`/health` schema_version=59;`pi-agent`;events `:8088`) | +| dev | 8080 | **60** | healthy(文档键 `00060` 已迁移;`/health` schema_version=60;`pi-agent`;events `:8088`) | | test | 8081 | **58** | healthy(`rc-v1.0.0-beta.7`;rdev v1 active;`published_by` 回落到用户 4;events `:8089`) | | main | 8000 | **58** | healthy(P0 Wave3 rebuild 已追平 schema;分支树对齐仍记 backlog;口令已轮换;events `:8090`) | diff --git a/.doc/ops/short-term/2026-09-21-workflow-doc-key-unification.md b/.doc/ops/short-term/2026-09-21-workflow-doc-key-unification.md index bfc5fb45..91f5bae9 100644 --- a/.doc/ops/short-term/2026-09-21-workflow-doc-key-unification.md +++ b/.doc/ops/short-term/2026-09-21-workflow-doc-key-unification.md @@ -1,6 +1,6 @@ --- title: "工作流文档键统一(项目 6579)" -status: in_progress +status: done created: 2026-09-21 updated: 2026-09-21 owner: Cursor @@ -31,14 +31,14 @@ mutex: docgov+web 1. [x] 从 `dev` 开 `fix/workflow-doc-key-unification-2026-09-21` 2. [x] 迁移、前端合并、列表归并与单测 -3. [ ] 合入 dev、重建、核对项目 6579 为 7 条 `bd_*` -4. [ ] 测试报告与 CURRENT / FEATURE-MATRIX +3. [x] 合入 dev、重建、核对项目 6579 为 7 条 `bd_*` +4. [x] 测试报告与 CURRENT / FEATURE-MATRIX ## 验收标准 -- [ ] `GET /api/v1/projects/6579/documents?category=workflow` 恰好 7 条 `bd_*` -- [ ] 项目 143 文档数不变 -- [ ] 「编写用户初始需求收集表」返回 202,而不是任务作用域 409 +- [x] `GET /api/v1/projects/6579/documents?category=workflow` 恰好 7 条 `bd_*` +- [x] 项目 143 文档数不变 +- [x] 「编写用户初始需求收集表」不再返回任务作用域 409(管理员得到职责拒绝,因为编制人是陈威) ## 相关链接 diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index 7f3a0385..4ccb981f 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -60,7 +60,7 @@ | 研发设计控制(rdev) | 医疗第 4 工作流:13×60 manifest/模板、`squad.rdev_doc.v1` kind 编排、main-completed 硬 precheck、StageKey 动态化;不含前端/真 PI/键名空间化 | partial | deferred_enhancement | [设计](../system-design/project-workflow/07-研发工作流rdev接入-设计与实施计划.md);[short-term](../archive/ops/2026-09-17-rdev-workflow-integration.md);[模板深度](../archive/ops/2026-09-17-rdev-template-depth.md);[S0+S1 首批报告](../test-reports/2026-09-17-rdev-template-depth-test-report.md);[S1 续批报告](../test-reports/2026-09-17-rdev-template-depth-s1-continued-test-report.md);[写作规范](../system-design/project-workflow/08-rdev模板写作规范.md);[backlog](../backlog/2026-09-17-rdev-phase2-backlog.md) | **P0+P1 done**。**模板深度 S0+S1 首批 + S1 续批 done**:60/60 模板已补强;真 PI 抽样 PASS(含 `rd_planning_review` + `rd_design_vv`,项目 6446)。剩余:S3 overlay 与 R2/R3 已接。P2 名称匹配、阶段折叠、批量审批已接。选中 rdev 时显示与服务端相同的 CDO 前置说明(`workflowPrerequisite.test.ts`)。P4 键名空间化已接:发布清单用 `bd_`/`pm_`/`tm_`/`sw_`,旧键仍走同一套步骤和模板,旧 doc_id 仍可查(`keyspace_test.go`)。P3 三样本已在 dev 真 PI 上跑过(项目 6533):`rd_sw_plan` 规划期关闭;`rd_proposal` completed 但未对齐模板标题;`rd_planning_review` 当时质量门禁 score 20,是把同节后一张法规表算进问题行。门禁已只读第一张表;保存的终稿不再报「问题行缺少」。建议书标题仍未对齐模板。没有新的真 PI。见 [P3 报告](../test-reports/2026-09-19-rdev-p3-real-pi-test-report.md)。nightly 未扩成四工作流。 | `workflow-def` / `rdev-templates` | | 纯软件项目自举 | 软件项目创建、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);[W5a](../test-reports/2026-09-17-w5a-software-bootstrap-ui-pi-test-report.md) | **before**:L1 + UI 仍克隆医疗模板。**after W5a**:catalog 驱动创建、软件不挂医疗 key、docs_only 真 PI 建议 delivery 且不自动激活。**SWBOOT-10 仍 stub**(W5b);本行不升 done | `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` | +| 文档治理 | 法定文档生命周期 + 租约 + 受控正文读取 | 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);[键统一](../test-reports/2026-09-21-workflow-doc-key-unification-test-report.md) | 项目 143 只读;不终止。`doc_proj*` 同一发布键不能再并存 | `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);[proposed/authoritative](../ops/short-term/2026-09-20-proposed-authoritative-reports.md) | **before**:完整 PI narrative 混入 → **after**:迁「PI change-report 叙事」。fallback 报告是本行内显式行为,不是缺口。lineage GET 已按 URL 项目和文档可见性裁剪。test_manager 血缘的下游/上游版本改读文档版本,不再写死 1。Agent 候选报告为 `proposed`,正式提交才写 authoritative 后继并挂到版本;拒绝、替代后旧报告不能再出建议。人工修订、导入和聊天卡仍未分开预估与正式报告,见 [T1](../ops/short-term/2026-09-20-impact-loop-t1.md)。项目追踪索引见下一行 | `docgov` | | 阶段回溯与影响闭环 | 五表追踪索引、影响报告、L1 文档修订、L2 阶段再打开、待复核软标记、对话修订提案 | done | deferred_enhancement(不挡首发) | [设计](../system-design/2026-09-20-stage-backtrack-and-impact-loop-design.md);[Track T](../remediation/2026-09-20-capability-enablement-impact-plan.md);[对话化报告](../test-reports/2026-09-21-trace-panel-to-chat-test-report.md) | 已合入 dev。常驻「需求与影响」面板已退役,新待复核与下游影响改走已有项目会话。dev schema 59。test/main 未升。阶段推进确认门禁仍在。不签 D7 对话 ADR,不改 `production_ready` | `trace-index` | | PI change-report 叙事 | 只读消费 diff+lineage 的 PI 叙事;失败全量降级 fallback | partial | deferred_enhancement | [Round20](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[pu7](../ops/long-term/2026-09-16-pu7-pi-narrative-contract.md);[脚手架](../test-reports/2026-09-16-pu7-pi-narrative-test-report.md);[W3 真 PI](../test-reports/2026-09-17-w3-pi-change-report-narrative-test-report.md);[2026-09-20 复核](../ops/research/2026-09-20-capability-enablement-impact-research.md);[最小化输入](../ops/short-term/2026-09-20-pi-narrative-clipped-diff.md) | flag 默认 off。`facts.json` 含截断后的 hunk 前后文和影响说明,以及完整 hunk/impact 计数与省略数;摘要 digest 仍不含正文。叙事请求已带 `tool_profile=reasoning`。运行中的 runner 尚未切到 `--no-tools`。不打开开关 | `docgov` | diff --git a/.doc/test-reports/2026-09-21-workflow-doc-key-unification-test-report.md b/.doc/test-reports/2026-09-21-workflow-doc-key-unification-test-report.md new file mode 100644 index 00000000..41ca0f16 --- /dev/null +++ b/.doc/test-reports/2026-09-21-workflow-doc-key-unification-test-report.md @@ -0,0 +1,56 @@ +# 工作流文档键统一 测试报告 + +## 一、 测试背景 (Background) +dev 项目「新的测试项目」(id 6579)应有 7 份工作流文档。系统管理员看到 8 份,成员陈威看到 14 份,其中有重复,标题也像混入了别的工作流。另外,发送「编写用户初始需求收集表」曾返回任务作用域 409。 + +## 二、 测试目标 (Test Objectives) +- 项目 6579 的正式台账只剩 7 条 `bd_*`,旧键 `doc_proj6579_intake` 归档而不是直接丢掉正文。 +- 项目 143 的 `doc_proj143_intake` 保持不动。 +- 管理员接口返回 7 条,不再返回 `intake`。 +- 用 `bd_intake` 与旧键 `intake` 创建任务时,不再返回 `TASK_SCOPE_UNRESOLVED`。 + +## 三、 测试方案与环境 (Test Plan & Environment) +- OS:linux。分支 `fix/workflow-doc-key-unification-2026-09-21`,已 `--no-ff` 合入 `dev` 后执行 `./scripts/env-service.sh dev rebuild`。 +- `/health`:`schema_version=60`,`agent_backend=pi-agent`,`kb_ready=true`。 +- 单元测试:文档列表归并、物化跳过兄弟行、前端 7 旧键 + 8 服务端行收成 7 条。 +- 已知既有失败:`TestDocGov_CreateOrGetDocument_OptionalDutiesNullFK` 在连到 dev 库时仍因随机 `project_id` 外键失败,不在本次路径上。 + +## 四、 预期结果 (Expected Results) +- 迁移后 6579 为 7 条 `bd_*`;143 仍是 1 条 `intake`。 +- `GET /api/v1/projects/6579/documents?category=workflow` 返回这 7 条。 +- 管理员发「编写用户初始需求收集表」若不是编制人,应是职责拒绝,而不是作用域 409。陈威才是 `bd_intake` 的编制人,本轮没有成员口令,不代登。 + +## 五、 实际测试结果与判定 (Actual Results & Evaluation) + +### 用例 1:迁移前后台账 +- 测试输入:重建前查询项目 6579 与 143;重建后再次查询,并读归档表。 +- 实际输出:重建前 6579 为 7 条 `bd_*` 加 `doc_proj6579_intake`。重建后这 8 行变成 7 条 `bd_*`。归档表有 1 行,`archive_reason=coexisting_legacy_task_key`,`snapshots=2`,payload 9282 字节。项目 143 重建前后都是 `doc_proj143_intake`。 +- 评价判定:PASS。 +- 性能与耗时:查询即时返回。重建镜像与容器约 22 秒(大量层缓存命中)。 + +### 用例 2:管理员文档列表 +- 测试输入:管理员 `GET /api/v1/projects/6579/documents?category=workflow`,以及项目 143 同一接口。 +- 实际输出:6579 返回 7 条:`bd_cdo_quote`、`bd_feasibility_dev`、`bd_feasibility_reg`、`bd_intake`、`bd_prelim_design`、`bd_research`、`bd_user_requirements`。143 返回 1 条 `intake`。 +- 评价判定:PASS。 +- 性能与耗时:两次读取均在 1 秒内。 + +### 用例 3:任务作用域复测 +- 测试输入:管理员会话 `4517`,`POST /api/v1/tasks/runs`,正文「编写用户初始需求收集表」。分别用 `task_key=bd_intake` 与 `task_key=intake`。 +- 实际输出:两次都是 HTTP 403,`error=DOC_DUTY_FORBIDDEN`,消息「当前用户不是该文档的对应职责人」。没有 `TASK_SCOPE_UNRESOLVED`。 +- 评价判定:PASS(作用域 409 未再出现)。未得到 202,因为 `bd_intake` 编制人是陈威(用户 398),管理员被职责门禁拦住。陈威浏览器里的旧键本地克隆要等他刷新后,新前端才会按发布键合并;本轮没有代登陈威。 +- 性能与耗时:两次拒绝都在 1 秒内。 + +## 六、 自动化测试套件汇总 (Test Suite Execution) +- `go test -count=1 -run 'TestListWorkflowDocumentsCollapsesLegacyAlias|TestMaterializeTemplateDocs' ./internal/docgov/` 通过。 +- `go test -short ./internal/workflowdef/` 通过。`./internal/docgov/` 的短测里,上述既有外键用例失败,其余通过。 +- `web`:`npm test` 448 通过、0 失败;`npm run build` 通过。 +- 健康检查: + +```json +{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"kb_ready":true,"database_ready":true,"schema_version":60,"schema_ready":true,"task_store_ready":true} +``` + +证据:`.doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/`。 + +## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) +服务端重复行已归档,管理员列表现在是 7 条 `bd_*`。唯一索引只约束 `doc_proj*`,没有清理项目 1 上的 `doc_test_db_*` 测试残留。陈威需要刷新页面,让新前端丢掉未认领的旧键本地克隆;本轮没有用他的账号在浏览器里点过。项目 143 未改写。test/main 未晋升。 diff --git a/.doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/after.txt b/.doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/after.txt new file mode 100644 index 00000000..6494db5c --- /dev/null +++ b/.doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/after.txt @@ -0,0 +1,17 @@ + doc_id | task_key | is_template_only +-----------------------------------+----------------------+------------------ + doc_proj143_intake | intake | f + doc_proj6579_bd_cdo_quote | bd_cdo_quote | t + doc_proj6579_bd_feasibility_dev | bd_feasibility_dev | t + doc_proj6579_bd_feasibility_reg | bd_feasibility_reg | t + doc_proj6579_bd_intake | bd_intake | t + doc_proj6579_bd_prelim_design | bd_prelim_design | t + doc_proj6579_bd_research | bd_research | t + doc_proj6579_bd_user_requirements | bd_user_requirements | t +(8 rows) + + doc_id | task_key | archive_reason | snapshots | payload_bytes +---------------------+----------+----------------------------+-----------+--------------- + doc_proj6579_intake | intake | coexisting_legacy_task_key | 2 | 9282 +(1 row) + diff --git a/.doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/before.txt b/.doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/before.txt new file mode 100644 index 00000000..851f4119 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/before.txt @@ -0,0 +1,12 @@ + doc_id | task_key | is_template_only +-----------------------------------+----------------------+------------------ + doc_proj143_intake | intake | f + doc_proj6579_bd_cdo_quote | bd_cdo_quote | t + doc_proj6579_bd_feasibility_dev | bd_feasibility_dev | t + doc_proj6579_bd_feasibility_reg | bd_feasibility_reg | t + doc_proj6579_bd_intake | bd_intake | t + doc_proj6579_bd_prelim_design | bd_prelim_design | t + doc_proj6579_bd_research | bd_research | t + doc_proj6579_bd_user_requirements | bd_user_requirements | t + doc_proj6579_intake | intake | f +(9 rows) diff --git a/.doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/health.json b/.doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/health.json new file mode 100644 index 00000000..a1ecab90 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-21-workflow-doc-key-unification/health.json @@ -0,0 +1 @@ +{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"kb_ready":true,"database_ready":true,"schema_version":60,"schema_ready":true,"task_store_ready":true}