phase29ap(p11): release adopt nested minimal coreplan

This commit is contained in:
2025-12-31 07:56:14 +09:00
parent efe5e2deed
commit 1ceadf361f
11 changed files with 120 additions and 4 deletions

View File

@ -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)

View File

@ -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`

View File

@ -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再発防止の土台

View File

@ -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`

View File

@ -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`

View File

@ -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)

View File

@ -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(

View File

@ -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,

View File

@ -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<Option<CorePlan>, 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,

View File

@ -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

View File

@ -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