## Phase 188.3 進捗: Phase 2 完了 (6/13 tasks) ### 実装完了 ✅ **Phase 1: Fixture作成** - apps/tests/phase1883_nested_minimal.hako 追加 - Add/Compare のみ(乗算なし) - 期待 exit code: 9 (3×3 nested loops) - 既存 lowering で fallback 動作確認 **Phase 2: 選択ロジック (SSOT)** - LoopPatternContext に step_tree_max_loop_depth フィールド追加 - choose_pattern_kind() に Pattern6 選択ロジック実装: 1. Cheap check (has_inner_loop) 2. StepTree 構築 (max_loop_depth 取得) 3. AST validation (is_pattern6_lowerable) - pattern6_nested_minimal.rs モジュール作成 (stub) - LOOP_PATTERNS に Pattern6 entry 追加 - **検証**: Pattern6 が正しく選択される ✅ ### 設計原則 (確認済み) 1. **Fail-Fast**: Pattern6 選択後は Ok(None) で逃げない 2. **outer 変数 write-back 検出 → validation false** (Phase 188.4+) 3. **最小実装**: inner local だけ、Pattern1 モデル二重化 4. **cfg! 依存なし**: production で動作 ### 検証結果 ``` [choose_pattern_kind] has_inner_loop=true [choose_pattern_kind] max_loop_depth=2 [choose_pattern_kind] is_pattern6_lowerable=true ✅ Pattern6 SELECTED! ``` Stub からの期待エラー: ``` [ERROR] ❌ [Pattern6] Nested loop lowering not yet implemented ``` ### 次: Phase 3 (Lowering 実装 - 推定4時間) 残りタスク: - Phase 3-1: AST 抽出ヘルパー - Phase 3-2: Validation ヘルパー - Phase 3-3: Continuation 生成 (outer_step, inner_step, k_inner_exit) - Phase 3-4: fixture が exit=9 を返すことを検証 ### 変更ファイル **新規**: - apps/tests/phase1883_nested_minimal.hako - src/mir/builder/control_flow/joinir/patterns/pattern6_nested_minimal.rs - docs/development/current/main/phases/phase-188.{1,2,3}/README.md **変更**: - src/mir/builder/control_flow/joinir/routing.rs (Pattern6 選択) - src/mir/builder/control_flow/joinir/patterns/router.rs (Context 拡張) - src/mir/builder/control_flow/joinir/patterns/mod.rs (module 宣言) 🎯 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
286 lines
9.9 KiB
Markdown
286 lines
9.9 KiB
Markdown
# Selfhost Integration Test Limitations
|
||
|
||
**Date**: 2025-12-27 (Updated with actual log findings)
|
||
**Context**: Phase S0 selfhost integration stabilization
|
||
**Investigator**: Claude Code
|
||
**Status**: Actual Log-Based Analysis (No Speculation)
|
||
|
||
---
|
||
|
||
## Executive Summary
|
||
|
||
Integration selfhost tests show 12 FAILs out of 33 tests. This document is based on **actual test execution logs** collected on 2025-12-27.
|
||
|
||
**Key Principle**: This analysis uses ONLY confirmed error patterns from real logs. No speculation or estimation.
|
||
|
||
**Log Collection**:
|
||
- Full integration selfhost run: `/tmp/integration_selfhost_full.log`
|
||
- Individual script logs: `/tmp/selfhost_minimal.log`, `/tmp/phase150.log`, etc.
|
||
|
||
**Resolution Strategy**: Conditional SKIP (該当ログが出た時だけ、それ以外はFAIL)
|
||
|
||
---
|
||
|
||
## 実ログ確認済みエラーパターン
|
||
|
||
### Pattern 1: JoinIR Loop Lowering Failure
|
||
|
||
**Error Tag**: `[joinir/freeze] Loop lowering failed`
|
||
|
||
**Full Error Message**:
|
||
```
|
||
[ERROR] ❌ MIR compilation error: [joinir/freeze] Loop lowering failed: JoinIR does not support this pattern, and LoopBuilder has been removed.
|
||
Function: BundleResolver.resolve/4
|
||
Hint: This loop pattern is not supported. All loops must use JoinIR lowering.
|
||
```
|
||
|
||
**Confirmed in**:
|
||
- `selfhost_minimal.sh` (BundleResolver.resolve/4)
|
||
- `selfhost_mir_min_vm.sh` (MirVmMin._str_to_int)
|
||
|
||
**Root Cause**: Phase 188 JoinIR loop patterns don't support all loop constructs. Legacy LoopBuilder was removed in Phase 187.
|
||
|
||
**Category**: JoinIR loop pattern gap
|
||
|
||
---
|
||
|
||
### Pattern 2: JoinIR Caps Gap (NestedLoop)
|
||
|
||
**Error Tag**: `cap_missing/NestedLoop`
|
||
|
||
**Full Error Message**:
|
||
```
|
||
[joinir/control_tree] missing cap: NestedLoop in BundleResolver.resolve/4
|
||
[ERROR] ❌ MIR compilation error: [joinir/control_tree/cap_missing/NestedLoop] NestedLoop detected in 'BundleResolver.resolve/4' (step_tree_sig=967e04269f051967) Hint: refactor to avoid nested loops (not supported yet) or run without HAKO_JOINIR_STRICT=1
|
||
```
|
||
|
||
**Confirmed in**:
|
||
- `selfhost_minimal.sh` (visible in full integration log)
|
||
|
||
**Root Cause**: JoinIR control_tree lacks NestedLoop capability
|
||
|
||
**Category**: JoinIR caps gap
|
||
|
||
**Note**: This error appears BEFORE Pattern 1 in selfhost_minimal.sh, suggesting the script encounters Pattern 2 first.
|
||
|
||
---
|
||
|
||
### Pattern 3: Strict-Only Canary (Pattern Not Matched)
|
||
|
||
**Error Tag**: `strict mode: pattern not matched`
|
||
|
||
**Full Error Message**:
|
||
```
|
||
thread 'main' panicked at src/mir/builder/if_form.rs:328:29:
|
||
[joinir/if] strict mode: pattern not matched for IfSelectTest.test/1 (if_form.rs)
|
||
```
|
||
|
||
**Confirmed in**:
|
||
- `selfhost_phase150_depth1_smoke.sh` (testing joinir_if_select_simple.hako)
|
||
- Runs with `NYASH_JOINIR_STRICT=1`
|
||
|
||
**Root Cause**: if_form.rs strict mode validation catches unmatched pattern
|
||
|
||
**Category**: strict-only canary
|
||
|
||
**Design Intent**: Strict mode is intentionally strict to catch edge cases. Not meant for baseline stability.
|
||
|
||
---
|
||
|
||
### Pattern 4: Selfhost Child Spawn Limitation
|
||
|
||
**Error Tag**: `Argument list too long (os error 7)`
|
||
|
||
**Full Error Message**:
|
||
```
|
||
[selfhost-child] spawn failed: Argument list too long (os error 7)
|
||
```
|
||
|
||
**Confirmed in**:
|
||
- `selfhost_minimal.sh`
|
||
|
||
**Root Cause**: OS kernel limitation (ARG_MAX) for subprocess argument list length
|
||
|
||
**Category**: OS limitation
|
||
|
||
**Note**: This error appears FIRST in selfhost_minimal.sh execution, before any JoinIR errors.
|
||
|
||
---
|
||
|
||
## FAIL スクリプト一覧(実ログベース・テーブル化)
|
||
|
||
| Script Path | Error Tag | Category | Action |
|
||
|-------------|-----------|----------|--------|
|
||
| `selfhost_minimal.sh` | `Argument list too long` + `Loop lowering failed` | Pattern 4 + Pattern 1 | 条件付き SKIP |
|
||
| `selfhost_phase150_depth1_smoke.sh` | `strict mode: pattern not matched` | Pattern 3 | 条件付き SKIP |
|
||
| `selfhost_mir_min_vm.sh` | `loop pattern is not supported` | Pattern 1 | 条件付き SKIP |
|
||
| `selfhost_s1_s2_from_builder_canary_vm.sh` | rc=1 (no error detail in log) | Unknown | 条件付き SKIP (known patterns only) |
|
||
| `selfhost_s1_s2_from_builder_compare_ret_canary_vm.sh` | rc=1 (no error detail) | Unknown | 条件付き SKIP (known patterns only) |
|
||
| `selfhost_s1_s2_from_builder_compare_cfg_canary_vm.sh` | rc=1 (no error detail) | Unknown | 条件付き SKIP (known patterns only) |
|
||
| `selfhost_v0_s1s2_repeat_canary_vm.sh` | rc=1 (no error detail) | Unknown | 条件付き SKIP (known patterns only) |
|
||
| `selfhost_v1_primary_rc42_canary_vm.sh` | rc=1 (no error detail) | Unknown | 条件付き SKIP (known patterns only) |
|
||
| `selfhost_v1_provider_primary_rc42_canary_vm.sh` | rc=1 (no error detail) | Unknown | 条件付き SKIP (known patterns only) |
|
||
| `selfhost_v0_core_exec_rc42_canary_vm.sh` | rc=1 (no error detail) | Unknown | 条件付き SKIP (known patterns only) |
|
||
|
||
**Total FAILs**: 12 (from full integration run on 2025-12-27)
|
||
**Total PASSes**: 21
|
||
**Total Tests**: 33
|
||
|
||
---
|
||
|
||
## 未確認パターン(実ログで確認されなかった)
|
||
|
||
### String+Integer Type Error (NOT confirmed)
|
||
|
||
**Previous Speculation** (from Task agent):
|
||
- "6-8 tests fail due to String + Integer auto-conversion not supported"
|
||
- Example: `print("" + integer_value)`
|
||
|
||
**Actual Log Finding**: ❌ **NOT confirmed in any collected logs**
|
||
|
||
**Conclusion**: Either:
|
||
1. This pattern doesn't occur in current selfhost tests, OR
|
||
2. Tests were fixed to use `.toString()`, OR
|
||
3. The speculation was incorrect
|
||
|
||
**Action**: Do NOT add SKIP for this pattern. Only add if confirmed in actual logs.
|
||
|
||
---
|
||
|
||
## Resolution Strategy (Phase S0 & S0.1)
|
||
|
||
### Phase S0.1 Update: Canary Tests Opt-In
|
||
|
||
**Canary Tests**: Opt-in via `SMOKES_ENABLE_SELFHOST=1` (Phase S0.1) - not required for baseline integration
|
||
|
||
**Affected Tests** (9 canary tests):
|
||
- `phase2047/*_canary_vm.sh` (5 tests)
|
||
- `phase2051/*_canary_vm.sh` (4 tests)
|
||
|
||
**Rationale**: These are advanced/experimental selfhost tests. Baseline integration stability doesn't require them to pass.
|
||
|
||
### Principle: 条件付き SKIP(Conditional SKIP Only)
|
||
|
||
**Approach**: SKIP only when specific error pattern appears in logs, otherwise FAIL
|
||
|
||
**Implementation Example** (Pattern 1):
|
||
```bash
|
||
# Phase S0: JoinIR loop lowering failure - conditional SKIP
|
||
# SSOT: docs/development/current/main/investigations/selfhost-integration-limitations.md
|
||
|
||
if [ "$exit_code" -ne 0 ]; then
|
||
if echo "$output" | grep -q "Loop lowering failed"; then
|
||
log_skip "selfhost_*: Pattern 1 (JoinIR loop pattern gap - Phase 188 limitation)"
|
||
exit 0
|
||
fi
|
||
# それ以外のエラーは FAIL のまま(回帰を隠さない)
|
||
log_error "selfhost_*: FAIL (unknown error, not Pattern 1)"
|
||
echo "$output"
|
||
exit 1
|
||
fi
|
||
```
|
||
|
||
### Critical Constraints
|
||
|
||
- ✅ **quick 154/154 PASS 維持** (一切触らない)
|
||
- ✅ **Phase 29y 凍結** (新しい lifecycle/RC 実装拡張はしない)
|
||
- ✅ **Fail-Fast** (silent fallback 禁止)
|
||
- ✅ **最小差分** (SKIP マーカー追加のみ)
|
||
|
||
### Prohibited Actions
|
||
|
||
- ❌ 無条件 SKIP (unconditional SKIP)
|
||
- ❌ 新規 env var 追加
|
||
- ❌ 直読み(std::env::var)増殖
|
||
- ❌ quick を重くする変更
|
||
- ❌ silent fallback
|
||
|
||
---
|
||
|
||
## Root Cause Analysis
|
||
|
||
### Why Pattern 1 & 2 (JoinIR Gaps)?
|
||
|
||
**Phase 187**: Removed LoopBuilder (legacy loop implementation)
|
||
**Phase 188**: Implemented 3 basic JoinIR loop patterns (80% coverage goal)
|
||
|
||
**Result**: Some complex loop patterns not yet supported:
|
||
- Multiple continue statements in single loop
|
||
- Nested loops (NestedLoop capability)
|
||
- Complex control flow combinations
|
||
|
||
**Design Trade-off**: Phase 188 prioritized common patterns to ship quickly. Complex patterns deferred.
|
||
|
||
**Fix Scope**: Requires Phase 188 continuation (JoinIR pattern expansion) - NOT in scope for Phase S0
|
||
|
||
### Why Pattern 3 (Strict Mode)?
|
||
|
||
**Design Intent**: `NYASH_JOINIR_STRICT=1` is a canary mode to catch unmatched patterns early
|
||
|
||
**Purpose**: Development/debugging, not baseline stability
|
||
|
||
**Resolution**: Either remove NYASH_JOINIR_STRICT=1 from baseline tests, OR conditional SKIP for strict mode errors
|
||
|
||
### Why Pattern 4 (Argument List Too Long)?
|
||
|
||
**Root Cause**: Linux kernel ARG_MAX limitation (typically ~2MB on modern systems)
|
||
|
||
**Context**: selfhost_build.sh passes large amounts of data via command-line arguments
|
||
|
||
**Fix Scope**: Requires architectural change (use files/stdin instead of argv) - NOT in scope for Phase S0
|
||
|
||
---
|
||
|
||
## Future Work (Out of Scope for Phase S0)
|
||
|
||
### Phase 188 Continuation (JoinIR Pattern Expansion)
|
||
|
||
**Patterns Needed**:
|
||
- NestedLoop capability (Pattern 2)
|
||
- Complex control flow with multiple continue (Pattern 1)
|
||
- Infinite loops with early exits
|
||
|
||
**Effort**: ~2-5 days per pattern (based on Phase 188 experience)
|
||
|
||
**Priority**: Medium (selfhost compiler .hako files need these patterns)
|
||
|
||
### Selfhost Build Architecture
|
||
|
||
**Issue**: Pattern 4 (Argument list too long)
|
||
|
||
**Solution**: Replace argv-based data passing with file-based or stdin-based approach
|
||
|
||
**Effort**: ~1-2 days
|
||
|
||
**Priority**: Low (affects only selfhost_minimal.sh currently)
|
||
|
||
---
|
||
|
||
## References
|
||
|
||
- **Log Collection**: `/tmp/integration_selfhost_full.log`, `/tmp/selfhost_minimal.log`, etc.
|
||
- **Phase S0 Plan**: `/home/tomoaki/.claude/plans/functional-chasing-clover.md`
|
||
- **JoinIR Architecture**: `docs/development/current/main/joinir-architecture-overview.md`
|
||
- **Phase 188 Inventory**: `docs/private/roadmap2/phases/phase-188-joinir-loop-pattern-expansion/inventory.md`
|
||
- **VM Implementation**: `src/backend/mir_interpreter/`
|
||
|
||
---
|
||
|
||
## Conclusion
|
||
|
||
**Fact-Based Analysis**: All findings confirmed by actual test execution logs on 2025-12-27
|
||
|
||
**12 FAILs** categorized into 4 confirmed patterns:
|
||
1. **Pattern 1**: JoinIR loop lowering failure (2+ tests)
|
||
2. **Pattern 2**: JoinIR caps gap - NestedLoop (1 test)
|
||
3. **Pattern 3**: strict mode panic (1 test)
|
||
4. **Pattern 4**: Argument list too long (1 test, appears with Pattern 1)
|
||
|
||
**Canary Tests**: 7 tests fail with rc=1 but no error detail in logs
|
||
|
||
**String+Integer speculation**: ❌ NOT confirmed in actual logs
|
||
|
||
**Next Step**: Implement conditional SKIP for confirmed patterns only (Task 2)
|
||
|
||
**Quick Profile Safety**: 154/154 PASS maintained ✅
|