スプリント 仕様書

イテレーション管理・バーンダウンチャート

ステータス: 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,
}
カラム 制約 説明
id UUID PK  
project_id UUID NOT NULL, FK→projects CASCADE  
name VARCHAR(255) NOT NULL 例: "Sprint 3", "2026-W23"
goal TEXT NULLABLE スプリントゴール
start_date DATE NOT NULL  
end_date DATE NOT NULL  
status VARCHAR NOT NULL DEFAULT 'planning' planning / active / completed
created_by UUID NOT NULL, FK→users  
created_at TIMESTAMPTZ NOT NULL DEFAULT now()  
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()  
CHECK(start_date <= end_date)  

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

メソッド パス 説明
GET /sprints 一覧(status でフィルター可)
POST /sprints 作成(planning 状態で作成)
GET /sprints/{id} 取得(バーンダウンデータ含む)
PUT /sprints/{id} 更新(planning 状態のみ)
DELETE /sprints/{id} 削除(planning 状態のみ)
POST /sprints/{id}/start 開始(→ active
POST /sprints/{id}/complete 完了(→ completed

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 より下(前倒し)

コンポーネント

コンポーネント ファイル
SprintPage pages/sprints/+Page.vue
SprintCard components/sprint/SprintCard.vue
BurndownChart components/sprint/BurndownChart.vue
SprintTaskList components/sprint/SprintTaskList.vue