utilization-states first build

Lane utilization states

Fixture exercising the tri-state lane utilization underline (m13). Each lane has `capacity:` declared so the underline paints; the segments along the band's bottom edge map to the lane's per-timestep load against capacity: green — load < `utilization-warn-at` (default 80%) yellow — load in `[warn-at, over-at)` (default warn 80%, over 100%) red — load >= `utilization-over-at` (default 100%) Items use `duration:` literals (not `size:`) so each bar — and therefore each underline segment — is the full lane width and the color band is easy to read at a glance. For a small real-world story (on-call support as a capacity sink) see examples/capacity.nowline. See specs/rendering.md § Lane utilization underline for the full model.

theme: light now: 2026-02-09

bea64f3 Publish the review gallery to review.nowline.dev (#187)

First build in the history; nothing to compare against.

tests/utilization-states.nowline
nowline v1

// Fixture exercising the tri-state lane utilization underline (m13).
// Each lane has `capacity:` declared so the underline paints; the
// segments along the band's bottom edge map to the lane's per-timestep
// load against capacity:
//
//   green  — load < `utilization-warn-at` (default 80%)
//   yellow — load in `[warn-at, over-at)`  (default warn 80%, over 100%)
//   red    — load >= `utilization-over-at` (default 100%)
//
// Items use `duration:` literals (not `size:`) so each bar — and
// therefore each underline segment — is the full lane width and the
// color band is easy to read at a glance. For a small real-world story
// (on-call support as a capacity sink) see examples/capacity.nowline.
// See specs/rendering.md § Lane utilization underline for the full model.

roadmap r "Lane utilization states" start:2026-01-05 length:8w

// Lane 1 — healthy. Single item at 2/5 = 40% load. Green for the
// whole span (the underline reads as one continuous green rectangle).
swimlane healthy "Healthy (40%)" capacity:5
  item a "Build" duration:6w capacity:2

// Lane 2 — warn. Single item at 4/5 = 80% load lands exactly on the
// `warn-at` threshold. One yellow rectangle.
swimlane stressed "At warn threshold (80%)" capacity:5
  item b "Build" duration:6w capacity:4

// Lane 3 — over. Two parallel items push load to 6/5 = 120%, painting
// red for the whole span.
swimlane overloaded "Over capacity (120%)" capacity:5
  parallel
    item c1 "Stream A" duration:6w capacity:4
    item c2 "Stream B" duration:6w capacity:2

// Lane 4 — segment coalescing demo. The underline transitions across
// time as load changes:
//   warmup alone  : 1/5 = 20% → green
//   parallel block: 5/5 = 100% → red
//   cooldown alone: 1/5 = 20% → green
swimlane mixed "Coalesced segments (green-red-green)" capacity:5
  item warmup "Warm" duration:1w capacity:1
  parallel
    item p1 "Burst A" duration:4w capacity:3
    item p2 "Burst B" duration:4w capacity:2
  item cooldown "Cool" duration:1w capacity:1

// Lane 5 — custom thresholds. Tighter warn band (50%) and slack on
// over (120%). Same 4-capacity item now reads yellow (80%) without
// tipping red until load passes 120%.
swimlane custom "Custom thresholds (warn:50% over:120%)" capacity:5 utilization-warn-at:50% utilization-over-at:120%
  item d "Build" duration:6w capacity:4

// Lane 6 — full opt-out. Lane has capacity but no underline paints.
// Useful when the lane's capacity is a budget signal but the author
// doesn't want the per-timestep visual.
swimlane silent "Opt-out (warn:none over:none)" capacity:5 utilization-warn-at:none utilization-over-at:none
  item e "Build" duration:6w capacity:8