# 開発ステップ (Development Steps)

[要件定義書](PLAN_01_要件定義書.md) の目的（1. 誰でもビルド・実行できる状態にする，2. 解析結果を変えずにコードを整理する）を達成するための作業順序を定める．

## 進め方の方針 (Approach)

- **先に「結果が変わらないこと」を確かめる手段を作り，それからコードを整理する．**回帰テスト（ステップ 3）より前には，解析結果に影響しない変更だけを行う．
- 各ステップは `/implement` で進め，ステップごとに作業ブランチを切って `main` に取り込む．

## ステップ一覧 (Steps)

| # | ステップ | 目的 | 解析結果への影響 |
| --- | --- | --- | --- |
| 1 | 実行に必要なファイルの取り込み | ビルドだけで実行ファイル一式が揃うようにする | なし |
| 2 | 実行を妨げる不具合の修正 | 解析を最後まで安定して回せるようにする | なし |
| 3 | テストプロジェクトと回帰テストの作成 | 整理の前後で結果が変わらないことを確かめる手段を作る | なし |
| 4 | 未使用コード・参照の削除 | 読む量を減らし，不要な依存（脆弱性のある Newtonsoft.Json 等）をなくす | なし（回帰テストで確認） |
| 5 | 解析処理の切り出しと重複の統合 | 画面から解析処理を分け，2 モードの重複（約 420 行）をなくす | なし（回帰テストで確認） |
| 6 | エラー処理とログの整備 | 失敗の原因が分かるようにする | なし（回帰テストで確認） |

## 各ステップの内容 (Step Details)

### 1. 実行に必要なファイルの取り込み

- 旧ビルド出力（`DeepTIAS2.7.1-Latest`）から，ソースに無く実行に必要なファイルを取り込む
  - ネイティブ DLL: `RemoveSmallRegionDLL.dll`（と依存する `opencv_world320.dll`），`TongueAnalysisDLL.dll`
  - 外部 exe: `python/TongueFeatures.exe`，`rgb2lab/`（`TongueAnalysis.exe` と色補正データ，依存する OpenCV 3.4 のデバッグ版 DLL）
  - 出力雛形: `template_outputDir/`，`template_outputDir_withCalib/`
- `*.exe`・`*.dll` を Git LFS の対象に加える
- csproj に「出力ディレクトリにコピー」を指定し，ビルドだけで `bin\x64\Release\` に揃うようにする
- 完了条件: clone → ビルド → 起動 → サンプル画像 1 枚を Image モードで解析し，`analysis.csv` が出力される
- ※ 旧ビルド出力はリポジトリ外にあり，Claude はフックの制限で読めない．取り込むファイルはユーザーがリポジトリ内にコピーする（コピー先と一覧は着手時に示す）

### 2. 実行を妨げる不具合の修正

- 二値画像のウィンドウ（`Cv2.ImShow`・`Cv2.WaitKey`）で解析が止まる箇所を削除する
- Start を押すたびに解析処理が重複して登録される不具合を直す．モード選択を解析後に押せる状態に戻す
- 解析中の例外を `RunWorkerCompleted` で受け取り，画面に表示して操作できる状態に戻す
- Image&Calib の出力先が `Output\debug` に固定されている件は，ユーザーの判断を得てから直す（[要件定義書](PLAN_01_要件定義書.md) の未決事項）
- 完了条件: 複数枚の画像を両モードで続けて解析でき，途中で止まらない

### 3. テストプロジェクトと回帰テストの作成

- MSTest のテストプロジェクト `DeepTIAS.Tests` をソリューションに追加する
- サンプル画像で正解データ（`analysis.csv` と中間画像）を作り，`DeepTIAS.Tests/TestData/` に置く
- 解析を実行して正解データと比べる回帰テストを作る（両モード）
- 開発コマンド（[ENV_04](../02_ENV/ENV_04_開発コマンド.md)）にテストの実行コマンドを追記する
- 完了条件: 回帰テストが通り，わざと解析結果を変えると失敗する

### 4. 未使用コード・参照の削除

- 使われていないファイル（`Form1 - backups.cs`，`Settings.Designer.cs`・`Settings1.Designer.cs`）を削除する
- 使われていないメソッド・フィールド・`DllImport` 宣言・`using` を削除する
- 使われていない NuGet 参照（Microsoft.ML 一式，Newtonsoft.Json，OpenCvSharp.WpfExtensions 等）と，リポジトリ外を指す参照（OpenCvSharp.Blob，v4.7.1 の絶対パス）を削除する
- 使われていないモデル `models/ResUnet_0.9518.pb` の扱いを決める（削除するか，別の場所に保管するか）

### 5. 解析処理の切り出しと重複の統合

- `Form1.cs` の解析処理を，画面に依存しないクラスに切り出す（置き場所は `.claude/rules/project-structure.md`）
- Image と Image&Calib でほぼ同じ処理を 1 つにまとめ，違い（色補正の有無，雛形，チャネル）だけを分ける
- 解析結果に影響する数値を名前付きの定数にまとめる
- 切り出した処理に単体テストを追加する

### 6. エラー処理とログの整備

- `.claude/rules/error-handling.md` に沿って，握りつぶしている例外をなくし，失敗の原因をダイアログとログで伝える
- 外部 exe の終了コードと出力ファイルを確認する
- 出力フォルダに `log.txt` を書き出す

## 対象外 (Out of Scope)

要件定義書の「やらないこと」のとおり，新機能の追加，解析手法の変更，モデルの差し替え，外部バイナリの作り直しは本計画に含めない．

## 未決事項 (Open Questions)

- 回帰テストの正解データを何で作るか（下記）

### 正解データの作り方

配布済みの旧 exe（2021 年版）は現行ソースからビルドしたものではない（OpenCvSharp3 / .NET 4.7.1 時点のソース）．そのため，旧 exe と現行ソースの解析結果が一致するとは限らない．

- **案 A（推奨）**: ステップ 2 完了時点の現行ソースで解析した結果を正解データにする．旧 exe の結果とも比べ，差があれば記録しておく（差の原因調査は本計画の対象外）
- **案 B**: 旧 exe の結果を正解データにする．現行ソースの結果と差がある場合，整理を始める前に差の原因を調べる必要がある
