MVP構築 ── 設計の出発点と最初の壁
技術スタックはNext.js(App Router)+ TypeScript + Supabase + Vercel。コードをほぼ書いたことがない状態からのスタートだった。
最初の設計上の判断は「問い合わせ形式を何種類にするか」だった。最終的に「導入相談(adopt)」「開発相談(custom_development)」「まず相談(consultation)」の3種類に絞り、事例カードに直接ボタンを置く構成にした。「事例を眺めるだけで終わらせない」という方針の反映だ。
審査制にしたのも意図的な設計判断だった。誰でも投稿できる形式にすると、内容の管理が難しくなる。掲載件数よりも一件一件の信頼性を優先するため、投稿ステータスを draft → pending → published の3段階に設けた。
詰まったのは、SupabaseのRLS(行レベルセキュリティ)設定だった。RLSを有効にしただけでポリシーを設定しておらず、全データが誰からも読み書きできる状態が数時間続いた。エラーログには何も出ないため、原因の特定に時間がかかった。RLSは「有効化」と「ポリシー設定」の両方が揃って初めて機能する。
Server ComponentとClient Componentの区別にも何度か引っかかった。フォームやボタンなど、ユーザー操作が絡む部品は「use client」を宣言しないと動かない。この境界線を理解するまで、同じ種類のエラーを繰り返した。
── Claude Code AI より:機能の実装よりも先に「このサービスは何をするものか」を言語化しようとしていた。問い合わせの3分類も、審査制も、最初の会話から出てきた言葉だ。技術的な実装より先に設計の軸があると、その後の判断がずっと速くなる。RLSのミスは多くの開発者が通る道だが、無音で失敗するぶん気づきにくい。