Commit Graph

262 Commits

Author SHA1 Message Date
8904135380 runner: centralize resolve env flags 2025-12-28 14:01:10 +09:00
bb92a538b4 runner: resolve repo root without NYASH_ROOT 2025-12-28 13:57:05 +09:00
5757eb740e runner: preserve UTF-8 in text-merge normalization 2025-12-28 13:51:44 +09:00
a0da22628e refactor(json_v1_bridge): split parsing helpers 2025-12-28 03:13:01 +09:00
0269fc2ed4 Reduce build warnings 2025-12-28 01:34:46 +09:00
7ab042ca91 refactor: split large modules into submodules 2025-12-27 21:43:37 +09:00
f654dd316d Reduce unused warnings in tests and helpers 2025-12-27 17:49:42 +09:00
0d6229d5a2 Stabilize joinir tests and env guards 2025-12-27 17:41:30 +09:00
ce2baa0d47 feat(llvm): Phase 285 P3 - KeepAlive/ReleaseStrong LLVM implementation
Phase 285 P3: LLVM One-Pass (VM/LLVM一気通貫の最小ゲート)

## 実装内容

### 1. LLVM Backend (Python)
- src/llvm_py/instructions/lifecycle.py: NEW
  - lower_keepalive(): no-op (DCE/liveness only)
  - lower_release_strong(): ny_release_strong() 呼び出し
- src/llvm_py/builders/instruction_lower.py:
  - KeepAlive/ReleaseStrong ディスパッチエントリ追加

### 2. Runtime (Rust)
- crates/nyash_kernel/src/lib.rs:
  - ny_release_strong(handle: i64): handles::drop() 呼び出し
  - Phase 287対応(変数上書きセマンティクス)

### 3. MIR JSON Serialization
- src/runner/mir_json_emit.rs:
  - KeepAlive/ReleaseStrong JSON emit 追加(両関数)
  - {"op":"keepalive","values":[...]}
  - {"op":"release_strong","values":[...]}

## テスト結果

 **phase285_p2_weak_upgrade_fail_llvm**: PASS (exit 1, weak_to_strong null)
⏸️ **phase285_p2_weak_upgrade_success_llvm**: SKIP (--version に features 表示なし)
⏸️ **phase284_p2_return_in_loop_llvm**: SKIP (同上)

## SKIP理由(--version feature表示問題)

テストスクリプトが `--version | grep "features.*llvm"` で環境チェックするが、
現在の --version は "nyash 1.0" のみ出力。LLVM feature有効でも SKIP される。

**対応方針**: Phase 285 P3 目的(KeepAlive/ReleaseStrong LLVM実装)達成。
--version feature表示は Phase 286以降で対応予定。

## 検証

- cargo build --release --features llvm: OK
- weak_upgrade_fail_llvm: PASS (VM/LLVM parity確認)
- quick gate: 154/154 PASS (退行なし)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-26 14:34:05 +09:00
46fbe12ce6 feat(repl): Phase 288.1 session persistence + auto-display
実装内容:
- AST Rewriter (~430行): 未宣言変数を __repl.get/set に変換
- ExternCall Bridge: VM で __repl.get/set ハンドラー実装
- Rc<RefCell<>> セッション共有: VM と REPL runner 間で永続化
- 式自動表示: pure expression の結果を自動出力
- _ 変数: 最後の表示値を保存(Void は除外)
- .reset 実装: セッション変数の完全クリア
- Fail-Fast: 未定義変数読み取りで明示的エラー + ヒント

変更ファイル (8ファイル, +592行):
- src/runner/repl/ast_rewriter.rs (NEW, +430行)
- src/runner/repl/repl_runner.rs (+84/-35行)
- src/backend/mir_interpreter/handlers/externals.rs (+54行)
- src/mir/builder/calls/build.rs (+41行)
- src/backend/mir_interpreter/mod.rs (+12行)
- src/runner/repl/repl_session.rs (+11/-9行)
- src/runner/repl/mod.rs (+2行)
- src/runner/mod.rs (+2/-1行)

REPL専用設計(src/mir/builder/calls/build.rs の特別扱い理由):
- __repl.get/set は REPL mode 専用の橋渡し機能
- try_build_repl_method_call() で早期検出・ExternCall 変換
- file mode では決して使用されない(VM で "outside REPL mode" エラー)
- 将来的にも file mode への影響ゼロを保証

検証済み:
- 変数永続化: x = 42; print(x) → 42 
- 式自動表示: 1 + 1 → 2 
- _ 変数: 10 * 2 → 20; _ → 20 
- Fail-Fast: 未定義エラー + ヒント 
- 回帰テスト: 154/154 PASS 

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-25 23:04:59 +09:00
e986e279b4 refactor(repl): Quiet Mode 方針整合 - REPL 専用フラグに統一
方針整合修正(commit 1cec724ce の改善):
- NYASH_QUIET_INTERNAL_LOGS 撤去(環境変数スパロー防止)
- src/runner/repl/repl_runner.rs: quiet_internal_logs フラグ追加、環境変数操作削除
- src/mir/mod.rs: set_quiet_internal_logs() 公開 API 追加
- src/mir/builder/compilation_context.rs: quiet_internal_logs フラグ追加
- src/mir/builder/decls.rs: 環境変数直読み → context フラグ参照

アーキテクチャ:
   REPL 専用フラグで制御(file mode 無影響保証)
   ReplRunnerBox → MirCompiler → CompilationContext の明確な伝播経路
   crate::config::env::cli_verbose() 既存 SSOT を活用

ルール遵守:
   環境変数スパロー防止ポリシー(AGENTS.md 5.3)
   隠しトグル禁止(新規環境変数なし)
   既存の verbose 制御(NYASH_CLI_VERBOSE)に統一

機能保持:
   REPL 通常モード: 内部ログ抑制(clean output)
   REPL verbose モード: デバッグログ表示(--verbose)
   File mode 既定挙動: 不変(quiet_internal_logs 常に false)

Test results:
   REPL quiet/verbose 動作確認
   File mode regression: 154/154 pass(既定挙動不変)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-25 14:42:16 +09:00
1cec724ce0 feat(repl): REPL Quiet Mode - デバッグログ自動抑制
REPL mode では内部デバッグログを自動抑制:
- src/runner/repl/repl_runner.rs: NYASH_QUIET_INTERNAL_LOGS 設定/解除
- src/mir/builder/decls.rs: NYASH_QUIET_INTERNAL_LOGS チェック追加
- NYASH_CLI_VERBOSE=1 でデバッグログ有効化可能

UX improvement:
  Before: >>> print("Hello")
          [build_static_main_box] Storing fn_body_ast...
          Hello

  After:  >>> print("Hello")
          Hello

Test results:
   通常モード: ログ抑制
   デバッグモード (NYASH_CLI_VERBOSE=1): ログ表示
   File mode regression: 154/154 pass

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-25 14:26:42 +09:00
3445ef7a7d refactor(repl): Phase 288 Box化 - REPL Runner モジュール分離
箱理論モジュール化(Box-First):
- src/runner/repl/ 新規モジュール作成
- ReplRunnerBox: REPL実行器の完全隔離
- ReplSessionBox: mir/builder → runner/repl へ移動

File changes:
- src/runner/mod.rs: -118行(REPL コード削除)
- src/runner/repl/mod.rs: +22行(公開API)
- src/runner/repl/repl_runner.rs: +143行(ReplRunnerBox実装)
- src/runner/repl/repl_session.rs: moved from mir/builder/

Benefits:
- runner/mod.rs が綺麗(REPL 関連削除)
- REPL 機能が完全隔離(file mode への影響ゼロ保証)
- テスト容易性向上(Box 単体テスト可能)

Test results:
   REPL 動作確認(print/.reset/.exit)
   File mode regression: 154/154 pass

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-25 14:06:22 +09:00
79608bce64 feat(repl): Phase 288 P3 - Minimal UX (print() displays, .reset works)
UX improvements:
- print() output displays correctly (Main box entry point fix)
- .reset command clears session state
- _ variable stores last VMValue (ready for access)
- Statements execute silently (no auto-display)

Complete REPL workflow verified:
  >>> .help
  Commands:
    .exit / .quit - Exit REPL
    .reset - Clear session
    .help - Show this help
  >>> print("Hello REPL!")
  Hello REPL!
  >>> print(42 + 1)
  43
  >>> x = 42
  >>>                    # Silent (implicit local creation)
  >>> .reset
  Session reset

Key fix:
- Changed wrapper from "__Repl" to "Main" for VM entry point
- VM execute_module() looks for Main.main/0, not __Repl.main/0

Files modified:
- src/runner/mod.rs: Main box wrapper (+3 lines), .reset impl (+7 lines)

Test results:
   print() displays output
   .reset clears session
   .help shows commands
   Statements silent (no auto-display)
   File mode regression: 154/154 tests pass

Deferred to Phase 288.1+:
- Expression auto-display (1+1 → 2)
- Variable persistence across lines
- _ variable access in user code

Phase 288 P0-P3 COMPLETE 

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-25 13:47:54 +09:00
934a774b50 feat(repl): Phase 288 P2 - Implicit local binding (VMValue persistence)
Box-First architecture:
- ReplSessionBox: VMValue-based session state (not ValueId)
- repl_mode flag: File/REPL mode isolation
- MirCompiler.set_repl_mode(): Public API for REPL

Files modified:
- src/mir/builder/repl_session.rs: NEW (+55 lines) - Session state
- src/mir/builder.rs: repl_mode field (+4 lines)
- src/mir/mod.rs: set_repl_mode() method (+4 lines)
- src/mir/builder/vars/assignment_resolver.rs: REPL skip (+3 lines)
- src/runner/mod.rs: repl_session + eval implementation (+45 lines)

REPL behavior:
- x = 1: Implicit local creation (暗黙 local)
- Compilation + execution pipeline complete
- Variable persistence: TODO for P3 (as planned)

Test results:
   x = 1 compiles and executes
   File mode regression: 154/154 tests pass

File mode unchanged (assignment_resolver.rs: minimal 3-line check).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-25 13:38:04 +09:00
8941e3bb03 feat(repl): Phase 288 P1 - Add CLI entry point
Added --repl / -i flag:
- src/cli/args.rs: clap flag definition (+5 lines)
- src/cli/mod.rs: CliConfig.repl field (+3 lines)
- src/runner/mod.rs: run_repl() loop + stub eval (+71 lines)

Minimal REPL: .help / .exit work, eval stub for P2.

Test results:
   hakorune --repl starts REPL
   .help / .exit / .reset commands work
   File mode regression: 154/154 tests pass

File mode unchanged (0 regressions).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-25 13:28:41 +09:00
c117a04035 fix(rewrite): toString normalization to BoxCall(slot #0) - Phase 287 P4
Root cause: toString/stringify/str were being rewritten to Global/Method calls
with class inference, causing Main.toString/0 to be called for primitives.

Fix (Box-First + Legacy Deletion):
1.  MIR Builder - toString normalization (special.rs)
   - ALWAYS emit BoxCall with method_id=0 for toString/stringify/str
   - Do NOT rewrite to Global(Class.str/0) or Method calls
   - DELETED 70+ lines of complex class inference logic
   - Primitive guard with method name filter (known.rs)

2.  JSON Serializer - method_id output (mir_json_emit.rs)
   - Include method_id field in BoxCall JSON for LLVM

3.  LLVM Backend - universal slot #0 support
   - Extract method_id from JSON (instruction_lower.py)
   - Box primitives via nyash.box.from_i64 (boxcall.py)
   - Invoke toString via plugin system with method_id=0
   - ⚠️ TODO: Add nyash.integer.tostring_h to kernel

Test Results:
 VM: local x = 1; print(x.toString()) → "1" (PASS)
 VM: array_length test (boxed Integer) → PASS
⚠️ LLVM: Compiles successfully, needs kernel function

SSOT: slot_registry - toString is ALWAYS universal slot #0

Legacy Deleted:
- special.rs: Complex class inference rewrite (~70 lines)
- special.rs: Unique suffix fallback for toString
- special.rs: Main box special handling

Files changed:
- src/mir/builder/rewrite/special.rs (try_early_str_like_to_dst)
- src/mir/builder/rewrite/known.rs (primitive guards x4)
- src/runner/mir_json_emit.rs (method_id serialization x2)
- src/llvm_py/builders/instruction_lower.py (method_id extraction)
- src/llvm_py/instructions/boxcall.py (slot #0 handler)
- docs/reference/language/quick-reference.md (toString SSOT)

🎊 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-25 11:38:05 +09:00
f740e6542f feat(phase285): Complete weak reference implementation (VM + LLVM harness)
Phase 285LLVM-1.1 to 1.4 + weak reference infrastructure:

**LLVM Harness** (Phase 285LLVM-1.x):
- 285LLVM-1.1: User Box registration & debug output
- 285LLVM-1.2: WeakRef basic operations (identity deferred)
- 285LLVM-1.3: InstanceBox field access (getField/setField)
- 285LLVM-1.4: print Handle resolution (type tag propagation)

**VM Runtime** (nyash_kernel):
- FFI functions: nyrt_weak_new, nyrt_weak_to_strong, nyrt_weak_drop
  (crates/nyash_kernel/src/lib.rs: +209 lines)
- WeakRef plugin invoke support
  (crates/nyash_kernel/src/plugin/invoke.rs: +250 lines)
- weak_handles.rs: WeakRef handle registry (NEW)

**LLVM Python Backend**:
- WeakRef instruction lowering (weak.py: NEW)
- Entry point integration (entry.py: +93 lines)
- Instruction lowering (instruction_lower.py: +13 lines)
- LLVM harness runner script (tools/run_llvm_harness.sh: NEW)

**MIR & Runtime**:
- WeakRef emission & validation
- MIR JSON export for weak instructions
- Environment variable support (NYASH_WEAK_*, HAKO_WEAK_*)

**Documentation**:
- CLAUDE.md: Phase 285 completion notes
- LANGUAGE_REFERENCE_2025.md: Weak reference syntax
- 10-Now.md & 30-Backlog.md: Phase 285 status updates

Total: +864 lines, 24 files changed

SSOT: docs/reference/language/lifecycle.md
Related: Phase 285W-Syntax-0, Phase 285W-Syntax-0.1
2025-12-25 00:11:34 +09:00
3aba574723 refactor(llvm): Phase 286B - Unify error handling with Result<T, LlvmRunError>
This refactoring consolidates 20+ duplicated error handling patterns in LLVM mode
into a unified Result-based error handling system.

New files:
- error.rs: LlvmRunError type with code, msg, and convenience constructors
- report.rs: emit_error_and_exit() - single exit point for all LLVM errors

Changes:
- harness_executor.rs: Returns Result<i32, LlvmRunError> instead of Option<i32>
- pyvm_executor.rs: Returns Result<i32, LlvmRunError> instead of Option<i32>
- fallback_executor.rs: Returns Result<i32, LlvmRunError> instead of i32
- mod.rs: Updated all error handling to use report::emit_error_and_exit()

Benefits:
1. Unified error handling with Result<T, LlvmRunError>
2. Clear separation: Executors return errors, orchestrator handles exit
3. Single exit point guarantees leak report consistency
4. Reduced code duplication (20+ patterns consolidated)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-24 11:10:57 +09:00
13545fd57e refactor(llvm): Phase 286 - Modularize llvm.rs into 10 boxes
Following Phase 33 success pattern:
- Single responsibility per box
- Testability through isolated boxes
- Reusability across backends

Before: 449 lines monolithic function
After: 229 line orchestrator + 10 focused boxes

Boxes created:
- plugin_init.rs (plugin initialization)
- using_resolver.rs (using/prelude handling)
- mir_compiler.rs (AST → MIR compilation)
- method_id_injector.rs (method_id injection)
- joinir_experiment.rs (JoinIR experiment, feature-gated)
- pyvm_executor.rs (PyVM harness, dev/test)
- object_emitter.rs (LLVM object emit)
- harness_executor.rs (LLVM harness execution)
- exit_reporter.rs (leak report, Phase 285LLVM-0)
- fallback_executor.rs (mock/legacy execution)

Test Results:
-  cargo build --release
-  cargo build --release --features llvm
-  18 VM/LLVM parity tests PASS
-  No regressions

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-24 10:45:17 +09:00
af99ccab91 feat(llvm): Phase 285LLVM-0 - LLVM Conformance One-Pass
Step 0: SSOT/Reality Alignment
- Update Feature Matrix (lifecycle.md):
  - WeakRef: "285A1" → "285LLVM-1"
  - Leak Report: "partial" → "Parent process roots only (285LLVM-0)"
  - Add detailed LLVM limitation explanation
- Update SKIP reason (phase285_weak_basic_llvm.sh): "285A1" → "285LLVM-1"

Step 1: LLVM Leak Report Implementation
- Add emit_leak_report() calls to llvm.rs (success + error paths)
- Create phase285_leak_report_llvm.sh smoke test (3 test cases PASS)
- Add NYASH_LEAK_LOG documentation to environment-variables.md
- Manual test: All 3 cases PASS (no-log, LEVEL=1, LEVEL=2)
- Smoke test: 3/3 PASS

Step 2: WeakRef Design Preparation
- Create phase-285llvm-1-design.md
  - Runtime representation candidate (Option B with caveat)
  - FFI signatures definition
  - Implementation checklist
  - Test strategy
  - NO CODE IMPLEMENTATION (design-only phase)

Implementation:
- Minimal 10-20 line code change (as planned)
- Reuses existing leak_tracker.rs infrastructure
- LLVM limitation transparently documented
- Exit codes unchanged (0/1 preserved)
- Fixture SSOT: apps/tests/*.hako shared between VM/LLVM

Test Results:
-  Manual test: 3/3 cases PASS
-  Smoke test: 3/3 cases PASS
-  No regressions

Files Changed:
- src/runner/modes/llvm.rs (2 emit_leak_report() calls)
- docs/reference/language/lifecycle.md (Feature Matrix + LLVM limitation)
- docs/reference/environment-variables.md (NYASH_LEAK_LOG entry)
- tools/smokes/v2/profiles/quick/lifecycle/phase285_weak_basic_llvm.sh (SKIP reason)

Files Added:
- tools/smokes/v2/profiles/quick/lifecycle/phase285_leak_report_llvm.sh
- docs/development/current/main/phases/phase-285/phase-285llvm-1-design.md

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-24 09:58:00 +09:00
ab76e39036 feat(parser): Phase 285A1.4 & A1.5 - Weak field sugar + Parser hang fix
A1.4: Add sugar syntax `public weak parent` ≡ `public { weak parent }`
A1.5: Fix parser hang on unsupported `param: Type` syntax

Key changes:
- A1.4: Extend visibility parser to handle weak modifier (fields.rs)
- A1.5: Shared helper `parse_param_name_list()` with progress-zero detection
- A1.5: Fix 6 vulnerable parameter parsing loops (methods, constructors, functions)
- Tests: Sugar syntax (OK/NG), parser hang (timeout-based)
- Docs: lifecycle.md, EBNF.md, phase-285a1-boxification.md

Additional changes:
- weak() builtin implementation (handlers/weak.rs)
- Leak tracking improvements (leak_tracker.rs)
- Documentation updates (lifecycle, types, memory-finalization, etc.)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-24 07:44:50 +09:00
960241795d feat(mir/llvm): Phase 273 P0-P1 DomainPlan→CorePlan + LLVM arg fix
Phase 273 P0-P1: Two-layer plan architecture
- DomainPlan: Pattern-specific knowledge (ScanWithInit)
- CorePlan: Fixed vocabulary (Seq, Loop, If, Effect, Exit)
- ValueId references only (String expressions forbidden)
- Pipeline: Extractor→Normalizer→Verifier→Lowerer

New plan/ module:
- mod.rs: Type definitions, SSOT spec
- normalizer.rs: DomainPlan→CorePlan + ID allocation
- verifier.rs: V1-V6 invariant checks (fail-fast)
- lowerer.rs: CorePlan→MIR (pattern-agnostic)

LLVM fix (ChatGPT):
- function_lower.py: Fix argument reference bug
- Phase 258 index_of_string now PASS on LLVM backend

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-22 22:42:56 +09:00
60cffb1948 feat(phase275-p0): Float型PHI完全対応 - MIR型伝播→LLVM IR生成
Phase 275 P0: Float型PHIノードの完全実装

【問題】
- PHI v36 が i64 型で生成されるが、incoming value v12 が f64 型
- LLVM IR parsing error: 型不一致により実行失敗

【解決】
1. MIR型伝播順序修正 (lifecycle.rs)
   - BinOp repropagation → PHI resolution に変更
   - Int+Float → Float promotion を PHI推論前に実行

2. MIR JSON Float型出力 (mir_json_emit.rs)
   - PHI dst_type に Float case 追加(2箇所)

3. LLVM PHI型対応 (wiring.py, tagging.py, llvm_builder.py)
   - ensure_phi に dst_type パラメータ追加
   - f64 の場合 ir.DoubleType() PHI 生成
   - 型互換性チェック付き predeclared PHI 再利用

4. LLVM Float演算対応
   - compare.py: ensure_double helper (Float unboxing for fcmp)
   - binop.py: Int+Float → sitofp→fadd (unboxed double)

【検証】
- LLVM IR: phi double [%"float_int_add", %"bb0"] 
- VM/LLVM parity: exit=3 
- PHI duplicate 解消: 型チェックで再利用 

【影響範囲】
- Rust MIR builder: 3ファイル (型伝播ロジック)
- LLVM harness: 5ファイル (PHI型対応)
- Kernel: 1ファイル (box_from_f64 helper - 予備)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-22 13:31:53 +09:00
1fe5be347d refactor(mir): phase260 p0.1 strangler hardening + smoke fixtures 2025-12-21 05:47:37 +09:00
4dfe3349bf refactor(mir): phase260 p0 edge-args plumbing (strangler) + ssot api + docs 2025-12-21 04:34:22 +09:00
e404746612 refactor(mir): Phase 139-P3-B - RoutingDecision を enum 対応 + レガシー削除
- RoutingDecision の missing_caps を Vec<CapabilityTag> に変更(型安全化)
- error_tags は to_tag() メソッドで自動生成
- 全 callsite を enum variant に修正
- capability_tags モジュール(文字列定数群)を完全削除
- 全テスト PASS(型安全性向上を確認)
- フォーマット適用
2025-12-16 07:02:14 +09:00
e8e4779942 feat(plugin): Phase 134 P1 - Core box strict guard (SSOT in plugin_guard.rs) 2025-12-15 17:49:08 +09:00
a955dd6b18 feat(llvm): Phase 131-15 - print/concat segfault 根治修正
## P1-1/P1-2: TypeFacts 優先化
- binop.py: operand facts が dst_type ヒントより優先
- mir_json_emit.rs: Unknown 時に dst_type を出さない
- function_lower.py: value_types を metadata から読み込み

## P2: handle concat 統一(根治)
- print シグネチャ修正: i64(i64) → void(i8*)
- Mixed concat を handle ベースに統一:
  - concat_si/concat_is → concat_hh
  - box.from_i64 で integer を handle 化
  - Everything is Box 哲学に統一
- legacy 関数は互換性のために保持

## 結果
-  print("Result: " + 3) → Result: 3
-  segfault 解消
-  Everything is Box 統一

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-15 01:36:34 +09:00
7f57a1bb05 feat(llvm): Phase 131-13/14 - MIR JSON順序修正 & 2パスsnapshot解決
## Phase 131-13: MIR JSON 命令順序修正
- copy 遅延ロジック削除(~80行)
- MIR の def→use 順序をそのまま出力(SSOT)
- PHI 先頭集約のみ維持

## Phase 131-14: jump-only block 2パス snapshot 解決
- Pass A: jump-only block はメタ記録のみ
- Pass B: resolve_jump_only_snapshots() で CFG ベース解決
- path compression で連鎖を効率的に解決
- サイクル検出で Fail-Fast

## 結果
-  STRICT モードでエラーなし
-  bb7 が bb5 の snapshot を正しく継承
-  ループが正しく動作(1, 2 出力確認)
- ⚠️ print/concat で segfault(別問題、次Phase)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 00:39:43 +09:00
413504d6de feat(mir): Phase 131-11-F - MIR JSON metadata 出力実装
## 実装内容
- mir_json_emit.rs に function-level metadata 追加
- PHI 命令に dst_type ヒント追加
- v0/v1 両 emitter で実装

## 成果物
-  metadata.value_types を JSON に出力
-  PHI dst_type を metadata から取得
-  ビルド成功(0 エラー)

## JSON 出力例
```json
{
  "functions": [{
    "metadata": {
      "value_types": {
        "1": "i64",
        "3": "i64"
      }
    }
  }]
}
```

## 既知の問題(Phase 131-11-E 再調査必要)
- MIR dump で PHI が String 型のまま
- Phase 131-11-E の TypeFacts 分離が完全に動作していない可能性

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-14 19:34:02 +09:00
d3b3bf5372 feat(mir): Phase 131-11-E - TypeFacts/TypeDemands 分離(SSOT)
## 実装内容

### 1) Rust MIR Builder (ops.rs + lifecycle.rs)
- OperandTypeClass で型分類(String/Integer/Unknown)
- BinOp 型推論: Integer + Unknown → Integer
- lifecycle.rs に repropagate_binop_types() パス追加
  - PHI 型解決後に BinOp 型を再計算

### 2) JSON Emission (mir_json_emit.rs)
- 結果ベースの dst_type 発行に変更
- Integer → "i64", String → {kind: handle, box_type: StringBox}

### 3) Python LLVM Backend (binop.py)
- dst_type を確実な情報として使用
- dst_type != None なら優先して処理

## 結果
-  MIR: PHI/BinOp が Integer として正しく型付け
-  VM: `Result: 3` (正しい出力)
-  JSON: `dst_type: "i64"` を発行
-  LLVM: 別の codegen 問題の可能性あり

## SSOT 設計達成
- TypeFacts(事実): 定義命令から推論
- TypeDemands(要求): 使用箇所の coercion で吸収
- 後方伝播なし: Fail-Fast に統一

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-14 18:55:05 +09:00
4b87b6cc88 docs: ドキュメント配置ルール(SSOT)確立
## 追加内容
- CLAUDE.md にドキュメント配置ルール(SSOT)セクション追加
- DOCS_LAYOUT.md (SSOT): 置き場所ルール定義
- phases/README.md: Phase ドキュメント説明
- design/README.md: 設計図ドキュメント説明
- investigations/README.md: 調査ログ説明

## ルール概要
1. **Phase 文書** → phases/phase-<N>/
2. **設計図** → design/
3. **調査ログ** → investigations/ (結論を 10-Now/20-Decisions に反映)

## 導線
- CLAUDE.md で概要説明
- DOCS_LAYOUT.md で詳細定義(SSOT)
- 各フォルダ README で参照方法

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-14 18:27:24 +09:00
22753f8cc3 fix(llvm): Phase 131-7 - Multi-pass vmap sync 修正(Branch bug 解消)
Phase 131-7: Multi-pass block lowering の vmap sync バグ修正

問題:
- Pass A (body instructions) が vmap_cur に値を保存
- Pass C (deferred terminators) が builder.vmap を参照
- → Pass A の値が Pass C に届かない
- → Branch condition が 0 に fallback → 無限ループ

修正:
- src/llvm_py/builders/block_lower.py (lines 237-248):
  - PHI-only フィルタを削除
  - 全ての値を global vmap に sync

変更ファイル:
- src/llvm_py/builders/block_lower.py: vmap sync 修正
- src/llvm_py/instructions/controlflow/branch.py: trace logging 追加
- src/llvm_py/instructions/unop.py: trace logging 追加
- src/llvm_py/llvm_builder.py: debug helpers 追加
- src/llvm_py/phi_wiring/wiring.py: trace logging 追加
- src/runner/modes/common_util/exec.rs: Python stdout 転送

結果:
-  Branch bug 修正: ループが正しく終了
-  出力: 無限ループ → 3回で停止
-  新 bug 発見: ExternCall が null を受け取る(PHI 値の代わりに)

Next: Phase 131-8 (ExternCall argument handling 修正)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 07:38:21 +09:00
af6f95cd4b Phase 33 NORM canon test: enforce normalized dev route for P1/P2/JP mini 2025-12-11 20:54:33 +09:00
020fbc6740 refactor(phi_core): Phase 193 - Complete loopform modularization with 4-pass architecture
Phase 193: loopform_builder.rs modularization (1,166 → 102 lines, 91% reduction)

## Module Structure Created

```
src/mir/phi_core/loopform/
├── mod.rs                            (102 lines) - Public API coordinator
├── context.rs                        (148 lines) - ValueId management
├── variable_models.rs                (101 lines) - Variable types
├── utils.rs                          (112 lines) - Utilities
├── exit_phi.rs                       (96 lines) - Exit PHI builder
├── builder_core.rs                   (411 lines) - Core builder logic
├── passes/
│   ├── mod.rs                        (67 lines) - Pass coordinator
│   ├── pass1_discovery.rs            (156 lines) - Variable discovery
│   ├── pass2_preheader.rs            (70 lines) - Preheader copies
│   ├── pass3_header_phi.rs           (106 lines) - Header PHI construction
│   └── pass4_seal.rs                 (276 lines) - PHI completion
```

## 4-Pass Architecture Explicit

### Pass 1: Variable Discovery (pass1_discovery.rs)
- Classify variables as carriers or pinned
- Allocate all ValueIds upfront
- GUARD protection for invalid ValueIds

### Pass 2: Preheader Copy (pass2_preheader.rs)
- Emit deterministic copy instructions
- Order: pinned first, carriers second

### Pass 3: Header PHI Construction (pass3_header_phi.rs)
- Generate incomplete PHI nodes
- First input: preheader_copy (known)
- Second input: latch value (unknown)

### Pass 4: PHI Sealing (pass4_seal.rs)
- Complete PHI nodes with latch values
- Separate pinned/carrier handling
- PHI optimization (same-value detection)

## Size Comparison

Before:
- loopform_builder.rs: 1,166 lines (monolithic)
- loopform_passes.rs: 133 lines (documentation stub)
- Total: 1,299 lines in 2 files

After:
- 11 focused modules: 1,645 lines total
- Main file (mod.rs): 102 lines (91% reduction)
- Largest module: builder_core (411 lines)
- Average module size: 150 lines
- 4 pass modules: 608 lines (explicit structure)

## Success Criteria Met

 Directory structure created with 11 focused modules
 4-pass architecture explicit and clear
 cargo build --release succeeds
 Loop programs execute correctly
 Zero breaking changes (all APIs compatible)
 Module documentation comprehensive
 All visibility correct (pub/pub(crate) appropriate)

## Files Modified

- NEW: src/mir/phi_core/loopform/mod.rs (public API)
- NEW: src/mir/phi_core/loopform/builder_core.rs (core builder)
- NEW: src/mir/phi_core/loopform/passes/*.rs (4 pass modules)
- MOVED: loopform_*.rs → loopform/*.rs (5 files)
- DELETED: loopform_builder.rs, loopform_passes.rs
- UPDATED: phi_core/mod.rs (import structure)
- UPDATED: json_v0_bridge/lowering/loop_.rs (import path)

## Impact

- **Maintainability**: Each pass has clear responsibilities
- **Testability**: Individual passes can be tested independently
- **Documentation**: Comprehensive module and pass documentation
- **Modularity**: Clean separation of concerns
- **Readability**: No file exceeds 411 lines

Phase 1-3 modularization complete. Ready for new feature development.
2025-12-05 21:58:54 +09:00
397bc77eb3 refactor(vm): StaticBoxRegistry unifies static box management
箱化モジュール化: Phase 173-B の散在した static box 管理を一元化

Before (4箇所に散在):
- static_box_decls: HashMap (AST経由のBox宣言)
- static_boxes: HashMap (実行時シングルトン)
- vm.rs Phase 173-B手動検出コード (~60行)
- method.rs static_box_decls.contains_key() 直接参照

After (StaticBoxRegistry箱に統一):
- declarations: AST経由のBox宣言を登録
- detected_boxes: MIR関数名から自動検出 (using import対応)
- instances: 遅延作成シングルトン
- naming utilities: parse/format関数

Benefits:
- vm.rs: 63行削減 (Phase 173-B手動コード削除)
- 自動検出: using import した static box も対応
- 単一責務: static box lifecycle を1箱に集約
- Fail-Fast: 存在しないBoxへのアクセスは即エラー

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 18:56:23 +09:00
9d29718f03 fix(vm): Phase 173-B using-imported static box method calls
Enable static box method calls for boxes imported via `using` statement.

Root cause: 3 interrelated issues
1. Cross-function ValueId: methodize created singleton with ValueId that
   can't be used across MIR function boundaries
2. Missing registration: using-imported static boxes weren't in
   static_box_decls (only AST-based boxes were registered)
3. Wrong dispatch: method.rs tried InstanceBox dispatch instead of
   MIR function table lookup for static boxes

Fixes:
- unified_emitter.rs: Use receiver=None for StaticCompiler boxes
- vm.rs: Auto-detect and register static boxes from MIR function names
- mod.rs: Add has_static_box_decl() helper
- method.rs: Add MIR function table lookup path for static boxes
- guard.rs: Trust methodize for StaticCompiler boxes without type info

Test: JsonParserBox.toString() via using import now works correctly

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 18:49:10 +09:00
46922e5074 feat(hako_check): Phase 155 MIR CFG data bridge (MVP)
🌉 CFG データブリッジ MVP 完成!

🔗 実装内容:
- MIR JSON 出力時に CFG を自動抽出 (mir_json_emit.rs)
- Analysis IR に CFG フィールド追加 (analysis_consumer.hako)
- DeadBlockAnalyzerBox が ir.get("cfg") でアクセス可能

📊 技術詳細:
- extract_cfg_info() を MIR JSON 出力に統合
- v0/v1 両 JSON フォーマット対応
- CFG: functions[].blocks[]{id, successors, terminator, reachable}

⚠️ MVP 制限事項:
- CFG は MIR JSON に含まれるが、hako_check は未読み込み
- Analysis IR の CFG は空構造体(ブロック情報なし)
- HC020 は実行されるが検出結果 0 件(期待通り)

🎯 Phase 154 + 155 で HC020 基盤完成!

🔧 次のステップ (Phase 156 or 155.5):
- Option A: hako_check に MIR パイプライン統合
- Option B: extract_mir_cfg() builtin 関数実装
- 推奨: Option A (既存の hakorune_emit_mir.sh 活用)

📝 Modified files:
- src/runner/mir_json_emit.rs (+15 lines)
- tools/hako_check/analysis_consumer.hako (+7 lines)
- docs/development/current/main/phase155_mir_cfg_bridge.md (+130 lines)
- CURRENT_TASK.md (Phase 155 section added)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:23:43 +09:00
04f476d6b4 feat(phase112): Ring0 Service Registry統一化実装完了
Ring0 初期化を Ring0Registry::build(profile) に集約し、プロファイル対応を統一化

【実装内容】
- Task 2: Ring0Registry struct + build(profile) メソッド実装
  - RuntimeProfile::Default → StdFs を使用
  - RuntimeProfile::NoFs → NoFsApi を使用
  - build_default()/build_no_fs() の内部メソッド分離

- Task 3: NoFsApi struct 実装(FsApi trait)
  - すべてのファイルシステム操作を「disabled」として失敗させる
  - read/write/append/metadata/canonicalize が IoError を返す
  - exists() は false を返す
  - 49行の新規実装

- Task 4: initialize_runtime() SSOT パターン確認
  - env 読み込み → RuntimeProfile::from_env()
  - Ring0Context 構築 → Ring0Registry::build(profile)
  - グローバル登録 → init_global_ring0()
  - 唯一の責務分離を確立

- Task 5: PluginHost/FileBox/FileHandleBox からの Ring0 統合
  - Ring0.fs = NoFsApi の場合、すべての上位層が自動的に disabled
  - 特別なロジック不要(カスケード disabled パターン)

- Task 6: ドキュメント更新
  - core_boxes_design.md: Section 17 追加(88行)
  - ring0-inventory.md: Phase 112 エントリ追加(16行)
  - CURRENT_TASK.md: Phase 106-112 完了表更新
  - phase112_ring0_registry_design.md: 完全設計書(426行)

【統計】
- 8ファイル修正(+261行, -30行)
- 3つの新テスト追加(Ring0Registry関連)
  - test_ring0_registry_default_profile
  - test_ring0_registry_nofs_profile
  - test_default_ring0_uses_registry
- cargo build --release: SUCCESS
- 全テスト PASS

【設計原則確立】
- Ring0Registry factory pattern で profile-aware 実装選択を一本化
- NoFsApi による自動 disabled により、上位層の特別処理を排除
- initialize_runtime() が唯一の env 読み込み入口として SSOT 確立
- 将来の profile 追加(TestMock/Sandbox/ReadOnly/Embedded等)が容易に

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 22:19:24 +09:00
66479f921d feat(phase106): FileBox provider_lock整理 & Fail-Fast強化(案B統一版)
Task 1: CoreBoxId.category() 修正
- File を CoreRequired 側に移動(L126)
- テスト期待値修正(L371)
- Phase 106 intent コメント更新(L107-115)

Task 2: provider_lock API 確認
- 変更なし(既存の set/get API をそのまま使用)
- get_filebox_provider_strict() は追加しない(シンプルに保つ)

Task 3: FileBox SSOT コメント追加
- L5-7 に責務明示コメント追加

Task 4: PluginHost に FileBox provider チェック追加
- with_core_from_registry_optional() に Phase 106 チェック追加(L158-167)
- test_with_core_from_registry_filebox_required() 追加(L413-445)
- 既存テスト2件を FileBox provider 初期化対応(L301-321, L323-351)
- test_with_core_from_registry_missing_box() をエラーメッセージ拡張(L386-410)

Task 5: ドキュメント更新
- core_boxes_design.md に Phase 106 セクション追加(L248-265)
- 責務分離原則・Ring0.FsApi 延期を明記

完了条件:
 ビルド成功(cargo build --release)
 テスト全PASS(cargo test --lib runtime: 64 passed; 0 failed)
 指示書の実装チェックリスト全て completed
2025-12-03 17:55:26 +09:00
ea4c164dae refactor(runner): Phase 105.5 Console出力のmacro統一化
- Replace direct console.println() calls with console_println! macro
- Simplify error handling in vm.rs (RC output)
- Simplify success logging in selfhost.rs (PluginHost init)
- Remove redundant nested if-let structures for Option handling
- Macro already handles all fallback scenarios (eprintln!)

This reduces code duplication and improves consistency. The macro
centralizes the fallback logic, making it easier to maintain.

Files modified:
- src/runner/modes/vm.rs (simplified RC output)
- src/runner/selfhost.rs (simplified PluginHost init message)

Line reduction: ~13 lines (nested if-let structures removed)
2025-12-03 14:25:28 +09:00
6ecd8f7f52 feat(runtime): Phase 103 CoreServices Optional化 - Memory Constraints対応
- Add CoreServicesConfig struct (from_env, minimal, all_enabled)
- Implement with_core_from_registry_optional() for selective initialization
- Update CoreBoxesImpl fields to Option<Arc<dyn XyzService>>
- Maintain backward compatibility (with_core_from_registry calls all_enabled)
- Add NYASH_CORE_DISABLE_* environment variable support
- ConsoleBox remains mandatory (Graceful Degradation principle)
- Add unit tests for optional initialization
- Update console_println! macro to handle Option type
- Fix direct console.println() calls in vm.rs and selfhost.rs
- Create core_optional_design.md documentation

Note: Phase 104 will extend ConsoleService to be optional as well with
graceful fallback in console_println! macro.

Files modified:
- src/runtime/plugin_host.rs (CoreServicesConfig, with_core_from_registry_optional, tests)
- src/runtime/core_services.rs (CoreBoxesImpl fields → Option type)
- src/runtime/mod.rs (console_println! macro updated)
- src/runner/modes/vm.rs (handle Option console)
- src/runner/selfhost.rs (handle Option console)
- docs/development/current/main/core_optional_design.md (new)
- docs/development/current/main/ring0-inventory.md (Phase 103 entry)

Test results:
- Build:  Success (0 errors, 7 warnings)
- Unit tests:  3/3 passed (optional_core_tests)
- Runtime tests:  63/63 passed
- Smoke tests:  30/31 passed (1 pre-existing timeout)
2025-12-03 13:59:06 +09:00
0c527dcd22 feat(runtime): Phase 101-A dev-debug ログの Ring0.log 統一 - 34箇所完了
## Phase 101-A 完了項目
-  llvm.rs: 13箇所([joinir/llvm], [parse/context]) → Ring0.log
-  loop_form.rs: [loopform] 系ログ → Ring0.log
-  loopform_builder.rs: 16箇所([loopform/prepare], [loopform/seal_phis]) → Ring0.log
-  loop_snapshot_merge.rs: 5箇所([Option C]) → Ring0.log
-  全テストPASS(ビルド成功)

## 置き換え箇所(34箇所)

**llvm.rs**(13箇所):
- [joinir/llvm] JoinIR 実験パスログ(12箇所)
- [parse/context] プリロードファイルリスト(1箇所)

**loop_form.rs**(複数箇所):
- [loopform] 基本ログ
- [loopform/condition] 条件式処理
- [loopform/writes] 変数書き込み収集

**loopform_builder.rs**(16箇所):
- [loopform/prepare] 構造準備
- [loopform/seal_phis] PHI シーリング処理

**loop_snapshot_merge.rs**(5箇所):
- [Option C] Exit PHI 分類
- [Option C] 変数解析

## 技術的成果
- Ring0.log で dev-debug ログを一元管理
- stderr の cleanness 向上(ユーザー向けメッセージのみ)
- 環境に応じた出力制御が可能(NYASH_LOOPFORM_DEBUG等)
- Phase 99-100 で確立した 3層設計を実装レベルで完成

## 実装パターン
```rust
// Before
eprintln!("[loopform] variable_map: {:?}", map);

// After
crate::runtime::get_global_ring0().log.debug(&format!(
    "[loopform] variable_map: {:?}", map
));
```

## 統計
- Phase 98: 7箇所(ConsoleService)
- Phase 100: 29箇所(ConsoleService)
- Phase 101-A: 34箇所(Ring0.log)
- **合計**: 70箇所で統一(ConsoleService/Ring0.log)
- 残り: ~905箇所(test含む)

## ドキュメント更新
- logging_policy.md: Section 7-A 追加(Phase 101-A 実装記録)
- ring0-inventory.md: Category 2 更新(dev-debug 進捗反映)
- CURRENT_TASK.md: Phase 85 セクション追記

## Phase 85-101-A 総括
- Phase 95.5-97: CoreServices 6個完全実装(String/Integer/Bool/Array/Map/Console)
- Phase 98-98.5: ConsoleService 代表パス拡張(7箇所)
- Phase 99: ログ/出力ポリシー確定(3層設計文書化)
- Phase 100: user-facing 出力の ConsoleService 化(29箇所)
- Phase 101-A: dev-debug ログの Ring0.log 統一(34箇所) 

次: Phase 101-B(internal/test ログの整理、別検討)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 12:25:32 +09:00
7cf11fbc5c feat(runtime): Phase 100 user-facing 出力の ConsoleService 完全統一 - 29箇所完了
## Phase 100 完了項目
-  selfhost.rs: 6箇所 → console_println!
-  llvm.rs: 23箇所(主要メッセージ) → console_println!
-  全テストPASS(core_services: 11, plugin_host: 7)
-  ドキュメント更新完了

## 置き換え箇所(29箇所)

**selfhost.rs**(6箇所):
- Line 57: CoreInitError 出力
- Lines 194/363/418/519/570: Result 出力

**llvm.rs**(23箇所、ユーザー向けメッセージのみ):
- エラーメッセージ(): ファイル読み込み、using/parse エラー
- 成功メッセージ(📊): MIR コンパイル成功
- LLVM/harness 関連エラー
- 実行結果出力
- Mock LLVM メッセージ

## 意図的に除外(Phase 101 対象)
- llvm.rs の `[joinir/llvm]`, `[parse/context]` デバッグログ
- hack_check: .hako アプリ(Nyash言語の ConsoleBox 経由)
- bench.rs: テスト・性能表示(dev-debug)
- mir.rs: 内部 MIR ダンプ(dev-debug)

## 技術的成果
- selfhost/LLVM runner のユーザー向けメッセージを ConsoleService に統一
- Phase 99 で確立したログ/出力ポリシーを実装レベルで実現
- デバッグログとユーザー向け出力の明確な分離
- Graceful Degradation パターンの実用確認

## 統計
- Phase 98: 7箇所
- Phase 100: 29箇所
- **合計**: 36箇所で ConsoleService 経由に移行完了
- 残り user-facing: ~330箇所(Phase 101-102 で段階的拡張)

## ドキュメント更新
- logging_policy.md: Section 7 追加(Phase 100 実装完了記録)
- ring0-inventory.md: Category 1 更新(Phase 100 進捗反映)
- CURRENT_TASK.md: Phase 85 セクション追記

## Phase 85-100 総括
- Phase 95.5-97: CoreServices 6個完全実装(String/Integer/Bool/Array/Map/Console)
- Phase 98-98.5: ConsoleService 代表パス拡張(7箇所)
- Phase 99: ログ/出力ポリシー確定(3層設計文書化)
- Phase 100: user-facing 出力の ConsoleService 化(29箇所) 

次: Phase 101(dev-debug/test/internal 出力の整理、Ring0.log 活用)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 11:55:14 +09:00
44c6ca9585 chore(runtime): Phase 98.5 Arc 完全修飾パス簡略化 & コメント統一
## 修正内容
**src/runtime/mod.rs** (4箇所):
- use文: std::sync::OnceLock → std::sync::{Arc, OnceLock}
- Line 64: OnceLock<std::sync::Arc<...>> → OnceLock<Arc<...>>
- Line 68: std::sync::Arc::new(...) → Arc::new(...)
- Line 72/80: 戻り値型で std::sync::Arc → Arc に統一

**src/runner/modes/vm.rs** (1箇所):
- Line 589: コメント統一 "println" → "eprintln"(実装に合わせる)

## 効果
- 可読性向上: std::sync:: プレフィックス4箇所削除
- 一貫性向上: console_println! マクロの説明と実装を統一
- 追加依存なし、機能変更なし

## テスト結果
 cargo build --release: 成功
 cargo test --lib runtime::core_services: 11 passed

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 11:17:41 +09:00
7bcb7ec596 feat(runtime): Phase 98 ConsoleService 代表パス拡張 - 7箇所置き換え完了
## Phase 98 完了項目
-  println!/eprintln! 7箇所 → ConsoleService 経由に移行
-  console_println! マクロ追加(Graceful Degradation パターン)
-  try_get_core_plugin_host() 追加(安全なアクセサー)
-  全テストPASS(core_services: 11, plugin_host: 7)

## 置き換え箇所(7箇所)
**selfhost/child.rs** (3箇所):
- spawn失敗エラー
- タイムアウトメッセージ(stdout/stderr)

**core_bridge.rs** (2箇所):
- DUMP書き込みエラー
- DUMP_MUT書き込みエラー

**vm.rs** (1箇所):
- RC(return code)出力

**selfhost/json.rs** (2箇所, オプション達成):
- PyVM MIR JSON emit エラー
- PyVM 使用ログ(verbose時)

## 技術的成果
**Graceful Degradation パターン確立**:
- PluginHost 初期化前: eprintln! フォールバック
- PluginHost 初期化後: ConsoleService 使用(Ring0直結)
- Fail-Fast原則との整合性: 出力先選択のみ動的

**実装インフラ**:
- src/runtime/mod.rs: console_println! マクロ & try_get_core_plugin_host()
- 既存の get_core_plugin_host() は panic! 保持(Fail-Fast)

## 統計
- 置き換え完了: 7箇所(全体の約2%)
- 残り候補: 約359箇所(Phase 99以降)
- テスト: ビルド成功、全ユニットテストPASS

## ドキュメント
- docs/development/current/main/core_boxes_design.md: Section 15 追加(128行)
  - 実装パターン、設計判断、テスト結果を完全記録

## Phase 85-98 総括
- Phase 85-94: 構造設計 & 箱化モジュール化
- Phase 95.5: StringService/ConsoleService(Ring0直結型・純粋関数型)
- Phase 96-96.5: ArrayService/MapService(downcast型)& コード整理
- Phase 97: IntegerService/BoolService(純粋関数型、#[allow(dead_code)] 根絶)
- Phase 98: ConsoleService 実用拡大(7箇所) 完了

次: Phase 99(CoreServices 完全統合、残り約359箇所の段階的移行)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 11:04:58 +09:00
e74694d08b feat(phase95): CoreServices実用化 - Console/String Service実装完了
Phase 95完全達成 - Ring1-Core層の実際のService実装

### 実装成果
-  ConsoleService::println/print 実装
-  StringService::len 実装(UTF-8文字数対応)
-  global accessor 実装(get_core_plugin_host)
-  代表パス切り替え(selfhost.rs)
-  テスト13/13 PASS(100%)

### 変更ファイル
- src/runtime/core_services.rs: Service API定義、Adapter実装、テスト追加(+79行)
- src/runtime/mod.rs: global accessor実装(+18行)
- src/runtime/plugin_host.rs: Debug impl追加(+3行)
- src/runner/selfhost.rs: ConsoleService経由に切り替え(+5行)
- docs/development/current/main/core_boxes_design.md: Phase 95文書化(+118行)

### 技術的成果
- Ring0 → Ring1-Core → 実行パス の三層構造確立
- 型安全なService経由アクセス実現
- UTF-8完全対応(文字数カウント)
- global accessorパターン統一(Ring0と同じOnceLock)

### Bug修正
- PluginHost Debug impl追加
- PluginHost.optional型修正(Send + Sync追加)
- CoreServices Debug impl実装

### 次のステップ
Phase 95.5: Ring0統合とAdapter整理(#[allow(dead_code)]削除)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 09:57:38 +09:00
b3de4cac4b feat(phase93): with_core_from_registry implementation complete
Phase 93 完了: UnifiedBoxRegistry 統合実装 & 起動パス統合

**実装内容**:
- with_core_from_registry() 実装
  - UnifiedBoxRegistry.has_type() で core Box の存在確認
  - 不足時は CoreInitError::MissingService を返す
  - ダミー Service 実装で CoreServices を構築
- ダミー Service 実装を pub に
  - DummyStringService, DummyIntegerService 等を公開
  - Phase 94 の実変換までの橋渡し
- CoreServices::dummy() ヘルパー追加
  - フォールバック用ダミー実装
- initialize_runtime() 実装(環境変数制御)
  - NYASH_USE_PLUGIN_HOST=1 で PluginHost 有効化
  - 環境変数なしで従来通り動作(後方互換性)
- selfhost に PluginHost 初期化追加
  - CoreInitError 発生時は fail-fast
  - 既存ロジックは変更なし

**Fail-Fast 設計**:
- 起動時に core Box 不足を即座に検出
- CoreInitError で明示的なエラーメッセージ
- デバッグ容易(ランタイムエラーではなく起動時エラー)

**テスト結果**:
- test_with_core_from_registry_missing_box 追加
- 7件全て成功
- ビルド成功(1分4秒)
- 526 passed(既存36失敗は Phase 93 と無関係)

**動作確認**:
- 環境変数なし: 従来通り動作 
- NYASH_USE_PLUGIN_HOST=1: PluginHost 初期化成功 
- selfhost: fail-fast 動作確認済み 

**ドキュメント更新**:
- Section 10 追加(77行)
- 段階的展開戦略、Fail-Fast 設計を文書化

**次のステップ**: Phase 94 (実際の Box → Service 変換)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 08:42:45 +09:00
4e2e45a79d feat(phase90): Ring0Context fs/time/thread migration complete
Phase 90 完了: IO/fs/time/thread 系の Ring0 移行

**Phase 90-A: fs 系移行(7箇所)**
- FsApi trait 追加(6メソッド)
- StdFs 実装(std::fs ベース)
- IoError 拡張(4バリアント追加)
- 移行: strip.rs(4), dispatch.rs(1), mod.rs(3)

**Phase 90-B: io 系移行**
- Phase 88 完了済み(スキップ)

**Phase 90-C: time 系移行(3箇所)**
- TimeApi に elapsed() 追加
- 移行: selfhost_exe.rs(1), io.rs(1), plugin_loader_unified.rs(1)

**Phase 90-D: thread 系移行(2箇所)**
- ThreadApi trait 追加(sleep メソッド)
- StdThread 実装
- 移行: global_hooks.rs(1), plugin_loader_unified.rs(1)

**Phase 90-E: 統合テスト**
- ビルド成功(6 warnings, 0 errors)
- テスト: 522/554 passed (94.2%)
- 退行なし

**実装成果**:
- Ring0Context 拡張: fs, thread フィールド追加
- 総移行: 12箇所(fs: 7, time: 3, thread: 2)
- 移行率: fs(2.9%), time(2.1%), thread(5.4%)

**次のステップ**: Phase 91 (PluginHost/CoreServices skeleton)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 06:14:57 +09:00