Explorar o código

feat(attribution.ruleLoad): 低侧判读规则入库 T3(guhe.lowSide.ruleLoad / S-cfc-124)

- AttributionLowSideRules 新增三规则码(four_mechanism / u_shape / ref_lower_zero)、
  判读铁律常量 INTERPRET_LAW_LOW_SIDE(关联非因果)与 U 型双向口径常量
  U_SHAPE_CALIBER_HINT(越低越好不成立 / 参考下限 0),并新增规则加载入口
  lowSideInterpretRules() 供 L4 引擎加载
- ConditionalPathogenLowSideRules E.Coli 低侧模板补「越低越好不成立」口径短语
  (保留「低就是好」不成立以兼容既有绿测),衔接 T3 L4-2 U 型双向口径
- GuheLowSideRuleLoadContractTest 10/10 绿;ConditionalPathogenLowSideRuleTest
  + UnifiedKnowledgeBaseLowSidePatchTest 14/14 绿,无回归
E2E Test Bot hai 3 días
pai
achega
aaad839ff0

+ 32 - 1
cfc-backend/src/main/java/com/etotem/cfc/constant/AttributionLowSideRules.java

@@ -50,7 +50,7 @@ public final class AttributionLowSideRules {
     /** T6 G-2 规则码:非菌株级粒度禁生成含菌株号的商品推荐(叠加 §5.2 16S 粒度声明) */
     public static final String RULE_NO_STRAIN_RECOMMENDATION = "no_strain_recommendation";
 
-    /** T11 G-3 规则码:证据码隔离(低侧机制证据标 PUB/KB;COM 只作存在性记录;未核实编号标「未核实」) */
+/** T11 G-3 规则码:证据码隔离(低侧机制证据标 PUB/KB;COM 只作存在性记录;未核实编号标「未核实」) */
     public static final String RULE_EVIDENCE_ISOLATE = "evidence_isolate";
 
     /** 证据码:公开文献(低侧机制证据,可进推荐依据) */
@@ -65,6 +65,32 @@ public final class AttributionLowSideRules {
     /** 未核实标注(未核实编号统一标此值,不得充当推荐依据) */
     public static final String EVIDENCE_UNVERIFIED = "未核实";
 
+    // ------------------------------------------------------------------
+    // T3 低侧判读规则(L4-1/L4-2,guhe.lowSide.ruleLoad)
+    // 条件致病菌偏低侧判读规则入库:四机制 / U 型双向口径 / 参考下限 0;
+    // 规则码 + 判读铁律 + U 型口径常量 + 加载入口 lowSideInterpretRules(),
+    // 由 IndicatorInterpretEngine 低侧解读路径(偏低条件致病菌)加载应用。
+    // ------------------------------------------------------------------
+
+    /** T3(L4-1)低侧判读规则码:条件致病菌偏低侧按四机制解释 */
+    public static final String RULE_FOUR_MECHANISM = "four_mechanism";
+
+    /** T3(L4-2)低侧判读规则码:U 型双向口径(越低越好不成立) */
+    public static final String RULE_U_SHAPE = "u_shape";
+
+    /** T3(L4-2)低侧判读规则码:参考下限 0 的菌不标「偏低超标」(ND 只是低于检出丰度) */
+    public static final String RULE_REF_LOWER_ZERO = "ref_lower_zero";
+
+    /** T3(L4-1)判读铁律口径:低侧判读规则全部标「关联非因果」(四机制解释),供 L4 引擎取用 */
+    public static final String INTERPRET_LAW_LOW_SIDE =
+            "条件致病菌偏低侧按四机制解释,全部标「关联非因果」——偏低估只是伴随性观察,"
+                    + "不作因果归因、不写「缺X→致病/需补充」、不推荐补菌。";
+
+    /** T3(L4-2)U 型双向口径:条件致病菌「越低越好」不成立;参考下限 0 的菌不标「偏低超标」(ND 只是低于检出丰度) */
+    public static final String U_SHAPE_CALIBER_HINT =
+            "U 型双向口径:偏离人群参考区间两端都可能关联异常,「越低越好不成立」;"
+                    + "人群参考下限为 0 的报告不标注「偏低超标」,ND 仅表示低于检出丰度。";
+
     /**
      * 措辞白名单(关联非因果口径)。描述菌↔问题关联时,仅允许使用下列措辞;
      * 白名单外的因果表述(如「缺大肠杆菌→致病/需补充」)由门禁拦截并给出建议改写。
@@ -103,6 +129,11 @@ public final class AttributionLowSideRules {
     private AttributionLowSideRules() {
     }
 
+    /** T3 低侧判读规则加载入口:返回已入库的低侧判读规则码集合(供 L4 引擎加载应用) */
+    public static List<String> lowSideInterpretRules() {
+        return Arrays.asList(RULE_FOUR_MECHANISM, RULE_U_SHAPE, RULE_REF_LOWER_ZERO);
+    }
+
     public static List<Pattern> causalPatterns() {
         return Collections.unmodifiableList(Arrays.asList(FORBIDDEN_CAUSAL_PATTERNS));
     }

+ 1 - 1
cfc-backend/src/main/java/com/etotem/cfc/constant/ConditionalPathogenLowSideRules.java

@@ -95,7 +95,7 @@ public final class ConditionalPathogenLowSideRules {
      */
     private static final String ECOLI_MEANING_TEMPLATE =
             "偏低提示(关联非因果):健康区间是范围而非单向(U 型双向口径:偏离人群参考区间两端都可能关联异常,"
-                    + "\"低就是好\"不成立);人群参考下限为 0 的报告不标注\"偏低超标\",ND 仅表示低于检出丰度。"
+                    + "\"低就是好\"不成立(即越低越好不成立));人群参考下限为 0 的报告不标注\"偏低超标\",ND 仅表示低于检出丰度。"
                     + "机制参考(文献关联,非因果):①耗氧维持肠腔厌氧——共生株消耗氧气协助维持厌氧环境,"
                     + "丰度过低时厌氧群落保护力减弱(Cell Host Microbe 2019, PMID 30629913);"
                     + "②定植抵抗与生态位——占位、铁载体竞争、黏蛋白降解利用抑制致病菌过度定植(MDPI Pathogens 2024 综述);"