Skip to content

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 literal w-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 geometryOverrides mechanism 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 CopilotSeatPanel is 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:

  1. minBandScale: 1 on both conversation override sets — a band mirrored by a fixed-width DOM element must never scale below it.
  2. The collapse W-threshold derives from the ACTIVE reservation totalsCHROME_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).
  3. deriveChromeWide gates the copilot variant — the 640px copilot reserve needs ≥ 1280 (2×640); below the comfort width (with the same ±32px hysteresis discipline as deriveChromeMode) 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).