Files
AIclinicalresearch/docs/03-业务模块/IIT Manager Agent/09-技术评审报告/2026-03-08-IIT-CRA-最小复现项目对账执行手册-Phase1.md
HaHafeng a666649fd4 feat(iit): harden QC pipeline consistency and release artifacts
Implement IIT quality workflow hardening across eQuery deduplication, guard metadata validation, timeline/readability improvements, and chat evidence fallbacks, then synchronize release and development documentation for deployment handoff.

Includes migration/scripts for open eQuery dedupe guards, orchestration/status semantics, report/tool readability fixes, and updated module status plus deployment checklist.

Made-with: Cursor
2026-03-08 21:54:35 +08:00

226 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# IIT / CRA Agent 最小复现项目对账执行手册Phase 1
> 文档版本v1.0
> 创建日期2026-03-08
> 目标:用最小复现项目定位根因,不做盲修
> 适用问题报告与事件不一致、AI 实时流水不一致、AI 对话结论错误
---
## 1. 执行原则
1. **先对账,后修复**:每个异常必须先确认“错在数据、规则、聚合、还是展示”。
2. **单项目封闭验证**:只使用“纳入排除标准测试”项目,不混其他项目。
3. **同一时间窗口**:所有 API / SQL 在同一时段采样,避免时间漂移。
4. **一条问题一条证据链**:必须保留“输入 -> 处理中间态 -> 输出”。
---
## 2. 最小复现项目准备
项目:`纳入排除标准测试`
固定对象:
- 患者:`2 / 3 / 4`(至少包含不完整录入与违规样本)
- 事件:筛选期 + 第一次月经周期结束时(若项目定义如此)
- 规则D1/D2/D3/D4/D6 至少各有 1 条命中场景
冻结窗口:
- 执行前停止自动批任务(避免数据持续变化)
- 手动执行一次“一键全量质控”,记录触发时间 T0
- 所有采样以 T0 后 1-3 分钟为准
---
## 3. 四层对账流程(按顺序)
## 3.1 事实层REDCap 是否联通)
目标:确认“源头有数据”。
检查项:
- REDCap 中是否存在目标患者/事件数据
- `record_summary` 是否包含对应 `record_id`
- `SyncManager` 最近同步时间是否晚于 T0
判定:
- REDCap 有、平台无 -> 联通/同步问题
- REDCap 无 -> 上游录入问题,不是质控引擎问题
## 3.2 执行层(规则是否正确执行)
目标:确认“规则判断是否符合临床预期”。
检查项:
- `qc_field_status` 是否有该患者对应 D1/D2/D3/D6 记录
- `status/severity/message/actual_value/expected_value` 是否合理
- `qc_event_status` 是否与字段级状态一致
判定:
- 执行结果本身错 -> 规则定义/引擎问题
- 执行结果正确、展示错 -> 聚合/前端问题
## 3.3 聚合层(报表和大盘是否同口径)
目标:确认“同名指标是否来自同一口径与同一快照”。
检查项:
- 大盘:`getQcCockpitData`
- 报告:`getQcReport` / `refreshQcReport`
- 趋势:`getTrend`
- D1/D2/D3D4/D6各报表 API
重点看:
- 通过率口径(按受试者 vs 按日志)
- 健康分是否来自 `healthScore` 真实值
- 报告缓存是否过期/未刷新
## 3.4 对话层AI 工具链路是否选对)
目标确认“AI 回答错误是查询错还是推理错”。
检查项:
- 问题触发了哪个工具(`read_report` / `look_up_data` / `check_quality` / `search_knowledge`
- 工具返回数据是否完整(如实验室检查字段是否缺失)
- 最终回答是否与工具结果一致
判定:
- 工具返回错 -> 数据查询/映射/项目隔离问题
- 工具返回对、回答错 -> Prompt/回答策略问题
---
## 4. 针对当前三大类问题的定位矩阵
## 4.1 第一大类:报告与关键事件
| 现象 | 优先怀疑 | 第一检查点 |
|---|---|---|
| D1/D2/D3D4/D6 与维度评分不一致 | 聚合口径漂移 | `getStats()` vs 各报表 SQL |
| 质控 0 个受试者 | 执行未落库或 projectId 错 | `qc_field_status` 是否有该项目数据 |
| 待处理 252 但健康分 100 | 健康分 fallback / 评分权重缺陷 | 前端 `healthScore` fallback、HealthScoreEngine 维度权重 |
| 上方通过率 100下方趋势 33 | 趋势口径不同 | `getTrend()` 当前读 `iit_qc_logs` |
| 质控完成无热力图 | `qc_event_status` 空或事件列构建失败 | `getHeatmapData()` 查询结果 |
| 执行摘要无信息 | 报告缓存旧 / 生成失败 | `iit_qc_reports` 最新记录 + refresh |
| 报告分 64 vs 大盘 100 | 报告快照与实时不一致 | `report.generatedAt` vs cockpit now |
| D1 无数据 | D1 规则缺失或 rule_category 错 | `qc_field_status where D1` |
| D2 事件数=1 且明细异常 | D2 统计规则/activeEvents定义不清 | `getCompletenessReport()` 的 byRecordEvent |
| 已回复仍显示 0 | 状态机未推进或统计口径错 | `iit_equeries.status` 分布 |
| 无“重开质疑”操作 | 前端缺动作入口(后端有状态) | EQueryPage 操作列 |
## 4.2 第二大类AI 实时工作流水
| 现象 | 优先怀疑 | 第一检查点 |
|---|---|---|
| 流水问题总数 444 vs 待处理 252 | 指标对象不同 | 时间线来自 `qc_field_status`,待处理来自 `iit_equeries` |
| 事件编码生成逻辑不明 | 事件标签映射缺失 | `eventLabel` 来源:`qc_event_status` / fallback |
| 日期筛选按钮无效 | API 过滤未生效或前端未传 | `getTimeline(date=YYYY-MM-DD)` 返回是否变化 |
## 4.3 第三大类AI 对话助手
| 现象 | 优先怀疑 | 第一检查点 |
|---|---|---|
| 已签署知情显示 0 | 工具选路错误或字段未映射 | `look_up_data` 查询字段覆盖 |
| 3号患者严重问题被说成无问题 | read_report 缓存滞后或筛选逻辑错 | `QcReportService` 缓存时间与 issue 列表 |
| 总体通过率异常分项非0总体0 | 聚合口径错误 | 报告 summary.passRate 公式 |
| 查询患者2信息不全 | 工具默认返回字段不完整 | `look_up_data` 默认 data 结构 |
| 4号患者访视名错误/状态描述偏差 | eventLabel 回退技术ID + 业务叙述模板粗糙 | `eventLabel` 链路与回答模板 |
---
## 5. 执行清单(逐项打勾)
## 5.1 一次完整排查(建议 2-3 小时)
- [ ] 执行 `batch-qc`,记录 T0、返回 `totalRecords/totalEventCombinations/passRate`
- [ ] 拉取驾驶舱:`qc-cockpit`
- [ ] 拉取报告:`qc-cockpit/report`(先读缓存,再 refresh
- [ ] 拉取趋势:`qc-cockpit/trend`
- [ ] 拉取时间线:`qc-cockpit/timeline`
- [ ] 拉取 D1/D2/D3D4/D6 报表
- [ ] 拉取 `field-issues`critical + warning
- [ ] 拉取 eQuery stats 与 list
- [ ] 对 5 条 AI 问答样例做工具链路记录
## 5.2 SQL 对账模板(只读)
> 以下为只读核对 SQL请在测试库或只读会话执行。
```sql
-- 1) 项目级统计快照
SELECT project_id, total_records, passed_records, failed_records, warning_records,
health_score, health_grade, d1_pass_rate, d2_pass_rate, d3_pass_rate, d5_pass_rate, d6_pass_rate, d7_pass_rate
FROM iit_schema.qc_project_stats
WHERE project_id = :project_id;
```
```sql
-- 2) 字段级问题总量SSOT
SELECT status, severity, rule_category, COUNT(*) AS cnt
FROM iit_schema.qc_field_status
WHERE project_id = :project_id
GROUP BY status, severity, rule_category
ORDER BY rule_category, status, severity;
```
```sql
-- 3) 事件级状态
SELECT record_id, event_id, event_label, status, fields_total, fields_passed, fields_failed, fields_warning
FROM iit_schema.qc_event_status
WHERE project_id = :project_id
ORDER BY record_id, event_id;
```
```sql
-- 4) eQuery 状态分布
SELECT status, COUNT(*) AS cnt
FROM iit_schema.iit_equeries
WHERE project_id = :project_id
GROUP BY status
ORDER BY status;
```
---
## 6. 修复优先级建议(按风险)
P0先修
1. 通过率口径统一(大盘/趋势/报告明确区分)
2. 健康分来源统一(禁前端 fallback 推算)
3. 报告缓存刷新策略(批量质控后强制刷新并透出快照时间)
4. 时间线与 eQuery 统计文案区分(避免同名误读)
P1随后
1. EQuery “重开”前端操作入口(后端状态机已支持)
2. D2“活跃事件/缺失字段”定义可视化说明
3. AI 对话输出模板升级(访视表格化 + 证据引用)
P2优化
1. 工具调用 trace 可视化(问题 -> 工具 -> 结果 -> 回答)
2. 指标字典落地到接口 schema前后端共享类型
---
## 7. 本阶段交付物要求
完成 Phase 1 后,必须输出:
1. `问题-根因对照表`(你列出的每条问题都要有结论)
2. `证据包`API 返回 + SQL 结果 + 截图)
3. `修复方案分批计划`P0/P1/P2 + 影响面 + 回归用例)
没有这三项,不进入大规模代码修改。