Web: Conventions
Shared ground for the web-* family: how every design task starts, what it produces, where each product goes and how an artefact is shelved for reuse
Files4
View on GitHubSKILL.mdskills/web-conventions/SKILL.md
GitHubWeb design conventions
Shared ground for web-review, web-design, web-walkthrough and web-check. The eleven principles live in principles.md beside this file; the artefact library in library/; the scope template at ~/.claude/library/templates/web-scope.md; the deterministic halves under ~/.claude/library/scripts/web/. artefact-conventions and asset-conventions still govern where artefacts and captures go; this skill adds what is specific to designing an interface and never repeats them.
Accessibility is out of scope until after CHIRPdb's 2RT.20. The accessibility area in the logger is a place to record a thing noticed, not a pass.
How every task starts
No file is mandatory, because every project is different. Every mode begins the same way.
1. Collate
Search for each asset kind and say where it was found or that it was not. Explicit paths in the invocation override the search.
| Asset | Where to look |
|---|---|
| Tokens and themes | .claude/themes/ (resolution per theme-conventions.md); the product's own :root blocks in src/**/*.css, app.css, tailwind.config.*; the UI library in package.json (skeleton, shadcn, daisyui, bits-ui, melt and the like) |
| Component library | src/lib/components/, src/components/, a Storybook, a ui/ package in a monorepo |
| Scope documents | docs/**/*scope*.md, docs/specs/, feature specs from library/templates/feature-spec.md, the roadmap task's own text (roadmap.py open --json) |
| Brand files | docs/brand/, static/, logo and wordmark files, a brand guide PDF |
| Device intent (principle 8) | The scope document, the client's brief, analytics where they exist |
| Copy brief (principle 10) | docs/**/copy*.md, a tone-of-voice document, the scope document's audience section |
| Prior artefacts | docs/artefacts/ and site/, read as artefact-conventions Step 2 says |
| Routes | Per asset-conventions project type detection |
Print the result as one table, Asset | Found at | Gap, before asking anything.
2. Name the gaps
Every row without a find is a gap. Say which gaps block the task (device intent always does; a copy brief does whenever user-facing wording will be written) and which only narrow it.
3. Fill them with Jason
Rounds of 2 to 4 questions, the roadmap:create-interview discipline: never a long list at once, and every round ends with "Anything else, or shall I go ahead?". Skip any question the found assets already answer. A gap Jason declines to fill is written down as an assumption in the scope document (design) or the artefact index (review), never silently guessed.
- Inventory table printed
- Blocking gaps named before the first question
- Every unfilled gap recorded as an assumption
What every task produces
Wireframes
Drawn while brainstorming, under docs/artefacts/<task>/, one page per proposal. Principle 6 governs the drawing:
- The product's own tokens. Copy the
:rootblock from the product's CSS and cite the file in a mapping-notes comment. The artefact theme is for internal docs and shareables; a wireframe must look like the product it proposes. Masthead, honesty rule and technical hygiene fromartefact-conventionsstill apply. - Numbered callouts, each mapped to what it answers: an observation id (
#12) in review mode, a scope requirement (R3) or an inventory row in design mode. A callout that answers nothing is decoration and comes out. - Approval before build. The approved wireframe is the build spec; a change after approval goes back through the wireframe, not straight into code.
Dev util artefacts
Built for the task in hand and placed in docs/artefacts/<task>/. Publish through the Artifact tool when Jason needs to use the page from a browser (a logger, a checklist, a comparison that collects input); a page that is only read stays a repo file. Start from a library entry when one fits and resolve every ADAPT: marker before publishing; never publish a page that still names another project.
The observation store (principle 7)
Review mode's working surface, also used by the check and the walkthrough for anything they find.
| Field | Values |
|---|---|
seq |
Running integer, assigned at creation |
where, whereDetail |
A region from the inventory; an optional narrower place |
severity |
blocker, major, minor, nit, praise |
areas |
Any of layout, copy, colour-type, interaction, navigation, feedback, accessibility, performance, data |
title, detail |
First line of the note; the rest |
status |
open, fixed, declined, waived |
resolution |
One line, required for every status but open |
source |
jason (recorded in the page), check (a principles finding), walkthrough (a capture that failed the quality gate) |
principle |
The principle number, present when source is check |
screenshot |
Asset id in the artefact's store, optional |
createdAt, updatedAt |
ISO timestamps |
The live store is the artefact's db collection observations, read with ArtifactData. At the end of every pass, after statuses and resolutions are written back, export the whole collection to docs/artefacts/<task>/observations.json as { "exported": <iso>, "artifact": <url>, "entries": [...] } and commit it with the pass. The repo file is the durable record; sign-off, the check and the next session read it without claude.ai. A pass that has not exported is not finished.
declined means the observation stands but will not be acted on, with the reason. waived is reserved for a principles finding Jason has chosen to let through; the resolution carries his reason.
The principles check
Runs at three moments: after a wireframe is approved, at the end of each observation pass and at sign-off before the walkthrough. web-check holds the procedure; findings land in the store with source: check; an unwaived fail blocks sign-off. The hook on gh pr create refuses a branch whose latest export still holds open entries or unwaived findings.
The sign-off walkthrough
After sign-off, web-walkthrough captures every route on every intended device in every open state into docs/assets/walkthrough/, named as below, through asset-shot.
Capture naming
<(device||viewport)?>-<route>-<specifier?>.<filetype>
- Device or viewport appears only when more than one is captured:
phone,tablet,desktopwhen the scope names devices;390,1440when it names widths. - Route is always present: the slug of what was captured. A served app's URL path (
/becomeshome,/documents/42becomesdocument,/invite/[secret]becomesinvite); the file stem for a static page or an artefact. - Specifier appears only when several captures share prefix and route: the open state or scroll position (
filters-open,records-open,900). - Lowercase, hyphenated, no spaces.
asset-conventions carries the same rule for every asset-* skill, so a walkthrough's captures and a README's screenshots share one naming rule and keep separate directories (docs/assets/walkthrough/ and docs/assets/shots/): the same route on one device gets the same name in both, so a shared directory would overwrite.
Shelving an artefact
At the end of a review or a design, offer once: "Shelve any of this task's artefacts in the library?" An artefact earns a place when it proved particularly useful or is a new kind of thing. To shelve:
- Copy the page to
library/<slug>.htmlbeside this skill. - Replace every project-specific value with a generic one and an
ADAPT:comment saying what to put there: the title, the eyebrow, hosts and ports, routes and region names, branch and task ids, the sources list, a palette that came from the project's artefact aesthetic. - Grep the copy for the project's name, its hosts, its branch names and its routes. Nothing may remain.
- Add a row to
library/README.md: slug, what it is, which task it came from, the runtime capabilities it needs, theADAPT:count.
The library holds examples, not templates: a new task reads one for its shape and builds its own.