late-row-shifts first build

Late row shifts

Fixture for geometry that must follow a bar when layout moves it down AFTER placing it: when the anchors and milestones need more marker rows than the band was sized for, the band grows and the whole chart moves down. (Retroactive row growth, an item landing back on an earlier row and growing it, went away when rows stopped moving up, specs/true-width-layout.md §3.2; the first lane keeps that shape.) What to look for when rendering this: - First lane: "Auth refactor" spills, so "Next" and "Plain thing" drop to row 1, and every later child stays at or below the one before it. The a -> b arrow must land on "Next"'s top edge, the dotted c -> d arrow must leave "Plain thing"'s bottom edge and pass behind no bar on its way to "Next one" (it used to cross "Delta"), and the calendar glyphs on "Plain thing", the group's header row and the parallel's header band must sit on their own (moved) boxes. - The "Ship" milestone's slack arrow leaves "Gamma" (row 2) at its progress strip, not 16px above it. - Marker band: the anchor and the "Beta" milestone collide, so the band grows to two rows and everything below it moves down. The `after:` glyph on "Alpha" must sit inside Alpha's bar, not above it. - "Omega" waits on the code-freeze anchor (it starts two weeks after it), so a dotted stub runs from the anchor's cut line to Omega's start on Omega's (moved) midline.

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/late-row-shifts.nowline
nowline v1

// Fixture for geometry that must follow a bar when layout moves it down
// AFTER placing it: when the anchors and milestones need more marker rows
// than the band was sized for, the band grows and the whole chart moves
// down. (Retroactive row growth, an item landing back on an earlier row
// and growing it, went away when rows stopped moving up,
// specs/true-width-layout.md §3.2; the first lane keeps that shape.)
//
// What to look for when rendering this:
//   - First lane: "Auth refactor" spills, so "Next" and "Plain thing"
//     drop to row 1, and every later child stays at or below the one
//     before it. The a -> b arrow must land on "Next"'s top edge, the
//     dotted c -> d arrow must leave "Plain thing"'s bottom edge and pass
//     behind no bar on its way to "Next one" (it used to cross "Delta"),
//     and the calendar glyphs on "Plain thing", the group's header row and
//     the parallel's header band must sit on their own (moved) boxes.
//   - The "Ship" milestone's slack arrow leaves "Gamma" (row 2) at its
//     progress strip, not 16px above it.
//   - Marker band: the anchor and the "Beta" milestone collide, so the band
//     grows to two rows and everything below it moves down. The `after:`
//     glyph on "Alpha" must sit inside Alpha's bar, not above it.
//   - "Omega" waits on the code-freeze anchor (it starts two weeks after
//     it), so a dotted stub runs from the anchor's cut line to Omega's
//     start on Omega's (moved) midline.

config

style enterprise
  bg: blue
  text: white

roadmap late-row-shifts "Late row shifts" start:2026-01-05 scale:1w

anchor freeze "code-freeze" date:2026-02-02

swimlane retro "Retroactive row growth"
  item a "Auth refactor" duration:2w
  item b "Next" duration:2w after:a
  item c "Plain thing" duration:2w after:2026-01-25
  group g "Pinned group" style:enterprise after:2026-01-19
    item g1 "Gamma" duration:2w
  parallel par "Pinned parallel" before:2026-04-20
    item p1 "Delta" duration:3w
  item d "Next one" duration:2w after:c

swimlane band "Marker band growth"
  item alpha "Alpha" duration:4w after:2026-01-12

swimlane stub "Anchor stub"
  item omega "Omega" duration:2w after:[freeze, 2026-02-16]

milestone beta "Beta" after:alpha
milestone ship "Ship" after:[g1, d]