Rio
adr/README.mdRaw Markdown · GitHub ↗

Architecture Decision Records

This directory holds rio's architecture decision records (ADRs), in the style described at adr.github.io and in Michael Nygard's original template. Each record states one decision: the situation that called for it, what was decided, and what follows from it.

Names

Decisions are recorded here and nowhere else (ADR-0144).

  • D1 to D136 are the names the old decision log in AGENTS.md used. Source comments and the changelog still cite them. A record's Decision: line carries its D number.
    • D1 to D111 are ADR-0001 to ADR-0111.
    • D112 to D136 are ADR-0118 to ADR-0143: grep -l 'Decision:\*\* D123' adr/*.
    • ADR-0112 to ADR-0117 never had one.
  • From ADR-0144 on a decision has one name: ADR-NNNN.

Statuses

StatusMeaning
AcceptedIn force.
Accepted, not implementedIn force as design; no code yet.
Amended by ADR-NNNNIn force, with a later record changing part of it.
Superseded by ADR-NNNNReplaced; kept for its reasoning.
RejectedTried or considered and reversed; kept so it is not proposed again.

Index

ADRTitleStatusDate
0001Three layers: core, frontends, optional serverAccepted; amended by 00302026-06-24
0002The core API is a transport-independent message protocolAccepted; amended by 00302026-06-24
0003The core owns the document; frontends are viewsAccepted2026-06-24
0004Tcl/Tk for core and GUI, Ck for the TUIAccepted; the TUI is deferred by 01122026-06-24
0005The TUI is keyboard-onlyAccepted, not implemented (the TUI is deferred, 0112)2026-06-24
0006Windows TUI through Cygwin, PDCurses as fallbackAccepted, not implemented (the TUI is deferred, 0112)2026-06-24
0007Git by shelling out to gitAccepted2026-06-24
0008LLM access behind a stable provider interfaceAccepted2026-06-24
0009The responsive layout rule is a shared pure functionAccepted, not implemented (the TUI is deferred, 0112)2026-06-24
0010Asynchrony through the event loop and coroutinesAccepted2026-06-24
0011Newline-delimited JSON wire protocolAccepted; amended by 01132026-06-24
0012Document model: a list of lines, line.col positionsAccepted2026-06-24
0013Fixed layout regions and a collapsible section stackAccepted; amended by 00352026-06-24
0014Responsive tiers and the unified-diff fallbackAccepted, not implemented (the TUI is deferred, 0112)2026-06-24
0015No terminal pane; a headless command primitive onlyAccepted2026-06-25
0016A plugin is a protocol participantAccepted, not implemented (the general plugin platform is deferred)2026-06-24
0017Contribution points for extensionsAccepted, not implemented (the general plugin platform is deferred)2026-06-24
0018UI contributions are declarativeAccepted, not implemented (the general plugin platform is deferred)2026-06-24
0019Plugin manifest and permissions; no marketplace platformAccepted; distribution amended by 00392026-06-24
0020Agent orchestration in the core, providers and tools outsideAccepted2026-06-24
0021Plain-text configuration in XDG locations, never executedAccepted; session storage amended by 00312026-06-25
0022Preserve encoding and line endings; cursors are frontend-localAccepted2026-06-25
0023Keybindings are dataAccepted; amended by 01432026-06-25
0024Themes are semantic-role data filesAccepted; amended by 01422026-06-25
0025JSON encoding is shape-aware, never value-sniffedAccepted2026-06-25
0026The agent's first slice, on the official API key onlyAccepted; amended by 0034, 0069, 0083, 01042026-06-27
0027Icons are monochrome Unicode glyphsAccepted2026-06-29
0028A core line diff and a read-only compare viewAccepted2026-06-29
0029The GUI can drive a remote core over a socketSuperseded by 00302026-06-30
0030The frontend is always a client over a channelAccepted; amended by 00962026-06-30
0031Sessions and preferences, split by owner, out of treeAccepted2026-07-01
0032Syntax highlighting: swappable per-line scanners in the frontendAccepted; the viewport scoping deferred here arrived with 01332026-07-01
0033Two side-by-side editor groupsAccepted2026-07-06
0034A core-owned, provider-agnostic system promptAccepted; amended by 0070, 0079, 01052026-07-08
0035Tool windows live in dock sites, not in the document tabsAccepted2026-07-12
0036Find and replace: the engine in the core, a bar in the GUIAccepted2026-07-12
0037Stale-link detection at the protocol layerAccepted2026-07-12
0038Editing modes as a bind-tag layerAccepted; amended by 0041, 01432026-07-12
0039Extension repositories over plain HTTP, apt-sources styleAccepted; amended by 0066, 0107, 0109, 01242026-07-17
0040Column editing as a GUI-only vertical cursorAccepted2026-07-23
0041The core ships one editing mode; emacs and vi are extensionsAccepted2026-08-03
0042The files pane is a rich list drawn on a text widgetAccepted; amended by 0043, 00872026-08-06
0043A shared rich-list component; git flags in the files paneAccepted2026-08-06
0044Pane context menus and the first git write operationsAccepted2026-08-07
0045Commit from a bar that appears only when something is stagedAccepted; amended by 00812026-08-07
0046Highlighters can register by file nameAccepted2026-08-10
0047Disk writes are announced with fs.changedAccepted2026-08-18
0048File management as core operationsAccepted; target directory rule amended by 00872026-08-18
0049A line-number gutter drawn from the text widget's geometryAccepted2026-08-19
0050Cursor position in the status barAccepted2026-08-19
0051Find in files: a core engine and a bottom results panelAccepted; scope amended by 00522026-08-19
0052One search panel: two engines, three scopesAccepted2026-08-19
0053LLM integration is assisted, not autonomousAccepted; amended by 00842026-08-23
0054Every entry point pins the source encoding to UTF-8Accepted2026-09-03
0055Questions about the core's host are answered by the coreAccepted2026-09-03
0056The editor font is a user override on the theme fontAccepted; amended by 01432026-09-03
0057Tab overflow: page, wrap, or listAccepted; amended by 0074, 00782026-09-03
0058A Preferences window that owns no stateAccepted; amended by 0085, 00922026-09-03
0059Patching Tk's menu click behaviourRejected (shipped, then reverted)2026-09-04
0060Current-line highlightAccepted2026-09-04
0061Click a line number to select the lineAccepted2026-09-04
0062Hide dotfiles in the files pane by defaultAccepted2026-09-04
0063Hover tooltips for glyph controlsAccepted2026-09-04
0064Menus are kept within screen height by groupingAccepted2026-09-04
0065A second provider, and hardening the provider contractAccepted; distribution amended by 0066; keys made per profile by 01382026-09-04
0066Providers install from repositories, behind a versioned APIAccepted; amended by 00692026-09-04
0067The Extensions window moves to the Settings menuAccepted; the item moved once more in 01372026-09-04
0068Static help must look different from controlsAccepted2026-09-04
0069Claude is an installable provider; echo is the only built-inAccepted2026-09-04
0070A defined place for user and project promptsAccepted; amended by 0079, 01052026-09-04
0071Relative line numbersAccepted2026-09-05
0072A session for work with no project openAccepted2026-09-08
0073Compare gets its own top-level menuAccepted2026-09-08
0074A bounded buffer picker replaces the Tabs menuAccepted; generalised by 00922026-09-08
0075A top-level Find menuAccepted2026-09-08
0076About rio shows the build's commit identityAccepted; the release version it lacked arrived with 01302026-09-08
0077Open several files from the native chooserAccepted2026-09-08
0078Multi-line tabs flow into packed, justified rowsAccepted2026-09-08
0079A per-provider prompt layerAccepted2026-09-08
0080Git discard for everyday useAccepted; amended by 0093, 00972026-09-08
0081An optional commit message bodyAccepted2026-09-08
0082A busy indicator while the agent worksAccepted2026-09-09
0083The agent runs commands: gated, asynchronous, time-boundedAccepted; amended by 00842026-09-09
0084Human-authored command allow-listsAccepted2026-09-09
0085Agent configuration lives in PreferencesAccepted2026-09-09
0086Drop a file on the window to open it, with optional tkdndAccepted2026-09-09
0087The files pane becomes a tree from the project rootAccepted2026-09-09
0088Reopen the last folder on launchAccepted; amended by 00892026-09-09
0089Remember the unfolded tree; survive a deleted folderAccepted2026-09-09
0090Undo coalescing by word, decided in the coreAccepted2026-09-10
0091The user manual lives in the source treeAccepted2026-09-10
0092The theme menu becomes a bounded pickerAccepted2026-09-10
0093Discard from the file tree, and discard allAccepted2026-09-10
0094Buffers detect changes to their filesAccepted2026-09-10
0095A headless run never asks a human anythingAccepted2026-09-11
0096rio speaks the protocol; it does not dialAccepted2026-09-11
0097Discarding a rename restores the old nameAccepted2026-09-11
0098Files inside an untracked folder can be tracked individuallyAccepted2026-09-11
0099rio shows its own manualAccepted; amended by 01002026-09-11
0100The manual is rendered, with working links and searchAccepted2026-09-11
0101Plan mode: a core tool and a readable plan viewAccepted; amended by 0102, 01032026-09-11
0102The edit policy is chosen when a plan is approvedAccepted2026-09-11
0103The plan tool is offered in every modeAccepted2026-09-11
0104No step cap; a Stop button insteadAccepted2026-09-11
0105rio's shipped prompt is complete and visibleAccepted2026-09-11
0106Model and effort are provider-declared optionsAccepted; extended by 0135 and 01382026-09-12
0107Extension versions are semver and are comparedAccepted2026-09-12
0108The editor has a context menu built from the Edit menu's tableAccepted; amended by 0121, 01432026-09-12
0109https beside http, trusted from the host's CA storeAccepted; amended by 0110, 0111, 01202026-09-12
0110The agent refuses https without host-name checks unless allowedAccepted; amended by 01202026-09-15
0111A certificate that fails verification can be accepted by fingerprintAccepted; amended by 01202026-09-15
0112The TUI is deferred after a successful Ck spikeAccepted2026-06-27
0113A small, stable error-code taxonomyAccepted2026-06-26
0114A project is one root folder held by the coreAccepted2026-06-27
0115Hard dependencies are minimal; optional ones must degrade cleanlyAccepted2026-09-09
0116Verification is automated, offline, and proven against injected faultsAccepted2026-09-11
0117A fact kept in two places must have a guardAccepted2026-09-10
0118A buffer's language can be picked by handAccepted2026-09-16
0119Change with Agent: a request about the selected text, and only thatAccepted2026-09-16
0120One core-wide switch for https without host-name checksAccepted2026-09-17
0121A context menu on every text widget outside the editorAccepted; amended by 01432026-09-17
0122A missing dependency names the package to installAccepted2026-09-17
0123rio has a window and taskbar iconAccepted; the artworks it compares were removed by 01272026-09-18
0124A repository can be signed, and rio checks itAccepted; amended by 0125; trust on first use superseded by 01262026-09-16
0125Every repository signing key rio trusts is listed, and can be forgottenAccepted; amended by 01262026-09-19
0126A signing key is trusted when the user confirms it, never because it arrived firstAccepted2026-09-19
0127rio ships only artwork it can pass onAccepted2026-09-20
0128rio is MIT-licensedAccepted; amended by 01292026-09-20
0129An extension payload carries its licence inside itAccepted2026-09-20
0130rio is 0.1.0: semver for releases, integers for contractsAccepted2026-09-20
0131rio has a changelog, and a guard keeps it currentAccepted; amended by 01442026-09-20
0132A file too big or too binary to open is declined, not readAccepted; the budget was raised by 01332026-09-20
0133A big file is slow because of what rio does to it, not because it is bigAccepted2026-09-20
0134A headless run must not be able to receive real inputAccepted; amended by 01402026-09-21
0135A provider declares its own settings, and rio renders themAccepted; where the settings window lives reversed by 0137 — the option vocabulary, the thinking verb and provider-api 4 stand; amended by 01382026-09-22
0136One install script per platform, and a launcher that makes rio an applicationAccepted; amended by 01412026-09-22
0137A top-level Extensions menu; each extension configures itselfAccepted2026-09-23
0138A provider keeps several named configurations, and an option may name a fileAccepted2026-09-23
0139Autosave writes a separate recovery copy, never the file you are editingAccepted2026-09-26
0140On macOS, platform facts are asked of Tk, not assumedAccepted; amended by 01412026-09-29
0141macOS gets its own installer, and rio.app is a copy of wishAccepted2026-09-29
0142On Aqua, the theme reaches the native controls, and chrome text has a floorAccepted2026-09-29
0143On a Mac, rio uses the Mac's keys and its right mouse buttonAccepted2026-09-29
0144Decisions live in adr/ only; AGENTS.md is instructionsAccepted2026-10-02
0145The GUI is one file per concern; rio-gui.tcl is the entryAccepted2026-10-02
0146Undo has a budget, and a step holds a text onceAccepted2026-10-02