Skip to content

Every surface is drawn from the model, on a page of its own - #201

Merged
robertblust merged 8 commits into
mainfrom
surfaces-page
Sep 17, 2026
Merged

robertblust merged 8 commits into
mainfrom
surfaces-page

Conversation

@robertblust

@robertblust robertblust commented Sep 17, 2026

Copy link
Copy Markdown
Owner

/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-path and opens its card under the drawing; a hash chooses it on arrival. The spec is docs/superpowers/specs/2026-09-17-surfaces-page-design.md.

build/surfaces.mjs writes the nodes as nested lists, so a crawler reads the tree without running anything and pages:check fails when the page falls behind model.json; a surface whose production the 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, and verify gains it with a lineage check 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 translates spec in verify. 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, and verify checks it.

Verified: test:build, model:check, pages:check, og:check, test:og, test:dupes, pin:check, design:check, sitemap:check, verify against a local server and sh conventions/conventions-check all pass; moving one surface under the wrong maker fails lineage by name; nothing scrolls sideways at 360, 800, 1000 or 1280 px.

🤖 Generated with Claude Code

robertblust and others added 8 commits September 17, 2026 11:58
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
robertblust marked this pull request as ready for review September 17, 2026 11:00
@robertblust
robertblust merged commit b3a716b into main Sep 17, 2026
2 checks passed
@robertblust
robertblust deleted the surfaces-page branch September 17, 2026 11:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant