Specimen 1 - the page at width. The tree (the seat's whole index, the project row with its name and path above it, 16px per-type glyphs from the material icon theme with the folder tints, filter behind a hairline, a pill per file carrying its comment count; a folder holding a file starts folded, a folder holding only folders starts open, and crates/ and docs/ show that skeleton while client/ sits folded; the reader's own path is open because the rail's jump opened the folders above it), the reader (read-only, shiki-coloured, wrapped, the target line tinted with its gutter +, a thread drawn under its own line and the composer under the line being written), and the comments rail (every dropped thread by path and line, the finish stack at its bottom: the summary box over the door). The reader's own lane scrolls; nothing scrolls sideways.

<- session

Files

/Users/me/proj/.claude/worktrees/tree-review-survey|1,166 files 1 to read
crates/forge-server/src/surface.rs rust·1,406 lines
308
309
310
311
312
313
314
315
316
317
318
+320
321
322
323
324
/// One file's whole content at a revision, for a review page's
/// between-hunk expansion.
pub async fn file_content(
&self,
seat: &SessionSlot,
path: &str,
sha: Option<&str>,
) -> Result<FileLines, String> {
let Some(cwd) = self.roster().cwd_for(seat) else {
return Err(format!("forge holds no session for {}", seat.display()));
};
env::git_diff::file::read_file_lines(
&cwd,
sha.unwrap_or("HEAD"),
path,
self.workspace.document_max_bytes(),
open surface.rs · line 320
youedit
HEAD reads the tip NOW. On this page the read is the working tree, so the line I am on is the line the worker has - good.
resolved that resolves it - the scope stays the seat. lib.rs · line 12
surface.rs · line 323
The reader's ceiling should be its own key, not the document one 

Specimen 2 - the kinds. One policy decides every file, the same the chat's Read rows read: a Justfile opens coloured with its own grammar and named in the head; a text file no grammar names draws plain, and the head says why; a picture draws itself, bounded, with its mime and dimensions; a PDF draws its pages; and a file with no viewer draws a notice naming its type and size, saying it is still in the tree.

Justfile just·41 lines
1
3
4
5
set shell := ["bash", "-cu"]
check:
cargo fmt --check
cargo clippy --all-targets -- -D warnings
data/notes.weird plain text - no syntax for this file
1
2
nothing here matches a grammar
so it draws as plain text, and the head says why.
assets/forge-mark.png image/png·512 × 512
docs/retro.pdf application/pdf·2.1 MB

The browser epic, retro

Six tasks, 45h worked against 59h estimated, 0 reopened, 0 failed.

The engine was the easy half; the lifecycle was the cut.

dist/forge.tar.gz archive·2.1 MB
This file is not text (application/gzip, 2.1 MB), and there is no viewer for it here. It is still in the tree and reviewable as a file.

Specimen 3 - the states. A refused read owns its sentence where the file would sit; a tree with no files, and a filter with no match, say so in the tree's own place; a thread the landing could not place parks in the rail with its captured lines kept, never dropped.

a refused read
the document is 24 MiB, over the 10 MiB ceiling
- the read's own words, where the file would sit
no files / no match
The seat's tree has no files.
- or: No file matches this filter.
no viewer
This file is not text (application/gzip, 2.1 MB), and there is no viewer for it here.
- it is still in the tree and reviewable as a file

Specimen 4 - the narrow page. The reader is the page; the tree and the comments are sheets behind two real buttons, each raising a history entry so the hardware Back closes what it opened, with done and Escape as the other doors. The strip's files slip (the door onto this page) is drawn on the session page's own drawing.

<-

Files

1,166 files tree comments (2)
crates/forge-server/src/surface.rs
319
+320
321
env::git_diff::file::read_file_lines(
&cwd,
sha.unwrap_or("HEAD"),

Specimen 6 - the conversation. The same rounds the review page draws of a branch, over the seat's tree scope (one component, both pages): newest first, each round with its age, tally chips and the threads it sealed - and the reply box under the thread being answered. Parked threads sit above in their own group with their captured lines. It takes the whole row; the rail, with the finish, is the Files tab's.

Rounds newest first

R2 2h ago 1 open1 resolved

The round's own summary sentence, as the finish took it.

open crates/forge-server/src/surface.rs · line 320
youeditthe tree scope rides the seat, so a rebase keeps them
agentkept - the scope is the seat and never the branch