{
  "claim": "Composing a whole screen with json-render's experimental Jev composer costs two evaluation calls, not one per component. The default batched strategy asks every membership question in a first call and every placement question in a second, so the round-trip count is independent of how many elements end up on screen. The same eight-element result built one operation at a time costs nine calls and 42% more bytes. Follow-up edits are always sequential: a removal is two calls, a move is three.",
  "method": "Cloned vercel-labs/json-render at 3ad38188 (v0.21.0), installed the workspace, built @json-render/core, and ran experimental_composeSpec through the playground's own wrapper (apps/web/lib/jev/compose.ts) with its real catalog (17 component types) and its real candidate grammar (42 recipes). The evaluator is a stub that records the exact { state, questions } payload it is handed and then returns a scripted set of choices that builds the named result — so the call counts, question counts, option counts and byte counts are the composer's, not mine. Prompts are the two the docs themselves suggest. Bytes are JSON.stringify length of the request body the Gateway adapter would POST.",
  "source": "https://github.com/vercel-labs/json-render/tree/main/packages/core/src",
  "captured": "2026-09-19",
  "note": "Options counts include every key offered across every question in the call, including the always-present 'unavailable' and 'omit' escapes. The sequential dashboard run reaches the same eight elements as the batched one; its ninth call is the separate 'finish' decision that batching does not need. Byte counts are request bodies, not tokens; the token estimates in the article divide by four and are labelled as estimates.",
  "columns": [
    { "key": "scenario", "label": "what was composed" },
    { "key": "strategy", "label": "strategy" },
    { "key": "calls", "label": "calls", "align": "right" },
    { "key": "questions", "label": "questions", "align": "right" },
    { "key": "options", "label": "options", "align": "right" },
    { "key": "bytes", "label": "request bytes", "align": "right" }
  ],
  "rows": [
    {
      "scenario": "Sales dashboard — 8 elements",
      "strategy": "batch (default)",
      "calls": 2,
      "questions": 50,
      "options": 222,
      "bytes": "37,806"
    },
    {
      "scenario": "Sales dashboard — 8 elements",
      "strategy": "sequential",
      "calls": 9,
      "questions": 14,
      "options": 344,
      "bytes": "50,341"
    },
    {
      "scenario": "Account settings — 8 elements",
      "strategy": "batch (default)",
      "calls": 2,
      "questions": 50,
      "options": 222,
      "bytes": "38,561"
    },
    {
      "scenario": "edit: remove the notifications switch",
      "strategy": "sequential (forced)",
      "calls": 2,
      "questions": 4,
      "options": 121,
      "bytes": "21,278"
    },
    {
      "scenario": "edit: move the email field above the name field",
      "strategy": "sequential (forced)",
      "calls": 3,
      "questions": 5,
      "options": 130,
      "bytes": "26,127"
    }
  ]
}
