Decisions
Decisions
One page per decision, in ADR (architecture decision record) format. A record captures a choice, the options that were considered and why one won, so that a later reader does not have to reconstruct them.
- Start from the template.
- Name files
NNNN-short-title.md. See Contributing to these docs. - Records are never deleted. A reversed decision gets a new record, and the old one is marked
Superseded by NNNN.
The records
Every architecture decision for Mesh has one record here, an ADR (architecture decision
record), in the format of the engineering:architecture skill: status, date, deciders,
context, decision, options considered, trade-off analysis, consequences, action items
(ADR-0032).
How to read the status:
- Accepted: decided. The record quotes the ruling and says who made it. Deciders are named by role: the
operator is the project owner (Saulo Vallory); the lead is the team lead who
coordinates the work, and the operator may overrule the lead; the roadmap author wrote
the roadmap and proposed parts of the design, and the lead or the operator may overrule. - Proposed: open. The record gives the options and a recommendation, and says who must
rule and what the decision blocks. - Superseded: reversed by a later record. Kept so that nobody proposes it again without
knowing it was tried and why it was dropped.
The roadmap (roadmap) says in which milestone each decision
is built; its section 8 maps every ruling to its ADR and milestone. The rulings themselves are
recorded in rulings of 2026-10-04.
Foundations
| ADR | Decision | Status | Deciders |
|---|---|---|---|
| 0001 | Three rings: core, adapters, extensions | Accepted | operator |
| 0002 | Resource files are .mx, read through MX as a static data tree |
Accepted | operator |
| 0043 | MX is core, not an adapter; no front-end adapter slot | Accepted | operator |
| 0003 | Generated code carries the behaviour; the run-time library stays thin | Accepted | operator |
| 0004 | Mesh is built regardless; measuring the agent benefit is not a gate | Accepted | operator |
| 0005 | The core’s interface is a function call; transports are optional adapters, none in v1 | Accepted | operator |
| 0006 | The first transport is a CLI | Superseded by 005 | lead |
| 0007 | The scope { actor, context } is a plain argument on every action call |
Accepted | lead |
| 0008 | Transports obtain the scope through an actor-resolver adapter | Superseded by 007 | lead |
| 0009 | Where tenancy lives: core or extension | Proposed | operator |
| 0019 | v1 is milestones M0 to M9; what comes after | Accepted | operator |
| 0033 | Core packages are split by when the code runs | Accepted | roadmap author |
Data and expressions
| ADR | Decision | Status | Deciders |
|---|---|---|---|
| 0010 | One expression tree, evaluated in memory and in SQL | Accepted | operator; roadmap author for how the forms are produced |
| 0011 | Translatable expressions run only as SQL | Superseded by 010 | roadmap author (never accepted) |
| 0012 | Expression semantics where SQL and JavaScript differ | Proposed | operator or lead |
| 0013 | Data-layer contract: a mandatory set plus declared capabilities | Accepted | operator |
| 0014 | SQL adapters are built on Drizzle and drizzle-kit | Accepted | operator’s position, lead’s choice of tool |
| 0015 | Mesh prints SQL and diffs schemas itself | Superseded by 014 | roadmap author (recommendation) |
| 0016 | In-memory data for tests is SQLite’s in-memory mode | Accepted | roadmap author |
| 0017 | Updates are atomic by default; changes and validations are classified | Accepted | operator, lead, roadmap author |
| 0018 | A valid but unimplemented tag is a build error | Accepted | roadmap author |
| 0044 | Folding record-reading validations into the atomic statement (after v1) | Proposed | lead and operator |
| 0045 | How has-one is kept to one row |
Proposed | operator |
Extensions, policies, workflows, vocabulary
| ADR | Decision | Status | Deciders |
|---|---|---|---|
| 0020 | Extensions contribute to each other only through declared points | Accepted | operator |
| 0021 | Mesh generates one self-contained MX contracts module | Accepted | lead |
| 0022 | Policies: a simple tier, solver-ready, as a first-party extension | Accepted | operator |
| 0036 | Deny by default arrives with the policies extension | Accepted | lead |
| 0046 | What a denied write reports on an atomic action | Proposed | operator |
| 0023 | Workflows and jobs come after v1; the adapter interface stays a design document | Accepted | operator |
| 0024 | The in-process workflow runner is the first adapter | Superseded by 023 | operator |
| 0034 | The resource vocabulary copies Ash’s DSL for v1; optimised for MX after v1 | Accepted | operator; lead for the spelling |
| 0041 | Resource files and examples always use MX concise syntax | Accepted | operator |
| 0035 | What public on an attribute means |
Proposed | operator |
| 0037 | Which artefact is the source of truth for the vocabulary | Proposed | operator or lead |
Platform, tooling, process
| ADR | Decision | Status | Deciders |
|---|---|---|---|
| 0025 | Mesh runs on Bun only | Accepted | operator |
| 0026 | Mesh runs on Bun and Node | Superseded by 025 | operator |
| 0027 | No MCP server; the agent surface is a rules file, later a generated CLI | Accepted | operator |
| 0028 | Input validation is Zod behind Standard Schema | Accepted | lead |
| 0029 | Tracing calls the OpenTelemetry API directly | Accepted | lead |
| 0030 | Established tools first, behind Mesh contracts | Accepted | operator |
| 0031 | No CI until the MX packages are published | Accepted | operator |
| 0032 | Docs site in the repo; decisions as ADRs; the repo is the source of truth | Accepted | operator |
| 0038 | Elysia is not core; a candidate HTTP adapter | Accepted | operator |
| 0039 | Run-time errors: embedded positions or source maps | Proposed | operator or lead |
| 0040 | Package scope and command name | Proposed | operator |
| 0042 | Mesh is open source under MIT; the docs are public | Accepted | operator |
Open decisions at a glance
Nine records are Proposed. One blocks v1 work outright: ADR-0012 (expression semantics, before
M4). ADR-0037 (before M1), ADR-0039 (before M5), ADR-0045 (before M7) and ADR-0046 (before M8) have
a working assumption in the roadmap. ADR-0044 is for after v1. ADR-0009, ADR-0035 and ADR-0040 block nothing in v1.
The dated log the records quote: rulings of 2026-10-04.