# 開発進捗ログ

<!--
本ファイルは追記型のフル進捗ログ．

- 最新エントリは下に追記する（時系列順．古いものが上，新しいものが下）
- CLAUDE.md の「開発進捗」セクションは最新 1 行のみ（上書き運用）
- 詳細・失敗パターン・設計判断はすべて本ファイルに残す
- 書式・運用ルールは docs/01_GUIDE/GUIDE_05_エージェント運用ルール.md
  「進捗記録の運用ルール（CLAUDE.md / PROGRESS.md）」を参照
-->

> 以下は 2026-06-25 のテンプレート同期（進捗ログ 2 段構成への移行）に伴い，CLAUDE.md「開発進捗」セクションに蓄積していた `補足:` ログを移行したもの．**移行時点の文面をそのまま保持**している（古い記述・関数名等も歴史的記録として保持．今後の新規エントリは GUIDE_05 の書式に従い，`git log` で取れる詳細は書かない）．

## フェーズ 7（実装）— Step 8 基準設計キャリブレーション

現在の進捗（移行時点）: フェーズ 7（実装）— Step 1〜7 完了，Step 8（基準設計キャリブレーション）進行中．

Step 8 進捗（初期サマリ）: spp 校正（128→1024、ノイズ/物理差を切り分け）→ 反射率スイープ（0.75〜0.92、弱い二次レバーと判明）→ **手法訂正**: シミュ linear と実測 sRGB を直接突合していた交絡を発見．標準 sRGB OETF 順方向適用＋実測 mean アンカーで見かけ差の **約 2/3 が符号化ドメイン不一致**だったと判明．寄与順は OETF（最大）＞ ISP レンズシェーディング（残差主因候補）＞ 反射率（小）．残差 1.6〜1.9 倍は調整せず正直に保持．副次: max_depth=8 は勾配を過大評価（キャリブは depth≥12）．→ **OETF 順方向適用を sm-evaluate へ正規実装完了**（`evaluation/oetf.py` + `EvaluationConfig.oetf`、baseline 有効化・real 非適用、後方互換、参照実装と数値一致テスト済み）．[SPEC_03「キャリブレーション経過」参照](04_SPEC/SPEC_03_基準設計の物理構成.md)．

### 時系列ログ（古い順 → 新しい順）

- **3D ビュー改善**: 内部キャリブ調整は一旦中断し、**シミュ結果の見せ方（3D ビュー）改善**を実施．評価板実レンダ投影 → **path ベイク（`baker.py` mode="path"、多重反射込み per-face、scalar_rgb）** 追加 → 全メッシュ統一着色（共有 lit-clim・log・単一カラーバー）を既定化、`--render` は任意のテクスチャ投影オプション（評価板 E=π·L/ρ で同一スケール）、`--bake-cache` で 1 回計算→以後即時、`--opacity`/`--hide-below`/`--bake-smooth`/`--bake-scale` を追加．さらに **path ベイク max_depth を render 設定から独立（`--bake-max-depth`、既定 16）**＝後段多重反射を積分、**幾何カリング（`--cull-outward` 既定 ON、外向き ≈0 面を非描画）**＝暗殻の濁り/見かけ段差を解消、マーカー個別非表示フラグ、を追加．実装完了．
  - 既知の制約（受容済み）: per-face ベイクはメッシュ境界の継ぎ目・粗メッシュのブロック感・低 samples の MC ノイズ・scalar_rgb の遅さ（高 samples 非現実的）あり．精細な評価は 2D `sm-evaluate` で行う（不変）．隣接内壁の見かけ段差は調査の結果「外向き ≈0 面の混在」が主因と判明＝幾何カリングで解消（内壁照度自体は物理どおりほぼ均一）．
  - 次のアクション（別タスク）: シーム/粒状感の解消には全メッシュ UV 統合＋シームレスライトマップベイク（別プロジェクト規模）．必要時に別途 `/implement`．path ベイク高速化（wavefront/GPU）も別タスク．
- **実機搭載 LED の物性確定**（LED Paradise LP-2835D90VW / Ra98 SunLightLED 2835 4000K、Vf 3.1V・If 60mA・Φv 16–19 lm @60mA・配光角 120°・規格通り 60mA 駆動前提）．規格値から独立推定した radiance ≈ 2030 W/(m²·sr) は現状校正値 2807 と 1.38× 差で、反射率 0.85→0.89 への調整で物理範囲内に説明可能．既知差分 #3（LED 実 W 値未検証）クローズ．**形状指標への影響なし**（線形ゲイン）．配光は厳密 Lambertian 仮定継続（詳細 IES 未提供、実 SMD 2835 のやや前方凸性は ISP LSC と打ち消し合う近似として現状妥当）．詳細: [SPEC_03 LED セクション](04_SPEC/SPEC_03_基準設計の物理構成.md#led光源)．
- **輝度マップ「形」の追跡を導入**（[TEST_03 輝度マップ形状追跡](06_TEST/TEST_03_輝度マップ形状追跡.md) + `scripts/build_luminance_evolution_panel.py`）．重要な発見: **これまでの全 7 改善ステップ (8-1〜8-7) で輝度マップの「形」は全く変わっていない**．OETF は単調変換で形を変えず，発光面サイズ変更も形を変えない．**実機は中央付近にピークを持つ楕円状，シミュは下端のみ明の Y 軸単調勾配**．**LSC モデル化は「数値残差縮小」と「形の構造的改善」の両方を担う唯一の改善候補**．以後の改善判断は「数値 + 形」の 2 軸で行う．
- **Step 8-8 完了**: linear 評価モードに mean 揃え正規化を導入（`evaluation/normalize.py` の `apply_mean_anchor` + `EvaluationConfig.normalization` スキーマ + CLI 統合 + OETF 排他バリデーション）．OETF 露出アンカー（Step 8-3）と同じ思想を linear ドメインに対称展開．`configs/eval_baseline_linear.yaml` で有効化（target_mean=146.7146）．形状指標 (CoV/勾配/C/P/max-min) は厳密不変，mean のみ target_mean に揃う．動作確認: α=0.961934 で baseline luminance.npy が mean=146.7146, CoV=0.182577 で評価可能．
- **Step 8-9 完了**: LED 18 個の位置を Fusion 360 設計 STL (`configs/meshes/SmTIASv3.stl`) から抽出して `scene_baseline.yaml` を更新．`scripts/extract_led_positions_from_stl.py` で連結成分分割→ LED/カバー識別→ bottom/right/left 自動命名．主な変更: 下基板 LED 配置を「等間隔 8.7mm」→「3+ギャップ+3 (4.2mm+10.8mm+4.2mm)」へ訂正（実機写真の中央電流制限抵抗 2 個と整合）．左右基板も実位置に修正．**形状指標は ~1% 以内のほぼ不変**（多重反射が支配的，LED 数 mm 誤差は ROI 上で平滑化）．絶対 mean は +10% 増加（α 値 0.962→0.873）．既知差分 #2 をクローズ．TEST_03 比較パネルに Step 8-9 を追加（5 枚並列）．
- **LED 基板カバーを 3 枚構成に展開**: 従来は下基板用 `LED基板カバー.stl` 1 枚のみだったが，`scripts/extract_led_positions_from_stl.py --export-covers configs/meshes/` で SmTIASv3.stl から `LED基板カバー下/右/左.stl` の 3 ファイルを書き出し，`scene_baseline.yaml` の geometry を `led_cover_bottom/right/left` の 3 メッシュエントリに展開．右・左基板の LED が「カバーなしで浮く」状態を解消．多重反射計算への影響は軽微だが物理的に正確．
- **Step 8-10 完了**: LED 配光を `spot` emitter (cutoff=90°/beam=30°，FWHM 120° 一致，flux 保存 I_0=0.026784 W/sr) で表現する試行．`SpotLight` クラスを `schema.py` に追加，`lights.py` に spot 分岐実装，`configs/scene_baseline_spot.yaml` を並列保持．**目視で X 方向の対称性が部分改善**（下端の明るい領域が中央寄りに集中）だが，数値指標は微悪化（CoV +4%, 勾配 +15%）．LED 指向性は形の一部（X 方向）を変えるが，Y 方向の中央ピークは LSC モデル化（Step 8-N）が必要．本格採用は LSC との組み合わせ評価後に判断．付随発見: spot で mean が 14.6× 暗くなる（理由は spot falloff 関数の cos vs 角度ドメイン smoothstep の解釈差等を仮説）．
- **Step 8-11 完了**: データシート LP-2835D90VW 準拠の照明モデルを統合．`configs/scene_baseline_datasheet.yaml` に並列保持．spot を cos^1.2 相当の前方凸 (cutoff=85°/beam=26.72°，FWHM 111.72°) に詳細化 + 反射率を Step 8-6 で導出した物理整合点 0.89 に変更 + I_0 を規格値 Φv=17.5 lm から導出 (I_0=0.021951 W/sr)．**形は依然 Y 軸単調勾配**で Step 8-10 と Step 8-9 の中間値．**データシート従順度を上げても形は実機に近づかない**ことを確定．副次的に「規格値だけで mean を実機に合わせることはできず，校正値には他のレバーの累積吸収が含まれる」が再確認された．本筋 LSC モデル化が依然必要．
- **Step 8-12 完了**: Helmholtz 相反原理を Mitsuba 上で実証検証．`schema.py` の RenderConfig に `ptracer` integrator を追加，`configs/scene_baseline_perspective_{path,ptracer}.yaml` で perspective sensor + scalar_rgb + spp=4096 で比較．**bot/top 比が path 2.035 vs ptracer 2.006 で誤差 1.4% で一致**＝形は方向独立．絶対値は Mitsuba 実装の正規化差で 1.99× 違うが形（空間パターン）は同じ．副次的発見: **orthographic + ptracer は Mitsuba 3 では実行不能**（`Endpoint::sample_direction()` 未実装）．これにより「方向変更で形を実機に近づける道は無い」が確定し，**LSC モデル化が唯一の道**である結論が強化された．
  - 次のアクション（キャリブ再開時，当時の方針）: 残差に **LSC（ISP レンズシェーディング）順方向モデル**を当てる（物理動機づけ低自由度形、overfitting 回避・取得パラメータ数明記）．※後の Step 8-13 で本方針は不採用に確定（下記）．
- **速度最適化ワーク開始**（キャリブ作業を一旦中断）: [TEST_04 シミュレーション速度最適化履歴](06_TEST/TEST_04_シミュレーション速度最適化履歴.md) に試行を集約．**Speed-0 ベースライン計測完了**（`configs/scene_baseline.yaml`，3 回中央値）: **B1 sm-render = 507.86 s（≈8.46 分）/ B2 sm-visualize path bake (samples=16) = 55.97 s**．**副次発見**: `DRJIT_LIBLLVM_PATH` 環境変数の消失で sm-render が ImportError でクラッシュしていたことを発見．`C:\Program Files\LLVM\bin\LLVM-C.dll` を発見し **User scope に永続化**して復旧．sm-visualize の direct bake は内部 scalar_rgb 固定のため過去ログでも警告は出ていたが完走していた．**方向修正**: Speed-1 当初の「JIT 有効化で高速化」は既に JIT 経路に乗っているため不成立 → 「LLVM-C.dll 自動検出と診断ログ」に再定義（再発防止）．**本命の高速化レバーは Speed-2 path bake wavefront 化**（10× 以上見込み）．GPU は Intel HD Graphics 520 のみで CUDA 不可，CPU 側完結方針．精度（spp/max_depth）は不変．
- **Speed-1 完了**: `src/sm_tias_lightsim/runtime/llvm_init.py` に `ensure_drjit_libllvm_path()`（標準パス自動探索→ `os.environ` 設定）と `log_variant_status()`（llvm_/cuda_/scalar_ 経路を INFO 明示，要求 llvm_* で実 scalar_* なら WARNING 追加）を新規実装．`render/runner.py` で variant=llvm_* 時に自動検出を呼び、`ImportError` 時は原因明示ログ→ re-raise．`visualize/baker.py` でも `log_variant_status` 呼び出し追加＋ Speed-2 wavefront 化用に LLVM 自動探索の分岐を先取り．`cli/render.py` で import 順を制御．`docs/02_ENV/ENV_02_環境構築手順.md` に LLVM インストール手順・DRJIT_LIBLLVM_PATH 説明・動作確認コマンドを追記．**速度は不変**（コード経路同等）．数値同等性: SHA256 は MC 内部シードで異なるが平均相対誤差 7.23e-05 で統計同等性パス．これで「環境変数が消えて沈黙クラッシュ」する事故が再発しない土台が整備された．
- **速度最適化ワーク一旦中断**（Speed-2 path bake wavefront 化は未着手）: **実時間の改善は実質ゼロ**（B1=508s／B2=56s で不変）．副次的成果として環境破綻問題の発見と恒久対処，JIT 診断ログ，ベンチ条件のドキュメント，テスト追加が得られた．中断理由: B2 は現状ボトルネックではなく，B1 は CPU 完結・精度据置の制約下で取れる打ち手が限定的．本筋のキャリブ作業（LSC モデル化）に戻ることがプロジェクト目的により近い．再開条件: path bake samples を増やすユースケース発生／NVIDIA GPU 利用可／クラウド計算活用判断／キャリブ反復回数増加でバッチ時間が研究進度を圧迫した場合．詳細・Speed-2 テンプレ保持は [TEST_04 中断記録](06_TEST/TEST_04_シミュレーション速度最適化履歴.md#中断記録-suspension-note--2026-05-28) 参照．
- **キャリブ方針の根本見直し（2026-05-28）**: 「シミュ vs 実機 PNG の比較」を再検討した結果，**実機 PNG 自体が定量データとして揺らいでいる**ことが判明．MiniTIAS の現行撮影は AE/AWB/NR/EDGE/TONEMAP/SHADING がすべて Camera2 API のオート/デフォルトで，撮影ごとに露光・WB・補正量が変動する．既存 baseline `MiniTIAS_20260408_144434` もこのモードで取得されており，シミュ側でいくらモデルを精緻化しても比較対象が不安定．**当初考えていた「LSC モデル化」より上位の問題**として「**定量撮影モード**」を MiniTIAS 側に追加することを優先する．Android Camera2 API には `STATISTICS_LENS_SHADING_CORRECTION_MAP`・`SHADING_MODE=OFF`・`MANUAL_SENSOR`/`MANUAL_POST_PROCESSING` 能力フラグが存在し，これらを活用すれば「ISP 介入を最小化した再現性ある撮影」が可能．要求仕様を [TECH_01](05_TECH/TECH_01_定量撮影モード要求仕様.md) に，ハンドオフ手順を [TECH_02](05_TECH/TECH_02_MiniTIAS引き継ぎ手順.md) に新規作成．データ受け渡しは `reference_measurement/quantitative/` 配下（gitignore 対象）．SmTIAS-LightSim 側のキャリブ作業は本仕様書を MiniTIAS に渡した時点で一旦停止．
- **MiniTIAS 側で定量モード実装完了（2026-06-01）**: [TECH_03](05_TECH/TECH_03_定量モード実装報告とSHADING_MODE相談.md) と [TECH_04](05_TECH/TECH_04_MiniTIASへの回答.md) を取り込み．**AQUOS sense3 (SH-02M) は `LEVEL_3`（最上位）でハードウェア能力フル**．Phase 1〜5 全完了で **DNG (RAW_SENSOR) 経路を第 1 優先採用**．撮影設定: 1/60s + ISO 40 + AWB/NR/EDGE/AF/AE OFF + TONEMAP 線形 + BLACK_LEVEL_LOCK + SHADING_MODE=HIGH_QUALITY (★) + STATISTICS_LENS_SHADING_MAP_MODE=ON．LSC マップは 13×17．保存ファイルは `MiniTIAS_QM_*.{dng, meta.json, preview.jpg}` 3 種．**SHADING_MODE 判断**: HIGH_QUALITY を本流維持（Mitsuba orthographic 出力 ≒「ISP が完璧に補正できた場合の理想値」で HIGH_QUALITY DNG と直接比較が物理整合）．OFF 切替は将来のフォールバック条件 C1-C3 発動時のみ．データ転送は **adb pull 推奨**．既存実機 PNG の Y' 抽出は BT.601 係数（Rec.709 ではない）も判明．
- **作業フェーズを A/B に分割（2026-06-01）**: 「連射再現性が確保できてもシミュとの対応が取れなければ意味が薄い」という研究上の判断から，**フェーズ A: 1 ショット撮影でシミュ vs 実機対応を先に検証** → **フェーズ B: 対応が取れたら連射 V1 再現性検証**の二段階方式に変更．フェーズ A で MiniTIAS 側に依頼するのは **画素統計・Hot pixel map（高優先 2 件）と白板 1 ショット試し撮りのみ**．**連射 UI は高優先→フェーズ B に降格**．SmTIAS-LightSim 側は DNG/meta.json/LSC マップ読み込み I/F・新規 baseline config を実装し，1 ショット突合で既存通常モード baseline 残差 2.1× が定量モードで変化するかを観察．[TEST_01](06_TEST/TEST_01_キャリブレーション検証履歴.md) に **Step 8-13** として記録．
- **DNG 対応を MiniTias-Evaluation 側にも依頼（2026-06-01）**: PNG から DNG への撮影フォーマット変更に伴い，MiniTias-Evaluation も実機データの一次窓口として DNG 読み込み I/F の追加が必要．既存パターン（`uniformity.py` を MiniTias-Evaluation から SmTIAS-LightSim にコピー）を踏襲する役割分担を採用：**MiniTias-Evaluation 側で正規実装 → SmTIAS-LightSim 側にコピー**．[TECH_05](05_TECH/TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) に要求書を作成．既存 PNG 経路と並列対応（後方互換）．依存追加: `rawpy>=0.21.0`．
- **MiniTias-Evaluation 側 Phase 1 完了とハンドオフ受領（2026-06-01）**: TECH_05 Phase 1 (DNG 読み込み I/F) と LSC 順適用プロトタイプ・新指標 (動径 min/max 比) が完成．受領記録は [TECH_06](05_TECH/TECH_06_MiniTias-Evaluation引き継ぎ受領.md)，関連分析は [TEST_05](06_TEST/TEST_05_PNG_DNG評価比較.md) と [TEST_06](06_TEST/TEST_06_外乱光影響評価.md)．**5 つの重要発見**: (1) **TECH_05 の `apply_lsc_inverse` は誤り**（DNG は LSC 未補正で逆ではなく順方向適用が正しい．TECH_05 §4 を訂正済）．(2) **過去 Step 8 キャリブの残差 2.1× はドメイン不一致**：正しい linear 比較では DNG linear+LSC 0.0689 vs シミュ linear 0.183 = **真の残差 2.66×**．(3) **新実機ターゲット = `MiniTIAS_QM_20260601_124500`（暗闇撮影）**: CoV=0.0695, 勾配=8.35%, 中心/周辺=1.0911, 動径 min/max=0.860．Step 8-13 以降の正規 baseline．(4) **外乱光ロバスト確認**: 室内灯 ON/OFF で指標差 < 1%．SmTIAS 自前照明が支配的で外乱光モデル化不要．(5) **新指標 `calc_radial_min_max_ratio`** を追加．
- **S2 完了 (2026-06-01)**: `src/sm_tias_lightsim/evaluation/dng_loader.py` を `handoff_smtias_lightsim/src/dng_loader.py` の完全コピーで新規作成．`radial.py` に `calc_radial_min_max_ratio` をマージ追加 (nan ビン除外を移植時に補強)．`pyproject.toml` に `rawpy>=0.21.0` 追加 (実 rawpy==0.27.0)．**検証 V4 が完全一致**: 実 DNG を読み込んで LSC 順方向適用 + 白板 ROI で評価指標 6 件が相対誤差 < 1e-6 で期待値完全一致，空間指標 3 件も絶対誤差 < 0.003．Refactorer 判断: `dng_loader.py` 内部の `_apply_srgb_oetf` は既存 `oetf.py:apply_srgb_oetf` と実装重複だが「コピー方針優先」「用途が異なる」「違反基準未満」でそのまま放置．
- **S3 方針見直しと Step D 完了 (2026-06-01)**: ユーザー指摘により「sm-evaluate に DNG 入力経路を追加する」当初案は **不採用**（実機 DNG 評価は MiniTias-Evaluation の本業で完結，重複実装不要）．S3 を **3 項目に絞り込み**: Step D (動径 min/max 比を sm-evaluate に統合)・Step C' (新規シミュ用 baseline config)・Step G (シミュ再評価 → Step 8-13 記録)．**Step D 完了**: `MetricsConfig.radial_min_max` をスキーマ追加，`cli/evaluate.py` で `_run_radial_min_max` を追加して metrics.csv に 4 列追加，コンソールサマリに 2 行追加．`radial_profile` を再利用（重複算出回避）．後方互換維持．SPEC_04 §動径 min/max 比 を追記．
- **Step C' 完了と Step G 計測 (2026-06-02)**: `configs/eval_baseline_dng_target.yaml` を新規作成（eval_baseline_linear.yaml ベース，target_mean=207.82，radial_min_max=true，OETF なし）．Step 8-13 数値: シミュ CoV=0.1826, 勾配=24.65%, 中心/周辺=1.3271, 動径 min/max=0.6151．実機 DNG+LSC (CoV=0.0695, 勾配=8.35%, C/P=1.0911, 動径 min/max=0.860) と比較して **残差 2.63×**（TECH_06 予想「真の残差 2.66×」とほぼ一致）．過去 Step 8-3 の「2.1×」は PNG sRGB ガンマ圧縮による楽観値．**LSC 取り扱いの結論を [TECH_07](05_TECH/TECH_07_LSC取り扱い方針.md) に一元化**: 3 プロジェクト役割分担 (MiniTias=HIGH_QUALITY 撮影 / MiniTias-Evaluation=lscMap 順方向適用 / SmTIAS-LightSim=一切扱わない)，シミュ側で LSC を扱わない物理的根拠 (Mitsuba orthographic = LSC 完璧補正後相当)，代替案 3 つ全却下，フォールバック条件 C1-C3，残差解釈 を明文化．
- **実機変更とシミュ側対応の整合マッピングを明文化 (2026-06-02)**: [TECH_08](05_TECH/TECH_08_実機変更とシミュ側対応.md) として作成．実機側 8 項目変更に対するシミュ側 3 層 (Mitsuba シーン定義 α / sm-render β / sm-evaluate γ) の対応をマッピング．**結論: シミュ側で実際に対応が必要だったのは sm-evaluate の config レベルでの OETF 無効化 (#4) と mean アンカー調整 (#3) の 2 項目のみで，他はすべて対応不要 (Mitsuba は per-channel 独立計算で AWB/AE/NR/EDGE 概念なし，orthographic で LSC 自然対応)**．計 15 項目以上で網羅チェック．**残差 2.63× は ISP 関連の対応漏れではなく，シミュ物理モデル誤差 (反射率精度・LED 配光モデル・メッシュ幾何精度等) が主因**と推定．
  - 補足: **「対応不要」を 2 タイプに細分化** (TECH_08 §許容している構造的差異)．**タイプ I (本質構造同一・対応概念なし)** = AWB/NR/EDGE/LSC 等，**タイプ II (構造的差異あり・白板で許容)** = AF (焦点モデル)/絞り口径食/ピクセル積分/センサノイズ/QE 波長依存/シャッター方式/温度依存．特に AF は実機 perspective+固定焦点 vs シミュ orthographic 無限遠相当という構造的違い．白板撮影では影響軽微で許容．舌模型評価時や残差精緻化フェーズで再評価対象．
- **S3 全体完結 — TEST_01 に Step 8-13 正式記録 + handoff 整理 (2026-06-02)**: [TEST_01 §Step 8-13](06_TEST/TEST_01_キャリブレーション検証履歴.md) に新方針 (実機 DNG+LSC linear) でのシミュ突合を正式記録．俯瞰サマリ表に新ターゲット (CoV=0.0695) と Step 8-13 結果 (CoV=0.1826, 残差 2.63×) を追加．§Step 8-N 候補 (LSC 順方向モデル) を「不採用 — Step 8-13 で方針確定」に更新（歴史的記録として保持）．`handoff_smtias_lightsim/` は整理: 参考スクリプト `run_uniformity_dng.py` のみ `reference_measurement/quantitative/reference_scripts/` に移動，他は取り込み済みのため削除．
- **LED データシート調査結果を [TECH_09](05_TECH/TECH_09_LEDデータシート調査結果.md) として明文化 (2026-06-02)**: **OEM 元 HONGLITRONIC (広州，鸿利智汇集团) のデータシートが存在**することが判明．LED Paradise LP-2835D90VW は HONGLITRONIC HL-A-2835D90VW シリーズ (PDF: lcsc.com/datasheet/C5362368.pdf) の OEM 再販品．**配光図から数値読み取り: ほぼ厳密 Lambertian (cos θ) と一致** (0°→1.0, 30°→0.87, 60°→0.50, 80°→0.15, 90°→0)．**重要な含意**: (1) 現状の area light Lambertian モデルはデータシート実測と整合．配光モデル精緻化余地は限定的．(2) **過去 Step 8-11「データシート従順版」(cos^1.2) は実態はデータシート不整合**だった (同等品の典型配光を借用)．道理で形状指標が悪化．(3) **Step 8-14 候補 B (LED 配光詳細化) の意義は限定的**．SPEC_03 の「やや前方凸」記述は訂正対象．取得 PDF は REFERENCE/datasheets/ に配置 (gitignore 対象)．
- **docs/05_TECH と docs/06_TEST に README 追加 (2026-06-02)**: 15 ファイルがフラットに並んで散らかり感があるため，性質分類と navigation を README で提供．05_TECH/README: 🟢 現状方針 (TECH_07-09) と 🔵 議論の経緯 (TECH_01-06)．06_TEST/README: 🟡 中核 (TEST_01-03) と 🔵 クローズ済み (TEST_04) と 📋 外部スナップショット (TEST_05/06)．ファイル削除・移動はせずナビゲーションのみ追加．
- **残差 2.63× の主因候補を [TECH_10](05_TECH/TECH_10_残差主因候補の網羅整理.md) として網羅整理 (2026-06-02)**: Step 8-14 候補選定の判断材料．5 カテゴリ 18 項目を網羅．当初の優先度評価: 🥇 A1 内壁の非 Lambertian 性 / 🥈 A8 反射率 R=0.85→0.89 / 🥉 A9 max_depth 8→16+．（※その後の検証で優先度は更新．下記参照）
- **Step 8-14 候補 γ (D1 ROI 整合の再確認) 完了 — クリア (2026-06-02)**: 設定変更ゼロ，既存設定の数値検証のみ．シミュ ROI (24, 37, 464, 450) の物理範囲 (幅 90.63×91.41 mm) と実機 ROI (539, 1015, 1400, 1409) の物理範囲 (物理分解能 0.0654 mm/px → 幅 91.54×92.13 mm) を比較した結果，**物理サイズ差 < 1%・中心位置差 < 1 mm で整合**．3 列パネル `output/_slide_panels/roi_alignment_check.png` でも視覚確認．**残差 2.63× の主因は ROI 整合ではない**ことが確定．副次発見: 評価板は実機画像中央から下方向に約 4.2 mm (65 px) オフセット配置だが ROI もそのオフセットに沿って選択されているため物理領域として整合．
- **Step 8-14 候補 β (A1 内壁の非 Lambertian 性) 完了 — クリア (2026-06-02)**: 候補 🥇 1 位だった A1 を 3×3 グリッド感度分析で検証．スキーマ拡張 (`BlendBSDFConfig` + `RoughConductorBSDFConfig`，`MaterialConfig` Union 拡張，forward reference + `model_rebuild()`) と `materials.py` 再帰変換 (`_build_bsdf_dict`) を新規実装．テンプレ `configs/scene_baseline_blend.yaml` + `scripts/sweep_blend_bsdf.py` + `scripts/build_blend_bsdf_panel.py`．**weight ∈ {0.05, 0.15, 0.30} × α ∈ {0.1, 0.3, 0.6} の 9 ジョブ実走 (75.5 分)**．結果: ベースライン純 diffuse (CoV=0.1826) と比較して **全 9 パターンが悪化または不変**．実機 (CoV=0.0695) 方向と **逆方向に動く**．「形」は w=0.30 で下端中央に specular 集中スポット顕在化．物理的解釈: 純 Lambertian は cos 重み散乱で多重反射の均一化作用が最大．specular 成分は光を集中させ均一化を阻害．**3D プリンタ白フィラメントは完全 Lambertian として扱うのが実機挙動に近い近似**と判明．**A1 は残差 2.63× の主因ではない**ことが確定．副次成果: スキーマ層に `blendbsdf` + `roughconductor` のサポートが入り再利用可能．
- **LED グループ別 sanity check 完了 — TEST_07 として報告 (2026-06-03)**: 「シミュが下/右/左の 3 LED 基板を物理位置どおりに独立にモデル化できているか」の基礎健全性確認．`scripts/sanity_led_groups.py` で各基板の 6 LED だけを ON にした一時 YAML を生成 → 3 ジョブ sm-render (約 25 分) → 比較パネル．結果: **方向性 ✓** (bottom は下端中央/right は右側面寄り/left は左側面寄り)，**左右対称性 ✓** (right mean=47.10 vs left mean=47.08)，**量的バランスは bottom が right/left の 2.10× で強い**．物理的説明: bottom LED は評価板下端真下に X 中央寄り集中で直接光が広範囲 / right/left LED は側面外側 Y 中央付近に分散で中央は多重反射経由．**線形性検証は別途未実施**（既存 `output/baseline/luminance.npy` が Step 8-1 時点の古いもの．Mitsuba は理論線形なので baseline 再生成で一致見込み）．副次発見: 実機の right/left は **完全な左右対称設計ではない**（Fusion STL 実位置と整合）．[TEST_07](06_TEST/TEST_07_LEDグループ別動作確認.md) 参照．
- **scene_baseline.yaml の max_depth を 8 → 16 へ更新 (2026-06-03)**: Step 8-14 候補 α 前半の結論「d=16 が実用収束点」を反映．SPEC_03 既知差分 #6 (未対処の max_depth=8) を解消．SPEC_03 の関連 4 箇所を一括更新．影響: 今後の sm-render は自動的に d=16 で実行され理論累積 92.6% を取り込む．計算時間は約 2× (8.5 分 → 17 分) に増加するが形状指標 4 つすべてが d=8 時代より実機方向に改善 (CoV 0.1817 → 0.1604, 勾配 24.01% → 20.59%)．
- **Step 8-14 候補 ξ (A2/A3 LED 配光 cutoff スイープ) 完了 — 配光が形改善の本物の候補として初実証 (2026-06-03)**: ユーザー要請「配光条件を変えてどのような変化が起こるかの実験（データシートに合わせる必要なし）」に基づき，`scripts/sweep_led_distribution.py` で spot emitter の cutoff_angle を {30°, 60°, 90°, 120°, 150°} で 5 値スイープ (beam_width = cutoff/3，max_depth=16，約 85 分)．**重要な 2 つの発見**: ① **「area light → spot」のステップが本質的** — area (Lambertian) の angular_ratio=0.4536 → spot (どの cutoff でも) 0.34〜0.36 へ **25% 大幅低下** (実機方向)．② **cutoff スイープ内 (30°→150°) では effect 限定的** — angular_ratio は +0.018 のみ．**A8 と真逆のパターン**: 数値悪化 (CoV +3〜11%) するが形改善 (angular_ratio -25%)．「数値の偽物の一致」(A8) と対をなす「形改善の本物の候補」初実証．物理的解釈: spot は +Z 方向にしか光を出さない → 内壁に当たる成分減・直接光増 → LED 直下の明点 → 半径方向ばらつき支配 (angular_ratio 減)．area は半球全方向拡散で多重反射 ambient 支配 → Y 軸勾配．副次発見: 数値最良点 (cutoff=90°) と形最良点 (cutoff=30°) が異なる→キャリブの優先順位議論を明確化．**TECH_10 優先順位を再更新**: A2/A3/ξ を「形改善候補」へ昇格．
- **Step 8-14 候補 α 後半 (A8 反射率スイープ) 完了 — 数値改善のみ・形は逆効果 / 「数値の偽物の一致」の初の定量実証 (2026-06-03)**: `scripts/sweep_reflectance.py` で d=16 新基準のもと R ∈ {0.75, 0.80, 0.85, 0.89, 0.92} を 5 値スイープ．新指標 (shape_metrics) を初めて感度分析に投入．結果: 既存 4 指標 (CoV/勾配/C/P/動径 min/max) は単調改善 (R=0.75→0.92 で CoV 0.186→0.142 で残差 24% 縮小) するが，**新指標 angular_ratio は 0.408→0.494 で実機方向と逆に増加**．実機は中央ピーク楕円 (同心円的) なので **形は実機から遠ざかる**．物理的解釈: R 上昇で ambient 増 → 半径方向の偏りは圧縮されるが角度方向ばらつきは相対的に圧縮されにくい → angular_ratio 増加．**形改善の本筋は B1 筐体幾何精度に最終確定**（A1/A8/A9 すべてクリア済で構造的再配分系のみ残る）．副次発見: R=0.85 の CoV=0.1604 が max_depth スイープ d=16 と完全一致．新指標を導入していなければ気づけない発見で，形状指標見直し (TECH_11) の正当性が定量データで裏付けられた．
- **Step 8-14 候補 α 前半 (A9 max_depth スイープ) 完了 — 数値改善のみクリア・形不変 (2026-06-03)**: ユーザー仮説「現状 d=8 では 0.85^8≈0.27 で取りこぼし大」を 5 値スイープ {8, 12, 16, 20, 28} で検証 (`scripts/sweep_max_depth.py` 約 85 分 + `scripts/build_max_depth_panel.py`)．結果: 全 4 形状指標が **単調に実機方向に改善** (d=8→28 で CoV 0.1817→0.1583 で残差 20.9% 縮小)．mean は 207.82 で固定．**実用的な収束は d=16 で達成** (d=16→28 で CoV 1.3% のみ)．**「形」は完全に不変** (Y 軸単調勾配のまま contrast が緩むだけ)．物理的解釈: 多重反射は **空間的に均一な ambient 成分**で，足しても暗/明の絶対差は縮むが空間配置は不変．「LED が下にしかない」配置の非対称性は除去不能．**ユーザー仮説の評価**: 方向性は正しい (21-28% 残差縮小) だが実用収束は d=16，実機 (CoV=0.0695) には届かず残差は形改善で詰める必要．新キャリブベースライン: **d=16**．
- **形状指標の本質的見直しと新指標導入 (2026-06-03)**: 「数値が実機方向に動いても形は変わらない」が続けて確定したため，ユーザー指摘「現状 4 指標は不均一性の絶対量しか測れず，Y 軸単調勾配と中央ピーク楕円を構造的に区別できない」に対応する **形を直接評価する 5 指標** を追加実装．`src/sm_tias_lightsim/evaluation/shape_metrics.py` (新規): `calc_intensity_centroid` / `calc_angular_radial_decomposition` (angular_ratio: 0=同心円, 1=方向依存) / `calc_ssim` (scikit-image 依存) / `calc_ncc` / `calc_intensity_pca` の純関数 5 つ．`MetricsConfig` に `shape_metrics` / `shape_reference` を追加（後方互換）．`configs/eval_baseline_dng_target_shape.yaml` を新規作成．`pyproject.toml` に `scikit-image>=0.21.0` を追加．[TECH_11](05_TECH/TECH_11_形状指標の見直しと新指標導入.md) で背景・計算式・予想値・遡及的注記を記録．今後の評価方針: **数値指標 4 + 形指標 5 + 視覚比較の 3 軸評価**で「数値改善のみで形が変わらない候補」と「形を変えうる候補」を明確に区別する．
