Build log
What we shipped, and when.
Margin has not launched, so everything else here describes software you cannot yet run. This page is the verifiable part: dated work, in the sequence it arrived.
Someone else measured the gap, and our own instruments were lying to us
Every number on this site is ours, checked by our own method. Rippling published one that is not: about 2,100 scored runs per model on their own payroll data, seven models finishing within one point of each other on pass rate, and bills from $621 to $4,359. They are not a customer and have not evaluated us. They measured the problem on their systems and reached the conclusion we build on.
The site got a colour. It had been running tinted neutrals and a semantic accent, which is the product default on a surface where design is the product, and three pages had no colour at all.
The contrast checker was reporting 79 failures that did not exist. Text rendered at zero opacity has no measurable contrast, and the arithmetic was turning that into a confident 1:1 ratio on colour pairs that actually measure above 5:1. It now drives every animation to its end state and refuses to call an unmeasured node a pass.
A reader who asks for less motion now gets it. 156 elements across five routes were still animating for them.
Latency became an admissibility filter, and the site got a typeface
The auto-router now records per-call latency and screens on it BEFORE parity: a cheaper configuration that preserves quality but blows the response budget is inadmissible, never a win. Sustained slowdown rolls it back automatically, mirroring the quality revert already in place.
A retirement lever: the recommendation to cut an agent that has measured spend and zero passing outcomes. It is the least comfortable thing the product can say and the most valuable.
The site got a real typeface for the first time. It had been running on whatever the reader's operating system shipped, which meant the identity changed between macOS and Windows.
The console reads itself, and the design gates started rendering
The estate band on the home page became our own console, read live from the endpoint the product itself queries. When that read fails, the page admits it instead of printing a figure.
Two new levers: tool-definition compression (the first architectural one, as opposed to parametric) and retrieval precision, shipped honestly labelled as unmeasured.
The design gate learned to render. Until this week it read CSS as text, which cannot see contrast, line length or anything a browser computes.
A parity number now travels with the harness it was measured under
Evaluation drift is now enforced, not merely logged: when the grading setup changes, any earlier quality result taken under the previous one stops counting as evidence.
The auto-router's HOLD became a first-class two-sided verdict in the console. “We ran the cheaper option and it lost” is a result, not a non-event.
The public console stopped being able to write
The public demo can display a closed loop without being able to trigger one. Visitors watch the mechanism operate; nothing they do reaches production.
The counterfactual gained its measured half, and an explicit refusal to guess the rest.
We started metering ourselves
Margin now meters Margin's own LLM calls, the first genuinely measured slice in the system, and the reason the landing page can show a real cost-per-outcome instead of a simulated one.
The build factory fails over to a second model provider when the primary quota is gone, and says plainly which work it cannot do in that mode.
Cascade waste, measured off the invoice
The econometrics engine quantifies loss occurring BETWEEN agents: effort purchased upstream that a later failure discards. Nobody invoices for it and everybody pays it.
The money map recolours when a live detector trips, so the estate view shows what is firing now rather than what fired historically.
None of these are plans. This is a curated record, not every commit. The chart above is the volume; these entries are what was worth describing.