docs: restore docs/private/roadmap from 7b4908f9 (Phase 20.31)

This commit is contained in:
nyash-codex
2025-10-31 18:00:10 +09:00
parent 1d49e24bf0
commit 8fd3a2b509
433 changed files with 108935 additions and 0 deletions

View File

@ -0,0 +1,15 @@
# Phase 15.77 — Frozen Toolchain Polish & Windows Plan
Scope
- Finalize Frozen v1 pipeline polish (doctor extended, multi-object linking).
- Add Windows linking plan (MinGW/Clang and MSVC/clang-cl), with helper scripts.
Whats in this repo now
- Doctor (extended): `tools/aot/doctor_frozen_v1.sh` — builds main and extra libs (Parser/MirBuilder/VM), links and runs.
- Windows helpers: `tools/aot/windows/` — README, MinGW and MSVC link wrappers, stub C.
- Guides updated: `docs/guides/frozen-toolchain.md` — Windows notes and examples.
Next
- Stabilize `hako_kernel` feature presets for Windows (MinGW→MSVC parity).
- Add a minimal Windows smoke (optional): link and run a tiny EXE using stub + `.o` produced on WSL.
- Record success logs (Result: 0) in the guide once parity is achieved.

View File

@ -0,0 +1,24 @@
# Phase 15.77 — Milestone (Frozen Toolchain Polish & Windows Plan)
Status: InFlight
Objectives
- Replace development stubs with static runtime on Windows (MinGW → MSVC parity)
- Finalize doctor & docs (endtoend clarity, copy/paste quicklinks)
Deliverables (DoD)
- Windows static runtime builds green:
- MinGW: `libhako_kernel.a` builds; sample link → `Result: 0`
- MSVC: `hako_kernel.lib` builds; sample link → `Result: 0`
- Guide updated with “Static runtime (Windows) example” copy/paste
- Doctor: extended mode shows clear advice on missing allowlist/lib paths
Risks & Mitigations
- Legacy refs in `hako_kernel` may block Windows builds
- Mitigate by gating under features, or providing pluginbased alternatives
- Keep dev stubs path as an interim; ensure examples still run
Next
- Harden `hako_kernel` Windows build (gate legacy refs; converge feature presets)
- Record success logs (MinGW/MSVC) and embed in the guide

View File

@ -0,0 +1,338 @@
# Phase 15.77 - 凍結EXE確定フェーズ
**期間**: 2025-11-09 - 2025-12-206週間
**状態**: 🔜 Phase 15.76完了後開始
---
## 🎯 このフェーズで実現すること
**凍結EXEhako-frozen-v1.exe確定 + Rust層最小化**
1. **凍結EXE作成**: hako-frozen-v1.exe ビルド・タグ付け・配布
2. **Rust層最小化**: 99,406行 → 100-200行VM実行エンジンのみ
3. **単一パーサ体制**: Hakoruneパーサーのみ開発Rust凍結
4. **安全な試行錯誤**: いつでも凍結EXEに戻れる基盤確立
---
## 💡 このフェーズの位置づけ
### Phase 15.76で確立した「背骨」を使って実際に凍結
```
Phase 15.76(背骨確立)
├── extern_c構文実装 ✅
├── LLVM Backendプラグイン化 ✅
└── AOT導線整備MIR JSON→.o→EXE
Phase 15.77(凍結実行)← 今ここ
├── 凍結EXE作成・配布
├── Rust層最小化実行
└── 単一パーサ体制確立
Phase 15.78〜脱Rust加速
└── Hakoruneパーサー完全実装
```
---
## 🎯 成功基準DoD
### 1⃣ 凍結EXE確定
#### ビルド・動作確認
- [ ] `hako-frozen-v1.exe` ビルド成功Linux/macOS/Windows
- [ ] 170 PASS維持quick-selfhost
- [ ] AOT導線動作確認MIR JSON→.o→EXE
#### タグ付け・配布
- [ ] Git tag作成`v1.0.0-frozen`
- [ ] 配布物生成(`hako-frozen-v1-linux-x64.tar.gz`等)
- [ ] README/LICENSE同梱
- [ ] SHA256チェックサム生成
#### 配布先
```
releases/
├── v1.0.0-frozen/
│ ├── hako-frozen-v1-linux-x64.tar.gz
│ ├── hako-frozen-v1-macos-arm64.tar.gz
│ ├── hako-frozen-v1-windows-x64.zip
│ ├── SHA256SUMS.txt
│ └── INSTALL.md
```
### 2⃣ Rust層最小化
#### 目標
```
現状: 99,406行Phase 15.75開始時)
削減: 89.5%
目標: 100-200行VM実行エンジンのみ
```
#### 段階的削減計画
```rust
// Week 1-2: Parser削除凍結EXE内のみ残す
src/front/parser_layer/ 削除(凍結EXE経由
src/front/ast/ 削除(MIR直接生成へ
// Week 3-4: MIR Builder削除Hakorune実装へ
src/backend/mir_builder/ 削除(Hakorune実装使用
// 残すもの100-200行
src/backend/mir_interpreter/ 残す(VM実行エンジン
src/runtime/ffi/ 残す(extern_c基盤
src/main.rs 残す(エントリーポイント)
```
### 3⃣ 単一パーサ体制確立
#### Hakoruneパーサーをデフォルトへ
- [ ] `apps/selfhost-compiler/` をデフォルト呼び出し
- [ ] Rustパーサーは凍結EXE内のみ緊急時用
- [ ] スモークテスト全緑Hakoruneパーサー使用
#### 2重メンテ回避
```
BeforePhase 15.76以前):
├── Rustパーサー開発中
└── Hakoruneパーサー開発中← 2重メンテ地獄
AfterPhase 15.77:
├── Rustパーサー凍結、緊急時のみ
└── Hakoruneパーサー開発中← 単一開発ライン
```
### 4⃣ ドキュメント整備
#### 使用ガイド
- [ ] `docs/guides/frozen-toolchain-usage.md` - 凍結EXE使用方法
- [ ] `docs/guides/rust-minimization.md` - Rust最小化手順
- [ ] `INSTALL.md` - 配布物インストールガイド
#### 運用マニュアル
- [ ] 凍結EXEへの戻り方
- [ ] トラブルシューティング
- [ ] FAQよくある質問
---
## 📊 週次計画Week 1-6
### Week 12025-11-09 - 11-15凍結EXE作成
**目標**: hako-frozen-v1.exe ビルド・動作確認
#### タスク
- [ ] Phase 15.76の成果物確認extern_c/AOT導線
- [ ] ビルド設定整備Cargo.toml, build.rs
- [ ] クロスコンパイル設定Linux/macOS/Windows
- [ ] 動作確認quick-selfhost 170 PASS
#### 成果物
```bash
./hako-frozen-v1 --version
# Hakorune v1.0.0-frozen (2025-11-15)
./hako-frozen-v1 program.hako
# OK (VM実行)
./hako-frozen-v1 --backend llvm program.hako
# OK (LLVM AOT)
```
### Week 22025-11-16 - 11-22タグ付け・配布物生成
**目標**: Git tag作成・配布物公開
#### タスク
- [ ] Git tag作成`v1.0.0-frozen`
- [ ] 配布物生成スクリプト作成
- [ ] SHA256チェックサム生成
- [ ] INSTALL.md作成
#### 成果物
```
releases/v1.0.0-frozen/
├── hako-frozen-v1-linux-x64.tar.gz (12MB)
├── hako-frozen-v1-macos-arm64.tar.gz (10MB)
├── hako-frozen-v1-windows-x64.zip (15MB)
├── SHA256SUMS.txt
└── INSTALL.md
```
### Week 32025-11-23 - 11-29Rust Parser削除
**目標**: Parser削除、凍結EXE経由に切り替え
#### タスク
- [ ] `src/front/parser_layer/` 削除準備
- [ ] 凍結EXE経由のParser呼び出し実装
- [ ] AST→MIR直接生成経路確立
- [ ] スモークテスト修正Parser経路変更
#### 削減予想
```
Before: 99,406行
After: ~50,000行Parser削除、約50%削減)
```
### Week 42025-11-30 - 12-06MIR Builder削除準備
**目標**: MIR Builder Hakorune実装へ移行開始
#### タスク
- [ ] `apps/selfhost-compiler/mir_builder/` 検証
- [ ] Rust MIR Builder削除可能性確認
- [ ] ブリッジ層実装Hakorune→Rust
- [ ] 並行動作確認Rust/Hakorune両方
#### 削減予想
```
Before: ~50,000行
After: ~5,000行MIR Builder削除、約90%削減)
```
### Week 52025-12-07 - 12-13Hakoruneパーサー移行
**目標**: Hakoruneパーサーをデフォルトへ
#### タスク
- [ ] `apps/selfhost-compiler/` をデフォルト呼び出し
- [ ] Rustパーサーを緊急時用に格下げ
- [ ] スモークテスト全緑確認Hakorune使用
- [ ] パフォーマンス計測Rust vs Hakorune
#### 期待結果
```bash
# デフォルト: Hakoruneパーサー
./hako program.hako # Hakorune経由
# 緊急時: Rustパーサー凍結EXE内
./hako --fallback-rust-parser program.hako # Rust経由
```
### Week 62025-12-14 - 12-20ドキュメント・レビュー
**目標**: ドキュメント整備・統合テスト
#### タスク
- [ ] 凍結EXE使用ガイド作成
- [ ] Rust最小化手順書作成
- [ ] トラブルシューティングFAQ作成
- [ ] 統合テストquick-selfhost 全緑)
- [ ] ChatGPT/Claudeレビュー
#### 成果物
```
docs/guides/
├── frozen-toolchain-usage.md # 使用方法
├── rust-minimization.md # 最小化手順
└── frozen-toolchain-faq.md # FAQ
docs/private/roadmap/phases/phase-15.77/
├── README.md # Phase概要
├── MILESTONE.md # ゴールライン
├── RUST_MINIMIZATION_PLAN.md # 最小化計画
└── COMPLETION_REPORT.md # 完了報告
```
---
## ❌ Out of Scopeこのフェーズではやらない
### 完全なRust削除
- VM実行エンジンは残す100-200行
- 理由: VM安定性・パフォーマンス
### Hakoruneパーサー完全実装
- 段階的移行(並行動作期間あり)
- 理由: 安全な移行を優先
### プロダクション配布
- まだ実験段階v1.0.0-frozen
- 理由: Phase 15.78以降で安定化
### Windows完全サポート
- Linux/macOS優先
- 理由: 開発環境がLinux/WSL中心
---
## 🚀 次のフェーズPhase 15.78〜)
### Phase 15.78: Hakoruneパーサー完全実装
- 全構文サポートmacro/async/await等
- Rustパーサーとの完全パリティ
- パフォーマンス最適化
### Phase 15.79: 完全な脱Rust
- VM実行エンジンもHakorune実装へ
- Rust層完全削除0行
- Pure Hakorune達成
### Phase 15.80: プロダクション化
- v2.0.0リリース
- 安定性・セキュリティ監査
- 公式配布開始
---
## ⚠️ リスク & 対策
### リスク1: 凍結EXEのサイズ
**問題**: 静的リンクで15MB超の可能性
**対策**: 動的リンク検討、圧縮配布
### リスク2: クロスコンパイル失敗
**問題**: Windows/macOSビルドが難しい
**対策**: Linux優先、他環境は次フェーズ
### リスク3: Rust削除時の不安定化
**問題**: 削除作業でテスト失敗増加
**対策**: 段階的削除、各段階でテスト確認
### リスク4: Hakoruneパーサーの未熟
**問題**: Rustパーサーと完全パリティ未達
**対策**: 並行動作期間を長く取る、Rustフォールバック維持
---
## 📚 関連リソース
### 前フェーズ
- [Phase 15.76 - extern_c & Frozen Toolchain](../phase-15.76/)
- [Phase 15.75 - 脱Rust大作戦](../phase-15.75/)
### 論文資料
- [Rapid Self-Hosting Paper](../../../../private/papers-active/rapid-selfhost-ai-collaboration/)
- [Frozen Toolchain Pattern Evidence](../../../../private/papers-active/rapid-selfhost-ai-collaboration/03_DATA_ANALYSIS.md)
### 業界標準パターン
- **Rust**: stage0凍結ツールチェーン
- **Go**: Go 1.4 frozenbootstrap用
- **OCaml**: ocamlc frozen自己ホスト用
---
## 💬 開発体制
### 実装担当
- **ChatGPT**: Rust削除・Hakorune実装主導
- **Claude**: レビュー・ドキュメント整備
- **tomoaki**: 戦略判断・方向決定
### レビュー方針
- 各Week終了時にレビュー
- 170 PASS維持を最優先
- 問題発生時は即座に凍結EXEへロールバック
---
**作成日**: 2025-10-14
**Phase開始予定**: 2025-11-09Phase 15.76完了後)
**想定期間**: 6週間

View File

@ -0,0 +1,550 @@
# Rust最小化計画Phase 15.77
## 🎯 目標
**99,406行 → 100-200行99.8%削減)**
Rust層を極限まで薄くし、VM実行エンジン+FFI基盤のみ残す。
---
## 📊 削減計画の全体像
### Phase 15.75開始時2025-10-05
```
総行数: 99,406行
内訳:
├── Parser層 : ~30,000行
├── AST層 : ~10,000行
├── MIR Builder層 : ~40,000行
├── VM層 : ~5,000行
├── FFI/Runtime層 : ~2,000行
└── その他 : ~12,406行
```
### Phase 15.77完了時(目標)
```
総行数: 100-200行
内訳:
├── main.rs : ~50行エントリーポイント
├── VM実行エンジン : ~100行最小ループ
├── FFI基盤 : ~50行extern_c実行
└── その他削除不可 : ~0行
```
---
## 📅 週次削減計画
### Week 32025-11-23 - 11-29Parser削除
#### 削除対象(~40,000行
```
src/front/parser_layer/
├── parser.rs (~5,000行) ❌
├── lexer.rs (~3,000行) ❌
├── token.rs (~1,000行) ❌
└── grammar/ (~8,000行) ❌
src/front/ast/
├── ast_nodes.rs (~4,000行) ❌
├── ast_visitor.rs (~2,000行) ❌
├── ast_printer.rs (~1,000行) ❌
└── ast_validator.rs (~3,000行) ❌
その他Parser関連:
├── src/front/syntax/ (~8,000行) ❌
└── src/front/source_map/ (~5,000行) ❌
```
#### 置き換え方法
```rust
// BeforeRust Parser
fn parse_source(source: &str) -> Result<Ast> {
let tokens = lexer::tokenize(source)?;
let ast = parser::parse(tokens)?;
Ok(ast)
}
// After凍結EXE経由
fn parse_source_frozen(source: &str) -> Result<Mir> {
// hako-frozen-v1を呼び出し
let mir_json = Command::new("hako-frozen-v1")
.arg("--emit-mir-json")
.arg("-")
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.spawn()?
.wait_with_output()?;
let mir = serde_json::from_slice(&mir_json.stdout)?;
Ok(mir)
}
```
#### スモークテスト修正
```bash
# Before
./hako program.hako # Rust Parser使用
# After
./hako program.hako # 凍結EXE経由でParser実行
```
#### 期待削減
- **削減**: ~40,000行
- **残り**: ~59,000行59.4%削減)
---
### Week 42025-11-30 - 12-06MIR Builder削除準備
#### 検証対象(~40,000行
```
src/backend/mir_builder/
├── builder.rs (~8,000行) 検証
├── expression.rs (~10,000行) 検証
├── statement.rs (~8,000行) 検証
├── control_flow.rs (~6,000行) 検証
└── type_inference.rs (~8,000行) 検証
```
#### 並行動作確認
```rust
// Rust MIR Builder
fn build_mir_rust(ast: &Ast) -> Result<Mir> {
let mut builder = MirBuilder::new();
builder.visit_ast(ast)?;
Ok(builder.finish())
}
// Hakorune MIR Builder
fn build_mir_hakorune(ast_json: &str) -> Result<Mir> {
let mir_json = Command::new("hako")
.arg("apps/selfhost-compiler/mir_builder.hako")
.arg("--input")
.arg(ast_json)
.output()?;
let mir = serde_json::from_slice(&mir_json.stdout)?;
Ok(mir)
}
// 両方動作確認
#[test]
fn test_mir_builder_parity() {
let source = "local x = 42; return x;";
let ast = parse_source(source).unwrap();
let mir_rust = build_mir_rust(&ast).unwrap();
let mir_hako = build_mir_hakorune(&ast_to_json(&ast)).unwrap();
assert_eq!(mir_rust, mir_hako); // パリティ確認
}
```
#### Week 4では削除しない
- 理由: パリティ確認・安全性検証
- 削除: Week 5で実行
---
### Week 52025-12-07 - 12-13MIR Builder削除実行
#### 削除実行(~40,000行
```bash
# MIR Builder完全削除
rm -rf src/backend/mir_builder/
# Hakorune実装をデフォルトへ
# src/main.rs
fn build_mir(source: &str) -> Result<Mir> {
// Hakorune MIR Builder使用
build_mir_hakorune(source)
}
```
#### スモークテスト確認
```bash
# 全テスト実行Hakorune MIR Builder使用
bash tools/smokes/v2/run.sh --profile quick-selfhost
# 期待結果
# Total: 185
# Passed: 170
# Failed: 15
```
#### 期待削減
- **削減**: ~40,000行
- **残り**: ~19,000行80.9%削減)
---
### Week 62025-12-14 - 12-20雑多なコード削除
#### 削除対象(~18,800行
```
未使用依存削除:
├── serde_derive ❌AST/MIR生成不要
├── syn ❌Parser不要
├── quote ❌(コード生成不要)
└── proc-macro2 ❌(マクロ不要)
デッドコード削除:
├── src/utils/ (~2,000行) ❌
├── src/diagnostics/ (~3,000行) ❌凍結EXE側
├── src/optimizer/ (~5,000行) ❌LLVM側
└── src/codegen/ (~8,000行) ❌LLVM側
テスト削除:
├── tests/parser/ (~500行) ❌
├── tests/mir_builder/ (~300行) ❌
└── 残すテスト: tests/vm/ tests/ffi/ のみ
```
#### Cargo.toml整理
```toml
# Before多数の依存
[dependencies]
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"
syn = "2.0"
quote = "1.0"
proc-macro2 = "1.0"
clap = "4.0"
# ... 30個以上
# After最小限
[dependencies]
serde = "1.0" # MIR JSONデシリアライズ
serde_json = "1.0" # MIR JSON読み込み
libloading = "0.8" # FFI動的ロード
# 合計3個
```
#### 期待削減
- **削減**: ~18,800行
- **残り**: ~200行99.8%削減)
---
## 🎯 最終構成目標100-200行
### ファイル構成
```
src/
├── main.rs (~50行) ✅
├── vm/
│ └── executor.rs (~100行) ✅
├── ffi/
│ └── extern_c.rs (~50行) ✅
└── lib.rs (~10行) ✅
Cargo.toml (~30行) ✅
build.rs (~20行) ✅ (FFIビルド用)
合計: ~260行少しオーバー、調整必要
```
### src/main.rs~50行
```rust
use std::process::Command;
use serde_json;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = std::env::args().collect();
// Step 1: 凍結EXE経由でMIR取得
let mir_json = Command::new("hako-frozen-v1")
.arg("--emit-mir-json")
.arg(&args[1])
.output()?
.stdout;
// Step 2: MIRデシリアライズ
let mir: Mir = serde_json::from_slice(&mir_json)?;
// Step 3: VM実行
let result = vm::execute(mir)?;
println!("{}", result);
Ok(())
}
// MIR構造体最小限
#[derive(serde::Deserialize)]
struct Mir {
functions: Vec<Function>,
entry: String,
}
#[derive(serde::Deserialize)]
struct Function {
name: String,
blocks: Vec<BasicBlock>,
}
#[derive(serde::Deserialize)]
struct BasicBlock {
instructions: Vec<Instruction>,
}
#[derive(serde::Deserialize)]
enum Instruction {
Const { dst: u32, value: Value },
BinOp { dst: u32, lhs: u32, rhs: u32, op: BinOp },
Call { dst: u32, callee: String, args: Vec<u32> },
ExternC { dst: u32, symbol: String, args: Vec<u32> },
Ret { value: u32 },
// ... 16命令のみ
}
```
### src/vm/executor.rs~100行
```rust
use crate::Mir;
use std::collections::HashMap;
pub fn execute(mir: Mir) -> Result<Value, String> {
let mut vm = VM::new(mir);
vm.run()
}
struct VM {
mir: Mir,
registers: Vec<Value>,
current_block: usize,
current_instruction: usize,
}
impl VM {
fn new(mir: Mir) -> Self {
Self {
mir,
registers: vec![Value::Null; 256],
current_block: 0,
current_instruction: 0,
}
}
fn run(&mut self) -> Result<Value, String> {
loop {
let func = &self.mir.functions[0]; // エントリー関数
let block = &func.blocks[self.current_block];
let inst = &block.instructions[self.current_instruction];
match inst {
Instruction::Const { dst, value } => {
self.registers[*dst as usize] = value.clone();
}
Instruction::BinOp { dst, lhs, rhs, op } => {
let lhs = &self.registers[*lhs as usize];
let rhs = &self.registers[*rhs as usize];
self.registers[*dst as usize] = binop(lhs, rhs, *op);
}
Instruction::ExternC { dst, symbol, args } => {
let result = crate::ffi::call_extern(symbol, args, &self.registers)?;
self.registers[*dst as usize] = result;
}
Instruction::Ret { value } => {
return Ok(self.registers[*value as usize].clone());
}
// ... 他の命令
}
self.current_instruction += 1;
}
}
}
fn binop(lhs: &Value, rhs: &Value, op: BinOp) -> Value {
match (lhs, rhs, op) {
(Value::Int(a), Value::Int(b), BinOp::Add) => Value::Int(a + b),
(Value::Int(a), Value::Int(b), BinOp::Sub) => Value::Int(a - b),
// ... 基本演算のみ
_ => panic!("unsupported binop"),
}
}
```
### src/ffi/extern_c.rs~50行
```rust
use libloading::{Library, Symbol};
use std::collections::HashMap;
static mut ALLOWLIST: Vec<String> = Vec::new();
pub fn call_extern(
symbol: &str,
args: &[u32],
registers: &[Value],
) -> Result<Value, String> {
// Step 1: 許可チェック
unsafe {
if !ALLOWLIST.contains(&symbol.to_string()) {
return Err(format!("ExternCDenied: {}", symbol));
}
}
// Step 2: ライブラリロード
let lib = Library::new("libc.so.6")
.map_err(|e| format!("Failed to load library: {}", e))?;
// Step 3: シンボル取得
unsafe {
let func: Symbol<extern "C" fn() -> i64> = lib.get(symbol.as_bytes())
.map_err(|e| format!("Symbol not found: {}", e))?;
// Step 4: 実行引数0個のみ簡略化
let result = func();
Ok(Value::Int(result))
}
}
pub fn init_allowlist() {
unsafe {
ALLOWLIST = vec![
"getpid".to_string(),
"strlen".to_string(),
"system".to_string(),
];
// ENV変数から追加
if let Ok(list) = std::env::var("HAKO_FFI_ALLOW_LIST") {
for symbol in list.split(',') {
ALLOWLIST.push(symbol.to_string());
}
}
}
}
```
---
## ✅ 各週の検証ポイント
### Week 3: Parser削除後
```bash
# 動作確認
./hako local_tests/hello.nyash
# Expected: Hello, World!
# スモークテスト
bash tools/smokes/v2/run.sh --profile quick-selfhost
# Expected: 170 PASS / 15 FAIL
# 行数確認
tokei src/
# Expected: ~59,000行
```
### Week 4: MIR Builder削除準備
```bash
# パリティテスト
cargo test test_mir_builder_parity
# Expected: ok
# 並行動作確認
HAKO_USE_RUST_MIR_BUILDER=1 ./hako test.hako # Rust
HAKO_USE_RUST_MIR_BUILDER=0 ./hako test.hako # Hakorune
# Expected: 両方OK
```
### Week 5: MIR Builder削除後
```bash
# スモークテストHakoruneのみ
bash tools/smokes/v2/run.sh --profile quick-selfhost
# Expected: 170 PASS / 15 FAIL
# 行数確認
tokei src/
# Expected: ~19,000行
```
### Week 6: 最終調整後
```bash
# 最終動作確認
./hako local_tests/hello.nyash
./hako --backend llvm local_tests/arithmetic.nyash
# 最終スモークテスト
bash tools/smokes/v2/run.sh --profile quick-selfhost
# Expected: 170 PASS / 15 FAIL
# 最終行数確認
tokei src/
# Expected: ~200行
```
---
## ⚠️ ロールバック手順
### 各週でロールバック可能
```bash
# Week 3で問題発生 → Week 2に戻る
git revert HEAD~10 # Week 3のコミット取り消し
cargo build --release
bash tools/smokes/v2/run.sh --profile quick-selfhost
# Week 5で問題発生 → Week 4に戻る
git revert HEAD~20 # Week 5のコミット取り消し
# ... 同様
```
### 凍結EXEへの完全ロールバック
```bash
# 最悪の場合: 凍結EXE使用に戻る
cp hako-frozen-v1 ./hako
./hako program.hako # 凍結EXE経由で安定動作
```
---
## 📊 削減行数の追跡
### Git commit messageテンプレート
```
Phase 15.77: Week X - [作業内容]
削減行数: ~XX,XXX行
残り行数: ~XX,XXX行
削減率: XX.X%
動作確認:
- スモークテスト: 170 PASS / 15 FAIL
- AOT導線: OK
関連: #issue-number
```
### 週次レポート
```markdown
## Week X削減レポート
### 削減内容
- [削除したディレクトリ/ファイル]
### 削減行数
- 削減: ~XX,XXX行
- 残り: ~XX,XXX行
- 削減率: XX.X%
### 動作確認
- [ ] スモークテスト: 170 PASS維持
- [ ] AOT導線動作
- [ ] 凍結EXEロールバック確認
### 問題点
- [なし/あれば記載]
```
---
**作成日**: 2025-10-14
**Phase**: 15.77Week 3-6
**目標**: 99,406行 → 100-200行99.8%削減)