Every surface is drawn from the model, on a page of its own - #201
Merged
Merged
Conversation
Rob chose the lineage from three prototypes generated from model.json: every surface drawn from the model at its pinned commit, through whoever makes it, to the surface, each opening its card. The spec records why that figure and not the other two, what the page generates and what it draws at runtime, the phone form, and the design release it needs first. Verified: the prototypes rendered at desktop and phone widths; this file is excluded from conventions-check with the rest of docs/superpowers. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The surfaces page needs Surfaces in the nav order and bold in a card, and both are in robertblust/design#84. This pins that branch so the page can be built and verified against it; the pin moves to v0.62.0 once the release is tagged. The sync moves card.js and the header fence's comment on every page that carries it, and nothing else. Verified: npm run design:check reports every file and fence in sync. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
/surfaces/ draws each surface the model holds under whoever makes it, the owner by hand or the repository whose build writes it, and every line starts at the commit the site pins. A new renderer writes the nodes as nested lists, so a crawler reads the tree without running anything and pages:check fails when the page falls behind; the page draws the wires from where the nodes landed and renders a surface's card when it is chosen. A surface whose production the page cannot place fails the build rather than dropping out of the drawing. Surfaces follows Team in the nav on every page. The page joins the JSON-LD renderer's list and the share cards; every card whose page's header moved is rendered again, and verify gains the page with a lineage check that reads each surface's place off the page against model.json. The page's own words are English only until they are reviewed; the German follows from the translator. Verified: npm run test:build, pages:check, og:check, design:check and conventions-check pass; npm run verify passes every page but the sitemap, which is regenerated in the next commit; no width from 360 to 1280 px scrolls sideways. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The page is a new URL, and the sitemap's dates come from each page's last commit, so it is added after the page and every date is read again; the pages whose nav gained the item move to today. Verified: npm run sitemap:check matches git; npm run verify passes every page and the sitemap; moving one surface under the wrong maker fails the lineage check by name. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
robertblust/design#84 is merged and tagged, so the pin moves from its branch, now deleted, to the release. The tag is the commit the branch merged into, and the synced files and fences are byte-identical to what the page was built and verified against. Verified: design:check reports every file and fence in sync; og:check and pin:check pass; the lockfile resolves the package to cd6ea81, the commit v0.62.0 names. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both pages ended on "Generated from robertblust/mental-model@HEAD", because their scripts render cards from the block and never wrote the commit into the provenance line, as the model page and the timeline do. Each now sets the link to the block's commit and the short commit beside it when the data arrives, and verify reads the line against the block on both pages. Verified: the new assertions failed on both pages with @Head before the fix; npm run verify, pages:check and og:check pass after it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The owner approved the page's English, so the translator made the German from it: the title, tagline, section label, legend, hint, caption, the three reading rules, the German description, and the drawing's labels in the renderer. The model's own words, the surface names, addresses and cards, stay English in both views, as the page's note says. Surface stays Surface, as the glossary requires. Owner, build, pin and commit have no glossary row yet, so the translator chose Inhaber, Build, Pin and Commit, and those choices wait on the owner's review. Verify gains the page's translates spec, which walks every data-de on the page in both directions. Verified: pages:check, test:build, og:check, conventions-check and npm run verify pass, the German header fits at every width headerFits measures. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The owner decided that Owner is kept in German, as the role's name on the team page already is, so the drawing's label and the first reading rule say Der Owner and der Owner where the translator had chosen Inhaber. Build, Pin and Commit stay as the translator made them. Verified: pages:check, og:check and npm run verify pass, including the page's translates spec. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
robertblust
marked this pull request as ready for review
September 17, 2026 11:00
This was referenced Sep 17, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
/surfaces/is the lineage Rob chose from three prototypes: each surface the model holds, under whoever makes it, the owner by hand or the repository whose build writes it, with every line starting at the commit the site pins. Choosing a surface lights its path in--c-pathand opens its card under the drawing; a hash chooses it on arrival. The spec isdocs/superpowers/specs/2026-09-17-surfaces-page-design.md.build/surfaces.mjswrites the nodes as nested lists, so a crawler reads the tree without running anything andpages:checkfails when the page falls behindmodel.json; a surface whoseproductionthe page cannot place fails the build rather than dropping out. The page draws the wires from where the nodes landed and renders the card on demand, as/team/does. Surfaces follows Team in the nav on every page, the page joins the JSON-LD list, the sitemap and the share cards, andverifygains it with alineagecheck that reads each surface's place off the page against the block. Every card whose page's header moved is rendered again; the pixels differ only by anti-aliasing, and the two deck cards, whose stamps did not move, are left as they were.The design pin is v0.62.0, released from robertblust/design#84, which adds Surfaces to the nav order and bold to the card. The English is approved and the German was made from it by the translator, with a
translatesspec inverify. The owner read the back-translation and kept Owner in German, as the role's name already is on the team page; Build, Pin and Commit stay loanwords. The team and surfaces pages also stop ending on@HEAD: both now write the commit they were read from into the provenance line, andverifychecks it.Verified:
test:build,model:check,pages:check,og:check,test:og,test:dupes,pin:check,design:check,sitemap:check,verifyagainst a local server andsh conventions/conventions-checkall pass; moving one surface under the wrong maker failslineageby name; nothing scrolls sideways at 360, 800, 1000 or 1280 px.🤖 Generated with Claude Code