• #Claude Code
  • #Codex
  • #再設計
  • #Nuxt 4
  • #アーキテクチャ
  • #AI協働
開発tax-assistantメモ

Claude OpusとCodexでNuxt 4プロジェクトの再設計を議論した

何をやったか

「いまプロジェクトをゼロから自由に再設計できるとしたら、どういう設計にしますか?」

この問いを2つのセッションに分けて投げた。

  • セッション1: Claude Opus 4.6に単独で再設計案を書かせた
  • セッション2: Claude OpusがCodex(GPT-5.3)とディスカッションしながら設計判断を詰めた

対象はNuxt 4 + FastAPI + SQLiteで構成された業務Webアプリ。ルールベースのデータ変換パイプラインを中心に、帳票管理・マッチング・エクスポートを担うローカル完結型のシステムだ。

2セッションの構成

セッション1: Claude Opus単独

Claude Opusがコードベースを読み込み、現行設計の維持すべき点と変更すべき点を整理した。出力は redesign-from-scratch.md。Before/AfterのMermaid図、ファイル名と行数を指定した分割計画、コードスニペットが並ぶ。手を動かすための設計図に近い。

セッション2: Claude Opus x Codex

セッション1の素案をCodexに渡し、6つの論点(テーブル統合、レイヤー数、状態マシン、TanStack Query、致命的見落とし、Codex独自案)についてYes/Noで回答させた。出力は redesign-discussion-claude-vs-codex.md。設計判断の根拠が中心。

9項目の変更一覧

再設計で変える項目を先に一覧で把握する。

#対象現行再設計狙い
1BEロジック分離DB層にSQL+ビジネスロジック混在純粋関数としてdomain/に分離テスト容易性
2ルールエンジンCSV由来とDB由来の2実装が並存1本化、CSV廃止マッチングの信頼性
3importスクリプト8本が各自でDB操作Service層に統合、Repository注入CLI/HTTP両対応
4マイグレーション15 SQLファイル+各モジュールに散在_migration_historyで一元管理適用状態の追跡
5FEコンポーネント1ファイル2,000行超が6つfeature単位で200-300行に分割部分修正の容易さ
6composable1ファイル20KB超が2つ単一責務で分割責務の明確化
7状態管理Pinia 6個+composable 14個Pinia 2個+feature composable迷い解消
8API層全部入りutils/api.tsドメイン単位分割+OpenAPI型生成型齟齬の検出
9型安全手動同期OpenAPIから自動生成コンパイル時検出

Before/After(バックエンド)

Codexとの議論で変わった4つの判断

セッション1とセッション2で結論が異なった論点をまとめる。Codexは「この規模で本当に必要か」という問いを繰り返し、Claude Opusの理想寄りの提案を引き戻した。

1. テーブル設計: 1テーブル統合 → ハイブリッドモデル

Claude Opusは4テーブルを1つのdocumentsテーブルに統合し、帳票固有フィールドをJSON列に入れる案を出した。Codexが「整合性制約と索引設計が弱くなる」と却下。共通テーブル + 帳票別詳細テーブル(1:1)に落ち着いた。

2. レイヤー構成: 4層 → 3層

Router → UseCase → Domain → Repositoryの4層をClaude Opusが提案。Codexが「1人開発・30エンドポイントで4層は抽象化コストが先行する」と指摘し、Service層に統合。ルールエンジンなど純粋関数として抽出する価値があるものだけdomain/に残す。

3. TanStack Query: 導入推奨 → 見送り

Claude Opusが案A/Bを比較して推奨した。Codexが「API境界の整理とコンポーネント分割が先。この規模ならNuxt標準のuseFetch/useAsyncDataで十分」と一蹴。同意した。

4. 税務固有の要件3点が追加

Claude Opusのドキュメントには書かれていなかった3点をCodexが指摘した。

  • 監査証跡: 「誰がいつ確定/変更したか」の記録。税務業務では必須
  • 冪等性: CSV再インポート時の重複防止(source_hash + UNIQUE制約)
  • ルールバージョン管理: 仕訳確定時にルールIDとバージョンを記録

技術設計だけでは出てこない、ドメイン知識に基づく指摘だった。

Codexとのディスカッションの進め方で学んだこと

最初は汎用的な回答しか返ってこなかった

「この設計についてどう思いますか?」と聞くと、「良い設計ですが、テストも大事です」のような当たり障りのない回答が返ってきた。Codexは対話の文脈を持たないため、自由記述で聞くと表面をなぞるだけの回答になりがちだった。

ファイルに書いて読ませる方式が効いた

Claude Opusが再設計案をマークダウンに書き出し、そのファイルパスをCodexに渡して「このファイルを読んで回答してください」と指示したところ、具体的なファイル名や行数を参照した回答が返るようになった。口頭で概要を伝えるより、テキストとして渡す方が精度が上がる。

Yes/No形式で強制すると具体性が出た

6つの論点それぞれについて「Yes/Noで回答し、理由を述べてください」と形式を指定した。自由回答だと「ケースバイケースです」で終わるところが、Yes/Noを強制されると立場を取らざるを得ない。結果として「No。この規模では4層は過剰。3層で十分」のように、根拠付きの明確な判断が返ってきた。

細かい発見: Nuxt 3 → Nuxt 4 の誤記

再設計ドキュメント内で「Nuxt 3」と書いていた箇所があったが、package.jsonを確認すると "nuxt": "^4.2.2" だった。セッション中に気づいて修正。Claude Opusは学習データの時期的にNuxt 3の知識が強く、^4.x.xのpackage.jsonを見ても「Nuxt 3」と書いてしまうことがある。

2セッションの比較

観点セッション1(Claude単独)セッション2(Claude x Codex)
強みMermaid図、具体的な分割計画、コード例設計判断の根拠、過剰設計の抑制
弱み理想に寄りがち、ドメイン要件の見落としコード例が少ない、実装の具体性が薄い
性格「どうやって作るか」のロードマップ「何を作るべきか」の設計審査

両者は補完関係にある。実装に着手するなら両方を並べて読むのがいい。

振り返り

AIに「ゼロから再設計するなら?」と聞くと、手元のコードが急に客観的に見えた。2,000行のVueコンポーネントも、日常的に触っていると「まあこんなものか」と感覚が麻痺する。外から「これは分割すべき」と指摘されて、ようやく目が覚めた。

2つのAIを対話させる形式は、1つのAIに長く聞くより視野が広がった。Claude Opusが理想を描き、Codexが「本当に要るのか」と削る。この押し引きで残ったものが、実際に手を動かす価値のある変更だった。