docs(phase151): ConsoleBox Selfhost Support(指示書作成)

- 目標: Selfhost Stage-3 パイプラインで ConsoleBox を利用可能に
- 影響ケース: esc_dirname_smoke.hako, string_ops_basic.hako(2本)
- タスク: 現状分析 → 修正実装 → テスト確認 → ドキュメント更新
- 工数: 2-3 時間(優先度: 高)

根本原因: selfhost JSON v0 生成時に ConsoleBox が登録されていない
修正対象: src/runner/modes/ または Ring0Registry 周辺(Task 1で特定)

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-04 12:57:46 +09:00
parent bf81488c67
commit 62808f9585

View File

@ -0,0 +1,196 @@
# Phase 151: ConsoleBox Selfhost Support
## 🎯 ゴール
**Selfhost Stage-3 パイプラインで ConsoleBox を利用可能にする**
目的:
- selfhost 経由で実行時に `NewBox ConsoleBox` を認識できるようにする
- 以下の 2 つのテストケースを selfhost depth-1 で動かせるようにする:
- `apps/tests/esc_dirname_smoke.hako` - 文字列処理 + consoleprint
- `apps/tests/string_ops_basic.hako` - StringBox 操作 + consoleprint
- 通常の Rust VM と同じ感覚で ConsoleBox が使える状態を実現
## 📋 スコープ(やること・やらないこと)
### ✅ やること
- ConsoleBox が selfhost JSON v0 生成時に含まれるようにする
- Ring0Registry またはその上流で ConsoleBox 登録の確保
- 2 つの失敗ケースesc_dirname_smoke, string_ops_basicが selfhost で動くことを検証
- テスト実行確認
### ❌ やらないこと
- ConsoleBox 自体の仕様・実装変更
- 他の Box 処理への影響
---
## 🏗️ 実装タスク
### Task 1: 現状分析 - ConsoleBox が selfhost で失われる経路を特定
**調査対象**:
1. **通常経路での ConsoleBox 登録**:
- `src/runtime/ring0/` で Ring0Registry にどう登録されているか確認
- ConsoleBox が builtin Box として登録されている場所を特定
2. **Selfhost 経路での ConsoleBox 喪失**:
- Stage-B/Stage-1/Stage-3 のどこで ConsoleBox が失われるか
- JSON v0 生成時に ConsoleBox が除外されている箇所を特定
- 参考ファイル:
- `src/runner/modes/` - Stage 実行経路
- `src/runner/` - Pipeline 全体
- selfhost 関連ドキュメント:`selfhost_stage3_expected_flow.md`
3. **エラーメッセージの意味**:
```
[ERROR] ❌ [rust-vm] VM error: Invalid instruction: NewBox ConsoleBox:
invalid operation: Unknown Box type: ConsoleBox. Available: Main
```
- "Available: Main" → ConsoleBox が RegisteredBox リストから消えている
- どこかで ConsoleBox が register されていない
**成果物**:
- Task 1 実施後、修正箇所を 3 つ程度に絞り込む
---
### Task 2: ConsoleBox を selfhost JSON v0 に含める修正
**修正方針**:
通常の Rust VM では ConsoleBox は以下のように登録されている:
```rust
// 例: src/runtime/ring0/registry.rs または類似箇所
registry.register_builtin_box("ConsoleBox", /* ... */);
```
selfhost 経由では JSON v0 生成時にこの登録情報が失われている可能性が高い。
**想定される修正箇所**Task 1 の調査結果に基づいて特定):
1. **Stage-B/Stage-1 での ConsoleBox 追加**:
- selfhost パイプラインでコンパイラが生成する JSON v0 に ConsoleBox を含める
- 参考: `src/runner/modes/stage_b.rs` または selfhost 関連 builder
2. **Ring0 RegisteredBox 統一化**:
- 通常経路と selfhost 経路で Ring0Registry が一致するようにする
- ConsoleBox が常に登録されるようにする
3. **JSON v0 Emitter での ConsoleBox 明示**:
- JSON v0 出力時に ConsoleBox を explicitly include する場所を特定・修正
**修正例(参考)**:
```rust
// src/runner/modes/ などで selfhost パイプライン実行時に
// ConsoleBox を RegisteredBox に add する
fn create_selfhost_context() -> Ring0Context {
let mut context = Ring0Context::new();
// ConsoleBox を追加
context.register_box("ConsoleBox", /* ... */);
context
}
```
---
### Task 3: テスト実行・確認
**テスト対象の 2 つのケース**:
1. **esc_dirname_smoke.hako**:
```bash
NYASH_FEATURES=stage3 NYASH_USE_NY_COMPILER=1 NYASH_JOINIR_STRICT=1 \
./target/release/hakorune apps/tests/esc_dirname_smoke.hako
```
期待値: `esc_dirname` の結果を consoleprint で出力して成功
2. **string_ops_basic.hako**:
```bash
NYASH_FEATURES=stage3 NYASH_USE_NY_COMPILER=1 NYASH_JOINIR_STRICT=1 \
./target/release/hakorune apps/tests/string_ops_basic.hako
```
期待値: StringBox 操作結果を consoleprint で出力して成功
**成功条件**:
- エラー `Unknown Box type: ConsoleBox` が消える
- 両ケースが正常に実行されて結果を出力する
---
### Task 4: ドキュメント・CURRENT_TASK 更新
1. **Phase 151 実施結果を記録**:
- Task 1 での修正箇所特定結果
- Task 2 での修正内容と修正ファイル
- Task 3 のテスト結果2 本ともパス確認)
2. **CURRENT_TASK.md に Phase 151 完了エントリ追加**:
```markdown
### Phase 151: ConsoleBox Selfhost Support ✅
**完了内容**:
- Selfhost Stage-3 パイプラインに ConsoleBox 登録を追加
- Ring0 Registry の統一化(通常経路と selfhost 経路)
- 2 つのテストケースesc_dirname_smoke, string_ops_basicが selfhost で動作
**修正ファイル**:
- src/runner/modes/ または関連モジュール
- Ring0 Registry 周辺
**テスト結果**: 2/2 PASSesc_dirname_smoke, string_ops_basic
**次フェーズ**: Phase 152-A - 括弧内代入式パーサー対応
```
3. **git commit で記録**
---
## ✅ 完成チェックリストPhase 151
- [ ] Task 1: ConsoleBox 喪失経路を特定(修正箇所を 3 つ程度に絞る)
- [ ] Task 2: ConsoleBox を selfhost JSON v0 に含める修正
- [ ] 修正ファイル特定・実装
- [ ] ビルド成功確認
- [ ] Task 3: テスト実行・確認
- [ ] esc_dirname_smoke.hako が selfhost で動作
- [ ] string_ops_basic.hako が selfhost で動作
- [ ] Task 4: ドキュメント・CURRENT_TASK 更新
- [ ] Phase 151 実施結果を記録
- [ ] git commit で記録
---
## 所要時間
**2-3 時間程度**
- Task 1現状分析: 45分
- Task 2修正実装: 1時間
- Task 3テスト確認: 30分
- Task 4ドキュメント: 30分
---
## 次のステップ
**Phase 152-A: 括弧内代入式Stage-3 パーサー拡張)**
- Unexpected ASSIGN in `(x = x + 1)` エラー対応
- Stage-3 パーサーを拡張して括弧内での assignment expression を許容
**Phase 152-B: Static method テスト整理**
- `stage1_run_min.hako` を static box スタイルに書き換え
---
## 進捗
- ✅ Phase 130-134: LLVM Python バックエンド整理
- ✅ Phase 150: Selfhost Stage-3 Depth-1 ベースライン強化
- 🎯 Phase 151: ConsoleBox Selfhost Support**現在のフェーズ**
- 📋 Phase 152-A: 括弧内代入式パーサー対応(予定)
- 📋 Phase 152-B: Static method テスト整理(予定)