scroll # si-003: Scales Wisps — Four-Dice KeyboardWiring ## Model Each wisp in scales.jsx IS adie face unfolded onto a flat surface. Thegrid of STB faces (Subu / Tiny / XS / S / M /L / XL / Tab) is the unfolded net of theScales die. Fold it up and you have a Platonicsolid in 3D space. Wisps are not buttons. Theyare face-indicators — they mark which faceof the die is front-facing at any givenmoment. ## Four-Dice Model Applied to ScalesThe keyboard is the Grimoire unfolded intofour dice: - **NUMBER DIE (d10):** Selectswhich STB face is active (0=Subu, 1=Tiny,2=XS, 3=S, 4=M, 5=L, 6=XL, 7=Tab). Pressing adigit rotates the Scales die to bring thatface forward. - **LEFT CUBE (QWEASDZXC):**Navigation. S = universal charge key.Arrow-like nav (W/A/S/D cluster) rotates theScales die in 3D when S-charged. - **MEMBRANECUBE (RTYFGHVBN):** Wand layer. Verb chordslive here. - **RIGHT CUBE (UIOJKLM,.):**Action / command. K = rune center. ## WandChord → Verb Mapping for Scales | Chord |Verb | Scales action ||-------|------|---------------| | S+G | move| Drag active STB face to reorder | | S+F |rotate | Spin the die to adjacent face | | S+H| scale | Resize the active face preview | |S+T | speed | Animate transition duration | |S+V | fold | Collapse grid → 3D die view | |S+B | earth | Pin/stamp face to current node(citrine.box) | S-charge (hold S ≥300ms)primes intent. Wand keys stack contexts. Tap Sagain = fire. ## Per-Cell Click is NOT theVerb Current per-cell click handlers inscales.jsx are navigation shortcuts only —they select which face is active, equivalentto pressing a number key. They do NOT triggerverbs. Verbs come exclusively from S-charge +wand chords. This separates selection (where)from action (what), matching theleft-hand/right-hand dual wand framework. ##Wisp as Die Face Each wisp object gets a`faceIndex` (0–11 for a dodecahedron, 0–7for a cube/STB). The wisp's position in theflat grid IS its face in the unfolded net.When the die is folded (fold chord = S+V),wisps animate from their grid positions totheir 3D face positions on the solid. A wispat grid position `(row, col)` maps to a faceindex via the unfolding convention defined in`dc-cards.js` (the face-net table). ##Concrete Wiring ``` scales.jsx state:activeFaceIndex: number // current front facechargeActive: boolean // S held ≥300mswandStack: string[] // e.g. ['G', 'F'] formove+rotate onKeyDown('S') + hold300ms →chargeActive = true, flash all wispsonKeyDown(wand ∈ TFGHVB) while chargeActive→ push to wandStack onKeyDown('S') tap whilechargeActive → executeChord(wandStack),clear stack onKeyDown('0'–'7') →setActiveFace(digit), animate die rotation ```## Input Sources | Input | Effect ||-------|--------| | Number key 0-7 | Rotatedie to that STB face | | Click wisp | Same asnumber key (selection only) | | S + hold |Prime verb intent | | S + G (while held) |Queue move verb | | S + tap | Execute queuedverbs | | S + V | Toggle flat-grid ↔ 3D-dieview | ## Output: What Each Verb Does -**move:** Reorders STB faces (updatesdiamond.position on the face Thing) -**rotate:** Animates die rotation to nextadjacent face - **scale:** Opens dimensionalinspector for the active face (topazdimensions) - **fold/unfold (S+V):**Transitions between 2D grid (scales.jsxdefault) and 3D die (Cosmostack view) -**earth (S+B):** Stamps `citrine.box` on theactive face Thing (uses `▲ siphon move`under the hood) ## Relationship to init-scalesChip scales.jsx prototype → init-scales.jschip (si-009). This spec applies to both. Thekeyboard handler is a standalone primitivethat attaches to any container holding wisps.