Why it is shaped this way
Decisions
Choices made among real alternatives, with the evidence that decided them and the condition that would reopen them.
These are not principles: a principle must not rot, a decision may be superseded, and says so in its status line. Each record has the same shape: a status line, then Context, Decision, Evidence, Not chosen. The list is read from the directory, so a new record is a new page.
- A build integration holds no logic of its ownStatus: accepted, 2026-10-07. Answers #40 and revises the stance taken on #8, that a Bazel rule stays an example over the command. Serves The compiler decides and What earns a concept. Reopen when a build system cannot declare an output from what it shows a rule and no flag on the command can tell it.
- A failure says its kindStatus: accepted, 2026-10-05. Serves Honest data, Relay's words and What earns a concept. Reopen if an app shows a failure that fits none of the four kinds, or if a server's convention needs a kind the transport's case cannot carry.
- A format is per emitterStatus: accepted, 2026-10-07; amended 2026-10-08, the number before a first release. Serves The compiler decides. Built as decided: nothing moves. Reopen if the plan IR is ever written out and read as data by something other than the compiler.
- A fragment has one reading: a lens, or an `@inline` valueStatus: accepted, 2026-10-04. Serves A fragment is a lens, Relay's words and What earns a concept. Reopen if a real screen needs both readings of one fragment and cannot spread an inline fragment beside its own, or if adopters' views start taking inline values. Sharpened 2026-10-06, before the build, with the rules it gained: what an inline fragment contains and that its spread takes Relay's directives but @catch, the Hashable value under @catch, operation roots, a value held by a view, and where a read of the value registers. The decision is unchanged. Built 2026-10-06, on the owner's call, ahead of the trigger it was to wait for; the Decision reads as built.
- A handle keeps its fetch and derives its phaseStatus: accepted, 2026-10-05. Serves The store is the UI's state and Honest data. Reopen if the bench named under Evidence fails its limits (then the fetch's value ships alone and the phase stays stored), or if a reader outside a body needs the phase pushed to it rather than computed when it asks. Superseded on the derived phase, by its own reopening line, by The phase stays stored, beside the fetch; the fetch as a value is built as decided (61c3ac4). The policy and the revalidation it left open are answered by Revalidation is one call the app makes. Its derived phase is restored on 2026-10-07 by another route, the verdict settled at the commit and kept on the root, by The verdict is the root's, and the phase is derived from it.
- A list's null elements are typed as the schema saysStatus: accepted, 2026-10-08. Serves Honest data and The compiler decides. Reopen if an adopter shows a schema whose nullable list elements are never null in practice and whose accessors a T? makes unusable, which would argue for a directive on the field rather than a change to the default.
- A mapped scalar converts at the readStatus: accepted, 2026-10-11. Builds on A mapped scalar is a fallible read, which settled the typing and left the mechanism open. Serves Honest data and Relay's words. Reopen if the read bench shows the conversion dominating a body's read, which would move the detection to the ingest as a field error stored beside the field; or if an adopter needs a format the shipped conformances do not read.
- A mapped scalar is a fallible readStatus: accepted, 2026-10-04. Serves Honest data and Relay's words. Reopen if a mapping whose conversion cannot fail has to keep the schema's nullability, or if a product shows documents where an annotation on every mapped field costs more than it protects.
- A mapped scalar's host type is named per languageStatus: accepted, 2026-10-07; amended 2026-10-07, the Kotlin entry's shape. Serves The compiler decides and Two runtimes, one compiler. Built 2026-10-07. Reopen if Relay's customScalarTypes takes a shape of its own for more than one language.
- A payload is bytes in a response's shapeStatus: accepted, 2026-10-07. Serves The response is the oracle and Relay's words. Built 2026-10-07. Reopen if a caller of the door needs to hand it something that is not in a response's shape.
- A plan declares each of its selections onceStatus: accepted, 2026-10-06; supersedes the line of The emitter writes typed pieces that left the plan's printer laying out one expression. Serves The compiler decides. Answers issue 34. Reopen when one distinct selection is large enough to strain the type checker alone, or when resident plans across operations are measured to matter.
- A storage key leaves a null argument outStatus: accepted, 2026-10-08. Serves Relay's words and The response is the oracle. Reopen if a server distinguishes an argument passed as null from one not passed, in a way a cache key must keep apart; GraphQL's coercion makes the two the same for a nullable argument without a default, and Relay's key treats them so.
- An enum reads as a generated enum with an unknown caseStatus: accepted, 2026-10-11. Completes the proposal recorded with A mapped scalar is a fallible read, which placed enums at the same boundary as custom scalars. Serves Honest data and Relay's words. Reopen if an adopter needs the enum's cases spelled otherwise than the schema spells its values, or a schema's enums outnumber what one shared file should declare.
- An image belongs to one storeStatus: accepted, 2026-10-04; supersedes the README's sign-out, one image removed and handed from environment to environment, which stands until the end it rests on is built. Serves What earns a concept. Reopen if two stores have to share an image at once: a second process, as The image is the system's SQLite names, or two environments of one account.
- An operation is sent as its text or its id, and the build decidesStatus: accepted, 2026-10-04. Serves The compiler decides and Relay's words. Reopen the default wire shape if the GraphQL-over-HTTP specification settles persisted documents otherwise than its open proposal does. Reopen pinned documents for a server whose registry cannot take new documents.
- An operation states its expiration in its documentStatus: accepted, 2026-10-04. Serves The compiler decides, Honest data and Relay's words. Reopen if Relay or the GraphQL specification gains a word for it, which then replaces ours; or if a real screen has to tolerate older data than another reader of the same operation.
- Client data is described by the schema and written by a payloadStatus: accepted, 2026-10-04; supersedes the planning log's "no client schema extensions in v1", and leaves its "no resolvers" standing. Serves What earns a concept, Relay's words and The store is the UI's state. Reopen if a real write cannot be said as a payload for an operation, or if adopters' stores fill with state no fragment of a view reads.
- Connections reference page edges and own inserted onesStatus: accepted, 2026-10-03. Serves The store is the UI's state and Relay's words. Reopen if a server pages a connection under a storage key that does not change with the cursor, or if persistence needs edge records that survive their page's record.
- A deletion is announced by its commit, not tracked by readersStatus: accepted, 2026-10-03. Serves The store is the UI's state. Reopen if the commit-side pass, once measured, costs more than a frame at a store size the project supports, or if deletions stop being rare (bulk deletes delivered as a stream).
- Derived state is observed, not signaledStatus: accepted, 2026-10-11. Answers Caton's notes 2, B and K, which asked twice for a commit signal a model could observe, and the plan's D-N18. Serves What earns a concept and The store is the UI's state. Reopen if a model is shown that must know a commit happened and cannot say what it reads.
- Relay's error directives in Swift's termsStatus: accepted, 2026-10-03. Serves Honest data and Relay's words. Reopen if a product needs a throwing read on fields that carry no directive, or if Swift gains typed throws broad enough to carry the field's error type through accessors.
- Identity is the fields the configuration namesStatus: accepted, 2026-10-10. Answers the reopening line of Lookups satisfy root fields from cached entities, an entity resolved by more than one argument. Serves The compiler decides and The store is the UI's state. Reopen when a schema shows an entity with no scalar key of its own, whose key is a field through a link; the remedy is to widen the configuration to a path, not to add a runtime hook.
- Floors at Android 6, Java 21 and the current KotlinStatus: accepted, 2026-10-09. Serves Two runtimes, one compiler, beside Floors at the 26 releases, the Swift runtime's. Reopen when an adopter needs an older Android, JVM or Kotlin, when a target beyond the JVM and Android is built, or at the 1.0 review.
- A lookup binds in the availability check, never in a readStatus: accepted, 2026-10-03; supersedes Lookups satisfy root fields from cached entities. Serves The store is the UI's state. Reopen if a lens must render a root field that no availability check has walked, such as a lens built over the root by hand outside an operation.
- Lookups satisfy root fields from cached entitiesStatus: superseded, 2026-10-03, by A lookup binds in the availability check, never in a read; accepted, 2026-10-02. Serves The store is the UI's state and Relay's words. Reopen when a schema needs an entity resolved by more than one argument, or by a field below the root; the remedy is to widen the configuration, not to add a runtime hook.
- Marker macros carry the GraphQLStatus: accepted, 2026-10-02. Serves A fragment is a lens. Reopen when Swift offers a way to attach a literal to a property without a macro, or when the macro trust prompt proves prohibitive for adopters; .graphql files remain the macro-free path either way.
- Native runtimes, not a shared coreStatus: accepted, 2026-10-02; the ingest budget's first device number, 2026-10-07. Serves Two runtimes, one compiler. Reopen when the Kotlin tokenizer cannot meet the ingest budget on the JVM; the contained remedy is a Rust ingest library for Android only, producing a flat change-set buffer that the Kotlin store applies, with iOS unchanged.
- One runtime module, with edges as targets and a checked rule insideStatus: accepted, 2026-10-04. Serves The store is the UI's state. Reopen for a platform without SwiftUI, for a Kotlin runtime whose split between core and interface is worth mirroring, or when optimisation across the targets of one package is something a published library can rely on and a bench shows what it recovers.
- An operation's text is printed compactStatus: accepted, 2026-10-06. Answers #36. Serves The compiler decides and Relay's words. Reopen if a conforming server refuses compact text, which would be the server's defect, or if the one-line text costs a reader more than it saves on the wire; the remedy is then a formatted companion where people read, never a change to what is sent.
- Floors at the 26 releasesStatus: accepted, 2026-10-02. Serves The store is the UI's state. Reopen when an adopter needs an older release, or at the 1.0 review.
- Relay's front end, pinned, behind our driverStatus: accepted, 2026-10-02. Serves The compiler decides and Relay's words. Reopen when the pinned revision cannot be advanced for a feature we need, or stops building on stable Rust; the remedies, in order, are vendoring the crates and writing our own front end behind the same plan IR. Apollo's compiler is not a remedy.
- Relay's store tests are measured against, not obeyedStatus: accepted, 2026-10-09. Serves The response is the oracle and Relay's words. Reopen if the statuses stop being reviewed, so that a known issue becomes a place where behaviour is parked rather than decided.
- Releases are frequent and named for breadStatus: accepted, 2026-10-07. Reopen if adopters ask for fewer releases than master's pace gives them, or if the list below runs out and no bread is left that the rule admits.
- Revalidation is one call the app makes, and the policy stays with its holderStatus: accepted, 2026-10-05. Answers #18, and two points A handle keeps its fetch and derives its phase left open: whether a handle keeps the policy it was attached with, and the revalidation method. Serves The store is the UI's state and What earns a concept. Reopen a reachability input or a pacing setting when a stampede is measured that revalidate() and the sharing of a fetch in flight do not prevent.
- Keys a session produces belong to its storeStatus: accepted, 2026-10-04; the mechanism, left open here, was chosen on 2026-10-07 in The store numbers what its session renders. Serves The store is the UI's state and The compiler decides. Reopen if the spike finds no rule that keeps one slot for a key's text at today's cost of a read and a commit.
- Slots are numbered by the process, not by the compilerStatus: accepted, 2026-10-03; superseded on 2026-10-07 for the keys a session renders from variables, which the store numbers; the build's keys stay as decided here. Serves The compiler decides and Two runtimes, one compiler. Reopen if a build step sees every module of an app and the exact schema each was compiled against, or if a measurement shows the numbering on a path a view or a commit takes more than once.
- A subscription reconnects in its handle, by a fixed backoffStatus: accepted, 2026-10-11; amended 2026-10-07, an environment failure ends the stream as a request error does. Answers #12's reconnection, parking and gap handling. Serves The store is the UI's state and What earns a concept. Reopen the constants when a server is shown for which they are wrong; reopen the single-connection mode of graphql-sse for a gateway that cannot do HTTP/2.
- swift-syntax spans the floor to the newest releaseStatus: accepted, 2026-10-07. Answers #39. Serves Floors at the 26 releases. Reopen when a swift-syntax release breaks the macros in a way one source cannot serve on both ends of the range, or when the floor moves.
- The availability check and collection run on the main actorStatus: accepted, 2026-10-03; supersedes the planning log's concurrency posture where it put collection's mark and the availability checks of preloads off the main actor. Serves The store is the UI's state. Reopen if, on an iPhone 12-class device, a collection pass over the lifetime bench's 9,000 records, or hydration of the fixture's 898 rows, takes longer than a frame (16.7 ms), or if the two together miss a frame on a screen the bench suite models. No iPhone 12-class device was at hand on 2026-10-05, when the plan's ground step asked for the number; the line stands until one is.
- The decided architecture is built first, one release a stepStatus: accepted, 2026-10-05. Serves What earns a concept. Reopen if an adopter is blocked by something this order puts late and no step before it unblocks, or if a step's gate fails and the next cannot move up.
- The emitter writes Swift from typed pieces, not stringsStatus: accepted, 2026-10-04; superseded on 2026-10-06 on the plan's printer, which declares each of its selections once, and on 2026-10-07 on the names decide allocates, which now come from a naming the target supplies (Naming, with SwiftNaming behind it) and host files from a table of languages, so the Kotlin emitter the reopening line waits for has its seams; the rest stands as decided here. Serves The compiler decides and Two runtimes, one compiler. Reopen when the Kotlin emitter starts, to weigh a quasi-quoter with back ends for both languages against a second writer of our own; or when a hazard arrives that the pieces below do not hold.
- The environment is the sessionStatus: accepted, 2026-10-04. Serves What earns a concept and Honest data. Reopen if an adopter shows an app that cannot replace the environment at its root, or data that has to outlive a change of identity.
- The environment logs value-free eventsStatus: accepted, 2026-10-11. Answers #15's event sink and the plan's D-N17. Serves Honest data and What earns a concept. Reopen a case when an adopter shows the number it needs and cannot derive; reopen the value-free rule never.
- The image evicts by launch before it starts overStatus: accepted, 2026-10-11. Answers #16's eviction and the plan's D-N19. Serves The store is the UI's state. Reopen the granularity when an app shows an image whose one launch's rows outgrow the limit and must keep part of them; reopen a rule per type never.
- The image is the system's SQLiteStatus: accepted, 2026-10-03. Serves The store is the UI's state and Two runtimes, one compiler. Reopen if a measurement on a phone shows the engine, not the records, keeping a cached screen out of its first frame; or if a second process (an extension, a widget) has to share the image. No iPhone 12-class device was at hand on 2026-10-05, when the plan's ground step asked for the number; the line stands until one is.
- The image's file is protected at creation and waited for when lockedStatus: accepted, 2026-10-06. Serves Honest data and What earns a concept. Answers what An image belongs to one store left to the image: whether the delete gets a marker. Reopen if a platform offers a protection class SQLite's open cannot give the log, or if an app shows work waiting for a locked file longer than its store holds.
- The Kotlin host marks a document on the composableStatus: accepted, 2026-10-08. Serves Two runtimes, one compiler and answers #6. Built: the .kt scanner in compiler/src/kotlin.rs. Reopen if Kotlin gains a string form without templates, or if Compose gains a place beside a parameter that is not a parameter list.
- The Kotlin runtime is common first, and a platform is an actualStatus: accepted, 2026-10-07; amended 2026-10-07, the first actual, and the primitives a target supplies; amended 2026-10-07, the platform's SQLite reached through the AndroidX SQLite driver API; the Android actual built, 2026-10-07. Serves Two runtimes, one compiler. Answers #24 and shapes #6. Reopen when a target's actual cannot meet the ingest budget Native runtimes, not a shared core names, or when common code needs a platform API the standard library lacks.
- The phase stays stored, beside the fetchStatus: accepted, 2026-10-05. Supersedes the derived phase of A handle keeps its fetch and derives its phase, by that record's own reopening line: its bench failed. Serves The store is the UI's state. Reopen if the verdict is made to cost less than a walk of every record the operation's own selection reaches, under the 50 µs a read that record set. Superseded in part on 2026-10-07 by The verdict is the root's, and the phase is derived from it, on the stored phase and the chain that settles it; the fetch as a value stands.
- The report holds each lensStatus: accepted, 2026-10-09. Extends The report is what a dependent target's compilation would read. Serves The compiler decides. Reopen if a consumer needs the lens's checks (satisfied, fieldErrors) or its connection surface spelled out too, or if the lenses make the report too large to review as a diff.
- The report is what a dependent target's compilation would readStatus: accepted, 2026-10-11; extended by The report holds each lens. Answers #17's compile report and the manifest side of #7, and settles the shape of the report before fragments across modules need it. Serves What earns a concept and The compiler decides. Reopen the import when an adopter spreads fragments across modules, which the record expects on a Bazel build with hundreds of fragments.
- The store numbers what its session rendersStatus: accepted, 2026-10-07. Chooses the mechanism Keys a session produces belong to its store left open, and supersedes Slots are numbered by the process for the keys a session renders; the build's keys stay the process's. Serves The store is the UI's state and What earns a concept. Reopen if an adopter shows two stores that must share a rendering's number, or if the bench shows a read through a key the store numbered or a commit of a lookup above the gates below.
- The store owns roots and agesStatus: accepted, 2026-10-04. Serves The store is the UI's state, Honest data and Relay's words. Reopen the collector's schedule, not its owner, if a pass misses a frame at a store size the project supports. Reopen the rule for an unknown age if a product shows screens that refetch on return, past the release buffer, more than it can afford.
- The verdict is the root's, and the phase is derived from itStatus: accepted, 2026-10-07. Serves The store is the UI's state and What earns a concept. Supersedes The phase stays stored, beside the fetch in part, on the stored phase and the chain that settles it; the fetch as a value stands. Restores the derived phase of A handle keeps its fetch and derives its phase by another route. Built 2026-10-07, behind the phase script of format 2 of spec/manifest.json and the gate below. Reopen if a measurement shows the walk at the batch's end costing more than the chain it replaced.
- What may reach the image is a property of types and root fieldsStatus: accepted, 2026-10-11. Answers #20. Serves The compiler decides and The store is the UI's state. Reopen if a product needs a field below the root kept off the image while its record stays on it, or a per-record switch; the remedy is to widen the configuration to such fields, never a runtime policy.
Baton