Decision records
An architecture decision record (ADR) captures one significant decision: the forces behind it, what was decided, what follows from it, and what else was considered. ADRs are binding in the same way as the design documents: if code and an accepted ADR disagree, the ADR wins until a new ADR supersedes it (AGENTS.md).
Index
| ADR | Title | Status | Date |
|---|---|---|---|
| 0001 | Rust on Workers | Accepted | 2026-10-09 |
| 0002 | Storage layout | Accepted | 2026-10-09 |
| 0003 | Addressing with catch-all and a directory | Accepted | 2026-10-09 |
| 0004 | Required idempotency | Accepted | 2026-10-09 |
| 0005 | State machines instead of Workflows | Accepted | 2026-10-09 |
| 0006 | Vectorize for semantic search | Accepted | 2026-10-09 |
| 0007 | Agentic search with verified citations | Accepted | 2026-10-09 |
| 0008 | Domains on any DNS host | Accepted | 2026-10-09 |
| 0009 | Local MCP protocol types | Accepted | 2026-10-09 |
When to write one
Write an ADR before merging a change that:
- changes a public contract: the REST API, webhook events, MCP tool names, or CLI commands (CONTRIBUTING.md);
- moves a
P1requirement out of v1.0 (PRD section 5) or takes a spike’s fallback (Design › Spikes); - adds a Cloudflare product, an external service, a new language or runtime, or a dependency that does I/O;
- changes how data is stored, where it lives (jurisdiction), or how it is deleted;
- reverses or narrows an accepted ADR.
Small, local choices belong in the design document that owns the area, not in an ADR.
Process
- Copy the template below to
NNNN-short-name.md, using the next free number. Numbers are never reused. - Open a pull request with the ADR at status
Proposed. Link it from the issue that prompted it. - When it is merged, set the status to
Acceptedand the date to the merge date, and add it to the index. Update every design document the decision changes in the same pull request. - An accepted ADR is not edited except to fix typos or add a
Superseded bylink. To change a decision, write a new ADR that supersedes it, and set the old one toSuperseded by NNNN.
Statuses: Proposed, Accepted, Rejected, Superseded by NNNN, Deprecated.
Template
# NNNN Title in sentence case
| | |
|---|---|
| Status | Proposed |
| Date | YYYY-MM-DD |
| Deciders | Pylota engineering |
| Related | PRD IDs, design documents, spikes, other ADRs |
## Context
The problem, the forces and constraints, and the facts the decision rests on. Facts about external
systems name their source and the date they were read, or the spike that settles them.
## Decision
What we will do, stated so that a reader can check the code against it. Use "must" for the binding
parts.
## Consequences
What becomes easier and what becomes harder. Risks, with their mitigations. Follow-up work.
## Alternatives considered
Each serious alternative, why it was attractive, and why it was not chosen.