RFCs are durable decision records for changes that are costly to reverse or
wide enough that implementation review alone cannot establish the right shape.
All formal RFCs live in this directory and use one lifecycle, one metadata
schema, and one number namespace. track records where a proposal came from;
it does not change the review or acceptance rules.
The architectural invariants remain the hard boundary for every change. An RFC explains why a particular design is worth its long-term liability and records the evidence behind the decision; it cannot waive the invariants or deny-list.
Write an RFC before implementing:
- a new query, schema, CLI, HTTP, or SDK contract;
- an on-disk format, wire format, recovery protocol, or compatibility change;
- a new storage substrate or dependency that constrains future architecture;
- a cross-cutting correctness, authorization, or operational boundary; or
- an exception to a deny-list item or another hard-to-reverse choice.
Routine bug fixes, narrow refactors, dependency maintenance, and documentation corrections normally do not need an RFC. If the code can land safely and be reverted cheaply without committing the project to a lasting contract, an issue and implementation PR are usually enough.
- Filename:
NNNN-kebab-title.md. - Heading:
# RFC NNNN: Title. - Reference labels use
RFC NNNNand point to the canonical RFC filename. 0000-template.mdis reserved and is not an RFC.- Allocate the number only when adding the RFC file. Numbers are never reused or backfilled, including numbers from rejected, superseded, abandoned, or out-of-tree drafts.
- Do not create
pre-merge,final,v2,internal, or review-ledger copies. Revise the canonical file; preserve meaningful changes in its decision log.
The next available number is 0066; lower gaps are historical and must
not be reused (0047 and 0048 are allocated by PR #606; 0050 by the
rfc/0050-engine-crate-topology branch; 0056 by PR #670; 0058 by
PR #662 for retained merged ancestry; 0059 by PR #675; 0060 by PR #677).
Every RFC uses exactly this schema:
---
rfc: "0042"
title: "Short descriptive title"
track: maintainer
status: draft
implementation: not-started
authors:
- Name or handle
created: 2026-08-23
updated: 2026-08-23
discussion: null
supersedes: []
superseded_by: []
blocked_on: []
---Field rules:
rfcis the four-digit string from the filename and heading.titlematches the heading text.trackispublicormaintainer; both follow the same lifecycle.statusis one ofdraft,accepted,rejected, orsuperseded.implementationis one ofnot-started,in-progress,partial,complete,removed, orn/a.authorsis a non-empty list.createdandupdateduseYYYY-MM-DD.discussionis a durable issue/PR URL ornull.supersedesandsuperseded_bycontain four-digit RFC strings. Update both sides when the relationship applies to the whole decision.blocked_oncontains concrete evidence or dependency gates. Research being blocked is not a lifecycle status; it is a draft with a non-empty list.
Frontmatter is the only status and date authority. Do not repeat it in a table
or a hand-written Status, Date, Author track, or Implementation field.
The body may contain a dated disposition or implementation note when it adds
context rather than restating metadata.
draft ──maintainer decision──▶ accepted ──later replacement──▶ superseded
│ │
└──maintainer decision──▶ rejected └──implementation progresses separately
- Draft: under design and review. A draft may live on the main branch so review and evidence have one durable home, but merge alone does not accept it. Product behavior must not claim authority from a draft.
- Accepted: maintainers approved the decision and its stated boundaries. Implementation status moves independently as work lands.
- Rejected: the decision was not adopted. Keep the record and concise
rationale; use
removedif an experiment shipped and was later deleted, otherwisen/aornot-startedas appropriate. - Superseded: another RFC owns the current decision. Link both directions and keep the old rationale intact.
Acceptance requires all invariants, compatibility consequences, operational boundaries, and owned evidence gates to be explicit. A blocker owned by another RFC does not block an independently reviewable decision, but hidden shared dependencies do.
- Copy the template to the next available number.
- Set every frontmatter field and open a PR in
draftstatus. - Review the problem, user/operational behavior, invariants, substrate alignment, compatibility, evidence, alternatives, and rollout.
- Record material review outcomes in the RFC's decision log. Do not maintain a separate review ledger. A post-merge amendment rewrites the body sentences it changes and its Decision-log entry names each sentence it supersedes, so the body alone stays current.
- A maintainer decision changes the lifecycle to
acceptedorrejected. - Implementation PRs link the accepted RFC and update
implementationplus any durable evidence or support boundary in the canonical file. - A later incompatible decision gets a new RFC and supersedes the old one.
For Lance-dependent work, follow the Lance reading protocol and record the exact upstream version and surfaces reviewed. For test planning, extend existing owners according to the test map.
This table is the human index for the canonical RFC corpus.
| RFC | Decision | Track | Status | Implementation |
|---|---|---|---|---|
| 0001 | Branch merge by fragment adoption | maintainer | draft | not-started |
| 0002 | Config and CLI architecture | maintainer | superseded | partial |
| 0003 | MCP server surface | maintainer | draft | not-started |
| 0004 | Cluster graph and schema apply | maintainer | accepted | complete |
| 0005 | Server boot from cluster state | maintainer | accepted | partial |
| 0006 | Object-storage cluster roots | maintainer | accepted | complete |
| 0007 | Per-operator configuration | maintainer | accepted | complete |
| 0008 | Retire omnigraph.yaml |
maintainer | accepted | complete |
| 0009 | Unified embedded and remote access paths | maintainer | accepted | complete |
| 0010 | Explicit CLI planes | maintainer | superseded | partial |
| 0011 | CLI addressing and configuration | maintainer | accepted | complete |
| 0012 | Provider-independent embedding configuration | maintainer | accepted | complete |
| 0013 | Write-path latency and bounded history cost | maintainer | superseded | partial |
| 0015 | Ingest-time @embed reconciliation |
maintainer | draft | not-started |
| 0018 | Streaming-ingest WAL on Lance MemWAL | maintainer | rejected | removed |
| 0019 | Heads and fences | maintainer | superseded | partial |
| 0022 | Unified graph-write protocol | maintainer | accepted | complete |
| 0023 | Substrate-native key-conflict fencing | maintainer | accepted | complete |
| 0024 | Durable table heads | maintainer | draft | not-started |
| 0025 | Checkpoint-pinned retention | maintainer | draft | not-started |
| 0026 | MemWAL streaming ingest | maintainer | rejected | removed |
| 0027 | Lineage-based merge deltas | maintainer | draft | not-started |
| 0028 | Stable schema identity and table incarnation | maintainer | accepted | complete |
| 0029 | Native Azure Blob storage | public | accepted | in-progress |
| 0030 | Graph change feed and retained-history contract | maintainer | accepted | partial |
| 0031 | Comparative cost harness | maintainer | draft | not-started |
| 0032 | Adversarial correctness harness | maintainer | draft | not-started |
| 0033 | Blob management | maintainer | accepted | partial |
| 0034 | Durable recovery authority and outcomes | maintainer | draft | not-started |
| 0035 | Served operation ownership | maintainer | draft | not-started |
| 0036 | Atomic runtime activation and graph availability supervision | maintainer | draft | not-started |
| 0037 | Deterministic simulation harness | public | accepted | in-progress |
| 0038 | Typed storage failures | public | accepted | complete |
| 0039 | The end-to-end benchmark | public | accepted | in-progress |
| 0040 | System column namespace | public | accepted | in-progress |
| 0041 | Inline and stored queries | maintainer | accepted | partial |
| 0042 | Incarnation-suffixed native branch refs | maintainer | accepted | complete |
| 0043 | Full-text index compatibility and explicit rebuild | maintainer | accepted | complete |
| 0044 | Edge keys: derived edge identity | maintainer | draft | in-progress |
| 0045 | GQ logic tests | maintainer | draft | partial |
| 0046 | Read-only index status | maintainer | draft | not-started |
| 0049 | Control-plane seams: observe, readiness witness, bounded shutdown | maintainer | accepted | partial |
| 0051 | JSON output via Arrow | maintainer | draft | partial |
| 0052 | Managed control-plane CLI | maintainer | accepted | complete |
| 0053 | Offline data-token verification | maintainer | accepted | complete |
| 0054 | Default graph actor provenance | maintainer | rejected | removed |
| 0055 | Branch statements in GQ | maintainer | draft | in-progress |
| 0057 | Accepted-context reuse and bounded merge preparation | maintainer | accepted | in-progress |
| 0058 | Retained merged ancestry | maintainer | draft | not-started |
| 0061 | Managed cluster lifecycle and config preparation | maintainer | accepted | complete |
| 0062 | Manifest version as the table registration clock | maintainer | draft | in-progress |
| 0063 | Self-contained branch lineage | maintainer | draft | in-progress |
| 0064 | Explicit storage upgrades | maintainer | accepted | in-progress |
| 0065 | Isolated branch merge publication | maintainer | draft | not-started |