開発eurekapu-nuxt4メモ

case100ノート統合の積み残し消化とCaseNoteLayoutリファクタ計画

08:25 セッション — 積み残しを全件クローズ

前日(2026-05-04)は22件のcase100ノート統合を5並列セッションで走らせて終了した。翌朝、まず全件のHTTP確認から入った。

  • 22件 HTTP 200 確認
  • 52件 リダイレクト(301)確認
  • 全件成功

数字が揃った時点で積み残しの本題に移った。

孤児カテゴリを発見して削除

groupByPrimaryCategory のフィルタを眺めていると、「DTAの再評価・追徴」カテゴリが引っかかっていなかった。該当ノートはカテゴリに割り当てられているのに、フィルタの定義リストに存在しない——孤児化していた。

Codex(GPT-5.5)に状況を投げると「孤児カテゴリは削除を推奨」と返ってきた。迷わず削除した。もし将来ノートが増えてカテゴリが復活するなら、その時に追加すればいい。

関連ノートUIサイドバーを追加

ChapterPager に relatedChapters(関連ノートのサイドバー)を追加実装した。

index.tsrelatedChapstersFor(slug) ヘルパーを生やして、incoming リンクも双方向で自動集計する設計にした。既存ノートを一切改修しなくても関連が集計される点が核心で、22件+110件のノートに手を入れずにサイドバーが成立した。

// index.ts — incoming linkも双方向で集計
export const relatedChaptersFor = (slug: string): Chapter[] => {
  const outgoing = chapters.filter(c => c.relatedSlugs?.includes(slug))
  const incoming = chapters.filter(c => c.slug !== slug && chapters
    .find(x => x.slug === slug)?.relatedSlugs?.includes(c.slug))
  return [...new Set([...outgoing, ...incoming])]
}

/simplify レビュー → 2件採用

実装後に /simplify でレビューを回した。2件の指摘を採用して修正した。残りは影響範囲が小さいと判断してスキップした。


CaseNoteLayout リファクタ計画書を作成(640行)

次のタスクは、22件+110件の Vue コンポーネントに散らばった <style scoped> の CSS 重複を解消することだった。ファイルごとに同じ .callout.figure を定義しているため、変更のたびに全ファイルを触る必要があった。

計画書を書いて、Codex に 4 ラウンドのレビューを通した。

Codex 4 ラウンドの流れ

ラウンド結果
Round 1.callout が他系統と衝突するリスクを指摘 → .case-note__body で隔離する方針に変更
Round 2Phase の粒度が大きすぎると指摘 → Phase 毎に /simplify 必須を明記して細分化
Round 3「致命的な指摘なし」確定
Round 4最終確認(軽微な表記修正のみ)

Round 1 の指摘が一番効いた。.callout をそのまま外部 CSS に移すと、他のページのスタイルを壊すリスクがあった。.case-note__body .callout という形で詳細度を上げて隔離する方針に切り替えたことで、計画が安定した。


13:23 セッション — Phase 0〜2 を実装

計画書に従い、午後のセッションで Phase 0〜2 を実装した。

Phase 0: CLAUDE.md 規約変更

.case-note* 名前空間を例外規定として CLAUDE.md に追記した。プロジェクト全体の CSS 命名規約が BEM ベースに統一されているなかで、case-note 系だけ独立した名前空間を持つことを明文化した。

Phase 1: 共通 CSS の確定

対象 52 件のノートを特定して、共通化できるクラスを洗い出した。.callout.figure.topics-list が他系統と衝突するリスクがあったため、すべて .case-note__body の直下子として隔離する方針に固めた。

app/assets/css/case-note.css を新規作成した。既存の steps.css と同じディレクトリに置いた。

Phase 2: Case100NoteLayout コンポーネント作成

allowance-for-doubtful-accounts-lifecycle.vue をパイロット移行先に選んだ。dev server で表示を確認して、スタイルの崩れがないことを目視で検証した。

/simplify で 4 件の致命的指摘を修正

パイロット移行後に /simplify を回したところ、致命的な指摘が 4 件出た。

  • ChapterPager を NoteLayout の外に置いていた → NoteLayout 内に移動
  • .callout の詳細度が不足 → .case-note__body > .callout に変更
  • CLAUDE.md のパス記述が誤っていた → 修正
  • もう 1 件の構造的な誤記

修正後、.nuxt キャッシュをクリアして dev server を再起動し、再検証した。


振り返り

孤児カテゴリの発見は、フィルタ定義とデータの乖離が見えた瞬間だった。 22件を並列で統合した後処理として、こういった「定義漏れ」が出てくるのは想定内だったが、Codex に聞いて即断できたのは判断の速さという点でよかった。

Codex 4 ラウンドのレビューは、計画段階の詰めを前倒しにする作業だった。 実装に入ってから「.callout が衝突する」と気づくより、計画書の段階でつぶしておいた方が手戻りが少ない。Round 3 で致命的指摘がゼロになったことで、実装に踏み切る根拠ができた。

Phase 2 の /simplify で 4 件が出たのは想定外だった。 パイロット実装のつもりで動かしてみると、計画書では見えていなかった詳細度の問題や構造的な誤配置が浮かぶ。「まず 1 ファイル動かして検証する」という手順が正しかった。