STARSPELL · DESIGN REVIEW · 2026-09-22 · ROUND TWO ON THE VERSUS PAGE · REVISED THE SAME NIGHT
THE DUELING GROUND, FILLED
The 9/9 UNDER ONE SKY round built
this page its world; this round makes the middle earn its ground. One move does most
of it: the mages you can replay stop being 118-unit pills and become full replay rows
— the seal-plaques’ own furniture — and the page fills itself with them by law, in every state, on every
height of phone. Names breathe, AGAIN never shrinks again, and the dead middle dies by construction.
Skylar’s ask, verbatim (9/22, voice): “For the versus screen before you go
into a battle, we need to do a redesign on that, you can put the redesign in a sky pilot GitHub page. Right now
there’s too much dead space in the middle of the screen. The mages you can replay are way too small. Their
names are being cut off. The Again button is being cut off as well. We need to fill that space up and make it look
better. Right now it’s just too much dead space in the middle of the screen.”
How to rule: tap the state tabs, then answer the four questions at the foot — COPY VERDICTS builds the
paste-back block. Nothing here is built.
REVISED, SAME NIGHT — Wyatt’s notes (relayed via Skylar’s console), 9/22
late, verbatim: “They’re good but specifically you can see where text gets are too
tight/overlapped and text that need more buffer padding from lines —I feel like it’s a little
overwhelming with how much text is on the screen too. —I don’t think it needs to tell you how many
victories you have on the bottom —I don’t think it should have all the text on the bottom (“Mock,
Shipped strings, ect) —Under Challenge a Friend you don’t need to have a subline. —Under
Challenge World Worldwide you don’t need to have a subline.”
What this revision does: THE AIR LAW enters §VI (minimum buffer between text and any line — and the
tight seats it cures are real: the live page’s own band head and fold chips ride into the plaques,
measured in §I) · the ✦-victories whisper dies · every door drops its subline — the two gold doors
by Wyatt’s word, the dark doors and the sheet’s invite plate by the same law · the mock caption
labels are gone from the frames · row subs turn presence-only and §V’s texture question is
reshaped around the quieter direction (Q3 — the ★ moves) · the offline ghost line and the header caption are cut
or demoted (§VI law 13 carries the full list as build rulings). The original round stands in git history.
I · THE COMPLAINT, MEASURED
Measured against versus.js at v0.103.0 HEAD (the layout is byte-identical to the v0.102.0
stack — the only versus.js change since is the App Store URL). Design box 420×800; safeB is the
computed true foot, ~800 on a box-exact phone and ~830–855 on tall phones, where the doors sink with the
foot but the middle band does not follow — the void grows with the screen.
| STATE (TODAY) | THE MIDDLE ENDS AT | THE FIRST DOOR STARTS AT | DEAD NIGHT |
| zero duels (the common evening: you finished your games) | ~y360 — the pill strip | y612 | ≈252–300 pts, ~a third of the screen |
| 1 plaque | ~y420 | y612 | ≈192 pts |
| 2 plaques | ~y478 | y612 | ≈134 pts |
| 3 plaques | ~y536 | y612 | ≈76 pts |
| 4 plaques (fold) | ~y580 | y612 | fine — the busy page was never the problem |
| offline | ~y523 — the retry door | — (no doors) | ≈230 pts above the foot note |
| REPLAY SURFACE (TODAY) | NAME GETS | THE AFFORDANCE |
| presence strip pill · on the page (versus.js buildStrip) | 44 units at 9 pt — “Moonlit Hare” renders “Moonlit H…” | AGAIN tag 48×20, font shrinks 7.5 → 5.5 pt floor, then clips — es “OTRA VEZ” and de “NOCHMAL” live at the floor |
| social sheet RECENT row (openSocial) | 118 units at 12 pt | AGAIN button 76×24, font shrinks 9.5 → 7 pt floor |
Both of Skylar’s sentences are one defect: the people worth re-fighting were given the
smallest furniture on the page, while the ground that could seat them full-size sits empty right above the
doors. The fix is the same move in both directions — promote the people into the space.
And Wyatt’s padding note has a measured live root — these seats are tight in
versus.js today, not just in the mocks:
- The band head rides into the first plaque. — STANDING DUELS — sits at y306; its text bottom (~313)
crosses the first plaque’s top edge (336−25 = 311). An overlap, on the live page, tonight.
- The fold’s chips ride into the fourth plaque. At four plaques the strip seats at 549: chip top
531 vs plaque bottom 535 — 4 pts inside it.
- The strip head clears its own chips by ~2 pts (head bottom ~322, chip top 324).
- The whisper sat 9 pts under the second door (door bottom safeB−60, whisper top ~safeB−51) — retired
now by Wyatt’s word, which is also the cure.
The doors themselves clear each other by exactly 8 (tops safeB−188/−120, 60 tall) — legal under the law below.
THE AIR LAW (§VI, law 12) names the minimum buffers and the cures; the PROPOSED column obeys it everywhere, and
the TODAY column reproduces the tight seats as they live.
II · THE FILLED GROUND — EVERY STATE, BEFORE AND AFTER
The TODAY column reproduces the live page’s own seats, tight ones included — that tightness
is part of the complaint (§I). The PROPOSED column obeys THE AIR LAW everywhere.
← swipe — TODAY left, PROPOSED right →
THE PLAQUE LADDER — 1 → 4 STANDING DUELS, PROPOSED
The in-between states, so no plaque count is taken on faith: the duel band never moves, and the
replay rows yield a slot at a time until the fold. (Zero duels and the fold live full-size in the tabs above.)
the fill law breathing: 1 plaque · 3 rows → 2 · 2 → 3 · 1 → 4 · the detagged fold
The fill law, once (what the build implements):
- Plaques first. Standing duels keep the band head, the five cap pips and the shipped fold (>4 → 3 +
“+%1 more”). One air-law move only: the plaques drop 14 (336 → 350, pitch 58 kept) so the
band head finally clears the first plaque — today its text rides into the plaque’s top edge (§I).
- Replay rows fill the rest. Beneath the plaques (or alone at zero duels, under the shipped
“under this sky tonight” head), full 344×50 rows drawn from the strip’s own ranked picks —
friends online → recent rivals → mages of the circle — as many as the ground grants: rows keep coming while
the next row’s bottom stays ≥24 pts above the doors’ top edge (safeB−188). Max five. At zero duels the
“under this sky tonight” head takes y330 and rows fall at 374 + 58·i; in mixed states the head sits 12
pts under the last plaque, rows 12 under the head. On a box-exact phone that is 4 rows at zero duels, 1 at three
plaques; a tall phone earns one more instead of more void. The picks list is still ranked once per page open
and frozen — geometry only chooses how many show.
- The strip becomes the fold. At four plaques the rows compress into today’s pill strip — with the
tags removed: a pill whose verb must live at 5.5 pt should not carry a verb. The chip itself is the button (it
already is); the labeled AGAIN lives on the rows. Fold pills spend the freed width on the name at a fixed
10 pt. And the fold seats by the air law — chips center at the last plaque’s bottom + 32: today’s
fold rides 4 pts into the fourth plaque (§I); it stops.
- The hero owns the crown slack. The Duelists flex: 1.5× with plaques standing · 1.85× at
zero plaques · 2.0× on the funnel and offline pages — the zenith star and the fly-in anchor ride the
scale; the sky rig itself is untouched.
- The circle keeps its fiction. A circle mage’s row is dressed byte-alike a human’s — the
gold glint, never the word “online”, no bot word anywhere. Rows redress on the 1-second tick
(dots, subs, tags) and never reorder under a finger.
III · THE REPLAY ROW — ANATOMY, AND THE TRUNCATION LAW
One row builder serves the page and the sheet. The law it obeys, stated once and inherited by the
build card verbatim: words never shrink to fit furniture — furniture sizes to words,
and only names ellipsize.
Moonlit Hare
last night
AGAIN
row 344×50, pitch 58 — the plaque’s twin
presence dot r 4.5 — green pulse / amber busy / gold glint (circle) / slate
name fixed 13 pt · ellipsis at 168 units — no font shrink, ever
sub fixed 9.5 pt · presence word / night-clock alone — a circle row carries no sub (ratings only if Q3 turns)
pill fixed 10 pt · width = its word (10-unit buckets, 76–128) · gold = starts now, dark = summons waits
tap whole row + pill, 44-pt zones
THE PILL SIZES TO ITS WORD — ALL FIVE LANGUAGES, NO SHRINK LOOP
vsAgain across en·es·fr·pt·de, each at the same fixed 10 pt — the bucket width printed beneath.
The same rule dresses vsDuelTag (DUEL·DUELO·DUEL·DUELO·DUELL).
OTRA VEZ
today’s floor, actual size —
the strip tag at 5.5 pt
OTRA VEZ
the same tag ×3 — what a phone
actually asks a child to read
OTRA VEZ
proposed: fixed 10 pt,
the pill grew instead
THE LONG-NAME TEST
Keeper of the Ninth Star
online
DUEL
24 characters — the name input’s own cap — measures ≈163 units at
13 pt Georgia: the full worst-case name fits whole. The ellipsis loop survives as
a guard (registry dedupe suffixes like “Astral Raven 1” can push past the cap), not as a lifestyle.
The truncation law, verbatim for the build card:
- Buttons and tags never shrink. Pill width = ceil((textWidth+28)/10)·10, clamped 76–128, font fixed
10 pt. The 7.5→5.5 pt strip loop and the 9.5→7 pt sheet loop die.
- Names never shrink. Fixed 13 pt (page rows) / 13 pt (sheet rows) / 10 pt (fold pills), the shipped
ellipsis-while-loop at 168 / 128 / 78 units.
- Subs never shrink. Fixed 9.5 pt, same clip as their name.
- Page floor: nothing interactive under 10 pt, nothing readable under 8.5 pt — today’s floors are
5.5 pt (interactive!) and 6.5–7 pt. The big gold doors keep their fit-to-width loops (long de/pt labels genuinely
need them) with the floor raised 7 → 9 pt.
- Checked in all five languages — the harness pins es OTRA VEZ and de NOCHMAL (the widest words) at
full 10 pt in their buckets, and a 24-char name whole at 13 pt.
IV · TWO SURFACES, ONE ANATOMY — WHY THE SHEET SURVIVES
Keep both surfaces, unify the row. The page seats the few — ranked
picks, zero taps away. The sheet holds the many — the full friends roll, the deep
recent list, add-by-name, the app invite. One row builder means one truncation law everywhere; merging them
entirely would either scroll the scene (new machinery, new laws) or cap the roll at what the page can seat.
The “› ALL MAGES” door survives only in the fold — on the open page the gold CHALLENGE A FRIEND door
already is the sheet’s front door, and two doors to one room is one too many.
The regrown sheet: panel 380 → 448 tall (still well inside the design box), row pitch
32 → 38, names at fixed 13 pt with the bucket pill — and the freed height seats a fourth recent
rival. The friends rows, the +, the ✕ and the pinned invite keep their seats and their manners — and the
invite plate drops its subline (the door law: a label alone). Subs stay presence-only unless Q3 turns.
V · TEXTURE — REWORKED ON WYATT’S NOTES (question 3)
The original round argued for adding a line of texture to every row — rating first, an
optional last-word whisper. Wyatt’s 9/22 direction runs the other way (“overwhelming with how
much text”), so the recommendation flips: the quiet lane — presence only. The sub carries exactly the
strip’s own words today: online for a friend, the night-clock for a rival, nothing at all for a
circle mage (their sub is empty by the shipped fiction, and an empty line is air, not a hole). The mocks above
now show this lane.
The ratings texture stays on the table as Q3’s open alternative, mechanics unchanged from the round:
✦ 1024 · last night — ≤5 registry reads per page open, cached for the visit,
rows dressing in place when the number lands (the redress law); circle ratings from the rival engine’s own
Elo; the last-word garnish only where a near-duel note already holds it. Zero new synced data either way —
but if PRESENCE ONLY rules, slice F below never fires at all. Skylar rules; the question stands reshaped, not
removed.
VI · THE LAWS THE BUILD INHERITS
- safeB anchoring. Doors at safeB−158/−90, whisper/note at safeB−44, formula verbatim (the suites pin
it). NEW: the funnel’s three doors join the safeB family (safeB−370/−296/−222) and the offline retry
anchors safeB−158 — today both sit at fixed y and open a foot gap on tall phones.
- The doorsC contract. Doors live in a container, destroyed + rebuilt on funnel↔duels flips; container
children never appear in scene.children.list — suites aim at refs (chWorldB = the sentinel, chFriendB NULL in
funnel); every ref nulled in create() because scene instances persist across restarts.
- pendC rebuilds, stripC redresses. The replay rows live in pendC (their count is plaque-coupled), so
the pendKey gains the shown-row-count + picks component; the fold strip stays built-once. Picks rank once per
open; the 1-s tick redresses dots/subs/pills in place and never reorders.
- 44-pt tap zones everywhere (rows are 50 tall; pills wear ssHitPad 44).
- Five-duel cap pips; an unclaimed summons holds no slot; every row action routes through the cap gate
(vsCapSheet) exactly as the chips do today.
- Funnel and offline are designed states. Funnel: hero 2.0 + fiction + three safeB-anchored doors — no
people invented for a device that knows nobody. Offline: the ghost ledger becomes ghost rows (same
anatomy, dimmed, no pills, the shipped status fiction as the sub) + vsGhost line + anchored retry.
- The sky is kept. ssSkyWorld versus dress, seed 0x1701, no moon, navy veil, crest fireflies — the hero
flex touches scale and anchors only.
- Bots indistinguishable. Circle rows byte-dress like human rows; glint, never “online”; no
circle/bot/ai word on any surface.
- Record shapes kept. pendRows verbatim; the new rosterRows records ship for the suites the way
chipRows do; vsGameRows() untouched.
- The U+2694 grep gate stands. Zero new strings ×5 — every word on the filled page already ships
(vsTonight, vsAgain, vsDuelTag, the presence words, the night-clock). No new art files. And the revision only
removes words: six shipped lines stop rendering (law 13) with strings.js bytes untouched.
- Out of scope, named: the HOME meadow duel strip (game.js ~6150–6239) is a different surface and does
not move. Card 03 (the in-battle duel column) is independent — a plaque’s › still enters vsbattle, and any
battle doorway this design implies assumes card 03’s bigger-health-bar language once it lands.
- THE AIR LAW (new — Wyatt’s 9/22 note: text needs buffer from lines). In design pts: bare
text (heads, fictions, captions, whispers) keeps ≥12 to any furniture edge, rule, or neighboring
text · furniture (plaques, rows, chips, doors, pills) keeps ≥8 to furniture · text inside a panel
keeps ≥6 to its box · nothing ever touches or crosses a line. The transient noteT is exempt while
it passes (it steps in front and steps away). The cures this design already seats: plaques 336 → 350 · the fold
chips at last-plaque-bottom + 32 · the zero-duels head at y330 with rows from 374 · the whisper retired outright
(law 13) — and the strip-head-over-chips squeeze dies with the strip itself. The doors’ own 8-pt gap
(tops safeB−188/−120, 60 tall) already passes. The build’s harness measures the law on every state.
- THE QUIET GROUND (Wyatt’s 9/22 cuts — build rulings, all render-only; strings.js bytes untouched,
the keys simply go unread). These stop rendering: the ✦-victories whisper (vsVict; noteT keeps the
safeB−44 seat for transient notes) · the gold doors’ sublines (vsChFriendSub, vsChWorldSub —
Wyatt’s word) · the dark doors’ sublines (vsAddFriendSub, vsInviteNewSub, the sheet’s
invite plate included — the same law: a door carries its label alone, centered, geometry unchanged) ·
the offline ghost line (vsGhost — the dimmed rows speak for themselves). vsAsync survives on the
funnel alone, where it teaches. Row subs carry presence only unless Q3 rules for ratings.
VII · BUILD COST, HONESTLY — AND THE ORDER
| SLICE | WHAT | SIZE |
| A · the rows + the fill law | replay rows in pendC, geometry-driven count, fold-to-strip at 4 plaques (detagged), picks frozen per open | M |
| B · the truncation law | bucket pills + fixed fonts on page rows, fold pills, sheet rows; door floors 7→9; shrink loops removed | S |
| C · the hero flex | three scales (1.5/1.85/2.0), zenith + fly-in anchors ride, reduced-motion honored | S |
| D · funnel + offline respace | safeB-anchored funnel doors + retry, ghost rows, fiction reseats under the 2.0 hero | S |
| E · the sheet regrown | panel 448, pitch 38, fourth recent, shared row anatomy | S |
| F · the texture (gated on Q3 — the revision’s lane is presence-only; F fires only if RATINGS rules) | ratings on rows (registry reads ≤5/open, cached, redress-in-place; circle Elo from the engine) · last-word garnish where held | M |
| G · the harness | vspage re-aims (strip refs → row refs), fill-geometry pins ×5 states, truncation pins ×5 languages, fold-detag pin, funnel/offline anchor pins — rides the build card, ×3 green on final bytes | M |
Suggested order: one build card carries A → B → C → D → E (B is A’s own law;
C/D/E are geometry riding the same rebuild; the air law and the quiet-ground cuts ride A for free — they
are seat numbers and deleted draw calls), with G alongside — versus.js + tools only, zero strings.js bytes,
zero game.js bytes, roughly two dev-days. F is its own card, fired only if Q3 rules for ratings — it is
the one slice that adds reads. Per the queue law, nothing fires until the verdicts land and Skylar says go.
FOR SKYLAR — ANSWER BY NUMBER
Astro (Skylar’s console) · 2026-09-22 ·
Nothing here is built — zero game bytes were
touched for this page. Sources: live game v0.103.0 (HEAD 4f35e097; versus.js read end-to-end — the measured
stack is v0.102.0’s, byte-identical but for the App Store URL) · the shipped sky-world / letterpress /
nine-slice / plaque systems, reused verbatim in the mocks · strings.js ×5 for every word shown · prior rounds:
under one sky (9/9) ·
the turning sky. Mock names are circle-minter
names; every string on the mocks ships today.
Revised 2026-09-22, late, on Wyatt’s notes relayed via Skylar’s console (quoted in full at the
top): the air law, the quiet-ground cuts, Q3 reshaped toward presence-only, the frames’ mock labels removed.
Verdicts already clicked on this device carry over (Q3’s renamed chips migrate). The original round stands
in git history.