Design proposals for libdb. An RFC is how a non-trivial change — a new access method, an on-disk/format change, a performance subsystem, a durability model — gets written down, reviewed, and accepted or rejected before large implementation effort, so the reasoning survives and the decision is explicit.
User-facing documentation lives in docs_src/ (published to
libdb.org). This directory is the opposite: internal design intent and the
record of what we decided and why.
NNNN-short-title.md— the RFC itself (4-digit zero-padded number).NNNN/— optional per-RFC working directory: prototypes, spikes, data, scratch code that validates the idea before it's wired into the engine.0000-template.md— copy this to start a new RFC.INDEX.md— the register: every RFC, its status, one line.
Each RFC carries a Status: in its header. The allowed states and the
transitions:
| Status | Meaning |
|---|---|
| Draft | Under active writing/discussion. Not yet decided. |
| Accepted | Reviewed and approved; implementation may proceed. The RFC is the spec. |
| Rejected | Reviewed and declined. Kept for the record (why we said no). |
| Superseded | Replaced by a later RFC (name it). |
| Implemented | Accepted and shipped; links to the code/PRs. |
Type: is Prospective (a future direction) or Normative (binds current
behavior/format).
- Open: copy
0000-template.mdto the next freeNNNN-title.md, fill Summary/Motivation/Design/Alternatives/Risks, setStatus: Draft, add a row toINDEX.md. Optionally startNNNN/with a prototype. - Review: the RFC is judged against libdb's north star — a change is
rejected outright if it breaks any of: embedded/no-server operation, ACID
guarantees, crash recovery, any access method, multi-process correctness, or
on-disk/log/region/ABI format stability, unless the RFC explicitly argues a
versioned, backward-compatible migration. Beyond that gate, review weighs:
correctness risk, performance evidence (measured, not asserted — cite the
test/benchmicrobenchmarks or a reproducible harness), maintenance cost, and scope. - Decide: the maintainer records the decision in the RFC — flip
Status:toAcceptedorRejectedwith a dated Decision section stating the rationale and any conditions. ARejectedRFC is never deleted; the "no" and its reasons are the value. - Implement: an
AcceptedRFC drives the work. When shipped, flip toImplementedand link the PRs/commits. Material deviations from an accepted RFC require an amendment (a dated note) or a superseding RFC.
Small, obvious, or purely-internal changes do not need an RFC — this is for decisions worth remembering.