merge: dev into feature/control-center-server
Keep Control Center and drop engineering-dashboard. Resolve CURRENT claim rows and module-boundaries by removing the superseded dashboard entry. Co-authored-by: Cursor <cursoragent@cursor.com>
@@ -2,7 +2,7 @@
|
||||
|
||||
## 状态
|
||||
|
||||
提议(2026-09-14;架构与实施计划已修订,等待用户确认后进入首个实现里程碑)
|
||||
已接受(2026-09-14 提议;2026-09-18 确认——Phase 1 纵向绞杀与 Phase 2 持久事件交付已落地并验收,见 gap-matrix `DOC-RELIABILITY-PILOT` PASS、[Phase 1 计划](../remediation/2026-09-14-module-decoupling-refactor-plan.md)、[Phase 2 修订计划](../remediation/2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md)、[Track E 复盘](../ops/research/2026-09-15-track-e-retrospective.md))
|
||||
|
||||
## 背景
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: "docgov 变更提案 HTTP + 前端接线"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
owner: Cursor
|
||||
branch: feature/docgov-modification-proposal-http
|
||||
worktree: .worktrees/feature-docgov-modification-proposal-http
|
||||
mutex: docgov
|
||||
---
|
||||
|
||||
# docgov 变更提案 HTTP + 前端接线
|
||||
|
||||
## 目标
|
||||
|
||||
暴露 `POST /api/v1/docgov/proposal`,前端「修改」快捷分支与 `ProposalConfirmCard` 走真实 propose/decide,不再本地假装成功。
|
||||
|
||||
## 范围
|
||||
|
||||
- API:`ProposeModification` 路由;decide 补 404/403 映射
|
||||
- 前端:`docgov.ts` + `App.tsx` 接线
|
||||
- 单测 + 真实 HTTP 证据
|
||||
- 关闭 audit 缺口;dev 试点总开关证据归档
|
||||
|
||||
## 非目标
|
||||
|
||||
- 晋升 test/main
|
||||
- 变更提案自动改写受控正文(批准后仍为 UI 演示增补)
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 实现 propose handler + 路由
|
||||
2. [x] 前端 client + App 接线
|
||||
3. [x] handler/client 单测
|
||||
4. [x] 合入 dev + rebuild + 真实 HTTP
|
||||
5. [x] push origin/dev;清理 author-only worktree
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] `POST /api/v1/docgov/proposal` 可写库(单测)
|
||||
- [x] 真实 HTTP claim → propose → decide PASS
|
||||
- [x] audit 缺口 resolved;CURRENT 认领收敛
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Audit: [../../audit/2026-09-17-docgov-modification-proposal-http-gap.md](../../audit/2026-09-17-docgov-modification-proposal-http-gap.md)
|
||||
- Pilot: [../../test-reports/assets/2026-09-17-author-only-pilot/](../../test-reports/assets/2026-09-17-author-only-pilot/)
|
||||
- Closeout: [../handoffs/2026-09-17-document-author-only-closeout.md](../handoffs/2026-09-17-document-author-only-closeout.md)
|
||||
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: 文档编制人兼任审核批准方案
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
owner: Codex
|
||||
branch: feature/document-author-only-plan
|
||||
worktree: .worktrees/feature-document-author-only-plan
|
||||
mutex: document-duty-policy-plan
|
||||
---
|
||||
|
||||
# 文档编制人兼任审核批准方案
|
||||
|
||||
## 目标
|
||||
|
||||
基于当前源码形成管理员总授权、项目创建者逐文档选择的详细实施方案,交用户审核。
|
||||
|
||||
## 范围
|
||||
|
||||
权限、系统设置、工作流规划和冻结、文档三职、动作鉴权、状态机、前端、迁移与验收。
|
||||
|
||||
## 非目标
|
||||
|
||||
本次不修改业务代码、不变更数据库或共享容器、不推送。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 阅读启动链并从本地 dev 建立隔离分支。
|
||||
2. [x] 核查实现并记录证据。
|
||||
3. [x] 编写方案、检查边界与验收覆盖。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 方案覆盖用户两个权限层级及逐文档持久化。
|
||||
- [x] 当前事实与拟议行为分开,列明实施单元与测试场景。
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
基线 dev adb48c8。已 fetch origin/dev,本地 dev 领先 44、落后 0,保留未推送集成成果;主工作区 feature/control-center-server 未切换。worktree 脚本默认从当前 HEAD 创建,故直接指定 dev 创建本 worktree,避免引入他人分支。
|
||||
|
||||
## 交付
|
||||
|
||||
- 方案:`.doc/remediation/2026-09-17-document-author-only-plan.md`
|
||||
- 核查:`.doc/audit/2026-09-17-document-author-only-analysis.md`
|
||||
- 本任务完成仅指方案交付,业务实现为 planned;R9/R10 待用户审核。
|
||||
- 未合入 dev:方案保留在独立分支供审核;未推送、未修改业务代码或容器。
|
||||
- 验证:源码与文档一致性检查、git diff --check;未执行业务测试。
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: "文档编制人兼任:U1 策略存储与总授权"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
owner: Cursor
|
||||
branch: feature/document-author-only-plan
|
||||
worktree: ".worktrees/feature-document-author-only-plan"
|
||||
mutex: sysadmin + document-duty-policy
|
||||
---
|
||||
|
||||
# 文档编制人兼任:U1 策略存储与总授权
|
||||
|
||||
## 目标
|
||||
|
||||
落地 `workflow.allow_author_only_approval` 管理员总开关:默认关闭、严格 bool、revision CAS、事务内审计,并向 projectinstance 提供可参与激活事务的窄读取接口。
|
||||
|
||||
## 范围
|
||||
|
||||
- Goose 增量迁移(revision 列、种子行、策略审计表)
|
||||
- `internal/sysadmin` 存储/服务/窄 Policy 接口
|
||||
- `admin_system_handlers` 对本 key 的 `expected_revision` 协议
|
||||
- 单元 / PG / HTTP 负例测试
|
||||
|
||||
## 非目标
|
||||
|
||||
- 逐文档 duty_policy(U2)
|
||||
- 前端设置页文案(U5)
|
||||
- 已激活实例紧急熔断
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 认领 CURRENT
|
||||
2. [x] 迁移 00050
|
||||
3. [x] sysadmin CAS + 审计 + PolicySource
|
||||
4. [x] admin handler
|
||||
5. [x] 测试与提交
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 管理员可开关;非管理员 403
|
||||
- [x] null/字符串布尔拒绝
|
||||
- [x] 并发 CAS 仅一版成功
|
||||
- [x] 审计失败回滚设置
|
||||
- [x] 窄接口可读 allowed+revision;缺行默认 false;DB 故障不伪装
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Plan: `.doc/remediation/2026-09-17-document-author-only-plan.md` U1
|
||||
- Checklist:
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- `go test ./internal/sysadmin/ ./internal/server/ -run 'Settings|AuthorOnly|PGSettings|AdminSystem'` PASS
|
||||
- `go test -short ./internal/sysadmin/ ./internal/server/` PASS
|
||||
- Key: `workflow.allow_author_only_approval`
|
||||
- 窄接口: `sysadmin.AuthorOnlyPolicySource`
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
title: "文档编制人兼任:U2 逐文档模式与激活"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
owner: Cursor
|
||||
branch: feature/document-author-only-plan
|
||||
worktree: ".worktrees/feature-document-author-only-plan"
|
||||
mutex: projectinstance + document-duty-policy
|
||||
---
|
||||
|
||||
# 文档编制人兼任:U2 逐文档模式与激活
|
||||
|
||||
## 目标
|
||||
|
||||
落地逐文档 `duty_policy=author_only`:规划校验、预览摘要、激活 token 绑定策略 revision,激活事务内行锁串行化关闭总开关。
|
||||
|
||||
## 范围
|
||||
|
||||
- DocTaskPlan / PreviewSummary / ProjectSettings 扩展
|
||||
- ResolveDocTaskDuty、Save/Preview/Activate 消费 U1 策略
|
||||
- Goose 00051 token revision 列
|
||||
- app 适配器装配、HTTP 错误码映射
|
||||
- 单元测试
|
||||
|
||||
## 非目标
|
||||
|
||||
- Heal/文档投影(U3)
|
||||
- 前端 UI(U5)
|
||||
- 运行时动作多职责(U4/U6)
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 类型与解析器
|
||||
2. [x] service/store/迁移
|
||||
3. [x] app 装配与 handler
|
||||
4. [x] 测试与提交
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 一位成员兼任可存/预览/激活(总开关开)
|
||||
- [x] 总开关关时 Save 拒绝
|
||||
- [x] 预览后 revision 变化旧 token 409
|
||||
- [x] 未开模式只填作者仍 partial 拒绝
|
||||
- [x] 旧快照缺 duty_policy 时 hash 稳定
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Plan: `.doc/remediation/2026-09-17-document-author-only-plan.md` U2
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- `go vet ./internal/projectinstance/ ./internal/app/ ./internal/server/`
|
||||
- `go test -short ./internal/projectinstance/ ./internal/server/ ./internal/app/` PASS
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: "文档编制人兼任:U3 文档绑定与职责投影"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
owner: Cursor
|
||||
branch: feature/document-author-only-plan
|
||||
worktree: ".worktrees/feature-document-author-only-plan"
|
||||
mutex: docgov + docduty + bizdev + document-duty-policy
|
||||
---
|
||||
|
||||
# 文档编制人兼任:U3 文档绑定与职责投影
|
||||
|
||||
## 目标
|
||||
|
||||
生成时写入实例治理职责并 `duty_locked`;heal/revoke 跳过锁定行;读侧投影 `duty_policy`。
|
||||
|
||||
## 范围
|
||||
|
||||
- Goose 00052:`document_records.duty_locked` / `duty_policy`
|
||||
- `docgov.LockDocumentDuty` + 列表投影
|
||||
- `docduty` heal/revoke `AND NOT duty_locked`
|
||||
- `bizdev.InstanceDutySource` + `resolveTaskDocumentDuties` 治理分支;跳过 governed 内存 heal
|
||||
- `app/instance_duty_adapter.go` 装配
|
||||
|
||||
## 非目标
|
||||
|
||||
- U4 动作鉴权 / allowed_actions
|
||||
- U5/U6 前端
|
||||
- 合入 `dev`
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 迁移
|
||||
2. [x] docgov / docduty
|
||||
3. [x] bizdev + app 适配器
|
||||
4. [x] 测试与提交
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 受治理文档创建后 `duty_locked=true` 且三职来自实例
|
||||
- [x] heal/revoke 不清锁定行(SQL 过滤 + 单测/PG 可选)
|
||||
- [x] 生成后 governed 路径不再用项目默认覆盖内存态
|
||||
- [x] 模块边界:bizdev/docduty/docgov 不导入 projectinstance
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Plan: U3(文档绑定与职责投影一致性)
|
||||
- 依赖:U1 `3b6def2`、U2 `c03d0a3`
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- `go vet ./internal/docgov/ ./internal/docduty/ ./internal/bizdev/ ./internal/app/ ./internal/projectinstance/`
|
||||
- `go test -short` 上述包 PASS
|
||||
- PG:`TEST_DATABASE_URL` 未配置时 `Heal/Revoke SkipsDutyLocked` 自动跳过
|
||||
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: "文档编制人兼任:U4 动作鉴权与审计"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
owner: Cursor
|
||||
branch: feature/document-author-only-plan
|
||||
worktree: ".worktrees/feature-document-author-only-plan"
|
||||
mutex: projectinstance + docgov + document-duty-policy
|
||||
---
|
||||
|
||||
# 文档编制人兼任:U4 动作鉴权与审计
|
||||
|
||||
## 目标
|
||||
|
||||
ABAC 门禁识别 `duty_policy=author_only` 派生职责;审计 Details 携带 duty_policy。
|
||||
|
||||
## 范围
|
||||
|
||||
- `duty_action` / `stage_access` / `gate` 改用 `ResolveDocTaskDuty`
|
||||
- `state_machine` Transition* Details 补 `duty_policy`
|
||||
- author_only 动作矩阵与阶段可见性测试
|
||||
|
||||
## 非目标
|
||||
|
||||
- U5 UI / U6 浏览器闭环
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] ABAC 三文件
|
||||
2. [x] 审计详情
|
||||
3. [x] 测试与提交
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] author_only 规范存储(仅 Author ID)下 A 可 run/edit/submit/review/approve
|
||||
- [x] 非 A 拒绝;阶段门禁将 author_only 视为 approvalManaged
|
||||
- [x] 审计 Details 含 duty_policy
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Plan: U4+U5 实施计划
|
||||
- 依赖:U1–U3
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- `go test -short ./internal/projectinstance/ ./internal/docgov/ ./internal/app/ ./internal/server/` PASS
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: "文档编制人兼任:U5 系统设置与逐文档 UI"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
owner: Cursor
|
||||
branch: feature/document-author-only-plan
|
||||
worktree: ".worktrees/feature-document-author-only-plan"
|
||||
mutex: web + document-duty-policy
|
||||
---
|
||||
|
||||
# 文档编制人兼任:U5 系统设置与逐文档 UI
|
||||
|
||||
## 目标
|
||||
|
||||
前端识别 `duty_policy` / `author_only_policy`;项目设置可逐文档开启兼任。
|
||||
|
||||
## 范围
|
||||
|
||||
- `projectSettings.ts` 类型
|
||||
- `projectSettingsDuties.ts` resolveClientDocTaskDuty + 校验
|
||||
- `ProjectSettingsModal` 兼任勾选与预览
|
||||
- SettingsSection 不改(白名单通用渲染)
|
||||
|
||||
## 非目标
|
||||
|
||||
- U6 多职责动作栏 / 浏览器 E2E
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 类型与 lib
|
||||
2. [x] UI
|
||||
3. [x] 测试与提交
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] author_only 客户端校验通过且不计三人门槛
|
||||
- [x] 总开关关闭时兼任勾选禁用并提示
|
||||
- [x] 预览展示兼任文档计数
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Plan: U4+U5 实施计划
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- `npx tsc --noEmit` PASS
|
||||
- `npm test` PASS(含 projectSettingsDuties author_only 用例)
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: "文档编制人兼任:U6 多职责动作与真实闭环"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
owner: Cursor
|
||||
branch: feature/document-author-only-plan
|
||||
worktree: ".worktrees/feature-document-author-only-plan"
|
||||
mutex: web + document-duty-policy
|
||||
---
|
||||
|
||||
# 文档编制人兼任:U6 多职责动作与真实闭环
|
||||
|
||||
## 目标
|
||||
|
||||
去掉 author-first 动作短路,把认领/送审/审核/批准接到真实 docgov HTTP,完成 author_only 端到端验收。
|
||||
|
||||
## 范围
|
||||
|
||||
- `web/src/api/docgov.ts` 四接口客户端
|
||||
- `docGovActionVisibility` / `holdsDocDuty`
|
||||
- `App.tsx` 真实 handler + 快捷指令
|
||||
- `duty_policy` 透传与「编制人兼任」徽标
|
||||
- 单测 + 真实闭环报告
|
||||
|
||||
## 非目标
|
||||
|
||||
- 变更提案 HTTP 路由(另记 audit)
|
||||
- 合入 `dev` / 推送远端(未授权不推)
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] API 客户端
|
||||
2. [x] ID 直判可见性
|
||||
3. [x] App 接线 + 驳回批准修正
|
||||
4. [x] duty_policy 徽标透传
|
||||
5. [x] 单测 / tsc
|
||||
6. [x] 真实闭环与报告
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] author_only 下 A 可见三动作;非 A 403
|
||||
- [x] 真实 API 闭环写库与审计含 duty_policy
|
||||
- [x] 浏览器可见「编制人兼任」徽标
|
||||
- [x] 测试报告归档
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Test report: [../../test-reports/2026-09-17-document-author-only-u6-test-report.md](../../test-reports/2026-09-17-document-author-only-u6-test-report.md)
|
||||
- Remediation U6: [../../remediation/2026-09-17-document-author-only-plan.md](../../remediation/2026-09-17-document-author-only-plan.md)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- `npm test` 390 pass;`tsc --noEmit` clean
|
||||
- assets: `test-reports/assets/2026-09-17-document-author-only-u6/`
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: "rdev 模板深度补强 S1 续批(剩余 46 份)"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
owner: Cursor
|
||||
branch: feature/rdev-template-depth-s1-continued
|
||||
worktree: ".worktrees/feature-rdev-template-depth-s1-continued"
|
||||
mutex: rdev-templates
|
||||
---
|
||||
|
||||
# rdev 模板深度补强 S1 续批(剩余 46 份)
|
||||
|
||||
## 目标
|
||||
|
||||
将剩余 46 份 `rd_*` 模板按写作规范做同等深度补强,lint allowlist 扩至全 60 份,抽样真 PI 打样收口。
|
||||
|
||||
## 范围
|
||||
|
||||
- 批1:6 份评审记录
|
||||
- 批2:阶段06 硬件/工艺 8 份
|
||||
- 批3:阶段06 软件/检验/技术要求+清单 9 份
|
||||
- 批4:阶段08 验证 12 份
|
||||
- 批5:阶段10–13 转换/确认 11 份
|
||||
- lint allowlist + 抽样真 PI + 文档同步
|
||||
|
||||
## 非目标
|
||||
|
||||
- S2/S3、P2 前端、P3 三样本全量 E2E、P4 键名空间化
|
||||
- 晋升 test/main
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 批1 评审记录 6 份
|
||||
2. [x] 批2 硬件/工艺 8 份
|
||||
3. [x] 批3 软件/检验/清单 9 份
|
||||
4. [x] 批4 验证 12 份
|
||||
5. [x] 批5 转换/确认 11 份
|
||||
6. [x] 抽样真 PI + 文档同步(合入 push 见 merge 步骤)
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 46 份无「按本阶段专业结构写」;lint allowlist 60/60
|
||||
- [x] 抽样 1–2 份真 PI PASS(`rd_planning_review` + `rd_design_vv`,项目 6446)
|
||||
- [x] FEATURE-MATRIX / 写作规范 / backlog 已更新
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Backlog: [.doc/backlog/2026-09-17-rdev-phase2-backlog.md](../../backlog/2026-09-17-rdev-phase2-backlog.md)
|
||||
- 写作规范: [.doc/system-design/project-workflow/08-rdev模板写作规范.md](../../system-design/project-workflow/08-rdev模板写作规范.md)
|
||||
- 首批报告: [.doc/test-reports/2026-09-17-rdev-template-depth-test-report.md](../../test-reports/2026-09-17-rdev-template-depth-test-report.md)
|
||||
- 续批报告: [.doc/test-reports/2026-09-17-rdev-template-depth-s1-continued-test-report.md](../../test-reports/2026-09-17-rdev-template-depth-s1-continued-test-report.md)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- 资产:`.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/`
|
||||
- 附带:`fix(projectinstance): allocate next instance_no for planning drafts`
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
title: "rdev 模板深度补强 S0 + S1 首批"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
owner: Cursor
|
||||
branch: feature/rdev-template-depth
|
||||
worktree: ".worktrees/feature-rdev-template-depth"
|
||||
mutex: rdev-templates
|
||||
---
|
||||
|
||||
# rdev 模板深度补强 S0 + S1 首批
|
||||
|
||||
## 目标
|
||||
|
||||
修复 rdev leader prompt 错配,并为阶段 01–05 的 14 份 rdev 模板补齐 ISO 13485 专业章节与逐节写作指令,以 dev 真实 PI 打样验证收口。
|
||||
|
||||
## 范围
|
||||
|
||||
- S0.1 B1:`rdev_leader.md` + InstructionsFile 注入链
|
||||
- S0.2:`rd_design_input_spec` 样例 + 写作规范 + lint
|
||||
- S0.3:dev 真实 PI 打样
|
||||
- S1 首批:阶段 01–05 共 14 份模板(分 3 批)
|
||||
|
||||
## 非目标
|
||||
|
||||
- overlay 机制本体、R1–R7 二期、per-stage 步骤定制、模型配置化、manifest 元数据、前端(P2)、键名空间化(P4)、阶段 06–13 模板
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] S0.1 leader prompt 注入链(`6a09062`)
|
||||
2. [x] S0.2 样例模板 + 规范 + lint(含于 `eb09b21`)
|
||||
3. [x] S0.3 真实 PI 打样(项目 6424 intake + 6425 `rd_design_input_spec`)
|
||||
4. [x] S1 批 1–3(`eb09b21`)
|
||||
5. [x] 文档与门禁
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] rdev leader AGENTS.md 含「设计控制」且不含「商务对接负责人」「CDO」
|
||||
- [x] intake leader 回归仍含「商务对接负责人」
|
||||
- [x] 14 份模板 lint 绿灯;真 PI 终稿五节实质论证
|
||||
- [x] `go vet` + `go test -short` 全绿
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Test report: [.doc/test-reports/2026-09-17-rdev-template-depth-test-report.md](../../test-reports/2026-09-17-rdev-template-depth-test-report.md)
|
||||
- Assets: [.doc/test-reports/assets/2026-09-17-rdev-template-depth/](../../test-reports/assets/2026-09-17-rdev-template-depth/)
|
||||
- Backlog: [.doc/backlog/2026-09-17-rdev-phase2-backlog.md](../../backlog/2026-09-17-rdev-phase2-backlog.md)
|
||||
- 写作规范: [.doc/system-design/project-workflow/08-rdev模板写作规范.md](../../system-design/project-workflow/08-rdev模板写作规范.md)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- 依赖 `feature/rdev-core`(尚未合 dev);合入前需 rebase 丢弃已进 dev 的 engineering-dashboard 重复提交。
|
||||
- 真 PI:`run_1789635054471569201`(intake ~220s);`run_1789635960880707641`(DI ~450s,`stage=RD03_design_input`)。
|
||||
@@ -0,0 +1,70 @@
|
||||
---
|
||||
title: "研发工作流(rdev)接入:13 阶段 / 60 文档任务"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
owner: Cursor
|
||||
branch: fix/docgov-stage-dynamic → feature/rdev-core
|
||||
worktree: "-"
|
||||
mutex: workflow-def
|
||||
---
|
||||
|
||||
# 研发工作流(rdev)接入:13 阶段 / 60 文档任务
|
||||
|
||||
## 目标
|
||||
|
||||
在现有 5 个正式工作流外新增医疗第 4 工作流「研发设计控制流程」(key: `rdev`),完整承载参考项目 13 phase / 60 文档任务的 ISO 13485 DHF 设计控制链,并通过真实 PI 验收;随后完成全工作流任务键命名空间化(P4)。
|
||||
|
||||
## 范围
|
||||
|
||||
- 方案:[07-研发工作流rdev接入-设计与实施计划](../../system-design/project-workflow/07-研发工作流rdev接入-设计与实施计划.md)(P0–P4 五期;§8 四项决策已确认)
|
||||
- P0:docgov Stage 去硬编码 + stage key 透传
|
||||
- P1:rdev.v2.json manifest(13×60 一次到位)+ 60 份 rd_ 前缀模板 + catalog/seed/registry + squad kind 编排 + main-completed precheck + 齐套测试 + stub PG 全链路
|
||||
- P2:前端激活规划/切换/前置 Banner + intent 文档名匹配 + prior docs 注入与血缘
|
||||
- P3:真实 PI Agent E2E(rd_proposal / rd_planning_review / rd_sw_plan 三样本)+ CI 门禁扩四
|
||||
- P4:现有工作流(main/pm/tm + 软件两盘点)任务键 `bd_`/`pm_`/`tm_`(`sw_`)空间化,alias 兼容式改名(D12),独立分支独立验收
|
||||
|
||||
## 非目标
|
||||
|
||||
- 二期增强全部移入 backlog:[2026-09-17-rdev-phase2-backlog](../../backlog/2026-09-17-rdev-phase2-backlog.md)(N/A 不适用页生成、UR/RS 结构化门禁、kind 专用门禁、depends_on 精确血缘、DMR 归档、sw_ 键盘点、complexity regulatory 注入)
|
||||
- 云盘 canonical DHF/DMR 归档(本仓库无云盘模块)
|
||||
- 软件域(non_medical_software)开放 rdev
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 用户确认方案 §8 四项决策(2026-09-17:名称「研发设计控制流程」/ 60 任务一次到位 / N/A 规划期关闭 + backlog / rd_ 前缀并扩展到现有工作流键名空间化)
|
||||
2. [x] P0 分支 `fix/docgov-stage-dynamic`(StageKey 透传;已叠入 `feature/rdev-core`)
|
||||
3. [x] P1 分支 `feature/rdev-core`(manifest/模板/seed/编排/precheck/齐套测试)
|
||||
4. [ ] P2 分支 `feature/rdev-web-governance`(前端 + intent + 血缘)— **骨架已定,待独立认领**
|
||||
5. [ ] P3 真实 PI 验收 + 报告归档 + FEATURE-MATRIX 更新 — **骨架已定,待独立认领**
|
||||
6. [ ] P4 分支 `feature/workflow-key-namespace`(D12 alias 兼容式改名 + 双路径回归)— **骨架已定,待独立认领**
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] `go vet ./...` && `go test -short` 相关包 PASS(P0+P1)
|
||||
- [x] 齐套断言:manifest 60 任务 ↔ `templates/docs/rd_*.md` 存在非空;rd_ 键与既有任务键不相交
|
||||
- [x] precheck:main 未 completed 时 rd 任务启动被拒且文案含 CDO
|
||||
- [ ] PG 集成:rdev 实例 planning→live→推进(`TestPG_RDevActivateWithNAClose`,需 `TEST_DATABASE_URL`)
|
||||
- [ ] web `npm test && npm run build` PASS;Playwright 抽检激活/推进(P2)
|
||||
- [ ] 真实 PI + MiniMax 三样本 E2E 报告归档 `.doc/test-reports/`(P3)
|
||||
- [ ] P4:旧 live 实例(旧键)+ 新实例(新键)双路径回归 PASS;全工作流任务键集合无交集
|
||||
|
||||
## 相关链接
|
||||
|
||||
- 设计方案: [07-研发工作流rdev接入-设计与实施计划](../../system-design/project-workflow/07-研发工作流rdev接入-设计与实施计划.md)
|
||||
- 参考调研: [2026-09-17-rdev-workflow-reference-analysis](../research/2026-09-17-rdev-workflow-reference-analysis.md)
|
||||
- 二期 backlog: [2026-09-17-rdev-phase2-backlog](../../backlog/2026-09-17-rdev-phase2-backlog.md)
|
||||
- Checklist: -
|
||||
- Handoff: -
|
||||
- Test report: -
|
||||
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- 参考项目:`.refs/weichen-agent-system`(configs/workflows/rdev.yaml 60 stage、templates/docs 60 模板、squads/overlays 配套)
|
||||
- 关键约束:WF-DEF-06(无流程级依赖,precheck 先例 test_manager);doc_id `doc_proj{pid}_{taskKey}` 平铺命名 → rd_ 前缀
|
||||
|
||||
## 合入说明(2026-09-17)
|
||||
|
||||
- P0+P1 已 `--no-ff` 合入本地 `dev`(含 template-depth S0+S1)。
|
||||
- P2/P3/P4 仍 planned,待独立认领。
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
title: "临时验证脚本 Path 空字符串拼接导致跨任务取证串味"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
severity: low
|
||||
---
|
||||
|
||||
# 临时验证脚本 Path 空字符串拼接导致跨任务取证串味
|
||||
|
||||
## 现象
|
||||
|
||||
S0.3 真 PI 打样归档时,`rd_design_input_spec-final.md` 一度被写成无关客户的商务对标报告(「掌上无线超声系统 × GE Vscan / Philips Lumify」),而非设计输入规格书终稿。
|
||||
|
||||
## 根因分析
|
||||
|
||||
产品侧小队/工作区创建正常:失败的 `rd_*` 请求因 main-completed 硬 precheck 拒绝,`task_runs.WorkspaceID` 如实为空。
|
||||
|
||||
缺陷在**本地临时取证脚本**(`.doc/test-reports/assets/2026-09-17-rdev-template-depth/run_s0_*.py`)的兜底逻辑:
|
||||
|
||||
1. `ws_id = pi_result.get("workspace_id") or ""` 在响应无该字段时得到空串;
|
||||
2. Python `pathlib`:`Path(bizdev_root) / ""` **坍缩为父目录本身**(无报错);
|
||||
3. 随后 `root.rglob("output.md")` 扫遍共享 `data/dev/workspaces/bizdev/` 全树;
|
||||
4. 「取最长文本」启发式选中历史商务任务终稿并误归档。
|
||||
|
||||
证据:会话内 `task_runs` 失败记录 `WorkspaceID=""`;`Path('/a/b') / '' == Path('/a/b')` 可复现;误归档文件内含 `adhoc_GEVsca_...` 工作区路径。
|
||||
|
||||
## 严重度
|
||||
|
||||
`low` — 仅本地取证脚本;未污染产品库、未改小队/黑板创建逻辑;同轮已用精确工作区路径重归档并随测试报告提交干净终稿。
|
||||
|
||||
## 关联整改
|
||||
|
||||
- 无需产品代码改动。
|
||||
- 经验红线:临时验证脚本禁止「空路径拼接 + 全树 `rglob` + 取最大值」组合;`work_dir`/`WorkspaceID` 为空时必须失败退出,不得扩大搜索范围。
|
||||
|
||||
## 证据
|
||||
|
||||
- 正确终稿:`.doc/test-reports/assets/2026-09-17-rdev-template-depth/rd_design_input_spec-final.md`
|
||||
- 测试报告:`.doc/test-reports/2026-09-17-rdev-template-depth-test-report.md`
|
||||
- 工作区 ID 生成:`internal/squad/workspace.go`(`ws_%s_%d` + UnixNano)
|
||||
|
||||
## 开放问题
|
||||
|
||||
- 无。
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
title: "docgov 变更提案缺少 HTTP 路由"
|
||||
status: resolved
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
severity: medium
|
||||
---
|
||||
|
||||
# docgov 变更提案缺少 HTTP 路由
|
||||
|
||||
## 现象
|
||||
|
||||
引擎侧存在 `docgov.ProposeModification` / `DecideModificationProposal`,但服务端此前仅注册 `POST /api/v1/docgov/proposal/decide`;前端 `App.tsx`「变更方案提议」(`pendingProposal`)为本地模拟。
|
||||
|
||||
## 根因分析
|
||||
|
||||
生命周期三接口与 claim 已注册;变更提案 **propose** 路径从未暴露为 HTTP。
|
||||
|
||||
## 严重度
|
||||
|
||||
`medium` — 不阻塞编制→审核→批准主链;阻塞「认领后小队修改须提案确认」的真实治理。
|
||||
|
||||
## 处置(resolved)
|
||||
|
||||
- 新增 `POST /api/v1/docgov/proposal` → `ProposeModification`
|
||||
- 前端 `proposeModification` / `decideModificationProposal` + App 接线
|
||||
- 单测:`TestServer_DocGovProposeAndDecideHTTP`、`web/src/api/docgov.test.ts`
|
||||
- 任务:`.doc/ops/short-term/2026-09-17-docgov-modification-proposal-http.md`
|
||||
|
||||
## 证据
|
||||
|
||||
- 合入后真实 HTTP 证据见 `.doc/test-reports/assets/2026-09-17-docgov-modification-proposal-http/`
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
title: 文档编制人兼任模式源码核查
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
severity: medium
|
||||
---
|
||||
|
||||
# 文档编制人兼任模式源码核查
|
||||
|
||||
## 结论
|
||||
|
||||
当前 dev 基线 adb48c8 不支持本需求。已有标准三人审批、可选免审批、系统设置白名单可复用,但必须补齐逐文档模式、职责来源和前端多职责。
|
||||
|
||||
## 根因与证据
|
||||
|
||||
1. `internal/projectinstance/duty_mode.go`:partial 拒绝,full 要求三人分离。
|
||||
2. `internal/projectinstance/service.go`:创建者规划权限与激活后冻结已存在。新需求需在这条链上增加总授权,不能只改 UI。
|
||||
3. `internal/docduty/store.go`:HealProjectDocuments 按项目默认职责回填受控文档。`internal/docgov/project_docs.go` 在列表读取时调用;`internal/bizdev/service.go` 在生成后调用。新增逐文档策略必须阻止该链覆盖实例职责。
|
||||
4. `web/src/lib/currentDocRole.ts` 优先返回 author;`docGovActionVisibility.ts` 按单角色显示动作。同人三职会缺审核和批准入口。
|
||||
5. `internal/server/handlers.go` 三个动作端点固定使用相应 action role,并以登录身份调用引擎;`internal/docgov/state_machine.go` 可复用逐步流转。
|
||||
6. `internal/sysadmin/settings.go` 有白名单 bool 设置,但没有本需求 key;存储只保留最后修改人时间,新策略需独立版本与审计。
|
||||
|
||||
以上为静态源码核查,未查询真实用户数据,未执行功能测试,未声称线上已复现或已修复。完整源码映射与实施单元见方案。
|
||||
|
||||
## 关联方案
|
||||
|
||||
[文档编制人兼任审核批准](../remediation/2026-09-17-document-author-only-plan.md)
|
||||
|
||||
## 文档检查
|
||||
|
||||
已检查两级权限、逐文档独立性、full/none 兼容、前后端职责来源、状态与锁、并发授权撤销、成员退出、迁移及回滚。修正一处 docflow 路径为 internal/app/docflow。方案明确区分已知事实与建议口径。
|
||||
|
||||
ce-doc-review 未运行:当前工具目录未提供可调用的 skill invocation 入口;按 ce-plan 的 skill_unreachable 分支记录,不能把本地自检当作独立文档审查通过。
|
||||
|
||||
```yaml
|
||||
fixes_applied: 0
|
||||
proposed_fixes_count: 0
|
||||
decisions_count: 0
|
||||
fyi_count: 0
|
||||
skipped_reason: skill_unreachable
|
||||
skipped_detail: No callable skill invocation interface in this session; local source and consistency checks only.
|
||||
```
|
||||
|
||||
上方计数仅为未运行技能的占位,不代表产品决策已解决。开放问题仍为 R9、R10;用户未答复时保持方案建议,业务实现不得自行视为授权。
|
||||
@@ -0,0 +1,180 @@
|
||||
---
|
||||
title: "系统全面体检:任务收口、缺陷与未启用功能审计"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
severity: high
|
||||
---
|
||||
|
||||
# 系统全面体检(2026-09-17)
|
||||
|
||||
> 范围:① 规划未实现 / 需变更 / 实施中任务;② 现存与潜在 bug;③ 已实现但未启用或未测试的功能。
|
||||
> 方法:文档 SSOT 盘点(CURRENT / FEATURE-MATRIX / gap-matrix / short-term / long-term / backlog / ADR / handoff)+ Go 全量 vet/build/test + 前端 test/build + 特性开关与环境配置交叉核对。只读审计,未实施任何修改。
|
||||
> 基线验证:`go vet ./...` 与 `go build ./...` 全绿;`go test -short -count=1 ./...` 62 包全 ok;`web` npm test(380+32)与 build 通过。
|
||||
|
||||
---
|
||||
|
||||
## 一、任务状态盘点
|
||||
|
||||
### 1.1 实施中(in_progress)
|
||||
|
||||
| # | 任务 | 位置 | 剩余工作 |
|
||||
|---|------|------|----------|
|
||||
| T1 | partial/deferred 全量收口总控 | `.doc/ops/short-term/2026-09-16-partial-deferred-completion.md`(owner Cline) | W5(SWBOOT-10 真实现 + 真实 PI + UI 二次验收)、W6(FAV shadow→live 放量)、W7(D7 按 ADR 整改,待合规签字)、逐行升 done |
|
||||
| T2 | Control Center 个人中控台 | `.doc/ops/short-term/2026-09-17-control-center-server.md`(owner Kimi) | 后端 P0–P6 已签;**唯一剩余:前端 SPA 七页人工浏览器走查** |
|
||||
| T3 | 纯软件项目自举 W5b | `.doc/ops/long-term/2026-09-14-software-project-bootstrap-implementation.md` | SWBOOT-10 受控执行器(真 patch/merge)未启动,需独立安全评审,当前 fail-closed stub |
|
||||
|
||||
### 1.2 已规划未开始
|
||||
|
||||
| # | 任务 | 位置 |
|
||||
|---|------|------|
|
||||
| T4 | 首次加载性能 U1/U3–U7 | `.doc/remediation/2026-09-17-initial-load-performance-plan.md`(仅 U2 done:主 JS 传输 2.82 MB→~624 KB) |
|
||||
| T5 | 选择性模块解耦 M4–M6 | `.doc/ops/long-term/2026-09-14-selective-module-decoupling.md`(planned,owner=TBD) |
|
||||
| T6 | 产品 backlog:B5 报价复核、A5/A6 小队降级与 trace、A7 中文注释迁移、D5 KB 按环境隔离评估 | `.doc/backlog/chat-agent-p6-backlog.md`(均无任务文件) |
|
||||
| T7 | `TestReconcile_LegacyRepair_PG` 工程测试债 | gap-matrix DOC-CONTENT-CANONICAL-HASH-DRIFT 行(需隔离 PG,本机无) |
|
||||
| T8 | IAM 收尾开放项:410 退役产品拍板、R13 全量清单勾选 | handoff `2026-09-16-phase3-leftover-closeout.md` |
|
||||
|
||||
### 1.3 部分完成(partial,剩余关闭条件)
|
||||
|
||||
| 行 | 剩余关闭条件 |
|
||||
|----|--------------|
|
||||
| 纯软件项目自举 | SWBOOT-10 非 stub(W5b)+ 真实 PI 全链路 + UI 二次验收 |
|
||||
| FAV | W6 shadow 已合;live 未放量(staging→artifact→publication 各 ≥7 天观察窗) |
|
||||
| Control Center | 前端人工走查 PASS 后升 done |
|
||||
| 首次加载性能 | U1/U3–U7 |
|
||||
| 文档可靠性试点 | M1 结论「停止扩面」;M2(U5–U12)明确禁止开工,真实 PI/浏览器验收未勾 |
|
||||
|
||||
### 1.4 deferred 待决策
|
||||
|
||||
- **D7 对话数据治理**:ADR `2026-09-17-d7-chat-data-retention.md` 仍 `pending-compliance-signoff`;W7 盘点未发现违规;签字前禁止物理删除。
|
||||
- **`SEMANTIC_SUMMARY_REPLACE`**:决策默认不启用;启用须另开授权 + fail-closed 灰度。
|
||||
- **`MULTI_INTENT_PLAN_TIER` 升 confirm**:W4 证据闭环,升级需独立授权;永不默认 full。
|
||||
|
||||
### 1.5 文档漂移 / 矛盾(文档债)
|
||||
|
||||
| # | 漂移 | 涉及文件 |
|
||||
|---|------|----------|
|
||||
| D-1 | PU8 四份契约文件仍 `status: in_progress`,但 U9–U12 已升 done、报告已归档 | `.doc/ops/long-term/2026-09-16-pu8-u9/u10/u11/u12-*.md` |
|
||||
| D-2 | ADR modular-monolith-decoupling 仍「提议,等待用户确认」,但 Phase 1/2 已落地并被当作已确认结论引用 | `.doc/adr/2026-09-14-modular-monolith-decoupling.md` |
|
||||
| D-3 | audit/INDEX.md 与 remediation/INDEX.md 末行称首次加载性能「方案未实施」,与 U2 已验收矛盾 | 两个 INDEX.md(**本审计已顺手修正为准确表述**) |
|
||||
| D-4 | handoff `2026-09-15-conversation-intent-dual-tab.md` 的「未完成」已被后续 PASS 覆盖但未回标 | 该 handoff |
|
||||
| D-5 | backlog D3/D7 条目与 W2 done、W7/ADR 草案并存,backlog 未同步 | `.doc/backlog/chat-agent-p6-backlog.md` |
|
||||
| D-6 | PROJECT.md §9「剩余 blocker」表述与 gap-matrix「门禁已签、production_ready=yes」口径冲突 | `PROJECT.md` |
|
||||
|
||||
---
|
||||
|
||||
## 二、Bug 清单
|
||||
|
||||
### 2.1 确认 bug(有明确证据)
|
||||
|
||||
**后端**
|
||||
|
||||
| ID | 描述 | 证据 | 严重度 |
|
||||
|----|------|------|--------|
|
||||
| B-1 | **SSE 聊天流被全局 WriteTimeout=120s 强杀**:`server.go:350` 的 WriteTimeout 是绝对期限;`handleChatStream`(`sse.go:129`)从不调用 `extendSSEWriteDeadline`、无心跳,该机制只接到了 run-events 订阅端点。任何 >120s 的聊天回合(长 PI 推演常见)必断流 | `internal/server/server.go:350`、`internal/server/sse.go:46-64,129` | high |
|
||||
| B-2 | **`POST /tasks/run/stream` 同样无 deadline 延长/心跳**,且断线后无法续订:`sse.go:390` 写死 `Subscribe(created.RunID, 0)`,不接受 `after_seq` | `internal/server/sse.go:305-424,390` | high |
|
||||
| B-3 | `handleRunTaskStream` **静默吞 JSON 解析错误**:`_ = json.NewDecoder(r.Body).Decode(&req)`,畸形 body 以空请求走默认 `TaskKey="intake"`,可能误启动 intake 任务 | `internal/server/sse.go:315,362-364` | medium |
|
||||
| B-4 | `handleRunTaskStream` **Flush 200 SSE 头之后才做会失败的操作**(CreateAndStart/Subscribe),失败时往 SSE 流里写 JSON 错误体;同文件 chat 路径明确「授权必须在 Flush 前」,task 路径未对齐 | `internal/server/sse.go:355-360,383-393` | medium |
|
||||
|
||||
**前端**
|
||||
|
||||
| ID | 描述 | 证据 | 严重度 |
|
||||
|----|------|------|--------|
|
||||
| B-5 | **会话窗口缓存 key 不一致**:读/初次写带 `userId` 前缀,但 `loadOlder`/`loadFullDay`/`jumpToDate`/`loadDayForAnchor`/`appendLiveMessage` 等 7 处后续写入不带前缀 → 刷新/切会话恢复到旧窗口;且 LRU 驱逐只用无前缀 key,带前缀缓存永不驱逐,localStorage 只增不减 | `web/src/hooks/useChatWindow.ts:84,100,136,235,271,315,365,416,439,471`、`web/src/data/storage.ts:164-176` | high |
|
||||
| B-6 | **mount 时 IndexedDB 恢复用陈旧快照整体覆盖 deliverables**:捕获 mount 闭包、非函数式 set,resolve 前新增的 deliverable 被静默丢弃(旁边已有 `deliverablesRef` 未用) | `web/src/App.tsx:326-336` | medium |
|
||||
| B-7 | `useTaskRunStream` 返回**伪 ref**(每渲染新建对象、快照值非 live),且全仓库无消费方——误导性 API | `web/src/hooks/useTaskRunStream.ts:96` | low |
|
||||
|
||||
### 2.2 高风险隐患
|
||||
|
||||
| ID | 描述 | 证据 |
|
||||
|----|------|------|
|
||||
| R-1 | **聊天会话无归属校验**:`getOrCreateSession` 仅凭客户端传入 `session_id` 返回既有内存会话,随后直接覆盖 `sess.UserID`;非项目会话(ProjectID==0)无任何授权关卡,内存 Messages/Facts 可进入他人 Prompt 与 SSE。缓解:session ID 为纳秒时间戳不易猜 | `internal/server/server.go:394-415`、`handlers.go:181`、`sse.go:187`、`stage_access_helpers.go:251-253` |
|
||||
| R-2 | **18 个非测试文件 `rows.Next()` 循环后未查 `rows.Err()`**,中途断连静默截断结果集(ctxmgr 历史/窗口/搜索、docgov engine、freedoc、storage/cas、controlcenter tasks、`cmd/document-content-reconcile` 漏检会让 reconcile 漏报文档) | 如 `internal/ctxmgr/chat_history.go`、`internal/docgov/engine.go`、`cmd/document-content-reconcile/main.go:82` |
|
||||
| R-3 | 事件 dispatcher `Handlers` map **写持锁、读不持锁**(当前仅启动期注册则良性,动态注册即 race) | `internal/events/worker.go:87,154,234` |
|
||||
| R-4 | `memTurns` 全局幂等表只增不删且跨实例共享,长期运行内存缓增、测试间可能串扰 | `internal/ctxmgr/chat_turns.go:169` |
|
||||
| R-5 | `internal/docrevision/pg_store.go:68-208` 十余处 `_ = json.Unmarshal(...)`,账本 JSONB 损坏时静默零值化 | 同左 |
|
||||
| R-6 | 后台 ticker goroutine 无关停通道(通知提醒、vault Drain 错误被丢弃、bizdev 心跳用 `context.Background()`),`Shutdown` 未覆盖 | `notification_reminder_loop.go:15`、`vault.go:63`、`bizdev/service.go:682` |
|
||||
| R-7 | SSE 重连对 401/404 无 fail-fast:任何错误一律退避重连 40 次(~3 分钟)期间 UI 一直 thinking;`streamChat` 对畸形 data 帧直接抛错中断整条流 | `web/src/api/taskRuns.ts:108-140`、`api/chatStream.ts:122` |
|
||||
| R-8 | 组件卸载/登出不 abort 任务流,在途 SSE 继续写 localStorage | `web/src/App.tsx:595,2804` |
|
||||
|
||||
### 2.3 环境 / 配置缺陷
|
||||
|
||||
| ID | 描述 | 证据 | 严重度 |
|
||||
|----|------|------|--------|
|
||||
| E-1 | **main 环境 app `ENV=prod` 与 events `ENV=main` 不一致**:事件信封以 `Environment="prod"` 写入,而 `event_consumer_modes` 只种子 dev/test/main 三行 → app 侧 `WriterLive("prod")` 恒 false(in-process 直连不退出),events worker 按 'main' 判定 → **main 存在双写或 durable 管道空转风险**(取决于 main 行 mode)。dev/test 两服务 ENV 一致,无此问题 | `docker-compose.main.yml:90,160`、`internal/app/docflow/commands.go:276`、`goose/00040:55-59`、`internal/events/dispatcher.go:308-313` | **critical(main 专属)** |
|
||||
| E-2 | **main schema 落后两版(47 vs dev 49)**:00048 给 projects 加 13 列,当前 HEAD 代码直接 SELECT/INSERT 这些列;00049 建 system_settings。若把 dev HEAD 镜像升 main 而不先跑迁移,项目工作流查询/系统设置 API 直接 SQL 报错。**main 晋升顺序必须 events(跑迁移)先于 app** | `goose/00048`、`goose/00049`、`internal/projectworkflow/store.go:76,113` | high(晋升窗口) |
|
||||
| E-3 | `MULTI_INTENT_PLAN_TIER` 未在任何 compose environment 声明(configs/.env 设了也传不进容器);test/main 连 U9–U12 flag 都未声明 → 容器内锁死 legacy,授权升级时需先改 compose | `docker-compose.*.yml` | medium |
|
||||
| E-4 | `CURSOR_RUNNER_URL` 三环境 compose 都注入但代码零读取;cursor-agent 容器是 alpine 占位,cursor-cli 后端容器部署不可达 | `docker-compose.*.yml` | low |
|
||||
| E-5 | `ENABLE_DEV_IMPORT` 不在任何 compose/.env.example;且判断把 `cfg.Env==""` 也算 dev——配置缺失时导入门禁自动放开 | `internal/server/chat_window_api.go:171` | medium |
|
||||
| E-6 | `SEED_DEMO_USERS` 仅 test compose 显式 false;dev 依赖默认播种(demo 密码 123456),main 靠代码 `Env!="dev/test"` 兜底,主 compose 未显式关闭 | `docker-compose.test.yml:91`、`internal/auth/bootstrap.go:67-116` | low |
|
||||
| E-7 | `INTENT_V2_DECISION_TIER` 非法值回退 `query`(激进),与 `MULTI_INTENT_PLAN_TIER` 回退 `legacy`(保守)策略不一致 | `internal/intent/flags.go:47-64` | low |
|
||||
| E-8 | `publisher_gate_test.go:16` 读 `FAV_PUBLISHER_ENABLE`(少 D),与正式变量名不符,该测试门永远走默认分支 | `internal/artifactvault/publisher_gate_test.go:16` | low |
|
||||
| E-9 | main compose 的 system-db initdb 只挂 00001_baseline.sql,与 dev/test 不一致;新建卷时初始脚本漂移(依赖 events 启动迁移补齐) | `docker-compose.main.yml:23` | low |
|
||||
|
||||
---
|
||||
|
||||
## 三、已实现但未启用 / 未测试的功能
|
||||
|
||||
### 3.1 特性开关封存(实现完整,全环境 off)
|
||||
|
||||
| 功能 | 实现位置 | 状态与门禁 |
|
||||
|------|----------|-----------|
|
||||
| FAV 事件订阅者 | `internal/app/fav/subscriber.go` | 三重硬门禁:cmd/events 刻意不注册、registry fail-closed、SetMode 拒绝非 off;仅 ObserveShadow 可达 |
|
||||
| FAV 发布器 | `internal/server/vault.go:18-67` | `FAV_PUBLISHER_ENABLED=false` 三环境显式;且 VAULT_* 三变量 compose 全未声明,容器内即使开 flag 也会静默 return(E-类:实际不可误开,属设计内封存) |
|
||||
| FAV 降级读 | `internal/docquery/service.go:70` | `FAV_DEGRADED_READ=false` 红线保持 |
|
||||
| 多意图 PlanTier shadow/auto_read/confirm | `internal/app/intentflow/turn.go` | 容器内锁死 legacy(见 E-3) |
|
||||
| U9–U12 扩面 | `intentflow/expansion.go`、`mux.go` | 全 false;dev compose 已声明可调,test/main 未声明 |
|
||||
| 意图 V2 shadow/decision | `internal/intent/shadow_v2.go`、`v2_decision.go` | 三环境显式 false |
|
||||
| 语义摘要 shadow | `internal/ctxmgr/semantic_summary.go:216` | 默认 off,且仅 AGENT_BACKEND=pi-agent 时挂载 |
|
||||
| PI change-report 叙事 | `internal/docrevision/narrative.go:68` | 默认 off,仅确定性 fallback(不得冒充完整 PI) |
|
||||
| artifact-vault CLI | `cmd/artifact-vault/main.go` | 未部署 stub |
|
||||
| eventmode cutover CLI | `cmd/eventmode/main.go` | 硬门禁仅 dev 可用(`internal/events/cutover.go:13`) |
|
||||
|
||||
### 3.2 死代码 / 机制先行无消费方
|
||||
|
||||
| # | 项 | 位置 |
|
||||
|---|----|------|
|
||||
| X-1 | `SEMANTIC_FALLBACK_ENABLED` 死 flag:无任何业务消费方,仅 sysadmin 展示;三环境 compose 都在设一个没用的变量 | `internal/intent/flags.go:43`、`internal/app/app.go:285` |
|
||||
| X-2 | `SEMANTIC_SUMMARY_REPLACE` 读取后 `_=` 显式丢弃,刻意永久未接线 | `internal/ctxmgr/semantic_summary.go:257` |
|
||||
| X-3 | goose 00048 三张新表 `project_source_bindings`/`repo_path_allowlist`/`project_type_workflows` 无代码消费方(swboot 目录硬编码内存版,RepoAllowlist 为 stub) | `internal/swboot/catalog.go:92,118`、`repo_allowlist.go` |
|
||||
| X-4 | `system_settings` 白名单 6 键全部无业务消费方——可写不生效,纯机制先行 | `internal/sysadmin/settings.go:57-66` |
|
||||
| X-5 | 前端死组件:`DocumentNotificationList.tsx`(含已读回写,功能完整无挂载点)、`WorkflowPrerequisiteBanner.tsx`、`user/SettingsModal.tsx`(已被 UserSettingsModal 取代);死 API:`api/projectWorkflow.ts:71 activateWorkflow`;`data/storage.ts:141 saveMessages` deprecated no-op | web/src 各文件 |
|
||||
| X-6 | `useTaskRunStream` 伪 ref(同 B-7) | — |
|
||||
|
||||
### 3.3 测试盲区
|
||||
|
||||
| # | 盲区 | 说明 |
|
||||
|---|------|------|
|
||||
| S-1 | `TestReconcile_LegacyRepair_PG` 从未执行 | 要求隔离 PG 且硬拒绝 5433/5434/5435;canonical-hash 修复链路零自动化验证(gap-matrix 已记测试债) |
|
||||
| S-2 | 两个「永久跳过」 | `taskstream_test.go:189`(功能已删,测试成死代码应删除);`plan_owner_test.go:125`(重定向跳过) |
|
||||
| S-3 | 无测试的 cmd 入口 | `cmd/server`、`cmd/events`、`cmd/control-center`、`cmd/artifact-vault`、`cmd/dataset`、`cmd/eventmode`、`cmd/recategorize`、`cmd/document-revision-backfill`(仅 bizdev-cli、document-content-reconcile 有);`internal/controlcenter/{config,store,tasks,webui}`、`internal/observability`、`internal/workflow` 无测试文件 |
|
||||
| S-4 | **E2E 默认全不跑**:web/e2e 9 个 spec 全部被环境门禁(`RUN_UI_ACCEPTANCE=1`/`DOCREV_E2E_BASE_URL`/`INTENT_DUAL_TAB=1`),默认 `playwright test` 实跑 0 用例;`test:ui-acceptance` script 只覆盖 1 个 spec,其余 8 个无 script 入口 | web/e2e/、web/package.json:11 |
|
||||
| S-5 | 409 信封处理只覆盖部分消费方:projectMembers、freeformDoc、createTaskRun、chatSessions upsert 等 409 只能裸报错(与 FEATURE-MATRIX hardening backlog 一致) | `web/src/api/projectMembers.ts`、`freeformDoc.ts:177`、`taskRuns.ts`、`chatSessions.ts` |
|
||||
| S-6 | 前端 bundle 大 chunk 未分割(mermaid/katex/xlsx/docx 各成 >500 kB chunk,已有 precompress 缓解) | vite build 警告 |
|
||||
|
||||
---
|
||||
|
||||
## 四、结论与优先级
|
||||
|
||||
**总体判断**:发布门禁与 FEATURE-MATRIX 的 `done/partial/deferred` 口径与代码实况基本一致,未发现「stub 冒充验收」类违规;质量门禁(vet/test/build)全绿。主要风险集中在三处:
|
||||
|
||||
1. **E-1(main ENV 不一致 → 双写/空转)是唯一 critical 级发现**,且只在 main 环境存在, dev/test 的「healthy」不能证明 main 事件链路正确。
|
||||
2. **SSE 120s 断流(B-1/B-2)直接影响长任务可用性**,是用户可感知的现存 bug。
|
||||
3. **封存面(FAV/多意图 tier/U9–U12/语义摘要/PI 叙事)实现完整但容器内不可调或硬门禁封存**,红线达标,但授权放量时会发现 compose 层缺失(E-3)与若干死接线(X-1/X-2)。
|
||||
|
||||
详细整改顺序见 [remediation 方案](../remediation/2026-09-17-system-health-remediation-plan.md)。
|
||||
|
||||
## 关联整改
|
||||
|
||||
- Remediation: [2026-09-17-system-health-remediation-plan.md](../remediation/2026-09-17-system-health-remediation-plan.md)
|
||||
|
||||
## 证据
|
||||
|
||||
- `go vet ./...` / `go build ./...` / `go test -short -count=1 ./...`(62 包 ok)/ `cd web && npm test && npm run build`:2026-09-17 全绿。
|
||||
- 文中所有 `文件:行号` 引用均为 2026-09-17 dev 分支工作区实测。
|
||||
|
||||
## 开放问题
|
||||
|
||||
- E-1 的修复取向(app 改 `ENV=main` vs 事件信封/consumer mode 键改用部署名)需架构决策。
|
||||
- D7 合规签字、`MULTI_INTENT_PLAN_TIER` 升 confirm、FAV live 放量均需用户显式授权,不在本整改自动范围内。
|
||||
- configs/.env.dev/.env.test/.env.main 实际文件未读取(含密钥);若偏离 example 模板,E-3/E-4/E-6 结论需复核。
|
||||
@@ -473,4 +473,5 @@ Day 4-5: Phase C 完善与发布准备(20h)
|
||||
|
||||
*本索引最后更新于 2026-09-12 15:05 UTC*
|
||||
|
||||
- 2026-09-17:[首次加载性能诊断与改进](2026-09-17-initial-load-performance-audit.md)(三入口重启首访;方案未实施)。
|
||||
- 2026-09-17:[系统全面体检](2026-09-17-system-health-check.md)(任务收口 / 缺陷 / 未启用功能;配套 [整改方案](../remediation/2026-09-17-system-health-remediation-plan.md) Wave0–7)。
|
||||
- 2026-09-17:[首次加载性能诊断与改进](2026-09-17-initial-load-performance-audit.md)(三入口重启首访;U2 已验收,主 JS ~624 KB;U1/U3–U7 待实施)。
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
# rdev 研发工作流二期增强 Backlog
|
||||
|
||||
> 来源:[07-研发工作流rdev接入-设计与实施计划](../system-design/project-workflow/07-研发工作流rdev接入-设计与实施计划.md) §8 决策 3——首期 N/A 采用「激活规划期关闭」,以下增强项不阻塞首期交付,**用户要求记录以便随时续推进**。
|
||||
> 创建:2026-09-17。每项建议独立 short-term 任务认领。
|
||||
|
||||
## 优先级排序(建议)
|
||||
|
||||
### R1 N/A 不适用页生成模式(对齐参考项目行为)
|
||||
|
||||
- 现状:skippable 任务在激活规划期由创建者关闭 = 不适用;
|
||||
- 目标:保留任务但可生成「不适用说明页」(完整论述理由而非一句话),仍走审核/批准,再进入下一阶段(参考项目 rdev_software overlay 语义);
|
||||
- 涉及:manifest 不适用模式标记、bizdev 执行 N/A 生成路径、squad N/A 编排、前端规划 UI「保留但声明不适用」选项;
|
||||
- 验收:软件类任务声明不适用 → 生成完整不适用页 → 审批通过 → 阶段可推进。
|
||||
|
||||
### R2 UR/RS 结构化质量门禁(复用 PM requirements.json 模式)
|
||||
|
||||
- 范围:`rd_user_needs`、`rd_system_reqs`(及 `pm_system_reqs`)输出结构化需求集合;确定性门禁:ID 唯一连续、不随机抽取、缺验证准则拒绝、正文/JSON 不一致拒绝;
|
||||
- 参考先例:`quality.system_reqs.v2`。
|
||||
|
||||
### R3 review_minutes / upload_index 专用确定性门禁
|
||||
|
||||
- review_minutes(6 个评审记录):问题-决议-行动项闭环检查(拒绝空洞「同意通过」、行动项无责任人/期限);
|
||||
- upload_index(7 个附件清单):附件索引表存在性、缺失影响分析存在性检查;禁止伪造附件内容靠 Accept 纪律 + 门禁抽查「待上传后更新」结论。
|
||||
|
||||
### R4 depends_on 精确血缘与 stale 传播
|
||||
|
||||
- 现状:rd 任务 prior docs 全量注入 + 摘要级血缘;
|
||||
- 目标:per-task upstream 声明表(对齐参考项目 rdev.yaml depends_on:rd_planning_review ← rd_proposal+rd_design_plan、rd_verification_review ← rd_design_vv+rd_risk_report_v 等),上游新版本批准 → 下游 stale 且不能完成;
|
||||
- 参考先例:test_manager 对 approved SR 的 stale 传播(projectworkflow/service.go)。
|
||||
|
||||
### R5 DMR 双记录归档
|
||||
|
||||
- 参考项目 `records: [dhf, dmr]` 的设计输出/转换文档在本仓库无对应物;需评估文档「记录归属」字段扩展 + 归档/导出按 DHF/DMR 分类(本仓库无云盘,先落 docgov 元数据与导出分类)。
|
||||
|
||||
### R6 软件工作流任务键 `sw_` 前缀盘点(并入 P4 或其后)
|
||||
|
||||
- `software_bootstrap`/`software_delivery`(executor `software.doc.v1`)任务键盘点并纳入统一命名空间规约(D12 的遗留尾巴)。
|
||||
|
||||
### R7 高复杂度 regulatory 步注入策略
|
||||
|
||||
- 现状:D7 中 regulatory 按任务清单静态注入;目标:接 `complexity_tier`(complexity_high/medium 分层)动态注入,对齐参考项目 `when: complexity_tier=high`。
|
||||
|
||||
## 依赖关系
|
||||
|
||||
- R2/R3 可并行;R4 依赖 manifest 落地后的 upstream 声明表;R1 独立;R5/R6/R7 低优先级。
|
||||
|
||||
---
|
||||
|
||||
## 模板深度与运行时续批(S1 续批 / S2 / S3)
|
||||
|
||||
> 来源:Kimi 分析方案 + [2026-09-17-rdev-template-depth](../archive/ops/2026-09-17-rdev-template-depth.md) 收口。S0 + S1 首批(14 份)已交付;以下不阻塞本轮合并候选。
|
||||
|
||||
### S1 续批 — 剩余模板专业章节
|
||||
|
||||
- **状态**:✅ **done**(2026-09-17)— 46 份全部同等深度补强;allowlist 60/60;真 PI `rd_planning_review` + `rd_design_vv` PASS
|
||||
- **证据**:[测试报告](../test-reports/2026-09-17-rdev-template-depth-s1-continued-test-report.md);[short-term](../ops/short-term/2026-09-17-rdev-template-depth-s1-continued.md)
|
||||
|
||||
### S2 — 运行时编排与配置化
|
||||
|
||||
- per-stage 步骤覆盖(相对默认 organize→engineer→draft→review 的阶段差异)
|
||||
- regulatory 步接 `complexity_tier`(与 R7 可合并认领)
|
||||
- 模型去硬编码(配置/环境驱动)
|
||||
- manifest hint + aliases 元数据补齐
|
||||
|
||||
### S3 — overlay 与质量门禁扩面
|
||||
|
||||
- 轻量 overlay 机制(模板管结构;overlay/运行时管纪律与粒度下限)
|
||||
- R2/R3 专用确定性门禁落地
|
||||
- P3:三样本真 PI E2E 报告 + CI 四工作流门禁挂钩
|
||||
@@ -5,6 +5,6 @@
|
||||
- **B5** 报价模块接入轻量复核与输入范围校验(`internal/quote/`)
|
||||
- **A5/A6** 小队工作流支持非关键步骤降级;并行 trace 序号改单次加锁读-算-写(`internal/squad/`)
|
||||
- **A7** 将中文注释中的已知限制迁移为正式 issue
|
||||
- **D3** 摘要引擎替换为语义摘要(依赖模型接入,需单独评估)(`internal/ctxmgr/summarizer.go`)
|
||||
- **D3**(已实现,shadow)摘要引擎语义摘要能力已落地:`SEMANTIC_SUMMARY_SHADOW` 默认 off,见 [FEATURE-MATRIX「语义摘要(D3)」行](../status/FEATURE-MATRIX.md)、[PU6 契约](../ops/long-term/2026-09-16-pu6-semantic-summary-contract.md)(`status: done`)、[W2 真 PI 报告](../test-reports/2026-09-17-w2-semantic-summary-shadow-test-report.md)。`SEMANTIC_SUMMARY_REPLACE` 仍未接线(红线,需独立授权)。本行状态转入 FEATURE-MATRIX 常态跟踪,不再作为独立 backlog 开放项
|
||||
- **D5** 知识库按环境隔离方案评估(当前三环境共享 KB 为 intentional 架构)
|
||||
- **D7** 对话数据留存期限与敏感字段加密(先对齐合规再定技术方案)
|
||||
- **D7** 对话数据留存期限与敏感字段加密——草案 ADR [2026-09-17-d7-chat-data-retention.md](../adr/2026-09-17-d7-chat-data-retention.md)(`compliance: pending-compliance-signoff`);[W7 只读盘点](../audit/2026-09-17-d7-data-inventory.md) 未发现基线违规,见 [报告](../test-reports/2026-09-17-w7-d7-inventory-test-report.md)。签字前禁止按 365/180/30 物理删除;本行继续跟踪合规签字进度
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
---
|
||||
title: "dev 试点:开放编制人兼任总开关"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
---
|
||||
|
||||
# dev 试点:开放编制人兼任总开关
|
||||
|
||||
## 结论
|
||||
|
||||
在运行中的 `agent-dev`(`:8080`,schema 52)经 admin CAS 将 `workflow.allow_author_only_approval` 设为 `true`(revision `0 → 1`)。**未**改默认迁移值;**未**晋升 test/main;test/main 仍保持默认 off。
|
||||
|
||||
## 证据(脱敏)
|
||||
|
||||
- [before-enable.json](../../test-reports/assets/2026-09-17-author-only-pilot/before-enable.json)
|
||||
- [put-enable.txt](../../test-reports/assets/2026-09-17-author-only-pilot/put-enable.txt)
|
||||
- [after-enable.json](../../test-reports/assets/2026-09-17-author-only-pilot/after-enable.json)
|
||||
|
||||
## 关联
|
||||
|
||||
- author-only 收口:[../handoffs/2026-09-17-document-author-only-closeout.md](../handoffs/2026-09-17-document-author-only-closeout.md)
|
||||
@@ -1,19 +1,36 @@
|
||||
# 当前焦点
|
||||
|
||||
**更新**: 2026-09-17
|
||||
**production_ready**: yes(门禁 B1–B4 已签;dev/test `schema_version=48`;main `schema_version=47`;goose 00048 已在 test 迁移。不把 fallback change report 写成完整 PI)
|
||||
**更新**: 2026-09-18
|
||||
**production_ready**: yes(门禁 B1–B4 已签;dev schema 52;test `schema_version=48`;main `schema_version=52`、`env=main`。不把 fallback change report 写成完整 PI)
|
||||
|
||||
## 焦点
|
||||
|
||||
1. **partial/deferred 全量收口**:W1–W4 **done**;W5a **done**;W6 **shadow done**;W7 **盘点 done**。test 已至 `rc-v1.0.0-beta.4`(含 optional-duty null FK)
|
||||
2. **运维**:nightly `DATA_DIR=dev` 已对齐;KB 宿主机分层加载 / fail-closed **done**
|
||||
3. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`(升 `confirm` 须 W4 闭环后独立授权);`SEMANTIC_SUMMARY_REPLACE` 不随 W2 开启;FAV live 顺序 staging→artifact→publication、每级观察窗证据驱动(下限 ≥7 天)、`FAV_DEGRADED_READ=false`;flag 默认 off;项目 143 只读
|
||||
1. **系统体检整改**:Wave 0–7 **done**(Wave 7 编排确认见 [决策记录](./short-term/2026-09-18-wave7-roadmap-orchestration.md))
|
||||
2. **已裁决(supersede)**:`feature/control-center-server` 取代 `engineering-dashboard`;合并前门禁进行中,见 [任务](./short-term/2026-09-17-control-center-server.md)
|
||||
3. **rdev 模板深度 / document-author-only**:已合入 `origin/dev`;未晋升 test/main
|
||||
4. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`;`SEMANTIC_SUMMARY_REPLACE` 不随 W2 开启;FAV live 观察窗证据驱动;`FAV_DEGRADED_READ=false`;项目 143 只读;SWBOOT-10 保持 fail-closed stub;D7 待合规签字
|
||||
|
||||
## 并行认领
|
||||
|
||||
| owner | task | branch | worktree | mutex | status |
|
||||
|-------|------|--------|----------|-------|--------|
|
||||
| Kimi | 2026-09-17-control-center-server | feature/control-center-server | - | controlcenter | in_progress |
|
||||
| Cursor-Auto | 2026-09-17-control-center-server | feature/control-center-server | - | controlcenter | in_progress |
|
||||
| Kimi | 2026-09-18-user-manual | feature/user-manual | .worktrees/feature-user-manual | docs | done |
|
||||
| Cursor-Auto | 2026-09-18-wave7-roadmap-orchestration | docs/wave7-roadmap-orchestration | - | roadmap-orchestration | done |
|
||||
| Cursor-Auto | 2026-09-18-wave6-doc-drift | docs/wave6-doc-drift | - | doc-drift | done |
|
||||
| Cursor-Auto | 2026-09-18-wave5-deadcode-decisions | fix/wave5-deadcode-decisions | - | deadcode-cleanup | done |
|
||||
| Cursor-Auto | 2026-09-18-wave4-hardening-r1-r8 | fix/wave4-hardening-r1-r8 | - | hardening | done |
|
||||
| Cursor-Auto | 2026-09-18-wave3-test-debt-blindspots | fix/wave3-test-debt-blindspots | - | test-debt | done |
|
||||
| Cursor-Auto | 2026-09-18-wave2-config-flag-align | fix/wave2-config-flag-align | - | infra | done |
|
||||
| Cursor | 2026-09-18-wave1-main-env-fix | fix/wave1-main-env-fix | - | infra | done |
|
||||
| Cursor | 2026-09-18-wave0-p0-bug-fixes | fix/wave0-p0-sse-chat-cache-bugs | - | chat + web | done |
|
||||
| Kimi | 2026-09-17-system-health-check(只读审计,未实施) | - | - | audit | done |
|
||||
| Cursor | 2026-09-17-docgov-modification-proposal-http | feature/docgov-modification-proposal-http | - | docgov | done |
|
||||
| Cursor | 2026-09-17-document-author-only-closeout | feature/document-author-only-plan | - | document-duty-policy | done |
|
||||
| Cursor | 2026-09-17-rdev-template-depth-s1-continued | feature/rdev-template-depth-s1-continued | .worktrees/feature-rdev-template-depth-s1-continued | rdev-templates | done |
|
||||
| Cursor | 2026-09-17-rdev-workflow-integration | feature/rdev-core | - | workflow-def | done |
|
||||
| Cursor | 2026-09-17-rdev-template-depth | feature/rdev-template-depth | .worktrees/feature-rdev-template-depth | rdev-templates | done |
|
||||
| Codex | 2026-09-17-document-author-only-plan | feature/document-author-only-plan | - | document-duty-policy-plan | done |
|
||||
| Cursor | 2026-09-17-initial-load-perf-u2 | feature/initial-load-perf-u2 | - | web + static-delivery | done |
|
||||
| Codex | 2026-09-17-initial-load-performance-plan | feature/initial-load-performance-plan | .worktrees/feature-initial-load-performance-plan | loading-performance-audit | done |
|
||||
| Kimi | 2026-09-17-system-admin-console | feature/system-admin-console | - | web + sysadmin | done |
|
||||
@@ -126,7 +143,7 @@
|
||||
|
||||
| holder | phase | since | scope | queue |
|
||||
|--------|-------|-------|-------|-------|
|
||||
| - | idle | - | - | - |
|
||||
| - | idle | 2026-09-18 | feature/user-manual 已合入 dev@6c2fbc4,dist 交付物补录 fix/user-manual-dist 已合入(纯文档;go vet / go test -short PASS,dev 健康检查 200) | - |
|
||||
|
||||
**phase**: `idle` | `merging` | `smoke` | `e2e`
|
||||
|
||||
@@ -136,9 +153,9 @@
|
||||
|
||||
| 环境 | 端口 | schema | 状态 |
|
||||
|------|------|--------|------|
|
||||
| dev | 8080 | **49** | healthy(`pi-agent` typed-result-v1;events worker `:8088`;notify/advance/projection live、fav off;health+ready PASS;goose 00049 system_settings 已迁移;demo 6001–6010 retired) |
|
||||
| test | 8081 | **48** | healthy(`rc-v1.0.0-beta.4`;pi-agent `:18866`;events `:8089`;notify/advance/projection live、fav off;health+ready PASS;goose 00048 已迁移) |
|
||||
| main | 8000 | **47** | healthy(app + events + runner + DB;与 dev/test 对齐) |
|
||||
| dev | 8080 | **52** | healthy(含 author_only goose 00050–00052;`pi-agent`;events `:8088`;**试点** `workflow.allow_author_only_approval=true`) |
|
||||
| test | 8081 | **52** | healthy(Wave 2 rebuild 后 schema 与 dev/main 对齐;pi-agent `:18866`;events `:8089`) |
|
||||
| main | 8000 | **52** | healthy(`env=main` app+events 对齐;events 先 healthy 后启 app;consumer modes 全 off;Wave 1 已验证) |
|
||||
|
||||
## SSOT
|
||||
|
||||
@@ -150,6 +167,7 @@
|
||||
| 连续性审计/计划 | [audit](../audit/2026-09-16-feature-matrix-production-readiness-audit.md) · [remediation](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) · [Wave 0 任务](./short-term/2026-09-16-feature-matrix-wave0-calibration.md) |
|
||||
| 测试报告 | [test-reports/](../test-reports/) |
|
||||
| D7 盘点(W7) | [audit](../audit/2026-09-17-d7-data-inventory.md) · [报告](../test-reports/2026-09-17-w7-d7-inventory-test-report.md) · ADR 仍 `pending-compliance-signoff` |
|
||||
| Wave 7 编排确认 | [决策记录](./short-term/2026-09-18-wave7-roadmap-orchestration.md) |
|
||||
| Agent 手册 | [AGENTS.md](../../AGENTS.md) |
|
||||
| 意图双标签 busy 交接 | [./handoffs/2026-09-15-conversation-intent-dual-tab.md](./handoffs/2026-09-15-conversation-intent-dual-tab.md) |
|
||||
| 受控正文 hash 漂移 W1–W6 | [../ops/handoffs/2026-09-14-controlled-content-canonical-hash.md](../ops/handoffs/2026-09-14-controlled-content-canonical-hash.md) |
|
||||
|
||||
@@ -65,3 +65,13 @@ curl -sf http://127.0.0.1:8080/ready
|
||||
- CURRENT: [CURRENT.md](../CURRENT.md)
|
||||
- Task: [../short-term/2026-09-13-conversation-intent-runtime-state.md](../short-term/2026-09-13-conversation-intent-runtime-state.md)
|
||||
- Test report: [../../test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md](../../test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md)
|
||||
|
||||
## 回标(2026-09-18,Wave 6 文档漂移修复)
|
||||
|
||||
上方「未完成」与「认领 / 槽位状态」两节是 2026-09-15 交接时刻的快照,**已在同一提交(`8a8f64a`)内被后续证据覆盖**:
|
||||
|
||||
- 浏览器双标签刷新恢复 / busy 租约可见性:项目 6275、`sess-p6275-u10` 真实 PI + Docker 截图(`dual-tab-live.py`、`live.json`、`window-before-refresh.json`、`window-after-refresh.json`、`screenshots/tab-b-after-reload.png` 等,均在同一提交归档)。
|
||||
- `CHAT-INTENT-STATE` 已在 [gap-matrix](../../remediation/gap-matrix.md) 标记 **PASS**(「双标签活验项目 6275 / `sess-p6275-u10`」)。
|
||||
- mutex 已释放:CURRENT.md 当前无该任务 `in_progress` 行;集成槽位 holder 为 `idle`。
|
||||
|
||||
**结论**:本 handoff 无待办事项,`status: closed` 生效,仅为历史记录保留原文,不删除。
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
---
|
||||
title: "document-author-only U1–U6 收口交接"
|
||||
status: done
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-17
|
||||
from: Cursor
|
||||
to: integrator
|
||||
---
|
||||
|
||||
# document-author-only U1–U6 收口交接
|
||||
|
||||
## 结论
|
||||
|
||||
实现与验收任务已全部收口:U1–U6 short-term 已迁入 `archive/ops/`;FEATURE-MATRIX / remediation DoD(除发布末条)已更新;U6 报告已归档。
|
||||
|
||||
**远端**:已 `git-push-dev.sh` 推送 `origin/dev`(含 author-only merge);**未**晋升 test/main。
|
||||
|
||||
**dev 试点**:`workflow.allow_author_only_approval=true`(revision 1);证据见 [pilot assets](../../test-reports/assets/2026-09-17-author-only-pilot/) 与 [ops 笔记](../2026-09-17-author-only-pilot-toggle.md)。
|
||||
|
||||
## 分支
|
||||
|
||||
- `feature/document-author-only-plan` — 已合入并清理 worktree/本地分支
|
||||
- 续作:`feature/docgov-modification-proposal-http`(变更提案 HTTP)
|
||||
|
||||
## 合入 `dev`(已完成)
|
||||
|
||||
- `merge --no-ff feature/document-author-only-plan` → 后续推送至 `origin/dev@ba92a8b` 一带
|
||||
- 冒烟:`go vet` / `go test -short` 相关包 PASS;`./scripts/env-service.sh dev rebuild`;`GET /health` → `schema_version=52`、`status=ok`
|
||||
- 总开关默认迁移值仍为 off;**dev 运行态**已 CAS 试点开启;**未**晋升 test/main
|
||||
|
||||
## 明确不在本期(已转入续作)
|
||||
|
||||
- ~~变更提案 HTTP 路由~~ → [short-term](../short-term/2026-09-17-docgov-modification-proposal-http.md) / [audit resolved](../../audit/2026-09-17-docgov-modification-proposal-http-gap.md)
|
||||
- test/main 晋升仍另授
|
||||
|
||||
## 证据
|
||||
|
||||
- [U6 报告](../../test-reports/2026-09-17-document-author-only-u6-test-report.md)
|
||||
- [方案 DoD](../../remediation/2026-09-17-document-author-only-plan.md)
|
||||
- [pilot](../../test-reports/assets/2026-09-17-author-only-pilot/)
|
||||
@@ -63,6 +63,8 @@ L1(SWBOOT-00…09 契约/迁移/目录钩子 + SWBOOT-10 stub)**已合入 `d
|
||||
|
||||
L1 已合 `dev`。W5a 从 `dev` 开 `feature/w5a-software-bootstrap-ui-pi`(mutex `workflow-design`)。W5b 受控执行器未启动,SWBOOT-10 保持 fail-closed stub。
|
||||
|
||||
**Wave 5 X-3(2026-09-18)**:goose 00048 三表(`project_types` / `compliance_profiles` / `project_type_workflows`;另含零读者的 `project_source_bindings` / `repo_path_allowlist`)消费方接线评估结论 = **deferred → SWBOOT-10/W5b**。不改 schema;API 继续硬编码目录。决策落点:[wave5-deadcode-decisions.md#x-3](../short-term/2026-09-18-wave5-deadcode-decisions.md#x-3)。不阻塞 W5b 立项。
|
||||
|
||||
## 相关链接
|
||||
|
||||
- [详细设计](../../system-design/2026-09-14-software-project-bootstrap-workflow.md)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: "PU8-U10 mutate — 获批后任务契约"
|
||||
status: in_progress
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-17
|
||||
updated: 2026-09-18
|
||||
owner: Cursor
|
||||
branch: feature/w4-u9-segment-live
|
||||
mutex: intent-plan
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: "PU8-U11 docgov action — 获批后任务契约"
|
||||
status: in_progress
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-17
|
||||
updated: 2026-09-18
|
||||
owner: Cursor
|
||||
branch: feature/w4-u9-segment-live
|
||||
mutex: intent-plan
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: "PU8-U12 workflow/run-control — 获批后任务契约"
|
||||
status: in_progress
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-17
|
||||
updated: 2026-09-18
|
||||
owner: Cursor
|
||||
branch: feature/w4-u9-segment-live
|
||||
mutex: intent-plan
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: "PU8-U9 segment proposal — 获批后任务契约"
|
||||
status: in_progress
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-17
|
||||
updated: 2026-09-18
|
||||
owner: Cursor
|
||||
branch: feature/w4-u9-segment-live
|
||||
mutex: intent-plan
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
---
|
||||
title: "参考项目 weichen-agent-system 研发工作流(rdev)文档关系与阶段组成梳理"
|
||||
created: 2026-09-17
|
||||
status: done
|
||||
confidence: high
|
||||
---
|
||||
|
||||
# 调研:参考项目 weichen-agent-system 研发工作流(rdev)文档关系与阶段组成梳理
|
||||
|
||||
## 结论
|
||||
|
||||
参考项目 `.refs/weichen-agent-system` 中的「研发流程」(`key: rdev`)是与商务对接(bizdev)、测试经理(test_manager)、产品经理(product_manager)并列的第 4 个工作流,`kind: followon`、`after: bizdev`:商务对接末阶段 CDO 报价批准后才可启动。rdev 共 **60 个阶段(文档任务)**,按 **13 个 phase(01–13)** 组织成 ISO 13485 设计控制链(策划 → 输入 → 输出 → 验证 → 转换 → 确认),每阶段恰好对应 `templates/docs/<stage_key>.md` 一份自描述模板,并有 overlays(工作流级 `rdev.md` + 阶段簇 `rdev_phNN.md` + 文档类型 `kind_*.md`)与 `configs/squads/rdev.yaml` 五步小队编排三层配套。
|
||||
|
||||
## 证据
|
||||
|
||||
| 项 | 路径/命令 | 结果 |
|
||||
|----|-----------|------|
|
||||
| 工作流定义 | `.refs/weichen-agent-system/configs/workflows/rdev.yaml` | 1473 行;`key: rdev` `kind: followon` `after: bizdev`;60 个 stage |
|
||||
| 阶段齐套校验 | `.refs/weichen-agent-system/scripts/e2e-rdev.sh` | 脚本内置断言 `want 60 rdev stages`,逐 stage 校验 `templates/docs/<key>.md` 存在且非空,末模板须含「签署」 |
|
||||
| 小队编排 | `.refs/weichen-agent-system/configs/squads/rdev.yaml` | `default_steps`:organizer → engineer(+regulatory 可选并行)→ writer → leader;关键 stage 覆盖专属 steps |
|
||||
| 任务叠加 | `.refs/weichen-agent-system/configs/overlays/rdev.md`、`rdev_ph01…ph13.md`、`rdev_software.md`、`kind_review_minutes.md`、`kind_upload_index.md`、`kind_design_record.md` | 工作流级 / 阶段簇 / 文档类型三层叠加,`### role:` 按专员过滤 |
|
||||
| 研发负责人人设 | `.refs/weichen-agent-system/configs/agents/rdev_leader.md` | 「研发/设计控制小队负责人…按 ISO 13485 把本阶段做成可追溯的 DHF 记录」 |
|
||||
| 插件 | `.refs/weichen-agent-system/plugins/rdev/plugin.go` | 不注册生成意图,启动走生命周期 `start_workflow`(说法「启动研发流程」) |
|
||||
| 官方说明 | `.refs/weichen-agent-system/docs/workflows.md` §研发流程、`docs/handoff.md` §研发流程(followon) | 约 60 阶段、每阶段一份 Word(RD-…)、不适用须完整理由并仍走审核/批准 |
|
||||
| Canonical 归档 | `docs/cloud-drive.md` | `archive/dhf/{NN-阶段名}/{nn-产出}`;`records` 含 `dmr` 且已批准再拷 `archive/dmr/` |
|
||||
|
||||
## 研发工作流的文档关系(五层结构)
|
||||
|
||||
```text
|
||||
configs/workflows/rdev.yaml ← 阶段 SSOT:key/标题/phase/records/artifact_kind/docx 元数据/fields/depends_on/skippable
|
||||
│ 一一对应(stage key = 模板文件名)
|
||||
▼
|
||||
templates/docs/<stage_key>.md ← 自描述模板:文件编号 RD-…、记录归属 DHF(/DMR)、阶段 NN、
|
||||
│ 结论/适用性/正文/追溯表/材料摘要/待确认清单/签署 固定骨架
|
||||
▼
|
||||
configs/squads/rdev.yaml ← 小队编排:default_steps + 个别 stage 覆盖(五步编制流水线)
|
||||
▼
|
||||
configs/overlays/*.md ← 任务叠加(注入 TASK 的阶段级撰写指导,多层):
|
||||
① rdev.md(工作流级全员质量红线)
|
||||
② rdev_phNN.md(阶段簇,ph01–ph13)
|
||||
③ kind_review_minutes / kind_upload_index / kind_design_record(文档类型)
|
||||
④ rdev_software.md(软件类阶段专项)+ 个别 stage 特例 overlay
|
||||
▼
|
||||
plugins/rdev/plugin.go ← 运行时入口:启动走生命周期 start_workflow(followon 门禁),
|
||||
不注册生成意图;启动时从 bizdev 拷贝已填字段(产品类型/预期用途/目标市场等)
|
||||
```
|
||||
|
||||
- **模板即文档**:每份模板头部自带「文件编号 / 记录归属 / 版本 / 阶段」元数据,与 rdev.yaml 中 stage 的 `docx.code`(RD-…)和 `phase` 一致;`scripts/e2e-rdev.sh` 强制校验 60 个 key 与模板一一对应。
|
||||
- **记录归属双轨**:`records: [dhf]`(设计历史文件)为主;设计输出/转换类文档 `records: [dhf, dmr]`(同时属器械主记录),批准后额外拷贝到 `archive/dmr/`。
|
||||
- **追溯链**:每份模板含固定「追溯」表(本文件 ID ↔ 上游输入 ↔ 下游验证/确认),需求类要求 UR→RS 追溯主表(见 `kind_design_record.md`)。
|
||||
- **评审依赖**:评审记录类 stage 用 `depends_on` 显式声明上游(如 `verification_review` depends_on `design_vv`、`risk_report_v`)。
|
||||
- **不适用机制**:每 stage 都有 `applicability` / `na_rationale` 字段;软件类/动物试验/临床等 15 个 stage 标 `skippable: true` + `skip_hint`,不适用仍须生成完整不适用页并走审核/批准。
|
||||
|
||||
|
||||
## 工作流阶段组成(13 个 phase / 60 个 stage)
|
||||
|
||||
| Phase | 阶段簇 overlay | Stage(key → 文档) | 数量 |
|
||||
|-------|--------|--------------------|------|
|
||||
| 01 策划 | rdev_ph01 | `proposal` 项目建议书、`design_plan` 设计开发计划任务书 | 2 |
|
||||
| 02 策划评审 | rdev_ph02 | `planning_review` 策划评审记录(depends: proposal, design_plan) | 1 |
|
||||
| 03 设计输入 | rdev_ph03 | `user_needs` 用户需求规格书(UN)、`regs_stds` 法规和标准清单、`adverse_events` 同类产品不良事件、`system_reqs` 系统需求规格书(SR)、`risk_plan` 风险管理计划、`hazard_analysis` 危险分析、`sw_plan`*/`sw_reqs`*/`sw_config`* 软件三件套、`design_input_spec` 设计输入规格书、`design_input_list` 设计输入清单、`system_design` 系统设计方案 | 12 |
|
||||
| 04 需求评审 | — | `req_review` 需求评审记录(depends: user_needs, system_reqs) | 1 |
|
||||
| 05 输入阶段评审 | — | `input_phase_review` 阶段3和4评审记录(depends: design_input_spec/list, req_review) | 1 |
|
||||
| 06 设计输出 | rdev_ph06 | `drawings_3d` 图纸3D、`product_bom` BOM、`ee_bom`*/`pcba`*/`electrical_sys`* 电气三件套、`sw_arch`*/`sw_ui`* 软件、`purchase_spec` 采购规范、`process_flow` 工艺流程、`packaging` 包装、`ifu` 说明书、`incoming_iqc`/`ipqc`/`fqc` 三级检验、`tech_req` 产品技术要求、`risk_report` 风险管理报告、`design_output_list` 设计输出清单 | 17 |
|
||||
| 07 输出评审 | — | `output_review` 阶段6评审(depends: design_output_list) | 1 |
|
||||
| 08 验证 | rdev_ph08 | `prototype_photos` 样机照片、`design_vv` 设计验证方案、`shelf_life` 货架寿命、`lifetime` 使用期限、`biocompatibility` 生物学、`cleaning` 清洁消毒、`emc_safety`* EMC安规、`risk_report_v` 验证风险报告、`sw_release`*/`sw_unit_test`*/`sw_sys_test`* 软件三件套、`qualified_suppliers` 合格供方 | 12 |
|
||||
| 09 验证评审 | — | `verification_review`(depends: design_vv, risk_report_v) | 1 |
|
||||
| 10 转换 | — | `dmr_list` DMR文件清单、`pack_ship` 包装运输、`risk_report_t` 转换风险报告 | 3 |
|
||||
| 11 转换评审 | — | `transfer_review`(depends: dmr_list, pack_ship, risk_report_t) | 1 |
|
||||
| 12 确认 | — | `validation_plan` 设计确认方案、`use_error` 使用错误、`animal_study`* 动物试验、`sw_quality`* 软件质量、`clinical`* 临床试验报告、`risk_report_val` 确认风险报告、`user_test` 用户测试 | 7 |
|
||||
| 13 设计确认报告 | — | `design_validation_report` 设计确认报告(末阶段,批准后项目 done) | 1 |
|
||||
|
||||
合计 60,与 `e2e-rdev.sh` 的 `want 60 rdev stages` 断言一致。(`*` = `skippable: true`,实测 grep 共 15 个:软件 9 个(sw_plan/sw_reqs/sw_config/sw_arch/sw_ui/sw_release/sw_unit_test/sw_sys_test/sw_quality)+ 电气 3 个(ee_bom/pcba/electrical_sys)+ emc_safety + animal_study + clinical)
|
||||
|
||||
**artifact_kind 三类**(grep 实测):`document`(常规成文,47 个)、`review_minutes`(评审记录,6 个)、`upload_index`(附件清单/上传索引,7 个,只建索引不伪造内容)。各 kind 有独立 overlay 质量要求。
|
||||
|
||||
## 小队与治理机制
|
||||
|
||||
- **小队编制**:复用整理(organizer)/技术(engineer)/撰写(writer)/法规(regulatory)/检索(searcher)专员,种子化「研发流程负责人」(rdev_leader);市场与财务不进研发小队。
|
||||
- **默认五步**:organizer(抽材料事实+回填字段+blackboard facts/gaps/implications)→ engineer(技术内容与追溯,可并行)→ regulatory(仅 complexity_tier=high,可选并行)→ writer(按模板成稿)→ leader(二审完整性/粒度/不适用理由/有无编造,不达标退回)。
|
||||
- **门禁**:启动前必须 bizdev CDO 已批准(e2e 脚本专门验证「CDO 前启动应被拒绝」);启动时从商务对接拷贝产品类型/预期用途/目标市场等字段。
|
||||
- **状态机**:与 bizdev 同一套编制/审核/批准 FSM;末阶段批准后项目标 `done`。
|
||||
|
||||
## 开放问题
|
||||
|
||||
- 本仓库(Agent-System)当前尚无 rdev 工作流模块;若要移植,需评估 60 stage × 模板 × overlay × 小队步骤的落地范围与分期(bizdev 已有移植先例)。
|
||||
- 参考项目 `records: [dhf, dmr]` 双归属与云盘 canonical 归档机制在本仓库尚无对应物,移植时需决策是否引入。
|
||||
- `complexity_tier=high` 才注入 regulatory 步;本仓库复杂度分层(complexity_high/medium overlay)如何对齐需另调研。
|
||||
|
||||
## 建议动作
|
||||
|
||||
- 若立项移植 rdev:在 `ops/short-term/` 新建任务,按「工作流定义 → 模板 → 小队 → overlays → 生命周期门禁」顺序分批实施,先做 phase 01–03(策划/输入)切片。
|
||||
- 移植时保留「stage key = 模板文件名」一一对应约束,并复刻 e2e 齐套校验(60 stage、模板非空、末模板含签署)。
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title: "系统使用说明书(含真实截图,md/word/pdf/html 四格式)"
|
||||
status: done
|
||||
created: 2026-09-18
|
||||
updated: 2026-09-18
|
||||
owner: Kimi
|
||||
branch: feature/user-manual
|
||||
worktree: .worktrees/feature-user-manual
|
||||
mutex: docs
|
||||
---
|
||||
|
||||
# 系统使用说明书(含真实截图,md/word/pdf/html 四格式)
|
||||
|
||||
## 目标
|
||||
|
||||
产出覆盖「从 0 进入系统 → 登录/注册 → 管理员角色权限配置 → 日常使用 → 审批全流程」的终端用户说明书,配 dev 环境真实操作截图(含真实 PI 对话),交付 Markdown / HTML / PDF / Word 四种格式于 `docs/user-manual/`。
|
||||
|
||||
## 范围
|
||||
|
||||
- dev 环境(127.0.0.1:8080)Playwright 实操截图约 30 张(登录、工作台、立项、对话、文档、审批链、管理台 8 分组)
|
||||
- `docs/user-manual/manual.md` 十章中文说明书(内容以代码为准)
|
||||
- `docs/user-manual/scripts/`(截图与格式生成脚本,可重跑)
|
||||
- `docs/user-manual/dist/`(html/pdf/docx 产物)
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不合入 dev、不 push(用户未要求)
|
||||
- 不改动任何产品代码
|
||||
- 不覆盖 control-center/web(空壳)与 engineering-dashboard(工程内部)
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 分支 + 登记
|
||||
2. [x] 环境预检(健康、登录凭证、中文字体、chromium)
|
||||
3. [x] 截图脚本 `capture-screenshots.mjs` 并采集
|
||||
4. [x] 真实 PI 对话截图
|
||||
5. [x] 三责审批链 + 阶段门禁截图(zhanggong/lizhuguan/wangzong)
|
||||
6. [x] 撰写 manual.md
|
||||
7. [x] build-formats.mjs 生成 html/pdf/docx(pandoc 缺失时 .doc 兜底)
|
||||
8. [x] 校验(图片引用、PDF 渲染抽查、docx 媒体嵌入)
|
||||
9. [x] 提交 + 更新 CURRENT
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 四种格式文件齐备且可打开
|
||||
- [x] manual.md 图片引用全部存在,无孤图
|
||||
- [x] PDF 中文无乱码、图片正常嵌入
|
||||
- [x] 说明书章节覆盖:进入系统/登录/注册/管理员配置角色权限/项目使用/对话/文档/审批/FAQ
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Checklist: -
|
||||
- Handoff: -
|
||||
- Test report: -
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- 演示账号(dev 种子,密码 123456):zhanggong / lizhuguan / wangzong / guest;管理员 admin(密码取 configs/.env.dev)
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: "Wave 0:P0 确认 bug 修复(SSE/缓存/run-stream)"
|
||||
status: done
|
||||
created: 2026-09-18
|
||||
updated: 2026-09-18
|
||||
owner: Cursor
|
||||
branch: fix/wave0-p0-sse-chat-cache-bugs
|
||||
worktree: "-"
|
||||
mutex: chat + web
|
||||
---
|
||||
|
||||
# Wave 0:P0 确认 bug 修复(SSE/缓存/run-stream)
|
||||
|
||||
## 目标
|
||||
|
||||
修复体检确认的 P0 bug:SSE 120s 断流(B-1/B-2)、run/stream 解析与时序(B-3/B-4)、前端会话窗口缓存 key 不一致(B-5)、IndexedDB 恢复覆盖(B-6)。
|
||||
|
||||
## 范围
|
||||
|
||||
- `internal/server/sse.go`:chat/run stream 心跳 + WriteDeadline;Decode 400;CreateAndStart/Subscribe 前置 Flush
|
||||
- `web/src/hooks/useChatWindow.ts` + `web/src/data/storage.ts`:缓存 key / LRU 一致
|
||||
- `web/src/App.tsx` + `web/src/data/fileStore.ts`:恢复合并
|
||||
- 对应单测与测试报告
|
||||
|
||||
## 非目标
|
||||
|
||||
- E-1(main ENV 不一致)及 Wave 1–7 其余项
|
||||
- FAV / MULTI_INTENT_PLAN_TIER / SEMANTIC_SUMMARY_REPLACE 放量
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 从 dev 开 `fix/wave0-p0-sse-chat-cache-bugs`,CURRENT 认领
|
||||
2. [x] B-1/B-2 心跳与 deadline
|
||||
3. [x] B-3/B-4 run/stream
|
||||
4. [x] B-5 缓存 key
|
||||
5. [x] B-6 恢复合并
|
||||
6. [x] 单测 + 全量回归 + 合入 dev 冒烟
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] `go vet ./...`、`go test -short ./...`、`cd web && npm test && npm run build` 全绿
|
||||
- [x] 畸形 body → 400;Flush 前失败非 200 SSE
|
||||
- [x] 缓存 key / LRU 单测 PASS;恢复合并不丢新增 deliverable
|
||||
- [x] dev rebuild + health/ready;真 PI 聊天心跳证据(见测试报告)
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Audit: [../../audit/2026-09-17-system-health-check.md](../../audit/2026-09-17-system-health-check.md)
|
||||
- Remediation: [../../remediation/2026-09-17-system-health-remediation-plan.md](../../remediation/2026-09-17-system-health-remediation-plan.md)
|
||||
- Test report: [../../test-reports/2026-09-18-wave0-p0-bug-fixes-test-report.md](../../test-reports/2026-09-18-wave0-p0-bug-fixes-test-report.md)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- Commits:`64efaa3` docs · `54244ed` server · `2620d80` web;合入 `dev` merge `810fb96`
|
||||
- Assets:`.doc/test-reports/assets/2026-09-18-wave0-p0-bug-fixes/chat-stream-long.sse.txt`
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
title: "Wave 1:main 环境 ENV/schema 修正(E-1/E-2/E-5)"
|
||||
status: done
|
||||
created: 2026-09-18
|
||||
updated: 2026-09-18
|
||||
owner: Cursor
|
||||
branch: fix/wave1-main-env-fix
|
||||
worktree: "-"
|
||||
mutex: infra
|
||||
---
|
||||
|
||||
# Wave 1:main 环境 ENV/schema 修正(E-1/E-2/E-5)
|
||||
|
||||
## 目标
|
||||
|
||||
统一 main 环境 app/events 的 `ENV=main` 语义,用 compose 依赖强制 events 先迁移再启 app,并关闭 `Env==""` 视同 dev 的导入门禁漏洞。
|
||||
|
||||
## 范围
|
||||
|
||||
- `docker-compose.main.yml`:app `ENV: main`;`depends_on.events` healthy;events 补生产校验所需口令
|
||||
- `configs/.env.main`(本机)/ `.env.main.example`:`ENV=main`
|
||||
- `internal/server/chat_window_api.go`:去掉空 Env 视同 dev
|
||||
- 回归测试 + 真实 main rebuild 验证
|
||||
|
||||
## 非目标
|
||||
|
||||
- Wave 2+;不改 `event_consumer_modes` 的 mode 值;不触碰 FAV / MULTI_INTENT / SEMANTIC_SUMMARY_REPLACE
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 从本地 `dev` 开分支并 CURRENT 认领
|
||||
2. [x] E-1 ENV 对齐
|
||||
3. [x] E-2 depends_on events
|
||||
4. [x] E-5 空 Env fail-closed
|
||||
5. [x] 单测 + 合入 + main rebuild 冒烟
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] app/events health 均报 `env=main`
|
||||
- [x] main schema 已升(health `schema_version=52`,goose `version_id=52`)
|
||||
- [x] `event_consumer_modes` 中 main 四行仍为 `off`
|
||||
- [x] 导入端点空 Env → 403;compose ENV 对齐单测 PASS
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Audit: [../../audit/2026-09-17-system-health-check.md](../../audit/2026-09-17-system-health-check.md)
|
||||
- Remediation: [../../remediation/2026-09-17-system-health-remediation-plan.md](../../remediation/2026-09-17-system-health-remediation-plan.md)
|
||||
- Test report: [../../test-reports/2026-09-18-wave1-main-env-fix-test-report.md](../../test-reports/2026-09-18-wave1-main-env-fix-test-report.md)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- 合入本地 `dev`:`merge: fix/wave1-main-env-fix` + events secrets unblock
|
||||
- Assets:`.doc/test-reports/assets/2026-09-18-wave1-main-env-fix/`
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: "Wave 2:配置与灰度入口对齐(E-3/E-4/E-6/E-7/E-9)"
|
||||
status: done
|
||||
created: 2026-09-18
|
||||
updated: 2026-09-18
|
||||
owner: Cursor-Auto
|
||||
branch: fix/wave2-config-flag-align
|
||||
worktree: "-"
|
||||
mutex: infra
|
||||
---
|
||||
|
||||
# Wave 2:配置与灰度入口对齐
|
||||
|
||||
## 目标
|
||||
|
||||
三环境 compose 显式声明封存 flag(值保持 legacy/false);移除死 `CURSOR_RUNNER`;main 显式 `SEED_DEMO_USERS=false`;`INTENT_V2_DECISION_TIER` 非法值 fail-closed 到 `none`;E-9 仅记录评估结论。
|
||||
|
||||
## 范围
|
||||
|
||||
- E-3 / A-4:三环境补 `MULTI_INTENT_PLAN_TIER` + U9–U12 + SHADOW/NARRATIVE 声明
|
||||
- E-4:删除 `CURSOR_RUNNER_URL` 与 `cursor-agent` 占位服务
|
||||
- E-6:main `SEED_DEMO_USERS: "false"`
|
||||
- E-7:`parseV2DecisionTier` default → `none`
|
||||
- E-9:评估记录,不改 initdb
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不升 `MULTI_INTENT_PLAN_TIER`;不接线 `SEMANTIC_SUMMARY_REPLACE`
|
||||
- 不改 FAV modes;不改 E-9 initdb 挂载
|
||||
- Wave 3+ 范围项
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] Sonnet 5 产出实施计划(默认决策:删 cursor-agent;不补 REPLACE;E-9 不改代码)
|
||||
2. [x] E-7 代码 + 单测
|
||||
3. [x] E-3 / E-4 / E-6 compose
|
||||
4. [x] compose flag 声明回归测试
|
||||
5. [x] go vet/test;三环境 rebuild + env 抽检 + 冒烟
|
||||
6. [x] 合入本地 dev;文档闭环
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 三环境 `docker compose config` 可见目标 flag;`CURSOR_RUNNER` 零匹配
|
||||
- [x] 容器内 env 抽检 PASS;health/ready PASS
|
||||
- [x] `go test -short ./...` 全绿
|
||||
- [x] test-report 归档;remediation Wave 2 done
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Remediation: [.doc/remediation/2026-09-17-system-health-remediation-plan.md](../../remediation/2026-09-17-system-health-remediation-plan.md)
|
||||
- Audit: [.doc/audit/2026-09-17-system-health-check.md](../../audit/2026-09-17-system-health-check.md)
|
||||
- Test report: [.doc/test-reports/2026-09-18-wave2-config-flag-align-test-report.md](../../test-reports/2026-09-18-wave2-config-flag-align-test-report.md)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
计划作者:[Wave 2 Sonnet 计划](5b8c8c73-c3e4-4947-b0c4-91822859ff4a)
|
||||
commits:`07fc0ec` `e0aabec` `55a539c` `8d97dd6` + docs closeout
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
title: "Wave 3:测试债与盲区(S-1/S-2/S-4/S-5)"
|
||||
status: done
|
||||
created: 2026-09-18
|
||||
updated: 2026-09-18
|
||||
owner: Cursor-Auto
|
||||
branch: fix/wave3-test-debt-blindspots
|
||||
worktree: "-"
|
||||
mutex: test-debt
|
||||
---
|
||||
|
||||
# Wave 3:测试债与盲区
|
||||
|
||||
## 目标
|
||||
|
||||
关闭 `TestReconcile_LegacyRepair_PG` 工程测试债;清理永久跳过死代码;统一 E2E 脚本入口;推广 409/结构化错误信封复用。
|
||||
|
||||
## 范围
|
||||
|
||||
- S-1 / S-2 / S-4 / S-5(按 Sonnet 计划默认决策)
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不升 MULTI_INTENT_PLAN_TIER;不接线 REPLACE;不改 FAV;项目 143 只读
|
||||
- 不改后端 httpx 信封整体迁移;不统一 INTENT_DUAL_TAB
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] Sonnet 5 计划
|
||||
2. [x] S-1 隔离 PG 5436 跑一次并归档
|
||||
3. [x] S-2 删死跳过 + plan_owner 说明
|
||||
4. [x] S-4 e2e scripts + 退役 document-revision.spec
|
||||
5. [x] S-5 信封复用 + 单测
|
||||
6. [x] 文档闭环 + 合入本地 dev
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] reconcile PG PASS 证据
|
||||
- [x] playwright --list = 29 tests / 8 files
|
||||
- [x] npm test / go test -short 全绿
|
||||
- [x] gap-matrix 测试债关闭;remediation Wave 3 done
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Plan agent: [Wave 3 Sonnet 计划](51987049-b338-41a7-84f4-2c97e3655d85)
|
||||
- Test report: [.doc/test-reports/2026-09-18-wave3-test-debt-blindspots-test-report.md](../../test-reports/2026-09-18-wave3-test-debt-blindspots-test-report.md)
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: "Wave 4:隐患加固(R-1~R-8)"
|
||||
status: done
|
||||
created: 2026-09-18
|
||||
updated: 2026-09-18
|
||||
owner: Cursor-Auto
|
||||
branch: fix/wave4-hardening-r1-r8
|
||||
worktree: "-"
|
||||
mutex: hardening
|
||||
---
|
||||
|
||||
# Wave 4:隐患加固(R-1~R-8)
|
||||
|
||||
## 目标
|
||||
|
||||
按 Wave 4 Sonnet 计划默认决策关闭体检高风险隐患 R-1~R-8。
|
||||
|
||||
## 范围
|
||||
|
||||
- R-1~R-8 全项(含 D-1 扩大范围:upsert + COALESCE)
|
||||
|
||||
## 非目标
|
||||
|
||||
- D-4/D-5;不升 tier;不接线 REPLACE;不改 FAV;项目 143 只读;不 push
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] R-1c/R-1a/R-1b + Memory/PG 负例
|
||||
2. [x] R-2 rows.Err()
|
||||
3. [x] R-3 RWMutex / R-4 memTurns / R-5 hydrate / R-6 Shutdown
|
||||
4. [x] R-7/R-8 前端 + 单测
|
||||
5. [x] 全量验收 + test-report + 合入本地 `.worktrees/dev-rdev-merge` dev
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] R-1~R-8 按计划验收项 PASS
|
||||
- [x] `go vet` / `go build` / `go test -short ./...` / `npm test` / `npm run build`
|
||||
- [x] 相关 `-race` 绿
|
||||
- [x] 文档闭环
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Remediation: [.doc/remediation/2026-09-17-system-health-remediation-plan.md](../../remediation/2026-09-17-system-health-remediation-plan.md)
|
||||
- Test report: [.doc/test-reports/2026-09-18-wave4-hardening-r1-r8-test-report.md](../../test-reports/2026-09-18-wave4-hardening-r1-r8-test-report.md)
|
||||
- Assets: [.doc/test-reports/assets/2026-09-18-wave4-hardening-r1-r8/](../../test-reports/assets/2026-09-18-wave4-hardening-r1-r8/)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
基线 tip:`32932e4`。合入本地 `dev` 见 merge commit。
|
||||
@@ -0,0 +1,98 @@
|
||||
---
|
||||
title: "Wave 5:死代码与机制收口(X-1~X-5)"
|
||||
status: done
|
||||
created: 2026-09-18
|
||||
updated: 2026-09-18
|
||||
owner: Cursor-Auto
|
||||
branch: fix/wave5-deadcode-decisions
|
||||
worktree: "-"
|
||||
mutex: deadcode-cleanup
|
||||
---
|
||||
|
||||
# Wave 5:死代码与机制收口(X-1~X-5)
|
||||
|
||||
## 目标
|
||||
|
||||
按系统体检整改方案 Wave 5,对 X-1~X-5 逐项决策并收口:删除真死 flag/组件、封存 REPLACE、标记 00048 deferred、保留 system_settings 二期键。
|
||||
|
||||
## 范围
|
||||
|
||||
- X-1~X-5 全项(含级联删除 `patchNotification`)
|
||||
|
||||
## 非目标
|
||||
|
||||
- X-6(`useTaskRunStream` 伪 ref);不接线 REPLACE;不升 MULTI_INTENT_PLAN_TIER;不改 FAV;项目 143 只读;不改 goose 00048/00049 schema;不 push
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 决策记录落盘(本文件「决策记录」段)
|
||||
2. [x] X-1 删除 `SEMANTIC_FALLBACK_ENABLED` + 回归测试
|
||||
3. [x] X-2 封存注释回链
|
||||
4. [x] X-3 00048 deferred 注释 + long-term
|
||||
5. [x] X-4 system_settings 6 键注释
|
||||
6. [x] X-5 删除死组件/死 API
|
||||
7. [x] 全量验收 + test-report + 合入本地 `.worktrees/dev-rdev-merge` `dev`
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] X-1~X-5 每项有决策记录(本文件)
|
||||
- [x] `go vet ./...` / `go test -short ./...` / `cd web && npm test && npm run build`
|
||||
- [x] remediation Wave 5 行改 done;勾选「X-1~X-5 每项有决策记录」
|
||||
- [x] 文档闭环 + merge `--no-ff`
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Remediation: [.doc/remediation/2026-09-17-system-health-remediation-plan.md](../../remediation/2026-09-17-system-health-remediation-plan.md)
|
||||
- Audit: [.doc/audit/2026-09-17-system-health-check.md](../../audit/2026-09-17-system-health-check.md)
|
||||
- Test report: [.doc/test-reports/2026-09-18-wave5-deadcode-decisions-test-report.md](../../test-reports/2026-09-18-wave5-deadcode-decisions-test-report.md)
|
||||
- Assets: [.doc/test-reports/assets/2026-09-18-wave5-deadcode-decisions/](../../test-reports/assets/2026-09-18-wave5-deadcode-decisions/)
|
||||
|
||||
## 决策记录
|
||||
|
||||
### X-1:`SEMANTIC_FALLBACK_ENABLED` — 删除
|
||||
|
||||
- **现状证据**:字段仅在 `internal/intent/flags.go` 解析、`internal/app/app.go` 注入 sysadmin 视图、`internal/sysadmin/features.go` 目录展示;全仓无业务消费方。三环境 compose + `.env.example` 均声明该死变量。
|
||||
- **决策**:删除(不接线)。
|
||||
- **理由**:零读者、无设计文档描述预期语义;接线需独立产品设计,保留只会继续污染配置面。
|
||||
- **影响范围**:`flags.go` / `app.go` / `features.go` / 三 compose / `.env.example`;新增 `TestComposeNoDeadSemanticFallbackConfig` 防复活。
|
||||
- **验收**:`go vet ./...`;`go test ./internal/intent/... ./internal/app/... ./internal/sysadmin/... ./internal/config/...`;`rg SEMANTIC_FALLBACK_ENABLED` 除 `.doc/` 历史外无匹配。
|
||||
|
||||
### X-2:`SEMANTIC_SUMMARY_REPLACE` — 维持封存
|
||||
|
||||
- **现状证据**:env 可读但 `semantic_summary.go` 明确 `_ = SemanticSummaryReplaceEnabled()` 且不替换 `sum.Narrative`;负例 `TestSemanticSummary_ShadowOKKeepsDeterministic` 已覆盖 `Replace: true`。
|
||||
- **决策**:维持不接线;补强注释回链本决策记录。
|
||||
- **理由**:与 CURRENT 红线及 remediation Wave 5 一致;启用需独立授权 + fail-closed 灰度设计。
|
||||
- **影响范围**:仅 `summary_flags.go` / `semantic_summary.go` 注释。
|
||||
- **验收**:`go test ./internal/ctxmgr/... -run Semantic`;diff 仅注释。
|
||||
|
||||
### X-3:goose 00048 三表 — deferred → SWBOOT-10/W5b
|
||||
|
||||
- **现状证据**:`project_types` / `compliance_profiles` / `project_type_workflows` 已建表有种子,但 API 走硬编码 `swboot.ProjectTypesCatalog()` / `ComplianceProfilesCatalog()`;`project_source_bindings` / `repo_path_allowlist` 零运行时读写;`RepoAllowlist` 仅 stub + 单测。
|
||||
- **决策**:标记 deferred,归 W5b/SWBOOT-10;**不改 schema**。
|
||||
- **理由**:FEATURE-MATRIX 明确 SWBOOT-10 仍 stub;DB 化消费方与受控执行器需独立安全评审。
|
||||
- **影响范围**:`catalog.go` / `repo_allowlist.go` 注释;long-term 软件自举文档追加一行。
|
||||
- **验收**:`go test ./internal/swboot/...`;diff 仅注释与 long-term 文档。
|
||||
|
||||
### X-4:`system_settings` 6 未接线键 — 保留待二期
|
||||
|
||||
- **现状证据**:白名单 7 键中仅 `workflow.allow_author_only_approval` 有消费方;其余 6 键(`ui.maintenance_notice`、`ui.read_only_mode`、`chat.default_session_role`、`tasks.default_auto_repair`、`kb.default_search_limit`、`notifications.stage_advance_reminder`)零业务读取。FEATURE-MATRIX 系统管理台「白名单项接消费方」列为二期。
|
||||
- **决策**:保留白名单 + 逐键注释说明预期消费方;不删。
|
||||
- **理由**:删除需改写多处白盒测试且收益低;机制先行符合一期设计,二期再接线。
|
||||
- **影响范围**:仅 `internal/sysadmin/settings.go` 注释。
|
||||
- **验收**:`go test ./internal/sysadmin/...`;diff 仅注释。
|
||||
|
||||
### X-5:前端死组件/死 API — 删除
|
||||
|
||||
- **现状证据**(`web/` 全目录扫描,排除自身):
|
||||
- `DocumentNotificationList` / `WorkflowPrerequisiteBanner` / `SettingsModal`:仅自身文件命中;`App` 使用 `UserSettingsModal`。
|
||||
- `activateWorkflow`(`api/projectWorkflow.ts`):仅定义处;实际用 `activateWorkflowInstance`。
|
||||
- `saveMessages`:已 `@deprecated` no-op,仅定义处。
|
||||
- 级联:`patchNotification` 唯一调用方为 `DocumentNotificationList`。
|
||||
- **决策**:删除上述 3 组件 + `activateWorkflow`(及类型)+ `saveMessages` + `patchNotification`;同步 import。后端 `PATCH /api/v1/notifications/{id}` 保留。
|
||||
- **理由**:真死代码;删除降低误挂载与维护噪音;后端路由未经本波审计故不删。
|
||||
- **影响范围**:见删除清单;无 barrel / 无专用单测。
|
||||
- **验收**:`cd web && npm test && npm run build`;`rg` 无残留(`activateWorkflowInstance` 除外)。
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
基线 tip:`a12c947`(Wave 4 已合入本地 `.worktrees/dev-rdev-merge` `dev`)。
|
||||
@@ -0,0 +1,51 @@
|
||||
---
|
||||
title: "Wave 6:文档漂移修复(D-1~D-6)"
|
||||
status: done
|
||||
created: 2026-09-18
|
||||
updated: 2026-09-18
|
||||
owner: Cursor-Auto
|
||||
branch: docs/wave6-doc-drift
|
||||
worktree: "-"
|
||||
mutex: doc-drift
|
||||
---
|
||||
|
||||
# Wave 6:文档漂移修复(D-1~D-6)
|
||||
|
||||
## 目标
|
||||
|
||||
按系统体检整改方案 Wave 6,逐项关闭文档漂移 D-1~D-6,使 SSOT(audit/INDEX、remediation/INDEX、FEATURE-MATRIX、PROJECT.md、backlog、ADR、handoff、PU8 契约)口径一致。
|
||||
|
||||
## 范围
|
||||
|
||||
- D-1(含附带的 short-term 归档)、D-2、D-3(复核)、D-4、D-5、D-6
|
||||
|
||||
## 非目标
|
||||
|
||||
- Wave 5(X-1~X-5)及其涉及的任何代码;不升 tier;不接线 REPLACE;不改 FAV;项目 143 只读;不删除 D7 对话数据
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] D-1 契约状态回标 + 归档两份 short-term 任务文件
|
||||
2. [x] D-2 ADR 状态改 accepted
|
||||
3. [x] D-3 复核 INDEX 末行(无改动)
|
||||
4. [x] D-4 handoff 回标闭环
|
||||
5. [x] D-5 backlog D3/D7 同步
|
||||
6. [x] D-6 PROJECT.md §9 对齐
|
||||
7. [x] remediation/CURRENT 收口 + test-report + 合入本地 `dev`
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] D-1~D-6 每项均有落盘证据或复核记录
|
||||
- [x] `go build ./...` / `go vet ./...` / `npm run build` 全绿(无代码改动,防误伤)
|
||||
- [x] remediation Wave 6 行改 done;勾选「D-1~D-6 全部回链关闭」
|
||||
- [x] CURRENT 焦点/认领表/集成槽位三处一致
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Remediation: [../../remediation/2026-09-17-system-health-remediation-plan.md](../../remediation/2026-09-17-system-health-remediation-plan.md)
|
||||
- Audit: [../../audit/2026-09-17-system-health-check.md](../../audit/2026-09-17-system-health-check.md)
|
||||
- Test report: [../../test-reports/2026-09-18-wave6-doc-drift-test-report.md](../../test-reports/2026-09-18-wave6-doc-drift-test-report.md)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
基线 tip:`2ce2625`(`merge: fix/wave5-deadcode-decisions`)。mutex=`doc-drift`,未复用 `architecture-docs`。FEATURE-MATRIX 交叉检查无改动(D3 done/shadow、D7 deferred、U9–U12 done、`production_ready=yes` 与本次回标一致)。
|
||||
@@ -0,0 +1,100 @@
|
||||
---
|
||||
title: "Wave 7:既有 roadmap 收口(编排确认)"
|
||||
status: done
|
||||
created: 2026-09-18
|
||||
updated: 2026-09-18
|
||||
owner: Cursor-Auto
|
||||
branch: docs/wave7-roadmap-orchestration
|
||||
worktree: "-"
|
||||
mutex: roadmap-orchestration
|
||||
---
|
||||
|
||||
# Wave 7:既有 roadmap 收口(编排确认)
|
||||
|
||||
## 目标
|
||||
|
||||
对照 FEATURE-MATRIX 剩余工作列,为 T1/W5、T1/W6、T1/W7、T2、T4、T5/T6/T8 各写一条编排确认;不改变任何能力实现状态。
|
||||
|
||||
## 范围
|
||||
|
||||
- 六条编排确认文案落盘(见「确认记录」)
|
||||
- remediation Wave 7 行改 done 并回链本记录
|
||||
- CURRENT 焦点改为 Wave 0–7 done,并记录 Control Center 双实现发现
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不实施 SWBOOT-10;不升 FAV live / 不改 `FAV_DEGRADED_READ`;不按 D7 物理删除数据;不升 `MULTI_INTENT_PLAN_TIER`;不接线 `SEMANTIC_SUMMARY_REPLACE`;项目 143 只读
|
||||
- 不改 FEATURE-MATRIX 状态列;不改 gap-matrix 发布门禁
|
||||
- **不补 Wave 6 D-5**:D-1~D-6 已在 `a88ed85` PASS,backlog D3/D7 已同步;本波不改 `.doc/backlog/chat-agent-p6-backlog.md`,不把 Wave 6 再标一遍
|
||||
- 不决定 Control Center 两套实现的取舍:不合并、不删除 `feature/control-center-server`
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 跳过步骤 0(Wave 6 D-5 已完成)
|
||||
2. [x] 六条编排确认落盘(本文件)
|
||||
3. [x] remediation Wave 7 行改 done + 回链本记录
|
||||
4. [x] CURRENT 焦点改为「Wave 0–7 done」+ 记录 Control Center 分支冲突发现
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 六项编排确认均含:当前状态、关闭条件、是否需用户授权、建议下一触发点
|
||||
- [x] 无一项被伪装为已实现;FAV/D7/tier 升级仍标注「需用户显式授权」
|
||||
- [x] Wave 6 保持已关闭,未重复改写
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Remediation: [../../remediation/2026-09-17-system-health-remediation-plan.md](../../remediation/2026-09-17-system-health-remediation-plan.md)
|
||||
- Audit: [../../audit/2026-09-17-system-health-check.md](../../audit/2026-09-17-system-health-check.md)
|
||||
- 总控: [../../remediation/2026-09-16-partial-deferred-completion-plan.md](../../remediation/2026-09-16-partial-deferred-completion-plan.md)
|
||||
- Test report: [../../test-reports/2026-09-18-wave7-roadmap-orchestration-test-report.md](../../test-reports/2026-09-18-wave7-roadmap-orchestration-test-report.md)
|
||||
|
||||
## 确认记录
|
||||
|
||||
### T1/W5:SWBOOT-10
|
||||
|
||||
- **当前状态**:SWBOOT-00~09(契约、迁移、目录、UI、docs_only 真实 PI)已合入 `dev`([long-term](../long-term/2026-09-14-software-project-bootstrap-implementation.md)、[W5a 报告](../../test-reports/2026-09-17-w5a-software-bootstrap-ui-pi-test-report.md))。SWBOOT-10(受控工程执行:repo allowlist、worktree、patch/test/merge 分段批准)仍为 **stub only**,保持 fail-closed,归 W5b,本轮未启动。goose 00048 三张关联表(`project_source_bindings` / `repo_path_allowlist` / `project_type_workflows`)已在 Wave 5 X-3 标记 deferred。
|
||||
- **关闭条件**:独立安全评审通过 + SWBOOT-10 非 stub 真实实现 + 真实 PI 全链路证据 + UI 二次验收(见 [partial-deferred-completion-plan §W5](../../remediation/2026-09-16-partial-deferred-completion-plan.md))。
|
||||
- **是否需用户授权**:**需要**。独立安全评审本身即用户授权门槛;红线明确「不实施 SWBOOT-10 真实执行器」。
|
||||
- **建议下一触发点**:用户就 W5b 受控执行器单独立项、批准安全评审范围后,从 `dev` 开 `feature/swboot-10-w5b`(mutex `workflow-design`)按 long-term 拆分实施。本波不动代码,fail-closed stub 原样保持。
|
||||
|
||||
### T1/W6:FAV live 放量
|
||||
|
||||
- **当前状态**:W6 shadow 已合入 `dev`([short-term](2026-09-17-w6-fav-subscriber-shadow.md)、[报告](../../test-reports/2026-09-17-w6-fav-subscriber-shadow-test-report.md)):`ObserveShadow` 只计算 intended outcome、不写业务副作用;负例覆盖 degraded read 拒绝 / `HandleLease` / `Register(fav)` fail-closed。三环境 compose 既有声明为 `FAV_DEGRADED_READ` 默认 false、`FAV_PUBLISHER_ENABLED` 默认 false。**live 未放量**。本波未改 compose。
|
||||
- **关闭条件**:按固定顺序 staging → artifact → publication 逐 consumer live,每级 shadow → drain → live,观察窗 ≥7 天或 ≥N 终态样本(取更严);`FAV_DEGRADED_READ` 全程保持 false;崩溃/重启幂等证据;**禁止整支 merge** `feature/final-artifact-vault`(见 [partial-deferred-completion-plan §7.4](../../remediation/2026-09-16-partial-deferred-completion-plan.md))。
|
||||
- **是否需用户授权**:**需要**。红线明确「不升 FAV live / 不改 `FAV_DEGRADED_READ`」。
|
||||
- **建议下一触发点**:用户批准 staging 级观察窗起点后,从 `dev` 开独立 flag 分支(mutex `events`),先跑 staging ≥7 天观察窗并归档证据报告,再评估升 artifact/publication。本波不推进放量。
|
||||
|
||||
### T1/W7:D7 对话数据治理
|
||||
|
||||
- **当前状态**:ADR 草案([2026-09-17-d7-chat-data-retention.md](../../adr/2026-09-17-d7-chat-data-retention.md),`compliance: pending-compliance-signoff`)已落地;只读数据分类盘点已完成([audit](../../audit/2026-09-17-d7-data-inventory.md),`status: done`),**未发现**当前基线违反已确认合规/安全约束,因此**未**写入 gap-matrix blocker。合规签字前禁止按 365/180/30 天草案数字执行物理删除或备份清除。Wave 6 已把该现状同步进 backlog D7 行,本波不改该文件。
|
||||
- **关闭条件**:合规签字或改数 → ADR 状态改 `accepted`/`signed` → 按签字口径落地整改(soft-delete 写路径 → 观察窗 → 物理清理;备份二次批准 + delete manifest)→ FEATURE-MATRIX D7 行升 `done`;若盘点期间发现违规则立即升 gap-matrix(本轮未触发)。
|
||||
- **是否需用户授权**:**需要**。合规签字是产品/法务决策,非工程可自行拍板;红线明确「不按 D7 物理删除数据」。
|
||||
- **建议下一触发点**:用户/合规负责人对 ADR 草案数字表签字或提出修改意见;签字后开独立 short-term 任务按 ADR 决策落地。
|
||||
|
||||
### T2:Control Center 前端 SPA 七页人工走查
|
||||
|
||||
- **当前状态**:2026-09-17 审计结论已过期,不能按「仅剩前端走查」收口。FEATURE-MATRIX「个人工程中控台」行已通过 `engineering-dashboard`(CLI `serve`/`export`,四轴模型)达到 **done** 一期,已合入 `dev`([报告](../../test-reports/2026-09-17-engineering-dashboard-test-report.md))。审计 T2 所指「后端 P0–P6 已签,仅剩前端 SPA 七页人工走查」实为 Kimi 的 `feature/control-center-server`:自身 11 commits(P0 skeleton → P6 design spec + LAN bind + agent-integration),**从未合入 `dev`**。2026-09-18 相对 `dev@a88ed85` 实测:merge-base `adb48c8`,落后 **136** commits(研究快照曾记 128,以本次 `rev-list` 为准),缺失 Wave 0–6。提交 `b5bacee`(`refactor(control-center): remove legacy engineering-dashboard, superseded by control-center`)试图删除已合入并验收的 `engineering-dashboard`,与 canonical 实现冲突。该分支的任务声明与 CURRENT 认领只存在于分支本身,未反映在 `dev` 主线。实现范围(pgvector 文档向量库、P3 SPA、P5 定期审计 + LLM 复核)超出已批准设计一期边界。
|
||||
- **关闭条件**:FEATURE-MATRIX 该行**已经 done**(通过 engineering-dashboard)。若要转向「复活/合并 Kimi 实现」,需先有独立决策与重新规划,不属于「仅剩一次前端走查」。
|
||||
- **是否需用户授权**:**是**。授权对象是「两套实现如何取舍」,不是「批准做前端走查」。本波只读编排确认,不能代为废弃或合并该分支。
|
||||
- **建议下一触发点**:请用户明确二选一:(a) 维持现状——`engineering-dashboard` 为唯一 canonical 实现,`feature/control-center-server` 由用户决定归档或保留(推荐:已 done 且范围经批准);或 (b) 要求评估合并该分支的增量能力(SPA / pgvector / 定期审计)。触发后再开对应短期任务。本波只记录事实与建议,**不合并、不删除**该分支。
|
||||
|
||||
### T4:首次加载性能 U1/U3–U7
|
||||
|
||||
- **当前状态**:仅 U2(静态资源交付)done——自托管字体、构建期 br/gzip、`/assets/*` 404 修正;主 JS 传输 2.82 MB → ~624 KB,登录冷缓存可见 ~205ms([报告](../../test-reports/2026-09-17-initial-load-perf-u2-test-report.md))。U1(完整性能基线)、U3(登录壳按需加载)、U4(初始化扇出收敛)、U5(认证请求去重)、U6(列表/租约按证据优化)、U7(重启后首访链路)**均未开始**。
|
||||
- **关闭条件**:按 [方案](../../remediation/2026-09-17-initial-load-performance-plan.md) Definition of Done——R1–R6 逐项有前后对比 + 真实 UI 证据;未覆盖项明确列残余,不因 health PASS 关闭;完成后更新任务/CURRENT/FEATURE-MATRIX/test-report。
|
||||
- **是否需用户授权**:不需要额外专项授权(方案已 planned 且范围已批准);需要工程排期认领(估算 U1–U5 约 3.5–7 人日,U6 另需 2–4 日,U7 另需 0.5–1.5 日,非承诺)。
|
||||
- **建议下一触发点**:任一 Agent 从 `dev` 开分支认领 U1(P0,是后续单元的前置依赖)即触发;建议顺序 U1 → U2(done)/U3 与 U7 → U4/U5 → 按数据选 U6。
|
||||
|
||||
### T5/T6/T8:backlog 类(按收益触发)
|
||||
|
||||
- **T5 选择性模块解耦 M4–M6**:**当前状态** `planned`,owner=TBD,未开始([long-term](../long-term/2026-09-14-selective-module-decoupling.md))。触发条件中「M1–M3 test report 全部 PASS」已满足(文档可靠性试点 / 可靠事件核心均 done),但「同类缺陷触达文件数和运行故障率表明继续解耦具有收益」证据尚未出现,暂不触发。**关闭条件**与是否授权见该文档触发条件段。**是否需用户授权**:无需专项授权,按收益证据 + owner 认领即可开工。**建议下一触发点**:出现同类缺陷证据或 owner 主动认领。
|
||||
- **T6 产品 backlog(B5/A5/A6/A7/D5)**:[backlog](../../backlog/chat-agent-p6-backlog.md) 仍列 B5(报价复核)、A5/A6(小队降级 + trace)、A7(注释迁移)、D5(KB 按环境隔离评估)为纯 backlog,无任务文件、无 owner。**D3、D7 已由 Wave 6 同步**(D3 标已实现 shadow 并回链;D7 回链 ADR 草案与只读盘点,合规签字前不整改)。本波不改该文件。**关闭条件**:开放项按产品收益单独排期开短期任务。**是否需用户授权**:开始评估不需要专项授权;D3 REPLACE 灰度、D7 整改分别仍受各自红线约束。**建议下一触发点**:产品侧提出具体收益诉求;无固定时间表。
|
||||
- **T8 IAM 收尾开放项**:410 退役策略已冻结为「保留,非缺口」([决策](../../audit/2026-09-16-bug11-410-retire-decision.md),gap-matrix BUG-11 PASS);R13 数据安全清单 7 项全部 PASS,仅「完整红队注入矩阵」标记为开放增强、不挡基线;IAM 全路由 inventory 仍标记「开放」([handoff](../handoffs/2026-09-16-phase3-leftover-closeout.md)),fail-closed 核心已签。均为**加固类,非发布 blocker**。**是否需用户授权**:不需要专项授权,可按运维遥测随时另开 audit/任务。**建议下一触发点**:410 路由遥测证明零流量后可另开退役任务;或需要更强出站安全保证时另开红队 audit。
|
||||
|
||||
## 新发现(需用户后续裁决,不阻塞本波收口)
|
||||
|
||||
- **Control Center 双实现冲突**:`feature/control-center-server`(Kimi,P0–P6 SPA)未合入 `dev`。相对 `dev@a88ed85` 落后 136 commits(merge-base `adb48c8`),自身 11 commits,其中 `b5bacee` 删除已合入的 `engineering-dashboard`。建议维持 `engineering-dashboard` 为唯一 canonical 实现;是否归档或评估合并该分支,待用户裁决。本波不删除、不合并该分支。
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
基线 tip:`a88ed85`(`merge: docs/wave6-doc-drift`)。mutex=`roadmap-orchestration`。零 Go/TS/SQL/compose 改动。FEATURE-MATRIX 状态列未改。
|
||||
@@ -0,0 +1,347 @@
|
||||
---
|
||||
title: 文档编制人兼任审核批准 - Plan
|
||||
type: feat
|
||||
date: 2026-09-17
|
||||
status: planned
|
||||
artifact_contract: ce-unified-plan/v1
|
||||
product_contract_source: ce-plan-bootstrap
|
||||
execution: code
|
||||
---
|
||||
|
||||
# 文档编制人兼任审核批准 - Plan
|
||||
|
||||
## Goal Capsule
|
||||
|
||||
在系统管理员授权后,项目创建者可以为项目工作流中的每份文档单独启用「编制人兼任审核、批准」,只选择一位编制人即可完成该文档的全部人工职责。
|
||||
|
||||
本次交付为设计方案,尚未授权业务实现。已确认的需求是两级授权和逐文档配置。R9(激活前配置/激活后冻结)与 R10(关总开关后存量按冻结继续、不提供紧急熔断)已于 2026-09-17 审核批准,并补强 Heal 三入口投影稳定性为硬性验收项。实现与发布须分别提供源码、数据库、真实产品 PI 和浏览器证据。
|
||||
|
||||
基线为本地 `dev@adb48c8`,2026-09-17 源码核查;不代表正在运行的镜像已具备本能力。远端已 fetch,本地 dev 领先 origin/dev 44 个提交、落后 0。本方案不修改正式工作流定义,不将兼任等同于免审批。
|
||||
|
||||
---
|
||||
|
||||
## Product Contract
|
||||
|
||||
### Summary
|
||||
|
||||
新增管理员总开关,默认关闭;新增逐文档职责模式,默认沿用当前规则。创建者开启某份文档的兼任模式后,只填写编制人,审核人与批准人由服务端派生为同一人。仍执行送审、审核和批准,保留每一步身份、意见和时间。
|
||||
|
||||
### Problem Frame
|
||||
|
||||
当前系统仅允许可选文档三职全空或三职完整指定,且完整指定时要求三人不同。用户需要小团队或个人也能执行完整的文档治理流程,并由管理员控制这一例外是否可用。
|
||||
|
||||
当前权限、文档人员投影和前端角色识别使用不同数据路径。因此仅放宽三职分离校验不足以支持本需求,还必须保证配置、生成、查看、修改、审批和阶段推进使用同一份职责来源。
|
||||
|
||||
### Requirements
|
||||
|
||||
**权限与配置**
|
||||
|
||||
- R1. 仅系统管理员可开启或关闭系统级「允许编制人兼任审核、批准」权限,默认关闭。
|
||||
- R2. 仅权威项目创建者可为自己创建的项目逐文档选择兼任模式;普通成员、项目角色管理员和其他项目创建者不能设置。系统管理员如果不是该项目创建者,也不因此获得逐文档配置权。
|
||||
- R3. 每份文档独立选择,管理员开启总权限不自动修改任何项目或文档;新文档、新实例和复制产生的文档默认不继承兼任授权。
|
||||
- R4. 兼任文档必须指定一名有效、在任的项目成员为编制人;可以不是创建者。审核与批准由该人承担,不能再指定其他审核人或批准人。
|
||||
|
||||
**审批与可见性**
|
||||
|
||||
- R5. 兼任模式属于纳入人工审批:保留送审→审核→批准三个动作、现有内容锁和驳回要求;不得生成完成后自动批准或通过阶段门禁。
|
||||
- R6. 未开启兼任的文档继续遵守当前三职分离与可选免审批规则;必需文档不得借兼任模式省去编制人或审批。
|
||||
- R7. 设置页、冻结快照、文档详情、操作按钮、签署展示与日志一致显示兼任关系;同一个人能在正确状态执行对应职责动作。
|
||||
- R8. 兼任不授予系统管理员、创建者或其他成员代审权,也不扩大跨项目读取、非当前阶段写入和已结束实例写入权限。
|
||||
|
||||
**生命周期与持久化(已审核批准,2026-09-17)**
|
||||
|
||||
- R9. 首期仅在工作流激活前配置;激活时冻结该文档模式和职责,运行中的实例不直接改规划。已激活的存量项目不自动转换。若用户要求运行中转换,必须先扩展本方案的受控职责变更单元,不可悄悄放开现有 PUT。
|
||||
- R10. 管理员关闭总开关后,禁止新启用、保存仍含兼任的规划和激活兼任规划;允许清除兼任后保存。已激活的兼任实例按冻结授权继续执行,历史日志不变。界面必须解释该开关是「授权新配置」,不是紧急停用所有存量审批;本期不提供针对已激活实例的紧急撤销/熔断能力。
|
||||
- R11. 模式、编制人、授权依据、配置版本及各步骤日志需持久化,刷新、重登和服务重启不得丢失。
|
||||
- R12. 编制人离任或账号停用后,不得继续执行三项职责;阻断尚未完成动作并展示原因,不自动找替代人,不重写历史签署。
|
||||
|
||||
### Permission Matrix
|
||||
|
||||
| 操作 | 系统管理员但非项目创建者 | 当前项目创建者 | 普通项目成员 | 其他项目用户 |
|
||||
|---|---|---|---|---|
|
||||
| 修改系统总开关 | 允许 | 仅同时为系统管理员时 | 禁止 | 禁止 |
|
||||
| 查看本项目可用模式 | 沿用当前项目读取权限 | 允许 | 沿用项目读取权限 | 禁止 |
|
||||
| 规划期逐文档启停兼任 | 禁止 | 总开关开启才可启用;可关闭 | 禁止 | 禁止 |
|
||||
| 指定编制人 | 禁止 | 规划期按 R4 | 禁止 | 禁止 |
|
||||
| 送审、审核、批准 | 仅自己是该文档指定职责人时 | 同左 | 同左 | 禁止 |
|
||||
| 已激活实例直接改职责 | 禁止 | 禁止(R9) | 禁止 | 禁止 |
|
||||
|
||||
### Mode Matrix
|
||||
|
||||
「文档启用」「纳入人工审批」「编制人兼任」是不同含义,不能复用一个开关。
|
||||
|
||||
| 文档状态/配置 | 输入 | 有效职责 | 审批与门禁 |
|
||||
|---|---|---|---|
|
||||
| 文档禁用 | 不设置职责 | 无 | 沿用 skipped_disabled |
|
||||
| 可选文档免审批 | 三职全空,兼任关闭 | none | 沿用既有免审批规则 |
|
||||
| 标准人工审批 | 三职齐全且三人不同 | full | 保留正常人工审批 |
|
||||
| 兼任人工审批 | 兼任开启,仅编制人 A | author_only;有效三职为 A/A/A | 与标准审批同样要求最终批准 |
|
||||
| 未开兼任却只填 A | 缺审核和批准 | partial | 拒绝 |
|
||||
| 标准模式填 A/A/A | 三职同人 | 非法 | 继续拒绝职责分离违规 |
|
||||
| 兼任开启但无 A | 缺编制人 | 非法 | 拒绝 |
|
||||
| 兼任开启又填不同审核人 B | 矛盾输入 | 非法 | 拒绝,不能静默吞掉 B |
|
||||
|
||||
### User Flows
|
||||
|
||||
1. 管理员进入「系统管理台→系统设置→工作流治理」,开启总授权;页面显示保存结果、修改人和修改时间。
|
||||
2. 创建者进入项目设置,展开某个阶段,在文档行开启「由编制人兼任审核、批准」。只保留编制人选择器,其余两项显示「同编制人(自动承担)」。其他文档保持原配置。
|
||||
3. 保存并预览:摘要列出标准审批、兼任审批、免审批的份数,列出每份兼任文档及编制人。确认后冻结。
|
||||
4. 编制人完成内容后送审,在审核中以审核人身份确认,在批准中以批准人身份确认;日志展示同一人对应三个职责,而非三个虚构人员。
|
||||
5. 页面刷新、重新进入项目后仍显示同样配置;最终批准后才按现有阻塞条件满足阶段门禁。
|
||||
|
||||
### Scope Boundaries
|
||||
|
||||
本期覆盖所有通过项目工作流实例管理的文档,不针对某个任务名写白名单;freeform 文档与未绑定工作流的旧文档不提供此开关。不新增批量全选、不改项目成员全局 `document_duty` 为多角色,不自动改已发布工作流模板或历史签署。
|
||||
|
||||
**生命周期口径(已审核批准,2026-09-17):** R9 首期仅激活前配置、激活后冻结职责;R10 关闭总开关后禁止新启用/保存仍含兼任的规划/激活兼任规划,已激活实例按冻结授权继续执行。总开关是「授权新配置」,**不提供**已激活实例的紧急撤销/熔断能力;若业务需要合规级紧急止损,应作为独立后续方案,不在本期 Definition of Done 范围内。
|
||||
|
||||
---
|
||||
|
||||
## Planning Contract
|
||||
|
||||
### Current Implementation Evidence
|
||||
|
||||
以下为源码确认事实,不是运行验收结果。
|
||||
|
||||
| 位置 / 符号 | 当前行为 | 对本需求的影响 |
|
||||
|---|---|---|
|
||||
| `internal/projectinstance/types.go`:DocTaskPlan / DocDuty | 仅 enabled、approval_configurable 和三职 ID,无逐文档兼任标记 | 增加显式职责模式 |
|
||||
| `internal/projectinstance/duty_mode.go` | none/partial/full;partial 拒绝;三职重复报 SEPARATION_OF_DUTY_VIOLATION | 不能只填作者或仅关闭分离校验 |
|
||||
| `internal/projectinstance/validator.go`:validateActivationPlan / previewSummary | 激活至少 countFullDutyDocs>0;预览统计 full/none | 必须把合法兼任计为受治理文档 |
|
||||
| `internal/projectinstance/service.go` | 创建者可保存/预览/激活;active 后 ErrPlanFrozen;已有 revision、plan hash、token | 复用规划流程,补全授权版本和事务检查 |
|
||||
| `internal/projectworkflow/service.go`:IsProjectCreator | 权威项目创建者检查 | 不使用 UI 当前角色或项目 manager 代替 |
|
||||
| `internal/projectinstance/store.go`:sync 子实例逻辑 | 从规划写 project_doc_task_instances 和三职 assignment | 兼任需派生三项实际职责,不能只存作者而漏审批归属 |
|
||||
| `internal/projectinstance/duty_action.go` / `stage_access.go` / `gate.go` | 按动作校验单一职责;阶段可见性有 full 判定;门禁依赖 approved | 校验与阶段可见性都需认识新模式 |
|
||||
| `internal/sysadmin/settings.go` / `store.go` | 白名单设置、DB 持久化;无该 key;只记录最后修改人时间 | 可复用管理入口,新增策略消费与历史审计 |
|
||||
| `internal/server/admin_system_handlers.go` | 所有系统设置写入 requireSystemAdmin | 复用该入口,不开放管理列表给普通成员 |
|
||||
| `internal/docduty/store.go`:HealProjectDocuments | 按项目成员默认职责扫描并回填所有 task_key 非空文档 | 可能覆盖逐文档三职,必须区分实例绑定与旧默认 |
|
||||
| `internal/bizdev/service.go` / `internal/docgov/project_docs.go` | 生成后、列表读取时调用 HealProjectDocuments | 重开页面即可触发回填,必须验证刷新后仍一致 |
|
||||
| `internal/docduty/revoke.go` | 成员职责变化撤销审核/批准槽位,随后参与 heal | 不能把项目默认职责变化误当成逐文档兼任变更 |
|
||||
| `internal/server/handlers.go`:三个 DocGov 决议 handler | 使用登录身份及动作固定 author/reviewer/approver;先执行工作流鉴权 | 服务端已有按动作身份模型,应保留 |
|
||||
| `internal/docgov/state_machine.go` | drafting/reviewing/approving/approved;检查对应职责 ID;无额外三人不同判断 | 复用状态机,测试身份一致和锁定边界 |
|
||||
| `web/src/lib/currentDocRole.ts` | author 命中后立即返回,不支持同时三职 | A/A/A 会一直被当成 author |
|
||||
| `web/src/lib/docGovActionVisibility.ts` / `DocGovActionBar.tsx` | 按单一 currentRole 显示送审/审核/批准 | 必须改为动作能力或多职责判断 |
|
||||
| `web/src/lib/projectSettingsDuties.ts` / `ProjectSettingsModal.tsx` | 重复服务端 full/none 校验,人工审批默认要求至少三人 | 单成员兼任会被前端提前挡住 |
|
||||
| `deploy/postgres/goose/00017_2026-09-12-project-workflow-instances.sql` | assignment 唯一键是任务实例+职责,无跨职责用户唯一限制 | 同一用户可有三条职责记录,不必拆用户身份 |
|
||||
| `deploy/postgres/goose/00049_2026-09-17-system-settings.sql` | system_settings 已存在 | 采用增量迁移,不重建设置机制 |
|
||||
|
||||
相关历史边界参见 `.doc/test-reports/2026-09-14-governance-action-level-authz-test-report.md` 与 `.doc/test-reports/2026-09-14-workflow-plan-409-frozen-and-optional-duties-test-report.md`。它们说明已有验收意图,本次未重跑其测试。
|
||||
|
||||
IDE 所列 rdev 设计、short-term 和 backlog 当前位于 `feature/rdev-template-depth` 的独立工作区,不在本方案 dev 基线;已读取作兼容输入。rdev 的关闭文档/N/A、阶段前置、任务键命名空间化保持原语义。本方案按实例+阶段+任务身份绑定;待 rdev 合入后增加对应回归,不宣称其已在 dev 发布。
|
||||
|
||||
### Key Technical Decisions
|
||||
|
||||
- KTD1. 新增 `duty_policy`,值为 `separated` / `author_only`,属于 DocTaskPlan 的逐文档配置。缺省按 separated 解读;none/partial/full 仍是职责完整度,不能把「免审批」和「兼任」混为一谈。统一提供按任务解析模式、有效职责、是否受治理的领域能力;原 ClassifyDocDuty 保留给旧调用,治理调用迁到新解析器。(R3–R6)
|
||||
- KTD2. 配置快照保存用户意图:author_only 的 duties 规范形式只含 author_user_id。服务端通过唯一解析器派生有效 A/A/A,写三条 document_duty_assignments,并投影到 document_records 的三个 ID/名称。读接口区分配置职责与有效职责,客户端不得把有效 A/A/A 原样误写成标准配置。(R4、R11)
|
||||
- KTD3. 新设置 key 建议 `workflow.allow_author_only_approval`,类型严格 bool,默认 false,无环境变量绕过,保存无需重启。projectinstance 通过窄的策略读取接口消费,由 app 装配注入;不从领域服务调用 HTTP,不让 projectinstance 成为 sysadmin 设置表的第二写入 owner。(R1)
|
||||
- KTD4. 配置写入、预览和激活都复核总授权;真正激活必须在事务内对授权版本复核,并与关闭总开关串行化。token 绑定 plan hash、项目/规划版本、授权 revision。总开关 false→true 后旧 token 仍作废,不能以「当前又是 true」放行。(R10、R11)
|
||||
- KTD5. 实例绑定文档的职责权威是冻结 DocTaskPlan,经解析生成 assignments 和文档投影。项目成员 document_duty 只供旧无实例文档的默认分配。heal/revoke/生成/通知不得再次用项目默认人员覆盖实例文档。(R3、R7、R12)
|
||||
- KTD6. 运行时按具体动作检查有效职责和当前在任状态;状态机仍按 author/reviewer/approver 记录实际动作角色。前端采用服务端动作能力集驱动按钮,可同时拥有多个职责,保留 viewer fail-closed,不新增一个可以绕过所有检查的万能角色。(R5、R7、R8)
|
||||
- KTD7. 遵守 R9 的冻结边界;未知 mode、缺失授权来源或绑定不唯一时拒绝写动作。历史缺字段只代表旧 separated,不自动解释为兼任;不能全库 A/A/A 回填。(R6、R9、R11)
|
||||
|
||||
### Data Model
|
||||
|
||||
以下是设计契约,字段落位按 owner 边界实现,不是现有字段清单。
|
||||
|
||||
| 数据 | 建议新增/扩展 | 用途与兼容 |
|
||||
|---|---|---|
|
||||
| system_settings | 目标 key;monotonic revision(默认 0) | 总权限 CAS、token 失效;目标行在迁移时初始化 false,避免无行锁问题 |
|
||||
| 系统设置审计 | 仅本策略必需的 before/after、revision、actor、时间、request ID | 与设置更新同一事务提交;不把整站审计改造扩大到本期 |
|
||||
| DocTaskPlan JSON | duty_policy,可选且旧值缺省 separated | 逐文档意图,纳入 plan hash;兼容 old hash 的序列化须有固定样本 |
|
||||
| workflow instance 授权快照 | policy key、revision、允许状态、activated_by/at | 记录激活时获准的依据;由服务端生成,拒绝客户端伪造 |
|
||||
| activation token | policy revision(新字段或令牌存储的版本化元数据) | 防预览后管理员撤销授权;旧 token 含兼任无 revision 必须重新预览 |
|
||||
| document_records | doc_task_instance_id 可空外键 | 对新实例创建文档强制绑定;旧文档仅唯一匹配才回填,不修改历史职责 |
|
||||
| document_duty_assignments | 复用三角色,兼任三行 user_id 相同 | 无需放宽角色唯一约束;author 必须有效且正数 |
|
||||
| 文档视图 | duty_policy、effective_duties、allowed_actions、blocked_reason | 以服务端计算值展示;读参数不能切换权限 |
|
||||
| 文档审计 details | duty_policy、instance/task ID、授权 revision | 送审/审核/批准均记录真人身份及该次 action role |
|
||||
|
||||
不预占 Goose 序号:实施时根据 dev 与并行 rdev 分支最新迁移取下一个空闲序号。迁移需覆盖 PG store 与 memStore 的字段 round-trip。兼容旧数据时禁止把 NULL 改成 0 外键。
|
||||
|
||||
### High-Level Technical Design
|
||||
|
||||
职责解析链:
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
A[管理员总授权] --> B[创建者逐文档配置]
|
||||
B --> C[保存与预览校验]
|
||||
C --> D[事务内复核授权并激活]
|
||||
D --> E[冻结实例配置与授权依据]
|
||||
E --> F[统一解析有效三职]
|
||||
F --> G[职责表与文档人员投影]
|
||||
F --> H[动作鉴权和阶段可见性]
|
||||
H --> I[前端能力与操作按钮]
|
||||
G --> J[文档状态机与审计]
|
||||
```
|
||||
|
||||
兼任保留原审批状态机:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
drafting --> reviewing: A以编制身份送审
|
||||
reviewing --> approving: A以审核身份通过
|
||||
reviewing --> drafting: A审核驳回并填写原因
|
||||
approving --> approved: A以批准身份通过
|
||||
approving --> drafting: A批准驳回
|
||||
approving --> reviewing: 现有配置允许时退回审核
|
||||
```
|
||||
|
||||
新授权和冻结授权的判断路径:
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
A[请求] --> B{规划配置或激活?}
|
||||
B -->|是| C{权威创建者且planning?}
|
||||
C -->|否| X[拒绝]
|
||||
C -->|是| D{含author_only?}
|
||||
D -->|否| E[原职责规则]
|
||||
D -->|是| F{总授权有效且版本一致?}
|
||||
F -->|否| X
|
||||
F -->|是| G[检查作者与输入一致性]
|
||||
B -->|运行时动作| H[查冻结策略及实例任务绑定]
|
||||
H --> I[检查成员有效性 当前阶段 状态和租约]
|
||||
I --> J[按动作职责执行]
|
||||
```
|
||||
|
||||
激活事务与设置撤销都以策略行锁形成先后顺序,再按统一顺序获取项目职责锁和实例相关行锁。策略 owner 提供事务兼容读取/锁定适配;不能照搬在事务外重查布尔值的方式。原则:关闭先提交则激活失败;激活先提交则成为 R10 中可继续的存量实例。并行成员移除与激活也必须在同一项目职责锁语义下判定,不能在事务开始前检查后直接信任。
|
||||
|
||||
### API Contract
|
||||
|
||||
| 接口 | 变更 | 服务端强制条件 |
|
||||
|---|---|---|
|
||||
| GET/PUT `/api/v1/admin/system/settings[/{key}]` | 注册总开关;目标 key 增加 expected_revision,返回新 revision | requireSystemAdmin;严格拒绝 null、字符串布尔;审计与值同事务 |
|
||||
| GET `/api/v1/projects/{id}/settings` | 返回精简 governance_policy capability、revision 与 blocked_reason | 保留项目访问校验;不泄露其他系统设置 |
|
||||
| PUT `/api/v1/projects/{id}/workflow-plan` | 每个文档可传 duty_policy;兼任只传 author ID;沿用规划版本 | 创建者、planning、总授权、有效成员、输入无矛盾 |
|
||||
| 激活 preview / activate 现有接口 | 预览分列兼任文档;token 绑定策略 revision | 保存成功不等于已获激活授权;提交时重新事务校验 |
|
||||
| 文档详情和项目文档列表 | 返回模式、有效三职与允许动作 | 统一来源;任务身份、实例身份须匹配 |
|
||||
| docgov 送审/审核/批准接口 | URL不变,增加模式审计上下文 | 登录用户+对应 action,不信任请求的 user_id/user_name |
|
||||
|
||||
建议新增错误码:`AUTHOR_ONLY_POLICY_DISABLED`(403)、`AUTHOR_ONLY_POLICY_CHANGED`(409)、`AUTHOR_ONLY_AUTHOR_REQUIRED` / `AUTHOR_ONLY_DUTY_CONFLICT` / `UNKNOWN_DUTY_POLICY`(400 validation issue)、`DUTY_BINDING_AMBIGUOUS`(409)、`DUTY_ASSIGNEE_INACTIVE`(403)。总权限存储不可用返回 503;缺失目标配置采用默认关闭,但数据库故障不能伪装成正常缺项。保留已有 PLAN_FROZEN、PLAN_REVISION_CONFLICT 与 SEPARATION_OF_DUTY_VIOLATION。
|
||||
|
||||
`author_only` 写入审核/批准 ID:省略或 0 为规范输入;若为与作者相同的正数,可规范化为省略以兼容回显,但若不同则拒绝。关闭兼任时清除派生审核/批准,要求重新选择符合分离规则的人员;旧选择可仅作为未保存草稿提示,不自动恢复为真实授权。
|
||||
|
||||
### UX Details
|
||||
|
||||
系统设置开关说明写明 R10,并展示预计受影响的待激活兼任文档数量及存量继续执行说明。保存失败保留用户输入和错误,不在本地假装开启成功。多管理员同时修改返回版本冲突,不自动覆盖。
|
||||
|
||||
项目设置按文档行提供兼任选项;总权限关闭时禁用并解释来源;非创建者只读。兼任只能在文档已启用且纳入人工审批时选择。兼任文档仅需一位成员;混合方案只要仍存在标准人工审批文档,才继续提示至少三位有效人员。
|
||||
|
||||
总开关在页面打开期间被关闭时,保存失败展示定位到文档的原因,提供关闭兼任选项;不丢弃整份未保存规划,不自动重试激活。预览和冻结视图同时展示「角色指派数」和「实际人数」,避免 A/A/A 被误认为三个人。
|
||||
|
||||
文档正文签署区显示真实姓名及兼任标记,但未发生审核/批准时不得显示签署时间或声称已通过。按钮随状态变化,审阅阶段即使当前人也是作者也不能编辑锁定正文;驳回后恢复编辑。查看/认领按当前状态或明确动作记录相应角色,不能打开一次页面就伪造三次履责。
|
||||
|
||||
### Risks and Compatibility
|
||||
|
||||
1. **回填覆盖(硬性门禁,非偶然安全):** `HealProjectDocuments` / `ApplySlotRevocations` 与 `ConfigSnapshot` 是独立职责写路径,当前不区分实例绑定文档。实现必须在 heal/revoke 增加「实例绑定文档跳过项目默认覆盖」显式分支,禁止依赖「只填缺失槽位、碰巧不覆盖」的偶然安全。U3 必须对三入口(文档生成、列表 GET、成员变更)及 author 被误判非在任时的 healSlot 分别证明投影不变;未通过不得开放 UI。
|
||||
2. **历史身份混淆:** 不以 project_id+task_key 跨实例盲绑;旧文档匹配多实例则保持原记录并报可定位问题。新生成文档必须携带 task instance ID,无法绑定应停止受控写入。
|
||||
3. **成员退出:** runtime 复核在任资格覆盖 author_only;保留冻结快照用于历史展示。普通成员默认职责改变不得影响冻结文档;真实退出/停用应阻断动作。暂不新增运行中换人 UI。
|
||||
4. **并发审批:** 同一人可打开多个标签,服务端仍需保证状态比较/版本检查;重复请求不能重复创建批准事件、版本封存或推进通知。延迟到达的审核请求不能作用于后续修订版本。
|
||||
5. **通知与事件:** 审核待办发给同一人是有效业务,不可因发送者=接收者一概过滤。按事件+接收者去重,不把审核与批准两项待办合并成一个动作。
|
||||
6. **回滚:** 关闭开关只停止新配置,不能安全地把已存在兼任实例交给完全不识别新模式的旧二进制。上线后若需回退代码,保留模式识别与冻结策略读取兼容补丁;不得通过清空审核/批准人员回滚。
|
||||
7. **总开关非紧急熔断(R10):** 关闭总授权不会阻断已激活兼任实例的剩余送审/审核/批准。界面与运维说明必须写明这一点,避免被误解为「关总开关=紧急止损」。存量紧急撤销不在本期范围。
|
||||
|
||||
---
|
||||
|
||||
## Implementation Units
|
||||
|
||||
### U1. 策略存储与总授权
|
||||
|
||||
目标:提供管理员可写、项目治理可可靠消费的总授权。覆盖 R1、R10、R11,采用 KTD3、KTD4。
|
||||
|
||||
文件:`internal/sysadmin/settings.go`、`store.go`、`internal/server/admin_system_handlers.go`、`internal/app/` 装配、增量 Goose 迁移;必要时新增 sysadmin 内的策略审计存储文件。
|
||||
|
||||
实现重点:默认关闭;严格 bool;目标设置 revision 与 CAS;事务内审计;窄接口可参与激活事务。仅本 key 要求的新协议不破坏其他设置键调用。
|
||||
|
||||
测试场景:管理员开关成功;普通用户伪造 PUT 被拒;null/字符串拒绝;DB断开不放行;并发修改只一个版本成功;审计写失败时设置回滚;重启读回。
|
||||
|
||||
### U2. 逐文档模式、规划校验与激活
|
||||
|
||||
依赖 U1。覆盖 R2–R6、R9–R11,采用 KTD1、KTD2、KTD4、KTD7。
|
||||
|
||||
文件:`internal/projectinstance/{types,duty_mode,validator,service,store,hash,tx,errors}.go`、`internal/server/project_settings_handlers.go`。
|
||||
|
||||
实现重点:新增模式解析;所有 full-only 分支改为正确的受治理判断;保存、预览、激活一致;任务禁用/免审批清除模式;有效成员检查;规划 hash/授权 revision 和确认 token 一致。保存快照与提升 plan revision 应原子化,失败不能留下可读取的新规划配旧版本。
|
||||
|
||||
测试场景:一位成员、至少一份合法兼任文档可激活;只填作者但未开模式仍拒绝;混合 full/none/author_only;其他项目创建者、非创建者管理员拒绝;修改总授权后旧 token 拒绝;激活与撤销并发的两种提交顺序;旧 separated snapshot/hash 兼容。
|
||||
|
||||
### U3. 文档绑定与职责投影一致性
|
||||
|
||||
依赖 U2;这是开放 UI 前的必要门禁。覆盖 R3、R4、R7、R11、R12,采用 KTD2、KTD5。
|
||||
|
||||
文件:`internal/docduty/{store,resolve,revoke}.go`、`internal/docgov/{types,engine,project_docs,repository}.go`、`internal/bizdev/service.go`、`internal/projectinstance/store.go`、任务执行请求与 app 适配、增量迁移。
|
||||
|
||||
实现重点:新文档绑定具体任务实例;受治理实例职责优先;统一有效职责映射用于创建、读取、heal、memStore;legacy fallback 仅在明确无实例时可用。`HealBinding`/`healSlot`/`ApplySlotRevocations` 对已绑定 `doc_task_instance_id` 的文档必须显式跳过项目默认覆盖,不得因 author 被误判非在任而重新分配默认人。旧已批准文档不因新功能读取被改写签署人员。
|
||||
|
||||
测试场景:同项目两份兼任文档由不同作者承担;第三份标准审批三人;第四份 none;反复 GET/成员默认角色调整/重启后四份职责均不串;未知或歧义绑定阻断;旧无实例文档仍按既有规则;NULL外键正常。**硬性投影稳定性(开放 UI 前门禁):** 已激活 author_only 文档在以下三入口触发 `HealProjectDocuments` 后,`document_records` 与 assignments 投影必须保持 A/A/A——(1) 仅刷新文档列表(`ListWorkflowDocumentsByProject`);(2) 文档生成完成(bizdev);(3) 成员变更后 heal。另测:author 被误判为非在任成员时,healSlot 不得把审核/批准槽位改写为项目默认人;真实离任仍按 R12 阻断写动作且不自动替人。
|
||||
|
||||
### U4. 动作鉴权、文档状态机与事件
|
||||
|
||||
依赖 U3。覆盖 R5、R7、R8、R12,采用 KTD6。
|
||||
|
||||
文件:`internal/projectinstance/{duty_action,document_access,stage_access,gate}.go`、`internal/server/{stage_access_helpers,handlers,document_revision_access}.go`、`internal/app/docflow/`、`internal/docgov/`、相关通知订阅与审计视图。
|
||||
|
||||
实现重点:有效三职与在任状态统一判定;三个动作使用不同 action role;归档/修订账本与事件沿用既有事务机制;审核、批准不能跳状态,租约和内容 hash 不因同人而失效。Audit details 增加模式及来源。
|
||||
|
||||
测试场景:A顺序三动作成功且三份日志身份真实;其他成员/创建者/管理员越权失败;作者退出后全部写动作拒绝;审核中改正文失败;驳回原因必填;跨标签重复批准只产生一次有效终态事件;审批针对旧版本内容被拒;阶段直到最终批准才可推进。
|
||||
|
||||
### U5. 系统设置与逐文档 UI
|
||||
|
||||
依赖 U1、U2,可与 U3/U4 开发隔离进行,联调必须等待后端完整。覆盖 R1–R4、R7、R9–R11。
|
||||
|
||||
文件:`web/src/components/admin/console/sections/SettingsSection.tsx`、`web/src/components/project/ProjectSettingsModal.tsx`、`web/src/lib/projectSettingsDuties.ts`、`web/src/types/projectSettings.ts`、`web/src/api/projectSettings.ts`。
|
||||
|
||||
实现重点:按 UX Details 配置、错误定位、人数要求、预览和冻结展示;策略 capability 来自项目 settings,而非向普通用户开放 admin settings。文档模式在不同阶段展开折叠后不串行。
|
||||
|
||||
测试场景:单成员可配置兼任;混合标准模式仍提示三人要求;非创建者只读;系统开关关闭时禁用及保存失败保留草稿;切换文档、刷新、重新登录后模式不变;已激活项目仍冻结。
|
||||
|
||||
### U6. 多职责动作展示和真实闭环验收
|
||||
|
||||
依赖 U3–U5。覆盖 R5–R8、R11、R12,采用 KTD6。
|
||||
|
||||
文件:`web/src/lib/{currentDocRole,docGovActionVisibility,controlledDocHydrate,deliverableSync}.ts`、`web/src/components/doc/DocGovActionBar.tsx`、`web/src/App.tsx`、文档 API/types、相关 UI/PG/真实 PI 测试与报告。
|
||||
|
||||
实现重点:消费服务端动作能力,多职责不再被 author-first 短路;认领、提案、修订、按钮与日志一致;受控文档不按名字提权。证明刷新及重启保持一致后再开启真实项目配置。
|
||||
|
||||
测试场景:真实产品 PI 生成→A打开文档→送审→审核→批准→版本/日志→阶段门禁;标准和免审批文档并存;不同用户负例;两标签并发、刷新重开、重启;rdev 合入后复验 rd_ 文档及旧键兼容,不改 N/A 行为。
|
||||
|
||||
---
|
||||
|
||||
## Verification Contract
|
||||
|
||||
本方案阶段未运行业务测试,以下为实现阶段必须提交的证据。
|
||||
|
||||
| 层级 | 覆盖 | 通过标准 |
|
||||
|---|---|---|
|
||||
| Go 单元 | 策略值、模式解析、权限矩阵、状态、门禁、hash | 所有模式边界及错误路径可重复验证 |
|
||||
| PostgreSQL 集成 | 设置审计原子性、并发撤销/激活、成员退出、三职责落库、投影绑定;HealProjectDocuments 三入口对实例绑定 author_only 文档投影不变 | 实际事务交错结果符合 KTD4;失败不留下半成品;列表 GET/生成/成员变更均不得覆盖冻结 A/A/A |
|
||||
| 前端单元/构建 | 单成员配置、双层开关、多职责按钮、错误恢复 | 测试与构建通过,无同人只见作者按钮 |
|
||||
| HTTP 负例 | 修改请求身份、跨项目、非创建者、未知模式、关闭总授权 | 服务端拒绝,不能依赖隐藏按钮 |
|
||||
| 浏览器 E2E | 管理员开关→创建者逐文档设置→A全部动作→其他人被拒 | 真页面操作、日志可见;无 API 直写替代关键步骤 |
|
||||
| 产品 PI E2E | 正式生成及既有修订/租约流程 | 使用仓库要求的真实产品 PI + MiniMax;stub 仅作前期定位 |
|
||||
| 持久化 | 刷新、重开、重登、服务重启 | 模式、职责、审核状态、版本和审计一致 |
|
||||
| 回归 | 既有 full/none、标准三人分离、freeform、legacy、终止实例 | 原有权限和生命周期边界不退化 |
|
||||
|
||||
实现时执行 PROJECT 规定的 `go vet ./...`、`go test -short ./...`、前端 `npm test` 与 `npm run build`,以及使用隔离测试库的 PG 集成和明确启用的真实 PI 测试。不得把 skip 当 pass。共享容器重建验证必须在主仓占 CURRENT 集成槽位后执行;worktree 不启停共享容器。
|
||||
|
||||
重点验收样例:
|
||||
|
||||
- AE1(R1–R4):管理员开启后,创建者在文档甲选择 A,在文档乙选择 B;甲/乙有效三职分别为 A/A/A、B/B/B,互不影响。
|
||||
- AE2(R5–R8):A只能按状态依次送审、审核、批准;未批准前门禁阻塞;另一个管理员无该文档职责仍被拒。
|
||||
- AE3(R6):总开关开启但文档未勾选,A/A/A仍拒绝;三职空仅对原来允许免审批的文档合法。
|
||||
- AE4(R10、R11):预览后总开关关闭再打开,旧 token 409;已先完成激活的实例刷新后仍可按冻结策略办理。关闭总开关不得阻断已激活实例的剩余审批动作(非紧急熔断)。
|
||||
- AE5(R7、R11):项目成员默认审核人改为 C 后,读取兼任文档仍显示 A/A/A,不改历史签署;列表、正文及按钮一致。
|
||||
- AE5a(R7、KTD5):已激活 author_only 文档在仅刷新文档列表(触发 `ListWorkflowDocumentsByProject` → `HealProjectDocuments`)后,投影仍为 A/A/A,不被项目默认职责覆盖。
|
||||
- AE5b(R7、KTD5):文档生成完成与成员变更后 heal 两入口分别复测 AE5a;author 被误判为非在任时,healSlot 不得把审核/批准槽位改写为项目默认人。
|
||||
- AE6(R12):A离任后保持历史名字,但所有新动作拒绝,不能被 heal 自动替换或按名字回退提权。
|
||||
|
||||
---
|
||||
|
||||
## Definition of Done
|
||||
|
||||
- [x] R9、R10 的生命周期口径经过用户审核(2026-09-17):批准「激活前配置 + 激活后冻结」与「关总开关仅停新配置、存量按冻结继续」;明确总开关不提供存量紧急熔断,该能力如需另立方案。Heal 三入口投影稳定性已升为 U3/Verification 硬性验收项。
|
||||
- [x] U1–U6 全部完成且证据覆盖对应需求;管理员和创建者两个权限层级均在服务端生效。(short-term U1–U6 均为 `done`;U6 报告回链)
|
||||
- [x] 配置、快照、assignments、document_records、前端、审计在同一任务身份下对齐。(U2–U4 + U6 闭环证据;规范存储仅 Author + 有效 A/A/A 投影)
|
||||
- [x] 单成员兼任完整链与三人标准链均通过;不得只提交设置页截图。(U4 矩阵 + U6 HTTP/浏览器证据;标准分离回归见 U4/U2 单测)
|
||||
- [x] PostgreSQL、真实产品 PI、浏览器、重启与跨用户负例分别标明结果及限制;AE5a/AE5b 必须有证据。(U3:`TestHealProjectDocuments_SkipsDutyLocked_PG` 等 duty_locked 过滤;U6:既有 PI 生成文档 + Playwright 徽标 + lizhuguan 403。限制:U6 未单独跑「刷新/重登/重启」专轮,依赖 schema 持久化与 rebuild 后复测)
|
||||
- [x] `.doc/test-reports/` 有验收报告并回链任务和 FEATURE-MATRIX;无新增已确认发布 blocker 才保持 gap-matrix 原结论。([U6 报告](../test-reports/2026-09-17-document-author-only-u6-test-report.md);变更提案 HTTP 另记 [audit](../audit/2026-09-17-docgov-modification-proposal-http-gap.md),不升为发布 blocker)
|
||||
- [x] 发布先迁移与部署识别新模式的服务,再开放总授权;默认 off,试点后扩面。推送、dev集成与环境晋升状态分别报告。(**dev 已合入并 rebuild**:`merge: feature/document-author-only-plan` @ `09a9921`,health `schema_version=52`,总开关默认 off。**未做**:push origin/dev、test/main 晋升、开放总授权试点——需另授)
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: "系统体检整改与完善实施方案(2026-09-17)"
|
||||
status: planned
|
||||
created: 2026-09-17
|
||||
updated: 2026-09-18
|
||||
---
|
||||
|
||||
# 系统体检整改与完善实施方案
|
||||
|
||||
> 配套审计:[../audit/2026-09-17-system-health-check.md](../audit/2026-09-17-system-health-check.md)(编号 B-x 确认 bug、R-x 隐患、E-x 环境缺陷、T-x 任务、X-x 死代码、S-x 测试盲区、D-x 文档漂移)。
|
||||
> Wave 0–7 已实施收口。Wave 7 仅为编排确认,未改变能力实现状态。
|
||||
|
||||
## 背景
|
||||
|
||||
体检确认质量门禁全绿、发布门禁口径属实;但发现 1 项 critical 环境缺陷(main ENV 不一致,E-1)、2 项 high 级 SSE 断流 bug(B-1/B-2)、1 项 high 级前端缓存 bug(B-5)、一批「机制先行无消费方」与测试盲区。本方案按风险优先分波次收口。
|
||||
|
||||
## 目标
|
||||
|
||||
1. main 环境事件链路语义唯一、无双写/空转风险(E-1)。
|
||||
2. SSE 长任务不再被 120s WriteTimeout 强杀(B-1/B-2),错误语义对齐(B-3/B-4)。
|
||||
3. 前端会话窗口缓存一致、恢复不丢数据(B-5/B-6)。
|
||||
4. 封存功能的灰度入口在 compose 层就绪(E-3),死配置/死代码有明确处置(E-4、X-*)。
|
||||
5. 测试债与 E2E 门禁入口收敛(S-1/S-2/S-4)。
|
||||
6. 文档 SSOT 无漂移(D-1~D-6)。
|
||||
|
||||
## 分波次计划
|
||||
|
||||
| 波次 | 内容 | 验收 |
|
||||
|------|------|------|
|
||||
| **Wave 0:P0 确认 bug** | B-1/B-2:`handleChatStream` 与 `handleRunTaskStream` 接 `extendSSEWriteDeadline` + 心跳(复用 sse.go:52-64 既有机制);run/stream 支持 `after_seq` 续订(重连走既有 `GET .../events?after_seq=`)。B-3:Decode 失败返回 400。B-4:CreateAndStart/Subscribe 前置到 Flush 之前(对齐 chat 路径)。B-5:useChatWindow 全部写入统一带 `userId` 前缀,LRU 驱逐完整 cache key。B-6:`applyRestoredFileRaw` 函数式合并 | **done**(2026-09-18):[test-report](../test-reports/2026-09-18-wave0-p0-bug-fixes-test-report.md);合入 `dev` merge `fix/wave0-p0-sse-chat-cache-bugs`;dev rebuild + health/ready PASS;真 PI SSE 心跳证据归档 |
|
||||
| **Wave 1:main 环境修正(critical)** | E-1:app/events 统一 `ENV=main`。E-2:app `depends_on events: service_healthy`(events 同步迁移后再启 app)。E-5:`Env==""` 不再视同 dev。附带:events 补齐 `validateProductionSecrets` 所需口令以免 Restarting | **done**(2026-09-18):[test-report](../test-reports/2026-09-18-wave1-main-env-fix-test-report.md);main health `env=main` + `schema_version=52`;consumer modes 仍 off |
|
||||
| **Wave 2:配置与灰度入口对齐** | E-3:三环境声明 `MULTI_INTENT_PLAN_TIER`+U9–U12(legacy/false);A-4:test/main 补 SHADOW/NARRATIVE。E-4:删除 `CURSOR_RUNNER_URL`+cursor-agent。E-6:main `SEED_DEMO_USERS=false`。E-7:非法 `INTENT_V2_DECISION_TIER`→`none`。E-9:评估不改 initdb | **done**(2026-09-18):[test-report](../test-reports/2026-09-18-wave2-config-flag-align-test-report.md);三环境 env 抽检 + health/ready PASS |
|
||||
| **Wave 3:测试债与盲区** | S-1:隔离 PG(5436) 跑 `TestReconcile_LegacyRepair_PG`。S-2:删 taskstream 死跳过;plan_owner 重定向说明。S-4:每 spec npm 脚本;退役 `document-revision.spec`(消灭 DOCREV_E2E_BASE_URL)。S-5:`projectSettingsError` 复用到 members/freeform/taskRuns/chatSessions | **done**(2026-09-18):[test-report](../test-reports/2026-09-18-wave3-test-debt-blindspots-test-report.md);playwright list 29/8;reconcile PG PASS |
|
||||
| **Wave 4:隐患加固(可与 Wave 0–3 并行认领,mutex 不冲突时)** | R-1:`getOrCreateSession` 增 owner 绑定校验(session 创建时记录 owner,后续请求校验,不匹配 403)。R-2:18 处 `rows.Next()` 循环补 `rows.Err()` 检查。R-3:dispatcher Handlers 读路径加 RLock(或注释冻结「仅启动期注册」并加 archtest 约束)。R-4:`memTurns` 加 TTL/容量淘汰。R-5:pg_store JSONB 反序列化错误改为显式报错。R-6:后台 ticker 纳入 Shutdown;vault Drain 错误上报告警。R-7/R-8:SSE 重连 401/404 fail-fast、逐帧容错;登出 abort 在途流 | **done**(2026-09-18):[test-report](../test-reports/2026-09-18-wave4-hardening-r1-r8-test-report.md);Memory+PG 跨用户负例 PASS;`go test -short` / `npm test` 全绿 |
|
||||
| **Wave 5:死代码与机制收口(需逐项决策,不擅自删)** | X-1:删除 `SEMANTIC_FALLBACK_ENABLED`。X-2:`SEMANTIC_SUMMARY_REPLACE` 维持未接线并封存注释。X-3:00048 三表 deferred → SWBOOT-10/W5b。X-4:system_settings 6 键保留并注释二期。X-5:删除 DocumentNotificationList、WorkflowPrerequisiteBanner、SettingsModal、activateWorkflow、saveMessages 及级联 patchNotification | **done**(2026-09-18):[决策](../ops/short-term/2026-09-18-wave5-deadcode-decisions.md) · [test-report](../test-reports/2026-09-18-wave5-deadcode-decisions-test-report.md) |
|
||||
| **Wave 6:文档漂移修复** | D-1:PU8 四份契约文件状态改 done 并归档。D-2:modular-monolith ADR 状态更新为 accepted。D-3:两个 INDEX 末行已在本审计修正(复核即可)。D-4:handoff 回标已被覆盖。D-5:backlog D3/D7 同步最新状态。D-6:PROJECT.md §9「剩余 blocker」段与 gap-matrix 对齐或删除 | **done**(2026-09-18):[short-term](../ops/short-term/2026-09-18-wave6-doc-drift.md) · [test-report](../test-reports/2026-09-18-wave6-doc-drift-test-report.md);D-3 INDEX 复核 PASS、零改动 |
|
||||
| **Wave 7:既有 roadmap 收口(不改优先级,仅确认编排)** | T1/W5:SWBOOT-10 安全评审后实施(保持 fail-closed 直至授权)。T1/W6:FAV live 放量 staging→artifact→publication,每级 ≥7 天观察窗,`FAV_DEGRADED_READ=false` 不动。T1/W7:D7 待合规签字后按 ADR 整改。T2:Control Center 前端 SPA 七页人工走查。T4:首次加载性能 U1/U3–U7。T5/T6/T8:backlog 类按收益触发 | **done**(2026-09-18):[决策记录](../ops/short-term/2026-09-18-wave7-roadmap-orchestration.md)。六项编排确认已记录;T2 发现审计结论过期(canonical 实现为 engineering-dashboard,已 done;`feature/control-center-server` 未合入,相对 `dev@a88ed85` 落后 136 commits,待用户裁决);FAV/D7/tier 升级红线未动 |
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] Wave 0 完成后:`go vet ./...`、`go test -short ./...`、`cd web && npm test && npm run build` 全绿;dev 容器 rebuild + health/ready PASS([报告](../test-reports/2026-09-18-wave0-p0-bug-fixes-test-report.md))
|
||||
- [x] main 环境:ENV 语义统一核验记录 + schema 已升(实测 52)+ 事件链路无双写证据(modes 仍 off)(Wave 1,[报告](../test-reports/2026-09-18-wave1-main-env-fix-test-report.md))
|
||||
- [x] SSE 长回合心跳接线:真 PI 静默期 `: heartbeat` + 短 WriteTimeout 单测跨越(Wave 0)
|
||||
- [x] Wave 2 配置声明对齐:三环境 compose diff 复核 + 容器 env 抽检 + go test 全绿(E-3/E-4/E-6/E-7 完成;E-9 评估结论已记录,不改代码)([报告](../test-reports/2026-09-18-wave2-config-flag-align-test-report.md))
|
||||
- [x] `TestReconcile_LegacyRepair_PG` 报告归档,gap-matrix 测试债行关闭(Wave 3)
|
||||
- [x] `playwright test --list` 与门禁文档一致(Wave 3)
|
||||
- [x] 跨用户会话挂靠负例测试入库(Wave 4)
|
||||
- [x] X-1~X-5 每项有决策记录(Wave 5)
|
||||
- [x] D-1~D-6 全部回链关闭(Wave 6)
|
||||
- [x] Wave 7 六项编排确认已记录(T1/W5、T1/W6、T1/W7、T2、T4、T5/T6/T8);FAV/D7/tier 升级红线未变(Wave 7)
|
||||
- [x] 不触碰红线:FAV_DEGRADED_READ=false、MULTI_INTENT_PLAN_TIER 默认 legacy、SEMANTIC_SUMMARY_REPLACE 不接线、项目 143 只读、禁止整支 merge FAV
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Audit: [../audit/2026-09-17-system-health-check.md](../audit/2026-09-17-system-health-check.md)
|
||||
- gap-matrix: [./gap-matrix.md](./gap-matrix.md)(本方案不改动发布门禁结论;E-1 若核验确认 main 事件链路异常,再评估是否升 blocker)
|
||||
- 既有收口总控:[./2026-09-16-partial-deferred-completion-plan.md](./2026-09-16-partial-deferred-completion-plan.md)
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
| 文档 | 说明 |
|
||||
|------|------|
|
||||
| [2026-09-17-system-health-remediation-plan.md](./2026-09-17-system-health-remediation-plan.md) | 系统体检整改:Wave0–7(SSE/缓存 P0 → main ENV → 配置对齐 → 测试债 → 隐患 → 死代码决策 → 文档漂移 → roadmap);配套 [审计](../audit/2026-09-17-system-health-check.md) |
|
||||
| [2026-09-17-document-author-only-plan.md](./2026-09-17-document-author-only-plan.md) | 编制人兼任审核/批准:两级授权、`duty_policy=author_only`、U1–U6 实现已收口;默认 off;变更提案 HTTP 另立([audit](../audit/2026-09-17-docgov-modification-proposal-http-gap.md)) |
|
||||
| [gap-matrix.md](./gap-matrix.md) | 发布缺口 SSOT |
|
||||
| [2026-09-16-partial-deferred-completion-plan.md](./2026-09-16-partial-deferred-completion-plan.md) | FEATURE-MATRIX 6 partial + 1 deferred 全量收口:通信机制确认(模块化单体,不新增 RPC 层)、7 项关闭条件、W1–W7 波次;§7 四项决策已确认(2026-09-17) |
|
||||
| [2026-09-16-feature-matrix-production-readiness-plan.md](./2026-09-16-feature-matrix-production-readiness-plan.md) | 能力状态与发布门禁解耦、证据校准、剩余 partial 收口和 production-ready 防回退计划([审计](../audit/2026-09-16-feature-matrix-production-readiness-audit.md)) |
|
||||
@@ -32,4 +34,4 @@
|
||||
|
||||
审计入口:[../audit/INDEX.md](../audit/INDEX.md)
|
||||
|
||||
- 2026-09-17:[首次加载性能诊断与改进](2026-09-17-initial-load-performance-plan.md)(三入口重启首访;方案未实施)。
|
||||
- 2026-09-17:[首次加载性能诊断与改进](2026-09-17-initial-load-performance-plan.md)(三入口重启首访;U2 已验收,主 JS ~624 KB;U1/U3–U7 待实施)。
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
| ID | 描述 | 状态 | 证据 | 计划动作 |
|
||||
|---|---|---|---|---|
|
||||
| WORKFLOW-PLAN-FROZEN-OPTIONAL-DUTIES | active 项目仍展示可编辑职责表单,409 提示在长表单视口外;现有规划又不支持非必需文档“三权全空”,且后端缺少职责人在任成员复核 | **PASS(设置页)** | [audit](../audit/2026-09-14-workflow-plan-409-frozen-and-optional-duties.md);[test-report](../test-reports/2026-09-14-workflow-plan-409-frozen-and-optional-duties-test-report.md)。项目 143 只读 frozen、A full+none 激活、B partial 不发 PUT、C 零治理拒绝、双标签转 frozen、成员无配置入口、刷新后 143 仍 frozen | 设置页矩阵 PASS;真实 PI full/none 长链已另签 [Wave2 报告](../test-reports/2026-09-16-wave2-real-pi-evidence-test-report.md) |
|
||||
| DOC-CONTENT-CANONICAL-HASH-DRIFT | 旧受控文档 bootstrap 裁剪 Markdown 双空格硬换行并将 canonical SHA 写入账本/DocGov,但未同步文件;正文读取把完整性冲突误报 404,lease/list sync 又放大并制造刷新后加载死锁 | **PASS(真实 UI)** | [audit](../audit/2026-09-14-project143-controlled-content-404.md);[UI report](../test-reports/2026-09-14-controlled-content-ui-acceptance.md)。代码已合 dev、schema 32、项目 143 定向 `migration_repair`;项目 143 `clean-run3` 与新项目 `full-chain-final` 主链及 restart 全部纯页面 PASS,目标 404=0 | [remediation](./2026-09-14-controlled-content-canonical-hash-remediation.md)。隔离 `TestReconcile_LegacyRepair_PG` 未执行,按用户“本轮只允许页面测试”的边界保留为工程测试债,不作为本轮 UI PASS 的替代证据 |
|
||||
| DOC-CONTENT-CANONICAL-HASH-DRIFT | 旧受控文档 bootstrap 裁剪 Markdown 双空格硬换行并将 canonical SHA 写入账本/DocGov,但未同步文件;正文读取把完整性冲突误报 404,lease/list sync 又放大并制造刷新后加载死锁 | **PASS(真实 UI)** | [audit](../audit/2026-09-14-project143-controlled-content-404.md);[UI report](../test-reports/2026-09-14-controlled-content-ui-acceptance.md)。代码已合 dev、schema 32、项目 143 定向 `migration_repair`;项目 143 `clean-run3` 与新项目 `full-chain-final` 主链及 restart 全部纯页面 PASS,目标 404=0 | [remediation](./2026-09-14-controlled-content-canonical-hash-remediation.md)。Wave 3(2026-09-18)已在隔离 docker PG(5436)执行 `TestReconcile_LegacyRepair_PG` 一次并 PASS,工程测试债关闭,见 [test-report](../test-reports/2026-09-18-wave3-test-debt-blindspots-test-report.md) |
|
||||
| CHAT-HISTORY-REFRESH | 工作流激活后刷新,对话正文被阶段过滤器清空,但分类数量与锚点仍按全量返回 | **PASS** | [test-report](../test-reports/2026-09-13-chat-history-refresh-test-report.md);活验 [live.json](../test-reports/assets/2026-09-15-chat-history-refresh-live/live.json)(项目 6252,window=categories=2,guest 403);代码:`message_scope.go`、`chat_history_auth.go`、goose 00026/00027 | 闲聊刷新已补。发布门禁「激活后文档任务 + 重登/重启」仍开放,不回退本 gap |
|
||||
| CHAT-INTENT-STATE | 真实会话被诊断探针污染;只读查询误启动文档写任务;错误动作与编辑状态刷新后丢失 | **PASS** | [audit](../audit/2026-09-13-conversation-intent-runtime-state.md);[test-report](../test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md);双标签活验项目 **6275** / `sess-p6275-u10`(`live.json` + Docker 截图)。**不**删除 `sess-p143-u9` 历史探针 | [remediation](./2026-09-13-conversation-intent-runtime-state-remediation.md)。Wave 3–4 浏览器门已签;诊断污染消息仍不擅自删除 |
|
||||
| ENV-RESTART-SOURCE | `docker compose restart` 只重启旧镜像,健康检查无法证明合入代码已部署 | **PASS** | `env-service.sh rebuild` + 真实摘要重测 | 集成冒烟统一使用 `dev rebuild` |
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
| 对话数据治理(D7) | 留存/删除口径、库·备份·日志控制、敏感字段加密边界 | deferred | deferred_enhancement(违规则升 blocker) | [计划](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) Scope Boundaries;[收口 §7.1](../remediation/2026-09-16-partial-deferred-completion-plan.md);[D7 ADR 草案](../adr/2026-09-17-d7-chat-data-retention.md);[W7 盘点](../audit/2026-09-17-d7-data-inventory.md);[报告](../test-reports/2026-09-17-w7-d7-inventory-test-report.md) | **after W7**:只读盘点完成(sessions/messages/KB/日志/备份/event)。**未发现**已确认基线违规,未写 gap-matrix。口径仍 `pending-compliance-signoff`;禁止按 365/180/30 物理删除。本行不升 done | `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` |
|
||||
| 研发设计控制(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)。剩余:S2/S3、P2 前端、P3 三样本 E2E、P4 键名空间化 | `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` |
|
||||
@@ -80,7 +81,7 @@
|
||||
| Intent L1 | partial(混入 U9–U12) | done | U9–U12 → 多意图扩面 | 是(双标签 + 分流 + U1–U3) |
|
||||
| Chat/ctxmgr | partial(混入语义摘要 D5 误标) | done | D3 摘要行;D7 治理行 | 是(B3 项目 6359) |
|
||||
| Document revision | partial(混入完整 PI 叙事) | done | PI change-report 叙事行 | 是(Round20;fallback 为声明行为) |
|
||||
| Frontend workbench | partial(缺口栏已空) | done | 其他 409 信封复用 → backlog | 是(B4 项目 6363) |
|
||||
| Frontend workbench | partial(缺口栏已空) | done | Wave 3 已收口 projectMembers/freeformDoc/taskRuns/chatSessions 结构化错误信封复用 | 是(B4 项目 6363) |
|
||||
| 可靠事件 | partial(与 FAV 混行) | done | FAV 独立 deferred | 是(E0–E2 + shared live) |
|
||||
|
||||
---
|
||||
@@ -95,3 +96,7 @@
|
||||
## 2026-09-17 首次加载性能专项
|
||||
|
||||
首次加载与重启首访性能优化:**partial**(U2 静态交付已验收;不改变现有功能 done/发布门禁结论)。[审计](../audit/2026-09-17-initial-load-performance-audit.md) · [方案](../remediation/2026-09-17-initial-load-performance-plan.md) · [U2 报告](../test-reports/2026-09-17-initial-load-perf-u2-test-report.md)。U2:自托管字体 + br/gzip + assets 404;主 JS 传输 2.82 MB → ~624 KB。U1/U3–U7 未完成。mutex `web + static-delivery`(U2 done)/ `loading-performance-audit`。
|
||||
|
||||
## 2026-09-17 文档编制人兼任方案
|
||||
|
||||
新增能力 **done(U1–U6,已合入 `dev@09a9921`)**:[方案](../remediation/2026-09-17-document-author-only-plan.md) · [源码核查](../audit/2026-09-17-document-author-only-analysis.md) · [U6 验收](../test-reports/2026-09-17-document-author-only-u6-test-report.md) · [收口交接](../ops/handoffs/2026-09-17-document-author-only-closeout.md)。任务归档:`archive/ops/2026-09-17-document-author-only-u{1..6}.md`。总开关默认 off;test/main 晋升与开放授权另授。变更提案 HTTP 仍缺([audit](../audit/2026-09-17-docgov-modification-proposal-http-gap.md))。mutex `document-duty-policy`。
|
||||
|
||||
@@ -0,0 +1,254 @@
|
||||
# 07 研发工作流(rdev)接入——设计与实施计划
|
||||
|
||||
- **版本**: v1.1(四项关键决策已由用户确认,2026-09-17;见 §8)
|
||||
- **日期**: 2026-09-17
|
||||
- **来源**: 用户需求「在系统中加入研发工作流」;参考项目调研见 [research/2026-09-17-rdev-workflow-reference-analysis.md](../../ops/research/2026-09-17-rdev-workflow-reference-analysis.md)
|
||||
- **范围**: 在现有 5 个正式工作流(医疗三 + 软件两)之外,新增医疗第 4 工作流「**研发设计控制流程**」(key: `rdev`,**13 阶段 / 60 文档任务一次到位**,ISO 13485 DHF/DMR 设计控制链);并随后对现有工作流任务键做统一命名空间化(D12,P4)
|
||||
- **分支建议**: `feature/rdev-workflow`(从 dev 切出);键名空间化独立分支 `feature/workflow-key-namespace`
|
||||
|
||||
---
|
||||
|
||||
## 1. 结论摘要
|
||||
|
||||
参考项目的 rdev 工作流与本系统的「workflowdef 版本化定义 + projectinstance 冻结实例 + bizdev/squad 执行链」架构高度同构,接入以**数据与配置为主、代码为辅**:
|
||||
|
||||
1. **一个新 manifest**(`rdev.v2.json`,13 stage × 60 doc task)+ **60 份模板** + **一个通用执行器键** `squad.rdev_doc.v1` + **一个数据驱动的 rdev 任务目录表**(squad 包内)即可跑通主链;
|
||||
2. **两处前置修复**:docgov 文档 Stage 字段去硬编码(现为写死 `V0.5_feasibility`);rdev 启动前置门禁(main 实例 completed,即 CDO 已批准)按 test_manager 先例做**执行器级 precheck**,不恢复流程级依赖(遵循 [WF-DEF-06 整改](../../remediation/2026-09-12-three-workflows-strict-governance-remediation.md));
|
||||
3. **一个关键命名决策**:60 个任务键统一加 `rd_` 前缀(含模板文件名),避免与既有任务键 `system_reqs` 在 doc_id(`doc_proj{id}_{taskKey}`)、模板加载(`GetDocTemplate(taskKey)` 平铺目录)两层冲突;
|
||||
4. 分四期实施(P0 前置修复 → P1 核心接入 → P2 治理与体验 → P3 真实 PI 验收),预估 2–3 周(单人)。
|
||||
|
||||
## 2. 参考项目 rdev 要点(回顾)
|
||||
|
||||
见 [调研笔记](../../ops/research/2026-09-17-rdev-workflow-reference-analysis.md)。核心结构:
|
||||
|
||||
- **13 phase / 60 stage**:01 策划(2) → 02 策划评审(1) → 03 设计输入(12) → 04 需求评审(1) → 05 输入阶段评审(1) → 06 设计输出(17) → 07 输出评审(1) → 08 验证(12) → 09 验证评审(1) → 10 转换(3) → 11 转换评审(1) → 12 确认(7) → 13 设计确认报告(1);
|
||||
- **15 个 skippable**(软件 9 + 电气 3 + EMC + 动物试验 + 临床);
|
||||
- **三种 artifact_kind**:`document` 47 / `review_minutes` 6 / `upload_index` 7;
|
||||
- **记录归属**:`dhf` 为主,设计输出/转换类 `dhf+dmr`;
|
||||
- **followon 门禁**:商务对接 CDO 批准后才可启动;启动时拷贝 bizdev 已填字段;
|
||||
- **质量纪律**:模板写满、结论先行、UR→RS 追溯、缺项「待确认」、不适用须完整理由仍走审批、不编造数据/签字。
|
||||
|
||||
## 3. 现系统机制盘点(与本任务相关)
|
||||
|
||||
| 机制 | 现状 | 对 rdev 的影响 |
|
||||
|------|------|----------------|
|
||||
| 工作流定义 | `internal/workflowdef`:Definition + Version(schema v2 JSONB 快照、definition_hash、published);正式 key 白名单 `catalog_policy.go`;seed 走 `manifests/*.json` 内嵌 + `BootstrapSeeds` 幂等发布 | 新增第 6 个正式 key;manifest/seed/白名单/目录顺序同步 |
|
||||
| 模板资产 | `templates/docs/*.md` 启动时全量上传(asset_key=文件名);运行时 `template.GetDocTemplate(taskKey)` 平铺读 `templates/docs/<taskKey>.md` | **平铺命名 → 必须无碰撞**;rd_ 前缀方案 |
|
||||
| 项目实例 | `projectinstance`:planning→live 冻结 ConfigSnapshot;阶段线性 position;`AdvanceStage` 要求全部 blocking doc task approved;末阶段完成 → InstanceDone | 13 stage 线性推进天然匹配 phase 序;depends_on 语义由阶段序覆盖 |
|
||||
| 执行链 | server `task_run_handlers` → `taskrun.Manager`(单一 Executor = `bizdev.ExecuteTask`)→ `squad.ExecuteTask`(AdaptivePlanner 按 taskKey 出步骤)→ PI Agent Runner | executor_key 目前是**发布校验元数据**,运行时统一走 bizdev;新增任务主要是 squad 侧编排数据 |
|
||||
| squad 编排 | `SupportedTasks` 白名单(9 个);`DefaultWorkflowSteps`/`DefaultSquadAgents` 按 taskKey **硬编码 switch**;非白名单任务回落 autonomous adhoc | 60 任务若逐个 switch 不可维护 → 改为按 artifact_kind 三套通用编排 + rdev 数据目录表 |
|
||||
| 文档账本 | docgov:`doc_id = doc_proj{pid}_{taskKey}`;**Stage 字段写死 `V0.5_feasibility`**(bizdev/service.go:483,489 + docgov/repository.go:28 兜底) | **P0 必修**:改为从冻结实例解析 StageKey |
|
||||
| 前置依赖 | 无流程级依赖(WF-DEF-06 已移除);test_manager 用执行器级 precheck(approved SRS)+ `WorkflowPrerequisiteBanner` | rdev 同模式:precheck「main 实例 completed」 |
|
||||
| 血缘 stale | `projectworkflow/service.go` MarkDownstreamStale;test_manager 记录单一上游 hash | 首期统一项目上下文注入;精确 depends_on 血缘列二期 |
|
||||
| 意图 | L1 `extractDocName` 硬编码 9 个文档名;U8 多意图 task-generate 从 live 实例数据驱动 | rd 文档名匹配需增补或实例驱动化 |
|
||||
| 前端 | `ProjectWorkflowSwitcher`(目录 API 驱动)+ 激活规划 UI + StageAdvance/Prerequisite Banner | 13×60 规划 UI 需折叠分组与批量三权指派 |
|
||||
|
||||
## 4. 关键设计决策
|
||||
|
||||
### D1 工作流标识与目录
|
||||
|
||||
- `OfficialKeyRDev = "rdev"`;对外名称建议 **「研发设计控制流程」**(与「商务对接流程」命名风格一致;备选「研发流程」);
|
||||
- `product_domains: ["medical_device"]`(软件域不可选);
|
||||
- `catalog_order = 40`(排在 test_manager 之后、software_bootstrap 之前);`medicalWorkflowKeys` 扩为四个;
|
||||
- validator 文案「仅允许选择正式工作流(医疗三或软件自举/交付)」同步更新;审计口径「项目选择页只见 N 个工作流」从 5 → 6。
|
||||
|
||||
|
||||
### D2 任务键与模板命名(关键决策)
|
||||
|
||||
**问题**:`doc_id`、模板加载、docgov task_key 三层都以 taskKey 平铺命名。rdev 的 `system_reqs`(SR)与现有 PM 任务 `system_reqs` 直接冲突;且未来任何工作流任务键都共享同一命名空间。
|
||||
|
||||
**推荐:60 个任务键统一加 `rd_` 前缀**(`rd_proposal`、`rd_design_plan`、`rd_system_reqs`…),模板文件同步 `rd_*.md`:
|
||||
|
||||
- 彻底消除 doc_id/模板/任务键三层冲突,跨工作流血缘清晰;
|
||||
- 转换机械:从参考项目 `rdev.yaml` 逐行映射生成(可写一次性生成脚本,人工复核);
|
||||
- manifest 中 `title`/`output_doc_title` 保留中文文档名,用户可见名称不变;
|
||||
- 模板头部「文件编号 RD-…」保留参考项目编号(RD-PROPOSAL 等),不受键名影响。
|
||||
|
||||
**备选**:仅 `system_reqs` 一键改名、其余保持原键。缺点:命名空间纪律弱,未来再加工作流仍会踩。
|
||||
|
||||
### D3 manifest 结构(rdev.v2.json)
|
||||
|
||||
13 个 StageDef 对应 13 个 phase(键名风格沿用本仓库 `V0.1_triage` 惯例)。示例(完整 60 任务 = 参考项目 rdev.yaml 逐行映射):
|
||||
|
||||
```json
|
||||
{
|
||||
"schema_version": 2,
|
||||
"workflow_key": "rdev",
|
||||
"product_domains": ["medical_device"],
|
||||
"stages": [
|
||||
{"key": "RD01_planning", "name": "01 设计和开发策划", "position": 10, "optional": false,
|
||||
"doc_tasks": [
|
||||
{"key": "rd_proposal", "title": "项目建议书", "default_enabled": true, "creator_configurable": true,
|
||||
"blocking_when_enabled": true, "executor_key": "squad.rdev_doc.v1", "quality_gate_key": "quality.generic.v1",
|
||||
"template_asset_key": "rd_proposal", "output_doc_type": "rd_proposal", "output_doc_title": "项目建议书"},
|
||||
{"key": "rd_design_plan", "title": "设计开发计划任务书", "default_enabled": true, "creator_configurable": true,
|
||||
"blocking_when_enabled": true, "executor_key": "squad.rdev_doc.v1", "quality_gate_key": "quality.generic.v1",
|
||||
"template_asset_key": "rd_design_plan", "output_doc_type": "rd_design_plan", "output_doc_title": "设计开发计划任务书"}
|
||||
]},
|
||||
{"key": "RD02_planning_review", "name": "02 策划评审", "position": 20,
|
||||
"doc_tasks": [{"key": "rd_planning_review", "title": "设计和开发策划评审记录", "...": "同上模式"}]},
|
||||
{"key": "RD03_design_input", "name": "03 设计输入", "position": 30, "doc_tasks": ["12 个任务"]},
|
||||
{"key": "RD04_requirements_review", "position": 40, "doc_tasks": ["rd_req_review"]},
|
||||
{"key": "RD05_input_phase_review", "position": 50, "doc_tasks": ["rd_input_phase_review"]},
|
||||
{"key": "RD06_design_output", "position": 60, "doc_tasks": ["17 个任务"]},
|
||||
{"key": "RD07_output_review", "position": 70, "doc_tasks": ["rd_output_review"]},
|
||||
{"key": "RD08_verification", "position": 80, "doc_tasks": ["12 个任务"]},
|
||||
{"key": "RD09_verification_review", "position": 90, "doc_tasks": ["rd_verification_review"]},
|
||||
{"key": "RD10_transfer", "position": 100, "doc_tasks": ["3 个任务"]},
|
||||
{"key": "RD11_transfer_review", "position": 110, "doc_tasks": ["rd_transfer_review"]},
|
||||
{"key": "RD12_validation", "position": 120, "doc_tasks": ["7 个任务"]},
|
||||
{"key": "RD13_validation_report", "position": 130, "doc_tasks": ["rd_design_validation_report"]}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
- 全部任务 `default_enabled/creator_configurable/blocking_when_enabled = true`(与本仓库 normalize 惯例一致);
|
||||
- **skippable 语义**:参考项目的 15 个可声明不适用任务与本仓库「激活规划期可关闭」语义等价(creator 在规划时关闭 = 不适用);「生成完整不适用页仍走审批」列为二期增强(D9);
|
||||
- `output_doc_type` = 任务键(本仓库惯例 doc type = task key)。
|
||||
|
||||
### D4 执行器与质量门禁
|
||||
|
||||
- 新增唯一执行器键 **`squad.rdev_doc.v1`**(`workflow/registry.go`),运行时仍统一由 bizdev.ExecuteTask 按 taskKey 分派——与 `squad.test_manager.v1` 模式一致,避免 60 个注册项;
|
||||
- 质量门禁首期 **`quality.generic.v1`**(全部 60 任务);kind 专用门禁列二期(D9)。
|
||||
|
||||
### D5 启动前置门禁(followon 语义)
|
||||
|
||||
遵循 WF-DEF-06:**不做流程级 RequiredUpstreamWorkflow**,改为执行器级 precheck(先例:test_manager 查 approved SRS):
|
||||
|
||||
- `bizdev.ExecuteTask` 对 `rd_` 前缀任务启动前校验:本项目 **main 工作流 live 实例 `completed`**(即 CDO 报价已批准)。查不到/未完成 → 明确错误文案(「请先完成商务对接流程(CDO 报价批准)后再启动研发设计控制流程」);
|
||||
- 激活 rdev 实例时(planning 允许,运行由 precheck 兜底):`WorkflowPrerequisiteBanner` 增加 rdev 文案;目录推荐逻辑「main 完成后推荐 PM」扩展「main 完成后推荐 rdev」;
|
||||
- 启动时拷贝 bizdev 字段:现有 `TaskRunRequest` 已带 project 字段(device_type/intended_use/target_market 来自项目实体),无需额外拷贝机制。
|
||||
|
||||
### D6 docgov Stage 字段动态化(P0 必修)
|
||||
|
||||
- `bizdev/service.go:483/489` 与 `docgov/repository.go:28` 写死 `V0.5_feasibility` → 改为从请求/冻结实例解析 StageKey 传入(`workflow/runtime/orchestrator.go` 的 `TaskResolution.StageKey` 已具备;`server/task_run_request_build` 把 stage key 带进 `bizdev.TaskRunRequest` 新增的 `StageKey` 字段并透传);
|
||||
- 兜底策略:解析不到时回落 main 三阶段映射,再回落原值(兼容历史数据,不做历史迁移);
|
||||
- `maturity` 包的 V0.1/V0.5/V1.0 成熟度映射仅对 main 任务生效,rd_ 任务首期跳过成熟度标签。
|
||||
|
||||
### D7 squad 编排(数据驱动重构)
|
||||
|
||||
新增 `internal/squad/rdev_catalog.go`:60 项任务目录表(taskKey → title/phase/kind/docCode/skippable/描述),生成来源 = 参考项目 rdev.yaml(一次性转换 + 齐套测试锁定):
|
||||
|
||||
- `SupportedTasks` 合并 rdev 目录(`isStandardTask` 命中,避免回落 adhoc);
|
||||
- `DefaultWorkflowSteps`/`DefaultSquadAgents` 增加 `rd_` 前缀分支,**按 artifact_kind 三套通用编排**(对齐参考项目 squads/rdev.yaml 的 default_steps + 覆盖逻辑):
|
||||
|
||||
| kind | 步骤 | 小队 |
|
||||
|------|------|------|
|
||||
| document(47) | organizer → engineer(可并行)→ regulatory(可选)→ writer → leader | organizer/engineer/writer/leader;regulatory 注入软件/法规风险类(`rd_sw_*`、`rd_regs_stds`、`rd_adverse_events`、`rd_biocompatibility`、`rd_clinical`、`rd_animal_study`、`rd_risk_*`、`rd_emc_safety`) |
|
||||
| review_minutes(6) | organizer → writer → leader | organizer/writer/leader(对齐参考项目评审阶段三步) |
|
||||
| upload_index(7) | organizer → engineer → writer → leader | organizer/engineer/writer/leader |
|
||||
|
||||
- leader 角色名「研发设计控制负责人」(对应参考项目 rdev_leader);角色提示复用现有 `configs/agents/*.md`(organizer/engineer/writer/leader/regulatory 已有),rdev 语境差异放进步骤 `Accept` 与 TASK 说明;
|
||||
- 参考项目 overlays 的核心纪律(写满、结论先行、追溯表必填、缺项「待确认」、不编造数据/签字/附件)合并进:a) 三套 kind 步骤的 `Accept`;b) `configs/shared/writing.md` 增补 DHF 纪律段(GetAgentInstruction 已自动附加该文件,rd 任务天然注入)。
|
||||
|
||||
### D8 上游文档注入与血缘
|
||||
|
||||
- 首期:`bizdev.ExecuteTask` 对 `rd_` 任务注入 **项目上下文快照**(`projectcontext.BuildSnapshot`,先例 test_manager)+ **同项目已批准文档清单**(bizdev 七件 + 已批准 rd_ 文档,作为 prior_docs 全量注入,交小队自行引用);
|
||||
- 血缘:沿用 test_manager 模式在 finalize 时记录上游 hash(首期摘要级);精确 `depends_on`(如 rd_verification_review ← rd_design_vv + rd_risk_report_v)列二期(见 [backlog](../../backlog/2026-09-17-rdev-phase2-backlog.md));
|
||||
- `rd_system_reqs` 与 PM `system_reqs` 的关系:PM 输出若已批准,作为 prior doc 优先注入(不强制、不独占)。
|
||||
|
||||
### D9 不适用(N/A)与二期增强
|
||||
|
||||
- 首期:N/A = 激活规划期关闭任务(creator_configurable),推进语义由 readiness 门禁保证;
|
||||
- 二期增强(参考项目行为):保留任务但生成「不适用说明页」(完整理由、走审批);UR/RS 结构化门禁(复用 PM `requirements.json` 模式于 rd_user_needs/rd_system_reqs);review_minutes/upload_index 专用确定性门禁。
|
||||
|
||||
### D10 意图与聊天
|
||||
|
||||
- U8 多意图 task-generate 从 live 实例 doc tasks 数据驱动——rd 任务应自动可用(P2 验证 60 任务名消歧与澄清卡);
|
||||
- L1 `extractDocName` 硬编码名表:增补 rd 高频文档名(项目建议书、设计开发计划、风险管理计划、设计验证方案、设计确认报告 等),并**评估改为从 live 实例任务标题动态匹配**(推荐,彻底消除硬编码)。
|
||||
|
||||
### D11 前端
|
||||
|
||||
- `ProjectWorkflowSwitcher`:rdev 名称/顺序/描述来自目录 API(数据驱动)+ 本地 label 常量增补;
|
||||
- 激活规划 UI:13 阶段 × 60 任务 × 三权指派是大列表——需按阶段折叠分组、三权「按阶段批量指派 / 继承上一阶段」操作、15 个 skippable 任务预设关闭建议;
|
||||
- 文档工作台:展示 doc Stage 为 RD 阶段键(依赖 D6);`WorkflowPrerequisiteBanner` rdev 文案;
|
||||
- 前端测试:workflow 相关既有断言(工作流数量/名称)同步更新。
|
||||
|
||||
## 5. 资产与代码改动清单
|
||||
|
||||
### 5.1 数据/配置资产
|
||||
|
||||
| 资产 | 说明 |
|
||||
|------|------|
|
||||
| `internal/workflowdef/manifests/rdev.v2.json` | 13 stage / 60 doc task(D3) |
|
||||
| `templates/docs/rd_*.md` × 60 | 从参考项目 `templates/docs/*.md` 转换:改名 rd_ 前缀、保留 RD 编号/DHF 归属骨架;核对模板变量(`{{project_name}}/{{generated_at}}/{{snapshot_id}}/{{applicability}}/{{na_rationale}}/{{materials}}` 均为 RenderDoc 可用变量,缺失自动「待确认」) |
|
||||
| `configs/shared/writing.md` 增补 | DHF 设计控制纪律段(rd 任务注入) |
|
||||
| `internal/squad/rdev_catalog.go` | 60 项任务目录(title/phase/kind/docCode/skippable) |
|
||||
|
||||
### 5.2 Go 代码(按包)
|
||||
|
||||
| 包 | 改动 |
|
||||
|------|------|
|
||||
| `internal/workflowdef` | catalog_policy.go(常量/名称/顺序/域/医疗四键)、manifest_loader.go(V2ManifestFiles)、bootstrap.go(officialSeedMeta)、validator 文案、publish/catalog 测试更新 |
|
||||
| `internal/workflow` | registry.go 注册 `squad.rdev_doc.v1` |
|
||||
| `internal/squad` | rdev_catalog.go 新增;service.go SupportedTasks 合并;workspace.go rd_ 分支(按 kind 三套 DefaultWorkflowSteps/DefaultSquadAgents) |
|
||||
| `internal/bizdev` | TaskRunRequest 增加 StageKey;ExecuteTask:rd_ precheck(main completed)、prior docs 注入、CreateOrGetDocument 传动态 Stage、ListStages/maturity 对 rd_ 的处理 |
|
||||
| `internal/server` | task_run_request_build 透传 stage key;workflow_catalog_handlers 名称;齐套校验 Go test(60 manifest 任务 ↔ 模板文件存在非空 ↔ 末模板含「签署」,对齐参考 e2e-rdev.sh 断言 + 「rd_ 键与既有任务键集合不相交」断言) |
|
||||
| `internal/docgov` | repository.go stage 兜底改为入参优先 |
|
||||
| `internal/intent` | extractDocName 增补/实例驱动(D10) |
|
||||
| `web/` | D11 各项 |
|
||||
|
||||
### 5.3 文档
|
||||
|
||||
- `.doc/ops/short-term/2026-09-17-rdev-workflow-integration.md`(任务条目,随本方案创建)
|
||||
- FEATURE-MATRIX 新增行(planned → done 演进);验收报告归档 `.doc/test-reports/`
|
||||
|
||||
## 6. 分期实施计划
|
||||
|
||||
| Phase | 内容 | 分支/PR | 验收标准 |
|
||||
|-------|------|--------|----------|
|
||||
| **P0 前置修复** | D6 docgov Stage 动态化 + stage key 透传 + 回归 | `fix/docgov-stage-dynamic` | 现有三工作流全链路 PG 回归 PASS;新文档 Stage 字段 = 实例阶段键 |
|
||||
| **P1 核心接入** | manifest + catalog/seed + registry + 60 模板 + squad 数据目录与 kind 编排 + rd_ precheck + 齐套 Go test + stub PG 全链路(激活 13 阶段 → rd_proposal 生成/审/批 → 推进 → N/A 关闭路径 → precheck 拒绝路径) | `feature/rdev-core` | `go vet`/`go test -short` PASS;PG 集成测试 PASS;齐套断言 60/60;main 未完成时 rd 任务启动被拒且文案正确 |
|
||||
| **P2 治理与体验** | 前端(规划 UI 折叠分组/批量三权/PrerequisiteBanner/文档 Stage 展示)+ intent 名称匹配 + prior docs 注入与摘要级血缘/stale + web 测试 | `feature/rdev-web-governance` | web `npm test`/`npm run build` PASS;Playwright 抽检激活与推进;聊天「生成项目建议书」命中 rd_proposal |
|
||||
| **P3 真实验收** | 真实 PI Agent + MiniMax 全链路:rd_proposal(document)+ rd_planning_review(review_minutes)+ rd_sw_plan 软件类 N/A 三样本;报告归档;CI「PI 三工作流」门禁扩为四 | — | `.doc/test-reports/` rdev 真实 PI E2E 报告;CI green receipt |
|
||||
| **P4 键名空间化**(决策 4 扩展,D12) | main/pm/tm(+软件两)任务键改 `bd_`/`pm_`/`tm_`(`sw_`)前缀:manifest 新版本 + doc_id 归一映射 + 模板 alias + squad 旧键兼容 + 双路径回归 | `feature/workflow-key-namespace`(**独立验收,不与 P1–P3 合并**) | 旧 live 实例(旧键)与新建实例(新键)双路径 stub 全链路 PASS;全工作流任务键集合无交集断言 PASS;存量文档旧 doc_id 仍可读 |
|
||||
|
||||
依赖:P0 → P1 → P2 → P3;P1 与 P2 可部分并行(先冻结前后端契约);P4 在 P3 验收后启动(也可与 P2 并行,但合入 dev 须占集成槽串行)。
|
||||
|
||||
## 7. 风险与缓解
|
||||
|
||||
| 风险 | 影响 | 缓解 |
|
||||
|------|------|------|
|
||||
| 60 任务三权指派 UI 负担 | 激活体验差、误配 | 批量指派 + 阶段继承 + 三权默认创建人兜底(现状) |
|
||||
| generic 质量门禁误杀评审记录/附件清单类 | 任务被错误打回 | P1 用 stub 对 6+7 个 kind 任务逐一回归;必要时豁免清单 |
|
||||
| U8/意图对 60 文档名消歧 | 生成错任务 | P2 实例驱动匹配 + 澄清卡;高频名称抽检 |
|
||||
| 命名空间遗漏 | doc_id/模板冲突回归 | 齐套 test 增加「rd_ 键不与既有任务键相交」断言 |
|
||||
| CI 门禁与审计口径过时 | nightly 误报 | 同步「PI 三工作流」→ 四;审计 checklist 引用本方案 |
|
||||
| 大 manifest / 冻结快照体积 | 性能 | 60 任务 JSONB 量级小,P1 PG 测试观察即可 |
|
||||
|
||||
## 8. 决策记录(已与用户确认,2026-09-17)
|
||||
|
||||
| # | 决策 | 结论 |
|
||||
|---|------|------|
|
||||
| 1 | 对外名称 | **「研发设计控制流程」**(key: `rdev`) |
|
||||
| 2 | 首期范围 | **manifest 一次到位 60 任务 / 13 阶段**,不切试点 |
|
||||
| 3 | N/A 语义 | 首期「激活规划期关闭」;「生成完整不适用页走审批」等二期增强**记入 backlog**:[2026-09-17-rdev-phase2-backlog](../../backlog/2026-09-17-rdev-phase2-backlog.md) |
|
||||
| 4 | 任务键前缀 | rdev 60 键统一 `rd_` 前缀;且**现有工作流(main/pm/tm)任务键、模板、阶段等同样做键名空间化处理**(见 D12,独立分期 P4,避免与 rdev 接入耦合) |
|
||||
|
||||
### D12 现有工作流键名空间化(决策 4 扩展,P4 实施)
|
||||
|
||||
**目标**:全系统任务键命名规约统一为 `<工作流前缀>_<任务>`,杜绝跨工作流 doc_id/模板/任务键冲突:
|
||||
|
||||
| 工作流 | 现键(9 个) | 新键 |
|
||||
|--------|-------------|------|
|
||||
| main(商务对接) | intake / research / feasibility_dev / feasibility_reg / user_requirements / prelim_design / cdo_quote | `bd_intake` / `bd_research` / `bd_feasibility_dev` / `bd_feasibility_reg` / `bd_user_requirements` / `bd_prelim_design` / `bd_cdo_quote` |
|
||||
| product_manager | system_reqs | `pm_system_reqs` |
|
||||
| test_manager | test_manager | `tm_system_verification` |
|
||||
| rdev(新) | — | `rd_*`(P1 落地,60 个) |
|
||||
| software_* | (另行盘点 `software.doc.v1` 任务键后纳入 `sw_` 前缀,P4 一并处理) |
|
||||
|
||||
**兼容策略(alias 兼容式改名,不破坏存量数据)**:
|
||||
|
||||
1. **manifest 版本升级**:main/pm/tm manifest 任务键改为新键 → `UpsertPublishedSeed` 按内容 hash 发布新版本;**冻结实例不迁移**——存量 live 实例继续持有旧键直至 completed(冻结快照是 SSOT,禁止改写);
|
||||
2. **doc_id 兼容**:`bizdev/doc_id.go normalizeDocID` 增加旧→新映射表(`doc_proj{pid}_intake` → `doc_proj{pid}_bd_intake`),读路径旧 ID 自动归一;**文档账本不批量迁移**,新文档用新键,旧文档旧 ID 保留可查(已有 legacy pattern 归一先例);
|
||||
3. **模板**:`templates/docs/` 文件改名(bd_intake.md 等),template loader 增加旧名→新名 alias(旧 live 实例运行仍按旧 taskKey 取模板→alias 命中新文件);
|
||||
4. **squad 白名单**:`SupportedTasks`/`DefaultWorkflowSteps`/`DefaultSquadAgents` 增加旧键 alias 分支(存量实例执行路径不动),新键为主实现;
|
||||
5. **intent/前端**:`extractDocName` 按文档名匹配不涉键名(无改动);前端断言与 label 按新键更新;
|
||||
6. **回归**:旧 live 实例(旧键)+ 新规划实例(新键)双路径 stub 全链路回归;齐套断言扩展为「全工作流任务键集合无交集 + 各自前缀正确」。
|
||||
|
||||
**风险控制**:P4 独立分支 `feature/workflow-key-namespace`、独立验收,**不与 rdev P1–P3 合并**;若 P4 验收发现存量实例兼容缺口,允许只回退 manifest(DB seed 幂等)。
|
||||
|
||||
### 二期 backlog(决策 3,随时可续推进)
|
||||
|
||||
见 [2026-09-17-rdev-phase2-backlog](../../backlog/2026-09-17-rdev-phase2-backlog.md):N/A 不适用页生成模式、UR/RS 结构化门禁、review_minutes/upload_index 专用确定性门禁、depends_on 精确血缘与 stale 传播、DMR 双记录归档、软件工作流 sw_ 键盘点等。
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
# rdev 模板写作规范
|
||||
|
||||
> 适用范围:`templates/docs/rd_*.md`(研发设计控制 / ISO 13485 DHF)
|
||||
> 更新日期:2026-09-17
|
||||
|
||||
## 1. 分工红线(强制)
|
||||
|
||||
| 层 | 负责 | 不负责 |
|
||||
| --- | --- | --- |
|
||||
| **模板**(`templates/docs/rd_*.md`) | 章节结构、表头、逐节写作指令、示例「待确认」行、治理骨架(编号/适用性/追溯/签署) | 运行时角色口吻、模型选择、粒度下限的强制执行 |
|
||||
| **overlay / 运行时**(`configs/agents/*`、`configs/shared/writing.md`、未来 overlays) | 写作纪律、DHF 粒度下限、禁止编造、角色边界 | 替代模板定义专业章节结构 |
|
||||
|
||||
一句话:**模板管结构与占位;overlay/运行时管写作纪律与粒度下限。**
|
||||
|
||||
## 2. 八条基准(源自商务模板实践)
|
||||
|
||||
1. **结论先行**:文首结论句完整;后文不得与结论打架。
|
||||
2. **四段式展开**:结论句 → 表格或列表 → 解读段落 → 出处/支撑;禁止通篇只有列表。
|
||||
3. **括号指令可执行**:每节括号内写清覆盖范围、缺项规则、禁止项;禁止只写「按本阶段专业结构写」。
|
||||
4. **表不交空壳**:至少一行「待确认」示例行;禁止空表头。
|
||||
5. **缺项显式**:统一标「待确认」,并在「待确认清单」汇总。
|
||||
6. **不做疗效宣称**:设计控制文档禁止疗效/临床效果绝对化用语。
|
||||
7. **禁止残留提示**:终稿不得留下括号写作提示原文。
|
||||
8. **追溯可填**:`| RD-` 行存在;上游/下游未知写「待确认」不留空白无说明。
|
||||
|
||||
## 3. 治理骨架(每份 rd_ 模板保留)
|
||||
|
||||
- 文首元数据:项目 / 生成时间 / 快照 / 文件编号 / 记录归属:DHF / 版本 / 阶段
|
||||
- `## 结论` / `## 适用性`
|
||||
- 专业正文各节(≥4 个 `## ` 专业或治理章节合计满足 lint)
|
||||
- `## 追溯`(含 `| RD-` 行)
|
||||
- `## 已有材料摘要` / `## 待确认清单` / `## 签署` / `## 说明`
|
||||
|
||||
## 4. 补强清单与批次
|
||||
|
||||
| 批次 | 范围 | 状态 |
|
||||
| --- | --- | --- |
|
||||
| S0 样例 | `rd_design_input_spec` | 本轮 |
|
||||
| S1 批 1 | `rd_proposal` / `rd_design_input_list` / `rd_system_design` / `rd_regs_stds` / `rd_adverse_events` | 本轮 |
|
||||
| S1 批 2 | `rd_sw_plan` / `rd_sw_reqs` / `rd_sw_config` / `rd_risk_plan` | 本轮 |
|
||||
| S1 批 3 | `rd_design_plan` / `rd_user_needs` / `rd_hazard_analysis` / `rd_system_reqs`(SRS 深度移植) | 本轮 |
|
||||
| S1 续批批1 | 评审记录 6 份(`rd_planning_review` 等) | done |
|
||||
| S1 续批批2 | 阶段06 硬件/工艺 8 份 | done |
|
||||
| S1 续批批3 | 阶段06 软件/检验/技术要求+清单 9 份 | done |
|
||||
| S1 续批批4 | 阶段08 验证 12 份 | done |
|
||||
| S1 续批批5 | 阶段10–13 转换/确认 11 份 | done |
|
||||
| S1 续批合计 | 剩余 46 份全部同等深度;allowlist 60/60;真 PI 抽样 PASS | done([报告](../../test-reports/2026-09-17-rdev-template-depth-s1-continued-test-report.md)) |
|
||||
| S2 / S3 | per-stage 步骤、overlay 机制、专用门禁 | follow-up |
|
||||
|
||||
## 5. Lint 门禁
|
||||
|
||||
`internal/workflowdef/rdev_template_lint_test.go` 对「已补强 allowlist」断言:
|
||||
|
||||
- 不含「按本阶段专业结构写」
|
||||
- 正文 `## ` 章节 ≥ 4
|
||||
- 含追溯表行 `| RD-`
|
||||
- 含 `## 待确认清单` 与 `## 签署`
|
||||
|
||||
未列入 allowlist 的模板不参与断言;随批次增长扩大 allowlist。
|
||||
@@ -0,0 +1,37 @@
|
||||
# docgov 变更提案 HTTP 测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
- 引擎已有 Propose/Decide,但缺少 propose HTTP;前端 pendingProposal 为本地模拟。
|
||||
- author-only 收口后补齐变更提案闭环。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
- `POST /api/v1/docgov/proposal` 写库成功
|
||||
- `POST /api/v1/docgov/proposal/decide` 批准写库
|
||||
- 前端 client 单测覆盖路径
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
- OS: Linux;后端:agent-dev `:8080` schema 52;真实 `pi-agent` 环境(本用例不触发任务跑批)
|
||||
- 层级:Go handler 单测 + 前端 client 单测 + 真实 HTTP
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
- claim 已认领文档 → propose → status=`pending_author_approval` → decide approve → `approved_by_author`
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### TC-HTTP-01 claim → propose → decide
|
||||
- **测试输入**: doc `doc_proj6425_rd_design_input_spec`(author=admin/9,已认领)
|
||||
- **实际输出**: 见 assets `01`–`05`;proposal `prop_rd_design_input_spec_1789654256551680649` → `approved_by_author`
|
||||
- **评价判定**: PASS
|
||||
- **性能与耗时**: 全链路 <1s(不含 rebuild)
|
||||
|
||||
### TC-UNIT-01
|
||||
- `go test -run TestServer_DocGovProposeAndDecideHTTP ./internal/server/` PASS
|
||||
- `node --test web/src/api/docgov.test.ts` 6/6 PASS
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
- 合入后冒烟:`go vet ./...`;`go test -short ./internal/server/ ./internal/docgov/` PASS
|
||||
- `./scripts/env-service.sh dev rebuild`;`GET /health` → status=ok schema=52
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
- 达到合入/推送标准;**未**晋升 test/main
|
||||
- 后续:批准后自动应用受控正文 diff(非本期)
|
||||
@@ -0,0 +1,128 @@
|
||||
# 文档编制人兼任 U6 多职责动作与真实闭环 测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
U1–U5 已落地管理员总开关、逐文档 `duty_policy=author_only`、ABAC 门禁与设置页 UI。交付验收时发现两处前端缺口:
|
||||
|
||||
1. 审批动作条从未调用已存在的 `docgov` HTTP(claim / submit-review / review-decision / approver-decision),仅本地改 `lifecycleState`;
|
||||
2. `resolveCurrentDocRole` 的 author-first 短路使 A/A/A 用户永远只解析为 `author`,审核/批准按钮与快捷指令不可见。
|
||||
|
||||
U6 修复可见性与真实 API 接入,使编制人兼任完整闭环第一次可验收。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- author_only(三职同一人)下 A 可见送审/审核/批准动作;非 A 不可见且直连接口 403;
|
||||
- 点击认领→送审→审核通过→终审批准走真实后端,写 `document_records` / `document_audit_logs`(含 `duty_policy`);
|
||||
- 动作条展示「编制人兼任」徽标;`duty_policy` 从 summary 透传到 AST;
|
||||
- 前端单测与 `tsc --noEmit` 回归通过。
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
| 项 | 值 |
|
||||
|---|---|
|
||||
| OS | Linux |
|
||||
| 环境 | dev `:8080`(feature worktree rebuild,`schema_version=52`,`agent_backend=pi-agent`) |
|
||||
| 前端 | worktree Vite `:5173` 代理 API |
|
||||
| 被测文档 | `doc_proj6425_rd_design_input_spec`(项目 6425,`rdev-s0-fresh-*`,既有真实 PI 生成正文) |
|
||||
| 配置 | 实例快照 `duty_policy=author_only`,有效职责 A/A/A(user_id=9 系统管理员) |
|
||||
| 负例用户 | `lizhuguan`(id=11) |
|
||||
|
||||
分层:
|
||||
|
||||
1. 前端单元:`docGovActionVisibility` + `docgov` API client;
|
||||
2. HTTP 真实闭环:claim → submit → review → approve;
|
||||
3. HTTP 负例:非职责人 403;
|
||||
4. 浏览器:Playwright(官方 image)打开 Vite,断言徽标与送审按钮。
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 用例 | 预期 |
|
||||
|---|---|
|
||||
| AE-UI | A 打开 author_only 文档见「编制人兼任」+ 送审按钮 |
|
||||
| AE-API | A 依次 claim/submit/review/approve → `current_state=approved`,审计含 `duty_policy=author_only` |
|
||||
| AE-NEG | 李主管 review/approve → `DOC_DUTY_FORBIDDEN` HTTP 403 |
|
||||
| AE-UNIT | author_only 三动作对 A 全 true、对非 A 全 false;分离三人矩阵不变 |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 前端单元
|
||||
|
||||
**输入**:`npm test` + `npx tsc --noEmit`(worktree `web/`)
|
||||
|
||||
**实际输出**:`ℹ tests 390` / `pass 390` / `fail 0`;含 `docgov lifecycle API client` 4 例与 `docGovActionVisibility` author_only 矩阵;`tsc --noEmit` 无错误。
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.2 HTTP 真实闭环(author_only)
|
||||
|
||||
**输入**:admin Bearer 调用四接口(证据:`assets/2026-09-17-document-author-only-u6/api-lifecycle-author-only.txt`)
|
||||
|
||||
**实际输出(摘要)**:
|
||||
|
||||
- `POST /docgov/review-decision` → HTTP 200,`current_state=approving`,`duty_policy=author_only`
|
||||
- `POST /docgov/approver-decision` → HTTP 200,`current_state=approved`
|
||||
- 审计:`submit_review` / `review_approve` / `approver_approve` 的 `details.duty_policy=author_only`(`db-final-author-only.txt`)
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.3 HTTP 负例
|
||||
|
||||
**输入**:`lizhuguan` 对同一文档 review/approve(`api-negative.txt`)
|
||||
|
||||
**实际输出**:
|
||||
|
||||
```text
|
||||
{"error":"DOC_DUTY_FORBIDDEN","message":"当前用户不是该文档的对应职责人"}
|
||||
HTTP 403
|
||||
```
|
||||
|
||||
(审核与批准各一次)
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.4 浏览器(Vite + Playwright)
|
||||
|
||||
**输入**:注入 admin 会话 → 打开 `rdev-s0-6425` → 《设计输入规格书》
|
||||
|
||||
**实际输出**:
|
||||
|
||||
- `browser-visibility.json`:`hasBadge=true`,`hasClaim=true`,`hasSubmit=true`
|
||||
- 截图 `screenshots/04-action-bar.png`:明确显示「编制人兼任」徽标与「提交送审」按钮
|
||||
|
||||
**判定**:PASS(可见性与徽标);按钮逐级点击以 API 闭环为准(浏览器侧状态机与网络时序未作为唯一证据)。
|
||||
|
||||
### 5.5 性能与耗时
|
||||
|
||||
| 步骤 | 耗时量级 |
|
||||
|---|---|
|
||||
| Vite npm test | ~2s |
|
||||
| tsc --noEmit | ~3s |
|
||||
| API 四步闭环 | <1s |
|
||||
| Playwright 全流程 | ~25s(含容器内 npm i playwright) |
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
```text
|
||||
web: npm test → 390 pass / 0 fail
|
||||
web: npx tsc --noEmit → clean
|
||||
```
|
||||
|
||||
Go 侧 U1–U4 既有矩阵本轮未重跑全量;dev 容器已含 `allow_author_only_approval` 二进制与 goose 00050–00052。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
**结论**:U6 达到合并前验收标准——author_only 多职责动作可见、真实 docgov 闭环与负例 403、兼任徽标透传均有证据。回链 U1–U6 与 FEATURE-MATRIX。
|
||||
|
||||
**限制说明**:
|
||||
|
||||
- 本轮闭环基于已激活实例快照补丁为 `author_only` + 既有 PI 生成文档;管理员总开关→创建者设置→激活的产品配置链路由 U1–U5 覆盖,本报告不重复。
|
||||
- 变更提案 HTTP 路由仍缺失(独立缺口,见 audit 笔记),不在 U6 范围。
|
||||
|
||||
**后续**:合入 `dev` 后按集成槽位正式冒烟;可补 Playwright 选择器精化使浏览器点击与 DB 状态强一致。
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Remediation: `.doc/remediation/2026-09-17-document-author-only-plan.md` U6
|
||||
- Short-term: `.doc/ops/short-term/2026-09-17-document-author-only-u6.md`
|
||||
- Assets: `.doc/test-reports/assets/2026-09-17-document-author-only-u6/`
|
||||
- 变更提案缺口: `.doc/audit/2026-09-17-docgov-modification-proposal-http-gap.md`
|
||||
@@ -0,0 +1,93 @@
|
||||
# rdev 模板深度补强 S1 续批(剩余 46 份)测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
S0+S1 首批已将阶段 01–05 共 14 份 `rd_*` 模板补强并合入;剩余 46 份(评审记录、阶段 06–13 硬件/软件/检验/验证/转换确认)仍为占位或中等档深度。本轮按用户确认范围全部按技术类同等深度补强,并抽样真 PI 打样收口。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- 46 份模板按写作规范补强:四段式章节、ID 表、「待确认」、`| RD-` 追溯、签署骨架;无「按本阶段专业结构写」
|
||||
- `rdevTemplateDepthAllowlist` 扩至全 60 份;`TestRDevTemplateDepthLint` PASS
|
||||
- 真 PI 抽样:评审记录类 `rd_planning_review` + 验证协议类 `rd_design_vv` 终稿实质论证、无占位残留
|
||||
- `go vet ./...` 与 `go test -short ./...` 全绿
|
||||
- 附带修复:`UpsertPlanningInstance` 分配下一 `instance_no`(避免 main 已完成后无法再存 rdev 计划)
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
| 项 | 值 |
|
||||
|---|---|
|
||||
| OS | Linux |
|
||||
| 分支 / worktree | `feature/rdev-template-depth-s1-continued` / `.worktrees/feature-rdev-template-depth-s1-continued` |
|
||||
| 后端 | `pi-agent` + MiniMax-M2.7-highspeed(shuimu-pi-agent-dev) |
|
||||
| HTTP | `http://127.0.0.1:8080`(agent-dev) |
|
||||
| 层级 | 模板 lint + 包回归 short + 真 PI 抽样 E2E |
|
||||
|
||||
资产目录:[assets/2026-09-17-rdev-template-depth-s1-continued/](./assets/2026-09-17-rdev-template-depth-s1-continued/)
|
||||
|
||||
### 用例矩阵
|
||||
|
||||
| 批 | 范围 | 份数 | 验证 |
|
||||
|---|---|---|---|
|
||||
| 1 | 评审记录 | 6 | lint |
|
||||
| 2 | 阶段06 硬件/工艺 | 8 | lint |
|
||||
| 3 | 阶段06 软件/检验/清单 | 9 | lint |
|
||||
| 4 | 阶段08 验证 | 12 | lint + 真 PI `rd_design_vv` |
|
||||
| 5 | 阶段10–13 转换/确认 | 11 | lint |
|
||||
| 抽样 | 评审记录 | 1 | 真 PI `rd_planning_review` |
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 用例 | 预期 |
|
||||
|------|------|
|
||||
| lint 全量 | 60 key allowlist 无占位、章节≥4、含追溯/待确认/签署 |
|
||||
| `rd_planning_review` | 完成态;含「评审范围与对象 / 问题与决议 / 评审结论」;无占位;chars>400 |
|
||||
| `rd_design_vv` | 完成态;含「目的与范围 / 方法与判定标准 / 风险与残余风险关联」;无占位;chars>400 |
|
||||
| short 回归 | 全绿 |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 模板 lint(全 60 份 allowlist)
|
||||
|
||||
- **测试输入**:`go test ./internal/workflowdef/ -run TestRDevTemplateDepthLint -v -count=1`
|
||||
- **实际输出**:`--- PASS: TestRDevTemplateDepthLint (0.00s)`
|
||||
- **评价判定**:PASS
|
||||
- **性能与耗时**:<1s
|
||||
|
||||
### 5.2 真 PI — `rd_planning_review`(评审记录类)
|
||||
|
||||
- **测试输入**:项目 `6446`(`rdev-s1c-pi-1789657210`),rdev 实例 `313`,阶段 `RD02_planning_review`,backend=`pi-agent`
|
||||
- **实际输出**(摘自 [summary-s1-continued.json](./assets/2026-09-17-rdev-template-depth-s1-continued/summary-s1-continued.json) / [console.log](./assets/2026-09-17-rdev-template-depth-s1-continued/console.log)):
|
||||
- `status=completed`,elapsed≈290s,chars=7958
|
||||
- `no_placeholder=true`,`has_review_sections=true`
|
||||
- **终稿取样**:[rd_planning_review-final.md](./assets/2026-09-17-rdev-template-depth-s1-continued/rd_planning_review-final.md)
|
||||
- **评价判定**:PASS
|
||||
- **性能与耗时**:约 290s
|
||||
|
||||
### 5.3 真 PI — `rd_design_vv`(验证协议类)
|
||||
|
||||
- **测试输入**:同项目推进至 `RD08_verification` 后启动
|
||||
- **实际输出**:
|
||||
- `status=completed`,chars=10970
|
||||
- `no_placeholder=true`,`has_protocol_sections=true`
|
||||
- **终稿取样**:[rd_design_vv-final.md](./assets/2026-09-17-rdev-template-depth-s1-continued/rd_design_vv-final.md)
|
||||
- **评价判定**:PASS
|
||||
- **性能与耗时**:整段抽样脚本约 704s(含评审审批与阶段推进)
|
||||
|
||||
### 5.4 运行时修复备注
|
||||
|
||||
worktree 重建后若缺少根 `.env`,会导致 `MINIMAX_API_KEY` / `PI_AGENT_RUNNER_AUTH_TOKEN` 为空,表现为 PI 空跑或 `typed result rejected`。本轮通过 symlink 根 `.env` 并 `--force-recreate` app/pi-agent 恢复;另提交 `instance_no` 递增修复以支持 main 完成后另存 rdev 计划。
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
```text
|
||||
go test ./internal/workflowdef/ -run TestRDevTemplateDepthLint -v -count=1
|
||||
--- PASS: TestRDevTemplateDepthLint (0.00s)
|
||||
|
||||
go test -short ./...
|
||||
# 全包 PASS(含 internal/server、workflowdef、projectinstance 等)
|
||||
```
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- **结论**:S1 续批达到合入标准——46 份模板深度补强完成,lint 覆盖 60/60,真 PI 双抽样 PASS。
|
||||
- **后续**:S2(per-stage 编排/配置化)、S3(overlay/专用门禁)、P2 前端、P3 三样本全量 E2E、P4 键名空间化仍属 backlog;本轮**不晋升** test/main。
|
||||
@@ -0,0 +1,118 @@
|
||||
# rdev 模板深度补强(S0 + S1 首批)测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
`rdev` 60 份模板多数仍含「按本阶段专业结构写」通用占位;且 `rdevLeaderAgent` 虽注册了角色,但 `buildSubWorkspaces` 按角色名加载 `configs/agents/leader.md`,导致研发终审全部回落商务口吻。本轮按计划交付 B1 leader 注入修复、阶段 01–05 共 14 份模板专业章节补强,并以 dev 真实 PI 打样收口。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- rdev leader 子工作区 `AGENTS.md` 含「设计控制 / 研发设计控制负责人」,且不含「商务对接负责人」「CDO」
|
||||
- intake leader 回归仍含「商务对接负责人」
|
||||
- 14 份已补强模板 lint 绿灯(无通用占位、章节≥4、含追溯/待确认/签署)
|
||||
- 真实 PI:`rd_design_input_spec` 终稿五节有实质论证;账本 `stage=RD03_design_input`
|
||||
- `go vet ./...` 与 `go test -short` 全绿
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
| 项 | 值 |
|
||||
|---|---|
|
||||
| OS | Linux |
|
||||
| 分支 / worktree | `feature/rdev-template-depth` / `.worktrees/feature-rdev-template-depth` |
|
||||
| 后端 | `pi-agent` + MiniMax(shuimu-pi-agent-dev) |
|
||||
| HTTP | `http://127.0.0.1:8080`(agent-dev) |
|
||||
| 层级 | 单元(prompt 注入 / lint)+ 包回归 short + 真 PI 端到端 |
|
||||
|
||||
资产目录:[assets/2026-09-17-rdev-template-depth/](./assets/2026-09-17-rdev-template-depth/)
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 用例 | 预期 |
|
||||
|------|------|
|
||||
| S0.1 PrepareWorkspace(rd_design_input_spec) | leader AGENTS 设计控制口径,无商务串味 |
|
||||
| S0.1 PrepareWorkspace(intake) | leader AGENTS 仍含商务对接负责人 |
|
||||
| S0.2 / S1 lint allowlist 14 份 | 无「按本阶段专业结构写」;`## `≥4;含 `\| RD-`、待确认、签署 |
|
||||
| S0.3 main-only intake | 真 PI completed;文档 `stage=V0.1_triage`;实例 completed |
|
||||
| S0.3 rdev-only DI | 真 PI completed;五节实质;`stage=RD03_design_input`;leader 无商务串味 |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 S0.1 leader prompt 注入(单元)
|
||||
|
||||
- **测试输入**: `go test -short ./internal/squad/ -run 'RDevLeader|LeaderPrompt|InstructionsFile' -count=1`(及全包 short)
|
||||
- **实际输出**: `ok chat-agent-system/internal/squad`(见第六节汇总)
|
||||
- **判定**: PASS — `GetAgentInstructionFile` + `InstructionsFile` 优先注入已覆盖;商务回归保留
|
||||
|
||||
### 5.2 模板 lint(S0.2 + S1 14 份)
|
||||
|
||||
- **测试输入**: `go test -short ./internal/workflowdef/ -run RDevTemplateLint -count=1`
|
||||
- **判定**: PASS — allowlist 覆盖 `rd_design_input_spec` + 批 1/2/3 共 14 份
|
||||
|
||||
### 5.3 真实 PI:main 仅 intake(项目 6424)
|
||||
|
||||
- **测试输入**: 新建 medical_device 项目;规划期仅保留 `intake`;`backend=pi-agent`;异步 `POST /api/v1/tasks/runs`
|
||||
- **实际输出**(摘自 [pi-intake-meta.json](./assets/2026-09-17-rdev-template-depth/pi-intake-meta.json)):
|
||||
|
||||
```text
|
||||
run_id=run_1789635054471569201
|
||||
Status=completed
|
||||
WorkflowStageKey=V0.1_triage
|
||||
WorkspaceID=/app/data/workspaces/bizdev/intake_1789635054485631143
|
||||
duration_ms=220109
|
||||
```
|
||||
|
||||
- 终稿取样:[intake-final.md](./assets/2026-09-17-rdev-template-depth/intake-final.md)
|
||||
- intake leader(商务回归):[intake-leader-AGENTS.md](./assets/2026-09-17-rdev-template-depth/intake-leader-AGENTS.md) 含「商务对接负责人」
|
||||
- 实例推进至 completed:[main-instance-final.json](./assets/2026-09-17-rdev-template-depth/main-instance-final.json)
|
||||
- **判定**: PASS
|
||||
- **耗时**: ~220 s
|
||||
|
||||
### 5.4 真实 PI:rdev 仅 rd_design_input_spec(项目 6425)
|
||||
|
||||
- **测试输入**: 激活 `rdev`;规划期仅保留 `rd_design_input_spec`;推进至 RD03;同项目插入 completed `main` 实例以满足硬 precheck;真 PI 生成
|
||||
- **实际输出**(摘自 [summary-rdev.json](./assets/2026-09-17-rdev-template-depth/summary-rdev.json) / [pi-rd_design_input_spec-meta.json](./assets/2026-09-17-rdev-template-depth/pi-rd_design_input_spec-meta.json)):
|
||||
|
||||
```text
|
||||
run_id=run_1789635960880707641
|
||||
Status=completed
|
||||
WorkflowStageKey=RD03_design_input
|
||||
di_chars≈15988
|
||||
has_five_sections=true(## 一、功能要求 … ## 五、法规与标准符合性)
|
||||
no_placeholder=true
|
||||
agents_ok=true(研发设计控制负责人)
|
||||
no_business_in_agents=true
|
||||
no_business_in_final=true
|
||||
wall≈450s(09:06–09:13Z)
|
||||
```
|
||||
|
||||
- 终稿:[rd_design_input_spec-final.md](./assets/2026-09-17-rdev-template-depth/rd_design_input_spec-final.md)
|
||||
- leader AGENTS:[rdev-leader-AGENTS.md](./assets/2026-09-17-rdev-template-depth/rdev-leader-AGENTS.md) 开篇为「研发/设计控制小队的负责人…不做报价核算与商务承诺」
|
||||
- 账本 stage:[rd_design_input_spec-docgov.json](./assets/2026-09-17-rdev-template-depth/rd_design_input_spec-docgov.json) → `"stage":"RD03_design_input"`
|
||||
- **判定**: PASS(五节均有结论句 + 事实表 + 缺口标注;无通用占位;无商务/CDO 串味)
|
||||
- **耗时**: ~450 s(小队墙钟);squad 产出约 5 min(organize→review)
|
||||
- **备注**: 终稿章节标题为「## 一、功能要求」等形式(带中文序号),语义覆盖模板五节。
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
```text
|
||||
$ go vet ./...
|
||||
(无输出,exit 0)
|
||||
|
||||
$ env -u DATA_DIR go test -short ./internal/squad/ ./internal/template/ ./internal/workflowdef/
|
||||
ok chat-agent-system/internal/squad 0.030s
|
||||
ok chat-agent-system/internal/template 0.810s
|
||||
ok chat-agent-system/internal/workflowdef 0.004s
|
||||
|
||||
$ env -u DATA_DIR go test -short ./...
|
||||
# 全包 PASS(exit 0;约 59s)。说明:宿主若 export 了 DATA_DIR=./data/dev,
|
||||
# 会覆盖 bizdev-cli 测试 -env 内的临时目录,导致相对路径读不到 squad.json;门禁以 unset DATA_DIR 为准。
|
||||
# 另:本分支自带的 engineeringdashboard 包已补入 module-boundaries.yaml allowlist(随 rebase 丢弃 eng-dashboard 重复提交后可再收敛)。
|
||||
```
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- **结论**: S0 + S1 首批达到合并候选标准(代码+真 PI 取样+门禁)。leader 错配已修;14/60 模板已补强。
|
||||
- **后续**(见 [backlog](../backlog/2026-09-17-rdev-phase2-backlog.md)):
|
||||
- S1 续批:阶段 06–13 剩余模板 + 中等档补指令
|
||||
- S2:per-stage 步骤 / regulatory×complexity_tier / 模型去硬编码 / manifest hint
|
||||
- S3:轻量 overlay + R2/R3 门禁 + P3 三样本 E2E
|
||||
- **合 dev 提示**: 依赖 `feature/rdev-core`;合入前对 rdev-core `rebase dev`,丢弃已进 dev 的 engineering-dashboard 重复提交。
|
||||
@@ -0,0 +1,135 @@
|
||||
# Wave 0 P0 Bug 修复测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
系统体检(2026-09-17)确认 SSE 聊天/任务流被全局 `WriteTimeout=120s` 强杀、`run/stream` 畸形 body 误启任务与 Flush 后失败、前端会话窗口缓存 key 不一致、IndexedDB 恢复覆盖新增交付物。本波次按整改方案 Wave 0 实施 B-1~B-6。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- B-1/B-2:`handleChatStream` / `handleRunTaskStream` 心跳 + `extendSSEWriteDeadline`,长静默不因 WriteTimeout 断流
|
||||
- B-3:畸形 JSON → HTTP 400,不开 SSE
|
||||
- B-4:`CreateAndStart`/`Subscribe` 在 Flush 前;失败为普通 JSON 错误
|
||||
- B-5:`saveSessionWindowCache` 一律带 `userId`;LRU 驱逐完整 cache key
|
||||
- B-6:`applyRestoredFileRaw` 函数式合并,不丢 mount 后新增 deliverable
|
||||
- 质量门禁:`go vet` / `go test -short` / `npm test` / `npm run build` 全绿;dev rebuild + health/ready
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- OS:Linux;Go 模块全量 `-short`;前端 `tsx --test` + vitest
|
||||
- 后端 Stub 单测 + 真实 dev 容器(`pi-agent` + MiniMax-M2.7-highspeed)
|
||||
- 分支:`fix/wave0-p0-sse-chat-cache-bugs` → 合入本地 `dev@810fb96`(后随 docs 再合)
|
||||
- 资产:`.doc/test-reports/assets/2026-09-18-wave0-p0-bug-fixes/`
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 用例 | 预期 |
|
||||
|------|------|
|
||||
| 畸形 run/stream body | 400,非 `text/event-stream` |
|
||||
| CreateAndStart 注入失败 | 非 SSE Content-Type,正文含 start failure |
|
||||
| 短 WriteTimeout + 心跳 | 流时长 > WriteTimeout 仍可读到 done |
|
||||
| 缓存写路径 | 全部调用含 `userId`;超 LRU 驱逐带前缀 key |
|
||||
| restore 合并 | prev 新增条目保留,仅补丁 fileRaw |
|
||||
| 真实 PI 聊天 | 静默生成期出现 `: heartbeat`,最终 `event: done` |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 后端单测(`internal/server/sse_wave0_test.go`)
|
||||
|
||||
**测试输入**:`go test -short -count=1 ./internal/server/ -run 'TestRunTaskStream_InvalidJSON|TestRunTaskStream_CreateAndStartFails|TestSSEHeartbeat_Helpers|TestRunTaskStream_ValidBody' -v`
|
||||
|
||||
**实际输出(摘要)**:
|
||||
|
||||
```
|
||||
--- PASS: TestRunTaskStream_InvalidJSON_Returns400 (0.14s)
|
||||
--- PASS: TestRunTaskStream_CreateAndStartFails_BeforeSSEFlush (0.12s)
|
||||
--- PASS: TestSSEHeartbeat_HelpersSurviveShortWriteTimeout (0.70s)
|
||||
--- PASS: TestRunTaskStream_ValidBody_OpensSSEWithHeartbeatPath (0.17s)
|
||||
PASS
|
||||
```
|
||||
|
||||
**评价判定**:PASS
|
||||
**性能与耗时**:约 1.1s 包级
|
||||
|
||||
### 5.2 前端单测
|
||||
|
||||
**测试输入**:
|
||||
|
||||
```
|
||||
npx tsx --test src/hooks/useChatWindow.cacheKey.test.ts \
|
||||
src/data/storage.windowCache.test.ts src/data/fileStore.test.ts
|
||||
```
|
||||
|
||||
**实际输出**:
|
||||
|
||||
```
|
||||
✔ applyRestoredFileRaw: 以 prev 为权威…
|
||||
✔ applyRestoredFileRaw: 无可用 fileRaw 时返回同一引用
|
||||
✔ window cache LRU: 驱逐带 userId 前缀的完整 cache key…
|
||||
✔ window cache: 读写同一 userId 前缀,跨用户不串读
|
||||
✔ useChatWindow: 所有 saveSessionWindowCache 调用必须传入 userId
|
||||
ℹ tests 5 / pass 5
|
||||
```
|
||||
|
||||
**评价判定**:PASS
|
||||
|
||||
### 5.3 全量回归
|
||||
|
||||
| 命令 | 结果 |
|
||||
|------|------|
|
||||
| `go vet ./...` | PASS |
|
||||
| `go test -short -count=1 ./...` | 全包 ok(含 server) |
|
||||
| `cd web && npm test` | 397 + 32 vitest PASS |
|
||||
| `cd web && npm run build` | PASS(含 precompress) |
|
||||
|
||||
### 5.4 dev 容器冒烟
|
||||
|
||||
**测试输入**:`./scripts/env-service.sh dev rebuild`;`curl -sf http://127.0.0.1:8080/health` 与 `/ready`
|
||||
|
||||
**实际输出**:
|
||||
|
||||
```json
|
||||
{"status":"ok","env":"dev","agent_backend":"pi-agent","schema_version":52,"schema_ready":true,...}
|
||||
```
|
||||
|
||||
**评价判定**:PASS
|
||||
|
||||
### 5.5 真实 PI 聊天 SSE(心跳接线证据)
|
||||
|
||||
**测试输入**:admin 登录后 `POST /api/v1/chat/stream`,长合规分析提示词;资产见 `assets/2026-09-18-wave0-p0-bug-fixes/chat-stream-long.sse.txt`
|
||||
|
||||
**实际输出(关键片段)**:
|
||||
|
||||
```
|
||||
event: phase
|
||||
...
|
||||
: heartbeat 1789663534
|
||||
: heartbeat 1789663549
|
||||
: heartbeat 1789663564
|
||||
: heartbeat 1789663579
|
||||
event: delta
|
||||
...
|
||||
event: done
|
||||
data: {...,"done":{"duration_ms":70164,"status":"completed",...}}
|
||||
```
|
||||
|
||||
**评价判定**:PASS(真 PI 回合约 70s;静默生成期 4 次心跳,流完整收尾)。
|
||||
**说明**:绝对墙钟 >120s 的真 PI 未再压测(二次加长提示触发 `SECURITY_FORBIDDEN` 快速返回);WriteTimeout 跨越由 `TestSSEHeartbeat_HelpersSurviveShortWriteTimeout`(WriteTimeout=200ms,流 700ms)覆盖,与线上心跳机制同源。
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
- Go:`go vet ./...` + `go test -short -count=1 ./...` → 全绿
|
||||
- Web:`npm test`(397 node:test + 32 vitest)+ `npm run build` → 全绿
|
||||
- 新增:`sse_wave0_test.go`、`useChatWindow.cacheKey.test.ts`、`storage.windowCache.test.ts`、`fileStore.test.ts`
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- Wave 0(B-1~B-6)达到合入与冒烟标准,可关闭 short-term 任务。
|
||||
- 后续:Wave 1(E-1 main ENV)仍待决策;可选补一次刻意 >120s 的受控长任务(例如阻塞 executor 的 task run events)作为额外证据。
|
||||
- 红线未触碰:FAV / MULTI_INTENT_PLAN_TIER / SEMANTIC_SUMMARY_REPLACE / 项目 143。
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Audit: [../audit/2026-09-17-system-health-check.md](../audit/2026-09-17-system-health-check.md)
|
||||
- Remediation: [../remediation/2026-09-17-system-health-remediation-plan.md](../remediation/2026-09-17-system-health-remediation-plan.md)
|
||||
- Short-term: [../ops/short-term/2026-09-18-wave0-p0-bug-fixes.md](../ops/short-term/2026-09-18-wave0-p0-bug-fixes.md)
|
||||
- Assets: [./assets/2026-09-18-wave0-p0-bug-fixes/](./assets/2026-09-18-wave0-p0-bug-fixes/)
|
||||
@@ -0,0 +1,100 @@
|
||||
# Wave 1:main 环境 ENV/schema 修正测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
体检确认 main 环境 app `ENV=prod` 与 events `ENV=main` 不一致(E-1 critical),schema 落后且晋升缺强制顺序(E-2),以及 `Env==""` 视同 dev 放开导入端点(E-5)。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- app/events health 均报 `env=main`
|
||||
- events 先 healthy 后启 app;goose 迁移后 `schema_ready=true`(实测 schema_version=52)
|
||||
- `event_consumer_modes` 中 main 四行仍为 `off`
|
||||
- 空 Env 导入端点 403;compose app/events ENV 一致单测 PASS
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- 分支:`fix/wave1-main-env-fix` → 合入本地 `dev`
|
||||
- 真实 main:`./scripts/env-service.sh main rebuild`(注意:执行前须清掉 shell 内残留的 `source .env.dev` 覆盖变量,否则端口会串到 8080/18865)
|
||||
- 单测:`internal/config/compose_env_consistency_test.go`、`TestServer_ChatWindow_ImportGuard_EmptyEnvFailsClosed`
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 项 | 预期 |
|
||||
|----|------|
|
||||
| events `/health` | `env=main` |
|
||||
| app `/health` `/ready` | `env=main`,`schema_ready=true` |
|
||||
| consumer modes | main 四行 `off` |
|
||||
| settings / projects | HTTP 200,无 SQL 缺列错误 |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 单测
|
||||
|
||||
```
|
||||
--- PASS: TestComposeAppEventsENVAligned
|
||||
--- PASS: TestComposeMainAppDependsOnEventsHealthy
|
||||
--- PASS: TestServer_ChatWindow_ImportGuard
|
||||
--- PASS: TestServer_ChatWindow_ImportGuard_EmptyEnvFailsClosed
|
||||
```
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.2 main rebuild 启动顺序
|
||||
|
||||
日志摘要(`/tmp/wave1-main-rebuild3.txt`):
|
||||
|
||||
```
|
||||
Container shuimu-agent-events-main Started
|
||||
Container shuimu-agent-events-main Waiting
|
||||
Container shuimu-agent-events-main Healthy
|
||||
Container shuimu-agent-app-main Starting
|
||||
Container shuimu-agent-app-main Started
|
||||
```
|
||||
|
||||
**判定**:PASS(E-2 depends_on 生效)
|
||||
|
||||
### 5.3 health / schema / modes
|
||||
|
||||
**events**:`{"env":"main","owner":"events-1","status":"ok"}`
|
||||
**app**:`{"status":"ok","env":"main",...,"schema_version":52,"schema_ready":true}`
|
||||
**modes**:main 的 fav/notify/projection/workflow_advance 均为 `off` revision=1
|
||||
**goose**:`version_id=52`
|
||||
|
||||
资产:`.doc/test-reports/assets/2026-09-18-wave1-main-env-fix/`
|
||||
|
||||
**判定**:PASS(E-1 对齐;schema 由 47 升至 52;红线未改 mode)
|
||||
|
||||
### 5.4 冒烟
|
||||
|
||||
| 调用 | 结果 |
|
||||
|------|------|
|
||||
| POST `/api/v1/auth/login` | login_ok |
|
||||
| GET `/api/v1/admin/system/settings` | 200(system_settings 可读) |
|
||||
| GET `/api/v1/projects` | 200 `[]` |
|
||||
| GET `/api/v1/admin/system/overview` | 200,`env=main`,`schemaVersion=52` |
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.5 附带修复说明
|
||||
|
||||
main `events` 在 `ENV=main` 下原先因 `validateProductionSecrets` 缺 KB/admin 口令而持续 Restarting(Wave 1 前已存在)。为使 `depends_on events healthy` 可落地,向 events 注入 `POSTGRES_SHARED_KB_DSN` / `ADMIN_PASSWORD` / `ALLOW_IN_MEMORY=false` 并挂入 `shared-net`。
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
- `go vet ./...` PASS
|
||||
- `go test -short ./internal/config/`、`./internal/server/` Wave 1 相关用例 PASS
|
||||
- 全量 `go test -short ./...`:`cmd/bizdev-cli` 因本机 `mkdir data/dev/data: permission denied` 失败(环境权限,与本波次无关);其余包 ok
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
Wave 1(E-1/E-2/E-5)达到关闭标准。建议后续:
|
||||
|
||||
1. Wave 2 配置声明对齐
|
||||
2. `env-service.sh` 在调用 compose 前 unset 易串扰的端口类变量,避免 shell 污染
|
||||
3. 评估是否把 events 的生产密钥注入同步到文档 checklist
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Short-term: [../ops/short-term/2026-09-18-wave1-main-env-fix.md](../ops/short-term/2026-09-18-wave1-main-env-fix.md)
|
||||
- Remediation: [../remediation/2026-09-17-system-health-remediation-plan.md](../remediation/2026-09-17-system-health-remediation-plan.md)
|
||||
- Assets: [./assets/2026-09-18-wave1-main-env-fix/](./assets/2026-09-18-wave1-main-env-fix/)
|
||||
@@ -0,0 +1,104 @@
|
||||
# Wave 2:配置与灰度入口对齐测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
体检确认封存 flag(`MULTI_INTENT_PLAN_TIER`、U9–U12、SHADOW/NARRATIVE)未写入 compose `environment`,`--env-file` 无法传入容器(E-3);`CURSOR_RUNNER_URL`/cursor-agent 零消费占位(E-4);main 未显式关闭 demo 播种(E-6);`INTENT_V2_DECISION_TIER` 非法值激进回退 `query`(E-7);main initdb 与 test 脚本形态差异需评估(E-9)。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- 三环境 compose 渲染与容器 env 均可见目标 flag,默认 `legacy`/`false`
|
||||
- `CURSOR_RUNNER*` 与 `cursor-agent` 容器消失
|
||||
- main `SEED_DEMO_USERS=false`
|
||||
- 非法 `INTENT_V2_DECISION_TIER` fail-closed 到 `none`
|
||||
- E-9:记录评估结论,不改 initdb
|
||||
- `go vet` / `go test -short` 全绿;dev/test/main health+ready PASS
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- 分支:`fix/wave2-config-flag-align`(自本地 `dev@e35f106`)
|
||||
- 单测:`internal/config/compose_flag_declaration_test.go`、`TestUnknownV2DecisionTierFailsClosedToNone`
|
||||
- 真实环境:`./scripts/env-service.sh {dev,test,main} rebuild`(执行前 unset shell 泄漏端口变量)
|
||||
- 证据目录:`.doc/test-reports/assets/2026-09-18-wave2-config-flag-align/`
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 项 | 预期 |
|
||||
|----|------|
|
||||
| compose config | 三环境 `MULTI_INTENT_PLAN_TIER=legacy` + U9–U12/SHADOW/NARRATIVE=false;无 CURSOR_RUNNER |
|
||||
| 容器 env | 同上;main 另有 `SEED_DEMO_USERS=false` |
|
||||
| cursor-agent | `docker ps` 无匹配 |
|
||||
| health/ready | 三环境 ok,schema_ready=true |
|
||||
| 行为 | 不升 tier、不接线 REPLACE、不改 FAV |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 单测
|
||||
|
||||
```
|
||||
ok chat-agent-system/internal/intent
|
||||
ok chat-agent-system/internal/config
|
||||
--- PASS: TestComposeAppDeclaresMultiIntentPlanTierAndExpansionFlags
|
||||
--- PASS: TestComposeAppDeclaresSemanticSummaryAndNarrativeShadowFlags
|
||||
--- PASS: TestComposeMainSeedDemoUsersExplicitFalse
|
||||
--- PASS: TestComposeNoDeadCursorRunnerConfig
|
||||
--- PASS: TestUnknownV2DecisionTierFailsClosedToNone
|
||||
```
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.2 compose config 渲染
|
||||
|
||||
见 `assets/.../compose-config-flags.txt`。三环境均含目标 flag;`CURSOR_RUNNER` 零匹配。
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.3 容器 env 抽检
|
||||
|
||||
| 环境 | 关键输出 | 判定 |
|
||||
|------|----------|------|
|
||||
| dev | `MULTI_INTENT_PLAN_TIER=legacy` … `SEMANTIC_SUMMARY_SHADOW=false`(无 CURSOR_RUNNER) | PASS |
|
||||
| test | 同上 + `SEED_DEMO_USERS=false` | PASS |
|
||||
| main | 同上 + `SEED_DEMO_USERS=false` | PASS |
|
||||
|
||||
### 5.4 冒烟 health/ready
|
||||
|
||||
| 环境 | health | ready | 判定 |
|
||||
|------|--------|-------|------|
|
||||
| dev `:8080` | env=dev schema=52 | ok | PASS |
|
||||
| test `:8081` | env=test schema=52 | ok | PASS |
|
||||
| main `:8000` | env=main schema=52 | ok | PASS |
|
||||
|
||||
main rebuild 日志确认 `events` Healthy 后才 Starting `app`(E-2 依赖仍生效)。
|
||||
|
||||
### 5.5 cursor-agent 清理
|
||||
|
||||
```
|
||||
cursor-agent 容器已清理,符合预期
|
||||
```
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.6 E-9 评估结论(本波次不改代码)
|
||||
|
||||
| 环境 | initdb 挂载 | 结论 |
|
||||
|------|-------------|------|
|
||||
| dev | `deploy/postgres/context_init.sql` | 与 main baseline 内容一致(仅差 goose 头注释) |
|
||||
| test | `deploy/postgres/extensions_init.sql` | 仅扩展,表全靠 goose |
|
||||
| main | `deploy/postgres/goose/00001_baseline.sql` | 与 dev 实质一致;无「落后」 |
|
||||
|
||||
**决策**:不收敛 initdb(零行为变化波次);双文件漂移风险记入后续 backlog,需空卷冷启动专项验证后再改。
|
||||
|
||||
**判定**:评估完成 / 不改代码 — PASS(按计划)
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
```
|
||||
go vet ./... # 通过
|
||||
go test -short -count=1 ./... # 全绿(见 assets/go-test-short.txt)
|
||||
```
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- Wave 2 达到合并标准:声明对齐完成,默认行为不变。
|
||||
- 下一波 Wave 3:测试债与盲区(S-1/S-2/S-4/S-5)。
|
||||
- E-9 结构性收敛(dev/main → extensions-only)另开任务。
|
||||
@@ -0,0 +1,82 @@
|
||||
# Wave 3:测试债与盲区测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
体检确认 `TestReconcile_LegacyRepair_PG` 从未在隔离 PG 上执行(S-1);两处永久跳过(S-2);E2E 9 个 spec 仅 1 个有 npm 脚本且存在 `DOCREV_E2E_BASE_URL` 双口径(S-4);前端多处 API 对 409/结构化错误裸抛 Error(S-5)。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- 隔离 PG(5436) 跑通 LegacyRepair 一次并归档
|
||||
- 删除死跳过;plan_owner 重定向说明补齐
|
||||
- `playwright test --list` = 29 tests / 8 files;每 spec 有脚本
|
||||
- projectMembers/freeformDoc/taskRuns/chatSessions 复用 `projectSettingsError` 并有负例单测
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- 分支:`fix/wave3-test-debt-blindspots` ← 本地 `dev@423f7e7`
|
||||
- 隔离 PG:`pgvector/pgvector:pg16` 映射 5436,测完销毁并 `unset TEST_DATABASE_URL`
|
||||
- 前端:`npm test` / `npm run build` / `npx playwright test --list`
|
||||
- 证据:`.doc/test-reports/assets/2026-09-18-wave3-test-debt-blindspots/`
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 项 | 预期 |
|
||||
|----|------|
|
||||
| S-1 | goose→52 + `PASS: TestReconcile_LegacyRepair_PG` |
|
||||
| S-2 | TaskStream 3 PASS 0 SKIP;plan_owner 仍 SKIP 但注释说明导入环 |
|
||||
| S-4 | 29 tests / 8 files;无 `DOCREV_E2E_BASE_URL` |
|
||||
| S-5 | 相关 API 单测 PASS;`npm test` 全绿 |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 S-1 隔离 PG
|
||||
|
||||
见 `assets/.../go-test-reconcile-pg.txt`:
|
||||
|
||||
```
|
||||
goose: successfully migrated database to version: 52
|
||||
--- PASS: TestReconcile_LegacyRepair_PG (0.37s)
|
||||
```
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.2 S-2
|
||||
|
||||
```
|
||||
--- SKIP: TestTaskGenerateRealPIStopGate(redirect 说明已补)
|
||||
--- PASS: TestTaskStream_TransientInjection_DeadPiAgent
|
||||
--- PASS: TestTaskStream_SoftFailure_ClassifiedResumable
|
||||
--- PASS: TestTaskStream_MaterialsInjection
|
||||
```
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.3 S-4
|
||||
|
||||
```
|
||||
Total: 29 tests in 8 files
|
||||
```
|
||||
|
||||
**判定**:PASS(退役 `document-revision.spec.ts`)
|
||||
|
||||
### 5.4 S-5
|
||||
|
||||
`npm test`:402 pass + vitest 32 pass;含 DOC_BUSY / CONCURRENCY_CONFLICT / members / chatSessions 负例。
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.5 全量回归
|
||||
|
||||
`go vet ./...` + `go test -short ./...` 全绿(见 `go-test-short.txt`)。
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
- Go short:全绿
|
||||
- Web:`npm test` 全绿;`npm run build` 成功
|
||||
- Playwright list:29/8
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- Wave 3 达到合并标准;gap-matrix DOC-CONTENT 工程测试债关闭。
|
||||
- 下一波 Wave 4:隐患加固 R-1~R-8。
|
||||
- 后端 `error_code`→统一 `httpx.Write` 仍属独立 remediation,不在本波。
|
||||
@@ -0,0 +1,118 @@
|
||||
# Wave 4:隐患加固(R-1~R-8)测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
系统体检(2026-09-17)确认高风险隐患 R-1~R-8:会话跨用户挂靠、`rows.Err()` 漏检、dispatcher 无锁读、`memTurns` 全局只增不删、JSONB 静默零值化、后台 ticker 无 Shutdown、SSE 401/404 盲目重连与登出未 abort 在途流。Wave 0–3 已合入后按 Sonnet 计划默认决策实施本波。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- R-1:跨用户 chat / chat/stream / chat/sessions 全部 403;受害者续用 200;Memory + PG 双实现
|
||||
- R-2:18 文件补齐 `rows.Err()`;B 类 slog.Warn
|
||||
- R-3:`-race` 下 events 无竞态
|
||||
- R-4:实例隔离 + TTL/容量淘汰测试 PASS
|
||||
- R-5:损坏/类型错误 JSONB 显式报错
|
||||
- R-6:Shutdown 可停止 reminder/vault;Drain 可告警;bizdev 心跳超时
|
||||
- R-7/R-8:401/404 fail-fast(calls===1);单帧容错;abortAllSessions
|
||||
- 全量:`go vet` / `go build` / `go test -short` / `npm test` / `npm run build`
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- 分支:`fix/wave4-hardening-r1-r8` ← 本地 tip `32932e4`
|
||||
- 隔离 PG:`pgvector/pgvector:pg16` → `127.0.0.1:5436`,测完 `unset TEST_DATABASE_URL` + `docker stop wave4-pg`
|
||||
- OS:Linux;Go 模块本仓;前端 Vite/Node test runner
|
||||
- 证据:`.doc/test-reports/assets/2026-09-18-wave4-hardening-r1-r8/`
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 项 | 预期 |
|
||||
|----|------|
|
||||
| R-1 Memory/PG | attacker 403 SESSION_FORBIDDEN;stream 非 SSE;victim 续用 OK |
|
||||
| R-2 | `go vet` 绿;18 文件循环后可见 `rows.Err()` |
|
||||
| R-3 | `go test -race -short ./internal/events/...` 绿 |
|
||||
| R-4 | ChatTurn 四测 PASS;无全局 `memTurns` 重置 |
|
||||
| R-5 | hydrate 错误含 `hydrateDocLocked` + `block_map` |
|
||||
| R-7 | 401/404 各仅 1 次 fetch;畸形帧跳过后仍解析下一帧 |
|
||||
| 全量 | short/npm/build EXIT:0 |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 R-1 跨用户会话挂靠
|
||||
|
||||
**输入**:受害者建立 `sess-hijack-*` 后攻击者同 session_id 调 chat / stream / upsert。
|
||||
|
||||
**实际输出**(`ownership-pg.txt`):
|
||||
|
||||
```
|
||||
--- PASS: TestChatSessionOwnership_CrossUserHijackDenied_PG
|
||||
--- PASS: TestChatSessionOwnership_CrossUserHijackDenied_Memory
|
||||
```
|
||||
|
||||
**判定**:PASS(附带清除 NewSession `ProjectID=1` 占位,避免 PG 误走项目鉴权)
|
||||
|
||||
### 5.2 R-2 rows.Err()
|
||||
|
||||
**实际输出**:`go-vet.txt` EXIT:0;静态补齐 18 文件。
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.3 R-3 / R-4 race
|
||||
|
||||
**实际输出**(`go-race.txt`):
|
||||
|
||||
```
|
||||
ok chat-agent-system/internal/events
|
||||
ok chat-agent-system/internal/ctxmgr
|
||||
EXIT:0
|
||||
```
|
||||
|
||||
含 `TestAcquireChatTurn_StaleEntriesPruned` PASS。
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.4 R-5 hydrate JSONB
|
||||
|
||||
**实际输出**(`hydrate-corrupt-pg.txt`):
|
||||
|
||||
```
|
||||
--- PASS: TestHydrateDocLocked_CorruptJSONBFailsExplicitly_PG
|
||||
```
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.5 R-6
|
||||
|
||||
代码级:`Shutdown` close `reminderStop`/`vaultStop`;vault Drain → `vault_drain_failed`;bizdev 心跳/释放 10s timeout。随 `go test -short ./internal/server/... ./internal/bizdev/...` 回归。
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.6 R-7 / R-8 前端
|
||||
|
||||
**实际输出**(`npm-test.txt`):tests 406 pass;vitest 32 pass;含 401/404 fail-fast 与畸形帧容错、abortAllSessions。
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
### 5.7 全量回归
|
||||
|
||||
- `go-vet.txt` / `go-build.txt` / `go-test-short.txt`:EXIT:0
|
||||
- `npm-build.txt`:EXIT:0
|
||||
|
||||
**判定**:PASS
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
| 命令 | 结果 |
|
||||
|------|------|
|
||||
| `go vet ./...` | PASS |
|
||||
| `go build ./...` | PASS |
|
||||
| `go test -short -count=1 ./...` | PASS |
|
||||
| `go test -race -short ./internal/events/... ./internal/ctxmgr/...` | PASS |
|
||||
| `cd web && npm test` | PASS(406 + 32) |
|
||||
| `cd web && npm run build` | PASS |
|
||||
| 隔离 PG R-1/R-5 | PASS 后销毁容器 |
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- Wave 4 R-1~R-8 达到合入本地 `dev` 标准。
|
||||
- 未改 D-4/D-5(`handleGetProject` 鉴权、`handleRunTaskStream` 归属);记入后续 backlog。
|
||||
- 红线自查:未触碰 FAV modes / MULTI_INTENT_PLAN_TIER / SEMANTIC_SUMMARY_REPLACE / 项目 143。
|
||||
- 下一波:Wave 5 死代码决策(X-1~X-5)。
|
||||
@@ -0,0 +1,85 @@
|
||||
# Wave 5 死代码决策(X-1~X-5)测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
系统体检整改 Wave 0–4 已合入本地 `dev@a12c947`。Wave 5 对死 flag、封存 REPLACE、00048 三表、system_settings 未接线键、前端死组件做逐项决策并收口。决策落点:[short-term](../ops/short-term/2026-09-18-wave5-deadcode-decisions.md)。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- X-1:删除 `SEMANTIC_FALLBACK_ENABLED` 且回归测试防复活。
|
||||
- X-2:`SEMANTIC_SUMMARY_REPLACE` 维持不接线,注释回链决策记录。
|
||||
- X-3:00048 三表 deferred → SWBOOT-10/W5b(不改 schema)。
|
||||
- X-4:6 个未接线 system_settings 键保留并注释二期。
|
||||
- X-5:删除死组件/死 API 后前端构建与测试全绿。
|
||||
- 门禁:`go vet ./...`、`go test -short ./...`、`cd web && npm test && npm run build`。
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- OS:Linux;Go `go1.27.1 linux/amd64`;Node `v26.8.2`;npm `11.19.1`。
|
||||
- 层级:单元/包测试(`-short`)+ 前端 `tsx --test` / vitest + `tsc && vite build`。
|
||||
- 未做容器 rebuild / 真 PI E2E(本波为死代码删除与注释,无运行时行为变更)。项目 143 只读,未触碰。
|
||||
- 证据目录:`.doc/test-reports/assets/2026-09-18-wave5-deadcode-decisions/`。
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 项 | 判定 |
|
||||
|----|------|
|
||||
| X-1 | compose/代码无 `SEMANTIC_FALLBACK_ENABLED`(回归测试字符串除外);`TestComposeNoDeadSemanticFallbackConfig` PASS |
|
||||
| X-2 | REPLACE 仍不替换 narrative;diff 仅注释 |
|
||||
| X-3 | schema 不变;swboot 测试绿 |
|
||||
| X-4 | 白名单键仍在;sysadmin 测试绿 |
|
||||
| X-5 | `npm run build`(含 tsc)绿;死符号无引用 |
|
||||
| 全量 | vet 无输出;`go test -short` 无 FAIL;npm test 0 fail |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 X-1 回归测试
|
||||
|
||||
- **测试输入**:`go test -short ./internal/config/...`(含于全量 `-short`)
|
||||
- **实际输出**:`ok chat-agent-system/internal/config`(见 assets `go-test-short.txt`)
|
||||
- **评价判定**:PASS。`SEMANTIC_FALLBACK_ENABLED` 仅剩回归测试断言字符串。
|
||||
- **性能与耗时**:config 包约 0.x s(全量 short 合计约 16s)
|
||||
|
||||
### 5.2 X-2 / X-3 / X-4 包测试
|
||||
|
||||
- **测试输入**:`go test -short ./internal/ctxmgr/... ./internal/swboot/... ./internal/sysadmin/...`(含于全量)
|
||||
- **实际输出**:
|
||||
- `ok chat-agent-system/internal/ctxmgr`(cached/ok)
|
||||
- `ok chat-agent-system/internal/swboot 0.002s`
|
||||
- `ok chat-agent-system/internal/sysadmin 0.003s`
|
||||
- **评价判定**:PASS
|
||||
- **性能与耗时**:毫秒级
|
||||
|
||||
### 5.3 X-5 前端
|
||||
|
||||
- **测试输入**:`cd web && npm test && npm run build`
|
||||
- **实际输出**:
|
||||
- tsx:`tests 406 / pass 406 / fail 0`(`duration_ms 903.526321`)
|
||||
- vitest:`Test Files 3 passed (3)` / `Tests 32 passed (32)` / `Duration 533ms`
|
||||
- build:`tsc && vite build` → `✓ 4123 modules transformed`;`precompress: wrote 49 .br and 49 .gz`
|
||||
- **评价判定**:PASS
|
||||
- **性能与耗时**:npm test + build 合计约 18s
|
||||
|
||||
### 5.4 全量 Go
|
||||
|
||||
- **测试输入**:`go vet ./...`;`go test -short ./...`
|
||||
- **实际输出**:vet 空文件(exit 0);short 测试 `ok` 计数 56,无 `FAIL`/`panic`
|
||||
- **评价判定**:PASS
|
||||
- **性能与耗时**:vet ~2s;short ~16s
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
| 命令 | 结果 | 证据 |
|
||||
|------|------|------|
|
||||
| `go vet ./...` | PASS(exit 0,无输出) | [go-vet.txt](./assets/2026-09-18-wave5-deadcode-decisions/go-vet.txt) |
|
||||
| `go test -short ./...` | PASS(56 ok,无 FAIL) | [go-test-short.txt](./assets/2026-09-18-wave5-deadcode-decisions/go-test-short.txt) |
|
||||
| `cd web && npm test` | PASS(406+32,fail 0) | [npm-test.txt](./assets/2026-09-18-wave5-deadcode-decisions/npm-test.txt) |
|
||||
| `cd web && npm run build` | PASS | [npm-build.txt](./assets/2026-09-18-wave5-deadcode-decisions/npm-build.txt) |
|
||||
|
||||
时间:2026-09-18T04:01:27Z。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
达到合入本地 `dev` 标准。红线未触碰:REPLACE 不接线、不升 `MULTI_INTENT_PLAN_TIER`、不改 FAV、项目 143 只读。
|
||||
|
||||
后续:Wave 6 文档漂移(D-1~D-6);SWBOOT-10/W5b 与 system_settings 二期接线仍 deferred,不在本波。
|
||||
@@ -0,0 +1,93 @@
|
||||
# Wave 6 文档漂移修复(D-1~D-6)测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
系统体检审计 [`.doc/audit/2026-09-17-system-health-check.md`](../audit/2026-09-17-system-health-check.md) §1.5 记录文档漂移 D-1~D-6:PU8 契约状态未回标、modular-monolith ADR 仍为提议、INDEX 末行需复核、意图双标签 handoff 正文未回标、backlog D3/D7 滞后、`PROJECT.md` §9「剩余 blocker」与 gap-matrix `production_ready=yes` 矛盾。整改方案 Wave 6 要求逐项回链关闭。基线为本地 `dev@2ce2625`(Wave 5 已合入)。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- D-1~D-6 逐项关闭,漂移清单可回链。
|
||||
- `audit/INDEX.md`、`remediation/INDEX.md`、`FEATURE-MATRIX.md` 三方口径一致(D-3 预期零改动)。
|
||||
- 零代码改动:`go build ./...`、`go vet ./...`、`cd web && npm run build` 全绿。
|
||||
- 不升 tier、不接线 `SEMANTIC_SUMMARY_REPLACE`、不改 FAV、无新增发布 blocker。
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- OS:Linux;Go `go1.27.1 linux/amd64`;Node `v26.8.2`;npm `11.19.1`。
|
||||
- 层级:文档 diff 复核 + 编译/vet/前端构建防误伤。未做容器 rebuild 与真 PI E2E(本波只改 `.doc/**` 与 `PROJECT.md`)。
|
||||
- 证据目录:`.doc/test-reports/assets/2026-09-18-wave6-doc-drift/`。
|
||||
- 时间:2026-09-18T04:11:26Z(INDEX 复核)至 2026-09-18T04:11:41Z(go)/ npm build 约 16s。
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 项 | 判定 |
|
||||
|----|------|
|
||||
| D-1 | 四份 PU8 契约 `status: done`、`updated: 2026-09-18`;两份 short-term 在 `.doc/archive/ops/` |
|
||||
| D-2 | ADR「状态」为「已接受」并附 Phase 1/2 证据链接 |
|
||||
| D-3 | 两个 INDEX 末行保持「U2 已验收,主 JS ~624 KB;U1/U3–U7 待实施」,零改动 |
|
||||
| D-4 | handoff 末尾追加「回标」小节;历史正文保留;frontmatter 仍 `closed` |
|
||||
| D-5 | backlog 仅 D3/D7 两行改写并回链 |
|
||||
| D-6 | `PROJECT.md` §9 写 `production_ready=yes`、无剩余发布 blocker |
|
||||
| 防误伤 | `go build` / `go vet` / `npm run build` exit 0 |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 D-1 契约回标与归档
|
||||
|
||||
- **测试输入**:frontmatter diff;`git mv` 两份已 done short-term。
|
||||
- **实际输出**:四份契约 `status: done` / `updated: 2026-09-18`。`git` rename 100%:`.doc/archive/ops/2026-09-16-pu8-u9-u12-flags.md`、`.doc/archive/ops/2026-09-17-w4-multi-intent-u9-u12.md`。
|
||||
- **评价判定**:PASS。正文与 flag 未改。
|
||||
- **性能与耗时**:文档编辑,可忽略。
|
||||
|
||||
### 5.2 D-2 ADR
|
||||
|
||||
- **测试输入**:`.doc/adr/2026-09-14-modular-monolith-decoupling.md`「状态」小节。
|
||||
- **实际输出**:`已接受(2026-09-14 提议;2026-09-18 确认——Phase 1 纵向绞杀与 Phase 2 持久事件交付已落地并验收,见 gap-matrix DOC-RELIABILITY-PILOT PASS…)`。
|
||||
- **评价判定**:PASS。决策正文未改。
|
||||
- **性能与耗时**:可忽略。
|
||||
|
||||
### 5.3 D-3 INDEX 复核
|
||||
|
||||
- **测试输入**:`tail -n 1` audit/INDEX 与 remediation/INDEX。
|
||||
- **实际输出**(见 [index-last-lines.txt](./assets/2026-09-18-wave6-doc-drift/index-last-lines.txt)):
|
||||
- audit:`- 2026-09-17:[首次加载性能诊断与改进](2026-09-17-initial-load-performance-audit.md)(三入口重启首访;U2 已验收,主 JS ~624 KB;U1/U3–U7 待实施)。`
|
||||
- remediation:同表述,指向 `-plan.md`。
|
||||
- **评价判定**:PASS,无改动。
|
||||
- **性能与耗时**:可忽略。
|
||||
|
||||
### 5.4 D-4 handoff 回标
|
||||
|
||||
- **测试输入**:`.doc/ops/handoffs/2026-09-15-conversation-intent-dual-tab.md` 末尾追加。
|
||||
- **实际输出**:新增「回标(2026-09-18,Wave 6 文档漂移修复)」;「未完成」与认领表原文保留。
|
||||
- **评价判定**:PASS。
|
||||
- **性能与耗时**:可忽略。
|
||||
|
||||
### 5.5 D-5 backlog
|
||||
|
||||
- **测试输入**:`.doc/backlog/chat-agent-p6-backlog.md` D3/D7 两行。
|
||||
- **实际输出**:D3 标已实现(shadow)并链接 FEATURE-MATRIX / PU6 / W2 报告;D7 链接 ADR 与 W7 盘点,合规签字结论未改。B5/A5/A6/A7/D5 未动。
|
||||
- **评价判定**:PASS。FEATURE-MATRIX「语义摘要(D3)」为 done、REPLACE 未启用;「对话数据治理(D7)」为 deferred / `pending-compliance-signoff`。交叉检查无矩阵改动。
|
||||
- **性能与耗时**:可忽略。
|
||||
|
||||
### 5.6 D-6 PROJECT.md §9
|
||||
|
||||
- **测试输入**:`PROJECT.md` 第 9 节「剩余 blocker」行。
|
||||
- **实际输出**:改为「发布门禁:`production_ready=yes`……**无剩余发布 blocker**」;历史 P0 报告链接保留为「历史里程碑」。
|
||||
- **评价判定**:PASS。与 gap-matrix 不再矛盾。
|
||||
- **性能与耗时**:可忽略。
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
| 命令 | 结果 | 证据 |
|
||||
|------|------|------|
|
||||
| `go build ./...` | PASS(exit 0,无输出) | [go-build.txt](./assets/2026-09-18-wave6-doc-drift/go-build.txt) |
|
||||
| `go vet ./...` | PASS(exit 0,无输出) | [go-vet.txt](./assets/2026-09-18-wave6-doc-drift/go-vet.txt) |
|
||||
| `cd web && npm run build` | PASS(`✓ 4123 modules transformed`;`precompress: wrote 49 .br and 49 .gz`) | [npm-build.txt](./assets/2026-09-18-wave6-doc-drift/npm-build.txt) |
|
||||
|
||||
时间:2026-09-18T04:11:39Z 起;go build+vet 约 2s(缓存命中);npm build 约 16s。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
D-1~D-6 全部关闭,remediation Wave 6 行与验收勾选已回链,CURRENT 焦点/认领/`doc-drift` mutex 与槽位 idle 一致。达到合入本地 `dev` 标准。无新增 blocker。
|
||||
|
||||
后续:Wave 7(SWBOOT-10、FAV live 放量、D7 合规签字)仍 deferred,需独立授权,不在本波。
|
||||
@@ -0,0 +1,65 @@
|
||||
# Wave 7 既有 roadmap 编排确认 测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
系统体检整改 Wave 7 定义为「既有 roadmap 收口(不改优先级,仅确认编排)」,不是把 deferred 能力做完。基线为本地 `dev@a88ed85`(`merge: docs/wave6-doc-drift`)。Wave 6 的 D-1~D-6 已 PASS,本波跳过步骤 0,不改 backlog。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- 六条编排确认均含当前状态、关闭条件、是否需授权、下一触发点。
|
||||
- 零代码:不改 Go/TS/SQL/compose。
|
||||
- 红线未动:不实施 SWBOOT-10、不升 FAV、不删 D7 数据、不升 `MULTI_INTENT_PLAN_TIER`、不接线 `SEMANTIC_SUMMARY_REPLACE`、不改 FEATURE-MATRIX 状态列、不合并/删除 `feature/control-center-server`。
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- OS:Linux。文档波次,无容器、无真 PI、无 stub 验收数据。
|
||||
- 核验:`git diff --name-only a88ed85..HEAD` 仅 `.doc/**`;人工核对六条确认字段与 remediation/CURRENT 回链。
|
||||
- 时间:2026-09-18。
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 项 | 判定 |
|
||||
|----|------|
|
||||
| 六条确认 | T1/W5、T1/W6、T1/W7、T2、T4、T5/T6/T8 均落盘,且无一项标成已实现 |
|
||||
| T2 | 只记录双实现事实与建议;分支仍在 |
|
||||
| 防误伤 | diff 不含 `.go` / `.ts` / `.tsx` / `.sql` / compose |
|
||||
| SSOT | remediation Wave 7 = done;CURRENT 焦点 Wave 0–7 done;槽位 idle |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 六条确认落盘
|
||||
|
||||
- **测试输入**:short-term `.doc/ops/short-term/2026-09-18-wave7-roadmap-orchestration.md`。
|
||||
- **实际输出**:六节均含「当前状态 / 关闭条件 / 是否需用户授权 / 建议下一触发点」。T1/W5、T1/W6、T1/W7 标需要授权;T2 标需要用户裁决取舍;T4/T5/T8 不需专项授权但未开工。
|
||||
- **评价判定**:PASS。
|
||||
- **性能与耗时**:文档编辑,可忽略。
|
||||
|
||||
### 5.2 零代码与红线
|
||||
|
||||
- **测试输入**:`git diff --name-only a88ed85..HEAD`(确认提交之后、本报告提交之前)。
|
||||
- **实际输出**:
|
||||
|
||||
```text
|
||||
.doc/ops/CURRENT.md
|
||||
.doc/ops/short-term/2026-09-18-wave7-roadmap-orchestration.md
|
||||
.doc/remediation/2026-09-17-system-health-remediation-plan.md
|
||||
```
|
||||
|
||||
按扩展名过滤 `.go|.ts|.tsx|.sql|.yml|.yaml` 结果为空(`no code files`)。backlog、FEATURE-MATRIX、compose 未出现在 diff 中。
|
||||
- **评价判定**:PASS。未跑 `go test` / 容器冒烟:本波无代码,容器验证不适用。
|
||||
- **性能与耗时**:`git diff` < 1s。
|
||||
|
||||
### 5.3 Control Center 分支未动
|
||||
|
||||
- **测试输入**:`git rev-list --count` 相对 `dev@a88ed85`;`git branch` 仍含 `feature/control-center-server`。
|
||||
- **实际输出**:merge-base `adb48c8`;落后 136 commits;自身 11 commits;分支未删除、未合并。
|
||||
- **评价判定**:PASS。仅记录事实与建议。
|
||||
- **性能与耗时**:可忽略。
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
未执行 `go test -v ./...`。理由:相对 `a88ed85` 的变更仅三份 Markdown(另加本报告),无编译单元。防误伤证据为上一节 `git diff --name-only` 与扩展名过滤为空。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
达到本波「编排确认」合并标准:文档已落盘,能力状态未伪装完成,红线未动。后续触发点仍是用户授权(SWBOOT-10 / FAV live / D7 签字 / Control Center 取舍)或收益认领(T4 U1、T5、T6、T8),不在本波实施。未 push。
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"key": "workflow.allow_author_only_approval",
|
||||
"value": true,
|
||||
"revision": 1,
|
||||
"note": "dev pilot enabled; test/main not promoted"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"key": "workflow.allow_author_only_approval",
|
||||
"value": false,
|
||||
"revision": 0
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{"key":"workflow.allow_author_only_approval","label":"允许编制人兼任审核批准","group":"workflow","type":"bool","value":true,"default":false,"writable":true,"requiresRestart":false,"description":"授权新配置:开启后项目创建者可在激活前为文档启用编制人兼任。关闭后禁止新启用/激活兼任规划;已激活实例按冻结职责继续执行,不作为紧急熔断。","revision":1,"updatedAt":"2026-09-17T14:03:22.990984Z","updatedBy":9}
|
||||
|
||||
HTTP 200
|
||||
@@ -0,0 +1 @@
|
||||
{"id":293,"doc_id":"doc_proj6425_rd_design_input_spec","project_id":6425,"task_key":"rd_design_input_spec","title":"设计输入规格书","stage":"RD03_design_input","version":1,"current_state":"drafting","is_locked":false,"is_template_only":false,"content_sha256":"3b763a3488dbd4fab8d7793f90b46f3373457f3745f3906b3c33e2bd39af39dc","work_dir":"/app/data/workspaces/bizdev/rd_design_input_spec_1789635960900711737","author_id":9,"author_name":"系统管理员","reviewer_id":9,"reviewer_name":"系统管理员","approver_id":9,"approver_name":"系统管理员","duty_locked":true,"duty_policy":"author_only","author_claimed":true,"author_claimed_at":"2026-09-17T13:34:38.964259Z","author_last_viewed_at":"2026-09-17T13:47:35.879256Z","author_last_edited_at":null,"reviewer_claimed":false,"reviewer_claimed_at":null,"approver_claimed":false,"approver_claimed_at":null,"last_rejected_reason":"","last_rejected_by_role":"","last_rejected_by_name":"","last_rejected_at":null,"approved_at":null,"config":{"reject_rollback_to":"drafting","allow_approver_to_reviewer":true,"require_author_confirm_on_reject":true},"created_at":"2026-09-17T09:06:00.895726Z","updated_at":"2026-09-17T13:47:35.879256Z"}
|
||||
@@ -0,0 +1,3 @@
|
||||
{"id":293,"doc_id":"doc_proj6425_rd_design_input_spec","project_id":6425,"task_key":"rd_design_input_spec","title":"设计输入规格书","stage":"RD03_design_input","version":1,"current_state":"drafting","is_locked":false,"is_template_only":false,"content_sha256":"3b763a3488dbd4fab8d7793f90b46f3373457f3745f3906b3c33e2bd39af39dc","work_dir":"/app/data/workspaces/bizdev/rd_design_input_spec_1789635960900711737","author_id":9,"author_name":"系统管理员","reviewer_id":9,"reviewer_name":"系统管理员","approver_id":9,"approver_name":"系统管理员","duty_locked":true,"duty_policy":"author_only","author_claimed":true,"author_claimed_at":"2026-09-17T13:34:38.964259Z","author_last_viewed_at":"2026-09-17T14:10:56.545668337Z","author_last_edited_at":null,"reviewer_claimed":false,"reviewer_claimed_at":null,"approver_claimed":false,"approver_claimed_at":null,"last_rejected_reason":"","last_rejected_by_role":"","last_rejected_by_name":"","last_rejected_at":null,"approved_at":null,"config":{"reject_rollback_to":"drafting","allow_approver_to_reviewer":true,"require_author_confirm_on_reject":true},"created_at":"2026-09-17T09:06:00.895726Z","updated_at":"2026-09-17T14:10:56.545668337Z"}
|
||||
|
||||
HTTP 200
|
||||
@@ -0,0 +1,3 @@
|
||||
{"id":139,"proposal_id":"prop_rd_design_input_spec_1789654256551680649","doc_id":"doc_proj6425_rd_design_input_spec","project_id":6425,"triggered_by":"http_smoke","proposed_changes":"补充设计输入 EMC 共模抑制指标","impact_analysis":"影响原理图滤波网络","risk_assessment":"低风险","status":"pending_author_approval","author_decision_reason":"","decided_at":null,"created_at":"2026-09-17T14:10:56.551684908Z"}
|
||||
|
||||
HTTP 200
|
||||
@@ -0,0 +1,3 @@
|
||||
{"id":139,"proposal_id":"prop_rd_design_input_spec_1789654256551680649","doc_id":"doc_proj6425_rd_design_input_spec","project_id":6425,"triggered_by":"http_smoke","proposed_changes":"补充设计输入 EMC 共模抑制指标","impact_analysis":"影响原理图滤波网络","risk_assessment":"低风险","status":"approved_by_author","author_decision_reason":"HTTP 冒烟批准","decided_at":"2026-09-17T14:10:56.576516211Z","created_at":"2026-09-17T14:10:56.551684908Z"}
|
||||
|
||||
HTTP 200
|
||||
@@ -0,0 +1,5 @@
|
||||
proposal_id | status | changes
|
||||
-----------------------------------------------+--------------------+-------------------------------
|
||||
prop_rd_design_input_spec_1789654256551680649 | approved_by_author | 补充设计输入 EMC 共模抑制指标
|
||||
(1 row)
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
=== claim ===
|
||||
{"id":293,"doc_id":"doc_proj6425_rd_design_input_spec","project_id":6425,"task_key":"rd_design_input_spec","title":"设计输入规格书","stage":"RD03_design_input","version":1,"current_state":"reviewing","is_locked":true,"is_template_only":false,"content_sha256":"3b763a3488dbd4fab8d7793f90b46f3373457f3745f3906b3c33e2bd39af39dc","work_dir":"/app/data/workspaces/bizdev/rd_design_input_spec_1789635960900711737","author_id":9,"author_name":"系统管理员","reviewer_id":9,"reviewer_name":"系统管理员","approver_id":9,"approver_name":"系统管理员","duty_locked":true,"duty_policy":"author_only","author_claimed":true,"author_claimed_at":"2026-09-17T13:34:38.964259543Z","author_last_viewed_at":"2026-09-17T13:35:23.866926066Z","author_last_edited_at":null,"reviewer_claimed":false,"reviewer_claimed_at":null,"approver_claimed":false,"approver_claimed_at":null,"last_rejected_reason":"","last_rejected_by_role":"","last_rejected_by_name":"","last_rejected_at":null,"approved_at":null,"config":{"reject_rollback_to":"drafting","allow_approver_to_reviewer":true,"require_author_confirm_on_reject":true},"created_at":"2026-09-17T09:06:00.895726Z","updated_at":"2026-09-17T13:35:23.866926066Z"}
|
||||
|
||||
HTTP 200
|
||||
|
||||
=== submit ===
|
||||
{"code":"VALIDATION","message":"请求参数无效","request_id":"req_a48e5a5d351af446","error":"submit review failed: docgov: invalid document lifecycle state transition: 无法从【reviewing】阶段提交审核,必须为【drafting】"}
|
||||
|
||||
HTTP 400
|
||||
|
||||
=== review_approve ===
|
||||
{"id":293,"doc_id":"doc_proj6425_rd_design_input_spec","project_id":6425,"task_key":"rd_design_input_spec","title":"设计输入规格书","stage":"RD03_design_input","version":1,"current_state":"approving","is_locked":true,"is_template_only":false,"content_sha256":"3b763a3488dbd4fab8d7793f90b46f3373457f3745f3906b3c33e2bd39af39dc","work_dir":"/app/data/workspaces/bizdev/rd_design_input_spec_1789635960900711737","author_id":9,"author_name":"系统管理员","reviewer_id":9,"reviewer_name":"系统管理员","approver_id":9,"approver_name":"系统管理员","duty_locked":true,"duty_policy":"author_only","author_claimed":true,"author_claimed_at":"2026-09-17T13:34:38.964259543Z","author_last_viewed_at":"2026-09-17T13:35:23.866926066Z","author_last_edited_at":null,"reviewer_claimed":false,"reviewer_claimed_at":null,"approver_claimed":false,"approver_claimed_at":null,"last_rejected_reason":"","last_rejected_by_role":"","last_rejected_by_name":"","last_rejected_at":null,"approved_at":null,"config":{"reject_rollback_to":"drafting","allow_approver_to_reviewer":true,"require_author_confirm_on_reject":true},"created_at":"2026-09-17T09:06:00.895726Z","updated_at":"2026-09-17T13:35:23.888196734Z"}
|
||||
|
||||
HTTP 200
|
||||
|
||||
=== approver_approve ===
|
||||
{"id":293,"doc_id":"doc_proj6425_rd_design_input_spec","project_id":6425,"task_key":"rd_design_input_spec","title":"设计输入规格书","stage":"RD03_design_input","version":1,"current_state":"approved","is_locked":true,"is_template_only":false,"content_sha256":"3b763a3488dbd4fab8d7793f90b46f3373457f3745f3906b3c33e2bd39af39dc","work_dir":"/app/data/workspaces/bizdev/rd_design_input_spec_1789635960900711737","author_id":9,"author_name":"系统管理员","reviewer_id":9,"reviewer_name":"系统管理员","approver_id":9,"approver_name":"系统管理员","duty_locked":true,"duty_policy":"author_only","author_claimed":true,"author_claimed_at":"2026-09-17T13:34:38.964259543Z","author_last_viewed_at":"2026-09-17T13:35:23.866926066Z","author_last_edited_at":null,"reviewer_claimed":false,"reviewer_claimed_at":null,"approver_claimed":false,"approver_claimed_at":null,"last_rejected_reason":"","last_rejected_by_role":"","last_rejected_by_name":"","last_rejected_at":null,"approved_at":"2026-09-17T13:35:23.898240156Z","config":{"reject_rollback_to":"drafting","allow_approver_to_reviewer":true,"require_author_confirm_on_reject":true},"created_at":"2026-09-17T09:06:00.895726Z","updated_at":"2026-09-17T13:35:23.898240156Z"}
|
||||
|
||||
HTTP 200
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
=== negative review by lizhuguan ===
|
||||
{"error":"DOC_DUTY_FORBIDDEN","message":"当前用户不是该文档的对应职责人"}
|
||||
HTTP 403
|
||||
|
||||
=== negative approve by lizhuguan ===
|
||||
{"error":"DOC_DUTY_FORBIDDEN","message":"当前用户不是该文档的对应职责人"}
|
||||
HTTP 403
|
||||
@@ -0,0 +1,49 @@
|
||||
PASS login_via_api_and_inject_session
|
||||
PASS open_project_and_doc
|
||||
PASS assert_author_only_badge_or_actions
|
||||
PASS click_claim_if_present
|
||||
PASS click_submit_if_present
|
||||
PASS click_review_pass_if_present
|
||||
PASS click_approve_if_present
|
||||
DONE [
|
||||
{
|
||||
"step": "login_via_api_and_inject_session",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": "open_project_and_doc",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": "visibility_probe",
|
||||
"hasBadge": true,
|
||||
"hasClaim": true,
|
||||
"hasSubmit": true,
|
||||
"hasReview": false,
|
||||
"hasApprove": true
|
||||
},
|
||||
{
|
||||
"step": "assert_author_only_badge_or_actions",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": "click_claim_if_present",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": "click_submit_if_present",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": "click_review_pass_if_present",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"finalHasApproved": false,
|
||||
"finalHasBadge": true
|
||||
},
|
||||
{
|
||||
"step": "click_approve_if_present",
|
||||
"ok": true
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,42 @@
|
||||
[
|
||||
{
|
||||
"step": "login_via_api_and_inject_session",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": "open_project_and_doc",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": "visibility_probe",
|
||||
"hasBadge": true,
|
||||
"hasClaim": true,
|
||||
"hasSubmit": true,
|
||||
"hasReview": false,
|
||||
"hasApprove": true
|
||||
},
|
||||
{
|
||||
"step": "assert_author_only_badge_or_actions",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": "click_claim_if_present",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": "click_submit_if_present",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": "click_review_pass_if_present",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"finalHasApproved": false,
|
||||
"finalHasBadge": true
|
||||
},
|
||||
{
|
||||
"step": "click_approve_if_present",
|
||||
"ok": true
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"hasBadge": true,
|
||||
"hasClaim": true,
|
||||
"hasSubmit": true,
|
||||
"hasReview": false,
|
||||
"hasApprove": true
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
doc_id | current_state | author_id | reviewer_id | approver_id | duty_policy | approved
|
||||
-----------------------------------+---------------+-----------+-------------+-------------+-------------+----------
|
||||
doc_proj6425_rd_design_input_spec | approved | 9 | 9 | 9 | author_only | t
|
||||
(1 row)
|
||||
|
||||
action | actor_id | actor_role | from_state | to_state | duty_policy | created_at
|
||||
----------------------+----------+------------+------------+-----------+-------------+-------------------------------
|
||||
author_claim_by_view | 9 | author | drafting | drafting | | 2026-09-17 13:32:15.236502+00
|
||||
submit_review | 9 | author | drafting | reviewing | | 2026-09-17 13:32:15.249254+00
|
||||
author_claim_by_view | 9 | author | drafting | drafting | | 2026-09-17 13:34:38.964259+00
|
||||
submit_review | 9 | author | drafting | reviewing | author_only | 2026-09-17 13:34:38.977397+00
|
||||
author_view | 9 | author | reviewing | reviewing | | 2026-09-17 13:35:23.866926+00
|
||||
review_approve | 9 | reviewer | reviewing | approving | author_only | 2026-09-17 13:35:23.888196+00
|
||||
approver_approve | 9 | approver | approving | approved | author_only | 2026-09-17 13:35:23.89824+00
|
||||
(7 rows)
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
current_state | duty_policy | author_id | reviewer_id | approver_id | ok
|
||||
---------------+-------------+-----------+-------------+-------------+----
|
||||
drafting | author_only | 9 | 9 | 9 | f
|
||||
(1 row)
|
||||
|
||||
action | actor_role | from_state | to_state | duty_policy
|
||||
-------------+------------+------------+----------+-------------
|
||||
author_view | author | approved | approved |
|
||||
(1 row)
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
doc_id | author_id | reviewer_id | approver_id | current_state | author_claimed | is_locked
|
||||
-----------------------------------+-----------+-------------+-------------+---------------+----------------+-----------
|
||||
doc_proj6425_rd_design_input_spec | 9 | 9 | 9 | reviewing | t | t
|
||||
(1 row)
|
||||
|
||||
action | actor_id | actor_role | from_state | to_state | details | created_at
|
||||
----------------------+----------+------------+------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------
|
||||
submit_review | 9 | author | drafting | reviewing | {"timestamp": "2026-09-17T13:32:15.249254245Z"} | 2026-09-17 13:32:15.249254+00
|
||||
author_claim_by_view | 9 | author | drafting | drafting | {"timestamp": "2026-09-17T13:32:15.236502234Z", "author_claimed": true, "is_template_only": false} | 2026-09-17 13:32:15.236502+00
|
||||
lease_release | 0 | system | drafting | drafting | {"holder_id": "run_1789635960880707641", "holder_type": "squad"} | 2026-09-17 09:13:28.349389+00
|
||||
lease_acquire | 0 | system | drafting | drafting | {"ttl": "1h0m0s", "work_dir": "", "holder_id": "run_1789635960880707641", "expires_at": "2026-09-17T10:06:00.897192081Z", "holder_type": "squad"} | 2026-09-17 09:06:00.897468+00
|
||||
(4 rows)
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"userId": 9,
|
||||
"env": "dev"
|
||||
}
|
||||
|
After Width: | Height: | Size: 202 KiB |
|
After Width: | Height: | Size: 379 KiB |
|
After Width: | Height: | Size: 258 KiB |
|
After Width: | Height: | Size: 304 KiB |
|
After Width: | Height: | Size: 304 KiB |
|
After Width: | Height: | Size: 304 KiB |
|
After Width: | Height: | Size: 316 KiB |
|
After Width: | Height: | Size: 316 KiB |
|
After Width: | Height: | Size: 316 KiB |
@@ -0,0 +1,151 @@
|
||||
import { chromium } from 'playwright';
|
||||
import fs from 'fs';
|
||||
|
||||
const base = process.env.U6_BASE || 'http://127.0.0.1:5173';
|
||||
const api = process.env.U6_API || 'http://127.0.0.1:8080';
|
||||
const user = process.env.U6_USER || 'admin';
|
||||
const pass = process.env.U6_PASS || '';
|
||||
const asset = process.env.U6_ASSET;
|
||||
const docTitle = '设计输入规格书';
|
||||
const projectHint = process.env.U6_PROJECT || 'rdev-s0-6425';
|
||||
|
||||
const browser = await chromium.launch({ headless: true });
|
||||
const page = await browser.newPage({ viewport: { width: 1440, height: 900 } });
|
||||
const log = [];
|
||||
const step = async (name, fn) => {
|
||||
try {
|
||||
await fn();
|
||||
log.push({ step: name, ok: true });
|
||||
console.log('PASS', name);
|
||||
} catch (e) {
|
||||
log.push({ step: name, ok: false, error: String(e) });
|
||||
console.log('FAIL', name, e);
|
||||
throw e;
|
||||
}
|
||||
};
|
||||
|
||||
await step('login_via_api_and_inject_session', async () => {
|
||||
const loginResp = await page.request.post(`${api}/api/v1/auth/login`, {
|
||||
data: { username: user, password: pass },
|
||||
});
|
||||
if (!loginResp.ok()) {
|
||||
throw new Error(`login HTTP ${loginResp.status()} ${await loginResp.text()}`);
|
||||
}
|
||||
const raw = await loginResp.json();
|
||||
// Map snake_case user → frontend UserProfile-ish session (mapLoginResult equivalent)
|
||||
const u = raw.user || {};
|
||||
const session = {
|
||||
token: raw.token,
|
||||
user: {
|
||||
id: u.id,
|
||||
username: u.username,
|
||||
name: u.name,
|
||||
status: u.status,
|
||||
roleId: u.role_id,
|
||||
position: u.position,
|
||||
employeeId: u.employee_id,
|
||||
department: u.department,
|
||||
mustChangePassword: !!u.must_change_password,
|
||||
},
|
||||
mustChangePassword: !!raw.must_change_password,
|
||||
env: raw.env,
|
||||
capabilities: raw.capabilities || [],
|
||||
};
|
||||
await page.goto(base, { waitUntil: 'domcontentloaded', timeout: 60000 });
|
||||
await page.evaluate((s) => {
|
||||
localStorage.setItem('smdf_auth_session', JSON.stringify(s));
|
||||
}, session);
|
||||
await page.goto(base, { waitUntil: 'networkidle', timeout: 60000 });
|
||||
await page.waitForTimeout(2000);
|
||||
await page.screenshot({ path: `${asset}/screenshots/02-after-login.png`, fullPage: true });
|
||||
const body = await page.locator('body').innerText();
|
||||
if (body.includes('进入医疗协同工作台')) {
|
||||
throw new Error('session inject failed, still on login');
|
||||
}
|
||||
fs.writeFileSync(`${asset}/injected-session-meta.json`, JSON.stringify({ userId: session.user.id, env: session.env }, null, 2));
|
||||
});
|
||||
|
||||
await step('open_project_and_doc', async () => {
|
||||
// Click project session rdev-s0-6425
|
||||
const proj = page.getByText(projectHint, { exact: false }).first();
|
||||
await proj.waitFor({ timeout: 20000 });
|
||||
await proj.click();
|
||||
await page.waitForTimeout(2500);
|
||||
await page.screenshot({ path: `${asset}/screenshots/02b-project.png`, fullPage: true });
|
||||
|
||||
// Ensure workflow/controlled category
|
||||
for (const label of ['受控交付物', '工作流文档', '工程文档', '受控']) {
|
||||
const tab = page.getByText(label, { exact: false }).first();
|
||||
if (await tab.count()) {
|
||||
await tab.click().catch(() => {});
|
||||
await page.waitForTimeout(500);
|
||||
}
|
||||
}
|
||||
|
||||
const doc = page.getByText(docTitle, { exact: false }).first();
|
||||
await doc.waitFor({ timeout: 30000 });
|
||||
await doc.click();
|
||||
await page.waitForTimeout(3500);
|
||||
await page.screenshot({ path: `${asset}/screenshots/03-doc-open.png`, fullPage: true });
|
||||
});
|
||||
|
||||
await step('assert_author_only_badge_or_actions', async () => {
|
||||
const text = await page.locator('body').innerText();
|
||||
const hasBadge = text.includes('编制人兼任');
|
||||
const hasClaim = /认领/.test(text);
|
||||
const hasSubmit = /送审|提交审核/.test(text);
|
||||
const hasReview = /审核通过/.test(text);
|
||||
const hasApprove = /终审批准|批准/.test(text);
|
||||
const probe = { hasBadge, hasClaim, hasSubmit, hasReview, hasApprove };
|
||||
log.push({ step: 'visibility_probe', ...probe });
|
||||
fs.writeFileSync(`${asset}/browser-visibility.json`, JSON.stringify(probe, null, 2));
|
||||
await page.screenshot({ path: `${asset}/screenshots/04-action-bar.png`, fullPage: true });
|
||||
if (!hasBadge && !hasClaim && !hasSubmit) {
|
||||
throw new Error('no author_only badge or claim/submit actions visible; body head=' + text.slice(0, 600));
|
||||
}
|
||||
});
|
||||
|
||||
await step('click_claim_if_present', async () => {
|
||||
const claim = page.getByRole('button', { name: /认领/ }).first();
|
||||
if (await claim.count()) {
|
||||
await claim.click();
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
await page.screenshot({ path: `${asset}/screenshots/05-after-claim.png`, fullPage: true });
|
||||
});
|
||||
|
||||
await step('click_submit_if_present', async () => {
|
||||
const submit = page.getByRole('button', { name: /送审|提交审核/ }).first();
|
||||
if (await submit.count()) {
|
||||
await submit.click();
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
await page.screenshot({ path: `${asset}/screenshots/06-after-submit.png`, fullPage: true });
|
||||
});
|
||||
|
||||
await step('click_review_pass_if_present', async () => {
|
||||
const passBtn = page.getByRole('button', { name: /审核通过|通过审核/ }).first();
|
||||
if (await passBtn.count()) {
|
||||
await passBtn.click();
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
await page.screenshot({ path: `${asset}/screenshots/07-after-review.png`, fullPage: true });
|
||||
});
|
||||
|
||||
await step('click_approve_if_present', async () => {
|
||||
const appr = page.getByRole('button', { name: /终审批准|批准生效/ }).first();
|
||||
if (await appr.count()) {
|
||||
await appr.click();
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
const text = await page.locator('body').innerText();
|
||||
log.push({
|
||||
finalHasApproved: text.includes('已终审'),
|
||||
finalHasBadge: text.includes('编制人兼任'),
|
||||
});
|
||||
await page.screenshot({ path: `${asset}/screenshots/08-after-approve.png`, fullPage: true });
|
||||
});
|
||||
|
||||
fs.writeFileSync(`${asset}/browser-e2e-log.json`, JSON.stringify(log, null, 2));
|
||||
await browser.close();
|
||||
console.log('DONE', JSON.stringify(log, null, 2));
|
||||
@@ -0,0 +1,545 @@
|
||||
{
|
||||
"project_id": 6446,
|
||||
"lifecycle_status": "active",
|
||||
"active_workflow_key": "rdev",
|
||||
"instance": {
|
||||
"id": 313,
|
||||
"project_id": 6446,
|
||||
"workflow_version_id": 100,
|
||||
"instance_no": 2,
|
||||
"status": "active",
|
||||
"config_revision": 2,
|
||||
"plan_hash": "264da49fe4a7e69e3e275e9b85dc9a5031bd0c61383d0690632309643d605270",
|
||||
"config_snapshot": {
|
||||
"workflow_definition_key": "rdev",
|
||||
"workflow_version": 3,
|
||||
"workflow_version_id": 100,
|
||||
"stages": [
|
||||
{
|
||||
"stage_key": "RD01_planning",
|
||||
"stage_name": "01 设计和开发策划",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_design_plan",
|
||||
"task_title": "设计开发计划任务书",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_proposal",
|
||||
"task_title": "项目建议书",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "RD02_planning_review",
|
||||
"stage_name": "02 策划评审",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_planning_review",
|
||||
"task_title": "设计和开发策划评审记录",
|
||||
"enabled": true,
|
||||
"approval_configurable": true,
|
||||
"duties": {
|
||||
"author_user_id": 9,
|
||||
"reviewer_user_id": 11,
|
||||
"approver_user_id": 12
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "RD03_design_input",
|
||||
"stage_name": "03 设计输入",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_adverse_events",
|
||||
"task_title": "同类产品不良事件信息",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_design_input_list",
|
||||
"task_title": "设计输入清单",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_design_input_spec",
|
||||
"task_title": "设计输入规格书",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_hazard_analysis",
|
||||
"task_title": "安全性问题清单及可能危险分析表",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_regs_stds",
|
||||
"task_title": "法规和标准清单",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_risk_plan",
|
||||
"task_title": "风险管理计划",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_sw_config",
|
||||
"task_title": "软件配置及维护计划",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_sw_plan",
|
||||
"task_title": "软件开发计划",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_sw_reqs",
|
||||
"task_title": "软件需求规格书",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_system_design",
|
||||
"task_title": "系统设计方案",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_system_reqs",
|
||||
"task_title": "系统需求规格书",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_user_needs",
|
||||
"task_title": "用户需求规格书",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "RD04_requirements_review",
|
||||
"stage_name": "04 需求评审",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_req_review",
|
||||
"task_title": "需求评审记录",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "RD05_input_phase_review",
|
||||
"stage_name": "05 输入阶段评审",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_input_phase_review",
|
||||
"task_title": "设计开发评审记录(阶段3和4)",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "RD06_design_output",
|
||||
"stage_name": "06 设计输出",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_design_output_list",
|
||||
"task_title": "设计输出清单",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_drawings_3d",
|
||||
"task_title": "2D图纸和3D模型",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_ee_bom",
|
||||
"task_title": "电子电气BOM",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_electrical_sys",
|
||||
"task_title": "系统电气设计图",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_fqc",
|
||||
"task_title": "成品检验规范",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_ifu",
|
||||
"task_title": "产品使用说明书",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_incoming_iqc",
|
||||
"task_title": "原材料进货检验规范",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_ipqc",
|
||||
"task_title": "生产过程检验规范",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_packaging",
|
||||
"task_title": "包装图纸和设计要求",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_pcba",
|
||||
"task_title": "PCBA原理图及Layout",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_process_flow",
|
||||
"task_title": "工艺流程图及作业指导",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_product_bom",
|
||||
"task_title": "产品BOM",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_purchase_spec",
|
||||
"task_title": "采购技术规范",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_risk_report",
|
||||
"task_title": "风险管理报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_sw_arch",
|
||||
"task_title": "软件概要设计方案",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_sw_ui",
|
||||
"task_title": "软件UI设计文档",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_tech_req",
|
||||
"task_title": "产品技术要求",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "RD07_output_review",
|
||||
"stage_name": "07 输出评审",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_output_review",
|
||||
"task_title": "设计开发评审记录(阶段6)",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "RD08_verification",
|
||||
"stage_name": "08 验证",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_biocompatibility",
|
||||
"task_title": "生物学检测方案",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_cleaning",
|
||||
"task_title": "清洁消毒验证方案",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_design_vv",
|
||||
"task_title": "设计验证方案",
|
||||
"enabled": true,
|
||||
"approval_configurable": true,
|
||||
"duties": {
|
||||
"author_user_id": 9,
|
||||
"reviewer_user_id": 11,
|
||||
"approver_user_id": 12
|
||||
}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_emc_safety",
|
||||
"task_title": "EMC及安规摸底报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_lifetime",
|
||||
"task_title": "产品使用期限研究方案",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_prototype_photos",
|
||||
"task_title": "样机照片",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_qualified_suppliers",
|
||||
"task_title": "合格供方名录",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_risk_report_v",
|
||||
"task_title": "风险管理报告(验证阶段)",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_shelf_life",
|
||||
"task_title": "货架寿命方案",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_sw_release",
|
||||
"task_title": "软件发布清单",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_sw_sys_test",
|
||||
"task_title": "软件系统测试报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_sw_unit_test",
|
||||
"task_title": "软件单元测试报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "RD09_verification_review",
|
||||
"stage_name": "09 验证评审",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_verification_review",
|
||||
"task_title": "设计开发评审记录(验证阶段)",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "RD10_transfer",
|
||||
"stage_name": "10 转换",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_dmr_list",
|
||||
"task_title": "DMR文件清单",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_pack_ship",
|
||||
"task_title": "包装运输方案",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_risk_report_t",
|
||||
"task_title": "风险管理报告(转换阶段)",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "RD11_transfer_review",
|
||||
"stage_name": "11 转换评审",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_transfer_review",
|
||||
"task_title": "设计开发评审记录(转换阶段)",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "RD12_validation",
|
||||
"stage_name": "12 确认",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_animal_study",
|
||||
"task_title": "动物试验方案",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_clinical",
|
||||
"task_title": "临床试验报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_risk_report_val",
|
||||
"task_title": "风险管理报告(确认阶段)",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_sw_quality",
|
||||
"task_title": "软件质量测试报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_use_error",
|
||||
"task_title": "使用错误评估报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_user_test",
|
||||
"task_title": "用户测试报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "rd_validation_plan",
|
||||
"task_title": "设计确认方案",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "RD13_validation_report",
|
||||
"stage_name": "13 设计确认报告",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "rd_design_validation_report",
|
||||
"task_title": "设计确认报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"activated_by": 9,
|
||||
"activated_at": "2026-09-17T15:00:11.775973Z",
|
||||
"created_by": 9,
|
||||
"created_at": "2026-09-17T15:00:11.766378Z",
|
||||
"updated_at": "2026-09-17T15:00:11.775973Z"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"run_id": "run_1789659737006754850",
|
||||
"final": {
|
||||
"RunID": "run_1789659737006754850",
|
||||
"SessionID": "sess-6446-rd_design_vv-1789659737",
|
||||
"ProjectID": 6446,
|
||||
"UserID": 9,
|
||||
"ClientTurnID": "s1c-rd_design_vv-1789659737",
|
||||
"IdempotencyKey": "turn:sess-6446-rd_design_vv-1789659737:s1c-rd_design_vv-1789659737",
|
||||
"TaskKey": "rd_design_vv",
|
||||
"Stage": "",
|
||||
"WorkflowInstanceID": 313,
|
||||
"StageInstanceID": 474,
|
||||
"WorkflowStageKey": "RD08_verification",
|
||||
"Status": "completed",
|
||||
"WorkspaceID": "/app/data/workspaces/bizdev/rd_design_vv_1789659737031008380",
|
||||
"AssistantMsgID": 3506,
|
||||
"WorkerID": "",
|
||||
"LeaseExpiresAt": null,
|
||||
"CreatedAt": "2026-09-17T15:42:17.006873196Z",
|
||||
"UpdatedAt": "2026-09-17T15:49:04.391513412Z",
|
||||
"ErrorMessage": "",
|
||||
"Attempt": 1,
|
||||
"resumable": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"run_id": "run_1789659444252241483",
|
||||
"final": {
|
||||
"RunID": "run_1789659444252241483",
|
||||
"SessionID": "sess-6446-rd_planning_review-1789659444",
|
||||
"ProjectID": 6446,
|
||||
"UserID": 9,
|
||||
"ClientTurnID": "s1c-rd_planning_review-1789659444",
|
||||
"IdempotencyKey": "turn:sess-6446-rd_planning_review-1789659444:s1c-rd_planning_review-1789659444",
|
||||
"TaskKey": "rd_planning_review",
|
||||
"Stage": "",
|
||||
"WorkflowInstanceID": 313,
|
||||
"StageInstanceID": 468,
|
||||
"WorkflowStageKey": "RD02_planning_review",
|
||||
"Status": "completed",
|
||||
"WorkspaceID": "/app/data/workspaces/bizdev/rd_planning_review_1789659444283436327",
|
||||
"AssistantMsgID": 3504,
|
||||
"WorkerID": "",
|
||||
"LeaseExpiresAt": null,
|
||||
"CreatedAt": "2026-09-17T15:37:24.25235581Z",
|
||||
"UpdatedAt": "2026-09-17T15:42:06.721852661Z",
|
||||
"ErrorMessage": "",
|
||||
"Attempt": 1,
|
||||
"resumable": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"id": 6446,
|
||||
"code": "rdev-s1c-pi--b8edb465",
|
||||
"name": "rdev-s1c-pi-1789657210",
|
||||
"customer_name": "",
|
||||
"device_type": "",
|
||||
"intended_use": "",
|
||||
"target_market": "",
|
||||
"product_domain": "medical_device",
|
||||
"current_stage": "V0.1_triage",
|
||||
"environment": "dev",
|
||||
"status": "active",
|
||||
"creator_user_id": 9,
|
||||
"lifecycle_status": "planning",
|
||||
"active_workflow_key": "",
|
||||
"workflow_selection_version": 1,
|
||||
"workflow_plan_revision": 0,
|
||||
"created_at": "2026-09-17T15:00:10.57397553Z",
|
||||
"updated_at": "2026-09-17T15:00:10.57397553Z"
|
||||
}
|
||||
@@ -0,0 +1,336 @@
|
||||
# 设计验证方案(RD-VV)
|
||||
|
||||
| 属性 | 内容 |
|
||||
|---|---|
|
||||
| 项目编号 | rdev-s1c-pi-1789657210 |
|
||||
| 文件编号 | RD-VV |
|
||||
| 记录归属 | DHF(设计历史文件) |
|
||||
| 版本 | A |
|
||||
| 编制日期 | 2026-09-17 |
|
||||
| 目标市场 | 中国 NMPA |
|
||||
| 产品类型 | 二类有源医疗器械(神经刺激) |
|
||||
|
||||
---
|
||||
|
||||
## 结论
|
||||
|
||||
**适用。本文件基于现有 4 份材料建立设计验证摸底方案的完整框架,可支撑研发阶段台架验证活动的规划与执行。**
|
||||
|
||||
核心结论如下:
|
||||
|
||||
1. **验证范围确定**:本次验证聚焦「刺激强度步进精度」与「过流保护功能」两项关键性能,覆盖台架试验与电气安全摸底,方法与判定标准框架已建立。〔来源:`brief.md`〕
|
||||
|
||||
2. **关键合规风险**:判定标准「强度误差 ≤ 10%」缺乏设计输入文件或行业标准条款的明确背书,若无溯源依据,型检阶段可能被检测机构或审评员质疑,列为本项目技术风险第 1 项(高优先级)。〔来源:工程师分析〕
|
||||
|
||||
3. **上游输入缺口阻塞**:设计和开发策划评审记录、用户初始需求收集表正文内容不可查阅,无法建立完整的 DHF 追溯链,须在后续任务中补齐。〔来源:`decision_decision_0.md`、`decision_decision_1.md`〕
|
||||
|
||||
4. **摸底与型检边界**:本方案覆盖研发摸底阶段,不等同 NMPA 型检。正式型检须在有 CMA 资质的检测机构按 GB 9706.1 全项执行,两者不可混用。〔来源:工程师分析〕
|
||||
|
||||
---
|
||||
|
||||
## 适用性
|
||||
|
||||
| 评估项 | 结论 | 依据 |
|
||||
|---|---|---|
|
||||
| 本文件适用性 | **适用** | 项目处于设计和开发验证阶段(08 阶段),已有明确验证意图(刺激强度步进、过流保护)、方法(台架试验、电气安全摸底)和判定标准(强度误差 ≤ 10%),具备编制设计验证方案的事实基础 |
|
||||
| DHF 追溯关联性 | **适用** | 可建立初步追溯路径:目的 ← 设计和开发策划(待补)← 用户初始需求(待补);目的 → 风险控制措施验证(待补)→ 后续设计确认 |
|
||||
| ISO 13485 设计控制合规 | **适用** | 符合 ISO 13485:2016 §7.3.3(设计验证)要求,可作为设计验证活动的规划文件 |
|
||||
| 型检替代性 | **不适用** | 本方案为研发摸底验证,非 CMA 型检,不能替代注册检验报告 |
|
||||
| 临床确认替代性 | **不适用** | 本方案为台架性能验证,不涉及临床验证或设计确认 |
|
||||
| 软件/EMC 验证覆盖 | **不适用** | 本方案不包含软件验证(须单独编制软件验证方案)和电磁兼容验证(须按 YY 0505 另行规划) |
|
||||
|
||||
**适用性结论**:本文件适用于当前研发摸底阶段,须在设计输入文件完备、风险管理文档完成后进行版本更新,以支撑正式设计验证。
|
||||
|
||||
---
|
||||
|
||||
## 目的与范围
|
||||
|
||||
### 2.1 结论句
|
||||
|
||||
**本方案旨在通过台架试验与电气安全摸底,验证无创神经电刺激产品的「刺激强度步进精度」与「过流保护功能」两项关键设计特性,为后续正式设计验证提供数据基线,并满足 ISO 13485 设计验证活动的规划要求。**
|
||||
|
||||
### 2.2 目的详述
|
||||
|
||||
| ID | 目的分解 | 内容 | 优先级 |
|
||||
|---|---|---|---|
|
||||
| RD-VV-S-001a | 核心目的 | 验证刺激强度步进输出精度,确认设备能按档位精确输出电刺激强度 | P0 |
|
||||
| RD-VV-S-001b | 核心目的 | 验证过流保护功能的动作可靠性,确认异常工况下设备能在规定时限内可靠断电 | P0 |
|
||||
| RD-VV-S-001c | 支撑目的 | 通过电气安全基础检查,排除直接电气安全危害风险,为型检提供预检数据 | P1 |
|
||||
| RD-VV-S-001d | 管理目的 | 满足 ISO 13485:2016 §7.3.3 设计验证要求,建立 DHF 可追溯链 | P1 |
|
||||
|
||||
### 2.3 范围界定
|
||||
|
||||
| ID | 范围项 | 内容 |
|
||||
|---|---|---|
|
||||
| RD-VV-S-002a | 适用对象 | 水木东方测试客户项目的无创神经电刺激产品样机(型号待确认) |
|
||||
| RD-VV-S-002b | 适用阶段 | 研发实验室环境台架摸底阶段(08 验证) |
|
||||
| RD-VV-S-002c | 验证类型 | 台架试验 + 电气安全摸底(研发阶段,非 CMA 型检) |
|
||||
|
||||
### 2.4 不适用边界
|
||||
|
||||
| ID | 不适用场景 | 理由 |
|
||||
|---|---|---|
|
||||
| RD-VV-S-003a | 正式型检 | 须在有 CMA 资质的检测机构完成,适用 GB 9706.1 全项,本方案不可替代 |
|
||||
| RD-VV-S-003b | 临床验证 | 须按临床试验管理要求另行规划,不在本方案覆盖范围 |
|
||||
| RD-VV-S-003c | 电磁兼容(EMC)验证 | 须按 YY 0505-2012 另行编制专项验证方案 |
|
||||
| RD-VV-S-003d | 软件验证 | 须按 GB/T 25000 系列另行编制软件验证方案 |
|
||||
| RD-VV-S-003e | 长期耐久性验证 | 须按设计寿命规划另行安排,不在本阶段范围 |
|
||||
|
||||
> **注**:不适用边界由工程师根据项目所处阶段(摸底阶段)与产品分类(二类有源)推断,无直接来源依据,待设计和开发策划评审记录正文补充后确认。〔分析判断,无直接条文依据〕
|
||||
|
||||
### 2.5 通俗版说明
|
||||
|
||||
本产品是一个无创电刺激设备,通过贴在皮肤上的电极向神经发送电信号。为了让治疗有效又安全,需要确认两件事:
|
||||
|
||||
1. **强度能精确定档**:医生或用户调高或调低一个档位,设备实际输出的电流/电压变化幅度必须与设定值一致,误差不能超过 10%。这叫「刺激强度步进验证」。
|
||||
2. **出问题时能自动断电**:如果电路出了故障、电流异常增大,设备必须在毫秒级内切断输出,不能让电流持续伤害患者。这叫「过流保护验证」。
|
||||
|
||||
本次摸底用台架(实验室设备)来测试这两点,不上临床。摸底通过了,才能进入正式的产品检测(型检)阶段。
|
||||
|
||||
---
|
||||
|
||||
## 方法与判定标准
|
||||
|
||||
### 3.1 结论句
|
||||
|
||||
**本方案采用台架试验与电气安全摸底相结合的方法,对刺激强度步进精度和过流保护功能进行验证;判定标准为强度误差 ≤ 10%(来源待确认)和过流保护 100% 可靠动作,两项均通过方视为验证通过。**
|
||||
|
||||
### 3.2 验证方法框架
|
||||
|
||||
| 维度 | 内容 | 说明 |
|
||||
|---|---|---|
|
||||
| 验证类型 | 台架试验 + 电气安全摸底 | 研发阶段非正式验证,与 CMA 型检区分 |
|
||||
| 验证目的层级 | 摸底(Exploratory Verification) | 非正式验证(Validation),不用于注册申报 |
|
||||
| 适用阶段 | 设计和开发验证(08 阶段) | 介于设计输入确认与设计确认之间 |
|
||||
| 标准框架参照 | GB 9706.1-2007(安全通用要求);YY 0505-2012(EMC,本次不适用) | EMC 项本次不执行,见 2.4 不适用边界 |
|
||||
|
||||
### 3.3 试验步骤与判定标准明细
|
||||
|
||||
| ID | 方法/步骤 | 判定标准 | 适用条件 | 来源 |
|
||||
|---|---|---|---|---|
|
||||
| RD-VV-M-001 | **刺激强度步进验证**:在额定负载下,依次设置 N 个强度档位,测量各档位实际输出幅度,计算与设定值的相对误差 | 强度误差 ≤ 10%(各档位均须满足) | 额定负载、室温环境、样机 1 台(摸底阶段) | 〔材料:`brief.md`〕(来源依据**待确认**,见 3.5 节) |
|
||||
| RD-VV-M-002 | **过流保护验证**:在输出回路中模拟过流工况,测量保护电路触发时间及断电响应 | 保护电路在规定时限内可靠动作,无失控输出;动作次数 100% 触发(零容忍) | 过流阈值待确认(须从设计输入确定);模拟故障复现 | 〔材料:`brief.md`〕(具体阈值和时限**待确认**) |
|
||||
| RD-VV-M-003 | **电气安全摸底**:按 GB 9706.1 通用要求,对样机进行绝缘、接地、漏电流等基础安全项目检查 | 不得出现直接或间接电气安全危害(具体限值按 GB 9706.1 相关条款) | 样机上电前须完成绝缘目检;发现异常立即停试 | 〔材料:`brief.md`〕(GB 9706.1 条款编号**待确认**) |
|
||||
| RD-VV-M-004 | **设备型号与环境条件记录** | 须记录测量仪器型号、精度、负载规格、环境温湿度 | 须在试验 SOP 中细化(本次**待确认**) | 须实验室记录补充 |
|
||||
|
||||
> **重要说明**:台架试验的步骤细节(仪器选型、负载参数、测量点数量、数据采集频率等)须由研发工程师在试验方案细化时补充,本方案仅提供框架,否则 DHF 无法支撑重复验证。
|
||||
|
||||
### 3.4 强度误差 ≤ 10% 来源分析
|
||||
|
||||
| 分析维度 | 结论 |
|
||||
|---|---|
|
||||
| 是否为 GB 9706.1 明文规定值 | **否**。GB 9706.1 对输出精度无统一规定值;该标准聚焦安全而非性能指标 |
|
||||
| 是否为 YY/T 或行业标准 | **未检索到公开信息**。YY/T 系列神经刺激标准(如 YY/T 0940 等)对输出精度有要求,但具体数值需确认版本与条款 |
|
||||
| 是否为设计输入文件规定值 | **待确认**。须调阅「用户初始需求收集表」或「设计和开发策划评审记录」正文,确认 10% 是否来源于用户需求或设计规范 |
|
||||
| 是否为内部经验值或竞品对标 | **待确认**,工程师自述经验值常见范围为 5%~15%,10% 处于中等严格区间 |
|
||||
|
||||
> **工程师判断**:「强度误差 ≤ 10%」在技术层面属于合理区间,但合规层面须有来源依据才能通过型检。建议下一步从设计输入文件溯源;若无法溯源,应在设计验证报告中说明该值基于「设计确认的临床使用安全阈值推导」,并由项目经理签字确认。
|
||||
|
||||
### 3.5 强度误差 ≤ 10% 溯源路径建议
|
||||
|
||||
| 步骤 | 行动项 | 责任方 | 优先级 |
|
||||
|---|---|---|---|
|
||||
| 第一步 | 调取「设计和开发策划评审记录」正文,确认是否含强度误差指标 | 项目经理 | P0(阻塞) |
|
||||
| 第二步 | 调取「用户初始需求收集表」正文,确认用户需求中是否含性能公差 | 项目经理 | P0(阻塞) |
|
||||
| 第三步 | 检索 YY/T 0940 系列标准(神经刺激类)对应条款 | 研发工程师/合规专员 | P1 |
|
||||
| 第四步 | 若均无依据,组织技术论证会,形成会议纪要并签字 | 项目经理 | P1 |
|
||||
|
||||
---
|
||||
|
||||
## 样本量与统计(如适用)
|
||||
|
||||
### 4.1 结论句
|
||||
|
||||
**本次摸底验证样本量为 1~3 台样机(具体待确认),判定准则为「强度误差 ≤ 10% 适用于全部受测档位」和「过流保护 100% 可靠动作」,采用定性判定(非统计方法)。正式设计验证阶段的样本量和统计方法须在行业标准或设计输入文件中明确。**
|
||||
|
||||
### 4.2 样本量分析
|
||||
|
||||
| ID | 项 | 内容 | 依据 |
|
||||
|---|---|---|---|
|
||||
| RD-VV-N-001a | 摸底阶段样本量 | **待确认(建议 1~3 台)** | 摸底阶段通常取 1~3 台样机;现有材料未规定具体数量 |
|
||||
| RD-VV-N-001b | 正式验证阶段样本量 | **待确认** | 须满足统计要求或参照 YY/T 0940 系列标准规定 |
|
||||
| RD-VV-N-002 | 接受准则 | 强度误差 ≤ 10% 适用于全部受测档位(零容忍,任何一档超标视为不通过);过流保护 100% 触发(零容忍) | 〔材料:`brief.md`〕(档位数量和触发次数**待确认**) |
|
||||
| RD-VV-N-003 | 统计方法 | **本次摸底不适用统计方法**;结果以「符合/不符合」定性记录 | 摸底阶段非正式验证,无需统计 |
|
||||
|
||||
### 4.3 统计方法适用性说明
|
||||
|
||||
| 验证类型 | 统计方法 | 适用条件 | 本方案状态 |
|
||||
|---|---|---|---|
|
||||
| 摸底验证 | 不适用 | 研发初期探索性测试,数据量不足以支撑统计推断 | 本次采用 |
|
||||
| 正式设计验证 | 依据性抽样或全数检验 | 设计输入文件或行业标准有明确规定 | **待确认**,须在后续方案版本中补充 |
|
||||
|
||||
> **工程师注**:若 YY/T 0940 系列标准对神经刺激类产品有明确的输出精度检测要求和样本量规定,应在正式验证方案中引用对应条款。〔标准待检索〕
|
||||
|
||||
---
|
||||
|
||||
## 风险与残余风险关联
|
||||
|
||||
### 5.1 结论句
|
||||
|
||||
**由于风险管理文档(RMF/HHE)正文不可查阅,本方案暂无法建立完整的危害-验证追溯链。现有追溯表为框架结构,须在 RMF 完成后回填具体危害编号、控制措施及残余风险结论。**
|
||||
|
||||
### 5.2 风险-验证追溯链现状
|
||||
|
||||
| ID | 关联危害/控制 | 本方案验证点 | 残余风险结论线索 |
|
||||
|---|---|---|---|
|
||||
| RD-VV-R-001 | **待确认**(H-001 刺激强度超安全阈值,待 RMF 确认) | 刺激强度步进精度验证:确认输出幅度与设定值误差在允许范围内 | 若摸底发现精度超 10%,须回溯设计输入并触发设计变更;残余风险取决于超标幅度和临床暴露场景 |
|
||||
| RD-VV-R-002 | **待确认**(H-002 过流保护失效,待 RMF 确认) | 过流保护功能验证:确认异常时可靠断电 | 若摸底发现保护不动作,须立即停试并启动 CAPA;残余风险为「零容忍」级别,不可降级 |
|
||||
| RD-VV-R-003 | **待确认**(H-003 电气安全危害,待 RMF 确认) | 电气安全摸底:绝缘、接地、漏电流基础检查 | 若摸底发现绝缘异常,须在正式型检前完成整改;残余风险取决于异常类型 |
|
||||
|
||||
### 5.3 残余风险评估逻辑
|
||||
|
||||
```
|
||||
设计验证通过 → 对应危害的风险降低 → 更新风险管理文档残余风险结论
|
||||
↓(若不通过)
|
||||
触发设计变更 → 重新验证 → 重新评估残余风险
|
||||
```
|
||||
|
||||
### 5.4 与风险管理文档的关联要求
|
||||
|
||||
| 要求项 | 内容 |
|
||||
|---|---|
|
||||
| 关联时机 | RMF 完成后须更新本方案 RD-VV-R-* 行,填入具体危害编号和控制措施 |
|
||||
| 验证闭环 | 验证通过后须在 RMF 中记录残余风险变更,更新 DHF 版本 |
|
||||
| 不通过处理 | 验证不通过时须启动 CAPA 流程,并在 RMF 中记录为「新识别的危害」或「控制措施失效」 |
|
||||
|
||||
> **工程师注**:风险与设计控制关联须在风险管理文档(RMF/HHE)完成后回填。现阶段无法建立完整的风险-验证追溯链,为本文件的最大合规缺口之一。催促风险管理输出是本项目设计控制的关键路径。
|
||||
|
||||
---
|
||||
|
||||
## 追溯
|
||||
|
||||
### 6.1 结论句
|
||||
|
||||
**本文件(RD-VV)建立了从设计输入需求到设计验证输出的初步追溯路径,但由于上游设计输入文件正文不可查阅,追溯链存在关键缺口,须在后续任务中补齐。**
|
||||
|
||||
### 6.2 追溯矩阵
|
||||
|
||||
| 本文件 ID | 上游(输入/需求来源) | 下游(输出/验证/确认去向) |
|
||||
|---|---|---|
|
||||
| RD-VV | **输入 1**:设计和开发策划评审记录(正文缺失;`decision_decision_0.md` 仅含操作标签,无正文内容)〔来源:`decision_decision_0.md`〕 | **输出 1**:设计验证报告(RD-VV-RPT,待编制) |
|
||||
| RD-VV | **输入 2**:用户初始需求收集表(正文缺失;`decision_decision_1.md` 仅含操作标签,无正文内容)〔来源:`decision_decision_1.md`〕 | **输出 2**:型检报告(后续 CMA 机构执行,非本方案直接输出) |
|
||||
| RD-VV | **输入 3**:设计输入文件(若有)〔**待确认**,正文未提供〕 | **输出 3**:设计确认(若涉及临床验证,待规划) |
|
||||
| RD-VV | **输入 4**:风险管理文档(RMF/HHE)正文(正文缺失,待风险管理专员输出) | **输出 4**:风险管理文档更新(RMF 回溯,将验证结论写入残余风险评估) |
|
||||
|
||||
### 6.3 DHF 追溯链示意图
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[用户初始需求] --> B[设计和开发策划]
|
||||
B --> C[设计输入]
|
||||
C --> D[RD-VV 设计验证方案]
|
||||
D --> E[设计验证报告 RD-VV-RPT]
|
||||
E --> F[型检报告 CMA]
|
||||
E --> G[设计确认]
|
||||
D --> H[风险管理文档更新 RMF]
|
||||
style D fill:#e1f5fe
|
||||
style E fill:#fff3e0
|
||||
```
|
||||
|
||||
### 6.4 追溯完整性评估
|
||||
|
||||
| 追溯节点 | 状态 | 说明 |
|
||||
|---|---|---|
|
||||
| 上游:用户初始需求 | **有操作记录,无正文** | `decision_decision_1.md` 仅含操作标签,无法确认需求内容 |
|
||||
| 上游:设计和开发策划 | **有操作记录,无正文** | `decision_decision_0.md` 仅含操作标签,无法确认策划内容 |
|
||||
| 上游:设计输入文件 | **待确认** | 是否存在正文内容未知,须项目经理确认 |
|
||||
| 上游:风险管理文档 | **待输出** | RMF 正文尚未编制,无法建立危害-验证关联 |
|
||||
| 本文件:设计验证方案 | **已编制(骨架稿)** | 本文件,提供验证框架 |
|
||||
| 下游:设计验证报告 | **待编制** | 须在本方案执行后输出 |
|
||||
| 下游:型检报告 | **待委托 CMA 机构** | 非本方案直接输出,须另行规划 |
|
||||
|
||||
---
|
||||
|
||||
## 已有材料摘要
|
||||
|
||||
### 7.1 有效事实清单
|
||||
|
||||
| # | 事实 | 来源 | 可信度 |
|
||||
|---|---|---|---|
|
||||
| F-01 | 验证目的:刺激强度步进与过流保护 | 〔`brief.md`〕、〔`upload_material_brief.md.md`〕(两文件内容完全一致) | 高 |
|
||||
| F-02 | 验证方法:台架 + 电气安全摸底 | 〔`brief.md`〕 | 高 |
|
||||
| F-03 | 判定标准:强度误差 ≤ 10% | 〔`brief.md`〕(来源依据**待确认**,见 3.4 节) | 中(缺来源) |
|
||||
| F-04 | 设计和开发策划评审记录已完成(操作记录) | 〔`decision_decision_0.md`〕(正文内容缺失) | 高(有操作记录) |
|
||||
| F-05 | 用户初始需求收集表已完成(操作记录) | 〔`decision_decision_1.md`〕(正文内容缺失) | 高(有操作记录) |
|
||||
|
||||
### 7.2 已知文件矛盾分析
|
||||
|
||||
| 对比项 | `brief.md` | `upload_material_brief.md.md` | 状态 | 建议 |
|
||||
|---|---|---|---|---|
|
||||
| 内容 | 设计验证摸底:目的/方法/判定 | 设计验证摸底:目的/方法/判定 | **两文件文字完全一致**,属重复上传 | 后续合并为单一版本,避免 DHF 中出现冗余索引 |
|
||||
|
||||
### 7.3 工程化差距分析
|
||||
|
||||
| 事项 | 现状 | 目标 | 差距量级 | 责任方 |
|
||||
|---|---|---|---|---|
|
||||
| 判定标准来源 | 「强度误差 ≤ 10%」仅有陈述,无设计输入背书 | 判定标准须有设计输入文件或公认行业标准条款支撑 | **重大** | 研发工程师 + 项目经理 |
|
||||
| 试验步骤细化 | 仅「台架+电气安全摸底」9 字描述 | 完整试验 SOP(步骤、设备型号、环境参数、负载规格) | **重要** | 研发工程师 |
|
||||
| 样本量定义 | 未规定 | 摸底 ≥ 1 台,正式验证须符合统计要求 | **缺口** | 研发工程师 |
|
||||
| 设备/环境条件 | 未规定 | 明确测量仪器型号、精度、环境温湿度 | **缺口** | 实验室 |
|
||||
| 风险-验证追溯链 | 风险管理文档(RMF)正文未提供 | 验证方案关联风险管理文件中的具体危害/控制措施 | **重要** | 风险管理专员 |
|
||||
| 上游文件正文 | 策划和需求文件仅含操作标签,无正文 | 两文件正文须可查阅 | **重要** | 项目经理 |
|
||||
| 型检前提认知 | 未明确区分摸底与型检边界 | 摸底≠型检,阶段边界需明确说明 | **缺口** | 合规专员 |
|
||||
| 签署信息 | 无任何签字人 | 设计验证方案须有编制/审核/批准签字 | **缺口** | 项目经理 |
|
||||
|
||||
---
|
||||
|
||||
## 待确认清单
|
||||
|
||||
### 8.1 阻塞项(P0 — 阻塞后续设计控制流程)
|
||||
|
||||
| # | 待确认项 | 影响 | 来源 | 建议行动 |
|
||||
|---|---|---|---|---|
|
||||
| Q-01 | 「强度误差 ≤ 10%」的来源依据(设计输入、行业标准或论证文件) | 判定标准合法性、型检可追溯性;若无来源,型检可被质疑 | 设计输入文件 / YY/T 0940 系列标准 | 立即溯源;无法溯源则组织技术论证会并签字确认 |
|
||||
| Q-02 | 设计和开发策划评审记录正文内容 | DHF 追溯链上游完备性;无法确认策划内容是否包含验证要求 | 项目经理补充或确认 | 调取或重新编制策划评审记录正文 |
|
||||
| Q-03 | 用户初始需求收集表正文内容 | 设计输入完备性;无法确认用户需求的性能指标 | 项目经理补充或确认 | 调取或重新编制用户初始需求收集表正文 |
|
||||
|
||||
### 8.2 重要项(P1 — 影响验证方案完整性)
|
||||
|
||||
| # | 待确认项 | 影响 | 来源 | 建议行动 |
|
||||
|---|---|---|---|---|
|
||||
| Q-04 | 风险管理文档(RMF/HHE)正文内容 | 风险-验证追溯链完整性;ISO 13485 设计控制不完整 | 风险管理专员 | 催促风险管理输出,完成后回填本方案 RD-VV-R-* 表 |
|
||||
| Q-05 | 完整试验 SOP(步骤、设备型号、负载规格、测量点、档位数量) | DHF 可重复性;无法支撑重复验证 | 研发工程师 | 编制详细试验 SOP,作为本方案的附件或引用文件 |
|
||||
| Q-06 | 过流保护触发阈值与允许动作时间 | 过流保护验证判定依据 | 设计输入文件 | 从设计输入文件或电路设计中提取参数 |
|
||||
|
||||
### 8.3 常规项(P2 — 影响验证方案细化)
|
||||
|
||||
| # | 待确认项 | 影响 | 来源 | 建议行动 |
|
||||
|---|---|---|---|---|
|
||||
| Q-07 | 样本量(摸底 1 台是否足够;若正式验证须重新定义) | 统计合理性;正式验证须满足统计或行业标准 | 研发工程师 + 行业标准 | 在正式验证方案中参照 YY/T 0940 补充 |
|
||||
| Q-08 | 测试设备型号、测量精度、环境条件 | 验证可重复性 | 实验室记录 | 调取实验室设备清单和环境记录 |
|
||||
| Q-09 | 型检前准备(摸底 vs. 型检的阶段边界与衔接计划) | 型检合规性 | 合规/注册专员 | 明确摸底与型检的衔接节点和前置条件 |
|
||||
| Q-10 | 产品样机型号与数量确认 | 验证对象明确性 | 项目经理 | 确认待测样机型号、编号、数量 |
|
||||
|
||||
### 8.4 次要项(P3 — 影响文件完整性)
|
||||
|
||||
| # | 待确认项 | 影响 | 来源 | 建议行动 |
|
||||
|---|---|---|---|---|
|
||||
| Q-11 | 各签字人(编制/审核/批准)姓名与日期 | DHF 签署完整性 | 项目经理安排 | 在文件定稿前完成签字流程 |
|
||||
|
||||
---
|
||||
|
||||
## 签署
|
||||
|
||||
| 角色 | 姓名 | 结论 | 日期 |
|
||||
|---|---|---|---|
|
||||
| 编制 | | 已编制(骨架稿,待补全所有待确认项) | 2026-09-17 |
|
||||
| 审核 | | | |
|
||||
| 批准 | | | |
|
||||
|
||||
---
|
||||
|
||||
## 说明
|
||||
|
||||
1. **文件性质**:本文档基于现有 4 份输入材料编制,属于设计验证方案骨架稿(摸底阶段),经各待确认项补齐后方可作为正式 DHF 受控文件。
|
||||
|
||||
2. **验证阶段区分**:本摸底验证不等同于 NMPA 型检,正式型检须在有 CMA 资质的检测机构按 GB 9706.1 全项执行。两者在 DHF 中有不同追溯路径,不可混用。
|
||||
|
||||
3. **文件更新规则**:后续补充的材料(如设计输入文件、风险管理文档正文、试验 SOP)不会覆盖或改变本次已编制的章节,须以设计变更申请(Change Request)方式更新 DHF,并记录版本变更历史。
|
||||
|
||||
4. **编制依据**:本文档由 engineer 专员(技术支持专员)基于 `brief.md`、`upload_material_brief.md.md`、`decision_decision_0.md`、`decision_decision_1.md`、`blackboard.json`、`project.md`、`user.md` 编制。
|
||||
|
||||
5. **法规依据**:本方案依据 ISO 13485:2016 §7.3.3(设计验证)与 GB 9706.1-2007(医用电气设备安全通用要求)的原则编制,覆盖研发阶段摸底验证。
|
||||
|
||||
---
|
||||
|
||||
*文件编号:RD-VV-A-001 | 项目:rdev-s1c-pi-1789657210 | 客户:水木东方测试客户 | 产品:二类有源医疗器械(神经刺激) | 目标市场:中国 NMPA*
|
||||
@@ -0,0 +1,305 @@
|
||||
# 设计和开发策划评审记录
|
||||
|
||||
- **项目编号**:rdev-s1c-pi-1789657210
|
||||
- **客户名称**:水木东方测试客户
|
||||
- **文件编号**:RD-PLAN-REV
|
||||
- **记录归属**:DHF(设计历史文件)
|
||||
- **版本**:A
|
||||
- **阶段**:02 策划评审
|
||||
- **生成日期**:2026-09-17
|
||||
- **审核状态**:终稿(经03审核整合)
|
||||
|
||||
---
|
||||
|
||||
## 结论
|
||||
|
||||
**适用性:适用。** 本阶段评审适用于已批准立项的项目 rdev-s1c-pi-1789657210,评审输入材料为策划阶段摘要类文件,因材料极度稀缺,评审内容不完整,须在上游文件齐全后方可完成实质性决议。〔依据:context/materials_text/brief.md + context/project.md〕
|
||||
|
||||
---
|
||||
|
||||
## 适用性
|
||||
|
||||
- **适用 / 不适用**:适用
|
||||
- **不适用理由**:不适用(立项前提已锁定,项目已通过立项审批,具备启动设计控制流程的基本前提)〔依据:context/project.md〕
|
||||
|
||||
---
|
||||
|
||||
## 评审范围与对象
|
||||
|
||||
### 评审背景
|
||||
|
||||
本阶段为 **02 策划评审**,依据 ISO 13485:2016 §7.3 设计开发策划及《医疗器械生产质量管理规范》(GMP)对设计开发策划阶段的规定,对已批准的项目建议书与设计开发计划进行系统性检查,确认策划输出的充分性、适宜性及对后续设计阶段的支撑能力。〔法规依据:ISO 13485:2016 §7.3〕
|
||||
|
||||
### 评审目标(02 阶段语境)
|
||||
|
||||
本阶段须确认以下内容:
|
||||
|
||||
1. 项目建议书与设计开发计划已获正式批准并锁定版本。
|
||||
2. 策划阶段输出已定义产品预期用途、监管分类、技术要求、风险管理方向及阶段里程碑。
|
||||
3. 关键已知风险(软件安全分级待确认)已纳入风险登记并有跟踪责任人。
|
||||
4. 评审人员组成、职责边界已明确,不存在未界定的角色空缺。
|
||||
5. 本阶段与后续设计开发阶段的接口已识别,无未关闭的阻塞项。
|
||||
|
||||
### 覆盖文件
|
||||
|
||||
| 序号 | 文件名 | 版本 | 批准状态 | 与本评审关系 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 项目建议书 | **待确认** | **待确认** | 主输入;本阶段须确认已批准 |
|
||||
| 2 | 设计开发计划 | **待确认** | **待确认** | 主输入;本阶段须确认已批准 |
|
||||
| 3 | 用户初始需求收集表 | **待确认** | **待确认** | 补充输入〔材料:decision_decision_0.md〕 |
|
||||
| 4 | 本评审记录(本文档) | A | 编制中(终稿) | 本阶段输出 |
|
||||
|
||||
### 输入材料原文宣称
|
||||
|
||||
> **材料原文**:「已批准项目建议书与设计开发计划摘要。关键风险:软件安全分级待确认。」〔材料:brief.md〕〔材料:upload_material_brief.md.md〕
|
||||
|
||||
> **材料原文**:「完成交付物【用户初始需求收集表】(系统智能体小队)」〔材料:decision_decision_0.md〕
|
||||
|
||||
### 评审有效性声明
|
||||
|
||||
因材料极度稀缺,本次评审为基于摘要性输入的形式性评审,不代表对策划内容完整性的实质性确认。正式评审结论须在上游文件齐全后重新评估。〔声明依据:材料充分性评估结果〕
|
||||
|
||||
---
|
||||
|
||||
## 评审人员与职责
|
||||
|
||||
### 评审组构成原则(02 策划评审阶段)
|
||||
|
||||
依据 ISO 13485:2016 §7.3.1 设计开发策划及《医疗器械生产质量管理规范》对设计控制的要求,策划评审通常应覆盖项目负责人、设计控制负责人、质量/法规代表、研发技术负责人及风险管理代表等角色,以确保评审的独立性与全面性。〔法规依据:ISO 13485:2016 §7.3.1〕
|
||||
|
||||
| 角色代码 | 角色名称 | 职责描述 | 姓名 | 授权状态 |
|
||||
|---|---|---|---|---|
|
||||
| REV-P-001 | 项目经理/项目负责人 | 统筹评审,主持决议,对整体进度与合规性负责 | **待确认** | **待确认** |
|
||||
| REV-P-002 | 设计控制负责人 | 审核设计开发计划与本记录的技术合规性 | **待确认** | **待确认** |
|
||||
| REV-P-003 | 质量/法规代表 | 确认评审流程符合质量管理体系要求 | **待确认** | **待确认** |
|
||||
| REV-P-004 | 研发/技术负责人 | 确认设计开发计划的技术可行性 | **待确认** | **待确认** |
|
||||
| REV-P-005 | 风险管理代表 | 审核风险登记与软件安全分级事项 | **待确认** | **待确认** |
|
||||
|
||||
### 解读
|
||||
|
||||
评审人员须由项目经理书面授权,名单与职责边界须在评审会议前锁定并记录。禁止在本文档中编造人员姓名及资质信息。现阶段无法确认评审组成员,须在上游文件齐全后补充。〔依据:context/agent.md 写作纪律〕
|
||||
|
||||
---
|
||||
|
||||
## 问题与决议
|
||||
|
||||
### 问题清单
|
||||
|
||||
> **说明**:因材料极度稀缺,无实质性问题讨论记录可引用。以下问题清单基于已知风险(软件安全分级待确认)与评审目标预设,实际决议须在上游文件齐全后补充。
|
||||
|
||||
| 编号 | 问题 | 决议 | 责任人 | 期限 | 关闭准则 |
|
||||
|---|---|---|---|---|---|
|
||||
| REV-I-001 | 软件安全分级(GB 9706.1 / IEC 62366 相关)尚未确认,对风险管理文档与型检要求存在潜在影响 | **待确认** | **待确认** | **待确认** | 软件安全分级报告经授权人员审核签字,风险登记已更新 |
|
||||
| REV-I-002 | 项目建议书与设计开发计划正文内容未提供,无法确认策划输出完整性 | **待确认** | **待确认** | **待确认** | 已批准的项目建议书与设计开发计划正文已收录并经评审组确认 |
|
||||
| REV-I-003 | 用户初始需求收集表正文未附,仅有操作记录 | **待确认** | **待确认** | **待确认** | 用户初始需求收集表正文已上传并经研发负责人确认 |
|
||||
|
||||
### 解读
|
||||
|
||||
已知唯一风险项(软件安全分级待确认)在材料中仅一句话提及,无技术分析、无责任人、无期限设定。该风险对本项目的合规路径(型检、注册审评)具有实质影响,须在进入设计开发阶段前关闭,否则后续设计输出可能因安全分级不符要求而需要返工。〔依据:材料原文宣称的已知风险〕
|
||||
|
||||
---
|
||||
|
||||
## 遗留行动项跟踪
|
||||
|
||||
### 行动项汇总
|
||||
|
||||
| 行动项 ID | 内容 | 责任人 | 期限 | 状态 | 阻塞影响 |
|
||||
|---|---|---|---|---|---|
|
||||
| REV-A-001 | 确认软件安全分级(确定分类依据:GB 9706.1 系列或相关专用标准) | **待确认** | **待确认** | 未关闭 | 若未关闭,后续风险管理文档、电气安全型检均无法完成 |
|
||||
| REV-A-002 | 补充并上传已批准项目建议书与设计开发计划正文 | **待确认** | **待确认** | 未关闭 | 本评审记录无法完成实质性决议,阻塞进入设计开发阶段 |
|
||||
| REV-A-003 | 补充用户初始需求收集表正文 | **待确认** | **待确认** | 未关闭 | 设计输入完整性无法追溯,用户需求无法核实 |
|
||||
|
||||
### 阻塞影响分析
|
||||
|
||||
上述三项未关闭行动项对后续阶段的阻塞关系如下:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[REV-A-001<br>软件安全分级] -->|阻塞| B[风险管理文档]
|
||||
A -->|阻塞| C[电气安全型检]
|
||||
A -->|阻塞| D[注册审评]
|
||||
|
||||
E[REV-A-002<br>项目建议书与设计开发计划] -->|阻塞| F[实质性评审决议]
|
||||
E -->|阻塞| G[进入设计开发阶段]
|
||||
|
||||
H[REV-A-003<br>用户需求表正文] -->|阻塞| I[设计输入完整性追溯]
|
||||
|
||||
style A fill:#ffcccc
|
||||
style E fill:#ffcccc
|
||||
style H fill:#ffcccc
|
||||
```
|
||||
|
||||
**图 1:未关闭行动项对后续阶段的阻塞影响**
|
||||
|
||||
### 优先级建议
|
||||
|
||||
三项行动项相互独立但均对进入下一阶段有实质性阻塞影响。建议按以下优先级排序:
|
||||
|
||||
1. **REV-A-002**(获取上游文件):最高优先级,因其是完成本评审记录实质性决议的前置条件
|
||||
2. **REV-A-001**(软件安全分级):技术合规关键路径
|
||||
3. **REV-A-003**(用户需求表):设计输入追溯依据
|
||||
|
||||
---
|
||||
|
||||
## 评审结论
|
||||
|
||||
### 总体判定
|
||||
|
||||
| 结论项 | 内容 |
|
||||
|---|---|
|
||||
| **总体结论** | **有条件通过(条件待满足)** |
|
||||
| **条件/限制** | 1. 软件安全分级须在进入设计开发阶段前确认并更新风险登记;2. 已批准的项目建议书与设计开发计划正文须上传并经评审组确认;3. 用户初始需求收集表正文须补充上传 |
|
||||
| **进入下一阶段前提** | 上述三项条件均已满足,且本评审记录经审核与批准签字 |
|
||||
|
||||
### 判定依据
|
||||
|
||||
本阶段评审结论为「有条件通过」,理由如下:
|
||||
|
||||
1. **立项前提已锁定**:项目已通过立项审批,具备启动设计控制流程的基本前提。〔依据:context/project.md + context/materials_text/brief.md〕
|
||||
|
||||
2. **已知风险已识别**:策划阶段已知风险(软件安全分级)已被材料原文明确标注为待确认,且该风险对合规路径影响重大,须在进入下一阶段前关闭。〔材料原文:brief.md〕
|
||||
|
||||
3. **材料极度稀缺**:三份核心文本(brief.md、upload_material_brief.md.md、decision_decision_0.md)内容高度重复,仅提供摘要性描述,无法支撑实质性评审决议。〔材料来源:context/materials_text/〕
|
||||
|
||||
4. **文件版本不可追溯**:upstream 文档版本、批准状态及正文内容均未知,无法完成追溯表填写。〔依据:材料充分性评估〕
|
||||
|
||||
### 条件验证方式
|
||||
|
||||
| 条件编号 | 条件内容 | 验证方式 | 验证责任人 |
|
||||
|---|---|---|---|
|
||||
| C-01 | 软件安全分级确认 | 软件安全分级报告经授权人员审核签字,风险登记已更新 | **待确认** |
|
||||
| C-02 | 项目建议书与设计开发计划正文 | 已批准文件已收录并经评审组确认签字 | **待确认** |
|
||||
| C-03 | 用户初始需求收集表正文 | 正文已上传并经研发负责人确认 | **待确认** |
|
||||
|
||||
---
|
||||
|
||||
## 追溯
|
||||
|
||||
### 设计控制追溯表
|
||||
|
||||
| 本文件 ID | 上游(输入/需求) | 下游(输出/验证/确认) |
|
||||
|---|---|---|
|
||||
| RD-PLAN-REV(本文档) | 项目建议书(版本**待确认**,批准状态**待确认**)〔材料:brief.md〕 | 设计输入文件(DI) |
|
||||
| | 设计开发计划(版本**待确认**,批准状态**待确认**)〔材料:brief.md〕 | 风险管理计划 |
|
||||
| | 用户初始需求收集表(正文**待确认**)〔材料:decision_decision_0.md〕 | 设计开发计划 |
|
||||
| | 软件安全分级(**未确认**)〔材料:brief.md〕 | 型检、注册审评 |
|
||||
|
||||
### 解读
|
||||
|
||||
本追溯表依据现有材料填写,上下游文件ID及版本均为待确认状态,须在上游文件齐全后更新。所有追溯关系需在设计开发阶段开始前锁定。〔依据:context/agent.md 写作纪律〕
|
||||
|
||||
---
|
||||
|
||||
## 已有材料摘要
|
||||
|
||||
### 核心输入材料(3 份)
|
||||
|
||||
| 文件名 | 内容摘要 | 与本评审关系 |
|
||||
|---|---|---|
|
||||
| brief.md | 策划评审输入;已批准项目建议书与设计开发计划摘要;关键风险:软件安全分级待确认 | 主输入材料 |
|
||||
| upload_material_brief.md.md | 内容同 brief.md | 主输入材料(与 brief.md 高度重复) |
|
||||
| decision_decision_0.md | 操作记录:完成交付物【用户初始需求收集表】(系统智能体小队) | 补充输入(仅有操作记录,无正文) |
|
||||
|
||||
### 辅助材料
|
||||
|
||||
| 文件名 | 内容摘要 | 与本评审关系 |
|
||||
|---|---|---|
|
||||
| project.md | 项目全局基线:项目名 rdev-s1c-pi-1789657210,客户水木东方测试客户,产品二类有源医疗器械(神经刺激),预期用途无创神经电刺激辅助改善目标症状,目标市场中国 NMPA | 权威立项基线 |
|
||||
|
||||
### 材料一致性分析
|
||||
|
||||
| 编号 | 分析项 | 结果 |
|
||||
|---|---|---|
|
||||
| CA-01 | brief.md 与 upload_material_brief.md.md 内容对比 | 完全一致,未发现实质差异 |
|
||||
| CA-02 | decision_decision_0.md 与用户需求正文 | 仅操作记录,无正文内容 |
|
||||
|
||||
### 材料充分性评估
|
||||
|
||||
| 评估维度 | 状态 | 说明 |
|
||||
|---|---|---|
|
||||
| 上游立项文件 | **不足** | 仅声称「已批准」,正文内容未提供 |
|
||||
| 设计开发计划 | **不足** | 仅声称存在,版本及内容未提供 |
|
||||
| 用户需求 | **不足** | 仅有操作记录,正文内容未提供 |
|
||||
| 风险登记 | **不足** | 仅提及「软件安全分级待确认」,无详细分析 |
|
||||
| 评审依据 | **不足** | 无实质性讨论记录可引用 |
|
||||
|
||||
---
|
||||
|
||||
## 矛盾与疑点
|
||||
|
||||
| 编号 | 矛盾/疑点描述 | 来源 | 标记 |
|
||||
|---|---|---|---|
|
||||
| C-01 | brief.md 和 upload_material_brief.md.md 均声称「已批准项目建议书与设计开发计划」,但正文内容未提供,无法核实批准状态真伪 | brief.md、upload_material_brief.md.md | **材料原文宣称「已批准」,正文缺失——无法核实** |
|
||||
| C-02 | decision_decision_0.md 声称已完成【用户初始需求收集表】交付,但未附正文内容,无法核实需求完整性 | decision_decision_0.md | **操作记录与正文内容缺失——无法核实** |
|
||||
| C-03 | project.md 显示产品类型为「二类有源医疗器械(神经刺激)」,但材料未提供产品技术要求或分类依据文件 | project.md | **立项基线已锁定,正文未提供——待上游文件核实** |
|
||||
|
||||
> **汇报纪律**:本清单忠实呈现矛盾与疑点,不作裁决,不补全,不推测。所有矛盾均须在上游文件齐全后核实。〔依据:context/agent.md〕
|
||||
|
||||
---
|
||||
|
||||
## 待确认清单
|
||||
|
||||
以下清单汇总本阶段仍缺、会影响后续设计/验证/确认的项:
|
||||
|
||||
| 编号 | 待确认项 | 来源/依据 | 对后续的影响 |
|
||||
|---|---|---|---|
|
||||
| G-01 | 项目建议书正文内容、版本号、批准日期及批准人 | 材料未提供;仅摘要性声称「已批准」 | 本评审记录无法完成实质性决议 |
|
||||
| G-02 | 设计开发计划正文内容、版本号、批准日期及批准人 | 材料未提供;仅摘要性声称「已批准」 | 设计阶段里程碑与资源计划无法核实 |
|
||||
| G-03 | 用户初始需求收集表正文内容 | decision_decision_0.md 仅记录操作,无正文 | 设计输入完整性无法追溯 |
|
||||
| G-04 | 软件安全分级具体类别及确认依据(GB 9706.1 系列或其他适用标准) | brief.md 原文明示「待确认」 | 型检要求、风险管理文档、注册路径均受影响 |
|
||||
| G-05 | 评审人员名单及授权状态 | 材料未提供 | 评审有效性存疑;签署页无法完成 |
|
||||
| G-06 | 风险管理责任人及风险登记文件 | brief.md 提及风险但无责任人 | 设计开发阶段风险控制无归口 |
|
||||
| G-07 | 目标市场的具体注册路径与时间要求 | 仅知目标市场为「中国 NMPA」 | 注册策略与项目排期无法制定 |
|
||||
| G-08 | 型检周期与型检机构安排 | 材料未提供 | 项目整体排期无法确定 |
|
||||
| G-09 | 预算与资源配置 | 材料未提供 | 设计开发计划可行性无法评估 |
|
||||
| G-10 | 本文档审核人与批准人姓名及签字日期 | 终稿状态须经审核批准 | DHF 记录有效性须签字确认 |
|
||||
|
||||
---
|
||||
|
||||
## 签署
|
||||
|
||||
| 角色 | 姓名 | 结论 | 日期 |
|
||||
|---|---|---|---|
|
||||
| 编制 | | 已编制 | 2026-09-17 |
|
||||
| 审核 | **待确认** | | |
|
||||
| 批准 | **待确认** | | |
|
||||
|
||||
> **说明**:签署页须在实际评审会议后补充完整,禁止在本文档中编造签字。〔依据:context/agent.md 写作纪律〕
|
||||
|
||||
---
|
||||
|
||||
## 说明
|
||||
|
||||
本文档为 02 策划评审阶段的设计历史文件(DHF)记录,依据现有材料编制。版本标注为 A(终稿),经 03 审核整合生成。
|
||||
|
||||
因输入材料极度稀缺(3 份核心文本高度重复,仅提供摘要性描述),本文档大量条目标注「待确认」,待上游文件齐全后须更新至正式版本。
|
||||
|
||||
后续补充的材料不会改变本次已记录内容,但可作为修订版本另行存档。修订时须在版本记录中说明变更原因及依据。
|
||||
|
||||
---
|
||||
|
||||
## 参考依据
|
||||
|
||||
### 法规与标准
|
||||
|
||||
- **ISO 13485:2016 §7.3**:设计开发策划
|
||||
- **《医疗器械生产质量管理规范》**(GMP)设计开发控制章节
|
||||
|
||||
### 项目基线文档
|
||||
|
||||
- **context/project.md**:项目全局立项基线(权威)
|
||||
- **context/user.md**:用户个性化工作习惯与偏好指导
|
||||
|
||||
### 前序产出
|
||||
|
||||
- **tasks/02_draft/output.md**:02 策划评审记录初稿
|
||||
|
||||
### 输入材料
|
||||
|
||||
- **context/materials_text/brief.md**:策划评审输入(主证据)
|
||||
- **context/materials_text/upload_material_brief.md.md**:策划评审输入(与 brief.md 内容一致)
|
||||
- **context/materials_text/decision_decision_0.md**:操作记录(无正文)
|
||||
|
||||
### 协同规范
|
||||
|
||||
- **context/agent.md**:智能体小队协同通用规范
|
||||
@@ -0,0 +1,343 @@
|
||||
#!/usr/bin/env python3
|
||||
"""S1 continued: sample real PI for rd_planning_review + rd_design_vv."""
|
||||
from __future__ import annotations
|
||||
|
||||
import base64
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import urllib.error
|
||||
import urllib.request
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
BASE = os.environ.get("BASE_URL", "http://127.0.0.1:8080").rstrip("/")
|
||||
ASSETS = Path(__file__).resolve().parent
|
||||
ASSETS.mkdir(parents=True, exist_ok=True)
|
||||
DATE = datetime.now().strftime("%Y%m%d-%H%M%S")
|
||||
PROJ_NAME = f"rdev-s1c-{DATE}"
|
||||
TASK_TIMEOUT = int(os.environ.get("TASK_TIMEOUT_SEC", "2400"))
|
||||
LOG: list[str] = []
|
||||
|
||||
|
||||
def log(msg: str) -> None:
|
||||
line = f"[{datetime.now().strftime('%H:%M:%S')}] {msg}"
|
||||
print(line, flush=True)
|
||||
LOG.append(line)
|
||||
|
||||
|
||||
def b64(text: str) -> str:
|
||||
return base64.b64encode(text.encode()).decode("ascii")
|
||||
|
||||
|
||||
def req(method, path, token=None, body=None, timeout=60):
|
||||
data = None
|
||||
headers = {"Accept": "application/json"}
|
||||
if body is not None:
|
||||
data = json.dumps(body, ensure_ascii=False).encode()
|
||||
headers["Content-Type"] = "application/json"
|
||||
if token:
|
||||
headers["Authorization"] = f"Bearer {token}"
|
||||
r = urllib.request.Request(BASE + path, data=data, headers=headers, method=method)
|
||||
try:
|
||||
with urllib.request.urlopen(r, timeout=timeout) as resp:
|
||||
raw = resp.read().decode()
|
||||
parsed = json.loads(raw) if raw.strip() else None
|
||||
return resp.status, parsed, raw
|
||||
except urllib.error.HTTPError as e:
|
||||
raw = e.read().decode()
|
||||
try:
|
||||
parsed = json.loads(raw) if raw.strip() else None
|
||||
except json.JSONDecodeError:
|
||||
parsed = None
|
||||
return e.code, parsed, raw
|
||||
|
||||
|
||||
def save_json(name, obj):
|
||||
(ASSETS / name).write_text(json.dumps(obj, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
|
||||
|
||||
def login(user, password):
|
||||
st, parsed, raw = req("POST", "/api/v1/auth/login", body={"username": user, "password": password})
|
||||
if st >= 400 or not parsed or not parsed.get("token"):
|
||||
raise SystemExit(f"login failed: {st} {raw[:300]}")
|
||||
return parsed["token"], parsed.get("user") or {}
|
||||
|
||||
|
||||
def enable_only(plan, keep, author, reviewer, approver):
|
||||
for stage in plan.get("stages") or []:
|
||||
for dt in stage.get("doc_tasks") or []:
|
||||
key = dt.get("task_key") or dt.get("key")
|
||||
if key in keep:
|
||||
dt["enabled"] = True
|
||||
dt["duties"] = {
|
||||
"author_user_id": author,
|
||||
"reviewer_user_id": reviewer,
|
||||
"approver_user_id": approver,
|
||||
}
|
||||
else:
|
||||
dt["enabled"] = False
|
||||
dt["duties"] = {}
|
||||
|
||||
|
||||
def plan_and_activate(token, project_id, workflow_key, keep_keys, author, reviewer, approver):
|
||||
st, proj, raw = req("GET", f"/api/v1/projects/{project_id}", token)
|
||||
if st != 200:
|
||||
raise SystemExit(f"get project: {st} {raw[:400]}")
|
||||
sel_ver = int(proj.get("workflow_selection_version") or 1)
|
||||
plan_rev = int(proj.get("workflow_plan_revision") or 0)
|
||||
st, plan, raw = req(
|
||||
"GET",
|
||||
f"/api/v1/projects/{project_id}/workflow-plan/default?workflow_key={workflow_key}&version=0",
|
||||
token,
|
||||
)
|
||||
if st != 200:
|
||||
raise SystemExit(f"default plan: {st} {raw[:800]}")
|
||||
enable_only(plan, set(keep_keys), author, reviewer, approver)
|
||||
st, _, raw = req("PUT", f"/api/v1/projects/{project_id}/workflow-plan", token, {
|
||||
"plan": plan,
|
||||
"expected_plan_revision": plan_rev,
|
||||
"expected_selection_version": sel_ver,
|
||||
})
|
||||
log(f"save {workflow_key} plan http={st}")
|
||||
if st != 200:
|
||||
raise SystemExit(raw[:1200])
|
||||
st, preview, raw = req("POST", f"/api/v1/projects/{project_id}/activation-preview", token)
|
||||
if st != 200:
|
||||
raise SystemExit(f"preview: {st} {raw[:800]}")
|
||||
st, activated, raw = req("POST", f"/api/v1/projects/{project_id}/workflow-instances/activate", token, {
|
||||
"confirmation_token": preview["confirmation_token"],
|
||||
"expected_project_version": preview["expected_project_version"],
|
||||
"expected_plan_revision": preview["expected_plan_revision"],
|
||||
})
|
||||
log(f"activate {workflow_key} http={st}")
|
||||
if st != 200:
|
||||
raise SystemExit(raw[:1200])
|
||||
save_json(f"activate-{workflow_key}.json", activated)
|
||||
return activated
|
||||
|
||||
|
||||
def run_task(token, project_id, task_key, fields, author, reviewer, approver, backend="pi-agent", materials=None):
|
||||
sess = f"sess-s1c-p{project_id}-{task_key}-{int(time.time())}"
|
||||
req("POST", "/api/v1/chat/sessions", token, {
|
||||
"session_id": sess, "title": f"{PROJ_NAME}/{task_key}",
|
||||
"user_id": author, "project_id": project_id,
|
||||
})
|
||||
body = {
|
||||
"session_id": sess,
|
||||
"client_turn_id": f"s1c-{task_key}-{int(time.time())}",
|
||||
"user_message": f"请编制《{task_key}》,严格按模板专业章节写满四段式,不做疗效宣称,缺项标待确认。",
|
||||
"task_key": task_key,
|
||||
"project_name": PROJ_NAME,
|
||||
"customer_name": fields["customer_name"],
|
||||
"device_type": fields["device_type"],
|
||||
"intended_use": fields["intended_use"],
|
||||
"target_market": fields["target_market"],
|
||||
"fields": fields,
|
||||
"backend": backend,
|
||||
"project_id": project_id,
|
||||
"author_id": author,
|
||||
"reviewer_id": reviewer,
|
||||
"approver_id": approver,
|
||||
"materials": materials or [{"filename": "brief.md", "content": b64("# brief\n无创神经刺激器。\n")}],
|
||||
}
|
||||
log(f"start {task_key} backend={backend}")
|
||||
st, created, raw = req("POST", "/api/v1/tasks/runs", token, body, timeout=60)
|
||||
if st not in (200, 202) or not created or not created.get("run_id"):
|
||||
raise SystemExit(f"create run {task_key}: {st} {raw[:1000]}")
|
||||
run_id = created["run_id"]
|
||||
t0 = time.time()
|
||||
final = None
|
||||
while time.time() - t0 < TASK_TIMEOUT:
|
||||
gs, gb, _ = req("GET", f"/api/v1/tasks/runs/{run_id}", token, timeout=30)
|
||||
if gs == 200 and isinstance(gb, dict):
|
||||
status = gb.get("status") or gb.get("Status")
|
||||
if status in ("completed", "failed", "cancelled", "pending_author_confirmation"):
|
||||
final = gb
|
||||
log(f"done {task_key} status={status} elapsed={int(time.time()-t0)}s")
|
||||
break
|
||||
if int(time.time() - t0) % 30 < 12:
|
||||
log(f"poll {task_key} status={status} elapsed={int(time.time()-t0)}s")
|
||||
time.sleep(10)
|
||||
if not final:
|
||||
raise SystemExit(f"timeout {task_key} run_id={run_id}")
|
||||
save_json(f"pi-{task_key}-meta.json", {"run_id": run_id, "final": final, "elapsed_s": int(time.time()-t0)})
|
||||
return final
|
||||
|
||||
|
||||
def extract_md(final: dict) -> str:
|
||||
md = ""
|
||||
work = final.get("WorkspaceID") or final.get("work_dir") or final.get("workspace_id") or ""
|
||||
roots = []
|
||||
if work:
|
||||
roots.append(Path(work))
|
||||
roots.append(Path(work.replace("/app/data/", "/home/weichen/projects/Agent-System/data/dev/")))
|
||||
for root in roots:
|
||||
if not root.exists():
|
||||
continue
|
||||
for p in [root / "output.md", *sorted(root.rglob("output.md"))]:
|
||||
if p.is_file():
|
||||
text = p.read_text(encoding="utf-8")
|
||||
if len(text) > len(md):
|
||||
md = text
|
||||
pa = final.get("primary_artifact") or {}
|
||||
if len(pa.get("markdown_body") or "") > len(md):
|
||||
md = pa["markdown_body"]
|
||||
return md
|
||||
|
||||
|
||||
def approve_doc(author_token, reviewer_token, approver_token, doc_id, author_id, reviewer_id, approver_id):
|
||||
steps = [
|
||||
(author_token, "/api/v1/docgov/claim", {"doc_id": doc_id, "user_id": author_id, "user_name": "admin", "user_role": "author"}),
|
||||
(author_token, "/api/v1/docgov/submit-review", {"doc_id": doc_id, "user_id": author_id, "user_name": "admin"}),
|
||||
(reviewer_token, "/api/v1/docgov/review-decision", {"doc_id": doc_id, "user_id": reviewer_id, "user_name": "lizhuguan", "action": "approve", "comment": "s1c"}),
|
||||
(approver_token, "/api/v1/docgov/approver-decision", {"doc_id": doc_id, "user_id": approver_id, "user_name": "wangzong", "action": "approve", "comment": "s1c"}),
|
||||
]
|
||||
for tok, path, body in steps:
|
||||
st, _, raw = req("POST", path, tok, body)
|
||||
log(f"{path.split('/')[-1]} http={st}")
|
||||
if st != 200:
|
||||
log(f"warn: {raw[:400]}")
|
||||
|
||||
|
||||
def advance_until(token, instance_id, stop_stage: str, plan_stages: list[str]):
|
||||
for sk in plan_stages:
|
||||
if sk == stop_stage:
|
||||
break
|
||||
st, detail, raw = req("GET", f"/api/v1/workflow-instances/{instance_id}", token)
|
||||
inst = (detail or {}).get("instance") or detail or {}
|
||||
rev = inst.get("config_revision")
|
||||
st, _, raw = req("POST", f"/api/v1/workflow-instances/{instance_id}/stages/{sk}/advance", token, {
|
||||
"stage_key": sk, "expected_config_revision": rev,
|
||||
})
|
||||
log(f"advance {sk} http={st}")
|
||||
if st != 200:
|
||||
log(f"advance stop: {raw[:400]}")
|
||||
break
|
||||
|
||||
|
||||
def main():
|
||||
admin_pass = os.environ["ADMIN_PASSWORD"]
|
||||
token, admin = login("admin", admin_pass)
|
||||
uid = int(admin["id"])
|
||||
# Cross-user duties (seeded)
|
||||
_, rev_user = login("lizhuguan", "123456")
|
||||
_, app_user = login("wangzong", "123456")
|
||||
reviewer_id = int(rev_user["id"])
|
||||
approver_id = int(app_user["id"])
|
||||
reviewer_token, _ = login("lizhuguan", "123456")
|
||||
approver_token, _ = login("wangzong", "123456")
|
||||
fields = {
|
||||
"customer_name": "水木东方测试客户",
|
||||
"device_type": "二类有源医疗器械(神经刺激)",
|
||||
"intended_use": "无创神经电刺激辅助改善目标症状",
|
||||
"target_market": "中国 NMPA",
|
||||
}
|
||||
|
||||
# create project
|
||||
st, proj, raw = req("POST", "/api/v1/projects", token, {
|
||||
"name": PROJ_NAME,
|
||||
"product_domain": "medical_device",
|
||||
"description": "S1 continued template depth sample",
|
||||
})
|
||||
if st not in (200, 201) or not proj:
|
||||
raise SystemExit(f"create project: {st} {raw[:800]}")
|
||||
pid = int(proj["id"])
|
||||
log(f"project_id={pid}")
|
||||
save_json("project.json", proj)
|
||||
|
||||
for mid, role in ((uid, "owner"), (reviewer_id, "member"), (approver_id, "member")):
|
||||
st, _, raw = req("POST", f"/api/v1/projects/{pid}/members", token, {"user_id": mid, "role": role})
|
||||
log(f"member user={mid} role={role} http={st}")
|
||||
|
||||
# main: intake only + stub
|
||||
act = plan_and_activate(token, pid, "main", ["intake"], uid, reviewer_id, approver_id)
|
||||
inst = act.get("instance") or act
|
||||
main_iid = int(inst["id"])
|
||||
final = run_task(token, pid, "intake", fields, uid, reviewer_id, approver_id, backend="stub")
|
||||
doc = (final.get("doc_record") or {})
|
||||
doc_id = doc.get("doc_id") or f"doc_proj{pid}_intake"
|
||||
approve_doc(token, reviewer_token, approver_token, doc_id, uid, reviewer_id, approver_id)
|
||||
# advance main to completed if needed
|
||||
st, detail, _ = req("GET", f"/api/v1/workflow-instances/{main_iid}", token)
|
||||
inst = (detail or {}).get("instance") or detail or {}
|
||||
log(f"main instance status={inst.get('status')}")
|
||||
|
||||
# Try complete remaining main stages
|
||||
stages = []
|
||||
for s in ((act.get("instance") or act).get("config_snapshot") or {}).get("stages") or []:
|
||||
sk = s.get("stage_key") or s.get("key")
|
||||
if sk:
|
||||
stages.append(sk)
|
||||
if not stages:
|
||||
# fetch from default was saved earlier; advance generic
|
||||
stages = ["V0.1_triage", "V0.5_feasibility", "V1_quote"]
|
||||
advance_until(token, main_iid, "__DONE__", stages)
|
||||
st, detail, _ = req("GET", f"/api/v1/workflow-instances/{main_iid}", token)
|
||||
inst = (detail or {}).get("instance") or detail or {}
|
||||
log(f"main after advance status={inst.get('status')}")
|
||||
|
||||
# rdev with two sample tasks
|
||||
keep = ["rd_planning_review", "rd_design_vv"]
|
||||
act_r = plan_and_activate(token, pid, "rdev", keep, uid, reviewer_id, approver_id)
|
||||
rinst = act_r.get("instance") or act_r
|
||||
rid = int(rinst["id"])
|
||||
rstages = []
|
||||
for s in (rinst.get("config_snapshot") or {}).get("stages") or []:
|
||||
sk = s.get("stage_key")
|
||||
if sk:
|
||||
rstages.append(sk)
|
||||
save_json("rdev-stages.json", rstages)
|
||||
|
||||
materials_rev = [{"filename": "plan_brief.md", "content": b64(
|
||||
"# 策划评审输入\n\n已批准项目建议书与设计开发计划(摘要)。\n关键风险:软件安全分级待确认;EMC 摸底待排期。\n"
|
||||
)}]
|
||||
materials_vv = [{"filename": "vv_brief.md", "content": b64(
|
||||
"# 设计验证摸底\n\n## 目的\n验证刺激强度步进与过流保护。\n## 方法\n台架测试+电气安全摸底。\n## 判定\n强度误差≤10%;过流触发可靠。\n"
|
||||
)}]
|
||||
|
||||
# advance to RD02 then run planning_review
|
||||
advance_until(token, rid, "RD02_planning_review", rstages)
|
||||
fin1 = run_task(token, pid, "rd_planning_review", fields, uid, reviewer_id, approver_id, backend="pi-agent", materials=materials_rev)
|
||||
md1 = extract_md(fin1)
|
||||
(ASSETS / "rd_planning_review-final.md").write_text(md1, encoding="utf-8")
|
||||
log(f"planning_review chars={len(md1)} placeholder={'按本阶段专业结构写' in md1}")
|
||||
|
||||
# advance to RD08 then run design_vv
|
||||
advance_until(token, rid, "RD08_verification", rstages)
|
||||
fin2 = run_task(token, pid, "rd_design_vv", fields, uid, reviewer_id, approver_id, backend="pi-agent", materials=materials_vv)
|
||||
md2 = extract_md(fin2)
|
||||
(ASSETS / "rd_design_vv-final.md").write_text(md2, encoding="utf-8")
|
||||
log(f"design_vv chars={len(md2)} placeholder={'按本阶段专业结构写' in md2}")
|
||||
|
||||
summary = {
|
||||
"project_id": pid,
|
||||
"project_name": PROJ_NAME,
|
||||
"rd_planning_review": {
|
||||
"run_status": fin1.get("status") or fin1.get("Status"),
|
||||
"chars": len(md1),
|
||||
"no_placeholder": "按本阶段专业结构写" not in md1,
|
||||
"has_review_sections": all(h in md1 for h in ("## 评审范围与对象", "## 问题与决议", "## 评审结论")),
|
||||
},
|
||||
"rd_design_vv": {
|
||||
"run_status": fin2.get("status") or fin2.get("Status"),
|
||||
"chars": len(md2),
|
||||
"no_placeholder": "按本阶段专业结构写" not in md2,
|
||||
"has_protocol_sections": all(h in md2 for h in ("## 目的与范围", "## 方法与判定标准", "## 风险与残余风险关联")),
|
||||
},
|
||||
}
|
||||
save_json("summary-s1-continued.json", summary)
|
||||
(ASSETS / "console.log").write_text("\n".join(LOG) + "\n", encoding="utf-8")
|
||||
print(json.dumps(summary, ensure_ascii=False, indent=2))
|
||||
ok = (
|
||||
summary["rd_planning_review"]["no_placeholder"]
|
||||
and summary["rd_design_vv"]["no_placeholder"]
|
||||
and summary["rd_planning_review"]["chars"] > 400
|
||||
and summary["rd_design_vv"]["chars"] > 400
|
||||
)
|
||||
sys.exit(0 if ok else 2)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"project_id": 6446,
|
||||
"rd_planning_review": {
|
||||
"run_status": "completed",
|
||||
"chars": 7958,
|
||||
"no_placeholder": true,
|
||||
"has_review_sections": true
|
||||
},
|
||||
"rd_design_vv": {
|
||||
"run_status": "completed",
|
||||
"chars": 10970,
|
||||
"no_placeholder": true,
|
||||
"has_protocol_sections": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
{
|
||||
"project_id": 6424,
|
||||
"lifecycle_status": "active",
|
||||
"active_workflow_key": "main",
|
||||
"instance": {
|
||||
"id": 287,
|
||||
"project_id": 6424,
|
||||
"workflow_version_id": 93,
|
||||
"instance_no": 1,
|
||||
"status": "active",
|
||||
"config_revision": 1,
|
||||
"plan_hash": "fa4721466a102c2cc4dc0d4a454e8ca684982571136b3f068d66fb428a417146",
|
||||
"config_snapshot": {
|
||||
"workflow_definition_key": "main",
|
||||
"workflow_version": 2,
|
||||
"workflow_version_id": 93,
|
||||
"stages": [
|
||||
{
|
||||
"stage_key": "V0.1_triage",
|
||||
"stage_name": "V0.1 需求摸底",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "intake",
|
||||
"task_title": "用户初始需求收集表",
|
||||
"enabled": true,
|
||||
"approval_configurable": true,
|
||||
"duties": {
|
||||
"author_user_id": 9,
|
||||
"reviewer_user_id": 11,
|
||||
"approver_user_id": 12
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "V0.5_feasibility",
|
||||
"stage_name": "V0.5 方案与可行性",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "feasibility_dev",
|
||||
"task_title": "设计开发可行性评估报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "feasibility_reg",
|
||||
"task_title": "注册路径可行性评估报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "prelim_design",
|
||||
"task_title": "系统初步设计方案",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "research",
|
||||
"task_title": "调研报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "user_requirements",
|
||||
"task_title": "用户需求表",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "V1.0_quoting",
|
||||
"stage_name": "V1.0 商务报价",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "cdo_quote",
|
||||
"task_title": "CDO 报价单",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"activated_by": 9,
|
||||
"activated_at": "2026-09-17T08:50:54.464545Z",
|
||||
"created_by": 9,
|
||||
"created_at": "2026-09-17T08:50:54.455933Z",
|
||||
"updated_at": "2026-09-17T08:50:54.464545Z"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"doc_id": "doc_proj6424_intake"
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
# 用户初始需求收集表
|
||||
|
||||
**项目**:rdev-s0-20260917-085054
|
||||
**阶段**:S0 设计输入摸底
|
||||
**撰写专员**:writer
|
||||
**整合终审**:leader
|
||||
**整理时间**:2026-09-17
|
||||
|
||||
---
|
||||
|
||||
## 结论
|
||||
|
||||
本次 S0 摸底阶段的输入材料极度稀缺。用户上传的 brief.md 仅含一句话:**"无创神经刺激器设计输入摸底。"**〔材料:brief.md〕
|
||||
|
||||
可锁定的事实基线如下:客户名称为**水木东方测试客户**,产品属于**二类有源医疗器械(神经刺激类)**,预期用途为**无创神经电刺激辅助改善目标症状**,目标注册市场为**中国 NMPA**。上述四项均来自 `project.md` 与 `blackboard.json` 的权威基线字段,并非从用户上传材料中抽取。〔来源:project.md / blackboard.json〕
|
||||
|
||||
**当前材料不足以支撑设计输入(DI)工作包启动。** 核心阻塞项包括:产品具体适应症/目标症状、技术参数、使用场景与使用者定位、临床评估路径,以及客户决策人信息。这些信息缺失将导致无法确定 NMPA 分类子路径、无法锁定适用标准、无法估算型检周期与注册成本。**下一步须通过商务渠道补齐上述信息,方可进入 DI 编写或型检规划阶段。**〔分析判断,无直接条文依据〕
|
||||
|
||||
---
|
||||
|
||||
## 产品与使用场景
|
||||
|
||||
### 结论句
|
||||
|
||||
**已知项**:产品为二类有源神经刺激器,属无创电刺激类,作用于神经系统。〔材料:brief.md、project.md〕
|
||||
|
||||
**未知项**:适应症(目标疾病/症状)、适用人群、使用环境(院内/家用)、操作流程、技术参数(刺激波形/频率/强度/通道数/供电方式)、禁忌症。
|
||||
|
||||
### 产品基本属性
|
||||
|
||||
| 维度 | 已知 | 待确认(G项对应) |
|
||||
|---|---|---|
|
||||
| 产品形态 | 二类有源医疗器械 | 具体形态(穿戴式/台式/手持式)**→ G02** |
|
||||
| 管理类别 | 二类(已锁定) | 是否需做三类升级评审**→ G01** |
|
||||
| 作用方式 | 无创神经电刺激 | 刺激部位、靶神经/靶区域**→ G01/G02** |
|
||||
| 适应症 | 辅助改善"目标症状"(未定义) | 具体症状/疾病名称**→ G01(阻塞)** |
|
||||
| 使用场景 | 未说明 | 医疗机构/家用**→ G03(阻塞)** |
|
||||
| 使用者 | 未说明 | 专业人员/患者自用**→ G03(阻塞)** |
|
||||
| 使用环境 | 未说明 | 医院/门诊/居家**→ G03** |
|
||||
| 操作流程 | 未说明 | 每日频次/单次时长/疗程设计**→ G02** |
|
||||
|
||||
### 解读
|
||||
|
||||
无创神经电刺激类设备在 NMPA 分类体系中常见于二类有源医疗器械,例如经皮电神经刺激仪(海关编码/注册分类对应 6826)、经颅电刺激仪、肌肉刺激仪等。但具体亚类须依据**作用靶点(外周神经/颅内神经/脊髓)和适应症**确认对应分类号。不同分类子路径对应不同的注册检验标准组合:
|
||||
|
||||
- 若为**经颅刺激**(如经颅直流电刺激 tDCS、经颅电刺激 tES):须额外满足电磁兼容性(EMC)与电磁场安全要求,对应 GB 9706.1 系列中特定适用标准;
|
||||
- 若为**外周神经刺激**(如周围神经电刺激仪):标准组合以通用电气安全(GB 9706.1)为主。
|
||||
|
||||
**本次无法判断具体分类路径与对应标准,取决于 G01(适应症)和 G02(技术参数)的补齐。**〔分析判断,无直接条文依据〕
|
||||
|
||||
### 对本项目的含义
|
||||
|
||||
在适应症和技术参数未知的前提下:
|
||||
1. 无法为产品分配准确的 NMPA 注册分类子号;
|
||||
2. 无法确定型检项目组合与试验周期;
|
||||
3. 无法判断是否豁免临床试验或须提交临床评价资料;
|
||||
4. 无法制定有针对性的竞品对标策略。
|
||||
|
||||
**结论:当前阶段不满足设计输入(DI)文件编写的前置条件,须优先完成信息补全。**
|
||||
|
||||
---
|
||||
|
||||
## 客户诉求与约束
|
||||
|
||||
### 结论句
|
||||
|
||||
**客户诉求**:未知。现有材料仅表明"设计输入摸底"意图,未提供任何诉求细节、排期节点、预算范围或特殊约束。〔材料:brief.md〕
|
||||
|
||||
### 已知与待确认的诉求维度
|
||||
|
||||
| 维度 | 状态 | 说明 |
|
||||
|---|---|---|
|
||||
| 客户名称 | **已锁定** | 水木东方测试客户〔project.md / blackboard.json〕 |
|
||||
| 时间要求 | **待确认**(G06) | 材料未提供任何时间节点或里程碑 |
|
||||
| 预算范围 | **待确认**(G06) | 材料未提及 |
|
||||
| 特殊监管约束 | **待确认**(G04) | 材料未说明是否已有临床数据、型检报告或同类注册历史 |
|
||||
| 已有资料清单 | **待确认**(G08) | 材料未说明客户是否已持有检测报告、临床评估或设计文档 |
|
||||
| 决策授权边界 | **待确认**(G05) | 材料未提及具体负责人或对接人 |
|
||||
|
||||
### 解读
|
||||
|
||||
本次任务定性为 **S0 设计输入摸底**,符合从零启动新项目的特征。设计输入(Design Input)作为医疗器械质量管理体系(YY/T 0287 / ISO 13485)的核心输入文件,其启动条件要求至少具备:产品预期用途与适应症、基本技术性能要求、适用标准清单、使用场景与使用者定义。〔参考:YY/T 0287-2017 §5.3 设计开发输入〕
|
||||
|
||||
当前材料缺少以上全部要素,**若不补全即推进 DI,将导致文件无法通过设计评审(DCP),并在后续型检和注册阶段面临补充整改风险。** 用户偏好关注"关键研发排期、型检周期与备料冗余、法规标准合规与审评审批风险"(来源:user.md),但目前因基础参数缺失,上述任何一项均无法展开分析。**建议通过商务渠道一次性补全信息清单,避免反复拉锯。**〔分析判断,无直接条文依据〕
|
||||
|
||||
---
|
||||
|
||||
## 已有材料摘要
|
||||
|
||||
### brief.md
|
||||
|
||||
| 项目 | 内容 |
|
||||
|---|---|
|
||||
| **文件路径** | `context/materials_text/brief.md` |
|
||||
| **内容全文** | "无创神经刺激器设计输入摸底。" |
|
||||
| **抽取事实** | 产品为无创神经刺激器;任务性质为设计输入摸底(S0 阶段) |
|
||||
| **与本阶段结论的关系** | 仅定义了大类方向,无任何可支撑设计输入的参数 |
|
||||
| **内部矛盾** | 无(材料过于简短,无内部矛盾可辨) |
|
||||
|
||||
### _all.txt
|
||||
|
||||
| 项目 | 内容 |
|
||||
|---|---|
|
||||
| **文件路径** | `context/materials_text/_all.txt` |
|
||||
| **内容摘要** | 全文仅为 brief.md 的重复汇总,无额外材料 |
|
||||
| **结论** | 本窗口无用户上传附件(如合同、规格书、会议纪要、检测报告、参考文献等) |
|
||||
|
||||
**本阶段材料极度匮乏**,任何超出"无创神经刺激器"这一分类大方向的注册策略、技术选型或临床方案讨论,均属无材料支撑的分析,须待信息补全后重新评估。〔材料:brief.md〕
|
||||
|
||||
---
|
||||
|
||||
## 矛盾与疑点
|
||||
|
||||
本次输入材料不存在内部矛盾(因材料仅一句话)。与常规范例的偏离如下:
|
||||
|
||||
| 项目 | 常规范例(S0 DI 启动包) | 本次实际 | 对本项目的影响 |
|
||||
|---|---|---|---|
|
||||
| 设计输入摸底 | 应含适应症、技术参数、预期性能、可用标准清单 | 仅一句话 | **阻塞**:无法开跑 DI |
|
||||
| 二类有源器械 | 应有具体产品名称/型号、预期使用者、禁忌症 | 无 | **阻塞**:无法确定分类子路径 |
|
||||
| NMPA 注册规划 | 应有目标注册证类型、时间线、型检安排 | 无 | **阻塞**:无法制定注册策略 |
|
||||
| 用户决策链 | 应有项目负责人/对接人/决策授权人 | 无 | **阻塞**:无法确定信息补全渠道 |
|
||||
|
||||
---
|
||||
|
||||
## 待确认清单
|
||||
|
||||
### 阻塞信息(无以下信息则无法开跑下一阶段)
|
||||
|
||||
| # | 缺什么 | 为什么重要 | 优先级 |
|
||||
|---|---|---|---|
|
||||
| **G01** | **产品具体适应症/目标症状** | 决定 NMPA 分类子路径(不同适应症对应不同注册路径与标准组合),影响临床评价要求 | 最高 |
|
||||
| **G02** | **技术参数**(刺激波形、频率范围、强度范围、通道数、供电方式、尺寸/重量、预期使用寿命) | 设计输入(DI)核心组成部分,也是型检报告的出具依据;技术参数缺失则 DI 文件无法通过评审 | 最高 |
|
||||
| **G03** | **使用场景与使用者定位**(专业机构/家用;专业人员操作/患者自用) | 影响产品分类(是否涉及家用安全特殊要求)、适用标准(GB 9706.1 家用篇条款)、标签与说明书要求 | 高 |
|
||||
| **G04** | **临床评估路径**(是否已有临床数据;是否具备豁免临床试验条件;临床评价资料是否已完成) | 直接影响注册周期与成本;若需补充临床试验,周期可能延长 12–36 个月 | 高 |
|
||||
| **G05** | **客户决策人/对接人信息**(姓名、职务、联系方式、决策授权范围) | 须确认可向谁追问 G01–G04 及其他后续信息;无决策人则信息补全无渠道 | 高 |
|
||||
|
||||
### 非阻塞信息(补充后可显著提升分析精度,不阻断 S0 框架搭建)
|
||||
|
||||
| # | 缺什么 | 为什么重要 | 优先级 |
|
||||
|---|---|---|---|
|
||||
| **G06** | **预算范围与目标时间节点** | 影响注册路径选择(优先审批通道 vs. 常规通道);型检机构档期排期;临床试验方案规模 | 中 |
|
||||
| **G07** | **竞争对手或同类已上市产品信息** | 参考设计输入对标;已有注册证信息可辅助判断分类路径与审评关注点 | 中 |
|
||||
| **G08** | **已有检测报告或临床评估文档清单** | 判断是否可复用已有检测数据,减少重复检测费用与时间;若已有同类产品注册经历,可复用部分临床评价 | 中 |
|
||||
|
||||
---
|
||||
|
||||
## 阻塞信息(字段快照)
|
||||
|
||||
| 字段 | 值 | 来源 |
|
||||
|---|---|---|
|
||||
| 客户名称 | 水木东方测试客户 | project.md / blackboard.json |
|
||||
| 产品类型/器械分类 | 二类有源医疗器械(神经刺激) | project.md / blackboard.json |
|
||||
| 预期用途 | 无创神经电刺激辅助改善目标症状 | project.md / blackboard.json |
|
||||
| 目标市场/注册区域 | 中国 NMPA | project.md / blackboard.json |
|
||||
|
||||
---
|
||||
|
||||
## 非阻塞信息(字段快照)
|
||||
|
||||
| 字段 | 值 | 状态 |
|
||||
|---|---|---|
|
||||
| 时间要求 | 未提供 | **待确认**(G06) |
|
||||
| 预算范围 | 未提供 | **待确认**(G06) |
|
||||
| 已有资料清单 | 未提供 | **待确认**(G08) |
|
||||
| 特殊约束 | 未提供 | **待确认**(G04/G08) |
|
||||
| 客户决策人/对接人 | 未提供 | **待确认**(G05) |
|
||||
|
||||
---
|
||||
|
||||
## 本阶段材料快照
|
||||
|
||||
**原始材料**:brief.md(内容全文:`"无创神经刺激器设计输入摸底。"`)
|
||||
|
||||
**前序组织产出**:01_organize/output.md(由 organizer 专员于 2026-09-17 整理,已归档至 `tasks/01_organize/output.md`)
|
||||
|
||||
**本次撰写依据**:template.md(用户初始需求收集表模板)、blackboard.json(权威基线字段)、project.md(项目全局立项基线)、user.md(用户决策偏好与约束)、01_organize/output.md(前序事实整理报告)
|
||||
|
||||
---
|
||||
|
||||
## 决策事项
|
||||
|
||||
**当前阶段无需拍板决策。** 本次交付为 S0 摸底阶段的文档基线终稿,旨在整理已知事实并显式化缺口,为后续商务信息补全提供结构化清单。
|
||||
|
||||
**下一步行动(面向工作流负责人)**:
|
||||
|
||||
1. 通过商务渠道向水木东方测试客户获取 G01–G05(阻塞信息);
|
||||
2. G06–G08(非阻塞信息)视项目推进节奏逐步补全;
|
||||
3. 信息补全后,由技术专员依据更新后的事实基线,产出 DI 初稿或可行性评估报告。
|
||||
|
||||
---
|
||||
|
||||
## 自检清单(负责人终审执行)
|
||||
|
||||
- [x] 模板每个章节均已写完,无残留括号提示
|
||||
- [x] 关键数字/路径/参数均已标注来源;无数字时标注"材料未提供"或"待确认"
|
||||
- [x] 所有「待确认」项已在文末待确认清单中汇总(阻塞/非阻塞分开)
|
||||
- [x] 无未标注的推测(分析判断类均标注"分析判断,无直接条文依据")
|
||||
- [x] 专员已标注的出处均已保留
|
||||
- [x] 未从材料中抽取任何未提供的参数
|
||||
- [x] 正文各节均按四段式(结论句 → 列表/要点 → 解读 → 出处)展开
|
||||
- [x] 适用与不适用、机会与风险、已知与待确认均已显式覆盖
|
||||
- [x] 前序已批准文件(blackboard.json / project.md)与本阶段材料一致,无冲突
|
||||
@@ -0,0 +1,61 @@
|
||||
## 角色
|
||||
|
||||
你是北京水木东方(医疗器械 CDMO)项目文档小队的商务对接负责人。你是用户与小队之间的唯一接口:专员向你汇报,只有你对用户说话、提交阶段文档。
|
||||
|
||||
你的价值不在于自己写长文,而在于把本阶段需求变成可验收的任务,审核专员产出,整合成一份可提交的 Markdown 终稿。结论短、论证完整:卡片可以短,阶段 Word 不能短。
|
||||
|
||||
## 汇报纪律
|
||||
|
||||
- 只有你可以把成果交给用户(通过系统落文档)。不要把未审核的专员原文直接当终稿。
|
||||
- 需要用户决策的事项一律上升,不要代用户拍板。
|
||||
- 专员产出不合格时退回说明差距;系统按剧本执行,你负责审核与整合。
|
||||
|
||||
## 本阶段你要做的
|
||||
|
||||
1. 用一句话回述本阶段交付物。
|
||||
2. 阅读快照、材料文本、前序文档和各专员 `output.md`。
|
||||
3. 按本阶段模板整合终稿,结论先行;与前序已批准文件保持一致。
|
||||
4. 缺信息标「待确认」,不要编造。
|
||||
5. 按 TASK.md 指定的交付文件落盘:终稿步写 `output.md`;若本步是「审核撰写计划」(review_plan),只写 `review_notes.md`,**禁止**把审核意见写入或覆盖 `output.md`。
|
||||
6. 专员已标注的出处必须保留;你整合时把能溯源的句子标上〔…〕,无依据的分析不要删,也不要补造引用。
|
||||
|
||||
## 汇报格式(终稿 output.md 开头;计划审核则写在 review_notes.md)
|
||||
|
||||
**注意**:你整合生成的终稿文档结构必须严格遵循 `template.md` 的所有章节结构,不得自行替换为审阅报告结构!你的审阅和把关成果体现为:在保持 `template.md` 章节骨架(如 ## 结论、## 产品与使用场景、## 客户诉求与约束、## 已有材料摘要、## 待确认清单 等)的基础上,将专员的草稿进行逻辑润色、出处溯源和终审定稿输出。
|
||||
|
||||
**待确认清单**:在模板对应章节中集中列出文中所有「待确认」。
|
||||
|
||||
|
||||
## 写作质量
|
||||
|
||||
模板是章节骨架,不是篇幅上限。禁止把模板括号提示原样留下。卡片摘要可以短;阶段文档必须论证完整。结论短、论证完整。
|
||||
|
||||
### 详细
|
||||
|
||||
- 每一节至少包含:结论句 → 表格或列表(可用 Mermaid,图表要有标题) → 解读段落 → 支撑明细或出处。不要通篇只有列表。
|
||||
- 数字必须写清口径、假设、来源与日期。没有数字时写「未检索到公开信息」或「材料未提供」,并说明已尝试路径。
|
||||
- 表格禁止交空壳:至少填已知行;若确实无数据,用一行写明「为何为空」及待确认项。
|
||||
- 专员交给撰写岗的稿件要写完整论据,不要只交标题或提纲。
|
||||
|
||||
### 逻辑通顺
|
||||
|
||||
- 结论先行,后文不得与结论打架。写作过程中出现新事实,必须回写结论。
|
||||
- 章节按「事实 → 分析 → 对本项目的含义 → 建议或待拍板」推进。
|
||||
- 前序已批准文档与本阶段材料冲突时,两个都列出来并标记冲突,不默默取一边。
|
||||
- 选项对比用同一套维度(证据、周期、成本量级、风险、适用条件)。术语首次出现先定义。
|
||||
- 因果链写清:因 → 果 → 建议。不要跳跃到未交代的前提。
|
||||
|
||||
### 考虑全面
|
||||
|
||||
- 每份终稿显式覆盖:适用与不适用、机会与风险、优势与短板、已知与待确认、现在要用户做什么。没有决策则写「无需决策」。
|
||||
- 写推荐必须同时写否决或失效条件。
|
||||
- 能标出处的句子必须标〔…〕。无直接条文依据的分析保留,并标「(分析判断,无直接条文依据)」。
|
||||
- 会议纪要类短文档至少要有一个流程或责任矩阵。
|
||||
|
||||
### 自检(撰写岗与负责人必做)
|
||||
|
||||
1. 模板中的每个章节是否都写完,没有残留括号提示。
|
||||
2. 关键数字、路径、参数前后是否一致,且可追溯。
|
||||
3. 文中所有「待确认」是否已在文末清单汇总。
|
||||
4. 是否有未标注的推测、疗效宣称或绝对化用语。
|
||||
5. 专员已标注的出处是否保留;无依据的分析是否被误删。
|
||||
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"instance": {
|
||||
"id": 287,
|
||||
"project_id": 6424,
|
||||
"workflow_version_id": 93,
|
||||
"instance_no": 1,
|
||||
"status": "completed",
|
||||
"config_revision": 4,
|
||||
"plan_hash": "fa4721466a102c2cc4dc0d4a454e8ca684982571136b3f068d66fb428a417146",
|
||||
"config_snapshot": {
|
||||
"workflow_definition_key": "main",
|
||||
"workflow_version": 2,
|
||||
"workflow_version_id": 93,
|
||||
"stages": [
|
||||
{
|
||||
"stage_key": "V0.1_triage",
|
||||
"stage_name": "V0.1 需求摸底",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "intake",
|
||||
"task_title": "用户初始需求收集表",
|
||||
"enabled": true,
|
||||
"approval_configurable": true,
|
||||
"duties": {
|
||||
"author_user_id": 9,
|
||||
"reviewer_user_id": 11,
|
||||
"approver_user_id": 12
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "V0.5_feasibility",
|
||||
"stage_name": "V0.5 方案与可行性",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "feasibility_dev",
|
||||
"task_title": "设计开发可行性评估报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "feasibility_reg",
|
||||
"task_title": "注册路径可行性评估报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "prelim_design",
|
||||
"task_title": "系统初步设计方案",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "research",
|
||||
"task_title": "调研报告",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
},
|
||||
{
|
||||
"task_key": "user_requirements",
|
||||
"task_title": "用户需求表",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"stage_key": "V1.0_quoting",
|
||||
"stage_name": "V1.0 商务报价",
|
||||
"enabled": true,
|
||||
"doc_tasks": [
|
||||
{
|
||||
"task_key": "cdo_quote",
|
||||
"task_title": "CDO 报价单",
|
||||
"enabled": false,
|
||||
"approval_configurable": true,
|
||||
"duties": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"activated_by": 9,
|
||||
"activated_at": "2026-09-17T08:50:54.464545Z",
|
||||
"created_by": 9,
|
||||
"created_at": "2026-09-17T08:50:54.455933Z",
|
||||
"updated_at": "2026-09-17T08:54:38.265556Z"
|
||||
},
|
||||
"stages": [
|
||||
{
|
||||
"id": 391,
|
||||
"stage_key": "V0.1_triage",
|
||||
"position": 10,
|
||||
"enabled": true,
|
||||
"status": "completed",
|
||||
"doc_tasks": [
|
||||
{
|
||||
"id": 323,
|
||||
"task_key": "intake",
|
||||
"enabled": true,
|
||||
"status": "pending",
|
||||
"approved": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 392,
|
||||
"stage_key": "V0.5_feasibility",
|
||||
"position": 20,
|
||||
"enabled": true,
|
||||
"status": "completed",
|
||||
"doc_tasks": [
|
||||
{
|
||||
"id": 324,
|
||||
"task_key": "feasibility_dev",
|
||||
"enabled": false,
|
||||
"status": "skipped_disabled",
|
||||
"approved": false
|
||||
},
|
||||
{
|
||||
"id": 325,
|
||||
"task_key": "feasibility_reg",
|
||||
"enabled": false,
|
||||
"status": "skipped_disabled",
|
||||
"approved": false
|
||||
},
|
||||
{
|
||||
"id": 326,
|
||||
"task_key": "prelim_design",
|
||||
"enabled": false,
|
||||
"status": "skipped_disabled",
|
||||
"approved": false
|
||||
},
|
||||
{
|
||||
"id": 327,
|
||||
"task_key": "research",
|
||||
"enabled": false,
|
||||
"status": "skipped_disabled",
|
||||
"approved": false
|
||||
},
|
||||
{
|
||||
"id": 328,
|
||||
"task_key": "user_requirements",
|
||||
"enabled": false,
|
||||
"status": "skipped_disabled",
|
||||
"approved": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 393,
|
||||
"stage_key": "V1.0_quoting",
|
||||
"position": 30,
|
||||
"enabled": true,
|
||||
"status": "completed",
|
||||
"doc_tasks": [
|
||||
{
|
||||
"id": 329,
|
||||
"task_key": "cdo_quote",
|
||||
"enabled": false,
|
||||
"status": "skipped_disabled",
|
||||
"approved": false
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||