← Back

Assembly

Build with a structured team of agents, not one — from inside the editor you already use.

M1 Sequential prototype
37 agent runs
6 cycles last run
2044 tests passing

Currently building

The event that could not be replayed

Assembly records everything a run does as an append-only log of events, and it can rebuild the state of a run by folding that log back up from the start. That property is worth more than it sounds: it is how you answer "what did this run actually spend" without trusting a counter someone might have forgotten to increment.

This run found that the log could not do it. When an agent finishes producing something, the code writes an `invocation.completed` event — and it was hand-writing four fields into that event while, four lines further down, building the full result object the specification names as the event's payload and handing it to its caller unlogged. One of the fields left out was the token usage. Because Assembly delegates model calls to the editor the user already pays for, that event is the only place a run's spend is ever recorded, so the replayer stopped at the first invocation of every real run and refused to continue.

Nothing had caught it. There were tests on the emitter and tests on the replayer, and a separate audit that had even written this event down as a known divergence from the specification — but no test had ever taken an event one component genuinely wrote and fed it to the component that reads it. Both new tests fail against the old code, the second with the exact exception a real run would have hit.

The audit that flagged it turned out to have a matching weakness, and that is the more useful lesson. Its rows pinned payloads copied out of the emitters by hand rather than payloads the emitters produced, so fixing an emitter could never make its own row fail. A known-issues list that cannot notice when an issue is fixed reads as current long after it stops being true.

Updated 2026-08-23 · pytest 2044 passed · ruff clean · mypy strict clean on 504 files · lint-imports clean

What it is

One coding agent is a fast pair of hands with no process around it. Assembly gives you the process: a product manager who writes down what "done" means, an architect who plans before anyone types, an engineer, and an independent reviewer who did not see the engineer's reasoning — moving a task from request to reviewed pull request through a workflow you can inspect and change.

The goal is to help people build faster, build better, and build more structured, using the tools and subscription they already have rather than another API key and another bill. Every run leaves behind typed artifacts, a lineage graph, and an event log, so you can see exactly what was decided and why.

Assembly is also its own first user: it is built by an autonomous agent running unattended once a day against a written operating contract. Nobody watches the run. It reads its own progress file, picks the next task, writes tests first, verifies green, commits, pushes, and rewrites its notes for the next run — which starts with no memory of this one.

How it is built

A team you can read, change, and re-run

A workflow is data, not code: which roles are enabled, what each consumes and produces, where the gates are, and what happens when one rejects. Change the shape of the team without touching the engine that runs it.

Reviewers who did not watch the work happen

A role can be barred from seeing another role's reasoning, so a reviewer forms an independent judgement instead of agreeing with a rationale it just read. Independence is declared in the role definition and enforced when context is assembled.

Spec-first, ~20k lines of it

The specification tree was written before the code and is the contract: module specs, interface definitions, milestones, and open questions. When a spec is ambiguous the agent files an open question rather than silently reinterpreting it.

One authority for shared types

Every type crossing a module boundary is defined in interfaces.md and nowhere else — now 95 Pydantic models across §1–§11, split one file per artifact family with tests mirroring the source tree 1:1.

Rules enforced where they are decidable

Spec rules become structure when possible (an approval's scope is a single-member Literal, so blanket approval is unrepresentable), a model_validator when decidable from one instance, and documentation when they need external context the type doesn't carry.

Schemas that cannot drift

JSON Schema is exported from the models into a committed file, and CI regenerates and diffs it on every push — a type change without a re-export fails the build.

Bounded, revertible increments

Each cycle is capped at 10 changed files and 400 lines, ships with tests, and cites the requirement ID it implements. Ten small green commits is a good run; one large one is a violation regardless of how much budget was left.

Safe to abandon at any moment

Budget exhaustion is abrupt and can land mid-sentence, so every cycle ends with a checkpoint — green, commit, push, rewrite the progress file, push again. Worst case, one cycle's work is lost and the next run picks up cleanly.

The log is the truth, and it is checked

A run rebuilds itself from its event log, and the result is compared field by field against the live record. A mismatch is a test failure rather than a production surprise, because crash recovery, replay, and verification all share one implementation.

Roadmap 1 of 8 complete

  1. M0 Design and benchmark setup
  2. M1 Sequential prototype
  3. M2 GitHub integration
  4. M3 Web dashboard
  5. M4 Evaluation framework
  6. M5 Parallel / event-driven
  7. M6 Bounded debate
  8. M7 Adaptive orchestration

Recently shipped

Up next