Shuhei
ShifBハッカソン~YOMOGIで医療介護向けシフトをAIが最適化する要件定義の全記録~
2026年03月23日
見出しはありません
要約
前回の記事ではアプリのコンセプト決めまでをまとめました。今回はその続き、Claude との壁打ちで進めた要件定義の全過程を記録します。
アプリ名は「YOMOGI」。安芸弁でぼやきながらシフトを最適化してくれるAIキャラクター「ヨモギ主任」を搭載した、医療介護向けシフト管理アプリです。
アプリ名:YOMOGI / ディレクトリ名:work-schedule-app / 施設タイプ:病院・介護施設の切替対応 / デプロイ:Vercel
フロントエンドはNext.js 14(App Router)+ Tailwind CSS + shadcn/ui。シフト表UIはreact-big-calendarとdnd-kitでD&Dによる直接編集を実現。バックエンドはNext.js API Routesのみでサーバーレス完結。DBはSupabase(PostgreSQL)でAuth・Realtimeも活用。AIエンジンはClaude API(ストリーミング対応)。メール通知はResend。
管理者(admin)とスタッフ(staff)の2ロール。同一ログインページから施設ID+メール+パスワードでログイン。Supabase Auth+RLSで施設データを完全分離。
ベテランお局の主任設定。現場を20年以上仕切ってきた、怖いけど絶対頼りになる存在。基本は安芸弁で話す。辛辣なぼやきが基本だが、管理者とスタッフのことはちゃんと褒めてくれる。施設タイプによってセリフのトーンが変わる。
安芸弁の特徴は「〜じゃけん」「〜とる/よる」「たいぎい」「ぶち〜」「ほいじゃけん」など。備後弁と違って語尾の「ん」をはっきり発音するのがポイント。(備後弁にしようと思ったけど、文字にするとやっぱなんかおっさん臭くなるけやめた💦西よりのほうがかわいげある)
セリフ例(病院モード):「夜勤に新人3人はさすがに守れんじゃけん。研修してみんさいよ。」「はい、できとるけん。褒めてくれんでもええんよ。ぶち疲れたけん。」
→広島県民なら分かるけどおかしいw守れんじゃけん
AIも方言には疎いな…添削した✒️
勤務区分(シフト種別)は施設ごとにフリー入力で追加・編集・削除可能。重要なのは各勤務区分を「日中帯(day)」と「夜間帯(night)」に分類できること。この分類が制約チェックの判定軸になる。例:日中帯→早番・日勤・遅番1・遅番2、夜間帯→夜勤・明け・準夜勤。
休暇区分もマスタ管理。希望休(公休)・有給休暇・産前産後休暇・育児休業をデフォルトとして、施設独自休暇(リフレッシュ休暇等)を自由に追加できる。スタッフはどの休暇区分を申請しているか一目でわかる。
責任者区分も施設が自由に定義。師長・ユニットリーダー・主任など名称は施設が決める。日中帯・夜間帯それぞれへの必須配置をオン/オフで設定できるので、病院(師長)も介護施設(ユニットリーダー等)も対応できる。
壁打ちで一番深く詰めた部分。施設ごとに制約をオン/オフとパラメータで設定できる構造にした。制約項目自体の追加は保守対応とする。
カテゴリA:連勤・休日ルール。夜勤明けの翌日は必ず休み(rest_after_night_off)、日中帯のみスタッフは3連勤で休みを挿入(max_consecutive_day_only)、夜勤ありは4連勤上限(max_consecutive_with_night)など。日中帯のみのスタッフと夜勤ありのスタッフで連勤上限を別々に設定できる。
カテゴリB:夜勤回数・配置ルール。主任・副主任は夜勤3回固定(night_shift_min_per_role)、その他は均等配分(night_shift_equal_distribution)、個人指定回数を固定配置(night_shift_fixed_per_staff)。夜勤責任者は主任・副主任以外にも追加設定可(night_responsible_roles)。
カテゴリC:シフト人数・構成ルール。各勤務区分の1日最低・最大人数を設定。遅番2名上限+新人指導時は例外3名OKなど、例外条件も設定可。
カテゴリD:スタッフ属性別制約。半人前職員(新人含む)は同一シフトに複数配置しない。やむを得ず配置する場合はフル職員を1名追加(half_staff_isolation)。委員会担当者は委員会会議開催日に日中帯シフトが必須(committee_day_shift_required)。
カテゴリE:施設固有行事ルール。入浴日の設定と入浴日=リネン交換日の連動、入浴介助ヘルプ日の勤務区分別増員設定(bathing_day_*)。
生成・確定したシフト表をExcel(.xlsx)形式でダウンロードできる機能。ExcelJSをサーバーサイド(API Route)で使いバイナリレスポンスで返す構成。2シート構成(月次シフト表+スタッフ一覧)で、土日祝の列色分け・勤務区分の設定色反映・月間集計をExcel SUM数式で出力する。
facilities(施設)、users(ユーザー)、staff_profiles(スタッフプロフィール)、shift_types(勤務区分マスタ)、leave_types(休暇区分マスタ)、responsible_roles(責任者区分マスタ)、shifts(シフト)、leave_requests(休暇申請)、constraint_settings(制約設定)の9テーブル。
今回の制約拡充対応で追加したテーブルは committee_assignments(委員会担当)と facility_events(施設行事・入浴日等)の2テーブル。staff_profilesにはstaff_grade(full/half/new)とfixed_night_count(夜勤固定回数)カラムを追加。
Week 1(基盤構築):Next.js+Supabaseセットアップ、DBマイグレーション、Auth、スタッフCRUD、各種マスタ設定画面。マイルストーン:手動でシフトが保存できる状態。
Week 2(コア機能):月次カレンダービュー、D&D編集、制約リアルタイムチェック(日中帯・夜間帯分類対応)、承認・公開フロー、Resendメール通知、Realtimeアプリ内通知。マイルストーン:シフト調整〜承認〜通知が動く状態。
Week 3(AI/UX):Claude APIストリーミング、ヨモギ主任パネルUI(安芸弁)、AI自動生成、不満スコア可視化、一覧リスト表示。マイルストーン:ヨモギ主任が安芸弁でぼやきながらシフト生成できる状態。
Week 4(仕上げ):エラーハンドリング、レスポンシブ対応、ヨモギ主任アニメーション、Excel出力、デモ用シードデータ、Vercel本番デプロイ。マイルストーン:審査員の前で迷わずデモできる完成状態。
要件定義が固まったので、いよいよWeek 1の実装に入る。具体的にやることは以下の通り。
①プロジェクト初期セットアップ:work-schedule-appディレクトリ作成、Next.js 14インストール、Tailwind CSS+shadcn/ui設定、Supabaseプロジェクト作成。
②DBマイグレーション:要件定義書のSQLをそのまま流し込んで9+2テーブルを作成。RLSポリシーも合わせて設定。
③認証まわり:Supabase Auth設定、管理者・スタッフのログイン画面実装、ルートガード(admin/staffの画面分離)。
④スタッフCRUD:スタッフ一覧・追加・編集・削除画面。staff_gradesとfixed_night_countの設定UIも含む。
⑤マスタ設定画面:勤務区分(日中帯/夜間帯の分類付き)、休暇区分、責任者区分、制約設定の管理画面を実装。
Claude Codeを使って要件定義書(REQUIREMENTS.md)をそのまま渡しながら進める予定。Week 1が終わったらまた記事にまとめます。
今回の壁打ちで作成した要件定義書はMarkdown形式でまとめてあり、Claude Codeにそのまま渡して実装を進める。主な構成は①プロジェクト概要、②技術構成(ディレクトリ構成・環境変数含む)、③ユーザー・認証、④機能要件(制約ルール5カテゴリ詳細含む)、⑤DBスキーマ(SQL定義)、⑥非機能要件、⑦4週間ロードマップ、⑧Excel出力機能、⑨スコープ外、⑩用語集の10章構成。
Claude Codeへの指示は「REQUIREMENTS.mdを読んでWeek 1から実装して」の一言で動き出せる設計にしている。
コメント
まだコメントはありません。