merge: docs for workflow document key unification

This commit is contained in:
weichen
2026-09-21 06:48:58 +00:00
7 changed files with 99 additions and 13 deletions
+6 -6
View File
@@ -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`) |
@@ -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(管理员得到职责拒绝,因为编制人是陈威)
## 相关链接
+1 -1
View File
@@ -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` |
@@ -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 未晋升。
@@ -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)
@@ -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)
@@ -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}