diff --git a/CLAUDE.md b/CLAUDE.md index f8a888a..0d11690 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ ## 開発進捗 -最新: PLAN_05 フェーズ 2 として層②テストを校正・撮影・切断・UI 連携に広げ,報告台帳の 4 件を赤→緑で修正した +最新: PLAN_05 フェーズ 3a として撮影・保存の信頼性(校正中の例外・閉じるとき・UI 通知の非同期化・保存キューの待ち時間)を直した ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは `.claude/rules/progress-log.md` を参照(該当ファイル編集時に自動ロードされる). ## 必須ルール(コード実装時) diff --git "a/docs/03_PLAN/PLAN_05_\343\203\206\343\202\271\343\203\210\347\266\262\347\276\205\346\200\247\345\220\221\344\270\212\350\250\210\347\224\273.md" "b/docs/03_PLAN/PLAN_05_\343\203\206\343\202\271\343\203\210\347\266\262\347\276\205\346\200\247\345\220\221\344\270\212\350\250\210\347\224\273.md" index ce7226a..c97b203 100644 --- "a/docs/03_PLAN/PLAN_05_\343\203\206\343\202\271\343\203\210\347\266\262\347\276\205\346\200\247\345\220\221\344\270\212\350\250\210\347\224\273.md" +++ "b/docs/03_PLAN/PLAN_05_\343\203\206\343\202\271\343\203\210\347\266\262\347\276\205\346\200\247\345\220\221\344\270\212\350\250\210\347\224\273.md" @@ -101,6 +101,26 @@ - 例: ROI とフレームサイズの照合,ホワイトバランスのゲイン算出,フレームバッファのサイズ検査,光源ポートを開けなかったときの扱い,例外を通知に変える処理 - SDK を呼ぶ部分は「受け取って渡すだけ」の薄いアダプタに残す - 完了条件: 切り出した関数に層①のテストがあり,切り出し直後に実機確認を 1 回行う +- 進め方: 量が多いため 2 回に分ける.**3a** で束 B の修正(下記の方針)を行い,修正で触る箇所の判断ロジックはその場で切り出す.**3b** で残りの切り出し(ROI の照合・フレームバッファのサイズ検査・光源ポートを開けなかったときの扱い等)を行う + +#### 束 B の方針 (Decisions for Shot/Save Reliability) + +2026-10-06 にユーザーと合意した. + +| 論点 | 方針 | +| --- | --- | +| 校正中の例外(`CalcTcc`・`ProcessCalibrationFrame`) | カメラのコールバックへ例外を伝えない.捕捉してログを残し,「校正に失敗しました」と通知し,チャート検出からやり直せる状態(未校正・マスク解放)に戻す.通知がチャート検出の進捗表示ですぐ上書きされないよう,次に校正が完了するまで検出中の表示を「校正に失敗しました(理由).チャートの検出からやり直しています」に差し替えて出し続ける(エラーダイアログはカメラのコールバックを止めるため使わない) | +| 校正画像(TccImage・TccRoisImage)の保存失敗 | 変換行列はメモリ上で有効なので校正済みのままにし,「自動校正完了(校正画像の保存に失敗)」のように警告を表示する | +| アプリを閉じるとき(`Form1_FormClosing`) | 保存中なら閉じるのを取り消して「保存中」と知らせる(閉じる理由は区別しない.Windows のシャットダウン時も取り消し,待つか強制終了するかはユーザーに選ばせる).閉じ始めたらカメラのコールバックから UI への呼び出しを行わない(ハングの防止).光源を消してポートを閉じる | +| 保存スレッドから UI への通知 | 進捗表示などは UI スレッドを待たない非同期の呼び出しにする(撮影中でも保存が進み,画像がキューに溜まり続けない) | +| 保存キューの待ち時間(`DrainShots`) | 固定 30 秒をやめ,「30 秒」と「撮影間隔の 2 倍」の大きい方にする | + +- **3a の状態: 完了(2026-10-06)** + - 上表の方針をすべて実装した.判断(閉じてよいか,待ち時間,通知文の組み立て)は `Form1.CanClose`・`CameraBase.GetDrainIdleTimeout`・`FormatCalibrationFailure`・`ShouldNotifyCalibrationFailure`・`FormatChartDetectionMessage`・`FormatCalibrationDone` として切り出し,層①でテストした + - 層②の新規・書き換えテストは修正前のコードで 14 件が赤になることを確認した.層②は計 36 件で 1 回あたり約 21〜26 秒(目安 30 秒に近づいてきたので,次に層②を増やすときはテスト用設定の見直しを先に検討する) + - 保存中の切断テストは,通知の非同期化で「保存スレッドが UI を待つ間は必ず生きている」前提が崩れたため,保存スレッドを意図的に止めておく形に書き直した + - 実機でしか確かめられない残り: 保存中・プレビュー中・校正中に閉じたときの挙動(SDK のストリーム停止との待ち合い),光源の消灯とポートの解放,撮影と保存が並行するようになった後の連写間隔の精度 +- **3b(未着手)**: ROI とフレームサイズの照合,フレームバッファのサイズ検査,光源ポートを開けなかったときの扱い(`/auto-audit` 報告台帳の該当項目) ### フェーズ 4: 実機録画データによる回帰 diff --git "a/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" "b/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" index 9123db6..8062629 100644 --- "a/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" +++ "b/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" @@ -33,7 +33,10 @@ | `CameraBaseCalibrationIntegrationTests`(切断) | 校正後・校正中の切断で例外にならず,チャートマスクが解放される | | `CameraBaseShotIntegrationTests`(撮影ループ) | 連続撮影で枚数分のファイルと撮影ログ(間隔どおりの時刻).枚数 0 で例外にならずボタンが戻る.フレーム取得の失敗で中止・通知され,Info.csv の中止行は理由にカンマ・改行・引用符を含んでも 3 列に収まる | | `CameraBaseShotIntegrationTests`(保存キュー・切断) | 保存失敗時に撮影した全フレームが解放される.前回のキューに残った画像が解放される.保存中の切断で例外にならず保存が完了する | -| `Form1UiIntegrationTests` | データ名・連続撮影の枚数・間隔をワーカースレッドから読んでも UI の入力どおりの値が返る(数値でない入力を含む).ShowMessage・EnableShots が UI に反映される | +| `Form1UiIntegrationTests` | データ名・連続撮影の枚数・間隔をワーカースレッドから読んでも UI の入力どおりの値が返る(数値でない入力を含む).ShowMessage・EnableShots が UI に反映され,ワーカーからの呼び出しは UI スレッドを待たずに戻る.閉じ始めた後・ハンドル未生成では何もしない | +| `CameraBaseCalibrationIntegrationTests`(校正の失敗) | 校正中の例外はカメラのコールバックへ伝わらず,失敗の通知はちょうど 1 回.失敗後は検出中の表示に上書きされず失敗の表示が続き,再校正が完了すると「自動校正完了」になる.校正画像の保存に失敗しても校正済みのまま警告を表示する | +| `CameraBaseShotIntegrationTests`(撮影中の保存) | 連続撮影の途中でも保存が進む(4 枚目の取得時点で 2 枚目が保存済み) | +| `Form1CloseIntegrationTests` | 保存中に閉じると取り消されて「保存中」と表示される.保存後は閉じ始め → タイマー → カメラ → 光源の順に後始末される.プレビュー中に閉じてもすぐ戻り例外にならない | - **合格条件**: 全件緑.新しいケースを追加したときは,取り込む前に 3 回連続で緑になることを確認する diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 08a9baf..26ff555 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -182,3 +182,8 @@ - [x] **PLAN_05 フェーズ 2: 層②テストの拡充と報告台帳 4 件の修正** (2026-10-06): 校正の状態遷移・撮影ループ・保存キューの後始末・切断・`Form1` の UI 連携に,正常系と失敗注入の結合テストを広げた.あわせて,ハーネスで再現テストを書けるようになった報告台帳の 4 件(UI スレッド外の取得系メソッド,チャートマスクの解放漏れ,保存キューの取り残し,撮影失敗行のクォート漏れ)を,修正前に赤になることを確かめたうえで直した. - 設計判断: 保存中の切断は,`SaveThread` が完了表示を UI スレッドへ Invoke するまで終われない性質を使い,メッセージを処理する前に切断することでタイミングに依存せず再現した.撮影系は変換次元を 1 つに絞り,層②全体を 30 秒の目安に収めた(全次元だと約 28 秒). - 後段: 方針未決の挙動(`CalcTcc` の例外境界,終了処理,`SaveThread` の同期 Invoke,`DrainShots` の待ち時間)はフェーズ 3(束 B)で方針を決めてから扱う.テスト側に変換次元の取得処理など小さな重複が 3 ファイルに残っている. + +- [x] **PLAN_05 フェーズ 3a: 撮影・保存の信頼性の修正(束 B)** (2026-10-06): 校正中の例外をカメラのコールバックへ伝えずにやり直せるようにし,校正画像の保存失敗は警告にした.保存中は閉じるのを取り消し,閉じるときの後始末(カメラ・光源)の順序を決めた.保存スレッド等から UI への通知を非同期にし,撮影中でも保存が進むようにした.保存キューの待ち時間は撮影間隔に合わせた.方針は PLAN_05「束 B の方針」表. + - 設計判断: 校正失敗の通知がチャート検出の進捗表示ですぐ上書きされる問題は,エラーダイアログ(カメラのコールバックを止めてしまう)ではなく,次に校正が完了するまで検出中の表示を失敗の表示に差し替える方式にした.上下逆の設置案内は,ユーザーが直すための指示なので差し替えない. + - 失敗パターン: 通知を非同期にしたことで,「保存スレッドは UI を待つ間は必ず生きている」ことを前提にしていた保存中の切断テストが速度次第で落ちうる形になった.保存スレッドを意図的に止めておく形に書き直した.非同期化のような変更では,既存テストがタイミングの前提を持っていないかを確認する. + - 後段: 3b(ROI・フレームバッファのサイズ検査・光源ポートの扱い).層②の実行時間が約 21〜26 秒になり目安の 30 秒に近づいている.