Layout fix · chat surface

# Stop the horizontal jump. Lock the chat as the center stage; turn threads and entities into rails.

The chat surface jumps because three columns are competing for layout weight — and because the chat breaks out of the page frame that Home and Reports respect. The fix: put the chat back inside the 72rem page frame, lock the reading column at 760px, and have the rails overlay the stage when opened so the center never reflows. All features stay; the empty space stays — only the layout becomes anchored.

01

## Why the eye jumps

Each column reflows on its own schedule. The header, the stream, and the composer end up at different widths, and opening either rail re-stretches the message body. The diagram below shows the difference between the current "three competing columns" and the "center stage + rails" model we want.

### Before Three competing columns

Sidebar weight ≈ stream weight ≈ inspector weight. The center column resizes whenever a rail toggles.

- Header, stream, save bar, composer all use different alignment widths.
- Opening a rail makes the chat content bigger or smaller — a visible shove.
- Right rail competes with the answer; reads like a second document.

### After Center stage + rails

Stream stays anchored at 800px. Rails collapse to 64px icon strips and overlay before they ever push the stage.

800px reading lock

- Header, save bar, stream, composer share one alignment width.
- Rails open as peek first. Center only shrinks when both are fully expanded.
- Outer whitespace stays — now reading as deliberate gutters, not waste.

02

## The fix, live

Try the rail states. The center stream and the composer never change width — they share a single 800px lock. Toggle Show grid to see the lock; switch Focus / Balanced / Research to feel how the rails should default per task.

Mode
Left rail
Right rail
Show grid
stage 800px left 280px right 320px
overlay mode · stage stays anchored
Threads
Today
Orbital Labs · Series B diligence
Show me the 3 risks I should ask…
2m ago · 4 sources
Disco · pricing intel
What's their public price page say…
1h ago
This week
Mercor founding team
Who else has Brendan worked with…
Tue · 12 sources
Cognition · Devin updates
Any recent benchmark numbers I can…
Mon
Earlier
Turing investor list
Who led the last round…
Apr 18
Foundation Capital partners
Map of partners by sector focus…
Apr 14
O

#### Orbital Labs · Series B diligence

● fresh ·4 turns ·12 sources ·3 entities ·0 paid calls
Saved to Orbital Labs · diligence · 2 sections · 7 claims · 3 follow-ups
HS
You 9:42 AM

Show me the 3 risks I should ask Orbital Labs about in the diligence call. Cite a recent source for each.

N
NodeBench 9:42 AM
⚙ Researched 4 sources · 3 cached · 1 live · 0.8s

Three risks worth pressing
on, in priority order:

1. Concentration in two anchor pilots. Both anchors renew in Q3, and the public ARR hasn't been re-segmented since the seed deck.1 Ask what the post-anchor ARR floor looks like.

2. Founding-team co-investor overlap. Lead candidate is also on the board of
— the closest comp.2 Ask about info-share guardrails before term-sheet.

3. p95 latency on the hosted plan. Listed as the only outstanding eval item, but the latest blog post is from January.3 Ask for a fresh number; flag it as a perf enhancement, not a correctness blocker.

memory-first · 0 paid calls so far this session
Context
O
Orbital Labs
Geospatial intelligence · Series B
San Francisco · $48M Series B · led by Greylock · Mar 2026
Top relationships
One primary action
prototype · move modes / rails to feel the 800px lock — header, stream, save bar, and composer never reflow
03

## Layout spec

Concrete numbers to drop into `nodebench.css`. The reading lock is the most important value — once it's stable, the rest follows.

#### Widths

Page frame (matches Home / Reports)72rem · ≈ 1152px
Center stage (stream + composer)760px lock
Left rail · collapsed 64px
Left rail · peek 260px
Left rail · expanded 320px
Right rail · collapsed 64px
Right rail · peek 300px
Right rail · expanded 360px
Outer gutters 24–40px

#### Motion

Rail open / close 200ms · ease-out-expo
Center anchor no width animation
Rail content fade-in opacity + 4px slide
Stage reflow on rail open never · rails overlay
Reduced motion no-op transitions

#### Mode presets

Mode | Left | Right
--- | --- | ---
Focus | collapsed | collapsed
Balanced | collapsed | peek
Research | peek | expanded

04

## Interaction rules

These are the small behaviors that keep the layout feeling anchored even as the user works.

- Wrap the chat surface in nb-shell (72rem) so it visually matches Home and Reports.
- Default both rails to collapsed icon strips — the conversation is the hero.
- Open rails as overlays over the stage with a soft scrim, dismissable on outside click.
- Header, save bar, stream, and composer all align to the same 760px center column — one ruler, no drift.
- Allow pin on the right rail so it persists across threads when the user wants it.

- Let the chat surface go full-bleed while Home and Reports stay framed — jarring on tab switch.
- Default both rails open — the center never gets to feel like the hero.
- Let the chat width float between 600px and 1100px depending on rail state.
- Treat the right rail as a second document — keep it to top relationships and one CTA.
- Use a different alignment width for the header vs the stream vs the composer.

One-sentence brief

We fixed the horizontal jump by putting chat inside the same 72rem page frame as Home and Reports, locking the reading column at 760px, and letting threads and entity context overlay the stage instead of pushing it — preserving every feature, keeping the premium whitespace, and making every surface feel like the same product.