Make each board on Home a deck of its next cards, and For you two lines a card #260
No reviewers
Labels
No labels
No milestone
No project
No assignees
5 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Grandiras/Ponente!260
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "ui-v2-home"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of the v2 polishing pass. On Home, each board becomes a deck of its next cards, as in the round-two Stacks sketch, and For you gets denser.
What changes
Cost
GetTilesAsyncadds two queries (the decks' cards, their tags' colours) and decrypts at most three titles and dates a board. Columns are read only until they hold three cards. The column filter is repeated inside theROW_NUMBERsubquery: reached only through the join, Postgres numbered every card in the deployment first (+4 ms at 6,000 cards). Measured with the app's services over the split-query factory, median of 25 runs:For you adds the column's name to its second pass; its allocation is unchanged.
Docs
boards-and-permissions.md(the home page and the strip),data.md(the hot path, the SQL trap and the re-measured tiles column),frontend.md(the v2 status line and its departures, and the entrance). The unreleased changelog's Home line now names the decks; the changelog allows seven unreleased lines, so it is the same line.Verified
tools/verify.shgreen (600 unit tests). Playwright on an isolated stack: home, board-entrance, mobile, access and boards specs 40/40; full suite below. Screenshots at 1440, 1920, 1100, 820 and 390, light and dark, with hover.🤖 Generated with Claude Code
🤖 Reviewing this PR — the review will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the review runs.
🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the task runs.
✅ Verdict: approve — no blocking issues found.
I found no correctness problems in this change, and I didn't run the build or tests. I read the diff only.
GetTilesAsync:dealtlist is handled.Deckcan't pull from the skipped last column, becausetopsOfonly has entries for dealt columns.Take, as the docs say.PositionthenIdis consistent between the SQL and the in-memory re-sort.ForYouService: The extraColumnNameprojection is decrypted only for the six winners, as the docs say.docs/is updated in the same PR, including the allocation table, and the changelog line is changed in both locales without adding an eighth line.Three minor notes, none blocking:
.board-tile-controls { bottom: 61px }is a hand-summed offset that assumes the counts line and foot are one line each. It will drift if either ever wraps.display: none, but the server still decrypts up to three titles and dates per board. That's a small cost and already counted in the measurements.aria-hidden, so a screen reader hears nothing of the cards. The comment says this is intended.🧠 claude-sonnet-5-5 · ⏱ 0m 13s · 2 turns · tokens: 45.7k in / 1.5k out (+0 cache-read)
📜 Full session transcript
🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the task runs.
✅ Verdict: approve — no blocking issues found.
My last pass approved with no blocking issues, so there was nothing to confirm as fixed. I re-read the diff only and did not build or run tests. I found no new problems.
GetTilesAsyncstill deals correctly: it skips the last column once there are two, stops at three held cards, and handles an emptydealtlist. The column filter is repeated inside the numbering, as the docs say.ForYouServicedecrypts the extra column name only for the six winners.Non-blocking notes carried over from last time:
.board-tile-controls { bottom: 61px }is a hand-summed offset. It will drift if the counts line or the foot ever wraps.display: none, but the server still decrypts up to three titles and dates per board. That cost is already in the measurements.aria-hidden, which the code comment says is intended.🧠 claude-sonnet-5-5 · ⏱ 0m 4s · 2 turns · tokens: 34.2k in / 484 out (+12.2k cache-read)
📜 Full session transcript
✅ Verdict: approve — no blocking issues found.
Nice piece of work — the deck tiles, two-line For you cards and shared field/button sizing all hang together, the docs and measurements read, and the e2e/unit coverage is updated with it. Approving; three small notes.
Sorting duplication, deliberate?
topsOfgets its order fromtops.OrderBy(c => c.Position).ThenBy(c => c.Id), while the SQL already ordered andTake(3)ed per column; the in-memory sort is only needed for the cross-column appearance order inside a deck. Harmless, but a sentence in the remark inGetTilesAsyncwould spare the next reader the double-check.e2e covers a one-card deck only.
home.spec.jsnow asserts one.board-tile-minifrom a board whose single card sits in its first column, so the Sacramento cross-column path (two columns, last one left out; two askew cards) and the dashed empty-place is only exercised by the CSS:hasfallback. A deck-of-two or an empty-board assertion would catch a regression there cheaply.Verified otherwise for my own peace of mind, no action needed: the deal's
GroupByiteration order keepsColumnCardCounts[0]as the "to do" count (LINQ to objects order is guaranteed), the entrance's reduced-motion bail sits earlier in the same gate so the deck deal can't run although the CSS fan can't (intended, per the docs), the removed.board-tile-barhas no remaining test/spec references, and the tag colours reaching inline styles come straight fromTag.Colorin the normal appliance path, same trust boundary as the existing chip rendering.⏱ 2m 35s · 16 steps · $0.0353 · tokens: 60.1k in / 1.1k out (+514.8k cache-read) · Go: 5h 0% · wk 2% · mo 92%
📜 Full session transcript
🤖 Reviewing this PR — the review will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the review runs.
🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the task runs.
✅ Verdict: approve — no blocking issues found.
I re-read only the new commit, which adds a comment in
GetTilesAsyncand widens the e2e test. I didn't build or run anything. I found no problems, and my earlier notes were non-blocking.Doing,Card, with nothing from the last column. That matches the deal logic and the reverse render, and it covers the case where the deck spans columns./3.*1/fits "3 cards · 1 to do".Still non-blocking from before:
bottom: 61pxoffset on.board-tile-controlswill drift if the counts line or the foot ever wraps.🧠 claude-sonnet-5-5 · ⏱ 0m 7s · 4 turns · tokens: 36.4k in / 512 out (+106.6k cache-read)
📜 Full session transcript
Full Playwright suite on an isolated stack: 162/162 on
73d26e3. After that,f241532only limits the deck's hover and press to 600px and up (CSS), and994b566adds the reviewers' deck dealt across columns tohome.spec.jsand a comment on why the decks are sorted again:home.spec.js6/6 on994b566.🤖 Generated with Claude Code
✅ Verdict: approve — no blocking issues found.
Re-review: the new commits brought no changes to the areas my earlier notes covered, and the last outstanding items were minor and stay non-blocking.
BoardService.GetTilesAsync: skip-last-when-two,held >= DeckSizestop, empty-column skip, the column filter repeated inside theROW_NUMBERsubquery, andtopsOfdrawing only from dealt columns. The in-memory re-sort (tops.OrderBy(Position).ThenBy(Id)) only sets the cross-column appearance order inside a deck; the SQL's own per-column order is whatTake(3)already kept.Pick→ second pass), as documented.Two carried-over minor notes (unchanged, no action required):
topsOfsaying the in-memory sort is for cross-column order would spare readers a double-check of the seemingly duplicated ordering.:hasfallback and manual Playwright passes.⏱ 5m 52s · 8 steps · $0.0138 · tokens: 57.6k in / 940 out (+134.1k cache-read) · Go: 5h 0% · wk 2% · mo 92%
📜 Full session transcript
🤖 Reviewing this PR — the review will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the review runs.
✅ Verdict: approve — no blocking issues found.
Re-review: both minor notes from my previous pass are now resolved — the
topsOfline carries the "numbered per column in SQL, but returned in no order" remark explaining why the in-memory re-order exists, andhome.spec.jscovers the cross-column deck (three cards across three columns, expectingDoingthenCardin the DOM and nothing from the last column) instead of only a lone card. Re-checked the deal logic, the For-you two-pass flow, docs/changelog and the entrance JS against the diff; nothing else changed and nothing new turned up. Still approving (the hand-summedbottom: 61pxcontrols offset and the deck being server-side built even for the phone list, which hides it, remain minor notes from earlier passes, both deliberate per the code comments and accounted for in the measured numbers).⏱ 1m 53s · 3 steps · $0.0028 · tokens: 1.9k in / 623 out (+67.5k cache-read) · Go: 5h 0% · wk 2% · mo 92%
📜 Full session transcript