Charts / CH-TIM-02
CH-TIM-02 . family TIM

S-CURVE

line (cumulative S-curve). Needs: ordered periods + cumulative non-decreasing series (Actual key; Plan/Forecast context).

scheduleprogresschange-over-time

DL-01 AGRAW
Cumulative progress reached 63% in August, 9 points behind plan 0 20 40 60 80% Jan Feb Mar Apr May Jun Jul Aug Plan Actual slippage steady since May Source: sample dataset v1, 2026-07-12

Use when

  • cumulative progress vs plan over the project timeline
  • schedule status reporting (the classic planning S-curve)
  • any cumulative measure where the gap to plan IS the message

Do not use when

  • non-cumulative period values (use CH-TIM-01 LINE)
  • categorical comparison (use CH-RNK-01 or CH-MAG-01)
  • more than 4 curves (plan, actual, forecast is the usual max)

See instead

  • values are per-period, not cumulative: CH-TIM-01

Alternatives

  • CH-TIM-08 (fan with uncertainty, planned)

Rules

  • values are cumulative and non-decreasing; a dip means wrong data, not a style choice
  • y starts at zero, always (an S-curve with a cut baseline lies about progress)
  • Actual is the key series; Plan and Forecast are context
  • series labeled at line ends, never a legend
  • horizontal gridlines only
  • the annotation names the gap or the inflection, anchored at the data

Never do this

  • legend boxes
  • truncated y axis to flatter progress
  • plotting period values and calling it an S-curve
  • markers on every point
  • smoothed splines (the curve shape IS the information)

QA before delivering

  • every series non-decreasing
  • y axis starts at zero
  • no legend anywhere
  • series labels at line ends
  • annotation present and anchored to a data point
  • title states the gap with a number
  • source line present bottom-left

Data shape

titlestring, action title stating the gap with a number
eyebrowstring caps, rendered only when the DL chrome asks for it
sourcestring, rendered bottom-left, always
unitstring, usually %, appears once, on the top y tick label
xarray of ordered period labels
seriesarray of {name, values cumulative non-decreasing, role: 'key'|'context'}, exactly one key (Actual); Plan and Forecast are context
annotation{text, series, index, tx, ty, anchor}, names the gap or the inflection
Sample data (golden)
{
  "title": "Cumulative progress reached 63% in August, 9 points behind plan",
  "eyebrow": "SCHEDULE . MONTH 8",
  "source": "Source: sample dataset v1, 2026-07-12",
  "unit": "%",
  "x": [
    "Jan",
    "Feb",
    "Mar",
    "Apr",
    "May",
    "Jun",
    "Jul",
    "Aug"
  ],
  "series": [
    {
      "name": "Plan",
      "values": [
        4,
        10,
        19,
        30,
        42,
        54,
        64,
        72
      ],
      "role": "context"
    },
    {
      "name": "Actual",
      "values": [
        3,
        8,
        16,
        26,
        36,
        46,
        55,
        63
      ],
      "role": "key"
    }
  ],
  "annotation": {
    "text": "slippage steady since May",
    "series": "Actual",
    "index": 5,
    "tx": 520,
    "ty": 330,
    "anchor": "end"
  }
}