fix: adversarial testing — 4 false positive/negative fixes + comment stripping
COBOL migration expert adversarial testing found 4 real defects:
FIX 1: Comment-stripping in detect_keyword() (FP-2)
- Remove *> inline comments and * comment lines before keyword matching
- Prevents 「マッチング」 from triggering on WS-KEY in comments
FIX 2: KEY comparison context validation (FP-1, FP-6)
- Add _matches_key_comparison() — requires WS-KEY variable to appear
NEAR an actual comparison operator (= < >), not just as PIC/VALUE decl
- Same check in _path_rule_engine features via has_key_var injection
- Fix regex bug: [=<>\s] vs [=<>] — \s matched whitespace after PIC decl
FIX 3: Old-school naming support (FN-1)
- Add L1 keyword r'[A-Z]\d{0,2}-\w*KEY' with 0.55 confidence
- Matches K01-KEY, KS-KEY etc. (non-WS- prefix naming convention)
FIX 4: mn_output_mode over-matching (FP-6)
- Require IF branches + KEY evidence before returning M:N for file>=3
- matching_vs_keybreak rule 3 now requires has_key_var
New tests: test_adversarial.py — 8 parametrized adversarial tests
Regression: 755 passed (0 new failures)
This commit is contained in:
@@ -43,8 +43,10 @@ def resolve_matching_vs_keybreak(features: dict) -> dict:
|
||||
return {"resolved_type": "キーブレイク", "confidence": 0.85, "evidence": evidence}
|
||||
|
||||
# 补充规则: SELECT 文件数 >= 2 且 comparison 至少 1 → 倾向マッチング
|
||||
if file_count >= 2 and comparison_ifs >= 1:
|
||||
evidence.append(f"SELECT 文件数 >=2 + comparison IF >=1 → マッチング")
|
||||
# 要求必须有实际的 KEY 变量比较(防止计数器比较误判)
|
||||
has_key_compare = variable_patterns.get("has_prev_key", False) or features.get("has_key_var", False)
|
||||
if file_count >= 2 and comparison_ifs >= 1 and has_key_compare:
|
||||
evidence.append(f"SELECT 文件数 >=2 + comparison IF >=1 + KEY 变量 → マッチング")
|
||||
return {"resolved_type": "マッチング", "confidence": 0.75, "evidence": evidence}
|
||||
|
||||
# 回退: 无法明确判定
|
||||
@@ -202,8 +204,15 @@ def resolve_mn_output_mode(features: dict) -> dict:
|
||||
return {"resolved_type": "M:N", "confidence": 0.65, "evidence": evidence}
|
||||
|
||||
if file_count >= 3:
|
||||
evidence.append(f"文件数 {file_count} >= 3, 可能为 M:N 关系")
|
||||
return {"resolved_type": "M:N", "confidence": 0.60, "evidence": evidence}
|
||||
# 需要至少有 IF 分支和 KEY 变量的证据,否则单纯文件多不是匹配程序
|
||||
vp = features.get("variable_patterns", {})
|
||||
total_ifs = features.get("if_types", {}).get("total", 0)
|
||||
has_key_evidence = vp.get("has_prev_key", False) or vp.get("has_accumulator", False)
|
||||
if total_ifs >= 1 and has_key_evidence:
|
||||
evidence.append(f"文件数 {file_count} >= 3, IF 分支 {total_ifs}, KEY 证据 → 可能 M:N")
|
||||
return {"resolved_type": "M:N", "confidence": 0.60, "evidence": evidence}
|
||||
evidence.append(f"文件数 {file_count} 但无 IF+KEY 证据 → 不是 M:N 匹配")
|
||||
return {"resolved_type": "unknown", "confidence": 0.0, "evidence": evidence}
|
||||
|
||||
evidence.append("需数据验证确定 M:N 输出模式")
|
||||
return {"resolved_type": "unknown", "confidence": 0.0, "evidence": evidence}
|
||||
|
||||
Reference in New Issue
Block a user