feat: a browsable index of the design spikes - #349
Draft
Yona-Appletree wants to merge 14 commits into
Draft
Conversation
The spikes are self-contained HTML design records but there was no way to see what exists short of listing the directory. This adds the contact sheet, derived rather than hand-written: each card's title comes from the spike's own <title> and its blurb from the spike's opening paragraph, so the page cannot describe a spike wrongly for long. Code spikes (the cargo ones) list separately from their README, unlinked — they are not browsable, and an index that quietly omitted them would not be a list of the spikes. Output is deterministic (sorted, no timestamps, no git state) so the --check mode in the next commit cannot flap. Co-Authored-By: Claude Fable 5 <[email protected]>
`just spikes-index` rewrites the page; `just lint-spikes-index` joins check-lint so a spike added without regenerating fails the gate. Without it the failure mode is silent — the new spike is simply missing and nothing says so, the same reason the vec and torture corpora carry --check gates. studio-dev's existing 1 s sync loop also copies the spike pages into the served directory, so the Tools-menu entry has something to open. Page by page rather than `cp -R spikes/.`: the code spikes are cargo crates, and one `cargo test` in there would drag a target/ dir into a once-a-second copy. Copying only from this loop is what keeps the spikes out of every build artifact — the loop runs only while a dev server is up. Co-Authored-By: Claude Fable 5 <[email protected]>
Nothing in the deploy path copies spikes/ today — the artifact builder works from an allowlist. This states the requirement out loud so a later "just add it to the asset dir" fails in CI rather than publishing internal design records, several of which state gate verdicts as settled fact. Co-Authored-By: Claude Fable 5 <[email protected]>
The "…" menu is where the project-free tools already live, so the design spikes belong there too. Gated on cfg!(debug_assertions) rather than the `stories` feature — the release Pages build turns `stories` on for the in-app design library, so it is not a dev signal. Story capture builds --release, so the card stays out of the baselines as well. Co-Authored-By: Claude Fable 5 <[email protected]>
The flask reads as "experiment", which is what a spike is. It renders the same glyph as Test on purpose and stays a separate name: design experiments and test runs are different meanings, and borrowing MapUniverses (documented as DMX-universe coloring on the mapping lamp view) would have been a worse kind of reuse. Co-Authored-By: Claude Fable 5 <[email protected]>
The contact sheet is read for "what happened lately", so the order should say it. Each card now carries the date the spike landed, and both sections sort newest first. Dates live in spikes/dates.json rather than being read from git on every run. CI checks out shallow — actions/checkout defaults to depth 1 — so `git log -- <path>` there answers for the tip commit alone and would disagree with any full clone, which would make the byte-compare gate fail in CI and pass everywhere else. Git is asked once, when a spike first appears; after that the date is a committed fact, hand-editable when a spike gets a later round. Co-Authored-By: Claude Fable 5 <[email protected]>
Captured in the pinned CI environment by run: https://github.com/light-player/lightplayer/actions/runs/30984999205
Contributor
CI refreshed the story baselines on this branchThe Review every PNG in the PR's Files changed view (swipe / onion-skin). |
Two full-gate runs this session aborted in test-rust-core, each on a different load-sensitive test, under a load average of 246 from a sibling agent session. The perf test's own number (19.16 s vs the 10 s bound) is the worst in its log. The useful part is the correction to the workaround. The entry told you to re-run the later recipes when THIS test fails; the first abort was a different test entirely, so the rule belongs on the abort, not on the test: whenever test-rust-core aborts, run test-studio-host and test-xt-host explicitly. Both were run here and pass. Co-Authored-By: Claude Fable 5 <[email protected]>
Captured in the pinned CI environment by run: https://github.com/light-player/lightplayer/actions/runs/30985988371
Two consecutive green CI runs on this PR each fired the baseline auto-commit and moved the same clock-face stories back and forth, the second restoring blob hashes byte-identical to main. Two runs in the same pinned environment, no clock-face code in the diff, so the capture has two reachable renderings rather than drift that is settling. Filed open, not diagnosed: the debt entry's own lore is that this pipeline produces "obviously a settling race" diagnoses the pixels then overturn, so the entry records the evidence and the hypothesis separately. The part worth carrying: auto-commit turns a nondeterministic capture into silent churn instead of a red check, and the ADR's "merge with the green run one commit back" assumes the bot commit settles something. Under oscillation it never does, so judging a refresh means diffing blob hashes against the PREVIOUS refresh, not just against main. Co-Authored-By: Claude Fable 5 <[email protected]>
…b52a # Conflicts: # justfile
Captured in the pinned CI environment by run: https://github.com/light-player/lightplayer/actions/runs/31020562079
…b52a # Conflicts: # docs/debt/story-capture-pipeline.md
Captured in the pinned CI environment by run: https://github.com/light-player/lightplayer/actions/runs/31025541396
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.












The
spikes/directory holds self-contained HTML design playgrounds, one perexploration — but there was no way to see what exists short of listing the
directory. This adds the contact sheet and an entry point from Studio.
What's here
spikes/index.html— generated, not hand-maintained.scripts/spikes-index.mjsreads each spike's own<title>and openingparagraph, so the index cannot describe a spike wrongly for long. Cards link
relatively, so the page works over
file://as well as over the dev server.The three cargo spikes list separately from their READMEs, unlinked — they are
not browsable, and an index that quietly omitted them would not be a list of
the spikes.
Dated, newest first. Dates live in
spikes/dates.jsonrather than beingread from git on each run: CI checks out shallow (
actions/checkoutdefaultsto depth 1), so
git log -- <path>there answers for the tip commit alone andwould disagree with every full clone — the byte-compare gate would fail in CI
and pass everywhere else. Git is asked once, when a spike first appears; after
that the date is a committed fact, hand-editable when a spike gets a later
round. Verified: with
gitforced to fail,--checkstill passes.A drift gate.
just spikes-indexwrites it;just lint-spikes-indexjoins
check-lint. Without a gate the failure mode is silent — a new spike issimply missing and nothing says so. Same reasoning as the vec and torture
corpus
--checkgates.Serving, dev only.
just studio-dev's existing 1 s sync loop copies thespike pages into the served directory. It copies page by page rather than
cp -R spikes/., because the code spikes are cargo crates and onecargo testin there would drag a
target/into a once-a-second copy. Copying only fromthat loop is what keeps the spikes out of every build artifact — the loop runs
only while a dev server is up.
The Tools menu entry, gated on
cfg!(debug_assertions). Not thestoriesfeature: the release Pages build turns
storieson for the in-app designlibrary, so it is not a dev signal. Story capture builds
--release, so thecard stays out of the story baselines too. It links
/spikes/index.htmlexplicitly rather than
/spikes/— dx serve answers unknown paths with the SPAfallback, so the directory form would have loaded Studio instead.
A smoke assertion. The studio Pages smoke check grows a
forbiddenlistnaming
spikes. Nothing in the deploy path copies them today; this states therequirement out loud so a later "just add it to the asset dir" fails in CI
rather than publishing internal design records — several of which state gate
verdicts as settled fact. Verified both ways against a stub artifact.
No spike was modified.
Verified on the dev server
/spikes/index.htmlserves; all 11 spike pages return 200; the serveddirectory contains exactly those pages — no code-spike dirs, no
Cargo.toml,no
target/.Review gate
Visual gate on the index page — screenshots handed over in chat. Staying in
draft until then.
🤖 Generated with Claude Code