スプリント 仕様書
イテレーション管理・バーンダウンチャート
ステータス: Draft / 作成日: 2026-05-27 PR #3 — 依存: コア
1. 概要
2 週間程度の時間軸イテレーション管理。マイルストーンが「リリース単位」とすれば、スプリントは「作業サイクル単位」。バーンダウンチャートとセットで進捗管理を実現する。
2. データモデル
2.1 sprints
pub struct Model {
pub id: Uuid,
pub project_id: Uuid,
pub name: String,
pub goal: Option<String>,
pub start_date: NaiveDate,
pub end_date: NaiveDate,
pub status: SprintStatus, // planning | active | completed
pub created_by: Uuid,
pub created_at: DateTimeUtc,
pub updated_at: DateTimeUtc,
}
status='active'のスプリントはプロジェクト内で同時に 1 つのみ。Start API 呼び出し時にアクティブスプリントが存在する場合は409 Conflict。
タスクとの紐付けは tasks.sprint_id カラム(コア PR で追加済み)で行う。
3. マイグレーション
CREATE TABLE sprints (
id UUID PRIMARY KEY,
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL,
goal TEXT,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
status VARCHAR NOT NULL DEFAULT 'planning',
created_by UUID NOT NULL REFERENCES users(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
CHECK (start_date <= end_date)
);
-- tasks テーブルへ sprint_id を追加(コア PR の後に実行)
ALTER TABLE tasks ADD COLUMN sprint_id UUID REFERENCES sprints(id) ON DELETE SET NULL;
CREATE INDEX idx_tasks_sprint ON tasks(sprint_id) WHERE sprint_id IS NOT NULL;
4. API
POST /sprints
{
"name": "Sprint 3",
"goal": "認証機能の完成",
"start_date": "2026-06-01",
"end_date": "2026-06-14"
}
POST /sprints/{id}/complete
未完了タスクをどこへ移動するかを指定する:
{
"move_incomplete_to_sprint_id": "uuid",
"move_incomplete_to_backlog": false
}
どちらも指定しない場合、タスクの sprint_id を NULL にして Backlog 扱いにする。
GET /sprints/{id} レスポンス(バーンダウン含む)
{
"id": "uuid",
"name": "Sprint 3",
"start_date": "2026-06-01",
"end_date": "2026-06-14",
"status": "active",
"task_counts": { "total": 20, "done": 5, "in_progress": 8 },
"burndown": [
{ "date": "2026-06-01", "ideal_remaining": 20, "actual_remaining": 20 },
{ "date": "2026-06-02", "ideal_remaining": 18, "actual_remaining": 17 },
{ "date": "2026-06-03", "ideal_remaining": 17, "actual_remaining": 19 }
]
}
バーンダウンのポイント:
ideal_remaining: 線形補間で計算(開始タスク数 → 0 を期間で均等割り)actual_remaining: その日時点でis_done_state=trueでないタスク数- 当日までのデータのみ返す(未来は含まない)
5. フロントエンド(Phase B)
ページ
/tenants/{tid}/projects/{pid}/sprints # スプリント一覧 + バーンダウン
バーンダウンチャート
残タスク数
20│╲
│ ╲ ─── ideal
15│ ╲─
│ ╲ ╲ actual(遅延中)
10│ ─────╲
│ ╲
5│ ──── 現在地 (6/3)
│
0└──────────────────── 日付
6/1 6/14
- 赤線 = actual が ideal より上(遅延)
- 青線 = actual が ideal より下(前倒し)