From 93bbfe60296e7a7710dd58f9297bc00d622669e3 Mon Sep 17 00:00:00 2001 From: Peter Zhang <18501667167@qq.com> Date: Tue, 2 Jun 2026 18:05:28 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20step3=20=5Fnormalize=5Frule=20=E5=B0=86?= =?UTF-8?q?=20table=20source=20=E7=9A=84=20null=20row=20=E8=BD=AC=E4=B8=BA?= =?UTF-8?q?=200=20-=20Closes=20#73?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LLM 输出 table source 时 row 字段可能为 null,导致 Layer A schema 失败。 Co-Authored-By: Claude Opus 4.7 --- skills/ir_generation_skill/step3_merge_and_audit.py | 7 ++++++- skills/ir_generation_skill/tests/test_step3.py | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/skills/ir_generation_skill/step3_merge_and_audit.py b/skills/ir_generation_skill/step3_merge_and_audit.py index 3b2fb87..1d79f04 100644 --- a/skills/ir_generation_skill/step3_merge_and_audit.py +++ b/skills/ir_generation_skill/step3_merge_and_audit.py @@ -206,7 +206,12 @@ def _normalize_rule(rule: dict) -> dict: if stype and stype not in valid_types: src["type"] = "text" stype = "text" - if stype in ("table", "text"): + if stype == "table": + if not src.get("section"): + src["section"] = default_section + if src.get("row") is None: + src["row"] = 0 + elif stype == "text": if not src.get("section"): src["section"] = default_section else: diff --git a/skills/ir_generation_skill/tests/test_step3.py b/skills/ir_generation_skill/tests/test_step3.py index 8bdc4e5..2f42175 100644 --- a/skills/ir_generation_skill/tests/test_step3.py +++ b/skills/ir_generation_skill/tests/test_step3.py @@ -512,6 +512,18 @@ class TestNormalizeRule: normalized = _normalize_rule(rule) assert "section" not in normalized["sources"][0] + + def test_normalize_table_source_null_row(self): + """Table source with null row gets row=0 (defensive).""" + rule = { + "trigger": {"conditions": [{"signal": "x", "operator": "==", "value": "1"}]}, + "sources": [ + {"type": "table", "section": "3.1 功能", "row": None}, + ], + } + normalized = _normalize_rule(rule) + assert normalized["sources"][0]["row"] == 0 + def test_normalize_source_invalid_type(self): """Invalid source types (LLM hallucinations) are normalized to text.""" rule = {