a2uicatalog · Vol. 20 LIVE_ARTIFACT

We tested A2UI Express on our own catalog, and it's a banger

2026-10-29 21 min read series a2uicatalog · Vol 20 build 8095cce

The headline numbers

  • 24×smaller input per request122,832 to about 5,060 input tokens (router plus writer) when a router picks a three-atom slice, and about 31.7× cheaper per request uncached (13.8× with prompt caching) with Jev routingmeasured token counts, ratios computed; routed path not run end to end
  • 13×cheaper per briefa catalogue slice on Haiku 5.5 (2.6× at a flat price); atom choice not significantly changedmeasured, direction only
  • 9×faster to routeJev about 0.19 s against Sonnet 1.7 to 1.95 s, equally accurate on my hard setmeasured, briefs written by us
  • 2.1×fewer output tokensExpress vs Direct JSON on Sonnet 5.5, and 2.0× fastermeasured, small sample
  • 80×not confirmed in our testsmy minimal build: Jev answered in 0.18 s, the whole screen took 1.57 s with the text writer; Google’s baseline is unstatedmeasured, minimal build

The catalogue numbers come first because they are the biggest. Express used fewer output tokens on every model in the table; for example 2.1× on Sonnet 5.5, 1.7× on Gemini 3.5 Flash and 1.55× on Gemini 3.8 Flash. The time saving depends on the model (2.0×, 1.24×, and no reliable gain on 3.8 Flash). Small sample throughout (six briefs, one to three repeats). The routing tile is two measured parts, router and writer, added together. Three claims in my earlier post are corrected below.

Google published A2UI Express on 27 October 2026. I tested it on our own catalogue: 557 atoms, six briefs, seven models. The format held up on tokens, and Google's 80x was not confirmed in our tests. The part I care about most came out of the catalogue work around it: keep most of a screen curated and fixed, let the model vary a small part, and route each request to a small slice of the catalogue before the model writes anything. Part 1 has the headline results of the Express test. Part 2 makes the catalogue argument and shows the routing tests. I posted early results on LinkedIn on 28 October, and three claims there needed correcting, so the corrections have their own section.

TL;DRExpress saved tokens on every model, the 80x was not confirmed in our tests, and the bigger lever is a curated catalogue with routing in front of the writer.Small sample: six briefs, one to three repeats. Every line carries its evidence label.Show the 30-second versionHide

what

I tested Google’s A2UI Express on our own 557-atom catalogue, six briefs and seven models, then a curated agent and routing on top.

why

Google published it on 27 October. I posted early results that were partly wrong, and I think the catalogue matters more than the format.

results

  1. 01Fewer tokens on every model; time depends on the model. Measured, small sample. On Sonnet 5.5, 2.1x fewer output tokens and 2.0x faster, all 18 replies compiled. Gemini 3.5 Flash 1.7x fewer tokens and 1.24x faster; Gemini 3.8 Flash 1.55x fewer tokens, no reliable time gain.
  2. 02Google’s “up to 80x” was not confirmed in our tests. Measured, minimal build. Neither confirmed nor refuted: Google’s baseline is unstated.
  3. 03The content is mostly sound; the rendering is where it breaks. Measured, two reviewers, one repeat. No factual errors found.
  4. 04My position: about 80% fixed curated content, 20% variable. Assumed, not tested as a split. The variable part should use curated atoms first.
  5. 05A curated agent stays in scope. Measured, small tests. A three-atom slice and a short profile: 18 of 18 out-of-scope requests refused when told to.
  6. 06A router in front of the writer cuts the input per request 24x. Measured parts, never run end to end. A decision model routed as accurately as Sonnet on my hard set, about 9x faster, and about 31.7x cheaper per request uncached (13.8x cached).
  7. 07The catalogue and renderer moved the results. Measured on five paired cells; three improved, two look the same. Not a rate of improvement.

conclusion

The format helps on tokens. The catalogue, a router and a short profile matter more, and the corrections are in their own section below.

every number checked against the article

Every claim carries one of three labels: measured (we ran it and have the data), sourced (someone else said it and we link or quote it) or assumed (my view, not tested). The samples are small throughout: six briefs, one to three repeats, one slice of the catalogue per run. Read every number as "in this sample", not as a ranking.

Part 1. The headline results from the Express test

Express is the new compact format Google proposed for a model to write a screen. Direct JSON is the existing one. Elemental is a third format in the same SDK that looks like HTML. I ran the SDK's own implementations (a2ui-agent-sdk 0.9.0) against our catalogue. The yardstick stayed the same across every run: the same six briefs (a lesson, a data display, a landing page and so on), scored by how well the components the model chose match an answer key I fixed in advance (version 2). The score is F1: 1.0 means an exact match and 0 means nothing in common. It scores which components were used, not what they say. I added a separate content check afterwards.

1. Express against Direct JSON

Same six briefs, three repeats each, so 18 replies per model. Each model wrote every screen twice: once as Express and once as Direct JSON, against the same slice of the catalogue. I counted replies that compiled, output tokens per reply, and seconds per reply (request time only).

Output tokens per reply, Express against Direct JSON

ExpressDirect JSON

  • Sonnet 5.5928 Express1,985 Direct JSON
  • Opus 5.51,184 Express1,873 Direct JSON
  • Haiku 5.51,791 Express2,553 Direct JSON
  • Gemini 3.5 Flash-Lite527 Express788 Direct JSON
  • Gemini 3.5 Flash (median)648 Express1,102 Direct JSON
  • Gemini 3.8 Flash (median)614 Express841 Direct JSON
Measured, small sample. Express wrote fewer output tokens on every model in the table. Shorter bars are better. The same numbers are in the table in the results box below.
Results: Sonnet 5.5 wrote 2.1x fewer tokens and was 2.0x fastermeasured, small sample

On Sonnet 5.5, Express wrote 928 output tokens per reply against 1,985 for Direct JSON (2.14x fewer) and took 7.6 s against 15.1 s (2.00x). All 18 Express replies compiled (six briefs, three repeats); 15 of 18 Direct JSON replies did.

Model Output tokens, Express / JSON Seconds, Express / JSON Express compiled
Sonnet 5.5 928 / 1,985 7.6 / 15.1 18 of 18
Opus 5.5 1,184 / 1,873 12.4 / 17.6 18 of 18
Haiku 5.5 1,791 / 2,553 8.7 / 11.5 16 of 18
Gemini 3.5 Flash-Lite 527 / 788 2.3 / 2.9 18 of 18
Gemini 3.5 Flash, thinking off (medians) 648 / 1,102 3.8 / 5.1 15 of 18 (JSON 18 of 18)
Gemini 3.8 Flash, thinking off (medians) 614 / 841 7.15 / 7.10 16 of 18 (JSON 10 of 18)

Caveats that belong next to these numbers:

  • Haiku 4.5, the seventh model and not in the table, gave the biggest ratio (2.7x), but I am not leading with it. It compiled only 3 of its 6 briefs unaided, so most of its replies produced nothing to render. I have not diagnosed why.
  • Across the models I tested, the token saving holds; the time saving depends on the model. Express used fewer output tokens on every one: 2.1x on Sonnet 5.5, 1.7x on Gemini 3.5 Flash, 1.55x (median paired ratio) on Gemini 3.8 Flash. Time: 2.0x, 1.24x, and no reliable gain on 3.8 Flash. That is below Google's "up to 3x" on time for every model I tested.
  • Gemini 3.5 Flash, thinking off (my setting; re-run 29 October): a modest gain, less reliable. Three repeats of six briefs in each format, interleaved order, request-only timing. Median reply 3.8 s for Express against 5.1 s for JSON. On the 15 briefs valid in both formats, the median per-pair time ratio is 1.24x (range 0.91x to 1.67x; Express faster in 12 of 15). Express compiled 15 of 18 replies and JSON 18 of 18.
  • Gemini 3.8 Flash, thinking off: fewer tokens, no time gain I can claim. Median paired time ratio 1.06x on 10 briefs, range 0.22x to 7.08x, Express faster in 6 of 10, with latency spikes in both formats. Express compiled 16 of 18 and JSON 10 of 18 (seven JSON failures were components unreachable from the root). An earlier run with thinking on gave 1.19x with truncated JSON replies and is superseded.
  • The Direct JSON side is handicapped. Our catalogue build typed 18 list and boolean fields as strings, so models that obeyed the schema sent strings. I can't fix that without re-running them, so I make no claim about JSON against Express quality.
  • For reference, sourced: Google says up to 3x fewer tokens and up to 3x lower latency.

2. Google's "up to 80x"

I built a small version of the pipeline Google describes: three fixed layouts, three typed questions answered by Jev (a small decision model from TypeSafe that picks from fixed options instead of writing text; sourced: it is in early access, so you may not be able to rerun this part yet), code that builds the screen, and Gemini 3.5 Flash-Lite writing only the text. Six briefs, three repeats, 18 screens.

Results: 1.57 s per complete screen, F1 0.31, 80x neither confirmed nor refutedmeasured, minimal build

Google describes a decision model that answers about 30 typed layout questions per screen while code builds the components and a small model writes only the text. I built a small version: three fixed layouts, three questions, Jev to choose, Gemini 3.5 Flash-Lite to write the text. Eighteen screens, all compiled.

A complete screen took 1.57 seconds (Jev 0.18 s, writer 1.39 s). Google reports 0.8 to 1.7 seconds for complete screens, so we are in the same range. Against the same writer model producing the whole screen, mine was 1.4x faster than Express and 1.9x faster than Direct JSON. Ratios of 12x to 96x appear only if you measure time to layout (before any text exists) against whole-screen replies: 12x to 16x against Gemini Flash-Lite, and 59x to 96x against the larger models (Opus 5.5 whole-screen Direct JSON at 17.6 s divided by about 0.18 s).

The cost was quality: in this six-brief sample the pipeline scored F1 0.31 against 0.67 for the plain whole-screen reply, because three fixed layouts cannot express five of the six briefs. Google does not say what its 80x is measured against, so my test neither confirms nor refutes it.

Sourced, from Google's post: "up to 3x" fewer tokens for Express against Direct JSON, and latency "by up to 3x, and up-to 80x using decision models like Jev". The 80x is a latency claim for decision models, not a token claim.

3. Is the content any good?

F1 only tells you which atoms were chosen, so I added a content check: 72 cells (12 run sets times 6 briefs), each graded twice. Rendered is what a viewer sees. Payload is the model's own output against the brief, ignoring renderer and harness faults. A second reviewer from a different model family graded the same cells blind. Pictures of the rendered pages are in section 4.

Results: 54 of 72 payloads good or minor, no factual errorsmeasured, two reviewers, one repeat
  • On the payload, 54 of 72 cells were good or minor. No factual errors were found in the lessons or definitions, and the numbers I checked were right.
  • On the rendered page, far fewer were: 34 of 72 good or minor. Of the 54 rendered cells that fell short of "good", the main cause was the model in 23, the renderer in 17 and my test harness in 14.
  • A second reviewer, from a different model family and blind to the first reviewer's grades, agreed on good-or-minor against not for 64 of 67 comparable cells.
  • Reviewer independence is limited. The first reviewer saw labels naming the model that wrote each cell, and graded cells that include replies from its own model family. The second saw no model labels, but also graded cells that include replies from its own family. I did not test whether either grades its own family differently.

What this does not support: any ranking of models or formats, anything about interactivity (no filter or control is wired), anything about wide screens, or anything about stability across repeats (repeats 2 and 3 were not reviewed). It is one pass on one sample.

4. Why the rendered page lagged: the catalogue and the renderer

I saved every payload when I ran it, then rendered five of them with the 10 October renderer and again with the 27 October one, changing nothing else. The model output is the same on both sides, so any difference is the renderer and the catalogue it draws from. What I saw is that as the catalogue improved, the same screens rendered better. Here is one example, the data display.

One example: the same saved output, drawn by the renderer 17 days apart

The same data-display screen drawn by two renderers. Left, the 10 October renderer: four metric tiles, then a dark grey bar chart with odd axis labels (183.2 sits between 111.5 and 95) and no legend. Right, the 27 October renderer: the same tiles, then a labelled bar chart of revenue against target by quarter, with a legend and an axis from 0 to 140.
Measured, one model, one repeat. The model output is identical on both sides; only the renderer changed. Left: 10 October. Right: 27 October. A chart that was hard to read now has a legend and a proper axis.
Results: three of five cells look clearly better on the newer renderermeasured on five paired cells

Three cells look clearly better. The chart brief now shows a chart, the flashcard deck that was missing on the old snapshot is there, and the filterable list renders as cards (a filter strip overlaps in both versions). Two cells, the lesson and the marketing page, look the same, so not every cell improved. The model output is identical in each pair, so the difference is the renderer. One model, one repeat.

It also worked the other way. Our own catalogue build typed 18 fields wrongly and documented the pricing atom's tiers only as "array", so models followed the schema or guessed field names the renderer ignored, and every model looked worse for it. The same payload can look better or worse depending on which renderer version shows it. The catalogue's first commit was 5 July 2026, under four months ago.

A small worked case is the fourth brief, a list of eight items you can filter by status. Sourced from our earlier plain-agent test: no atom could filter a list, so I added filterable_list on 25 September. Where a model's slice contained it, models chose it. The gain came from adding the atom to the catalogue.

Of the 54 weak rendered cells above, 31 had a renderer or harness cause. And a direction we are exploring, not a result: capability tags now exist for all 557 atoms (a first, coarse pass), and the tag-only routing test in section 7 shows why tags alone are not enough.

All the rendered comparisons (four images)measured, five paired cells

Overview: four pairs, left 10 October, right 27 October

Four screens, each drawn by the 10 October and the 27 October renderer side by side. The lesson and the pricing page look the same in both. The data display gains a labelled chart with a legend, and the work-item list becomes cards with status chips.

Vocabulary flashcards: the deck was missing on the old renderer

The same vocabulary flashcard screen drawn by two renderers. Left, 10 October: only the title, a progress bar and a note, with the flashcard deck missing. Right, 27 October: the flashcard deck appears with Previous, Flip and Next buttons.

Work-item list: rows became cards (the filter strip overlaps the list in both)

The same list of eight work items with a status filter, drawn by two renderers. Left, 10 October: plain rows with small grey status tags. Right, 27 October: each item as a card with a coloured status chip. In both, the filter strip overlaps the list at this narrow width.
The lesson and the pricing page look the same in both versions, so not every cell improved. Five cells from one model and one repeat are not a rate of improvement.

Part 2. The catalogue is where I would put the effort

The idea: 80% fixed, 20% variable

My conviction, and it is a design position, not a result (assumed): a generated screen should be about 80% fixed, curated content and about 20% variable. The fixed part is the atoms and layouts we have designed, tested and made accessible once. The variable part is whatever this request needs that the fixed part cannot say, and there the model should reach for a curated atom first and invent only when nothing fits.

None of the tests below measures the 80:20 split itself. They measure the pieces it depends on: whether a smaller catalogue changes what the model picks, whether a short profile keeps the model in scope, and whether a cheap router can choose the right slice before the writer starts. What I did see in Part 1 points the same way. Of the 54 rendered cells that fell short (section 3), 31 had a renderer or test-harness cause, not a model one, and the whole catalogue is about 108,000 tokens of prompt on every request. I expect a fixed, tested base to cut the first problem and a slice to cut the second (assumed).

The design: route first, then write from a small curated slice

  1. 1. RequestWhat the person asked for, in their own words.
  2. 2. RouterPicks which catalogue fits, or says none.Jev: about 0.19 s per route (measured)
  3. 3. Slice and profileAbout three curated atoms and a short rule to refuse what is out of scope.Refuses out-of-scope requests when told to (measured)
  4. 4. WriterThe model writes the screen in Express, from the slice only.24x smaller input (computed from measured tokens)
  5. 5. ScreenCurated atoms render it, tested and accessible once.
About 80% fixed, curated. Designed, tested and made accessible once.
About 20% variable. Curated atoms first.
The 80:20 split is my design position (assumed), not a result. The router, slice, profile and prompt-size numbers above are measured on small tests.

5. Giving the agent a slice of the catalogue

Haiku 5.5 wrote Express screens against the whole catalogue (557 atoms) and against smaller slices of it. I compared prompt size, cost per brief and atom-choice F1.

Results: about 13x cheaper per brief, no significant change in atom choicemeasured, direction only

The whole catalogue is about 108,000 tokens. A rule-based slice of 207 atoms is about 35,000. On Haiku 5.5 with Express, the cost per brief fell from $0.0576 to $0.0044, about 13x. Most of that 13x is a price tier: Haiku 5.5 charges more per token above 100,000 tokens, and the whole catalogue crosses the line. At a flat price the saving is 2.6x.

The F1 went up (0.50 to 0.59 on answer key v2), but the gain comes mostly from one brief and is not statistically significant. So the claim is "no significant change in atom choice", not "better".

A slice also acts as a guard. In one offline case, a reply written for a marketing slice was rejected by the learning slice at compile time ("Unknown component 'feature_grid' not defined in catalog"). One case, offline. I did not test how an agent would be identified, or whether the guard holds against a model that tries to get round it. This is a direction we are exploring, not a deployed control and not enterprise adoption.

6. A curated agent in three levels

To see what a small, curated catalogue does to a whole agent, I built one around a few toy-brick blocks (released on 30 October: block_robot, block_rocket, motion_bricks and brick_build_3d; the Apps Script surface does not render them yet). Sonnet 5.5 wrote Express, eight briefs, three repeats, with the answer key written before the runs. Level 1 gave it only a four-atom slice. Level 2 added a one-paragraph profile telling it to refuse anything out of scope. Level 3 gave it the full catalogue.

Results: a three-atom slice and a short profile kept the agent in scope (refused 18 of 18 out-of-scope requests, when told to)measured, small tests

Level 1, the slice alone (4 atoms, 48 calls). On the three briefs that match a block (robot, rocket, spaceship), the agent picked the right block 9 of 9 times in both formats. Express wrote 66 to 113 output tokens in 1.2 to 2.6 s; Direct JSON wrote 266 to 591 in 2.8 to 5.0 s. Express compiled 24 of 24 replies and JSON 21 of 24 (three invented-field failures). On the dashboard brief, which no block fits, the agent was forced to pick a brick atom and refused 0 of 3 times.

Briefs B1 to B7 have an expected block, so they get an F1 score. The eighth, the dashboard, has none, so it is scored pass or fail instead (above). I found an error in my own answer key after this run (the house and cat briefs accepted only one atom, and a second one also fits). I kept the pinned-key scores and show the re-score beside them, labelled as after the fact:

Mean F1, briefs B1 to B7 Pinned key Re-scored after the key fix (post hoc)
Express 0.57 1.0
Direct JSON 0.57 0.86

Level 2, the slice plus a profile (3 atoms, 24 Express calls). All 24 compiled. The matching briefs scored F1 1.0. The agent refused the real-parts table and the dashboard 6 of 6 times. These refusals were instructed: without the instruction it refused 0 of 3.

Guardrail round (24 calls, the same profile and slice as level 2). Clearly out-of-scope requests were refused 6 of 6 and prompt-injection attempts 6 of 6; control briefs were answered correctly 6 of 6. Two borderline briefs (a toy-brick bar chart, a toy-brick dashboard) were built with bricks 6 of 6 times. That is a judgement call and I did not score it.

Counting level 2 (6) and the guardrail round (12), that is 18 of 18 refusals, all instructed. Without the profile, the one out-of-scope brief I tried was refused 0 of 3.

Level 3, the full catalogue (2 calls only). 122,832 input tokens per request, and it still picked the right block 2 of 2. I did not run the other 22 planned calls.

7. Routing before the writer

Instead of giving the writer a slice chosen by rules, a router reads the request first and says which catalogue it belongs to, or "none". I tested a general model (Sonnet 5.5) and a decision model (Jev) as routers, on two sets of briefs I wrote: 16 easy ones, and 24 harder ones with overlaps, two-catalogue requests, typos, French, an injection attempt and requests where nothing fits.

Results: a decision model routed as accurately as Sonnet on my hard set, about 9x fastermeasured, briefs written by us
Router Hard set, clear briefs Nothing fits Two catalogues Judgement calls Time per route
Sonnet 5.5 36 of 36 9 of 9 10 of 12 11 of 15 1.7 to 1.95 s
Jev 36 of 36 9 of 9 12 of 12 12 of 15 about 0.19 s

Details behind the table:

  • The vendor says Jev is 40x to 200x faster than frontier models on this kind of query and answers in 70 to 500 ms (sourced, announcement, a vendor claim I did not test). My 9x is lower. My 0.19 s sits inside their range; I compared against a fast Sonnet router, which I guess explains the gap (assumed).
  • Sonnet returned an empty reply on 6 of 72 calls because its thinking used up the 256-token cap I set. That is a flaw in my setup, and I left the counts as they came out.
  • On the 16 easy briefs (48 replies) Sonnet was right on all 48, 42 of them clear cases. Jev was right on 39 of the 42 clear cases: 15 of 18 on the block briefs (the spaceship brief went to "none" three times), 21 of 21 cross-catalogue and 3 of 3 where nothing fits, plus all 6 judgement replies. On the hard set the toy plane went to "none" three times with Jev.
  • Keyword and tag routers (BM25, tags, a hybrid) got 7 to 8 of 12 on the clear hard briefs, and the tag routers cannot say "none". The tag file also had a gap: it tagged none of the four brick atoms. Keyword or tag routing alone is not enough for this catalogue. I did not test an embedding router.
  • This is one comparison on briefs I wrote. It does not say a decision model is better than a general model.

What routing does to the prompt

With a router in front, the writer sees a three-atom slice instead of the full catalogue. I measured the prompts, the time and the cost.

Input tokens the writer reads per request

  • Full catalogue122,832
  • Sonnet router, then a three-atom sliceabout 5,370
  • Jev router, then a three-atom sliceabout 5,060
Measured tokens (24.3x fewer with the Jev router, 22.9x with the Sonnet router). The routed path was never run end to end. Cost per request is about 31.7x lower uncached with a Jev router (computed from list prices). The bars are drawn to scale, so the routed ones are small.
Results: a 24x smaller input per request (router plus writer), and about 31.7x cheaper uncachedmeasured tokens, ratios computed from them

The writer prompt is 122,832 input tokens with the full catalogue and about 3,600 behind a router with a three-atom slice (34x fewer on the writer alone). Adding the router's own input (about 1,460 tokens for Jev, 1,770 for Sonnet) gives about 5,060 and 5,370 input tokens per request: 24.3x and 22.9x fewer. Router and writer were counted in separate runs on different briefs, so the 24x is computed from measured means, like the latency. The full-catalogue prompt is the 573-atom catalogue plus the Express rules, counted by Sonnet. The 108,000 in section 5 is an earlier round counted by Haiku on 557 atoms, so the two are not the same text and I do not equate them. Summed latency, with the router and the writer measured as separate calls: 3.35 s with a Sonnet router and about 1.9 s with Jev, against 4.5 s without routing (1.35x and 2.4x). The 4.5 s comes from the two full-catalogue calls only.

Cost per request, output tokens included, Sonnet 5.5 as the writer. Sourced prices: Sonnet 5.5 at 2 and 10 USD per million input and output tokens, 0.10 per million on a cache hit (pricing page, read 29 October 2026); Jev at 42 USD per billion input tokens with output tokens free (Jev announcement, read 30 October 2026), which is its own price, not Sonnet's. The Jev figures below count its output as free. The 5,060 above is a token count. The Jev router's tokens are priced at Jev's rate, so the bill is not 5,060 times the Sonnet price. I built each figure from measured mean tokens:

  • No routing: 122,832 input and about 68 output tokens, 0.2463 USD.
  • Writer behind a router: 3,602 input and about 52 output tokens, 0.0077 USD.
  • Sonnet router: 1,769 input and 43 output tokens, 0.0040 USD.
  • Jev router: 1,456 input and 216 output tokens, 0.00006 USD (output is free).

Cost per 1,000 requests ("cached" assumes a 100% cache hit on both sides, which is a steady-state assumption):

Row Uncached Cached
No routing (full catalogue) 246.34 USD 12.96 USD
Jev router, then writer 7.78 USD 0.94 USD
Sonnet router, then writer 11.69 USD 1.48 USD

That is 31.7x cheaper uncached and 13.8x cached with the Jev router, and 21.1x and 8.7x with the Sonnet router. The router step alone is 65x cheaper with Jev uncached (0.06 against 3.96 USD per 1,000 routes, 10x cached). That 65x comes from Jev's price per token, not from fewer tokens.

The 24x is computed from measured token counts (router and writer counted in separate calls and added), so it does not depend on timing or on the price list; the cost multiples apply list prices to those counts. Caveats: I never ran the routed path end to end, so each total is the router and the writer measured separately and added together. Cache writes cost 1.25x and the cache lasts five minutes, so a quiet service will not reach the cached column. The full-catalogue agent also picked the right block on its 2 of 2 briefs: the saving is prompt size and cost, not accuracy. I am not claiming that routing improves accuracy.

Further results from the same experiment

These three are background. They explain numbers used above and did not change the argument.

A decision model choosing the slice

A decision model picks an atom for each slot from a slice, and a writer model then produces the screen from those picks. I ran two decision models, Jev and Clef, on the same saved needs, so only the chooser differs.

Results: both reach F1 0.79 on oracle slices; end to end the cascade scored 0.64measured

Clef is a second decision model, which I ran through Cloudflare's API. Given slices built from the answer key (a best case no real system gets), both reach a mean F1 of 0.79.

Two cautions. An oracle slice is built from the answer key, so 0.79 is a ceiling and not an end-to-end result. End to end, the cascade I built (rule-based slice, Jev, a hint file, one repair attempt) scored F1 0.64 at $0.0144 a brief. The hint file was written after I had seen failures on these same briefs, so that figure is generous.

A plain agent with search tools

The baseline from our earlier tests: a plain Haiku 4.5 agent that searches the catalogue with tools, scored on the same briefs and the same answer key.

Results: F1 0.774 on answer key v2, level with the Express setupsmeasured

It scores 0.774 on answer key v2, level with the Express setups (0.64 to 0.79), at $0.022 a brief against $0.007 to $0.014 (all at Haiku 5.5 list prices, so not comparable with the Sonnet costs in section 7).

There is a second answer key that scores it 0.941. It differs only by also accepting filterable_list on one brief. That atom was built to close a gap the brief exposed, and my oracle slices do not contain it, so Express could not choose it. The higher figure shows what the new atom added, not the agent. Never compare a version 3 figure with a version 2 figure.

Elemental, the HTML-like format

Elemental is the third format in the SDK. I ran it on one slice of the catalogue (a subset of atoms chosen for the briefs), using a copy where component names are capitalised, six briefs, three repeats.

Results: 18 of 18 compiled on Sonnet and Haiku 5.5, a blank first rendermeasured

Elemental works with our catalogue only with capitalised component names and a children property on parents. With those, Sonnet 5.5 and Haiku 5.5 compiled 18 of 18 and Flash-Lite 16 of 18 (17 after one repair). A compile pass did not prove the page was right: my first render of every Elemental reply was blank because parent-child links were silently dropped. This ran on an offline copy of the catalogue and scores atom choice only.

Where this sits in the capability layer

The 11 areas of a GenUI capability layer are authoring, vocabulary, verification, wire format, state and events, transport, runtime and middleware, rendering, trust, tooling and conformance, and economics. Mapping each outcome to them:

Outcome Capability areas
Express against Direct JSON, tokens and time Authoring, economics
Catalogue slicing and the compile-time guard Vocabulary, trust, economics
Decision-model slice choice and routing before the writer Vocabulary, runtime and middleware, economics
The curated agent and its profile Vocabulary, trust
The content check Verification, tooling and conformance
Same payloads on a better renderer Rendering
The filterable_list gap Vocabulary

Reading the table: vocabulary appears in four of the seven rows and economics in three, which is why I put the effort there (my position, assumed; I assigned the mapping myself, so the count proves nothing). It is not a finding that those layers matter most. In the content check the main cause of a rendered cell falling short of good was the model in 23 of 54, the renderer in 17 and the harness in 14. The model was the largest single cause, but where the page looked worse than the model's own output (27 cells), the renderer was the main cause in 17 and the harness in 9.

Corrections to my earlier post

My LinkedIn post of 28 October stays as posted. Three of its claims were wrong or mixed things together, and one line has moved on.

Claim What the post said What the data supports
Speed Film caption "Gemini Flash 1.7x", and a headline speed-up Not valid. The Gemini adapter's 20-second pause was inside the timer, so every Gemini time was about 20 s. Re-measured on Flash-Lite with request time only: Express 2.26 s against Direct JSON 2.94 s, about 1.3x. Gemini 3.5 Flash re-run on 29 October with thinking off: 1.24x per reply (15 paired briefs) and 1.7x fewer tokens, but Express compiled 15 of 18 replies against 18 of 18 for JSON. Gemini 3.8 Flash: 1.55x fewer tokens and no reliable time gain. The headline model is Sonnet 5.5: 2.1x fewer tokens, 2.0x faster, 18 of 18 compiled. Haiku 4.5's 2.7x compiled only 3 of 6 briefs.
Accuracy "Clef and Jev end to end, F1 0.79 on both" and "Plain agent 0.77 to 0.94, higher" That mixes setups. The 0.79 is the oracle-slice mean. End to end, the Jev cascade scored F1 0.64 at $0.0144 a brief. The plain agent scores 0.774 on answer key v2, level with the Express setups (0.64 to 0.79). The 0.941 is on a second key that also accepts filterable_list; the two figures are not comparable.
Cost The pruning saving About 13x cheaper per brief on Haiku 5.5, 2.6x at a flat price. The F1 gain is mostly one brief and not significant.

One line is an update, not a correction: the post said "80x: next on my list". Now tested in a minimal form and not confirmed in our tests (section 2).

What I did not test

  • Any ranking of models or formats. The sample is too small and the settings were not matched.
  • Whether Google's 80x holds or fails in general.
  • The 80:20 split itself. I have not measured what share of a screen comes from curated atoms, or how that share relates to quality, cost or accessibility.
  • The routed path end to end (router, then writer, on the same requests), an embedding router, and the full catalogue on the curated agent beyond 2 calls.
  • Per-line error isolation, which the proposal describes. In my runs, one bad line failed the whole reply.
  • Interactivity, wide-screen layout, and whether results hold across repeats.
  • Direct JSON against Express quality, because of the typing fault above.
  • Real adoption by anyone. Google's own Jev numbers are an 11-prompt first look, and mine come from six briefs.

Method and where to find the data

Same six briefs, set-F1 against answer key v2, same compile step throughout. Changes between rounds were to the catalogue, the renderer and the models, not the test. Haiku 4.5 ran at temperature 0, so its three repeats are close to one run each; the other models ran at default sampling. The curated agent and routing tests used one writer model (Sonnet 5.5), briefs and answer keys that I wrote, and three repeats; an independent review matched every number in sections 6 and 7 to the raw results. Google's post and the Express proposal are linked from the announcement. The content check was two AI reviewers, one from a different model family from the other.

Where the data lives: the raw results, saved payloads, the 72-cell content check, the routing results and the old-against-new renderer comparison are at a2uicatalog.ai/gallery/express-testing, licensed CC BY 4.0. The six briefs' answer keys are not in that folder; ask me for them.