Grid layout transitions — v14 sketch (re-frame the stuck grid-shape fork) (Firewatch Camera Grid)

**Note** from Bead: Firewatch Camera Grid · [canonical source](https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/2026-06-24/notes/08-grid-layout-v14-sketch.md) · session 2026-06-24 · discussion: Talk: Firewatch Camera Grid

**Rendered:** https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/2026-06-24/artifacts/sketches/grid-layout-transitions-v14.html Sketched by **Debbie** (senior UX/UI), as a self-directed bead-**step**. v14 is a *design* increment on [v13](./07-grid-layout-v13-sketch.md), not a plumbing one — it re-opens the one fork that has refused to close.

## The step I chose, and why it's the highest-value move now I drained the live ballot box first (read-only PROPFIND + GET on [`feedback/`](https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/feedback/)). **It is empty** — only `.acequia-access.json` + `README.md`, **zero `grid-layout*.json` votes**. So there is nothing to synthesize and I won't fabricate a tally. That emptiness *is* the signal. The grid-shape fork (A aspect-follows vs B fixed-≤3-col) has been posed as "awaiting the team vote" across **five** versions (v8→v13) and drawn **no** votes. In sketch-ux terms (Buxton: *read the question a sketch raises*), a fork that won't resolve through five iterations is almost always **mis-posed**, not merely unanswered. So the highest-value step is not to re-skin v13, nor to wait longer — it's to **diagnose why the fork is dead and re-frame it so it becomes answerable.**

## The diagnosis (grounded in the v13 code, not vibes) A and B differ only in `gridCols(n)`. The copy framed them as a *values* choice ("spatial vs predictable"), but that framing hid the actual cost: - The whole v6→v13 arc earned **position-preserving placement** (min-cost assignment over on-screen positions → crossings → 0): the morph *teaches the eye* a left-stays-left / top-stays-top reading. - **Fork B (fixed ≤3-col reading order) silently throws that reading away** the instant the cards land — it re-packs by index, not by position. B therefore **contradicts a ratified mechanism**, and that contradiction was invisible in the A/B copy. No one can vote with conviction on a binary whose real trade-off is unstated.

## What v14 does (three surgical moves) 1. **Makes the hidden cost FELT — a "spatial reading retained" gauge.** New `spatialRetention()` scores, over every camera *pair*, whether their left/right and up/down order on the map is preserved in the grid (1.0 = every pair kept; lower = scrambled). It updates live every frame/scrub/fork-pick. Standalone harness on a vertical line of 5 cameras: keeping the column = **1.00**; forcing 3-col reading order = **0.60**. The gauge turns "predictable vs spatial" into a number you watch move. 2. **Replaces the false binary with the real spectrum — adds Fork C · aspect-floored (the new first-cut).** Aspect-follows, but for 4+ cameras clamp columns to **2–4** so a tall set never degenerates into a 1-wide strip and a wide set never into a 1-tall strip. Harness (cols per fork): - tall column of cams: **A=1, C=2, B=3** — A is a hard-to-scan strip; C is the middle. - wide row (n=8): **A=7, C=4, B=3** — A degenerates the other way; C stays scannable. - square spread: **A=C=B=3** — C only diverges at the degenerate extremes, which is exactly the synthesis the stuck A/B vote was groping toward. 3. **Keeps v13's whole ballot-box machinery** so the re-framed three-way fork is answerable **in-sketch** by the team: same write-only `feedback/` ballot token (`hxhs9al8o865ljoj3ijet4d9`), same own→ballot→modal layering, same 5s-polling dashboard (now tallies A/C/B and still folds in any earlier v8–v13 A/B votes via the choice aliases). New choice `aspect-floored` wired through `CHOICE_OF_FORK`, `CHOICE_ALIAS`, `FORK_LABELS` (+`.trow.c` bar color).

## Kept intact (v8–v13, not regressed) Single-scene `lerp(mapPos,gridPos,t)` morph (zero create/destroy); position-preserving placement (NAIVE↔POSITION, crossings→0); dim-ghost basemap; straight-lerp; MAP◀▶GRID scrubber; viewport-implicit selection + live filtering; 2D/3D drag-pan; per-card un-pin/re-flow; OrientedMap glyphs + tie-point ray; 3D oblique; TIME cursor; identity color; onboarding overlay + Buxton link; "Redfish Team" label. 180° axis stays removed.

## The re-framed fork (answerable in-sketch) > **How should the grid choose its rows × columns — and how much of the map reading should > survive the morph?** > > - **A · aspect-follows (pure)** — highest retention, can degenerate to a 1-wide strip. > - **C · aspect-floored (NEW, first-cut)** — aspect-follows with a 2–4-col readability > floor; keeps most retention *and* stays scannable. > - **B · fixed (≤3 cols, reading order)** — predictable/dense, but **watch the gauge > drop**: it discards the map reading. **First-cut: C.** It dissolves the A-vs-B tension instead of forcing a pick between spatial-fidelity and scannability. PUTs `sketch:grid-layout-v14` into the ballot box; the dashboard tallies it alongside any prior A/B votes.

## Verified - Ballot box: PROPFIND Depth:1 + GET → empty of votes (only access file + README). No vote fabricated. - `gridCols`/`aspectCols`/`spatialRetention` logic harnessed standalone (numbers above). - v14 inline script: `node --check` PASS. - *Not run* (no deploy this step; parent publishes): live incognito UI end-to-end. The ballot machinery is byte-identical to v13 except the added choice key, which was verified live on v10–v13.

## Status **first-cut** — fork re-framed from a dead binary into an answerable three-way with a live cost gauge; first-cut **C (aspect-floored)**. Awaiting the team's vote in the [ballot box](https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/feedback/).

## Next step (for whoever picks up the line) If C draws votes / Stephen ratifies: this is the moment to **port the converged engine into the real camera-grid app** (single-scene lerp + position-preserving placement + the readability-floored shape + OrientedMap glyphs) — the OrientedMap-consistency migration the notes keep circling — and to **Tufte-refine** the gauge (it's the one converged read worth making big). If the gauge instead reveals people *want* B's predictability despite the cost, that's a real finding too: it would say the spatial-continuity thesis is weaker than five versions assumed.