Architecture Decision Records

Copy Markdown View Source
#DecisionStatus
0001Keep the stack VM; revise the instruction set (ISA v2)accepted
0002The = grammar break (4.0)accepted
0003The Elixir implementation leads the ISAaccepted
0004No eval, ever; errors are valuesaccepted
0005Worktree-per-bead parallelism, with area labels as a decidable batching algebraaccepted
0006The human gate belongs where an action stops being reversible; mix hex.publish has no trigger at allaccepted
0007All work is tracked in bd (beads) - not GitHub Issues, not TodoWrite, not markdown TODO listsaccepted
0008mix quality is the one aggregated gate, and its config is not agent-editableaccepted
0009The compiled envelope carries the position table; compile/1 stays a bare listaccepted
0010Tracker authority follows the artifact; mirrors pull, and monorepo work is held by an external-refaccepted (statifier-ex ADR-0025 adopts it)
0011Casts compile to a cast opcode (ISA v4); :: is postfix and failure is :undefinedaccepted
0012Adopting the shared wurk workflow: .claude/skills/ and .claude/agents/ are consumed globally as wurk:*, configured by manifest and extensionsaccepted
0013Control flow lowers to new jump opcodes; if is ISA v5, while is ISA v6 with a loop budgetaccepted
0014Functions are provided by modules; the context carries a host slot (5.0)accepted
0015Compile errors are structured values on all six entry points (8.0)accepted

Link form is load-bearing: an ADR published to hexdocs is linked relatively so the link resolves there, and an unpublished one is linked by absolute GitHub URL. test/docs_adr_links_test.exs enforces both directions.

New ADRs: next number, same three-section format (Context, Decision, Consequences). An ADR is amended by a new ADR that supersedes it, not by rewriting history; superseded decisions stay visible as the path taken. An ADR whose decision still holds but whose consequences have moved is amended in place by a later ADR that says so at the top and names the sentences it replaces - ADR-0003 does this to ADR-0001 - and the amended ADR stays accepted.

When a decision earns an ADR. The test is whether someone will later ask "why is it like this" and find that the rule alone does not answer. A rule that explains itself needs no ADR, and writing one anyway adds a file and a maintenance obligation for nothing. The zero-runtime-dependencies policy was weighed on that test and declined: px-tbv.6 and README.md already carry both the fact and the reason for it.

Three corollaries, settled by px-4lz:

  • Reasoning that overlaps a sibling repo's ADR still gets its own record here. Answering by cross-repo citation was considered as a general policy and rejected - a reader of this repo should not need a checkout of another one to learn why this one is built the way it is. ADR-0007 and ADR-0008 overlap statifier's governance ADRs and are written out in full regardless, crediting the prior art in a sentence.
  • A decision that is a corollary of another belongs inside it, as a consequence rather than beside it at its own number. Errors-are-values is part of ADR-0004 on those grounds instead of an ADR of its own.
  • A call too narrow for its own ADR goes to docs/research/, named after the bead that prompted it. The area:conformance label argument (260807-px-phw-conformance-area-label.md) is the model.

Status. An ADR is proposed while it is drafted and accepted once the maintainer confirms it records the decision as actually made. An agent may draft; only the maintainer accepts, because an ADR reconstructed from a surviving rule is a guess carrying a document's authority. ADR-0004 through ADR-0008 were drafted proposed under px-4lz and accepted on review.

ADR-0001 opens a 3.6-4.0 arc designed around statifier's six upstream seams. The remaining decisions from that design - the Context struct, typed undefined, and the statement layer - get their ADRs as their releases are taken up, not in advance.