Skip to content

Commit a8ae83d

Browse files
midagedevclaude
andcommitted
media: the 0.22 sprint + retro hero, ko — one take for the release tweet (GDK-1708)
Three vision passes shaped the beats: no hover beats (the recording has no cursor, so a tooltip beat is a still), the board stands on the whole pool so the Done column is full beside the strip's 6 / 20, the palette holds a second, and the fuller in-progress cell is the door at the end. 12 s, 1280×800, poster at the strip. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
1 parent 770f493 commit a8ae83d

6 files changed

Lines changed: 37 additions & 48 deletions

File tree

468 KB
Loading
3.67 MB
Loading
750 KB
Binary file not shown.

docs/project/MEDIA.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ each run with a fake credential.)
6060
| `docs/media/groupby-still.png` | `e2e/demo/site-stills.mjs` | landing group-by exhibit (2x still; see the landing policy table) |
6161
| `docs/media/sprint.ko.gif` / `sprint.ko.mp4` (+`sprint-poster.ko.png`) | Playwright `e2e/demo/sprint-demo.spec.ts` via `e2e/demo/export-sprint.sh` (`make media-sprint` — outside the `make media` aggregate: a release cut is shot once, not regenerated by every contributor) | the 0.22 release cut, ko only (Twitter) — the board scoped to the active sprint, to the backlog (`sprint is EMPTY`, the slice that had no name before), and back, every beat through the affordance so the URL follows on its own |
6262
| `docs/media/retro.ko.gif` / `retro.ko.mp4` (+`retro-poster.ko.png`) | Playwright `e2e/demo/retro-demo.spec.ts` via `e2e/demo/export-retro.sh` (`make media-retro` — outside the `make media` aggregate, same reason as media-sprint) | the 0.22 release cut's second half, ko only (Twitter) — the weekly report opened from the palette, the range widened to 8 weeks, and a number clicked: the issues behind it stand on the list as a keys view |
63-
| `docs/media/sprint-retro-hero.ko.mp4` (+`sprint-retro-hero.ko.gif`, `sprint-retro-hero-poster.ko.png`) | Playwright `e2e/demo/sprint-retro-hero.spec.ts` via `e2e/demo/export-sprint-retro-hero.sh` (`make media-hero-sprint-retro` — outside the `make media` aggregate, same reason as media-sprint) | the 0.22 release tweet, ko only — both halves in one take: the board scoped to the active sprint with its strip (name · goal · dates · days left · progress bar) and a carried card's mark, then the retro from the palette with its summary strip and sparklines, cut by sprint, and one number opened into its issues |
63+
| `docs/media/sprint-retro-hero.ko.mp4` (+`sprint-retro-hero.ko.gif`, `sprint-retro-hero-poster.ko.png`) | Playwright `e2e/demo/sprint-retro-hero.spec.ts` via `e2e/demo/export-sprint-retro-hero.sh` (`make media-hero-sprint-retro` — outside the `make media` aggregate, same reason as media-sprint) | the 0.22 release tweet, ko only — both halves in one take: the board scoped to the active sprint with its strip (name · goal · dates · days left · progress bar, the Done column full beside it), then the retro from the palette with its summary strip and sparklines, cut by sprint, and one number opened into its issues |
6464
| `docs/media/history.gif` / `history.mp4` (+`history-poster.png`) | Playwright `e2e/demo/history-demo.spec.ts` via `e2e/demo/export-history.sh` | history exhibit motion cut — the landing exhibit itself ships the still below |
6565
| `docs/media/history-still.png` | `e2e/demo/site-stills.mjs` | landing history exhibit (2x still; see the landing policy table) |
6666

e2e/demo/export-sprint-retro-hero.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ if [[ "$TOOK" != "$LOCALE" ]]; then
3434
echo " re-record: GADAK_MEDIA_LOCALE=$LOCALE make media-hero-sprint-retro" >&2
3535
exit 3
3636
fi
37-
echo "export-sprint-retro-hero: locale $LOCALE -> sprint$TAG.mp4, sprint$TAG.gif"
37+
echo "export-sprint-retro-hero: locale $LOCALE -> sprint-retro-hero$TAG.mp4, sprint-retro-hero$TAG.gif"
3838

3939
WEBM="$(find "$RESULTS" -type f -name 'video.webm' | head -n 1 || true)"
4040
if [[ -z "${WEBM}" ]]; then
@@ -96,7 +96,7 @@ fi
9696
# list, so frame one is a poster that says nothing about sprints. POSTER_AT
9797
# is the board beat, after the scope has narrowed to the active sprint —
9898
# the one frame that carries the claim. Re-time it if the beats move.
99-
POSTER_AT=6.0
99+
POSTER_AT=4.0
100100
ffmpeg -y -v error -ss "$POSTER_AT" -i "$OUT_DIR/sprint-retro-hero${TAG}.mp4" -frames:v 1 "$OUT_DIR/sprint-retro-hero-poster${TAG}.png"
101101

102102
echo "export-sprint-retro-hero: wrote $OUT_DIR/sprint-retro-hero${TAG}.gif ($(size_bytes) bytes)"

e2e/demo/sprint-retro-hero.spec.ts

Lines changed: 34 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,18 @@
33
*
44
* Two claims in one cut. The board, scoped to the active sprint, now says
55
* what that sprint is in a line of its own: name, dates, days left, a
6-
* progress bar counted over the whole sprint (GDK-1709), and the cards
7-
* carry how many sprints they have already been through (GDK-1711). Then
8-
* the retro, from the palette: the running bucket summarised above the
9-
* table, a sparkline on every row, the cut switched to sprints, and one
10-
* number clicked open into the issues behind it (GDK-1712, GDK-1693).
6+
* progress bar counted over the whole sprint (GDK-1709). Then the retro,
7+
* from the palette: the running bucket summarised above the table, a
8+
* sparkline on every row, the cut switched to sprints, and one number
9+
* clicked open into the issues behind it (GDK-1712, GDK-1693).
10+
*
11+
* No hover beats. Playwright's recording carries no cursor, so a beat
12+
* whose whole content is a tooltip records as a still — the first take
13+
* spent three seconds that way (vision pass, 2026-09-09). The carry-over
14+
* mark (GDK-1711) is in frame on the cards but not narrated for the same
15+
* reason. And the board stands on the whole sprint, not the open pool: the
16+
* strip counts done issues, so a Done column emptied by the open-only view
17+
* read as a contradiction beside "6 / 20 · 30%".
1118
*
1219
* No terminal, no CLI, no DOM caption. Gated by GADAK_MEDIA=1. Viewport and
1320
* video size must stay 1280×800 (sprint-retro-hero.config.ts) or Playwright
@@ -54,82 +61,64 @@ test.describe('sprint + retro hero', () => {
5461
await expect(page.getByTestId('issue-layout')).toBeVisible({ timeout: 30_000 })
5562
await expect(page.getByTestId('issue-list-scroller')).toBeVisible()
5663
await expect(page).toHaveURL(/[#?&]sc=/, { timeout: 30_000 })
57-
await beat(page, 600)
58-
59-
// The team's whole open pool, not "My issues" — a sprint board is a
60-
// team surface (same reason as sprint-demo.spec.ts).
61-
await page
62-
.getByRole('button', { name: new RegExp('^' + T['view.allOpen.name']) })
63-
.first()
64-
.click()
65-
await expect(page.getByTestId('issue-list-scroller')).toBeVisible()
66-
await beat(page, 700)
64+
await beat(page, 900)
6765

68-
// Into the board the way a person does.
69-
await page.getByTestId('view-settings').click()
70-
await beat(page, 400)
71-
await page.getByTestId('layout-board').click()
72-
await expect(page.getByTestId('board')).toBeVisible()
73-
await page.keyboard.press('Escape')
66+
// The whole pool as a board, not "My issues" — a sprint board is a team
67+
// surface, and the strip counts done issues, so the Done column has to
68+
// hold them. A built-in view's own filters are not chips (GDK-1336), so
69+
// there is nothing to clear; the view-less board is a route, and the
70+
// recording never shows the address bar.
71+
await page.goto('/#/?ly=board')
72+
await expect(page.getByTestId('board')).toBeVisible({ timeout: 30_000 })
7473
const scope = page.getByTestId('sprint-scope')
7574
await expect(scope).toBeVisible()
7675
await expect(scope).toContainText(T['board.scopeAxis'])
77-
await beat(page, 1000)
76+
await beat(page, 1500)
7877

7978
// Beat 1 — the sprint gets its line. Scope to the active sprint and the
8079
// strip stands between the toolbar and the columns: name, dates, days
81-
// left, the bar.
80+
// left, the bar — and the Done column is full beside it.
8281
await page.getByTestId('sprint-scope-active').click()
8382
await expect(page).toHaveURL(/sst=active/)
8483
const strip = page.getByTestId('sprint-strip')
8584
await expect(strip).toBeVisible()
8685
await expect(page.getByTestId('sprint-strip-name')).toHaveText(/\S/)
8786
await expect(page.getByTestId('sprint-strip-count')).toHaveText(/\d+ \/ \d+ · \d+%/)
8887
await expect(page.getByTestId('board-card').first()).toBeVisible()
89-
await beat(page, 1800)
90-
// The bar's basis, on hover (G7) — the cursor rests on it long enough to read.
91-
await page.getByTestId('sprint-strip-bar').hover()
92-
await beat(page, 1500)
88+
await expect(page.getByTestId('board-card-carryover').first()).toBeVisible()
89+
await beat(page, 2800)
9390

94-
// Beat 2 — a card that has been carried. The mark is the last thing on
95-
// the card's meta line; hovering says how many sprints it has sat in.
96-
const carried = page.getByTestId('board-card-carryover').first()
97-
await expect(carried).toBeVisible()
98-
await carried.hover()
99-
await beat(page, 1600)
100-
101-
// Beat 3 — the retro, from the palette, the way it is reached.
91+
// Beat 2 — the retro, from the palette, the way it is reached.
10292
await page.keyboard.press('ControlOrMeta+k')
103-
await beat(page, 500)
93+
await beat(page, 1000)
10494
await page.getByTestId('palette-action-retro').click()
10595
const view = page.getByTestId('retro-view')
10696
await expect(view).toBeVisible()
10797
await expect(view).toContainText(T['retro.title'])
10898
await expect(page.getByTestId('retro-summary')).toBeVisible()
10999
await expect(page.getByTestId('retro-table')).toBeVisible()
110100
await expect(page.getByTestId('retro-sparkline').first()).toBeVisible()
111-
await beat(page, 2400)
101+
await beat(page, 1600)
112102

113-
// Beat 4 — the same report cut by sprint: two named columns, the
103+
// Beat 3 — the same report cut by sprint: two named columns, the
114104
// running one marked, the summary retitled to the sprint.
115105
await page.getByTestId('retro-range').filter({ hasText: T['retro.bySprint'] }).click()
116106
await expect(page.getByTestId('retro-week')).toHaveCount(2)
117107
await expect(page.getByTestId('retro-week').last()).toContainText(T['retro.thisSprint'])
118108
await expect(page.getByTestId('retro-summary-title')).toContainText(T['retro.thisSprint'])
119-
await beat(page, 2400)
109+
await beat(page, 1800)
120110

121-
// Beat 5 — a number is a door. The closed cell of the running sprint
122-
// opens the issues that closed in it, as a keys view.
123-
const cell = page.locator('[data-testid="retro-cell"][data-metric="closed"]').last()
111+
// Beat 4 — a number is a door. The in-progress cell of the running
112+
// sprint opens the issues behind it, as a keys view (the fuller list of
113+
// the two doors in the demo mirror).
114+
const cell = page.locator('[data-testid="retro-cell"][data-metric="in progress"]').last()
124115
await expect(cell).toBeVisible()
125-
await cell.hover()
126-
await beat(page, 800)
127116
await cell.click()
128117
await expect(view).toBeHidden()
129118
await expect(page.getByTestId('issue-list-scroller')).toBeVisible()
130119
await expect.poll(() => page.url()).toContain('ks=')
131120
await expect(page.getByTestId('issue-row-trail').first()).toBeVisible()
132-
await beat(page, 2200)
121+
await beat(page, 1800)
133122

134123
expect(errors.filter((e) => !e.includes('409') && !e.includes('502'))).toEqual([])
135124
})

0 commit comments

Comments
 (0)