Skills and Tools
c1402026-11-12 · from the work of building the QGUIkit layerIn three days the QGUIkit layer and its pages were built by hand: spec, port, story, capture, scorecard row and review stop, page after page. Every step the records show done more than twice is a candidate here, with how often it recurred and where it went wrong. Most of the candidates turn something held by eye into something held by a machine.
Ranked by what each would pay back. Mark ruled /native-port and spec-measure first (review stop 1, D11). The parity register comes with c141's dual-surface docs, and the token check with the sweep in the qnative cycle.
- 1
/native-port
skillrecurred: 12 pages in three daysFirst (D11). Built 2026-11-12: .claude/skills/native-port/SKILL.md, the eight-step loop; /gpui-story fixed (tests in -p stories, the four worlds, the region-text test); not yet run on a real port.The whole port loop as one skill: the spec measured on the web, the six fleet → personal rules, a layer-first checklist (the pantry test, roles not hex, type tokens, the shared lede and link), the app map, a story with a region assertion, a generated shot program, the scorecard row, the review-stop entry.
The evidenceSeven listings and five later pages were ported by hand from instructions in a plan. /gpui-story points to a PATTERNS.md that does not exist, names the wrong test crate (-p app, where the page tests live in -p stories) and covers none of the spec, scorecard or app-map steps.
What exists today/gpui-story covers the story and the capture well
- 2
spec-measure
scriptrecurred: 10 specsFirst (D11). Built 2026-11-12: scripts/spec-measure.mjs, 4 s a route; the worked run on Tools matches the hand spec within 1 px on all 7 columns, and the native page on 0 of 7; --states records loading, failed and filtered-to-nothing.Playwright on qdash at 1120 × 720, reusing the box, text and style reader in scripts/illustrator-export.mjs: writes a JSON spec into the cycle (column widths, type, colours mapped to roles, the exact copy) that a Rust test checks the widths against.
The evidenceTen specs written by hand, never committed, nearly lost; 148 hard-coded widths in the pages; the Tools widths already differ.
What exists todayNothing
- 3
parity-register
checkrecurred: every layer changeWith c141, the dual-surface docs (D3).The scorecard as JSON both surfaces read, with the Vue file’s SHA when each row was checked; a CI step that flags a row when its Vue file changes after that SHA; the design site renders the register on each component page.
The evidenceThe scorecard was stale within a day; the layer’s in-flight restyles of JumpPills and PageTitle have no way to reach their twins.
What exists todayscorecard.rs, by hand
- 4
tokens --check and a lint
checkrecurred: every pageWith the token sweep in the qnative cycle (D5, D13).tokens-to-kit.mjs in check mode in qnative’s CI against the layer at a pinned tag; a lint that refuses hex outside tokens.rs, text_size(px(literal)), rounded(px(literal)), cycle ids in UI strings and unwrap_or_default on store reads.
The evidence433 literal type sizes, 14 hex literals, 51 opacity calls, the inbox’s error-as-empty, “design c132 D10” in the Sensor page’s copy.
What exists todayThe generator; a read-only drift comparison written by c140’s token reader
- 5
page-state matrix
checkrecurred: every pageEvery route × Healthy, Slow, Unavailable, ShapeMismatch × the four worlds as headless tests, on nozzle::scenario’s conditions and the region helper: the native twin of scripts/qdash-r31-check.mjs.
The evidenceNo story draws a page’s Failed or Loading state; the conditions exist and only Live uses them.
What exists todayThe conditions and the region helper
- 6
vectors for the formatters and rollups
scriptrecurred: 14 ported helperslive-vectors.sh extended to qdash’s format.ts and rollups, so format.rs, the per-page Rust and design’s TypeScript are held by the same corpus.
The evidenceThree hand copies of fmtN and its siblings; a Rust port re-ported to TypeScript; a latent toFixed rounding difference.
What exists todaylive-vectors.sh for the stream
- 7
recut
scriptrecurred: 4 recutsOne command: cut the four worlds, run the strict contract test, sync both fixtures (worlds and bridge, in the right direction), list the captures that are now stale.
The evidenceThe worlds were recut four times in three days, each followed by a sync and a recapture of both media by hand; the bridge already drifted.
What exists todaycut-world.py, sync-worlds.sh, sync-bridge.sh, separately
- 8
shot programs from stories
scriptrecurred: 6 programsGenerate the native shot program from stories × worlds × modes; the stories binary writes its git SHA and world beside each PNG so capture refuses a mismatch.
The evidenceSix native programs written by hand (48–147 lines); a stale binary once captured the default world, caught only by reading the PNGs.
What exists todaycapture.mts --native
- 9
review-stop scaffold and owed readings
skillrecurred: 7 review stopsFill a review stop’s Figures from measure.sh summaries and its captures from the shot program, leaving the calls to the author; keep a queue of owed strobe readings and run them when the machine is idle.
The evidenceSeven review stops in three days with the same sections; readings owed since c4 and c5 because the Mac was in use.
What exists todayscripts/footprint/measure.sh
- 10
/surface-audit
skillrecurred: each release from now onThis evaluation, repeatable: a script that recounts every number on this page (literals, hex, role reads, slot seats, builders, tests, stale rows) per release, so the scorecard is re-scored from data, not from four readers.
The evidencec140 took four readers about forty minutes to count what a script could count in seconds.
What exists todayNothing
Already good, worth copying
scripts/live-vectors.shruns qdash's own TypeScript over a corpus, and the Rust tests compare against its output. It is the best parity mechanism in the stack, and tools 3, 6 and 10 are this pattern applied elsewhere.ts-to-rust.pywith the strict fixtures test,cut-world.pyandcheck-lean.sheach do one job and are checked.- The native capture mode (
npm run shots -- --native) files every story per world into the atlas with nothing written in the native checkout. /gpui-storycovers the story and the capture well. Tool 1 is its larger sibling, not its replacement.
The records
- Two Surfaces, Scored →the twenty principles these tools would raise
- The Cost of Two Surfaces →where one change lands, and what drifted
- c140 Surface Evaluation →the cycle record
- The plan →the rubric and the method, written before the evidence
- The findings →the scores in one table, and what is open
- Review stop 1 →the calls for Mark
- qnative c2, review stop 3 →the port, the scorecard and the budget
- c132 process.md →the two-media loop and the token bridge
- Native App Footprint →every strobe reading, c1 to c5