# 開発進捗ログ

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

- 最新エントリは下に追記する（時系列順．古いものが上，新しいものが下）
- CLAUDE.md の「開発進捗」セクションは最新 1 行のみ（上書き運用）
- 詳細・失敗パターン・設計判断はすべて本ファイルに残す
- 書式・運用ルールは .claude/rules/progress-log.md を参照
  （本ファイルの編集時に自動ロードされる）
-->

- [x] **ステップ 2: SmTIAS 照明均一性評価 完了**: 照明均一性の評価指標算出・可視化を実装し，REPORT_01（照明均一性評価報告書）を作成済み．次はステップ 3．
  - 注: 本エントリはテンプレート同期で PROGRESS.md を新設した際の移記ベースライン（詳細経緯は `git log` を参照）．以降の進捗は本ファイル末尾に追記する．

- [x] **TECH_05 Phase 1: DNG 読み込み I/F ＋ 動径 min/max 比指標**: SmTIAS 定量モードの出力が PNG→DNG(RAW_SENSOR) に変わったため DNG 読み込み I/F（`src/io/dng_loader.py`）を新設．あわせて照明均一性に動径 min/max 比指標を追加．SmTIAS-LightSim へのコピー前提で再利用性重視．
  - **設計判断（線形性）**: linear 系出力は `output_color=raw`（カラーマトリクス非適用）とし，入射光量とセンサ信号の比例（放射輝度リニアリティ）を担保．カラーマトリクス経路はチャンネル混合で per-channel 比例が崩れるため不採用．luma は既存 PNG 経路互換のため Rec.709 維持（raw 経路では厳密な CIE 輝度でなく固定加重プロキシ）．
  - **重要な発見（仕様との食い違い）**: RAW_SENSOR DNG はレンズシェーディング**未補正**（補正は DNG の OpcodeList2 GainMap・meta.json lscMap として付随するが rawpy は適用しない／lscMap ゲインは 1〜5）．TECH_05 の `apply_lsc_inverse` は「DNG=補正済み」前提だが実際は未補正．照明ムラを測るには lscMap を**順方向適用**してレンズビネットを除去する向きで Phase 3 を設計すること．LSC 順適用で白板 ROI の CoV は約半減を実測．
  - **向き**: DNG はセンサ native が landscape，PNG/preview は portrait．PNG と揃えるには `rot90(-1)`（左右反転なし）．フロントカメラ(id=1) の preview はミラーされるが RAW はミラーされないため反転不要（ラベル位置で確認）．
  - **PNG vs DNG 比較の注意**: 違いはスケール(0-1/0-255)でなくドメイン（PNG=sRGB / DNG=linear）．CoV 等はスケール不変なので，公平比較には PNG を inverse-sRGB で linear 化する必要がある．
  - **動径 min/max 比**: 画素単位 max/min は外れ画素に弱いため，20点輪帯平均の min/max をロバスト指標として追加．
  - **後段（未着手）**: TECH_05 Phase 4（既存パイプライン統合）/ Phase 5（PNG vs DNG，撮影フレーミング差への ROI 対応）/ Phase 6（SPEC_01/02 更新）/ ビューア(viewer.py) の DNG 対応．SPEC のフル更新は TECH_05 Phase 6 に委ねる．`scripts/run_uniformity_dng.py` は PNG 版の DNG 対応ランナーとして暫定追加（共通化は将来）．

- [x] **リリース準備: SmTIAS へ全面改名 ＋ 共通化リファクタ ＋ ドキュメント整理**: 新バージョンのタグ付けに向けて以下を実施．
  - **改名**: プロジェクト/デバイス名を MiniTIAS → SmTIAS に全面統一（`pyproject.toml`，ROI キー `smtias.whiteboard`，docs/scripts/tests/src，GitHub リポジトリ名 `SmTIAS-Evaluation`，`data/`・`output/` の実データ／成果物ファイル名）．参照コピー `MiniTias/`（外部リポジトリ）は対象外．
  - **リファクタ（共通化）**: 重複していた `load_roi_config` を `src/config.py` に集約．`run_uniformity_dng.py` 内の DNG 輝度化パイプライン（`dng_luminance`/`lsc_gain_rgb`/`_upsample`）を `src/io/dng_pipeline.py` に移設し，compare 系・plot 系スクリプトが「スクリプト間 import」をやめて `src/` から取得するように変更（上記「共通化は将来」を解消）．`dng_loader.py` の Rec.709 係数重複は SmTIAS-LightSim への単体コピー前提のため意図的に据え置き．
  - **ドキュメント**: ルート `README.md` を新設．CLAUDE.md にプロジェクト概要と SPEC_02 索引を追加．TECH_01 のローカル TECH_02 リンク切れを修正．
  - **検証**: pytest 381 passed，主要スクリプト（run/plot/compare 各種）の smoke test も成功（指標値は改名前と一致）．

- [x] **単灯照明の切り分け評価 ＋ output 構造のデバイス別整理（2026-06-23）**: 下・左・右の 3 灯を 1 灯ずつ単独点灯（他 2 灯を黒テープで遮光）して白板を撮影し，各灯単体の照射偏り・均一性を評価．3 灯合成均一性の根拠（相補配置）を確認した．
  - **対象データ**: `data/smtias/quantitative/SmTIAS_QM_20260615_{141420=下,150300=左,170948=右}`．各 DNG を `run_uniformity_dng.py`（linear＋LSC，ROI=smtias.whiteboard）で評価．
  - **命名判断**: 取り込み時のファイル名は `MiniTIAS_QM_*` だが，既存 QM 規約に統一して `SmTIAS_QM_<timestamp>` へリネーム．LED 条件（下/左/右）は**ファイル名に含めず**報告書側で管理する方針（ユーザー選択）．
  - **失敗と対処（写り込み）**: 右のみ初回 `170358` は ROI 内に黒テープが写り込み，最小輝度 2.89・max/min≈27.7 と min 依存指標が無効化．撮り直し版 `170948`（min 46.0・max/min 1.66）に差し替え，初回分はデータ・結果とも削除．→ 撮影時はフレーム外で遮光する運用を徹底．
  - **結果**: 明るさ・均一性とも **右 > 左 > 下**（mean 63.6/61.5/57.8，CoV 0.062/0.086/0.070）．各灯は異なる方向（像面で下=上側／左=右寄り／右=中央〜左寄り；プレビューは鏡像で像面右＝実空間左）を強く照らし，互いの暗部を補完する相補配置．合成均一性の弱点は下灯側．
  - **新規スクリプト**: `scripts/compare_single_leds.py`（3 単灯を**共通絶対カラースケール**で並置＋動径プロファイル重ね描き＋指標表，出力 `output/smtias/figures/compare_single_leds.png`）．スケールは外れ値に強い p1–p99 で決定．
  - **報告書**: `docs/06_TEST/TEST_04_単灯照明比較評価報告書.md` を作成し CLAUDE.md 索引に追記．
  - **output 構造の整理（再発防止込み）**: 混在していた `output/figures`・`output/results` をデバイス別へ集約 → `output/smtias/{figures,results}`（SmTIAS 全成果物）／`output/compare/`（smtias↔tias 横断比較）／`output/tias_dfk23*`（既存）．さらに figures 内で非 QM（PNG 白板 `SmTIAS_20260408_*` セット）を `output/smtias/figures/whiteboard/` サブフォルダへ分離．
  - **スクリプト追従**: 再実行で散らからないよう出力先を更新．compare 系のハードコード `OUTPUT_PATH` を新構造へ（ambient/png_dng→`output/smtias/figures/`，smtias_tias→`output/compare/`）＋ `mkdir(parents=True)` を追加．`run_uniformity*.py`・`plot_radial_clean.py` の `--output` 既定を `output/` → `output/smtias/` に変更（TIAS は従来どおり `--output` 明示で分離）．`compare_png_dng_slide.py` の mkdir 重複も解消．pytest は 381 passed のまま（テストは tmp_path 依存でパス変更の影響なし）．
  - **未着手（保留）**: `output/smtias/results/` 側は非 QM/summary を `whiteboard/` 配下へ分離する整理が未対応（figures のみ実施）．3 灯合成の実測 vs 単灯加算（下＋左＋右）の検証も今後の課題（TEST_04 限界節）．

- [x] **後側ロフト w=1.4 筐体の実機評価（2026-07-27）**: 後側筐体のみロフト 1.4 版（SmTIAS-LightSim `後側_w1p4.stl`，下側フレア部が最大約 10 mm 膨張・キャビティ +6.3%）に交換した SmTIAS 001 を白板撮影で評価．**従来筐体の後側ロフトは 0.5**（比較の基準）．全灯×2（汚れあり/清掃後）＋単灯 3 枚を取得し，TEST_10（シミュ）の実機検証と TEST_04 限界節の「実測 vs 単灯加算」検証を実施．報告書 `docs/06_TEST/TEST_05_後側ロフトw1p4実機評価報告書.md`．
  - **対象データ**: `data/smtias/quantitative/SmTIAS_QM_20260726_183416`（全灯・汚れあり）／`20260727_{124257=全灯清掃後,134105=下,134853=左,140129=右}`．取り込み名 `MiniTIAS_QM_*` は既存規約どおり `SmTIAS_QM_*` へリネーム（LED 条件はファイル名に含めず報告書側で管理）．
  - **結果（全灯）**: CoV 0.0695（従来筐体 0601_124500）→ 0.0617（w1p4 清掃後）と同等〜微改善．標準偏差はほぼ同一で改善は平均輝度 +13% による．TEST_10 のシミュ予測「均一性・形はほぼ不変」を実機で支持．白板清掃で CoV 0.0639→0.0617（汚れ由来の暗点 2 つが消失）．
  - **結果（単灯）**: 明るさ順が **下 81.2 > 左 75.2 > 右 71.3** と TEST_04（右>左>下）から逆転．増分は下 +41% > 左 +22% > 右 +12% で変形部位（下側）に近いほど大きく筐体効果として整合的．ただし撮影条件差との切り分けは残課題．
  - **結果（加算検証）**: 全灯実測 ≈ 単灯加算が成立（実測/加算 比: 平均 1.031，[p5,p95]=[0.994,1.065]，CoV は両者 0.062 で一致）．3 灯相補仮説を定量的に裏付け．比マップは中心 <1・周辺 >1 の緩い構造（遮光テープの内面反射喪失 or 光量ドリフト，未分離）．
  - **失敗の再発（写り込み）**: 下のみ `134105` の ROI 下端（y≈1391–1408, x≈68–611, 面積比 0.14%）に遮光テープが写り込み min 依存指標が無効化（max/min 11.5）．写り込み行除外の参考値 CoV 0.0576・max/min 1.560 を報告書に併記．TEST_04 で提起した「フレーム外で遮光」運用が徹底されず → SPEC_03 への手順明文化を推奨として記載．
  - **スクリプト**: `compare_single_leds.py` を CLI 引数化（`--bottom/--left/--right/--output/--title-suffix`，既定値は従来撮影で挙動不変）．`compare_composite_vs_sum.py` を新規追加（実測/加算の共通スケール並置＋比マップ＋動径重ね描き＋指標表）．出力は `compare_single_leds_w1p4.png`・`compare_composite_vs_sum_w1p4.png`．
  - **筐体直接比較（w0.5 vs w1.4，追加実施）**: `compare_loft_housings.py` を新規追加し，全灯（比マップ付き）と単灯（2×3 並置＋動径重ね描き 6 本）を筐体間で直接比較．画素比 w1.4/w0.5 は中央値 1.131・[p5,p95]=[1.090,1.172] で，**増光は像面上側の暗部で最大（+15〜17%）・中心明部で最小（+9%）**．暗部の選択的持ち上げが CoV 微改善の実体と判明．出力 `compare_loft_housings_{all,singles}.png`．

- [x] **テンプレート同期（2026-09-29）**: programming-template の最新版（commands → skills 移行，規約の `.claude/rules/` 化，solo/team モード，ops-runner 等のエージェント，ntfy 通知フック）を取り込み，プロジェクト側を新構成へ追従．
  - **設計判断**: プロジェクト固有の GUIDE_06〜09（コーディング規約・ディレクトリ構造・テスト方針・エラーハンドリング）を path-scoped rule（`.claude/rules/{coding-style,project-structure,testing,error-handling}.md`）へ移行．docs に置くと読ませ忘れが起きるが，rule なら該当ファイル編集時に自動ロードされるため．内容は据え置き（構造図のみ実態に合わせ `config/` 追加・廃止済み `SmTIAS/` 参照コピーを削除）．
  - **追加**: 開発コマンド一覧 `ENV_04` を新設．GitHub の Dependabot alerts / security updates を有効化し `.github/dependabot.yml`（pip・github-actions，週 1）を追加．`.claude/project-mode` は solo．
