---
paths: ["src/**", "tests/**", "scripts/**"]
---

# プロジェクト構成ルール (Project Structure)

ソース・テスト・スクリプトを追加・移動するときは本ルールに従い，責務ごとのサブパッケージ配置を保つこと．設計の背景は `docs/04_SPEC/SPEC_01_アーキテクチャ設計.md` を参照する（本ルールは配置規則のみを定める）．

## ディレクトリ構成 (Layout)

```text
src/sm_tias_lightsim/
├── __init__.py
├── uniformity.py          # Rec.709 輝度変換 + CoV/std/max-min（核計算）
├── cli/                   # CLI エントリポイント（render / evaluate / visualize）
├── scene/                 # YAML → Mitsuba scene（schema / builder / lights / materials / sensors）
├── geometry/              # STL 読込・単位変換・メッシュ分割（loader / transforms / subdivide）
├── render/                # Mitsuba 実行と出力（runner / output）
├── evaluation/            # 評価パイプライン（roi / zones / radial / oetf / normalize / shape_metrics / visualize …）
├── visualize/             # 3D 可視化（baker / projection / viewer）
└── runtime/               # 実行時ヘルパ（llvm_init 等）

tests/                     # src のサブパッケージ構造をミラー（testing.md 参照）
scripts/                   # 単発の調査・キャリブ・図生成スクリプト（パッケージ外）
configs/                   # シーン YAML・評価 YAML・メッシュ等（コード外の設定・入力）
```

## 配置ルール (Placement Rules)

- **1 モジュール 1 責務**: 新しい機能は責務に合うサブパッケージに置く．該当が無ければ新サブパッケージを作る（安易に既存モジュールへ肥大化させない）．
- **サブパッケージ間の依存方向**: `cli` → 各機能パッケージ → 核計算（`uniformity` 等）の一方向を保つ．核計算モジュールから上位（`cli`・`visualize`）を import しない．
- **純関数を優先**: 副作用（ファイル I/O・Mitsuba 実行）は `render`・`cli`・`output` 等の縁に寄せ，`evaluation`・`geometry`・`visualize/projection` 等は入力→出力の純関数として書く（テスト容易性のため．`testing.md` の「核計算は必ず単体テスト」と対応）．
- **テストの配置**: `tests/` は `src/sm_tias_lightsim/` のサブパッケージ構造をミラーする（詳細は `.claude/rules/testing.md`）．
- **調査・使い捨てコード**: 恒久的に使わない単発スクリプトは `src/` ではなく `scripts/` に置く（パッケージの公開 API を汚さない）．
- **設定・入力データ**: シーン/評価 YAML・STL・生成物は `configs/` 配下に置き，コード（`src/`）に埋め込まない．
