−
100%
+
fit
scroll
# si-003: Scales Wisps — Four-Dice Keyboard
Wiring ## Model Each wisp in scales.jsx IS a
die face unfolded onto a flat surface. The
grid of STB faces (Subu / Tiny / XS / S / M /
L / XL / Tab) is the unfolded net of the
Scales die. Fold it up and you have a Platonic
solid in 3D space. Wisps are not buttons. They
are face-indicators — they mark which face
of the die is front-facing at any given
moment. ## Four-Dice Model Applied to Scales
The keyboard is the Grimoire unfolded into
four dice: - **NUMBER DIE (d10):** Selects
which STB face is active (0=Subu, 1=Tiny,
2=XS, 3=S, 4=M, 5=L, 6=XL, 7=Tab). Pressing a
digit rotates the Scales die to bring that
face forward. - **LEFT CUBE (QWEASDZXC):**
Navigation. S = universal charge key.
Arrow-like nav (W/A/S/D cluster) rotates the
Scales die in 3D when S-charged. - **MEMBRANE
CUBE (RTYFGHVBN):** Wand layer. Verb chords
live here. - **RIGHT CUBE (UIOJKLM,.):**
Action / command. K = rune center. ## Wand
Chord → 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 S
again = fire. ## Per-Cell Click is NOT the
Verb Current per-cell click handlers in
scales.jsx are navigation shortcuts only —
they select which face is active, equivalent
to pressing a number key. They do NOT trigger
verbs. Verbs come exclusively from S-charge +
wand chords. This separates selection (where)
from action (what), matching the
left-hand/right-hand dual wand framework. ##
Wisp as Die Face Each wisp object gets a
`faceIndex` (0–11 for a dodecahedron, 0–7
for a cube/STB). The wisp's position in the
flat grid IS its face in the unfolded net.
When the die is folded (fold chord = S+V),
wisps animate from their grid positions to
their 3D face positions on the solid. A wisp
at grid position `(row, col)` maps to a face
index via the unfolding convention defined in
`dc-cards.js` (the face-net table). ##
Concrete Wiring ``` scales.jsx state:
activeFaceIndex: number // current front face
chargeActive: boolean // S held ≥300ms
wandStack: string[] // e.g. ['G', 'F'] for
move+rotate onKeyDown('S') + hold300ms →
chargeActive = true, flash all wisps
onKeyDown(wand ∈ TFGHVB) while chargeActive
→ push to wandStack onKeyDown('S') tap while
chargeActive → executeChord(wandStack),
clear stack onKeyDown('0'–'7') →
setActiveFace(digit), animate die rotation ```
## Input Sources | Input | Effect |
|-------|--------| | Number key 0-7 | Rotate
die to that STB face | | Click wisp | Same as
number key (selection only) | | S + hold |
Prime verb intent | | S + G (while held) |
Queue move verb | | S + tap | Execute queued
verbs | | S + V | Toggle flat-grid ↔ 3D-die
view | ## Output: What Each Verb Does -
**move:** Reorders STB faces (updates
diamond.position on the face Thing) -
**rotate:** Animates die rotation to next
adjacent face - **scale:** Opens dimensional
inspector for the active face (topaz
dimensions) - **fold/unfold (S+V):**
Transitions between 2D grid (scales.jsx
default) and 3D die (Cosmostack view) -
**earth (S+B):** Stamps `citrine.box` on the
active face Thing (uses `▲ siphon move`
under the hood) ## Relationship to init-scales
Chip scales.jsx prototype → init-scales.js
chip (si-009). This spec applies to both. The
keyboard handler is a standalone primitive
that attaches to any container holding wisps.
△