
その他の改善
- キャンバス表示範囲の拡張:工期ぴったりの表示から「工期の前後1ヶ月」に拡張。工期前後への工程配置が可能になり、読込時は工期開始位置へ自動スクロール。印刷は従来どおり指定範囲のみ
- 印刷範囲外工程の除外:バーチャートの印刷で範囲外の工程・接続線が出力される問題を修正。あわせてアノテーション(テキスト・フリー線)が印刷範囲変更時にずれる問題も修正(日付アンカー方式を導入)
- フリー線の太さ・矢印修正:太さ変更が即反映されない問題と、1pxで矢印が見えなくなる問題を修正(矢印を固定サイズに変更)
- ダブルクリック編集の修正:委譲化により発生した問題。DOM再構築のタイミング制御(requestAnimationFrame遅延・3px閾値)で解消
結果
| テスト | TenantIsolationTest 33件パス維持(全修正通じて) |
| 主な成果 | アノテーション機能の2画面統一・印刷品質の大幅改善 |
| 特記 | 印刷残像の根本原因はデバッグコードの消し忘れ1行だった |
工程表(バーチャート・ネットワーク)の品質改善
アノテーション機能の全面整備(メイン作業)
背景:2画面でアノテーション(テキストボックス・フリー線)の実装がバラバラで、barchartに欠けている機能が多かった・・設計書を作成してから4段階で実装した
| 1 | networkのイベント処理を委譲方式に統一(個別リスナー8箇所を撤去) |
| 2 | barchartにnetwork同等の機能を追加(ドラッグ移動・端点編集・描画プレビュー等) |
| 3 | UXルール統一(配置後即モーダル表示・ワンショット化) |
| 4 | 共通コード(schedules-common.js)として抽出・約230行の重複削減 |
あわせてモーダルのUI表記も両画面で統一(ボタンラベル・フォント選択肢・フリー線太さをselect化等)・・・P4完了後に発覚した退行(barchartのテキストボックス):長文・大フォントで文字が枠からはみ出し、クリック・ダブルクリックが効かなくなる問題。原因はforeignObjectの固定サイズ・・・networkにあった「文字量に合わせた自動拡大」が移植漏れだったため、共通モジュールに追加して解消
印刷機能の連続修正
| 問題 | 原因 |
|---|---|
| 印刷後に背面に残像が残る プレビュー表示中も残像が見える | try/finally未実装で復元処理が漏れる可能性 描画凍結中にpaintが完了しない |
| そもそも消えない | デバッグ用のコメントアウトが残ったまま |
| 月境界線が太すぎ・テキストの上に乗る | 旧レイアウト時代の「貫通線」が残存していた |
| 月境界線が「時々」途切れる | UTC変換による日付の1日ずれ(タイムゾーンバグ) |
楽観ロック実装
楽観ロックとは
複数ユーザーが同じデータを同時に編集した際、後から保存した人の内容が前の人の変更を上書きしてしまう問題を防ぐ仕組み
共通基盤の構築
4ファイルを新規作成して土台を整備
| ファイル | 役割 |
|---|---|
| ChecksOptimisticLock.php(トレイト) | サーバー側の照合・トランザクション・409返却 |
| optimistic-lock.js | フロント共通ミックスイン(トークン保持・競合処理) |
| conflict-modal.blade.php | 競合通知モーダル(退避DL・最新読込ボタン) |
| OptimisticLockTest.php | 検証テスト |
| 工程表への組込み | 両工程表(バーチャート・ネットワーク)に実装 途中で「誤検知」が発生:別の工事なのに競合モーダルが出る問題。 原因は3つの複合 ・工程表を切り替えた後に前の工程表の遅延応答が届き、トークンを上書き ・切替時に競合状態がリセットされない ・手動保存と自動保存が同じトークンで並走 → 応答とレコードのID照合・切替時リセット・保存直列化の3点を修正して解消。 |
| 施工計画書への組込み | セクション編集・設定保存・工事種別変更の7エンドポイントに実装。 途中でエラー発生:図面エディタの409が「Unexpected token ‘<‘」エラーになる 原因:AfetchにAccept: application/jsonがなく、サーバーが409をJSONではなくリダイレクト(HTML)として返した → fetchへのヘッダー追加とサーバー側の判定補強で解消 |
| 安全パトロール・RA・環境側面 | 環境側面は「競合を検出する親レコードがない」問題があり、project_env_statesテーブルを新設して対応 安全パトロールでは自動保存のトレーリング保存(保存中の変更を完了後にもう一度保存)を実装し、入力の取りこぼしを防止 |
| 監査系 | 監査指摘・チェックシート・是正処置に実装。 最重要の防止事象:古い画面から保存すると、payloadに含まれない指摘IDが削除され、是正処置まで連鎖消滅する事故。409で中断することで防止 |
| 必須化・清掃 | トークン未送信も409で拒否(移行期間終了) 呼び出し元がないデッドルートを調査・削除(5本) 実際に接続が必要だったのはパトロール承認ボタンと環境側面初回保存の2箇所のみ |
CLAUDE.md ダイエット+テナント分離ルール追加
新規モデル追加ルールの明文化
STAGE 3-Aで実装したテナント分離が、将来のモデル追加時に適用漏れになることを防ぐためのルールをCLAUDE.mdに追加
新規モデル追加時は必ず:
- BelongsToTenant分類判断(A/B/C分類の設計書に従う)
- TenantIsolationTestへの検証追加 をセットで実施する
あわせて過去の実装で確定した注意点も明記:
- 他社アクセスの期待値は403ではなく404(グローバルスコープがバインディング時に効くため)
- サブクエリ内での再帰を防ぐため withoutGlobalScopes() + 明示的なcompany_id絞り込みを使う
CLAUDE.mdのダイエット(117行 → 80行)
問題:CLAUDE.mdが肥大化し、Claude Codeが毎回読み込むコンテキストが増えていた
方針:「毎回守るルール」だけを残し、「経緯・詳細仕様・記録」はdocs/へ移設
| 移設先 | 移設した内容 |
|---|---|
| docs/submit_button_spec.md | ボタン・フォーム送信の詳細仕様 |
| ocs/security_notes.md | セキュリティ対応の経緯・確認記録 |
CLAUDE.mdには現役の制約と参照ポインタだけを残した
留意点
docs/へ移設した内容はClaude Codeが自動では読まない,
no-blink等のスキップクラスが必要な場面では、明示的にdocs/submit_button_spec.mdを参照させる必要がある

