Appearance
Conversation-First Chrome
Status: shipped 2026-08-01 (PRs #196, #199) · falsification-hardened 2026-08-03 (PR #208) · retrospected 2026-08-03
What was decided
The table page's persistent (desktop) chrome is one conversation column on the left with the game on the right — the three old floating surfaces (chat rail, thoughts stack, history panel) and the right band they lived in are gone.
- Space-neutral by construction — the column is
CONVERSATION_COLUMN_PX = columnLeft + columnRight = 224 + 208 = 432px, the two old reserved bands combined, expressed as the shell's literalw-108(a test pins the class literal to the constant). The felt's solve band keeps its exact size and shifts right. - The column rides the existing override seam — the same
geometryOverridesmechanism collapsed (mobile) mode uses. The geometry engine and its defaults are untouched. - One stream, not tabs (Phase 2, founder-directed the same day) — chat, boxed/centered agent thoughts, and centered hand markers interleave in ONE chronological feed; the old tabs became stream filters (all / chat / humans / thoughts / hands), and picking a hand opens a panel above the chat. The feed's durability and curation are the sibling table-chat-history decision.
- Copilot tables keep today's 208px right reserve while the
CopilotSeatPanelis mounted — same overhang behavior as before.
Band integrity (falsification F1/F2 — the load-bearing mechanism)
"Space-neutral" was FALSE below ~1000px (cash) / ~1280px (copilot): the solver's bandScale (a container-size factor) and fitBands (columns are capped at HALF the container) shrank the solved band below the fixed 432px DOM column — measured 343px at 900w — so seats rendered underneath the conversation column, live on staging. The claim had been spot-checked at one width (1600px); the falsification walked the range.
The mechanism that now guarantees band.left ≥ CONVERSATION_COLUMN_PX at every width where the column renders:
minBandScale: 1on both conversation override sets — a band mirrored by a fixed-width DOM element must never scale below it.- The collapse W-threshold derives from the ACTIVE reservation totals —
CHROME_COLLAPSE_W_THRESHOLD = max(756, 2 × 432 = 864), because fitBands makes a 432px column untenable below 2×column. Devices in 756–864 now collapse (strictly better than broken-persistent). deriveChromeWidegates the copilot variant — the 640px copilot reserve needs ≥ 1280 (2×640); below the comfort width (with the same ±32px hysteresis discipline asderiveChromeMode) the page falls back to the plain conversation set and the fixed copilot panel overhangs (the pre-column status quo).
F3 (same falsification): the stream's "humans" filter now prefers the durable server-stamped author_class on history rows — current-seats matching alone reclassified a departed agent's speech as human.
Key trade-offs accepted
- Tab-pane structure was deleted within hours of shipping — Phase 1 built tabs; the founder's live smoke redirected to the one-stream design the same afternoon. Accepted as the cost of shipping to learn.
- 756–864px devices lose persistent chrome they nominally had — but what they had was seats-under-column; collapse is the honest mode there.
- Copilot below 1280px overhangs the felt's right edge — explicitly the pre-existing behavior, not a regression.
Full ADR/impl detail: .indusk/planning/archive/conversation-first-chrome/ (workbench planning archive).