Canvas: traced again from the app, and the tracer kept #218
No reviewers
Labels
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Grandiras/Ponente!218
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "canvas-home-settings"
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?
Closes #206. Closes #208.
design/Ponente.freewas behind the app in the places both issues list. Instead of patching frames by hand, every frame that draws a page the app serves is traced again from the running stack (with #213, #215 and #216 in).Frames (45)
main's file so the trace didn't overwrite the spec. The board-card redesign did ship, and the traced board frames show it.Sample content is a seeded demo deployment (invented members and boards, one deleted board, one banned member), removed again afterwards. Avatars come out as empty circles, because the tracer doesn't carry images.
design/traceThe tracer that did this, kept so the next pass is a rerun:
capture.mjs(Playwright drives each state),extract.js(DOM → boxes, text runs, SVG paths with computed styles),build.py(posts FREE-format frames to Lunacy's local API),frames.sh(which capture goes to which frame), and the seed/unseed for the demo data.README.mdgives the run order. It resolves Playwright fromtests/e2e, so there's no second install.out/and the generatedseed.sqlare git-ignored.Docs
docs/frontend.md's canvas section: the frame list, a paragraph on this retrace and how it was done, the redesign frames and why they're separate, and the Home frames tracing the app now (the "app overtook them" paragraph is closed).CLAUDE.md's frame list is updated to match. Unit tests (incl.DocumentationTests): 558/558.🤖 Generated with Claude Code
🤖 Reviewing this PR — the review will link the full session transcript.
✅ Verdict: approve — no blocking issues found.
Nice piece of work — the tracer is a real rerunnable pipeline, not a one-off script pile, and the schema assumptions all check out against the entities and migrations (
Members.Rolestill in the table,Boards.Keynullable and backfilled byDatabaseInitializer,BoardVisibility0/1 semantics,BoardOrders/Comments/join-table column lists). The empty-home scenario's grant save/restore runs infinally, andunseed.sqlrestores the deployment's own board row-for-row. Docs and CLAUDE.md match the new frame list. Two non-blocking notes below: a wrong claim in the seed docstring about what gets sealed at startup, and dead--style-fromsources inframes.shfor a rerun.⏱ 2m 33s · 14 steps · $0.0321 · tokens: 118.5k in / 4.2k out (+408.6k cache-read) · Go: 5h 64% · wk 32% · mo 49%
📜 Full session transcript
@ -0,0 +14,4 @@b home-new "Desktop — Home · New board" 4760 1120b home-empty "Desktop — Home · Empty" 6320 1120b cal-month "Calendar — Month" 40 2780b cal-timeline "Calendar — Timeline" 1600 2780--style-from "Admin — Boards"(and "Admin — Board access", "Admin — Columns", "Admin — Tags") points at frames this PR deletes from the canvas.build.pysilently skips a missing source, so on a rerun the Settings frames would lose their corner radius and shadow with no error. Point these at a surviving frame (e.g. "Admin — Members", which the script already uses forrecord/deleted) or at one of the traced frames.@ -0,0 +1,168 @@"""Demo content for the canvas traces — plaintext, sealed by EncryptionMigratorThe docstring says everything it makes is "sealed by EncryptionMigrator on the next app start" — true for Handle/DisplayName/Board/Card/Tag/Comment columns, but not for
BannedReason: it is deliberately absent fromEncryptionMigrator.Targets(see the comment onMember.BannedReason— "the column is new, so no row can hold plaintext in it"). The seeded ban reason stays plaintext. Harmless here (local demo data, removed by unseed, andDecryptpasses non-envelope values through), but the claim is wrong as written — worth narrowing to the columns the migrator actually covers.Both notes fixed in the latest commit:
frames.shnow takes each frame's corners and shadow from the frame it replaces (the dead Admin sources are gone), andseed.py's docstring says which columns get sealed and that the ban reason stays plaintext.🤖 Reviewing this PR — the review will link the full session transcript.
✅ Verdict: approve — no blocking issues found.
Re-review: both notes from the previous pass are fixed. The
seed.pydocstring now accurately says the ban reason is outsideEncryptionMigrator.Targetsand stays plaintext (with the why), andframes.shno longer points--style-fromat the four Admin frames this PR deletes — every line now sources style from the frame it replaces, which survives. The rest of the tracer, seed/unseed round-trip, and the docs/CLAUDE.md frame-list updates were verified in the earlier pass and are unchanged. Good to merge.⏱ 0m 32s · 3 steps · $0.0108 · tokens: 62.7k in / 983 out (+29.7k cache-read) · Go: 5h 64% · wk 32% · mo 49%
📜 Full session transcript