docs(regulatory-review): 拆分法规核查开发计划

This commit is contained in:
2026-06-07 00:11:01 +08:00
parent df3f393dd2
commit e58da66853
2 changed files with 657 additions and 0 deletions

View File

@@ -0,0 +1,415 @@
# NMPA 注册资料法规核查与整改闭环开发计划(第一批:主链路)
## 一、已确认口径
| 问题 | 结论 |
| --- | --- |
| 第二阶段覆盖范围 | 覆盖原始需求 2、4、5法规完整性核查、章节/一致性核查、风险预警与整改建议 |
| 原始需求 3 | 本阶段只做核查所需的信息抽取,不做自动填写目标文件 |
| 执行策略 | 第二阶段拆成两次 Codex 目标执行;第一批先打通 Demo 主链路 |
| 启动方式 | 用户对话提示词触发法规核查工作流,不做上传后自动核查 |
| 汇总批次 | 默认复用当前对话最近一次成功 `FileSummaryBatch`,不自动串联文件汇总 |
| 规则来源 | Demo 先用本地 YAML数据库记录规则版本、路径、hash、RAG 索引信息 |
| 规则差异 | 自动检测 YAML 与数据库记录差异,提示人工确认更新;第一批不做规则管理前端 |
| RAG | 必须使用向量库;默认 ChromaDB |
| Embedding | Provider 可配置Demo 默认 SiliconFlow `Qwen/Qwen3-Embedding-4B` |
| 法规材料 | 先索引 `docs/0.原始材料/关于公布体外诊断试剂注册申报资料要求和批准证明文件格式的公告` |
| 法规文档抽取 | 允许使用 LibreOffice headless 转换本地法规 `.doc` 材料;该依赖只服务 RAG 建库,不改变第一阶段页数统计口径 |
| ChromaDB 运行方式 | 第一批采用本地持久化模式,不单独启动 Chroma Server |
| 飞书 | 第一批不接真实飞书;暂缓项写入待办计划 |
---
## 二、第一批目标
第一批只追求“可运行、可演示、可追溯”的法规核查主链路:
```text
已有文件汇总批次
-> 用户提示词触发法规核查
-> 读取本地 YAML 规则
-> 检查规则版本和 RAG 索引状态
-> 使用 ChromaDB 检索法规依据
-> 完整性核查
-> 基础章节核查
-> 基础一致性核查
-> 风险分级和整改建议
-> 生成对话摘要、Markdown 报告、Excel 清单、JSON 结果包
-> 前端展示法规核查工作流卡片
```
第一批完成后Demo 应能展示:
| 展示项 | 内容 |
| --- | --- |
| 法规依据 | RAG 返回本地法规材料来源和片段 |
| 完整性问题 | 如缺少注册检验报告、临床评价资料等 |
| 章节问题 | 如说明书缺少储存条件、有效期、样本要求等章节 |
| 一致性问题 | 如产品名称、型号规格、预期用途在不同文件中不一致 |
| 风险清单 | blocking/high/medium/low/info 五级 |
| 报告下载 | Markdown、Excel、JSON |
---
## 三、阶段拆分
| 阶段 | 名称 | 目标 | 验收 |
| --- | --- | --- | --- |
| RR1-0 | 准备与回归 | 确认第一阶段稳定,创建开发分支 | `pytest` 通过 |
| RR1-1 | 模型与兼容改造 | 新增法规核查模型,兼容工作流/导出通用字段 | migration 和模型测试通过 |
| RR1-2 | YAML 规则与版本记录 | 建立 Demo 规则文件、规则版本表、hash 差异检测 | 能识别 YAML 与 DB 差异 |
| RR1-3 | RAG 索引与检索 | 用 ChromaDB + SiliconFlow embedding 构建本地法规索引 | 能检索法规依据 |
| RR1-4 | 触发与工作流骨架 | 对话提示词触发法规核查,复用最近成功汇总批次 | 能创建并运行法规核查批次 |
| RR1-5 | 核查服务 | 完整性、基础章节、基础一致性核查 | 生成 findings |
| RR1-6 | 风险与导出 | 风险归并、Issue 落库、报告导出 | 生成助手摘要和下载文件 |
| RR1-7 | 前端与验收 | 法规核查卡片、状态恢复、Markdown 结果展示 | 全量测试通过 |
---
## 四、RR1-0 准备与回归
### 任务
| 编号 | 内容 |
| --- | --- |
| RR1-0-001 | 从当前稳定分支创建 `codex/YYYYMMDD-NMPA法规核查主链路` |
| RR1-0-002 | 运行 `python manage.py check``pytest` |
| RR1-0-003 | 记录第一阶段边界文件夹上传不作为强验收、RAR 依赖 7z、Office 页数口径可不精确 |
### 验证命令
```bash
python manage.py check
pytest
git status --short
```
### Codex 执行提示
```text
请创建第二阶段第一批开发分支,先确认第一阶段文件汇总功能全量测试通过。本阶段不要修改业务代码,只做环境和边界确认。
```
---
## 五、RR1-1 模型与兼容改造
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR1-1-001 | 新增法规核查模型和枚举 | `review_agent/models.py` |
| RR1-1-002 | 给 `WorkflowNodeRun` 增加 `workflow_type``workflow_batch_id``node_group` | `review_agent/models.py` |
| RR1-1-003 | 给 `WorkflowEvent` 增加 `workflow_type``workflow_batch_id``conversation_id` | `review_agent/models.py` |
| RR1-1-004 | 给 `ExportedSummaryFile` 增加 `workflow_type``workflow_batch_id``export_category` | `review_agent/models.py` |
| RR1-1-005 | 保持第一阶段文件汇总写入兼容 | `review_agent/file_summary/*` |
| RR1-1-006 | 生成 migration 并补模型测试 | `review_agent/migrations/``tests/test_regulatory_models.py` |
### 新增模型
| 模型 | 说明 |
| --- | --- |
| `RegulatoryRuleVersion` | 规则版本、YAML 路径、文件 hash、RAG 索引版本 |
| `RegulatoryReviewBatch` | 法规核查批次 |
| `RegulatoryIssue` | 风险问题和整改状态 |
| `RegulatoryArtifact` | 过程产物 |
| `RegulatoryNotificationRecord` | mock 通知预留记录,第一批可只建表不接真实通知 |
### 验证命令
```bash
python manage.py makemigrations review_agent
python manage.py migrate
python manage.py check
pytest tests/test_regulatory_models.py tests/test_file_summary_workflow.py tests/test_file_summary_views.py
```
### Codex 执行提示
```text
请新增法规核查相关模型,并轻量通用化现有工作流节点、事件和导出文件表。必须保持第一阶段文件汇总测试通过,不要重写第一阶段工作流。
```
---
## 六、RR1-2 YAML 规则与版本记录
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR1-2-001 | 新建法规核查模块目录 | `review_agent/regulatory_review/` |
| RR1-2-002 | 编写 Demo YAML 规则 | `review_agent/regulatory_review/rules/nmpa_ivd_registration_v1.yaml` |
| RR1-2-003 | 实现规则 hash 计算和版本记录 | `services/rule_loader.py` |
| RR1-2-004 | 实现 YAML 与 DB 差异检测 | `services/rule_loader.py` |
| RR1-2-005 | 增加规则版本初始化/检查管理命令 | `management/commands/regulatory_rules_check.py` |
| RR1-2-006 | 增加测试 | `tests/test_regulatory_rule_loader.py` |
### Demo 规则至少覆盖
| 文件项 | 类型 | 风险 |
| --- | --- | --- |
| 产品技术要求 | required | blocking |
| 说明书 | required | high |
| 注册检验报告 | required | blocking |
| 临床评价资料 | conditional | high |
| 安全和性能基本原则清单 | recommended | medium |
YAML 规则内容需参考本地法规资料目录:
```text
docs/0.原始材料/关于公布体外诊断试剂注册申报资料要求和批准证明文件格式的公告
```
### 验证命令
```bash
pytest tests/test_regulatory_rule_loader.py
python manage.py regulatory_rules_check
```
### Codex 执行提示
```text
请建立 Demo 版 NMPA IVD 注册资料 YAML 规则库,并实现规则版本、文件 hash 和数据库记录差异检测。发现 YAML 与 DB hash 不一致时只提示需要更新,不自动覆盖。
```
---
## 七、RR1-3 RAG 索引与检索
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR1-3-001 | 增加依赖 `chromadb` 和必要 HTTP 客户端 | `requirements.txt` |
| RR1-3-002 | 实现 embedding provider 抽象 | `services/rag_embedding.py` |
| RR1-3-003 | 实现 SiliconFlow embedding provider | `services/rag_embedding.py` |
| RR1-3-004 | 实现法规文档文本抽取和切块 | `services/rag_index.py` |
| RR1-3-005 | 实现 ChromaDB 持久化索引构建命令 | `management/commands/regulatory_rag_build.py` |
| RR1-3-006 | 实现 RAG 引用检索服务 | `services/rag_citation.py` |
| RR1-3-007 | 增加测试 | `tests/test_regulatory_rag.py` |
### 配置
| 配置项 | 默认 |
| --- | --- |
| `REGULATORY_RAG_PROVIDER` | `siliconflow` |
| `REGULATORY_RAG_CHROMA_PATH` | `media/regulatory_review/rag/chroma/` |
| `SILICONFLOW_BASE_URL` | `https://api.siliconflow.cn/v1` |
| `SILICONFLOW_API_KEY` | 从环境变量读取 |
| `SILICONFLOW_EMBEDDING_MODEL` | `Qwen/Qwen3-Embedding-4B` |
| `SILICONFLOW_EMBEDDING_DIMENSIONS` | `1024` |
| `REGULATORY_RAG_COLLECTION` | `nmpa_ivd_registration_v1` |
SiliconFlow Embedding API 参考:
```text
https://docs.siliconflow.com/en/api-reference/embeddings/create-embeddings
```
### 规则
| 场景 | 处理 |
| --- | --- |
| RAG 索引不存在 | 核查时提示先构建索引,不在核查中临时构建 |
| Embedding API 不可用 | 构建命令失败,核查不启动 |
| RAG 无命中 | 规则问题仍输出,法规依据标记“原文依据待补充” |
| 本地法规 `.doc` 无法直接抽取 | 允许通过 LibreOffice headless 转换后抽取Docker 部署说明需写明可选安装方式 |
| ChromaDB 存储 | 使用本地持久化目录Docker 部署时通过 volume 挂载保留索引 |
### 验证命令
```bash
python manage.py regulatory_rag_build
pytest tests/test_regulatory_rag.py
```
### Codex 执行提示
```text
请实现基于 ChromaDB 的本地法规 RAG。Embedding Provider 要可配置Demo 默认使用 SiliconFlow Qwen/Qwen3-Embedding-4B。ChromaDB 使用本地持久化目录,不单独启动服务。法规 `.doc` 材料允许用 LibreOffice headless 转换后抽取。核查流程只检查索引可用性,不临时构建索引。
```
---
## 八、RR1-4 触发与工作流骨架
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR1-4-001 | 实现法规核查提示词路由 | `review_agent/skill_router.py` |
| RR1-4-002 | 实现法规核查批次创建 | `regulatory_review/workflow.py` |
| RR1-4-003 | 默认查找当前对话最近成功 `FileSummaryBatch` | `workflow.py` |
| RR1-4-004 | 无成功汇总批次时提示用户先执行自动汇总 | `services.py` |
| RR1-4-005 | 实现启动、状态、事件接口 | `regulatory_review/views.py``urls.py` |
| RR1-4-006 | 接入项目 URL | `config/urls.py``review_agent/urls.py` |
| RR1-4-007 | 增加测试 | `tests/test_regulatory_workflow.py``tests/test_regulatory_views.py` |
### 第一批节点
```text
prepare
-> rule_scope
-> completeness_check
-> text_extract
-> structure_check
-> consistency_check
-> risk_assess
-> report_export
-> completed
```
### 验证命令
```bash
pytest tests/test_regulatory_workflow.py tests/test_regulatory_views.py
pytest tests/test_file_summary_trigger.py tests/test_llm_streaming.py
```
### Codex 执行提示
```text
请实现法规核查提示词触发和工作流骨架。用户说“法规核查、NMPA核查、完整性核查、风险预警”等意图时启动 regulatory_review默认复用当前对话最近成功 FileSummaryBatch没有成功汇总批次时提示先自动汇总。
```
---
## 九、RR1-5 核查服务
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR1-5-001 | 实现统一 Finding dataclass | `regulatory_review/schemas.py` |
| RR1-5-002 | 完整性核查:文件名、目录名、首页文本匹配 | `services/completeness_check.py` |
| RR1-5-003 | 文本抽取docx/pdf/xlsx/pptx/txt/md 基础文本 | `services/text_extract.py` |
| RR1-5-004 | 基础章节核查:按规则关键词判断章节是否存在 | `services/structure_check.py` |
| RR1-5-005 | 基础一致性核查:产品名称、型号规格、预期用途 | `services/consistency_check.py` |
| RR1-5-006 | 过程产物保存和 hash | `storage.py` |
| RR1-5-007 | 增加测试 | `tests/test_regulatory_completeness.py``tests/test_regulatory_text_extract.py``tests/test_regulatory_structure.py``tests/test_regulatory_consistency.py` |
### Demo 验收样例
测试或演示资料中至少构造:
| 条件 | 预期 |
| --- | --- |
| 有说明书 | 可匹配说明书规则 |
| 有产品技术要求 | 可匹配产品技术要求规则 |
| 缺少注册检验报告 | 生成 blocking 问题 |
| 说明书缺少储存条件章节 | 生成 high 或 medium 问题 |
| 产品名称在两个文件中不一致 | 生成 consistency 问题 |
### 验证命令
```bash
pytest tests/test_regulatory_completeness.py tests/test_regulatory_text_extract.py tests/test_regulatory_structure.py tests/test_regulatory_consistency.py
```
### Codex 执行提示
```text
请实现完整性核查、文本抽取、基础章节核查和基础一致性核查。所有核查服务只返回 Finding不直接创建 RegulatoryIssue。
```
---
## 十、RR1-6 风险与导出
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR1-6-001 | Findings 去重和风险归并 | `services/risk_assess.py` |
| RR1-6-002 | RAG 引用挂载到问题证据 | `services/risk_assess.py``services/rag_citation.py` |
| RR1-6-003 | 创建 `RegulatoryIssue` | `services/risk_assess.py` |
| RR1-6-004 | 生成 Markdown 核查报告 | `services/export.py` |
| RR1-6-005 | 生成 Excel 缺失清单 | `services/export.py` |
| RR1-6-006 | 生成 JSON 结果包 | `services/export.py` |
| RR1-6-007 | 工作流完成后写入助手消息 | `workflow.py` |
| RR1-6-008 | 增加测试 | `tests/test_regulatory_risk_assess.py``tests/test_regulatory_export.py` |
### 对话摘要
助手消息至少包含:
```markdown
已完成 NMPA 注册资料法规核查。
| 风险等级 | 数量 |
| --- | --- |
| 阻断项 | 1 |
| 高风险 | 1 |
| 等级 | 问题 | 状态 | 建议 |
| --- | --- | --- | --- |
| 阻断项 | 缺少注册检验报告 | 待处理 | 请补充注册检验报告并复核 |
[下载 Markdown 核查报告](...)
[下载 Excel 缺失清单](...)
[下载 JSON 结果包](...)
```
### 验证命令
```bash
pytest tests/test_regulatory_risk_assess.py tests/test_regulatory_export.py tests/test_regulatory_workflow.py
```
### Codex 执行提示
```text
请实现风险归并、RAG 法规依据挂载、Issue 落库和最终报告导出。工作流完成后必须向当前对话写入 Markdown 摘要和下载链接。
```
---
## 十一、RR1-7 前端与总体验收
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR1-7-001 | 工作流卡片支持 `regulatory_review` 类型 | `templates/home.html``static/js/app.js` |
| RR1-7-002 | 卡片使用 `workflow_type + workflow_batch_id` 区分 | `static/js/app.js` |
| RR1-7-003 | 显示法规核查节点和风险摘要 | `templates/home.html``static/js/app.js` |
| RR1-7-004 | 页面刷新恢复法规核查卡片 | `views.py``static/js/app.js` |
| RR1-7-005 | 补前端测试 | `tests/test_regulatory_frontend.py` |
| RR1-7-006 | 全量回归 | 全项目 |
### 验证命令
```bash
python manage.py check
pytest
```
如浏览器可用,再运行 Playwright 端到端验证。
### Codex 执行提示
```text
请在现有工作流卡片轮播基础上支持 regulatory_review 类型,展示法规核查节点、风险摘要和完成状态。最后运行 python manage.py check 和 pytest 全量验收。
```
---
## 十二、第一批 Codex 目标模式提示词
```text
请按 docs/5.开发计划/2.NMPA注册资料法规核查与整改闭环-第一批主链路.md 执行第二阶段第一批开发。
目标:
完成 NMPA 法规核查主链路,复用当前对话最近成功 FileSummaryBatch通过用户提示词触发 regulatory_review 工作流,实现 YAML 规则、ChromaDB + SiliconFlow Embedding RAG、完整性核查、基础章节核查、基础一致性核查、风险分级、Markdown/Excel/JSON 报告和前端法规核查卡片。
执行规则:
1. 创建 codex/YYYYMMDD-NMPA法规核查主链路 分支。
2. 按 RR1-0 到 RR1-7 顺序执行,不跳阶段。
3. 每阶段完成后运行对应验证命令。
4. 第一阶段文件汇总测试不得回归。
5. 不自动串联文件汇总;没有成功汇总批次时提示用户先自动汇总。
6. 不接真实飞书,不做规则管理前端,不做自动填写目标文件。
7. 最后运行 python manage.py check 和 pytest 全量验收。
```

View File

@@ -0,0 +1,242 @@
# NMPA 注册资料法规核查与整改闭环开发计划(第二批:完整闭环补齐)
## 一、第二批目标
第二批在第一批主链路通过后执行,补齐完整整改闭环和交互能力:
```text
适用条件对话选择框
-> waiting_user 暂停恢复
-> 整包复核
-> 缺失项复核
-> mock 通知留痕
-> 更完整的过程产物
-> 更强的前端交互和验收测试
```
飞书真实 CLI/API、规则管理前端、自动填写目标文件不在第二批落地进入 `docs/6.待办计划/第二阶段暂缓事项.md`
---
## 二、阶段总览
| 阶段 | 名称 | 目标 | 验收 |
| --- | --- | --- | --- |
| RR2-1 | 适用条件确认 | 对话选择框确认产品类别、注册类型、临床评价路径等 | waiting_user 可暂停恢复 |
| RR2-2 | 核查能力增强 | 扩展章节、一致性、RAG 引用和文本抽取范围 | 复杂样例可识别更多问题 |
| RR2-3 | 整包复核 | 基于新的汇总批次创建新的法规核查批次 | 可追溯来源批次 |
| RR2-4 | 缺失项复核 | 针对原 Issue 执行复核并更新状态 | 生成 review_record |
| RR2-5 | mock 通知留痕 | 对 blocking/high/medium 写 mock 通知记录 | 报告展示通知记录 |
| RR2-6 | 前端和总体验收 | 条件选择框、复核入口、通知/复核记录展示 | 全量测试通过 |
---
## 三、RR2-1 适用条件确认
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR2-1-001 | 实现适用条件候选识别 | `services/info_extract.py` |
| RR2-1-002 | 工作流支持 `waiting_user` 暂停 | `regulatory_review/workflow.py` |
| RR2-1-003 | 实现条件确认接口 | `regulatory_review/views.py` |
| RR2-1-004 | 实现对话选择框 UI | `templates/home.html``static/js/app.js` |
| RR2-1-005 | 确认后从 `rule_scope` 或下一节点恢复 | `workflow.py` |
| RR2-1-006 | 增加测试 | `tests/test_regulatory_condition.py``tests/test_regulatory_frontend.py` |
### 确认字段
以下选项来自既有第二阶段功能/详细设计:`RegulatoryInfoExtract` 输出产品类别、注册类型、临床评价路径,功能设计中明确注册类型包括“首次注册、变更注册、延续注册等”,临床评价路径包括“临床试验、免临床、同品种比对等”。因此 Demo 版按下表实现。
| 字段 | 交互 |
| --- | --- |
| 产品类别 | 体外诊断试剂 / 医疗器械 / 其他 |
| 注册类型 | 首次注册 / 变更注册 / 延续注册 |
| 临床评价路径 | 临床试验 / 免临床 / 同品种比对 / 待确认 |
| 产品名称 | 文本输入 |
| 型号规格 | 文本输入 |
| 预期用途 | 文本输入 |
### 验证命令
```bash
pytest tests/test_regulatory_condition.py tests/test_regulatory_frontend.py tests/test_regulatory_workflow.py
```
### Codex 执行提示
```text
请实现法规适用条件候选识别、waiting_user 暂停恢复和对话选择框确认。用户确认前工作流不得继续执行规则裁剪。
```
---
## 四、RR2-2 核查能力增强
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR2-2-001 | 扩展 YAML 规则中的必需章节和一致性字段 | `rules/nmpa_ivd_registration_v1.yaml` |
| RR2-2-002 | 增强文本抽取,缓存章节候选和字段候选 | `services/text_extract.py` |
| RR2-2-003 | 增强章节核查,支持别名、近似标题和证据片段 | `services/structure_check.py` |
| RR2-2-004 | 增强一致性核查,支持多个来源值和低置信度提示项 | `services/consistency_check.py` |
| RR2-2-005 | RAG 引用写入 `rag_result_json` 过程产物 | `services/rag_citation.py``storage.py` |
| RR2-2-006 | 增加测试 | `tests/test_regulatory_structure.py``tests/test_regulatory_consistency.py``tests/test_regulatory_rag.py` |
### 验证命令
```bash
pytest tests/test_regulatory_structure.py tests/test_regulatory_consistency.py tests/test_regulatory_rag.py
```
### Codex 执行提示
```text
请增强章节核查、一致性核查和 RAG 过程产物。证据必须包含文件路径、命中片段、字段名或规则 ID便于人工复核。
```
---
## 五、RR2-3 整包复核
### 口径
整包复核不是修改原法规核查批次,而是基于新的成功 `FileSummaryBatch` 创建新的 `RegulatoryReviewBatch`。新批次记录来源批次信息,用于报告中展示“复核来源”。
复核入口不新增独立页面。前端通过法规核查工作流卡片展示复核入口,用户点击后由 AI 在对话区发起确认与引导。
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR2-3-001 | 新增整包复核启动接口 | `regulatory_review/views.py` |
| RR2-3-002 | 支持指定新的 `file_summary_batch_id` | `workflow.py` |
| RR2-3-003 | 记录 source/regenerated_from 信息 | `RegulatoryReviewBatch.condition_json` 或独立字段 |
| RR2-3-004 | 报告展示整包复核来源 | `services/export.py` |
| RR2-3-005 | 增加测试 | `tests/test_regulatory_rectification.py` |
### 验证命令
```bash
pytest tests/test_regulatory_rectification.py tests/test_regulatory_workflow.py
```
### Codex 执行提示
```text
请实现整包复核:用户完成新的文件汇总后,可基于新 FileSummaryBatch 创建新的 RegulatoryReviewBatch并在报告中追溯原核查批次。
```
---
## 六、RR2-4 缺失项复核
### 口径
缺失项复核针对原 `RegulatoryIssue` 更新状态,不新建完整法规核查批次。系统可读取补充文件对应的新 `FileSummaryBatch`,只对指定问题重新匹配相关规则。
缺失项复核同样不新增独立页面。卡片只展示入口和状态,具体确认动作通过 AI 对话完成,例如确认复核哪些问题、使用哪个补充文件汇总批次。
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR2-4-001 | 实现缺失项复核服务 | `services/rectification_review.py` |
| RR2-4-002 | 支持 issue_ids + file_summary_batch_id 输入 | `views.py` |
| RR2-4-003 | 复核通过更新 `review_passed`,不通过更新 `review_failed` | `services/rectification_review.py` |
| RR2-4-004 | 生成 `review_record` 过程产物 | `storage.py` |
| RR2-4-005 | 报告展示复核记录 | `services/export.py` |
| RR2-4-006 | 增加测试 | `tests/test_regulatory_rectification.py` |
### 验证命令
```bash
pytest tests/test_regulatory_rectification.py
```
### Codex 执行提示
```text
请实现缺失项复核。复核不重新跑完整法规核查工作流,只针对指定 RegulatoryIssue 和补充文件汇总批次更新问题状态,并生成 review_record 产物。
```
---
## 七、RR2-5 mock 通知留痕
### 口径
真实飞书暂缓。第二批只在 blocking/high/medium 风险项出现时创建 `RegulatoryNotificationRecord(channel=mock)`,用于报告留痕和第三阶段接入。
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR2-5-001 | 实现 mock notifier | `services/feishu_notifier.py` |
| RR2-5-002 | 风险等级 blocking/high/medium 写通知记录 | `workflow.py` |
| RR2-5-003 | 通知记录进入 Markdown/Excel/JSON 报告 | `services/export.py` |
| RR2-5-004 | 增加测试 | `tests/test_regulatory_notification.py` |
### 验证命令
```bash
pytest tests/test_regulatory_notification.py tests/test_regulatory_export.py
```
### Codex 执行提示
```text
请实现 mock 通知留痕。不要接真实飞书 CLI/API只为阻断项、高风险、中风险写 RegulatoryNotificationRecord并在报告中展示。
```
---
## 八、RR2-6 前端和总体验收
### 任务
| 编号 | 内容 | 文件 |
| --- | --- | --- |
| RR2-6-001 | 前端显示条件确认卡片 | `templates/home.html``static/js/app.js` |
| RR2-6-002 | 前端通过工作流卡片展示整包复核入口,并由 AI 对话确认 | `static/js/app.js` |
| RR2-6-003 | 前端通过工作流卡片展示缺失项复核入口,并由 AI 对话确认 | `static/js/app.js` |
| RR2-6-004 | 卡片展示通知和复核摘要 | `templates/home.html``static/js/app.js` |
| RR2-6-005 | 补 Playwright 或前端测试 | `tests/test_regulatory_frontend.py` |
| RR2-6-006 | 全量回归 | 全项目 |
### 验证命令
```bash
python manage.py check
pytest
```
### Codex 执行提示
```text
请完善法规核查前端交互包含条件选择框、卡片式整包复核入口、卡片式缺失项复核入口、AI 对话确认、mock 通知和复核记录展示。不要新增独立复核页面。最后运行 python manage.py check 和 pytest 全量验收。
```
---
## 九、第二批 Codex 目标模式提示词
```text
请按 docs/5.开发计划/2.NMPA注册资料法规核查与整改闭环-第二批完整闭环.md 执行第二阶段第二批开发。
前提:
第一批主链路已经完成并通过全量测试。
目标:
补齐法规核查完整整改闭环包括适用条件对话选择框、waiting_user 暂停恢复、整包复核、缺失项复核、mock 通知留痕、增强章节/一致性核查和前端交互。
执行规则:
1. 从第一批完成后的稳定分支创建 codex/YYYYMMDD-NMPA法规核查完整闭环 分支。
2. 按 RR2-1 到 RR2-6 顺序执行。
3. 每阶段完成后运行对应验证命令。
4. 不接真实飞书 CLI/API。
5. 不做规则管理前端。
6. 不做自动填写目标文件。
7. 最后运行 python manage.py check 和 pytest 全量验收。
```