Decision record

ADR-0009: A page opens to read

Written by

ADR-0009: A page opens to read; editing is a state a person enters

Status: accepted · 2026-09-11

Context

An editor who opened a page got the editor at once. The server load signed a collab ticket for anyone with page.edit, the client joined the WebSocket room on mount, and the Tiptap bundle loaded — whether the person had come to write or to read. Viewers, who cannot edit, got rendered HTML with the comments, threads and decision controls all working. Read state existed; an editor was simply never shown it.

Three properties of this product make “which mode opens first” a question with a right answer, not a matter of taste.

  1. A page in a live room refuses agent writes. ADR-0003, and it is right. But the room opened the moment an editor looked at a page. Every reader was blocking every agent for as long as their tab was open, and the agent was told the page was being edited when nobody was editing it.
  2. Autosave overwrote API writes that landed while someone read. On 2026-09-10 two section updates to a plan were silently lost: the page was open in a tab, nobody was typing, and the editor flushed its older copy over them. The live-room guard exists to prevent exactly this and was bypassed that day — but the deeper cause was that reading opened a room.
  3. Any revision withdraws an approval. An approver who opened a brief to read it and brushed a key had retracted the approval they came to check. The person whose job is to decide was the person most exposed to an accidental edit.

Each is fixed by the same change: nobody holds a room until they ask to.

Decision

A page opens to read. Editing is a state a person enters and leaves.

Two exceptions, both narrow:

Two things ride on the change because they are what it was for:

And one consequence that turned out to be a design point rather than a side effect: the workspace-change notice — “this page changed, refresh?” — was for the page you are in, so a reload could not discard what you were typing. With read by default, in means editing. A page being read now refreshes itself when someone else writes to it, which is exactly what a reader wants when the writer is an agent.

Alternatives rejected

Keep opening in edit, and make the room guard smarter — treat a room with no recent edits as inactive. Rejected: it turns “is anyone editing” into a heuristic with a window, and the failure mode is the one from 2026-09-10, silently.

Open in edit but hold off joining the room until the first keystroke. Closer, but the first keystroke is precisely the one that withdraws an approval, and the editor bundle still loads for every reader.

Per-page memory of the last mode. Rejected: a link that opens differently depending on what the reader did last time is a link that cannot be relied on.

Auto-exit edit after idle. Tempting for the agent-write case. Rejected: a person who stepped away mid-sentence and returns to find their page rewritten by an agent has a worse problem than the one this solves. Done is explicit.

Consequences

Not decided here

Suggested edits — a reviewer proposing replacement text — are a different feature. Section-level edit, shipped here, is where they would attach.

Written and maintained by , who made this decision — about · GitHub.

← All decisions