133 commits since `v3.21.0` (2026-08-19).
**3.22.0** — The planning-poker board is redesigned with a new shared design kit that all browser-facing surfaces now build on. An elevation ladder, radius and motion scales, and a vendored icon set replace per-board glyph strings. The shared board kit (frontend/src/shared/board/) unifies the rail, roster, notch, dock and other components across retro and poker into one Button and one Dropdown that replace five previous variants. The poker board itself now has one entrance instead of three, an announced turn, a dancing duck that faces the page and sleeps during locks, and glyphs drawn on a grid that survives 16px windows. A light-theme contrast audit now runs and enforces contrast minimums. All built outputs are committed; no Node runtime is needed for pip install yeaboi.
· Planning poker board redesigned with new entrance, announced turns, and a grid-based glyph set that renders at any window size `[planning]`
· Shared board kit unifies retro and poker surfaces with one Button, one Dropdown, and consistent rail/roster/notch/dock components `[general]`
· Design basis established: elevation ladder, radius and motion scales, and vendored icon set replace board-local glyph strings `[general]`
· Light theme contrast audit now active and enforced for all browser surfaces `[general]`
· Duck character gains real animation: faces the page, dances to the music, sleeps during locks, and bounces with physics `[planning]`
<details><summary>130 commits</summary>
- a79a53a3 test: the ship page's substring guards read the markup, not the payloads
- c9298055 chore: bump version to 3.22.0 [auto]
- 07bc5fa1 web: the board's scaffolding joins the kit, and a console becomes an aside
- 2476d373 web: lift the board kit out of poker, so the next surface starts where it finished
- 252477fd poker: a duelist's mic goes back when the floor closes
- d29c60e6 test: the light theme's contrast audit was never actually running
- 4fb377a9 board: one entrance for the duelists, not three
- f5bc2d71 board: people travel between the table and the floor
- 13df7899 board: a chair is empty while its occupant is on the floor
- 5d37e5a8 board: the duelists get out of their chairs, and a full room opens smoothly
- 4c2894c2 board: the turn is announced over the whole screen, and the rest of the room watches
- 757ea0ca board: Edit takes the shape of the row it is in
- 4269cbff board: draw the board's glyphs on a grid that survives 16px, and move them
- 64fa25ce board: the dock takes the top bar's corner
- 0f1871b9 board: read the window again once it has stopped moving
- 2f19a801 board: the screen's corners round off rather than appear
- 9ddeae67 board: ask where the viewport starts, not how big two things are
- 8d80beab board: the duck dances while the music is on
- b686d1ae board: the duck sleeps through a lock, and arrives only on arrival
- b739bc6b board: face the duck into the page, and stop the screen curving against browser chrome
- 99dbfc46 web: the console stays a column below the wide breakpoint
- 44959b8c web: a console sheet you cannot see through, and a hand sized off itself
- 6455c1f8 web: a hand that fits one line, and a ticket that cannot be squeezed to nothing
- b73487c2 web: the lift is the fraction of the way up the pointer is
- f35abd44 web: the tether is a ratio of the screen, so it spans the whole board
- 2a95df50 web: the dock has some give while it is dragged, and the tether reaches the top bar
- 7157fd02 web: the dock leans toward the pointer and drops back with some weight
- aaf4902f poker: a second host tab is not evidence the first one stopped
- 1b518976 poker: a tab that interrupted its own recording offers to pick it back up
- 34d21cfb poker: the light cannot outlive the recording
- b4d3c270 poker: the room mic is board state, so the whole room sees the light
- a16763f8 web: the mic is always offered, and says whether it is armed or recording
- 71104ddf web: the recording sign is a light beside the headcount
- 01aef91e web: the room can see it is being recorded, from the bar
- 7d8be099 web: one mic, the host's, and it records the room rather than a turn
- 6be79a12 web: the floor's controls stand between the two people they act on
- 3f303946 web: the row of faces is the table, so it needs no label
- 2fc5aed1 web: the no-mic warning is the host's console's to report
- bce12191 web: the floor sets itself up a row at a time, and the clock stands between the two
- 12a372aa web: the seats spread across the table instead of stacking on its left edge
- 3c4fb2ac web: the floor is a third tab, not a card under the results
- ae872a87 web: the board starts where the bar does, and the duel panel joins the material
- bbfe830d web: the outer columns hold their content at the same inset, and the room cards breathe
- 785f9e78 web: the console leaves room for the ring, and a seat is as wide as its name
- 80343ad5 web: the chromeless exclusions weigh nothing, so a filled button keeps its fill
- 4d61daea web: the room takes its shadow on the way out, and a bare button stays bare
- 98104472 web: colour survives disabling, the bar matches the screen's curve, and the room stops stacking shadows
- 315046e7 web: one material for every control on the board, and the seat is the face
- 51ff6aab web: the console's controls are furniture, not form controls
- 6aca2e15 web: the room settles lower, with room between the cards
- cedf9914 web: the tool panel stands above the notch, and every icon lands on the pixel grid
- a8cfcced web: the room slides out from under the bar, one width for every card
- ad7d781d web: the room deals itself out on hover, and the dock is a lifted pill
- 0aee711c web: the hand is cut off by the screen edge, and the board stops scrolling as one
- 49589597 web: the column comes down with the hand, and the perspective writes itself in
- 2e3c40bc web: the closed hand hangs off the bottom edge, and the results take a tab
- dde4d1e0 web: the bar has no notch, the perspective is a section, the floor opens on a track
- f22b4f7c web: the results are not fenced off from the table above them
- 4147dfe0 web: the avatars are the emoji, at the size of emoji
- 82878cb3 web: a dialog wide enough for its content, and an action the width of it
- 0c3c0b94 poker: the lock stops moving the table, and the avatars are just avatars
- 24a6e113 poker: the readout folds out as well as in
- 4be9a741 web: things that appear now leave the same way
- b372f1d1 poker: the timer has one action, and it is whichever one there is
- eb76120f poker: three small ones the board was getting wrong
- 14b62dd1 poker: the pickers have something to pick, and light gets its own elevation
- 06cf0bf2 poker: the station list escapes the notch, and the pager reads as a control
- 37a5c576 poker: the pager moves to the ticket, and the music says it is working
- d278a8db auth: say it is Claude Code; web: one grammar for the notch panels
- 90056b1b poker: say why the AI failed, and stop the dev board writing to Jira
- b61e53f8 poker: the notch collapses on the way out too
- 7ee521dd poker: an on toggle in the notch is coloured, not ringed
- 877e1b46 poker: the notch grows the panel, and wears the masthead's material
- 15454286 poker: one wall for the dock, and the panel grows out of it
- ea2e97ce design: give midnight an elevation ladder, and quieten the frame again
- a005c69e poker: the screen frame comes back, at a weight you can see
- 37f3ed87 poker: the ticket's properties are pickers, and the frame is gone
- 5ef99430 poker: the whole ticket is editable, and it all reaches the tracker
- f6df4578 poker: the dock stops flying in, and the pills match
- a1367e1f poker: the editor renders as the ticket, not as a form
- 85b6ead3 poker: the ticket edits in place
- 31e82e49 poker: the dock crawls round the corner a control at a time
- 2e55313f poker: the dock has a handle worth grabbing
- 86f0a126 poker: panels grow out of the notch, and icons get their lines back
- a50feee7 poker: the edit button rides with the ticket it edits
- 20b07329 poker: popovers fit themselves, and the invite leads with the link
- 4102bd49 poker: the QR works locally, and four regressions of mine
- 0c00769f poker: draw the wordmark instead of typesetting it
- f16aae50 poker: the ticket's facts are properties, and the masthead stops clipping
- 25663113 poker: a real analyser, and an elevation scale
- 60d93e72 poker: the dock no longer snaps under the cursor
- d28e451c poker: the dock stops styling the popovers it contains
- 4bb65c35 poker: the dock crawls round the corner
- 76206dba poker: the dock cannot leave the wall
- e0ed5a44 poker: notices are a line, not a band
- 451fc7b9 poker: the dock moves, and holds no empty slots
- d68092ae web: ship the typeface, and drop the court art
- 249f4032 poker: take the chrome off, and let the type carry it
- 5832296b poker: sink the wells, raise the controls
- cf12e36f poker: put the board on a material system
- 4cfabb10 poker: cast a court, and give the console one primary
- 4f24bf49 poker: give the surfaces a lit edge
- 02fb94c5 poker: the ticket's chips sit with the title
- 41d4d7f7 poker: stop hiding the ticket body, and draw a tie as a tie
- c29175b4 poker: put the seats back at the table
- 2c685dfc poker: neutralise the deck, drop the outlines, set a measure
- 9f4f1a6c poker: the columns fill the screen
- f8f7000a design: apply the basis — elevation, radius, motion, icons
- a03a5075 design: vendor an icon set
- 34274afd poker: bare controls in the notch, and put it on the grid
- d2d64554 poker: connect the fillets to the dock's edges
- 3ea893fc poker: the dock is a lifted section of the bottom border
- a4ff260d poker: fillet the dock's other join too
- 08bb8188 poker: draw the fillet as a ring, not a rounded corner
- 7864276b poker: fillet the inside corner where the dock leaves the frame
- e37bb4b2 poker: round the dock's top-right, close it when it is lifted
- f9adb279 poker: the dock replaces the frame's border, not doubles it
- 761a4971 poker: dock into the frame corner, strip the ticket panel
- bc1ef1fc poker: lift the frame over the dock, fill the column
- f96cccee poker: seat the dock in the frame, balance the bar
- 3ded6db9 poker: dock the tools bottom-right, like the TUI
- 91999951 poker: bigger cards, banded by value
- aa236818 poker: centre the title against the wordmark, drop the divider
- eafac0a4 poker: identity and toolbar share one row
- 38c3afdd poker: the table loses its panel and sits on the deck
- 326f81f4 poker: sit the table with the deck at the bottom of the column
- 80a94ef2 poker: float the chrome, anchor the deck, drop the footer
- 103bafb6 web: jet-black corners, and a comment rule to write to
- c74619a7 web: the frame goes to the glass, and dev boards keep their token
- d9a90725 web: the board is one framed screen, and modals centre again
</details>
What's Changed
* redesign the planning-poker board, and build the shared kit it needs by neakoh in https://github.com/dinho149/yeaboi.ai/pull/305
**Full Changelog**: https://github.com/dinho149/yeaboi.ai/compare/v3.21.0...v3.22.0