tax-assistant: クライアント切替機能の設計
複数クライアントのDBを運用し始めたことで、UIからのクライアント切替が必要になった。以前作っておいた計画書をベースに、Planエージェントで詳細設計を行い、Codex(GPT-5.3)にレビューしてもらった。
背景
tax-assistantは、クライアントごとにSQLiteのDBファイルを分離する設計になっている。これまではclient_001だけで開発していたが、client_003を追加した時点で「UIにクライアント切替がない」という問題が表面化した。
ヘッダー左上に「サンプル美容室」とハードコードされたバッジがあり、ここをクライアント切替のエントリーポイントにするのが自然な流れだった。
既存計画書との差分分析
2026-01-27に作成していた client-switcher-plan.md を引っ張り出してきた。ステータスは pending のまま。
計画書の想定と現在の実装を突き合わせると、DBパスの動的解決やclientsテーブルの構造など、すでに実装済みの部分がそこそこあった。一方で、APIレイヤーのクライアント切替エンドポイントやフロントエンドのUI部分は手つかずだった。
この差分を踏まえて、計画を現状に合わせて更新する方針にした。
Planエージェントでの設計
Claude CodeのPlanエージェントモードで、関連ファイルを一通り確認してから計画を策定した。確認したのは以下のあたり。
- バックエンドのDB接続周り(
get_db_pathの実装) - 既存のAPIエンドポイント構成
- フロントエンドのヘッダーコンポーネント
- clients.dbのスキーマ
10タスクへの分割
計画を10タスクに分割した。バックエンドとフロントエンドで並行して進められる構成にしている。
バックエンド(Task 1-6)
| Task | 内容 |
|---|---|
| 1 | クライアント切替APIの実装(/api/client/switch) |
| 2 | 現在のクライアント情報を返すエンドポイント |
| 3 | クライアント一覧API |
| 4 | DB接続のクライアントID動的切替 |
| 5 | セッション管理(どのクライアントが選択されているか) |
| 6 | /api/client/profile エンドポイント(Codexレビューで追加) |
フロントエンド(Task 7-9)
| Task | 内容 |
|---|---|
| 7 | ヘッダーのクライアント切替ドロップダウンUI |
| 8 | 切替時のデータリロード処理 |
| 9 | クライアント情報の表示(名前・バッジ) |
Task 10はE2Eテスト。
Codex(GPT-5.3)レビュー
計画を memo/2026-02-12/ に保存してからCodexにレビューを依頼した。最初はプランモードのファイルパス(~/.claude/plans/)がプロジェクト外だったため失敗したが、memo側にコピーしてから再実行した。
レビュー結果: 7件の指摘
主な指摘と対応をまとめる。
1. セキュリティ対策(Critical)
Task 1に以下の3点を追加した。
- 形式バリデーション: client_idが
client_NNNパターンに一致するか正規表現でチェック - clients.db照合: 受け取ったclient_idがclients.dbに実在するか確認
- パストラバーサル防止:
../や絶対パスを含むIDを弾く
クライアントIDはそのままDBファイルパスの構築に使うため、ここの入力検証は確かに重要だった。
2. /api/client/profile エンドポイント
クライアントの表示名や事業形態など、UI表示に必要な情報を返す専用エンドポイント。元の計画にはなかったが、ヘッダーのバッジ表示にはこれが要る。Task 6として追加した。
3. 遅延初期化
クライアント切替時にDB接続を即座に切り替えるのではなく、次のAPI呼び出し時に初期化する方式。不要な接続を避けられる。
4. テスト計画の強化
E2Eテストに加えて、セキュリティ系のユニットテスト(不正なclient_idのバリデーション等)を追加する指摘。Task 10のスコープを拡張した。
残りの3件は軽微な改善提案で、命名規則の統一やエラーメッセージのフォーマットに関するものだった。
計画ファイルの保存
最終的に以下の2箇所に計画を保存した。
memo/2026-02-12/client-switcher-plan.md- チーム共有用~/.claude/plans/quiet-dancing-gizmo.md- Claude Codeプランモード用
codex_review_countフィールドを付与して、レビュー済みであることを明示している。
振り返り
- 1月末に作った計画書が、2週間の開発で一部陳腐化していた。計画は定期的に見直すか、実装と一緒に更新するのがよさそう
- Codexレビューのセキュリティ指摘は的確だった。DBパスをユーザー入力から構築する箇所は、自分だけだとバリデーションを後回しにしがち
- Planエージェントで設計 -> memo保存 -> Codexレビュー -> 指摘反映、という流れがうまく回った。設計段階でレビューを入れると手戻りが減る