docs(regulatory-info-package): 更新材料包生成设计决策

This commit is contained in:
2026-06-10 23:56:20 +08:00
parent cf4f4456c4
commit 3bcf9647a1
5 changed files with 116 additions and 45 deletions

View File

@@ -19,7 +19,9 @@
## 一、开发计划目标
本开发计划面向 Codex 执行,目标是把 `regulatory_info_package` 独立工作流按可验证、可回滚、可阶段提交的方式落地。计划以现有自动填表工作流 `application_form_fill` 为主要参考,但保持独立模块、独立批次、独立产物、独立通知和独立前端卡片。
本开发计划面向 Codex 执行,目标是把 `regulatory_info_package` 独立工作流按可验证、可回滚、可阶段验收的方式落地。计划以现有自动填表工作流 `application_form_fill` 为主要参考,但保持独立模块、独立批次、独立产物、独立通知和独立前端卡片。
现状裁决:当前最新代码中尚未存在 `regulatory_info_package` 正式工作流,本计划按“新建正式材料包工作流”执行;不得把该功能并入或改造 `application_form_fill`
开发完成后用户可在对话中上传或指定产品说明书并通过“根据说明书生成第1章监管信息”触发工作流。系统基于 `docs/0.原始材料/第1章 监管信息` 样例模板生成 7 个监管信息文件,以 `第1章 监管信息(预生成版).zip` 作为首位下载入口,同时提供单文件和追溯 Excel 辅助下载。
@@ -32,18 +34,20 @@
| 工作流独立 | 新增 `workflow_type=regulatory_info_package`,不并入 `application_form_fill` |
| 模块独立 | 新增 `review_agent/regulatory_info_package/`,服务与自动填表平级 |
| 模型集中 | Django 模型继续放在 `review_agent/models.py` |
| 节点幂等 | RIP 节点必须基于 `workflow_type + workflow_batch_id + node_code` 做幂等创建或数据库唯一约束 |
| 单说明书输入 | 用户消息指定文件名优先,其次 active 附件,再兼容最近成功文件汇总 |
| 多候选处理 | 不做选择弹窗,通过对话反问用户确认说明书文件名 |
| 模板固定 | 固定处理第1章监管信息 7 个模板 |
| 模板字段化 | 优先把模板整理为 Agent/代码可识别的字段模板,使用内容控件 Tag 或稳定占位符;代码只填字段,不依赖手工改格式 |
| 抽取策略 | 规则抽取和 LLM 抽取并行LLM 最多重试 3 次,失败后规则结果继续 |
| 文档生成 | 工作流节点串行,`generate_docs` 节点内部每个文档独立线程处理 |
| `.doc` 策略 | CH1.9 优先原生 `.doc` 写入,失败后允许 `.docx` 兜底 |
| `.doc` 策略 | CH1.9 能力驱动:探测到 Word COM/UNO 时优先原生 `.doc`,无原生能力时明确记录并允许 `.docx` 兜底 |
| zip 策略 | zip 只包含成功或兜底成功文件,失败文件不进入 zip |
| 高亮策略 | 缺失项 `/` 黄底LLM-only 黄底;冲突黄底红字 |
| 追溯策略 | 用户下载 ExcelJSON 只写后台 logs 目录 |
| 前端策略 | 只做最小接入,不单独建设新页面或独立样式体系 |
| TDD | 新行为先写失败测试,再实现 |
| Git 提交 | 每阶段验证通过后生成提交摘要本地提交 |
| Git 提交 | 每阶段验证通过后生成提交摘要;是否本地提交由用户确认 |
| 用户变更保护 | 不回滚、不覆盖用户已有未提交变更 |
---
@@ -156,7 +160,7 @@ pytest tests/test_file_summary_views.py -k download
| 目标 | 生成数据库迁移并覆盖基础模型行为 |
| 修改范围 | `review_agent/migrations/``tests/` |
| 验收标准 | migration 可应用模型测试覆盖批次号、状态、artifact、通知、zip export type |
| Codex 执行提示 | 请生成迁移并新增 `tests/test_regulatory_info_package_models.py`,优先覆盖模型字段默认值导出类型。 |
| Codex 执行提示 | 请生成迁移并新增 `tests/test_regulatory_info_package_models.py`,优先覆盖模型字段默认值导出类型,以及 `WorkflowNodeRun` 在 RIP 批次下的幂等/唯一节点创建。 |
### RIP-1 阶段验证
@@ -182,10 +186,10 @@ pytest tests/test_regulatory_info_package_models.py tests/test_file_summary_view
| 项 | 内容 |
| --- | --- |
| 目标 | 配置 7 个样例模板、输出文件名、策略和 `.doc` 标记 |
| 目标 | 配置 7 个样例模板、输出文件名、策略、字段 Tag/占位符映射`.doc` 标记 |
| 修改范围 | `review_agent/regulatory_info_package/templates/regulatory_info_package_templates_v1.yaml` |
| 验收标准 | 7 个模板完整zip 名称为 `第1章 监管信息(预生成版).zip` |
| Codex 执行提示 | 请按详细设计录入模板配置source_dir 指向样例目录CH1.9 必须声明 `require_legacy_doc_native: true`。 |
| 验收标准 | 7 个模板完整zip 名称为 `第1章 监管信息(预生成版).zip`;字段映射优先使用内容控件 Tag 或稳定占位符 |
| Codex 执行提示 | 请按详细设计录入模板配置source_dir 指向样例目录,字段 targets 优先写 content_control_tag 或 placeholderCH1.9 声明 `prefer_legacy_doc_native: true` 且允许 docx fallback。 |
### RIP-2-003 实现配置加载、模板仓库和存储目录
@@ -193,8 +197,17 @@ pytest tests/test_regulatory_info_package_models.py tests/test_file_summary_view
| --- | --- |
| 目标 | 实现 YAML 加载校验、模板复制、批次目录创建、路径安全检查 |
| 修改范围 | `template_config.py``template_repository.py``storage.py` |
| 验收标准 | 配置错误可返回清晰错误;模板只复制到批次目录;不写原始材料目录 |
| Codex 执行提示 | 请实现配置加载模板复制服务,所有路径必须校验位于批次工作目录内,原始模板目录只读。 |
| 验收标准 | 配置错误可返回清晰错误;模板只复制到批次目录;不写原始材料目录;能审计模板是否包含所需 Tag/占位符 |
| Codex 执行提示 | 请实现配置加载模板复制和模板字段审计服务,所有路径必须校验位于批次工作目录内,原始模板目录只读。 |
### RIP-2-004 模板字段化整理与审计
| 项 | 内容 |
| --- | --- |
| 目标 | 将样例模板升级为代码友好的字段模板,不手工改生成文件格式 |
| 修改范围 | `docs/0.原始材料/第1章 监管信息` 的模板副本或 `review_agent/regulatory_info_package/templates/field_manifest.yaml` |
| 验收标准 | CH1.4 关键字段、复选框、声明类产品名/申请人位置有稳定 Tag 或占位符;审计缺失字段时测试失败 |
| Codex 执行提示 | 请优先使用 Word 内容控件 Tag若暂不具备内容控件编辑能力则使用不会影响版式的稳定占位符并在配置中记录字段与目标位置。 |
### RIP-2 阶段验证
@@ -380,8 +393,8 @@ pytest tests/test_regulatory_info_package_docx_writer.py tests/test_regulatory_i
| --- | --- |
| 目标 | 探测 Word COM、LibreOffice UNO 或可用兜底能力 |
| 修改范围 | `services/legacy_doc_document.py` |
| 验收标准 | 当前环境无原生能力时返回清晰 capability不崩溃 |
| Codex 执行提示 | 请先实现能力探测和接口骨架Windows Word COM 可作为优先实现;不可用时进入 docx 兜底。 |
| 验收标准 | 当前环境无原生能力时返回清晰 capability不崩溃;测试不要求本机必须安装 Word 或 LibreOffice |
| Codex 执行提示 | 请先实现能力探测和接口骨架Windows Word COM/LibreOffice UNO 可作为原生能力;不可用时明确进入 docx 兜底。 |
### RIP-7-002 实现 CH1.9 原生写入与 docx 兜底
@@ -389,8 +402,8 @@ pytest tests/test_regulatory_info_package_docx_writer.py tests/test_regulatory_i
| --- | --- |
| 目标 | CH1.9 优先 `.doc` 输出,失败时生成同语义 `.docx` |
| 修改范围 | `legacy_doc_document.py``package_generate.py` |
| 验收标准 | 原生成功状态 success兜底成功状态 fallback_success两者失败不进入 zip |
| Codex 执行提示 | 请把原生失败和兜底失败都写入 `adapter_summary``risk_notes`,不要静默转换。 |
| 验收标准 | 有原生能力时原生成功状态 success无原生能力或原生失败但兜底成功状态 fallback_success两者失败不进入 zip |
| Codex 执行提示 | 请把能力探测、原生失败和兜底失败都写入 `adapter_summary``risk_notes`,不要静默转换。 |
### RIP-7-003 补充 doc 适配器测试
@@ -565,9 +578,9 @@ pytest tests/test_regulatory_info_package_models.py tests/test_regulatory_info_p
| 用户变更保护 | 不得回滚或覆盖用户已有未提交变更 |
| 过程日志 | 每阶段记录关键命令结果和既有失败 |
| 阶段验证 | 每阶段完成后运行对应验证命令 |
| 阶段提交 | 每阶段验证通过后生成提交摘要并本地提交 |
| 阶段提交 | 每阶段验证通过后生成提交摘要;是否执行 `git commit` 由用户确认 |
| 回归保护 | 文件汇总、法规核查、自动填表现有测试不得回归 |
| doc 风险隔离 | `.doc` 原生处理失败不得阻断其他 6 个 docx 文件生成 |
| doc 风险隔离 | `.doc` 原生能力不可用或原生处理失败不得阻断其他 6 个 docx 文件生成 |
| 外部依赖隔离 | LLM、通知、Word COM 均需可 mock测试不依赖真实外部服务 |
| 下载安全 | 所有导出下载必须通过所属用户权限校验 |
@@ -588,7 +601,7 @@ pytest tests/test_regulatory_info_package_models.py tests/test_regulatory_info_p
5. 不回滚、不覆盖用户已有未提交变更。
6. LLM、通知、Word COM 等外部能力必须可 mock。
7. 每阶段完成后运行该阶段验证命令。
8. 验证通过后生成提交摘要本地提交。
8. 验证通过后生成提交摘要,是否本地提交等待用户确认
9. 最后使用 docs/0.原始材料/目标产品说明书.docx 做端到端验收。
```