Skip to content

PERFORM, EVOLVE, stage mode and first steps to the mock; the pad keys (Plan-008 C1, ADR-018) - #116

Merged
alexnodeland merged 10 commits into
mainfrom
claude/shell-c1
Oct 3, 2026
Merged

alexnodeland merged 10 commits into
mainfrom
claude/shell-c1

Conversation

@alexnodeland

Copy link
Copy Markdown
Owner

Plan-008 PR C1. This brings PERFORM, EVOLVE, stage mode and the first-steps pill to the Vision II mock. Moving between the levels is still instant; the zoom comes in C3. PATCH comes in C2.

PERFORM: the well and the panel

  • The well: the large face of the sound in hand, drawn with glow and reflection, below its cap (family · in hand), name, blurb and share. A click plays the phrase. The live trace sits in the well's top-left corner.
    • XY and How it works are modes of the well, from its corner. Esc returns to the face.
    • The offer: while B holds an offer, its amber face stands beside the held one with "B · ‹aim›" and "offered · hold B to peek". Blend is a slider under the two faces (it is bMix), shown only then.
  • The panel: CONTROLS (with ARRANGE and HOW IT WORKS), the control grid, the hood strip, then the pads WANDER · OFFER · PEEK · TAKE · PASS.
    • Freeze is a tap (or Enter) on Wander; the FREEZE pad is gone.
    • Keep and Back move from pads to a moved · KEEP · BACK bar, shown exactly when the sound has left home. Keep and Back did nothing on an unmoved sound.
    • PASS (new): pass on B without growing another. It is passOffer, recorded exactly as Next's pass, with UNDO.
    • Touch (what velocity plays) is a row in Arrange plus a "vel" tick on its control.
  • ADR-018, the pad keys (supersedes ADR-009's pad row and keeps "N means next"): N Offer/Next, hold B Peek, ⇧↵ Take, ↵ Keep and ⇧⌫ Back (both only when nothing is focused and the sound has moved). Freeze and PASS have no key. The keys yield to text fields, modals and ⌘/Ctrl/⌥.
    • A dial or the Blend slider gives up focus when a pointer turn ends, so ↵ reaches Keep. A control reached with Tab keeps its own Enter.

EVOLVE

  • Head: "Pick the one you'd reach for." with the pips, and a small TASTE map (taste.drawMini) that goes to TASTE.
  • Cards: the face in each well replaces the scope, with ⇄ circuit (mini rack, readout under Show measurements) and ↓ patch in its corners.
  • Buttons: ▶ play 1, pick a ←, another pair N, and EVOLVE POOL (dashed until the first fit) with stop.
  • Lineage: behind what each generation did, opening over the foot of the cards. Every id is kept.

Stage mode and the first-steps pill

  • Stage mode to a-stage: wordmark and lamp, ×, "family · in hand", keys drawn as keys.
  • The first-steps pill (guide.js): pips, one step, and × ("Stop showing these"). It absorbs PERFORM's first steps; auracle-perform-steps migrates into it.

Fixes found on the way

  • A real bug: with the lineage folded, drawLineage returned before writing the log, so a farm-less generation lost it.
  • Review fixes:
    • pad keys work while Blend is focused;
    • PASS's fold lands on the face where it stands;
    • ↵ keeps after a mouse turn;
    • touch targets are at least 44 px;
    • the large faces have their own 24-entry cache.

Capability checklist (nothing dropped)

Before After
Small head face, title, status, scope Well face (plays on click), display name + cap + blurb + share; status under CONTROLS; trace in the well's corner
Marquee, first steps .pf-step Booth band over the well; steps in the pill (same classes, storage migrated)
8-column deck incl. Blend and Wander Control grid; Blend is a slider in the well (MIDI slot kept); Wander first in the pads (MIDI slot kept)
Touch row #pf-touch-sel/-depth Arrange › Velocity plays (same ids) + "vel" tick
KEEP, BACK pads Moved bar .pf-keep/.pf-back + ↵/⇧⌫ (44 px on touch)
FREEZE pad Tap/Enter on Wander (data-frozen, "frozen")
OFFER/NEXT, TAKE, PEEK Same pads + N, ⇧↵, hold B
Offer strip B's face in the well, label, what/aim lines; grow/take/fold motions kept
XY beside the hood; Why; Arrange XY and How it works as well modes; Arrange in CONTROLS
EVOLVE pips, copy, forecast, rule, another pair, EVOLVE POOL + stop, #gen-count Head and foot, same ids
#scope-a/b waveform Face in the well; canvas kept as the rendering overlay
Style badge, guess, flip, mini rack, readout, open in patch, play, pick Same ids, in the well's corners / under it
Lineage spark and log #lineage-btn → #lineage-pop
Stage st-cat "PERFORM · in hand" "family · in hand", or "in hand"

Where the mock isn't matched:

  • Wander carries frozen in its value text, not aria-pressed (ARIA forbids that on a slider).
  • Share opens the existing picture panel.
  • The pad row wraps Wander above the four pads under 1361 px.
  • The pill shows on PERFORM only.
  • TASTE and LEARNING already matched.

Tests

  • New:
    • perform_layout: layout at three widths, Blend only with an offer, PASS records and undoes;
    • pad_keys: the ADR-018 keys, including after a Blend slide and a mouse turn;
    • evolve_cards, guide_pill;
    • perform_touch: every moved function under a coarse pointer, including BACK, KEEP, a held PEEK and Freeze.
    • apps/web/tests/guide.test.mjs: the storage migration.
  • Specs whose meaning changed: perform_open_early (Keep needs a move), perform_truth first steps, perform_palette/text_fits (Blend is a slider, 7 captions), perform_wander/space_after_a_click (Freeze on Wander), perform_offer_moments (face boxes after the reflow, plus a PASS case), and the XY specs (open XY mode first).
  • Owed with the film re-records: stale PERFORM/EVOLVE selectors and narration ("Freeze holds it still"), listed in the plan.

Docs: ADR-018, views/perform.md, views/evolve.md, keyboard, accessibility, glossary, first-session, playing, teaching, bank, the ? card, web-runtime.md, testing.md, apps/web/AGENTS.md, the plan's as-built, the CHANGELOG, voice.md (approved rows), and re-captured perform.webp/evolve.webp.

https://claude.ai/code/session_01GMg3KFS9ggSrYdvGkbBshW

…he guide pill (Plan-008 C1)

PERFORM was a single faceplate (a head with a small face and a scope, a row
of first steps, eight dials, a touch row, six pads, the offer strip, XY and
the hood), and EVOLVE showed waveforms where the approved specimen shows the
sound's face. This lays both out to the specimen without dropping a function:

- PERFORM's left column holds the cap (family · in hand, the family only
  where the engine has one), the name at the display size with share, the
  blurb, and the well with the held face drawn large (glow and reflection,
  as stage mode draws it). B's face stands beside it in amber while it holds
  an offer, with what changed and how to hear it under its floor, and Blend
  is a slider under the two faces. XY and How it works are modes of the
  well; the live trace sits in its corner.
- The right column: CONTROLS with Arrange and How it works, the knob grid,
  the hood strip, and the pad row WANDER · OFFER · PEEK · TAKE · PASS.
  Freeze is a tap (or Enter) on Wander, shown on Wander. PASS is the pass
  Next already made, without growing another, with its UNDO. Keep and Back
  live in a "moved · KEEP · BACK" bar shown exactly when the sound has left
  home. What velocity plays is a row of Arrange, with a "vel" tick on its
  control. Blend and Wander keep their MIDI slots.
- The pad keys (ADR-018): N offer/next, hold B peek, ⇧↵ take, ↵ keep with
  nothing focused, ⇧⌫ back; N is ANOTHER PAIR in EVOLVE.
- The first steps move into the guide pill (guide.js), bottom left of the
  stage, one step at a time with ×; `auracle-perform-steps` migrates into
  `auracle-guide`, and both reset lists clear it.
- EVOLVE: the question as the head with its pips, a small TASTE map
  (taste.drawMini), each card's face large in its well with ⇄ circuit and
  ↓ patch in the corner, the buttons relabelled (PLAY · 1, PICK A · ←,
  ANOTHER PAIR · N), EVOLVE POOL dashed until the first fit, and the lineage
  behind "what each generation did".
- Stage mode: the wordmark and lamp top left, the family only where the
  engine has one, the keys printed as keys.

Specs that pressed FREEZE, KEEP and BACK pads, read the XY field at rest,
read three first steps at once, or dragged Blend as a dial now use Wander's
tap, the moved bar, XY mode, the pill's one step and the slider.

Claude-Session: https://claude.ai/code/session_01GMg3KFS9ggSrYdvGkbBshW
…nd the first-steps pill

The guide pages, the keymap, the ? card and the runtime notes described the
old PERFORM (a header with a scope, a TOUCH row, six pads with FREEZE, KEEP
and BACK, a B strip, the first steps under the title) and EVOLVE's waveform
cards. They now say what the app shows: the well and its modes, B beside
the sound with Blend under it, Wander's tap, PASS, the moved bar, what
velocity plays in Arrange, the pad keys (ADR-018), the first-steps pill,
EVOLVE's head, faces, corner and lineage disclosure, and stage mode's
wordmark.

New specs pin the layout at 1000, 1280 and 1440 px, XY and How it works as
the well's modes, Freeze on Wander, the moved bar, Blend and PASS
(perform_layout), the keys and where they yield (pad_keys), EVOLVE's cards
(evolve_cards), the pill and its migration (guide_pill), and every moved
function under a finger (perform_touch). "Nothing to keep" and "nothing to
go back to" are refusals, so they jump the toast queue.

Claude-Session: https://claude.ai/code/session_01GMg3KFS9ggSrYdvGkbBshW
…o the well's other modes

At 1000 px `.lv-title`'s display size won over EVOLVE's own (one class each,
later rule), so the question took two lines and the cards' feet differed by
a name's wrap; now the question is the title size there and each foot
stacks. Blend's slider lay over the XY field and How it works; it shows in
the face mode only. PASS's column is wide enough that "needs an offer" takes
two lines, not three. The keymap's MIDI rows name the slot order rather than
a deck, the perform_truth first-steps test checks the coach before the note
that retires it, and ADR-018 says where Backspace was free.

Claude-Session: https://claude.ai/code/session_01GMg3KFS9ggSrYdvGkbBshW
…t a play button

Folding "what each generation did" behind a disclosure gave its spark no
size, and drawLineage returned before writing the log, so the log said "No
generations yet" after generations had run until it was opened (caught by
evolve_truth's generation with no farm). The spark is drawn only with a
size now, and the log is written either way.

A click on B in the well played the sound in hand, which B is not; it now
leaves B to PEEK and B held. The well's and EVOLVE's large faces are drawn
at 2× at most: each is a 480 px picture in the cache the bank's thumbnails
share. How it works sits on a veil, clear of the well's corner.

Specs: booth reads Blend's slider; offer_moments reads the face where it
stands once B is in the well (and again once B has left), since the well
makes room for B; pad_keys waits out the dial's sweep before keeping;
perform_touch tries the XY field's corners, as a one-way control stops at
the center. The booth guide and comment no longer say the XY dot follows
attract's hand (the dials turn; XY is a mode of the well). PERFORM's and
EVOLVE's landing figures are re-captured to the new layout, with their alt
text.

Claude-Session: https://claude.ai/code/session_01GMg3KFS9ggSrYdvGkbBshW
The sound a fresh tablet session opens with can have no two controls the XY
pad reaches (one boot's had Grit alone), so a tap on the field moved
nothing and the moved bar never showed. Glass Pad's BRIGHT turns both ways.

Claude-Session: https://claude.ai/code/session_01GMg3KFS9ggSrYdvGkbBshW
It still listed six pads; PERFORM is the well (the face, B with Blend, XY,
How it works), Wander and four pads, the moved bar and the pad keys.

Claude-Session: https://claude.ai/code/session_01GMg3KFS9ggSrYdvGkbBshW
…and-captured figures show

The guide said a click on the well plays the phrase; since B's face no
longer does, it says so. The plan's as-built notes the re-captured figures'
state (the warm start's 18 picks, no generations) against SCREENSHOTS.md,
the stale teach-meter crop, and that the large faces share the face cache.

Claude-Session: https://claude.ai/code/session_01GMg3KFS9ggSrYdvGkbBshW
…onto the face, touch sizes

Review of C1 found:
- The pad keys treated Blend's range input as a text field (`typing` and
  `ENTER_OWNERS` matched any input), so once Blend had focus N, B, ⇧↵, ↵ and
  ⇧⌫ all died. A range is a control, as main.js already treats it.
- "KEEP ↵" was false straight after a mouse turn: the dial kept the focus
  and ↵ played its sweep (or toggled Wander). A dial's or Blend's pointer
  turn now leaves no focus, as a clicked button leaves none; a control
  reached with Tab keeps its own Enter, and the guide and ADR-018 say so.
- PASS's fold read the face's box before B left the well, so it landed
  where the face had been: the fold now reads it a frame later, after the
  reflow (NEXT's still lands where it stood, with B's room kept).
- KEEP, BACK and the pill's × were ~24 px under a finger; on a coarse
  pointer they are 44 and 40 px.
- The live trace hid exactly while comparing; it moves to the well's top
  left, clear of B and Blend, and stays.
- The large faces get their own 24-entry cache, apart from the bank's 400
  thumbnails, so their memory is bounded; pad("pass") does nothing without
  an offer.

voice.md takes the approved rows (keep in the moved bar, moved · KEEP ·
BACK, PASS, first steps, ▶ PLAY, ↓ patch, ⇄ face, Velocity plays and vel,
share, what each generation did).

Specs: pad_keys covers keys after a mouse slide of Blend and with Blend
focused, and ↵ keeping after a mouse turn (its blur that masked the bug
is gone); perform_offer_moments adds PASS's fold; perform_touch adds BACK,
the sizes, the bar's hidden keys and PEEK held with a finger; negative
checks drop their fixed waits.

Claude-Session: https://claude.ai/code/session_01GMg3KFS9ggSrYdvGkbBshW
…italic

voice.md keeps the italic voice face for the model only; the word between
the two cards is the page's, so it is a silk label.

Claude-Session: https://claude.ai/code/session_01GMg3KFS9ggSrYdvGkbBshW
@alexnodeland
alexnodeland merged commit c536e18 into main Oct 3, 2026
23 checks passed
@alexnodeland
alexnodeland deleted the claude/shell-c1 branch October 5, 2026 13:31
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