From 1ceadf361f15aca700a7ddf86ef0157dd1b90ea1 Mon Sep 17 00:00:00 2001 From: tomoaki Date: Wed, 31 Dec 2025 07:56:14 +0900 Subject: [PATCH] phase29ap(p11): release adopt nested minimal coreplan --- docs/development/current/main/10-Now.md | 2 +- docs/development/current/main/30-Backlog.md | 2 +- .../design/coreplan-migration-roadmap-ssot.md | 2 +- .../current/main/phases/phase-29ae/README.md | 1 + ...STED-MINIMAL-RELEASE-ADOPT-INSTRUCTIONS.md | 29 ++++++++++++ .../current/main/phases/phase-29ap/README.md | 12 ++++- .../control_flow/joinir/patterns/router.rs | 9 ++++ .../builder/control_flow/plan/composer/mod.rs | 1 + .../plan/composer/shadow_adopt.rs | 18 +++++++ .../joinir/phase29ae_regression_pack_vm.sh | 1 + ...se29ap_pattern6_nested_release_adopt_vm.sh | 47 +++++++++++++++++++ 11 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 docs/development/current/main/phases/phase-29ap/P11-NESTED-MINIMAL-RELEASE-ADOPT-INSTRUCTIONS.md create mode 100644 tools/smokes/v2/profiles/integration/joinir/phase29ap_pattern6_nested_release_adopt_vm.sh diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md index e686422e..f4008b1d 100644 --- a/docs/development/current/main/10-Now.md +++ b/docs/development/current/main/10-Now.md @@ -3,7 +3,7 @@ ## Current Focus - Phase: `docs/development/current/main/phases/phase-29ap/README.md` -- Next: Phase 29ap P11 (planned; see `docs/development/current/main/phases/phase-29ap/README.md`) +- Next: Phase 29ap P12 (planned; see `docs/development/current/main/phases/phase-29ap/README.md`) ## Gate (SSOT) diff --git a/docs/development/current/main/30-Backlog.md b/docs/development/current/main/30-Backlog.md index 0ebf9730..f4a14ace 100644 --- a/docs/development/current/main/30-Backlog.md +++ b/docs/development/current/main/30-Backlog.md @@ -5,7 +5,7 @@ Scope: 「次にやる候補」を短く列挙するメモ。入口は `docs/dev ## Active -- Phase 29ap: `docs/development/current/main/phases/phase-29ap/README.md` (Next: P11 planned) +- Phase 29ap: `docs/development/current/main/phases/phase-29ap/README.md` (Next: P12 planned) - JoinIR regression gate SSOT: `docs/development/current/main/phases/phase-29ae/README.md` - CorePlan hardening (docs-first): `docs/development/current/main/phases/phase-29al/README.md` diff --git a/docs/development/current/main/design/coreplan-migration-roadmap-ssot.md b/docs/development/current/main/design/coreplan-migration-roadmap-ssot.md index 608b4165..a34d0075 100644 --- a/docs/development/current/main/design/coreplan-migration-roadmap-ssot.md +++ b/docs/development/current/main/design/coreplan-migration-roadmap-ssot.md @@ -34,7 +34,7 @@ Related: ## 1.1 Current (active) - Active phase: `docs/development/current/main/phases/phase-29ap/README.md` -- Next step: Phase 29ap P11 (planned) +- Next step: Phase 29ap P12 (planned) ## 2. すでに固めた SSOT(再発防止の土台) diff --git a/docs/development/current/main/phases/phase-29ae/README.md b/docs/development/current/main/phases/phase-29ae/README.md index ae15068e..c1c08395 100644 --- a/docs/development/current/main/phases/phase-29ae/README.md +++ b/docs/development/current/main/phases/phase-29ae/README.md @@ -21,6 +21,7 @@ Goal: JoinIR の最小回帰セットを SSOT として固定する。 - Pattern6 (strict shadow, VM): `phase29ao_pattern6_strict_shadow_vm` - Pattern6 (release adopt, VM): `phase29ao_pattern6_release_adopt_vm` - Pattern6: `phase29ab_pattern6_*` +- Pattern6 (nested minimal release adopt, VM): `phase29ap_pattern6_nested_release_adopt_vm` - Pattern6 (nested minimal strict shadow, VM): `phase29ap_pattern6_nested_strict_shadow_vm` - Pattern7 (strict shadow, VM): `phase29ao_pattern7_strict_shadow_vm` - Pattern7 (release adopt, VM): `phase29ao_pattern7_release_adopt_vm` diff --git a/docs/development/current/main/phases/phase-29ap/P11-NESTED-MINIMAL-RELEASE-ADOPT-INSTRUCTIONS.md b/docs/development/current/main/phases/phase-29ap/P11-NESTED-MINIMAL-RELEASE-ADOPT-INSTRUCTIONS.md new file mode 100644 index 00000000..322b84de --- /dev/null +++ b/docs/development/current/main/phases/phase-29ap/P11-NESTED-MINIMAL-RELEASE-ADOPT-INSTRUCTIONS.md @@ -0,0 +1,29 @@ +# Phase 29ap P11: Pattern6_NestedLoopMinimal release adopt (CorePlan default) + +## Goal + +- Route nested minimal loops to CorePlan composer v2 in non-strict/release. +- Keep strict/dev tag and fail-fast behavior unchanged. +- Preserve legacy fallback when facts are missing. + +## Steps + +1. Release adopt path + - Use the same nested facts + composer v2 as strict/dev. + - Only adopt when facts are present; otherwise fall back to legacy. + - No new tags/logs in release. + +2. Regression gate + - Add a release adopt smoke for `phase1883_nested_minimal` (exit code 9). + - Ensure no shadow-adopt tag is printed. + +3. Docs + - Mark P11 done in `phase-29ap/README.md`. + - Advance Now/Backlog/roadmap to next planned step. + +## Verification + +- `cargo build --release` +- `./tools/smokes/v2/run.sh --profile quick` +- `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` + diff --git a/docs/development/current/main/phases/phase-29ap/README.md b/docs/development/current/main/phases/phase-29ap/README.md index 65b64c8e..c1c7a948 100644 --- a/docs/development/current/main/phases/phase-29ap/README.md +++ b/docs/development/current/main/phases/phase-29ap/README.md @@ -118,6 +118,16 @@ Gate (SSOT): - Release/default behavior remains unchanged (legacy JoinIR path stays). - Gate stays green. +## P11: Pattern6_NestedLoopMinimal release adopt ✅ + +- Scope: + - Non-strict/release adopts the nested minimal CorePlan v2 when facts are present. + - Strict/dev tag and fail-fast behavior remain unchanged. + - Legacy fallback remains for non-matches. +- Guardrails: + - No new logs/tags in release. + - Gate stays green. + ## Next (planned) -- P11: Pattern6_NestedLoopMinimal release adopt (TBD; keep strict gate green) +- P12: Decide final removal of legacy nested loop entry (gate-first) diff --git a/src/mir/builder/control_flow/joinir/patterns/router.rs b/src/mir/builder/control_flow/joinir/patterns/router.rs index a919efa0..7dccf5cc 100644 --- a/src/mir/builder/control_flow/joinir/patterns/router.rs +++ b/src/mir/builder/control_flow/joinir/patterns/router.rs @@ -308,6 +308,15 @@ pub(crate) fn route_loop_pattern( } } + if !strict_or_dev { + if let Some(core_plan) = + composer::try_release_adopt_nested_minimal(builder, ctx, &outcome)? + { + PlanVerifier::verify(&core_plan)?; + return PlanLowerer::lower(builder, core_plan, ctx); + } + } + if let Some(domain_plan) = domain_plan { if let Some(adopt) = composer::try_shadow_adopt_core_plan( diff --git a/src/mir/builder/control_flow/plan/composer/mod.rs b/src/mir/builder/control_flow/plan/composer/mod.rs index eca8666e..e3c6c146 100644 --- a/src/mir/builder/control_flow/plan/composer/mod.rs +++ b/src/mir/builder/control_flow/plan/composer/mod.rs @@ -15,6 +15,7 @@ use crate::mir::builder::MirBuilder; pub(in crate::mir::builder) use shadow_adopt::{ strict_nested_loop_guard, + try_release_adopt_nested_minimal, try_shadow_adopt_nested_minimal, try_release_adopt_core_plan, try_shadow_adopt_core_plan, diff --git a/src/mir/builder/control_flow/plan/composer/shadow_adopt.rs b/src/mir/builder/control_flow/plan/composer/shadow_adopt.rs index 6b8b2f0a..cbd4bb2f 100644 --- a/src/mir/builder/control_flow/plan/composer/shadow_adopt.rs +++ b/src/mir/builder/control_flow/plan/composer/shadow_adopt.rs @@ -68,6 +68,24 @@ pub(in crate::mir::builder) fn try_shadow_adopt_nested_minimal( })) } +pub(in crate::mir::builder) fn try_release_adopt_nested_minimal( + builder: &mut MirBuilder, + ctx: &LoopPatternContext, + outcome: &PlanBuildOutcome, +) -> Result, String> { + let Some(facts) = outcome.facts.as_ref() else { + return Ok(None); + }; + if facts.facts.pattern6_nested_minimal.is_none() { + return Ok(None); + } + + match try_compose_core_loop_v2_nested_minimal(builder, facts, ctx) { + Ok(Some(core)) => Ok(Some(core)), + Ok(None) | Err(_) => Ok(None), + } +} + fn try_compose_core_loop_scan_with_init( builder: &mut MirBuilder, facts: &CanonicalLoopFacts, diff --git a/tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh b/tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh index 6c172f00..1afff956 100644 --- a/tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh +++ b/tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh @@ -34,6 +34,7 @@ run_filter "pattern5_release_adopt_vm" "phase29ao_pattern5_release_adopt_vm" || run_filter "pattern6_strict_shadow_vm" "phase29ao_pattern6_strict_shadow_vm" || exit 1 run_filter "pattern6_release_adopt_vm" "phase29ao_pattern6_release_adopt_vm" || exit 1 run_filter "pattern6" "phase29ab_pattern6_" || exit 1 +run_filter "pattern6_nested_release_adopt_vm" "phase29ap_pattern6_nested_release_adopt_vm" || exit 1 run_filter "pattern6_nested_strict_shadow_vm" "phase29ap_pattern6_nested_strict_shadow_vm" || exit 1 run_filter "pattern7_strict_shadow_vm" "phase29ao_pattern7_strict_shadow_vm" || exit 1 run_filter "pattern7_release_adopt_vm" "phase29ao_pattern7_release_adopt_vm" || exit 1 diff --git a/tools/smokes/v2/profiles/integration/joinir/phase29ap_pattern6_nested_release_adopt_vm.sh b/tools/smokes/v2/profiles/integration/joinir/phase29ap_pattern6_nested_release_adopt_vm.sh new file mode 100644 index 00000000..07cbfa68 --- /dev/null +++ b/tools/smokes/v2/profiles/integration/joinir/phase29ap_pattern6_nested_release_adopt_vm.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# phase29ap_pattern6_nested_release_adopt_vm.sh - Pattern6 nested minimal release adopt (VM) +# +# Expected: +# - Exit code 9 +# - No shadow-adopt tags + +source "$(dirname "$0")/../../../lib/test_runner.sh" +require_env || exit 2 + +FIXTURE="$NYASH_ROOT/apps/tests/phase1883_nested_minimal.hako" +RUN_TIMEOUT_SECS=${RUN_TIMEOUT_SECS:-10} +TAG_PREFIX='[coreplan/shadow_adopt:' + +set +e +OUTPUT=$(timeout "$RUN_TIMEOUT_SECS" env \ + -u HAKO_JOINIR_STRICT \ + -u NYASH_JOINIR_STRICT \ + -u HAKO_JOINIR_DEBUG \ + -u NYASH_JOINIR_DEBUG \ + -u NYASH_JOINIR_DEV \ + NYASH_DISABLE_PLUGINS=1 \ + "$NYASH_BIN" --backend vm "$FIXTURE" 2>&1) +EXIT_CODE=$? +set -e + +if [ "$EXIT_CODE" -eq 124 ]; then + test_fail "phase29ap_pattern6_nested_release_adopt_vm: hakorune timed out (>${RUN_TIMEOUT_SECS}s)" + exit 1 +fi + +if echo "$OUTPUT" | grep -qF "$TAG_PREFIX"; then + echo "[FAIL] Release adopt must not print shadow-adopt tags" + echo "$OUTPUT" | tail -n 60 || true + test_fail "phase29ap_pattern6_nested_release_adopt_vm: Unexpected tag" + exit 1 +fi + +if [ "$EXIT_CODE" -ne 9 ]; then + echo "[FAIL] Expected exit 9, got $EXIT_CODE" + echo "$OUTPUT" | tail -n 40 || true + test_fail "phase29ap_pattern6_nested_release_adopt_vm: Unexpected RC" + exit 1 +fi + +test_pass "phase29ap_pattern6_nested_release_adopt_vm: PASS (exit=9)" +exit 0