skip to the page

Decision records

A decision record is a short note written on the day something was settled. It says what the situation was, what was decided, what that costs — and which sensible alternative was rejected, and why.

That last part is the one worth having. A codebase shows you what was built. It never shows you the three things that were nearly built instead, so the next person to have the same good idea has to rediscover on their own why it does not work. The records are where that is kept.

Each one has a number, which is just its filename and the order it was written in. Nowhere else on this site will you be shown one, because four digits are a footnote to a document you have not opened. Here they are the subject, so here they are.

The trail is never edited

When Loom changes direction, the old record is not corrected. It is marked as replaced, its text left exactly as it was, and a new record explains what changed and why the earlier reasoning no longer holds.

So a record can be in one of a few states, and the wording in the table below is the record's own:

StateWhat it means
AcceptedIn force. This is how Loom works today.
Accepted — partially superseded by …Still in force, except for the one part a later record took over. A record that answered several questions can be replaced in part; retiring the whole thing would lose more than it clarified.
Superseded by …Replaced. Worth reading anyway — the reasoning that stopped holding is usually the interesting bit.
ProposedWritten, not settled. Waiting on a person.

The list

Newest last. The table is read from the repository when this site builds, so it is the same list a checkout has.

217 records. 202 in force, 5 superseded in part, 2 replaced outright, 8 proposed and waiting on a person.

Every title below opens that record’s file in the repository, marked ↗. They are working notes rather than pages of this site, and they read like it.

#What was decidedStatus
0001The tree and the delta are the unit of AI-authored changeAccepted
0002The Gate is a pure function of two independent axesAccepted
0003AI drafts a change; the runtime names what it createsAccepted
0004The model-facing schema is a projection, not the ASTSuperseded by 0014
0005Model access is a narrow seam with an optional adapterAccepted
0006A refused proposal gets exactly one repair attempt, and both halves are recordedAccepted
0007Confidence is self-graded, trusted on purpose, and must be calibratedAccepted
0008The renderer is a total, pure projection of the treeAccepted
0009Primitives receive AI-authored props in a bag, never spreadAccepted
0010Edit mode decorates; it never invents DOMAccepted
0011A primitive declares its props, and the render seam enforces themAccepted
0012Conformance is probed and reported, never enforced by registrationAccepted
0013The registry is what the model is told it may buildAccepted
0014The reply schema must fit a compiled-grammar budgetAccepted — supersedes 0004
0015The registry is generated from the directory, and a module's name is its typeAccepted
0016The log is the truth and the snapshot is a materialised viewAccepted
0017Every write goes through one server-side pathAccepted
0018The portal is a consumer, not an insiderAccepted
0019The portal is a review queue, not a design toolAccepted
0020A store handle is the scope, and a listing is a keyset pageAccepted
0021A held proposal stays server-side, and an answer names its idAccepted
0022The backing store is Postgres, reached by SQLAccepted
0023Telemetry narrows the event stream and never copies the logAccepted
0024Emission never does IO, and the host flushes onceAccepted
0025A journal page is taken from an end, and names both of its endsAccepted
0026The revision log is read a page at a time, from either endAccepted
0027Identity is server-derived, and its absence fails closedAccepted — partially superseded by 0029
0028A tree is auditable only if its host can reproduce the seedAccepted
0029The approval belongs on the revision, not only in the journalAccepted — partially supersedes 0027
0030The package ships compiled outputAccepted
0031Calibration is a reader, not a controllerAccepted
0032An undo is a proposal, not a rewindAccepted — partially superseded by 0035
0033The policy is resolved per change, and named on the verdictAccepted
0034A sign-in that cannot be counted is refusedAccepted
0035Discarded work is a stake, and only the runtime may declare itAccepted — partially supersedes 0032
0036A table Loom creates is locked when it is createdAccepted
0037The journal may forget, and only a whole episode at a timeAccepted
0038An id names one node, and a return is not a reuseAccepted
0039The attempt log is counted, never enumeratedAccepted
0040A failure names the actor who must clear itAccepted
0041Authorship is derived from the log, not carried on a nodeAccepted
0042A sink observes, and the runtime contains itAccepted
0043A revision is a position a caller may nameAccepted
0044A move relocates a subtree, and the analysis measures the subtree, not the phrasingAccepted
0045A telemetry field added later is optional, and never defaultedAccepted
0046A render test crosses no boundary the framework would notAccepted
0047A verdict belongs to the gate that reached itAccepted
0048A policy's name is checked by a fingerprint stored beside itAccepted
0049A theme is three registered ids, carried in the treeAccepted
0050The runtime's props are namespaced, and the root primitive mounts the themeAccepted
0051A slot is a region the primitive places, not content inline in its childrenAccepted
0052A repeated item is a node; a fixed field is a propAccepted
0053A URL in the tree is checked against a scheme allowlistAccepted
0054A container is its child's name plus the arrangement it puts them inAccepted — partially superseded by 0061
0055Motion is a static stylesheet the primitive emits, never a prop in the treeAccepted
0056The demo is public, and shares nothing with the portal but the deploymentAccepted
0057A demonstrated change is a deterministic interpreter, not a script beside the runtimeAccepted
0058A binding is a question the tree asks, answered before the walkAccepted
0059A leaf whose whole content is one string takes it as a childAccepted
0060A primitive owns a string, and a deployment may replace itAccepted — partially superseded by 0063
0061A suffix that names the markup earns its place; a suffix that names the parent does notAccepted — partially supersedes 0054
0062A general arranger is named for the arrangement alone, and a named band wins where one existsAccepted
0063A declared string travels with the primitive; a dictionary is what a host addsAccepted — partially supersedes 0060
0064A primitive says whether it is a target, and the Gate derives the nestingAccepted
0065A submission names a destination, and never carries oneAccepted
0066A card is the target when it is read; the control is the target when it is acted onAccepted
0067The four surfaces are one application, and a route group is a laneAccepted
0068A primitive is a target when the reader aims at the whole of itAccepted
0069A root-relative path is a destination a tree may nameProposed — ARCHITECTURAL, needs review. It contradicts a clause
0070The portal is a segment, and the marketing site is the front doorAccepted
0071Moving a form's destination is a stake of its ownAccepted
0072A page paints its ink and its canvas together, or neitherAccepted
0073A form with nowhere to post renders disabled, and says soAccepted
0074A palette slot that carries text meets AA, and the palette moves rather than the barAccepted
0075A primitive is audited under every shape its schema closes overAccepted
0076Loom offers a host the contrast bar and does not impose itAccepted
0077A palette is derived once and committed as literalsAccepted
0078The front door speaks the visitor's language, and a test holds it thereAccepted
0079A layout only CSS can express belongs in the stylesheet, width query and allAccepted
0080A doc comment in src/ is written to a strangerAccepted
0081The front door demonstrates statelessly, and the address is the whole of the stateAccepted
0082A refusal says what became of the repairAccepted
0083A scoped request sends the scope, not the page it sits onAccepted
0084In a two-dimensional band, rows are nodes and columns are positionsAccepted
0085A font pack declares a face when something reads itAccepted
0086A behaviour is a control the runtime builds and a primitive placesAccepted
0087A primitive that posts declares it, and the audit checks the declaration against what it rendersAccepted
0088A hold is a row, and taking it is one statementAccepted
0089The text ramp is held to four grounds, and a pairing is measured whether one primitive paints it or two compose itAccepted
0090A probe that declines says whether it got as far as calling the componentAccepted
0091Motion stops in edit mode, and that is where a decorative duplicate belongsAccepted
0092A disclosure control owns its button and the primitive owns the regionAccepted
0093A decorative copy is the same children without identityAccepted
0094A card's prose is a child when the card has a flow, and a prop when it does notAccepted
0095A frame carries its URL, and the deployment carries the originsAccepted
0096A behaviour publishes a value on the element the primitive placed it inAccepted
0097A hole in the decision numbering is reported, and a clash is fatalAccepted
0098An anchor is a reserved key the runtime checks and a primitive placesAccepted
0099A record is amended in place when only the count movedAccepted
0100A same-origin path is not a schemeProposed — ARCHITECTURAL, needs review. It contradicts a clause
0101The loom. namespace is the framework's, and the CLI will not write in itAccepted
0102A same-origin path is decided by resolving it, not by matching itProposed — ARCHITECTURAL, needs review. It shares
0103A control carries a class, and its display is a custom propertyAccepted
0104The runtime publishes its fixtures and its contract suitesAccepted
0105A render can hand back values instead of referencesAccepted
0106A band asks its own container for a width, not the windowProposed — ARCHITECTURAL, needs review. It reverses a named
0107A font pack may say where a face is, and the runtime never fetches itAccepted
0108A repair restates the request, and the runtime measures it rather than making it cheaperAccepted
0109An inverse in hand is proposable without a store, and the runtime never puts its own name on one it did not planSuperseded by 0137
0110An entrance the reader drives is a wrapper primitive, not a prop on every bandAccepted
0111The revision an undo puts back is a field on provenance, because provenance is the part of a proposal a log keepsAccepted
0112A hold store lists what the handle can see, and its cursor is two columns because an instant is not a keyAccepted
0113The pairings probe reports where it stops looking, rather than inventing a priceAccepted
0114A primitive declares what part it plays, and the registry is what gets askedAccepted
0115Three fields of one shape are a list wearing three namesProposed — ARCHITECTURAL — needs review
0116A screenshot is taken by the repository, and Playwright is never a dependencyAccepted
0117One harness, two subjects: a tree it renders and an address you serveAccepted — partially superseded by 0191
0118A citation is a claim, and only a link can be checkedAccepted
0119The page a reader gets is the one pnpm verify reads lastAccepted
0120A starting composition is a subtree a catalogue hands to the ordinary seamAccepted
0121Part of a tree is rendered by the seam, and the seam is what mounts the themeAccepted
0122A primitive says which of its props a reader reads, and empty is not silenceAccepted
0125A geometric property is asserted over the page, not the primitiveAccepted
0130Atmosphere is a wrapper primitive, and the paints are one shared vocabularyAccepted
0131What a palette cannot say about itself is measured from it, never declared on itAccepted
0132A type that mirrors a schema is derived from itAccepted
0135A same-origin frame is granted what its own document needsAccepted — it changes no schema, no tree and no delta model, and
0136A published page broadcasts reader signals when its host asksAccepted
0137An undo already computed is assembled by the runtime, and stamped by its callerAccepted — supersedes 0109
0138A queue can be told which of its holds are already dead, and a head it could not read is a third answer rather than an optimistic oneAccepted
0139A shared ledger is union-merged, and a generated file is regeneratedAccepted
0140A call into foreign code has a ceiling, and the runtime owns itAccepted
0145A light that marks one of several is a wrapper, and it is carried by distance rather than by colourAccepted
0146A reader signal stays anonymous, and a funnel is correlated inside one page viewAccepted
0147A rollup is added to what is stored, and a distinct-view count is therefore approximateAccepted
0150A container that must aggregate over its children publishes a custom property, and the browser does the arithmeticAccepted
0155A container may only add to its children what they left unspoken, so a shared treatment lives in a class and never on the elementAccepted
0156The two states a bound region is in are primitives, and not props on every containerAccepted
0157The catalogue's public surface is the list and the lookup, not every band by nameAccepted
0158Counting a window of reader signals and forgetting it are one operationAccepted
0159An instrument may reach a state, and may never assert oneAccepted
0160Where a rendering depends on a fact about the content that no rule can observe, the tree declares the fact and never the layoutAccepted
0161A public page writes to one application endpoint, and is counted by a key that outlives nothingAccepted
0162The catalogue is a phrasebook of designs, and the page is one derived path through itAccepted
0163A binding is weighed like a destination, and its params are half of itAccepted
0164A resolution that cannot answer is not a node that did not askAccepted
0165An anchor belongs to the part, and uniqueness is asserted over the assembled pageAccepted
0166A list that ranks is checked where it is written, and a level the scale cannot place is the heaviest oneAccepted for the first half (the completeness check), **Proposed for
0167A delegated signal names the regions it happened inside, and a region is counted in views rather than in pressesAccepted
0168A band links into the page it is assembled into, and the page is where that is checkedAccepted
0169A declaration is what makes a value a missing wordAccepted
0170A library is a set to choose from, and a vocabulary is priced per entryAccepted
0171A page part is earned by the region it occupies, not by the content it holdsAccepted
0172What a deployment can offer a model is one value, and three more vocabularies go in itAccepted
0173A change may not add a node the deployment cannot drawAccepted
0174A band wears the treatment its own content earns, and adds to its ground rather than replacing itAccepted
0175A listing skips the row it cannot read and fails the one it cannot place, and a store that did not answer is a different word from a row that did not parseAccepted
0176A control may be answerable to another control, and the two agree through the DOM rather than through the seamAccepted
0177The specification is a page part, and it sits between the figure that persuades and the priceAccepted
0178A ground is not always an ancestor, and bg-overlay is the fifth ground the text ramp is held toAccepted
0179What a primitive accepts is a vocabulary the write path is handed, not a field on a policyAccepted
0180A primitive that draws an answer declares the shape it can draw, and a row that came from a database is never a nodeAccepted
0181A primitive declares the binding names it reads, and saying nothing is not saying noneAccepted
0182A shot may reach a state it does not photograph, and may name the document it reaches intoAccepted
0183A page for another kind of business is the same sequence with different nodes in itAccepted
0184A primitive may read under whichever name a prop gives, and says so as a declaration rather than a nameAccepted
0185A probe is handed answers the way it is handed props, and a specimen declares the reply rather than the sourceAccepted
0186A what's-on band occupies the come-back region, so it is a design of articles and not a twenty-third partAccepted
0187A frame with no picture in it does not take the picture's shapeAccepted
0188A specimen may ask to be hydrated, and one function builds the page for both rendersAccepted
0189A portrait with no photograph is the person's initials, and a portrait with nobody named is nothingAccepted
0190A route group may contribute a sitemap and may not contribute a robots.txtAccepted
0191The harness may start the application, because there is now only oneAccepted — partially supersedes 0117
0192A region a primitive places is a region it may groundAccepted
0193A status line is data: its opener is a closed set, and a supersession is written at both endsAccepted
0194The framework is the package, and everything that uses it ships separatelyAccepted
0195A shot may say what the browser started with, and it says it as dataAccepted
0196A paint is sized by the box it is given, and says so when it cannot beAccepted
0197A host may ask which way round a palette is, and a frame standing in for the page is handed both endsAccepted
0198A refusal records which rules it broke, and the rules' names are a closed vocabularyAccepted
0199The outline may render what it addresses, and a hand may yet move a nodeProposed
0200The portal may place a lever beside the evidence, and a model may never pull oneProposed
0201A display line and a reading line are two measuresAccepted
0202The harness measures the content a clip hides, and it is not scrollWidthAccepted
0203A props vocabulary is handed the props a primitive is handedAccepted
0204A rule with no fill beside it is measured in ΔE, not in contrast ratioAccepted
0205A line the library declares is measured against every ground it is drawn onAccepted
0206A primitive declares what it could not show, and the runtime decides whether to say soAccepted
0207A primitive that arranges only glyphs inherits its alignmentAccepted
0208A question nothing reads is refused before it is writtenAccepted
0209What an adapter owes the runtime is a suite, not a sentenceAccepted
0210A primitive may lock the page's scroll from the stylesheet, and only while its own region is openAccepted
0211A completion is a form the browser let go, and it carries the bands it was the end ofAccepted
0212What a reader signal means is joined to the tree when it is read, and the tree is what makes silence a measurementAccepted
0213The harness reads a box, it prints the number, and the judgement stays in the reportAccepted
0214Where readers are is a floored bucket counted at the door, and a page view says when it beganAccepted
0215A stake rule either reads a policy or is fixed at its code, and only the first kind can be asked againAccepted
0216A published double derives whatever the runtime derivesAccepted
0217Choosing a two-region primitive is itself an insert decisionAccepted
0218What a counter means is published, and the browser pays for the number and not its nameAccepted
0219A page view is counted once at the door, and the over-count in the node counters is a measurementAccepted
0220An app is a registry, a policy and a store — and Loom has one of eachProposed
0221Where reading stops is a fall between two siblings, and a ratio of two counts off one row setAccepted
0222A structured reason travels with the judgment, and the prose is for readers onlyAccepted
0223A prop is copy when a reader could quote it, and a glyph is not a quoteAccepted
0224A before-and-after reading compares two shares, and a pair the change dissolved is an answerAccepted
0225A judgment is joined to a revision by a bounded lookup, and the lookup says what it did not reachAccepted
0226A primitive declares where its control rests, and the control publishes nothing until the reader moves itAccepted
0227An inline link is its own primitive, and its colour is the paragraph'sAccepted
0228The tree as it was is a fold bounded at both ends, and the head is answered from the logAccepted
0229A share of readers is estimated against the appearances and bounded against the openingsAccepted
0230A part was read when readers had time for its words, and only the skim is a safe claimAccepted
0231A funnel is three shares of the arrivals, and the straddle is the one error here that leans downAccepted
0232The shell mounts a theme and registers no primitivesAccepted
0233A bound twin is earned by a system of record and a row shape the primitive can declareAccepted
0234A primitive may name a control from the tree, and its declared string is the floorAccepted
0235How much of a page gets read is a share of words that partition it, and the typical reader's figure is a ceilingAccepted