06. 進捗と実績

計画を立てた後、実績を入れて追跡する。ここから「動いているプロジェクト」の管理になる。

now を 08-17 に置き、それ以前の実績を booking で与える。TaskJuggler は
now より前には新たな割当をせず、残作業だけを now 以降に再配置する
(projection モード)。

生成されたレポート

ファイル 内容
progress.html 実績を反映したスケジュール (complete / gauge 列つき)
people.html リソース別の実績と予定

実行結果

now = 2026-08-17 のときのスケジュール。

タスク 開始 終了 進捗 ゲージ
① 予定どおり完了 08-03 08-07 100% on schedule
② 半分だけ進んだ 08-10 08-21 50% on schedule
③ 進捗率のみ手入力 08-17 08-21 60% ahead of schedule
④ 未着手 (②待ち) 08-24 08-28 0% on schedule

② は 10 人日のうち 5 人日ぶんの実績があり、残り 5 人日が now 以降に
再スケジュールされて
08-21 終了になっている。
③ は booking がないので now から開始する扱いになり、complete 60 との
ギャップが “ahead of schedule” として出ている。

ソース

progress.tjp
/*
 * 06: 進捗と実績の追跡
 *
 * 実行: bundle exec tj3 -o 06-progress/out 06-progress/progress.tjp
 *
 * now を 8/17 に置き、それ以前の実績を booking で与える。
 * TaskJuggler は now より前には新たな割当をせず、
 * 残作業だけを now 以降に再配置する (projection モード)。
 */

/*
 * 注意: project ヘッダの日付は timezone 属性を読む *前* に解釈されるため
 * UTC 基準になる。"2026-08-03" と書くとプロジェクト開始は
 * 2026-08-03 09:00 JST になり、8/3 0:00 を含む booking は
 * 「プロジェクト期間外」エラーになる。
 * 実績を日付境界で書きたいので、開始を週末側に少し広げてある。
 */
project prog "進捗と実績" 2026-08-01 +2m {
  timezone "Asia/Tokyo"
  timeformat "%Y-%m-%d"

  // 「今日」をプロジェクト途中に置く。ここが計画と実績の境界になる
  now 2026-08-17

  /*
   * 実績を記録するシナリオを指定する。
   * これを指定すると、そのシナリオは projection モードでスケジュールされ、
   * now より前の割当は booking で与えられたものだけになる。
   *
   * 旧 projection キーワードは非推奨。booking があれば自動で有効になる。
   */
  trackingscenario plan
}

resource alice "Alice"
resource bob   "Bob"
resource carol "Carol"

// ---- ① 実績どおり完了したタスク ----

/*
 * booking は「実際に作業した時間」を記録する。
 *   sloppy 0 : 非稼働時間・休暇・他タスクの割当を一切含んではいけない (既定)
 *   sloppy 1 : 非稼働時間は含んでよい
 *   sloppy 2 : 非稼働時間と休暇を含んでよい
 *
 * 区間は <日付> - <日付> 形式。終了日は 0 時に展開されるので
 * 8/3 - 8/8 は「8/3〜8/7 の 5 日間」を意味する。
 * 区間内の稼働時間だけが実績として計上される (5 日 x 8h = 40h = 5人日)。
 */
task done "① 予定どおり完了" {
  effort 5d
  allocate alice
  booking alice 2026-08-03 - 2026-08-08 { sloppy 2 }
}

// ---- ② 途中まで進んで遅れているタスク ----

/*
 * 10 人日のうち 5 人日ぶんだけ実績がある。
 * 残り 5 人日は now (8/17) 以降に再スケジュールされる。
 */
task delayed "② 半分だけ進んだ" {
  effort 10d
  allocate bob
  booking bob 2026-08-10 - 2026-08-15 { sloppy 2 }
}

// ---- ③ 進捗率だけ手入力するタスク ----

/*
 * complete はスケジューラに一切影響しない。
 * レポートの complete / gauge 列とガントチャートの塗り分けに使われるだけの
 * ドキュメント用途。TODO リスト的な簡易管理向け。
 * 正確に追跡したいなら booking を使う。
 */
task rough "③ 進捗率のみ手入力" {
  effort 5d
  allocate carol
  complete 60
}

// ---- ④ 未着手のタスク ----

task pending "④ 未着手 (②の完了待ち)" {
  effort 5d
  allocate alice
  depends !delayed
}

// ---- レポート ----

/*
 * complete 列は進捗率、gauge 列はそれをグラフィカルなゲージで表示する。
 * ガントチャートでは now の位置に縦線が入り、
 * 完了済みの部分が濃い色で塗られる。
 */
taskreport progress "progress" {
  formats html
  headline "実績を反映したスケジュール (now = 2026-08-17)"
  columns name, start, end, effort, complete, gauge, chart
}

resourcereport people "people" {
  formats html
  headline "リソース別の実績と予定"
  columns name, effort, chart
  loadunit days
}

学ぶ内容

booking と complete の違い

  booking complete
スケジューラへの影響 あり (残作業を再計算) なし
用途 正確な実績追跡 TODO リスト的な簡易管理
表示 工数・日付に反映 complete / gauge 列とガントの塗り分けのみ

sloppy の値

booking の区間が非稼働時間と衝突したときの扱い。

値 許容する内容
0 (既定) 非稼働時間・休暇・他タスクの割当を一切含めない
1 非稼働時間は含んでよい
2 非稼働時間と休暇を含んでよい

日付境界で書くなら sloppy 2 が扱いやすい。
booking alice 2026-08-03 - 2026-08-08 { sloppy 2 } で「8/3〜8/7 の稼働時間ぶん」= 5人日。

ハマりどころ

  1. project ヘッダの日付は timezone を読む前に UTC で解釈される。
    2026-08-03 と書くと開始は 08-03 09:00 JST になり、
    booking で 8/3 0:00 を指すと「プロジェクト期間外」エラーになる。
    この教材では開始を 2026-08-01 に広げて回避している
  2. 区間の終了日は 0 時に展開されるので終了日当日は含まれない。
    booking alice 2026-08-03 - 2026-08-08 は 8/3〜8/7 の 5 日間になる
  3. projection キーワードは非推奨。booking があれば projection モードは自動で有効になる
  4. booking は本来エクスポートで機械生成するものとされている。
    手書き用に sloppy / overtime が用意されている
  5. effortdone / effortleft は「未テスト」警告つきの機能。使うなら結果を検証すること

得られるもの

計画と実績のズレを数値で把握し、残作業がいつ終わるのかを再計算させられるようになる。
実績を別ファイルに分離する実務パターンは 11 の supplement で扱う。