diff --git a/.doc/backlog/2026-09-17-rdev-phase2-backlog.md b/.doc/backlog/2026-09-17-rdev-phase2-backlog.md index 65c7b661..21fb791f 100644 --- a/.doc/backlog/2026-09-17-rdev-phase2-backlog.md +++ b/.doc/backlog/2026-09-17-rdev-phase2-backlog.md @@ -52,9 +52,8 @@ ### S1 续批 — 剩余模板专业章节 -- **范围**:阶段 06–13 尚未补强的约 27 份通用占位模板 + 中等档约 9 份(补逐节指令与预填行);评审记录类已较完整者可跳过或轻触 -- **方法**:沿用 [08-rdev模板写作规范](../system-design/project-workflow/08-rdev模板写作规范.md);`rdev_template_lint_test` allowlist 随批增长 -- **验收**:lint 绿灯;抽样 1–2 份真 PI 或 stub 结构抽检 +- **状态**:✅ **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 — 运行时编排与配置化 diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 0673f14e..5b1c6022 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -5,7 +5,7 @@ ## 焦点 -1. **rdev 模板深度 S1 续批**:剩余 46 份模板同等深度补强(`feature/rdev-template-depth-s1-continued`) +1. **rdev 模板深度 S1 续批**:46 份补强 + 真 PI 抽样已完成,待合入 `dev`(`feature/rdev-template-depth-s1-continued`) 2. **document-author-only / 变更提案 HTTP**:已合入并推送 `origin/dev`;dev 试点总开关 on;未晋升 test/main 3. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`;`SEMANTIC_SUMMARY_REPLACE` 不随 W2 开启;FAV live 观察窗证据驱动;`FAV_DEGRADED_READ=false`;项目 143 只读 @@ -15,7 +15,7 @@ |-------|------|--------|----------|-------|--------| | 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 | in_progress | +| 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 | diff --git a/.doc/ops/short-term/2026-09-17-rdev-template-depth-s1-continued.md b/.doc/ops/short-term/2026-09-17-rdev-template-depth-s1-continued.md index d71b30a6..a6ac99fb 100644 --- a/.doc/ops/short-term/2026-09-17-rdev-template-depth-s1-continued.md +++ b/.doc/ops/short-term/2026-09-17-rdev-template-depth-s1-continued.md @@ -1,6 +1,6 @@ --- title: "rdev 模板深度补强 S1 续批(剩余 46 份)" -status: in_progress +status: done created: 2026-09-17 updated: 2026-09-17 owner: Cursor @@ -31,25 +31,27 @@ mutex: rdev-templates ## 步骤 -1. [ ] 批1 评审记录 6 份 -2. [ ] 批2 硬件/工艺 8 份 -3. [ ] 批3 软件/检验/清单 9 份 -4. [ ] 批4 验证 12 份 -5. [ ] 批5 转换/确认 11 份 -6. [ ] 抽样真 PI + 文档同步 + 合入 push +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 步骤) ## 验收标准 -- [ ] 46 份无「按本阶段专业结构写」;lint allowlist 60/60 -- [ ] 抽样 1–2 份真 PI PASS -- [ ] FEATURE-MATRIX / 写作规范 / backlog 已更新 +- [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` diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index 1d7ac4c9..85423242 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -55,7 +55,7 @@ | 对话数据治理(D7) | 留存/删除口径、库·备份·日志控制、敏感字段加密边界 | deferred | deferred_enhancement(违规则升 blocker) | [计划](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) Scope Boundaries;[收口 §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);[模板深度报告](../test-reports/2026-09-17-rdev-template-depth-test-report.md);[写作规范](../system-design/project-workflow/08-rdev模板写作规范.md);[backlog](../backlog/2026-09-17-rdev-phase2-backlog.md) | **P0+P1 done**。**模板深度 S0+S1 首批 done**:leader prompt 已修(`rdev_leader` + InstructionsFile 注入);14/60 模板已补强(阶段 01–05);真 PI 打样 PASS(项目 6424 intake + 6425 `rd_design_input_spec`,`stage=RD03_design_input`)。剩余:27 份模板 + 中等档补强(S1 续批)、S2/S3、P2 前端、P3 三样本 E2E、P4 键名空间化 | `workflow-def` / `rdev-templates` | +| 研发设计控制(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` | diff --git a/.doc/system-design/project-workflow/08-rdev模板写作规范.md b/.doc/system-design/project-workflow/08-rdev模板写作规范.md index 77808bb1..4dd7119c 100644 --- a/.doc/system-design/project-workflow/08-rdev模板写作规范.md +++ b/.doc/system-design/project-workflow/08-rdev模板写作规范.md @@ -39,7 +39,12 @@ | 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 续批 | 阶段 06–13 剩余约 27 份 + 中等档约 9 份 | follow-up | +| 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 门禁 diff --git a/.doc/test-reports/2026-09-17-rdev-template-depth-s1-continued-test-report.md b/.doc/test-reports/2026-09-17-rdev-template-depth-s1-continued-test-report.md new file mode 100644 index 00000000..3d0a0b8a --- /dev/null +++ b/.doc/test-reports/2026-09-17-rdev-template-depth-s1-continued-test-report.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。 diff --git a/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/activate-rdev.json b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/activate-rdev.json new file mode 100644 index 00000000..1bc64703 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/activate-rdev.json @@ -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" + } +} \ No newline at end of file diff --git a/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/pi-rd_design_vv-meta.json b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/pi-rd_design_vv-meta.json new file mode 100644 index 00000000..2fe39a97 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/pi-rd_design_vv-meta.json @@ -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 + } +} \ No newline at end of file diff --git a/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/pi-rd_planning_review-meta.json b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/pi-rd_planning_review-meta.json new file mode 100644 index 00000000..ccc1a560 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/pi-rd_planning_review-meta.json @@ -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 + } +} \ No newline at end of file diff --git a/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/project.json b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/project.json new file mode 100644 index 00000000..df3aeb7b --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/project.json @@ -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" +} \ No newline at end of file diff --git a/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/rd_design_vv-final.md b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/rd_design_vv-final.md new file mode 100644 index 00000000..3a0771c2 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/rd_design_vv-final.md @@ -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* diff --git a/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/rd_planning_review-final.md b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/rd_planning_review-final.md new file mode 100644 index 00000000..f1fb4e5b --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/rd_planning_review-final.md @@ -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
软件安全分级] -->|阻塞| B[风险管理文档] + A -->|阻塞| C[电气安全型检] + A -->|阻塞| D[注册审评] + + E[REV-A-002
项目建议书与设计开发计划] -->|阻塞| F[实质性评审决议] + E -->|阻塞| G[进入设计开发阶段] + + H[REV-A-003
用户需求表正文] -->|阻塞| 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**:智能体小队协同通用规范 diff --git a/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/run_s1_sample_real_pi.py b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/run_s1_sample_real_pi.py new file mode 100644 index 00000000..54cb8b0a --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/run_s1_sample_real_pi.py @@ -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() diff --git a/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/summary-s1-continued.json b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/summary-s1-continued.json new file mode 100644 index 00000000..24624b08 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-rdev-template-depth-s1-continued/summary-s1-continued.json @@ -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 + } +} \ No newline at end of file