feat(joinir): Phase 286 P2.4 - Pattern8 BoolPredicateScan Plan化 PoC
## 概要 Pattern8 (BoolPredicateScan) を Plan extraction routing に追加。 static box 除外(Phase 269 決定)を尊重し、非 static box fixture で PoC。 ## 実装内容 - Pattern8BoolPredicateScanPlan struct + DomainPlan variant - extract_pattern8_plan(): 条件・predicate check・increment 抽出 - normalize_pattern8_bool_predicate_scan(): PoC stub(CoreExitPlan::Return 未統合) - PLAN_EXTRACTORS テーブルに Pattern8 追加(3rd priority) - エラーフォールバック: Plan normalization 失敗時 → legacy Pattern8 へ ## 動作フロー Plan extraction MATCHED → normalization failed (PoC stub) → legacy Pattern8 MATCHED ## 検証結果 - Integration: phase286_pattern8_plan_poc_vm PASS (exit 7) - Regression: quick 154 PASS, 0 FAILED 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -185,6 +185,7 @@ enum PlanExtractorVariant {
|
||||
///
|
||||
/// Order is important: more specific patterns first
|
||||
/// - Pattern6/7: Need fn_body for capture analysis
|
||||
/// - Pattern8: Bool predicate scan (early-exit return, more specific)
|
||||
/// - Pattern4: Continue loop (more specific than Pattern1)
|
||||
/// - Pattern9: Accum const loop (2 carriers, more specific than Pattern1)
|
||||
/// - Pattern1: Simple while (fallback)
|
||||
@ -197,6 +198,10 @@ static PLAN_EXTRACTORS: &[PlanExtractorEntry] = &[
|
||||
name: "Pattern7_SplitScan (Phase 273)",
|
||||
extractor: PlanExtractorVariant::WithPostLoop(super::pattern7_split_scan::extract_split_scan_plan),
|
||||
},
|
||||
PlanExtractorEntry {
|
||||
name: "Pattern8_BoolPredicateScan (Phase 286 P2.4)",
|
||||
extractor: PlanExtractorVariant::Simple(super::extractors::pattern8::extract_pattern8_plan),
|
||||
},
|
||||
PlanExtractorEntry {
|
||||
name: "Pattern4_Continue (Phase 286 P2)",
|
||||
extractor: PlanExtractorVariant::Simple(super::extractors::pattern4::extract_pattern4_plan),
|
||||
@ -238,17 +243,31 @@ fn try_plan_extractors(
|
||||
}
|
||||
};
|
||||
|
||||
// If extraction succeeded, lower and return
|
||||
// If extraction succeeded, try lowering
|
||||
if let Some(domain_plan) = plan_opt {
|
||||
let log_msg = format!("route=plan strategy=extract pattern={}", entry.name);
|
||||
trace::trace().pattern("route", &log_msg, true);
|
||||
return lower_via_plan(builder, domain_plan, ctx);
|
||||
}
|
||||
|
||||
// Extraction returned None - try next extractor
|
||||
if ctx.debug {
|
||||
let debug_msg = format!("{} extraction returned None, trying next pattern", entry.name);
|
||||
trace::trace().debug("route", &debug_msg);
|
||||
// Phase 286 P2.4: Catch normalization errors for PoC fallback
|
||||
// Pattern8 PoC returns error from normalizer to trigger legacy fallback
|
||||
match lower_via_plan(builder, domain_plan, ctx) {
|
||||
Ok(result) => return Ok(result),
|
||||
Err(e) if e.contains("[normalizer/pattern8]") => {
|
||||
// Pattern8 PoC: normalization not yet supported, continue to legacy Pattern8
|
||||
if ctx.debug {
|
||||
trace::trace().debug("route", &format!("Pattern8 Plan PoC: normalization failed ({}), continuing to legacy Pattern8", e));
|
||||
}
|
||||
// Continue to next extractor (or legacy patterns)
|
||||
continue; // Explicit continue to skip "extraction returned None" log
|
||||
}
|
||||
Err(e) => return Err(e), // Real errors propagate
|
||||
}
|
||||
} else {
|
||||
// Extraction returned None - try next extractor
|
||||
if ctx.debug {
|
||||
let debug_msg = format!("{} extraction returned None, trying next pattern", entry.name);
|
||||
trace::trace().debug("route", &debug_msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user