Architecture decisions
Short records of the decisions that shape this project, written before the code they govern exists. Each states what was decided, what else was considered, and what the decision costs.
Records are numbered and immutable in intent: when a decision changes, a new record supersedes the old one rather than editing history. Status starts at Proposed and becomes Accepted in the pull request that implements it.
Options and consequences are labelled (O1, C1, …) so they can be cited precisely
from issues, pull requests, and other records — 0004 · C3 is the third consequence
of record 0004. A consequence added after a record is published gets a suffixed label
(C1a) rather than renumbering the ones after it, since renumbering would invalidate
every citation already written down.
| # | Decision | Status |
|---|---|---|
| 0001 | Voice-first input is a primary design constraint | Proposed |
| 0002 | TypeScript, not JSDoc-typed JavaScript | Accepted |
| 0003 | Multi-page static rendering, no framework, no bundler | Accepted |
| 0004 | Prose stays Markdown; question definitions become TypeScript | Proposed |
| 0005 | Cloudflare Pages, for control over response headers | Proposed |
| 0006 | No in-app speech recognition; scope the privacy claim honestly | Proposed |
| 0007 | The clipboard is the airgap | Proposed |
| 0008 | Installation is what makes storage durable, and the app must say so | Proposed |
| 0009 | Encryption is an opt-in add-on; the export envelope is designed for it now | Proposed |
| 0010 | Printing stays a supported output, not an accident | Proposed |
| 0011 | Question identifiers are frozen, registered, and never derived | Proposed |
Still open
Nothing outstanding. 0004 · C4 raised question-identifier versioning as the one
decision deliberately left unmade; 0011
settles it.