Files
hakorune/docs/development/current/main/phase131-2-summary.md
nyash-codex 05c5021147 docs(phase131): LLVM SSOT強化 + ConsoleBox調査完了 + Phase86-90要約
Phase 131-1 完了: LLVM exe line SSOT 強化
- phase87-selfhost-llvm-exe-line.md に 4セクション追加(+300行)
  - 環境変数リファレンス(14変数)
  - 成功/失敗基準(exit code 0/1/2/3)
  - コンパイラモード説明(harness vs crate)
  - デバッグセクション拡張
- "1コマンドで再現" 可能な状態を確立

Phase 131-2 完了: ConsoleBox 問題調査
- VM の 3重登録経路を特定(BoxFactoryRegistry/UnifiedRegistry/Builtin)
- LLVM backend は Phase 133 で解決済み
- 3つのドキュメント作成:
  - phase131-2-consolebox-investigation.md(詳細調査)
  - phase131-2-summary.md(エグゼクティブサマリ)
  - phase131-2-box-resolution-map.md(Box 解決マップ)

Phase 86-90 完了: Loop frontends 要約
- phase86-90-loop-frontends-summary.md 追加
- Pattern4/ContinueReturn/ParseStringComposite の経緯を1枚に集約
- INDEX から導線追加

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-14 05:24:31 +09:00

4.7 KiB
Raw Blame History

Phase 131-2: ConsoleBox 問題根治調査 - エグゼクティブサマリ

🎯 調査結論3行サマリ

  1. LLVM 側は既存の統合事例がある - Phase 133archiveを参考にできる
  2. VM backend の Box 解決が分散して見える - UnifiedBoxRegistry入口と BoxFactoryRegistryplugin provider mappingの関係が追いにくい
  3. ConsoleBox 自体は問題なし - 迷子の原因は “どこを見ればよいか” の SSOT 不在

📊 問題の本質

VM Backend の Box 解決が「2層 + 特例」に見える(問題の根源)

┌─ BoxFactoryRegistry (src/runtime/box_registry.rs)
│  └─ Plugin-First 設計、グローバルレジストリ
│
├─ UnifiedBoxRegistry (src/box_factory/mod.rs) + global accessor (src/runtime/unified_registry.rs)
│  └─ MIR `NewBox`VMの入口
│
└─ VM fast path (NYASH_VM_FAST=1 + StringBox)
   └─ ベンチ/プロファイル用の最適化(入口で分岐するため観測なしだと混乱しやすい)

問題:

  • どのレジストリが「正」なのか不明
  • 登録順序・優先度の規約がない
  • VM と LLVM で Box 解決方法が異なる

LLVM Backend の成功事例(参考モデル)

Phase 133 で既に 完全な SSOT 化 を達成:

# ConsoleLlvmBridge (src/llvm_py/console_bridge.py)
CONSOLE_METHODS = {
    "log": "nyash.console.log",
    "println": "nyash.console.log",  # Phase 122: エイリアス統一
    "warn": "nyash.console.warn",
    "error": "nyash.console.error",
    "clear": "nyash.console.clear",
}

成果:

  • TypeRegistry との ABI 完全一致slot 400-403
  • Phase 122 のエイリアス統一を継承
  • 7/7 テスト全て PASS

💡 推奨アクション

優先度 1: 入口SSOTの所在確認VM NewBox

# 主要入口の所在この3箇所を見る
rg "get_global_unified_registry\\(|struct UnifiedBoxRegistry|struct BoxFactoryRegistry" src/ --type rust

次の判断:

  • UnifiedBoxRegistry を “入口SSOT” として明文化し、BoxFactoryRegistry は plugin provider mapping として位置付ける
  • その上で CoreBoxId / CoreServices との接続Fail-Fast の境界)を設計する

優先度 2: CoreBoxId との統合

// CoreBoxId に基づく必須 Box 検証
pub fn validate_core_boxes(&self, profile: &RuntimeProfile) -> Result<(), String> {
    let missing: Vec<_> = CoreBoxId::iter()
        .filter(|id| id.is_required_in(profile))
        .filter(|id| !self.has_core_box(*id))
        .collect();

    if !missing.is_empty() {
        return Err(format!("Missing core_required boxes: {:?}", missing));
    }
    Ok(())
}

優先度 3: Fail-Fast 原則の徹底

// ❌ 悪い例:フォールバック
if let Err(_) = create_plugin_box() {
    create_builtin_box()  // 隠蔽される!
}

// ✅ 良い例:即座に失敗
create_plugin_box()
    .map_err(|e| format!("ConsoleBox plugin failed: {:?}", e))?

🔍 未解決の疑問Phase 131-3 で調査)

  1. UnifiedBoxRegistry ↔ BoxFactoryRegistry の責務境界

    • “plugin provider mapping” を BoxFactoryRegistry に閉じ込めるなら、どこまで公開するか(例: box_types 一覧)
    • NYASH_BOX_FACTORY_POLICY と plugin_config の関係を SSOT 化する場所
  2. Provider Lock の役割

    • provider_lock::guard_before_new_box() の目的
    • 「既定は挙動不変」の意味
  3. CoreServices の実装者

    • ConsoleService trait を誰が実装しているか
    • Box 呼び出しが trait を経由するか

📋 関連ドキュメント

⏱️ 次のステップPhase 131-3

タスク概要

  1. SSOT 設計決定1時間
  2. 実装2-3時間
  3. テスト追加1時間

合計見積もり: 4-6時間

完成条件

  • UnifiedBoxRegistry / BoxFactoryRegistry の責務境界を SSOT として固定
  • CoreBoxId に基づく必須 Box 検証実装
  • プラグイン vs ビルトイン優先順位の明確化
  • 起動時の core_required Box 検証テスト追加
  • VM/LLVM 両方で ConsoleBox 生成成功確認

Status: Investigation Complete Next Phase: 131-3 (SSOT Implementation) Owner: ChatGPT + Claude 協働