Phase 13 v1 + E5-2 retest: Both NEUTRAL, freeze as research boxes

Phase 13 v1: Header Write Elimination (C7 preserve header)
- Verdict: NEUTRAL (+0.78%)
- Implementation: HAKMEM_TINY_C7_PRESERVE_HEADER ENV gate (default OFF)
- Makes C7 nextptr offset conditional (0→1 when enabled)
- 4-point matrix A/B test results:
  * Case A (baseline): 51.49M ops/s
  * Case B (WRITE_ONCE=1): 52.07M ops/s (+1.13%)
  * Case C (C7_PRESERVE=1): 51.36M ops/s (-0.26%)
  * Case D (both): 51.89M ops/s (+0.78% NEUTRAL)
- Action: Freeze as research box (default OFF, manual opt-in)

Phase 5 E5-2: Header Write-Once retest (promotion test)
- Verdict: NEUTRAL (+0.54%)
- Motivation: Phase 13 Case B showed +1.13%, re-tested with dedicated 20-run
- Results (20-run):
  * Case A (baseline): 51.10M ops/s
  * Case B (WRITE_ONCE=1): 51.37M ops/s (+0.54%)
- Previous test: +0.45% (consistent with NEUTRAL)
- Action: Keep as research box (default OFF, manual opt-in)

Key findings:
- Header write tax optimization shows consistent NEUTRAL results
- Neither Phase 13 v1 nor E5-2 reaches GO threshold (+1.0%)
- Both implemented as reversible ENV gates for future research

Files changed:
- New: core/box/tiny_c7_preserve_header_env_box.{c,h}
- Modified: core/box/tiny_layout_box.h (C7 offset conditional)
- Modified: core/tiny_nextptr.h, core/box/tiny_header_box.h (comments)
- Modified: core/bench_profile.h (refresh sync)
- Modified: Makefile (add new .o files)
- Modified: scripts/run_mixed_10_cleanenv.sh (add C7_PRESERVE ENV)
- Docs: PHASE13_*, PHASE5_E5_2_HEADER_WRITE_ONCE_* (design/results)

Next: Phase 14 (Pointer-chase reduction, tcache-style intrusive LIFO)

🤖 Generated with Claude Code

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Moe Charm (CI)
2025-12-15 00:32:25 +09:00
parent 51f76153c4
commit cbb35ee27f
16 changed files with 836 additions and 27 deletions

View File

@ -0,0 +1,58 @@
# Phase 13 v1: Header Write EliminationC7 preserve headerA/B 結果
**Date**: 2025-12-14
**Verdict**: ⚪ **NEUTRAL**Phase 13 v1 は research box freeze / default OFF
設計: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_DESIGN.md`
手順: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_NEXT_INSTRUCTIONS.md`
---
## 1. 目的
Phase 12 の gap 仮説header write taxに対して、Phase 13 v1 は:
- **ヘッダを消さずに維持**
- C7 の freelist がヘッダを壊さないheader-preservingようにして
- **E5-2header write-onceを C7 にも拡張**できるかを検証する
---
## 2. 4点マトリクスthroughput
| Case | HAKMEM_TINY_C7_PRESERVE_HEADER | HAKMEM_TINY_HEADER_WRITE_ONCE | ops/s | vs Case A |
|------|--------------------------------|-------------------------------|-------|----------|
| A | 0 | 0 | 51,490,500 | baseline |
| B | 0 | 1 | 52,070,600 | **+1.13%** |
| C | 1 | 0 | 51,355,200 | -0.26% |
| D | 1 | 1 | 51,891,902 | +0.78% |
結論:
- Phase 13 v1Case D**+0.78%** → **NEUTRAL**GO閾値 +1.0% 未満)
- **E5-2 単体Case Bが +1.13% で GO 相当**という重要な副産物が得られた
---
## 3. 判定
### 3.1 Phase 13 v1C7 preserve header
- **Verdict**: ⚪ NEUTRAL → **research box freezedefault OFF**
- 推定原因:
- C7 preserve による freelist next のオフセット変更が、保存できた write を相殺(未確定)
### 3.2 Phase 5 E5-2Header write-once
- **再テスト結果**:
- Phase 13 matrix の単発観測では **+1.13%**Case B
- 専用 clean env 20-run 再テストでは **+0.54%NEUTRAL** → research box 維持default OFF
- 詳細: `docs/analysis/PHASE5_E5_2_HEADER_WRITE_ONCE_RETEST_AB_TEST_RESULTS.md`
---
## 4. Next Actions推奨
1. Phase 13 v1 は freeze保持はするが default OFF
2. E5-2 は freezedefault OFF
3. Phase 13 v1 の派生案(必要なら):
- C7 の next を “より aligned” な位置に置く設計v1bを研究箱で検討

View File

@ -0,0 +1,146 @@
# Phase 13: Header Write Elimination v1C7 Header-Preserving Freelist
**Date**: 2025-12-14
**Status**: DESIGNPhase 13 kickoff→ ⚪ **NEUTRAL (+0.78%)**research box freeze, default OFF
---
## 0. Executive Summary1枚
Phase 12 の比較で **system malloc (glibc) が hakmem より +63.7% 速い**ことが判明し、次の大きい構造差として **“steady-state のヘッダ書き込みwrite tax”** が最優先仮説になった。
ただし hakmem は free の hot path で `HEADER_MAGIC` を前提に **ヘッダを読む**ため、ヘッダを “無くす/壊す” と安全性が崩れる。
そこで Phase 13 v1 は「ヘッダ自体は維持」しつつ、**C7 の freelist でヘッダを上書きしない**設計に寄せて、既存の **E5-2 (Header write-once)****C7 にも適用可能にする**
狙い:
- C1-C6 は既に write-once で “alloc 時ヘッダ書き込み” をスキップ可能
- **C7 は現状 “free の next がヘッダを潰す” ため、alloc で毎回ヘッダ再書き込みが必要**
- C7 の next を **base+1user 先頭)**へ移すとヘッダが保持され、write-once で alloc 側の再書き込みを削れる
---
## 1. 現状(なぜ C7 だけ毎回書いているのか)
### 1.1 重要な前提(現行の正)
- Free hot path例: `core/front/malloc_tiny_fast.h``free_tiny_fast()`)は、
- `ptr-1``HEADER_MAGIC` を検証し
- class_idx を header から抽出している
**ヘッダの正しさは safety と fast path の前提**
### 1.2 E5-2 (Header write-once) の適用範囲
- `core/box/tiny_header_box.h``tiny_header_finalize_alloc()` が、
- `HAKMEM_TINY_HEADER_WRITE_ONCE=1` かつ
- `tiny_class_preserves_header(class_idx)=true`C1-C6
のとき、alloc 時の `tiny_region_id_write_header()` をスキップする。
### 1.3 C7 が write-once にならない理由(根本)
- `core/box/tiny_layout_box.h``tiny_nextptr_offset()`
- C7 は `next_off=0`= `base+0` に next を書く)
→ free 時に **ヘッダ領域を next pointer で上書き**する
→ alloc で必ず `tiny_region_id_write_header()` を実行し直す必要がある
C0 も同じだが、C0 は stride 8B のため `base+1` に 8B next を置けない制約がある)
---
## 2. 提案Phase 13 v1
### 2.1 変更のコア
**C7 の next pointer を `base+1`user 先頭)に移す**:
- Before現行:
- C7: `next_off=0``*(void**)base = next`(ヘッダ破壊)
- AfterPhase 13 v1:
- C7: `next_off=1``memcpy(base+1, &next, 8)`(ヘッダ保持)
これにより C7 が “header-preserving class” になり、E5-2 の write-once が C7 にも効く。
### 2.2 Box Theory箱割り
```
L0: tiny_c7_preserve_header_env_box (ENV gate, A/B, refresh)
L1: tiny_layout_box (tiny_nextptr_offset の SSOT)
L2: tiny_nextptr (next load/store は SSOT を参照)
L3: tiny_header_box (class_preserves_header → write-once 適用)
```
境界は 1 箇所:
- 「C7 の next オフセット決定」= `tiny_nextptr_offset()` に集約(他で分岐しない)
### 2.3 戻せるA/B
- ENV: `HAKMEM_TINY_C7_PRESERVE_HEADER=0/1`default: 0
- まずは research box として導入し、GO なら preset 昇格
---
## 3. Safety / InvariantsFail-Fast
### 3.1 不変条件
- `tiny_next_store/load`**常に** `tiny_nextptr_offset()` を参照(直書き禁止)
- `tiny_class_preserves_header(class_idx)` は offset!=0 で決まる(ハードコード禁止)
- C7 preserve ON のとき:
- free 後も `*(uint8_t*)base == HEADER_MAGIC|cls` が保持される(ヘッダ破壊が起きない)
### 3.2 Fail-Fastdebug 限定)
- デバッグのみ、C7 preserve ON のときに:
- `tiny_header_validate(base, 7, ...)` の mismatch をワンショットで出す
- release では常時ログ無し、必要なら stats カウンタのみ
---
## 4. A/B 計測計画(同一バイナリ)
この変更は “freelist next の配置” を変えるため、本来は layout 差になるが、Phase 13 v1 は **ENV で切替**できるようにして同一バイナリ A/B を維持するPhase 5-7 の教訓)。
### 4.1 4点マトリクス必須
| Case | HAKMEM_TINY_C7_PRESERVE_HEADER | HAKMEM_TINY_HEADER_WRITE_ONCE | 意味 |
|------|--------------------------------|-------------------------------|------|
| A | 0 | 0 | 現行 baseline |
| B | 0 | 1 | E5-2 のみC1-C6 |
| C | 1 | 0 | C7 next を user に移す(ヘッダは毎回書く) |
| D | 1 | 1 | Phase 13 v1 本命C1-C7 を write-once |
### 4.2 GO/NO-GOMixed 10-run
- GO: mean **+1.0% 以上**
- NO-GO: mean **-1.0% 以下**
- NEUTRAL: ±1.0% → freezeresearch box
---
## 5. リスクと対策
### リスク 1: C7 next が unaligned になり memcpy 経由で遅くなる
- 対策: Case Cwrite-once 無しを必ず測り、layout 変更単体のコストを分離する
- もし C が大きく負ける場合:
- “C7 next offset=8aligned” の派生案を検討Phase 13 v1b
### リスク 2: class_idx ハードコードが残っていて壊れる
- 対策: `rg "== 7|!= 7|C7 uses offset 0"` を掃除し、SSOT`tiny_layout_box`)参照に寄せる
### リスク 3: ENV refresh が bench_profile putenv に追従しない
- 対策: Phase 8 と同様に `*_env_refresh_from_env()` を用意し、`bench_profile.h` から呼ぶ
---
## 6. 次Phase 13 以降の視界)
Phase 13 v1 は「ヘッダを “消す”」ではなく「**steady-state のヘッダ再書き込みを減らす**」に寄せる。
もし system malloc との差がまだ大きい場合、次の大テーマは:
- Thread cachetcache 相当の構造)を TinyUnifiedCache に移植するPhase 14 候補)

View File

@ -0,0 +1,134 @@
# Phase 13: Header Write Elimination v1 — 次の指示書C7 preserve header
## 0. Status
- Phase 12 で system malloc が hakmem より +63.7% 速いことが判明 → Phase 13 開始
- 方針v1: **ヘッダは維持**しつつ、**C7 の freelist がヘッダを壊さない**ようにして “alloc 時のヘッダ再書き込み” を削る
- 結果: ⚪ **NEUTRAL (+0.78%) → freeze (default OFF)**(副産物: E5-2 が +1.13%
設計: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_DESIGN.md`
結果: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_AB_TEST_RESULTS.md`
---
## 1. 目的GO 条件)
Mixed 10-runclean envで:
- **GO**: mean +1.0% 以上
- **NO-GO**: mean -1.0% 以下(即 rollback / freeze
- **NEUTRAL**: ±1.0%research box freeze
---
## 2. 実装パッチ順(小さく積む)
### Patch 1: L0 ENV Box戻せる
新規:
- `core/box/tiny_c7_preserve_header_env_box.h`
- `core/box/tiny_c7_preserve_header_env_box.c`refresh
仕様:
- ENV: `HAKMEM_TINY_C7_PRESERVE_HEADER=0/1`default: 0
- API:
- `tiny_c7_preserve_header_enabled() -> int`
- `tiny_c7_preserve_header_env_refresh_from_env()`
要件:
- hot path では **getenv 禁止**lazy init + cached read のみ)
### Patch 2: L1 Layout SSOT 変更境界1箇所
修正:
- `core/box/tiny_layout_box.h`
変更:
- `tiny_nextptr_offset(class_idx)` の C7 分だけを L0 gate で切替
- OFF: 既存C7 off=0
- ON: C7 off=1header-preserving
### Patch 3: L2 NextPtr のコメント/前提を SSOT 準拠に
修正(コードの挙動変更はしない):
- `core/tiny_nextptr.h`
- `core/box/tiny_header_box.h`(コメントの “C7=offset0 固定” 等があれば撤去)
狙い:
- C7 の offset 固定前提を残さない(設計事故の芽を摘む)
### Patch 4: Bench profile の refresh 同期ENV 事故防止)
修正:
- `core/bench_profile.h`
追加:
- `bench_setenv_default(...)` の後に `tiny_c7_preserve_header_env_refresh_from_env()` を呼ぶ
Phase 8 と同じパターン)
---
## 3. A/B テスト4点マトリクス必須
`scripts/run_mixed_10_cleanenv.sh` を使用ENV リークを防ぐ)。
### Case Abaseline
```sh
HAKMEM_TINY_C7_PRESERVE_HEADER=0 \
HAKMEM_TINY_HEADER_WRITE_ONCE=0 \
scripts/run_mixed_10_cleanenv.sh
```
### Case BE5-2 only
```sh
HAKMEM_TINY_C7_PRESERVE_HEADER=0 \
HAKMEM_TINY_HEADER_WRITE_ONCE=1 \
scripts/run_mixed_10_cleanenv.sh
```
### Case CC7 preserve only
```sh
HAKMEM_TINY_C7_PRESERVE_HEADER=1 \
HAKMEM_TINY_HEADER_WRITE_ONCE=0 \
scripts/run_mixed_10_cleanenv.sh
```
### Case DPhase 13 v1 本命)
```sh
HAKMEM_TINY_C7_PRESERVE_HEADER=1 \
HAKMEM_TINY_HEADER_WRITE_ONCE=1 \
scripts/run_mixed_10_cleanenv.sh
```
追加(任意):
- `HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1` でも 5-run を取る(回帰が無いこと)
---
## 4. 可視化(最小)
既存:
- `HAKMEM_TINY_HEADER_WRITE_ONCE_STATS=1` を使い、
- `alloc_skip_count / alloc_write_count` の比率が増えることを確認する
新規を足す場合(必要最小):
- “C7 で skip が増えている” が見えない場合のみ、C7 だけのカウンタを追加(常時 atomic は避ける)
---
## 5. 昇格GO の場合のみ)
GO のとき:
1. `core/bench_profile.h` に default を追加
- `bench_setenv_default("HAKMEM_TINY_C7_PRESERVE_HEADER", "1");`
- (必要なら)`HAKMEM_TINY_HEADER_WRITE_ONCE=1` も昇格
2. `CURRENT_TASK.md` に Phase 13 v1 の結果A/B 表)を追記
3. rollback 手順を明記
- `export HAKMEM_TINY_C7_PRESERVE_HEADER=0`
NO-GO のとき:
- research box freezedefault OFF のまま)、設計メモに原因を記録

View File

@ -9,6 +9,19 @@
---
## Addendum2025-12-14
Phase 13 v1 の 4点マトリクスで、`HAKMEM_TINY_HEADER_WRITE_ONCE=1` 単体が **+1.13%** を観測(候補)。
- 結果: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_AB_TEST_RESULTS.md`
- ただし、専用 clean env 20-run 再テストでは **+0.54%NEUTRAL** となり、昇格は見送り。
- 詳細: `docs/analysis/PHASE5_E5_2_HEADER_WRITE_ONCE_RETEST_AB_TEST_RESULTS.md`
結論:
- E5-2 は research box のまま維持default OFF
---
## A/B Test Results (Mixed Workload)
### Configuration

View File

@ -6,6 +6,12 @@
**Baseline**: 43.998M ops/s (Mixed, 40M iters, ws=400, E4-1+E4-2+E5-1 ON)
**Goal**: +1-3% by moving header writes from allocation hot path to refill cold boundary
**Update (2025-12-14)**:
- Phase 13 v1 の 4点マトリクスで `HAKMEM_TINY_HEADER_WRITE_ONCE=1` 単体が **+1.13%** を観測(候補)。
- `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_AB_TEST_RESULTS.md`
- 専用 clean env 20-run 再テストでは **+0.54%NEUTRAL** → 昇格は見送り。
- `docs/analysis/PHASE5_E5_2_HEADER_WRITE_ONCE_RETEST_AB_TEST_RESULTS.md`
---
## Hypothesis

View File

@ -0,0 +1,76 @@
# Phase 5 E5-2: Header Write-Once — Promotion 判定用 指示書
**Status**: ✅ COMPLETE → ⚪ NEUTRAL昇格見送り
結果: `docs/analysis/PHASE5_E5_2_HEADER_WRITE_ONCE_RETEST_AB_TEST_RESULTS.md`
## 0. 背景
過去の E5-2 A/B では NEUTRAL だったが、Phase 13 v1 の 4点マトリクス再計測で
`HAKMEM_TINY_HEADER_WRITE_ONCE=1` 単体が **+1.13%** を記録し、GO候補になった。
参照:
- 旧結果: `docs/analysis/PHASE5_E5_2_HEADER_REFILL_ONCE_AB_TEST_RESULTS.md`
- 新観測: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_AB_TEST_RESULTS.md`
目的: **E5-2 を preset デフォルトへ昇格できるか**を “専用 A/B” で確定する。
---
## 1. A/B 手順clean env, 同一バイナリ)
推奨: Mixed 20-runmean/median を確度高めに取る)
### A: baselineWRITE_ONCE=0
```sh
RUNS=20 HAKMEM_TINY_HEADER_WRITE_ONCE=0 scripts/run_mixed_10_cleanenv.sh
```
### B: optimizedWRITE_ONCE=1
```sh
RUNS=20 HAKMEM_TINY_HEADER_WRITE_ONCE=1 scripts/run_mixed_10_cleanenv.sh
```
任意:
- `HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1` でも 5-run を 0/1 で取る(回帰がないこと)
---
## 2. 判定ゲート
- **GO**: Mixed 20-run mean **+1.0% 以上** かつ median も正
- **NO-GO**: mean **-1.0% 以下**
- **NEUTRAL**: それ以外±1.0%)→ research box 維持default OFF
---
## 3. GO の場合の昇格手順(小パッチ)
### Patch P1: preset 昇格
- `core/bench_profile.h`(対象プリセット)に追加:
- `bench_setenv_default("HAKMEM_TINY_HEADER_WRITE_ONCE", "1");`
最初は `MIXED_TINYV3_C7_SAFE` のみに昇格でよいC6-heavy は任意)。
### Patch P2: cleanenv スクリプト更新ENV 漏れ防止)
`scripts/run_mixed_10_cleanenv.sh` のデフォルト値を見直す:
- 昇格後は `HAKMEM_TINY_HEADER_WRITE_ONCE` を “研究 knob” 扱いしない
- 例: `export HAKMEM_TINY_HEADER_WRITE_ONCE=${HAKMEM_TINY_HEADER_WRITE_ONCE:-1}`
(既存の運用: export された値は bench_setenv_default が上書きできないため)
### Patch P3: ドキュメント更新
- 新しい再計測結果を 1 本にまとめる(例: `docs/analysis/PHASE5_E5_2_HEADER_REFILL_ONCE_RETEST_AB_TEST_RESULTS.md`
- `CURRENT_TASK.md` に “E5-2 ADOPT” の記録を追記
---
## 4. NO-GO/NEUTRAL の場合
- `HAKMEM_TINY_HEADER_WRITE_ONCE` は research box のままdefault OFF
- 旧結果との差分要因(ベースライン差 / env 漏れ / build 形状)をメモして凍結

View File

@ -0,0 +1,177 @@
# Phase 5 E5-2: Header Write-Once — 再テスト結果(昇格判定)
**Date**: 2025-12-14
**Verdict**: ⚪ **NEUTRAL (+0.54%)** — Research box 維持default OFF
背景: `docs/analysis/PHASE5_E5_2_HEADER_REFILL_ONCE_AB_TEST_RESULTS.md`
指示: `docs/analysis/PHASE5_E5_2_HEADER_WRITE_ONCE_PROMOTION_NEXT_INSTRUCTIONS.md`
---
## 1. 背景
Phase 13 v1 の 4点マトリクス A/B で `HAKMEM_TINY_HEADER_WRITE_ONCE=1` 単体が **+1.13%** を記録し、GO 候補として浮上したため、専用の clean env 20-run で昇格可否を判定。
参照: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_AB_TEST_RESULTS.md` (Case B)
---
## 2. テスト構成
- **Benchmark**: scripts/run_mixed_10_cleanenv.sh
- **Profile**: MIXED_TINYV3_C7_SAFE
- **Iterations**: 20,000,000 per run
- **Working set**: 400
- **Runs**: 20 per case
- **ENV**: `HAKMEM_TINY_C7_PRESERVE_HEADER=0` 固定C7 preserve は使用しない)
---
## 3. 結果20-run
| Case | WRITE_ONCE | Mean (ops/s) | Median (ops/s) | Delta vs A |
|------|------------|--------------|----------------|------------|
| A (baseline) | 0 | 51,096,839 | 51,127,725 | — |
| B (optimized) | 1 | 51,371,358 | 51,495,811 | **+0.54%** |
---
## 4. 判定
### 4.1 GO 条件
- Mean **+1.0%** 以上 かつ Median も正
- 今回: Mean +0.54%, Median +0.72%
### 4.2 Verdict
- **NEUTRAL (+0.54%)** → Research box 維持default OFF
- GO 閾値 (+1.0%) に到達せず
---
## 5. 考察
### 5.1 Phase 13 の 4点マトリクスとの差異
| Test | WRITE_ONCE=1 結果 | Runs | Baseline |
|------|-------------------|------|----------|
| Phase 13 (Case B) | **+1.13%** | 10 | 51,490,500 ops/s |
| 今回 (専用 20-run) | **+0.54%** | 20 | 51,096,839 ops/s |
**差分要因**:
1. **Baseline の揺らぎ**: Phase 13 の baseline (51.49M) vs 今回 (51.10M) で約 -0.76% の差
2. **測定回数**: 10-run vs 20-run20-run の方が信頼性が高い)
3. **ENV 汚染**: Phase 13 では 4 ケースを連続実行ENV リーク可能性)
### 5.2 Phase 5 E5-2 旧結果との比較
旧テスト(`PHASE5_E5_2_HEADER_REFILL_ONCE_AB_TEST_RESULTS.md`:
- 結果: +0.45% (NEUTRAL)
- 今回: +0.54% (NEUTRAL)
**一貫性**: 両テストとも NEUTRAL 範囲内で一貫
---
## 6. Next Actions
### 6.1 E5-2 の扱い
- ✅ Research box として維持default OFF、manual opt-in
- ENV: `HAKMEM_TINY_HEADER_WRITE_ONCE=0/1` (default: 0)
### 6.2 Phase 13 v1 の扱い
- ✅ Research box として維持default OFF
- ENV: `HAKMEM_TINY_C7_PRESERVE_HEADER=0/1` (default: 0)
### 6.3 次の最適化
Phase 12 Strategic Pause の gap 仮説リストに戻る:
1. ~~Header write tax~~ → Phase 13 v1 NEUTRAL, E5-2 NEUTRAL
2. **Pointer chase overhead** (次の候補)
3. Lock contention (if applicable)
4. Memory fence overhead
5. Metadata access patterns
---
## 7. Raw Data
### Case A (baseline, WRITE_ONCE=0)
```
Run 1: 50725850 ops/s
Run 2: 51547217 ops/s
Run 3: 51076712 ops/s
Run 4: 51527474 ops/s
Run 5: 51193070 ops/s
Run 6: 51597708 ops/s
Run 7: 52239171 ops/s
Run 8: 52386008 ops/s
Run 9: 51618321 ops/s
Run 10: 50919588 ops/s
Run 11: 52415403 ops/s
Run 12: 51125404 ops/s
Run 13: 49785086 ops/s
Run 14: 50915858 ops/s
Run 15: 51130046 ops/s
Run 16: 48960162 ops/s
Run 17: 51385756 ops/s
Run 18: 50849945 ops/s
Run 19: 50550500 ops/s
Run 20: 49987500 ops/s
Mean: 51096838.95 ops/s
Median: 51127725.00 ops/s
```
### Case B (optimized, WRITE_ONCE=1)
```
Run 1: 51594697 ops/s
Run 2: 50145581 ops/s
Run 3: 52268972 ops/s
Run 4: 52083686 ops/s
Run 5: 50612405 ops/s
Run 6: 50556552 ops/s
Run 7: 49910193 ops/s
Run 8: 52657108 ops/s
Run 9: 52053748 ops/s
Run 10: 51957521 ops/s
Run 11: 52417281 ops/s
Run 12: 51712162 ops/s
Run 13: 51531743 ops/s
Run 14: 50832685 ops/s
Run 15: 51337254 ops/s
Run 16: 51218309 ops/s
Run 17: 50110155 ops/s
Run 18: 51459878 ops/s
Run 19: 51931080 ops/s
Run 20: 51036152 ops/s
Mean: 51371358.10 ops/s
Median: 51495810.50 ops/s
```
---
## 8. Rollback 手順
Phase 5 E5-2 は ENV-gated で default OFF。Rollback 不要。
手動で無効化する場合:
```sh
export HAKMEM_TINY_HEADER_WRITE_ONCE=0
```
---
## 9. まとめ
Phase 5 E5-2 (Header Write-Once) は 20-run 再テストで **+0.54% (NEUTRAL)** を記録。
- GO 閾値 (+1.0%) に到達せず
- Research box として維持default OFF、manual opt-in
- Phase 13 v1 も同様に research box 維持
次のステップ: Phase 12 Strategic Pause の次の gap 仮説に進む