|
|
@@ -0,0 +1,65 @@
|
|
|
+# G-1 低侧红线组(合规门禁)实现会话报告
|
|
|
+
|
|
|
+> 日期:2026-11-09
|
|
|
+> 任务:新增合规规则 `association_only==true`;禁写「缺 X→致病/需补充」;禁把调整建议写成处方;措辞白名单「相关联/报告提示/可能与…有关」
|
|
|
+> 规格文档:`docs/参考资料/浠艾福-平台程序修改计划-v1.0.md` §三 G-1(P0 · 红线先行),基线 `浠艾福-报告归因方案-总体设计修改方案-v1.1.md`
|
|
|
+> 任务号:G-1(attribution.g1)
|
|
|
+> 性质:前置会话已实现,本会话做验证 + C 档探测记录
|
|
|
+
|
|
|
+> **最终状态(本会话收尾时)**:G-1 实现提交已由并发维护会话 rebase 并推送至 origin/cfclub(rebase 后哈希 `a13bb8192`,原 `ee9106705` 内容一致,代码已在远端核验:4 条规则 + ComplianceGate 全部在位);本会话报告提交 `609f74798` 快进推送 origin/cfclub。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. 结论
|
|
|
+
|
|
|
+- **G-1 低侧红线组已实现**,位于 HEAD `ee9106705`(`feat(attribution.g1): G-1 low-side redline compliance gate - association_only enforce + no causal bridge/prescription + sections.complianceGate`,2026-11-08 22:19,作者 Agnes Agent)。实现含 4 条规则 + L4/L5 双挂载点 + 报告 `sections.complianceGate` 暴露 + 单测覆盖。
|
|
|
+- **编译验证通过**:`mvn -pl cfc-backend -am -DskipTests compile` → `BUILD SUCCESS`(EXIT=0)。
|
|
|
+- **C 档 4 项全部自主探测完成**,判断记录见 §3(2 项 A 档已确认、2 项 C 档给出平台现状结论)。
|
|
|
+
|
|
|
+## 2. 4 条合规规则逐条核验(对照规格 §三 G-1)
|
|
|
+
|
|
|
+| # | 规则(规格原文) | 实现落点 | 核验 |
|
|
|
+|---|---|---|---|
|
|
|
+| 1 | `association_only == true`(低侧机制禁因果) | `AttributionComplianceGate.enforceLowSide()` 对任意 `STATUS_LOW` 读数强制 `IndicatorReading.setAssociationOnly(true)` | ✅ |
|
|
|
+| 2 | 禁写「缺 X→致病/需补充」 | `AttributionLowSideRules.FORBIDDEN_CAUSAL_PATTERNS`(缺/缺乏/不足/偏低 + →/导致/引起… + 致病/需补充/补菌…)+ `scan()` 反向回扫 | ✅ |
|
|
|
+| 3 | 禁把调整建议写成处方 | `AttributionLowSideRules.FORBIDDEN_PRESCRIPTION_PATTERNS`(剂量/用法用量/疗程/每日 N mg…)| ✅ |
|
|
|
+| 4 | 措辞白名单「相关联/报告提示/可能与…有关」 | `AttributionLowSideRules.WORDING_WHITELIST`(相关联/报告提示/可能与…有关/可能与/有关)+ `WHITELIST_HINT` 建议改写 | ✅ |
|
|
|
+
|
|
|
+**挂载点**(规格 v1.1「L4 出结论前 + L5 出文档前各拦一次」):
|
|
|
+- L4 出结论前 enforce:`AttributionAnalysisServiceImpl.analyze()` 第 147 行 `attributionComplianceGate.enforceLowSide(five.attributions)`。
|
|
|
+- L5 出文档前 scan:同方法第 153 行 `attributionComplianceGate.scan(narrativeText(narrative))` 后 `merge()`。
|
|
|
+- 报告暴露:`AttributionReportBuilder.buildReportJson()` 输出 `sections.complianceGate`(group/title/active/associationOnly/wordingWhitelist/lowSideNodes/violations)+ 红线清单追加 G-1 标记。
|
|
|
+
|
|
|
+**单测**:`src/test/java/com/etotem/cfc/unit/AttributionComplianceGateTest.java`(10 例:association_only 强制/不误伤、缺X桥接命中与白名单不误报、处方命中与「医生定」不误报、白名单常量、merge 语义)+ `AttributionPipelineMockTest.java`(管线闭环)。
|
|
|
+
|
|
|
+## 3. C 档 4 项自主探测与判断(规格 §五)
|
|
|
+
|
|
|
+> 口径:`A 档` = 工作区可观察已验证;`C 档` = 线上实现相关、需平台侧确认。探测不阻塞派发,判断仅供后续 L1/L2/L4 分期落位参考。
|
|
|
+
|
|
|
+| # | C 档项 | 平台现状探测证据 | 判断 |
|
|
|
+|---|---|---|---|
|
|
|
+| 1 | **Adapter 实现形态**(L1-1 guhe_v2 指纹路由) | 运行时报告解析在 `cfc-langgraph`:`app/agents/report_parse_agent.py`(`parse_by_type` 按 `report_type` 分流 + `_detect_report_type`)、`app/parsers/pdf_parser.py`(`parse_report_pdf_with_fallback`)、`app/api/adapter.py`(Dify 兼容 API 层)。guhe_v2/aidefansi/beijing 指纹路由(`docs/scripts/extract_guhe_v2.py`、`fingerprint_engine.py`)为**离线处理脚本**,未接入运行时 report_parse 管线。 | **C 档**:无统一 Java Adapter 接口;是 Python 侧「report_type 分流 + pdf_parser 提取器 + Dify 兼容 API 层」。L1-1 属 P1 结构升级,非本轮 G-1 范围;落位方式=「在既有 report_parse_agent 增加 guhe_v2 分支」而非「重写路由」。 |
|
|
|
+| 2 | **KB 服务的加载方式**(L2-1/L2-3) | 菌群/文章知识库由 Java 侧 `dan_knowledge_base` 表承载(迁移 171 `knowledge_base_section`「统一知识库按模块存储 JSON,DB 为查询源,classpath 种子兜底」),经 `app/tools/java_client.py.get_dan_knowledge_base()` 分页拉取 → `app/tasks/knowledge_sync.py.sync_knowledge_base()` 写 ChromaDB(article/microbiome/dan_knowledge 三源)→ `app/rag/retriever.py`。运行时归因常模走 DB 表 `attribution_norm_values` / `cognitive_norms` / `health_norm_reference`(`AttributionAnalysisServiceImpl.loadNorms()`);`统一知识库.json` 为离线知识资产。 | **C 档**:KB 非文件直读,是「DB 查询源(dan_knowledge_base / knowledge_base_section)+ classpath 种子兜底 + ChromaDB RAG 同步」。L2-1/L2-3 属 P1 结构升级,非本轮 G-1 范围。 |
|
|
|
+| 3 | **L4 归因引擎的存在性**(L4-1~L4-4) | `cfc-backend/service/attribution/` 已有完整确定性规则引擎五段:`NormCompareEngine` → `IndicatorInterpretEngine` → `FiveDimAttributionEngine` → `MainCauseChainEngine` → `FalsificationEngine`,`AttributionAnalysisServiceImpl.analyze()` 顺序调用。 | **A 档**:L4 引擎已存在(Java 侧确定性规则引擎,非专家 prompt 驱动)。L4-1~L4-4 属「补规则」而非「新建规则表」。 |
|
|
|
+| 4 | **合规门禁挂载点** | `AttributionComplianceGate`(`@Component`,无 DB 依赖,纯规则可单测)挂载于 `AttributionAnalysisServiceImpl.analyze()` L4 出结论前 + L5 出文档前;报告侧 `sections.complianceGate` 暴露。 | **A 档**:平台已有横切合规门禁框架(G-1 低侧红线组),挂载点与 v1.1 定稿「L4 + L5 各拦一次」一致。 |
|
|
|
+
|
|
|
+## 4. 构建与验证结果
|
|
|
+
|
|
|
+| 项 | 结果 |
|
|
|
+|---|---|
|
|
|
+| `mvn -pl cfc-backend -am -DskipTests compile` | **BUILD SUCCESS**(EXIT=0) |
|
|
|
+| G-1 单测 | 测试源整体 `test-compile` 被**他人 WIP 阻断**(未跟踪/未提交的 `PersonalLayerDualAssertionTest` 等引用本陈旧 checkout 不存在的内部类,源自 origin/cfclub 196 提交分歧 + 322 处他人 WIP),与 G-1 无关;G-1 测试文件自身内容完整(10 例)。 |
|
|
|
+| 前端 | 本任务零前端改动,无 `cfc-web` 文件触碰。 |
|
|
|
+
|
|
|
+## 5. 边界与范围声明
|
|
|
+
|
|
|
+- 本会话**只核验 G-1**(规格 §三 G-1,P0)。工作区 `service/attribution/` 下的 `AttributionLowSideRules` / `AttributionComplianceGate` / `AttributionReportBuilder` / `IndicatorReading` / `AttributionAnalysisServiceImpl` / `AttributionComplianceGateTest` 存在**未提交的 G-2/L4-3 扩展**(`RULE_NO_LOW_SIDE_SUPPLEMENT`、`RULE_NO_STRAIN_RECOMMENDATION`、`enforceStrainBlock`、`granularity` 字段、16S 粒度声明等),属规格 §三 G-2(T6)与 L4-3(T4)的**相邻任务**,**超出本 G-1 派发范围,保留不动、不提交**。
|
|
|
+- G-1 代码推送状态:随并发维护会话 rebase 已入 origin/cfclub(哈希 `a13bb8192`,A 档核验于远端树);本会话不 force-push、不 merge 其他分支(纪律约束)。
|
|
|
+
|
|
|
+## 6. 提交与推送记录
|
|
|
+
|
|
|
+| 项 | 值 |
|
|
|
+|---|---|
|
|
|
+| G-1 实现提交(origin) | `a13bb8192`(rebase 自 `ee9106705`,作者 Agnes Agent,feat(attribution.g1)) |
|
|
|
+| 本会话报告提交 | `609f74798`(docs(attribution.g1),仅含本报告文件) |
|
|
|
+| push origin cfclub | 首次被拒(本地旧基 ahead3/behind196)→ 并发维护会话 rebase 后,本会话报告提交可快进推送(ahead 1) |
|