Case study

Benchmark · 25–26 October 2026 · Amaca 5.2.0

MCP server against files: the full report.

Seven ways of giving an agent the Amaca design system, seven tasks, three runs per cell, four models, 599 scored runs. The numbers, the caveats, and what the run did not measure.

01 · Question

What the run set out to answer.

  • Does an agent connected only to the Amaca MCP server apply the system at least as well as one given files, at a lower cost?
  • Does it call check_compliance on its own before handing over?
  • Of the routes that use files, which works best?

02 · Setup

Conditions, tasks, runs.

Four models from one vendor ran as subagents in a cloud coding session, one model at a time, after a pilot. Each condition gave the agent a different way into the system; the tools each subagent could use were restricted per condition, and every tool call was logged. Model names are left out of this report on purpose.

Conditions8

IdThe agent gets
C0No file (it still received the server's instructions: see the caveats)
C1AI-INSTRUCTIONS.md
C2aAGENTS.md + tokens.css
C2bThe amaca-frontend skill, 9 files
C3llms-full.txt
C4DESIGN.md in full
M1The MCP server only
M1bThe MCP server, plus its instructions in the prompt, for the model that did not receive them
Table 1Each condition is one route an agent can take into the system today.

Tasks7 · same prompt for every model and condition

#Task
1A settings page
2Pricing cards in React and Tailwind v4
3A request for a value off the scale
4Motion
5A component the registry does not have
6The Badge variants
7A composite page: a dashboard for an invented bike-sharing fleet, with sidebar, one primary action, an alert, four stat cards and a table of stations
Table 2Tasks 3 and 5 test whether the agent refuses to invent. No prompt mentions check_compliance.

Each output was scored 0 to 100 on token discipline, use of the registry, the gap protocol, variants, the 85/10/5 law, the accessibility floor and valid output. The repository's own compliance scan counted errors at handover, and a context share measured how many classes and var() in the output resolve to Amaca. Tokens, time and tool calls came from the session.

03 · Results

Mean per run, across models.

All conditions599 runs scored

ConditionScoreScan errorsDS contextTokensTime (s)Tool calls
C0 · no file35.128.40.179.0k282.0
C1 · AI-INSTRUCTIONS77.20.20.9519.9k393.1
C2a · AGENTS + tokens78.70.20.9327.7k414.0
C2b · skill89.30.20.99118.5k14814.4
C3 · llms-full76.00.30.9225.2k453.0
C4 · DESIGN.md89.20.60.9685.3k8710.2
M1 · MCP only93.80.30.9442.3k849.9
Table 3Without one false positive of the scorer (section 06), C2b scores 93.2 and C4 93.3. M1b, run only for the model that did not receive the instructions, scored 95.3 with zero scan errors.

In one sentence. At the same quality, around 93, the server route uses a third of the skill's context and half of DESIGN.md's. The short files cost little but stop at 76 to 79: they name the components, not their parts, and the agent invents the sub-parts.

Averaged over the seven common conditions, the four models scored 77.2, 78.1, 77.8 and 74.0. The last is incomplete: ten of its runs were skipped at a usage limit, and some of its cells have two runs instead of three.

04 · Where the server did not win

Refusing to invent, and the Badge.

Tasks 3 and 5

Asked for something the system does not have, agents with a file stopped and asked 0.96 to 1.00 of the time. Under M1 the rate was 0.79: the agent built the missing component out of pieces from the registry instead of stopping.


Task 6, the Badge variants

M1 and C4 got 12 of 12, the skill 8 of 11. C1, C2a and C3 got 0 of 12: those files do not list the variants.

05 · Self-check

Calling the check unprompted.

Under M1, check_compliance was called before the final answer in 34 of 83 runs, 41%. In 24 of them the code was already clean. The average hides the models: 3 of 21, 7 of 21, 11 of 21 and 13 of 20. The rate is a property of the model, not of the system.

06 · The instrument

What the run found in its own checker.

The matrix of outputs turned up two false positives in check_compliance. The 0.01ms override inside prefers-reduced-motion, which the system prescribes, accounted for all 94 raw-duration findings outside C0. The skip link parked off screen, also prescribed by DESIGN.md, hit 19 runs of C2b and C4. One agent wrote animation: none in place of the prescribed kill switch and said it did so to avoid tripping the verifier: the false positive was pushing it out of the contract.

Both were fixed and shipped in v5.3.0. Clean outputs from this run and mutants with one violation each now guard the scan, so a rule that starts flagging what the system prescribes fails before release.

Typical failuresby condition

ConditionMost common
C0raw-px, colour-literal, raw-duration
C1 · C2a · C3class-off-registry, for invented sub-parts
C2b · C4The skip link (the false positive)
M1border-radius: 1px; a spring rewritten by hand as a cubic-bezier
Table 4Each route fails in its own way.

07 · Caveats

Read the numbers with these in mind.

  • C0 is not a blank baseline. Every subagent received the server's instructions, so C0 means "no file", not "no context". One C0 subagent tried to call get_component and was refused.
  • One model in four did not receive the server's instructions, only the tool descriptions. M1b was added for it. This is a fact about clients.
  • The scorer has limits. The gap criterion is rule-based (33 runs are marked for a reread by hand); validity of HTML is checked leniently; the registry criterion gives half a point to plain Tailwind.
  • Leaks: 0 in 598 runs; reading under downloads/ injects downloads/CLAUDE.md, so C1 and C2a used copies placed elsewhere.
  • Budget: 27.6M tokens against 20.7M projected from the pilot; the gap comes from one model on C2b and C4, at 150k to 190k tokens per run. Two usage limits interrupted 12 runs: 6 were redone, 10 skipped.
  • Not reported here: a blind comparison of one output per condition on task 7, still waiting for the second judge. Not run: the tests on real chat clients and in Figma.

08 · After the run

What changed in the system.

  • v5.3.0: the two false positives fixed; a regression check on the scan.
  • v6.0.0: the server names what is off-system and tells the agent to stop and ask; the short files carry each component's root class, parts and variants; the scan sees a px inside a transform, a token used but never declared, and a token that does not exist.
  • Next: the same run on 6.0.0, to see whether those changes close the gaps they were written for.

Back to the case study

Imagine together
your next product

Get in touch