Field tests

Updated 10 min read
On this page

Every number we publish about the size of OPVS messages comes from this page. We wrote down the method before the first count, rendered every format with a program, counted on five tokenizers, and published the data and the script, so that anyone can repeat it.

Run: 8 November 2026. Method: written and committed before the first count. Repeat it: one command, below.

In short

  • OPVS messages were smaller than every format we compared, on every tokenizer we ran. On 224 test messages, OPVS used about 21% fewer tokens than compact JSON, 42% fewer than indented JSON, 48% fewer than A2A JSON-RPC, 55% fewer than FIPA-style XML, and 6% fewer than plain English carrying the same fields.

  • Most of the saving is in the routing line. With the message body removed, the OPVS routing line and context block are about 40% smaller than the same fields as compact JSON or YAML. The longer the body, the smaller the saving, because the body is the same text in every format.

  • Memory notes: an OPVS note is 13–18% smaller than the same note as compact JSON or YAML, and 11–13% larger than the same note as one plain sentence. Notes are summaries: ours kept 86% of the facts of the memory they came from.

  • Board tasks: about 42% smaller than YAML per task, and 51% as one board document.

  • Symbols: 16 of the 17 marks are one token on every tokenizer we ran. /# is two tokens after a space, which is where it appears in a routing line.

  • Not measured: the Claude and Gemini tokenizers (their token-count services refused our keys; Gemma 3 stands in for Gemini), and whether a model understands an OPVS message as well as a JSON one.

OPVS message saving against each baseline, five tokenizers, with 95% intervals

Method

The question. How many tokens does the same information take in OPVS, compared with the formats agents use today?

  1. One record, every format, written by a program. Each test message is one record with the fields of an OPVS message. Eight renderers turn it into OPVS, indented JSON, compact JSON, the JSON style of the original paper, A2A JSON-RPC (message/send, spec 0.3), YAML, FIPA-style XML and plain English. The OPVS text is written by the shipped OPVS formatter and read back by the shipped parser. Nothing in any format is written by hand, so no format can be tuned against another.

  2. Every format carries the same information. A field that is empty, or at its default, is left out of every format, because OPVS leaves it out. Routing fields that A2A has no slot for go in its metadata.

  3. The test set. All synthetic, with no real mail or memories:

    • 240 messages across 12 kinds of work (support, sales, research, status, engineering, scheduling, billing, incidents, content, data enrichment, people, hand-offs), one third each with a short (1 sentence), medium (2–4) or long (5–9) body.

    • 51 memories of six kinds, each written as a list of facts, with a short OPVS note and a record of which facts the note keeps, written before any count.

    • 50 board tasks.

    • The original paper's 6 messages and 10 memories, rendered by the same programs, to compare with its numbers.

  4. Five tokenizers. OpenAI cl100k_base and o200k_base (tiktoken 0.12.0); Gemma 3, Qwen 2.5 and Llama 3.2 (Hugging Face tokenizers 0.22.1, each file pinned by revision and SHA-256).

  5. Statistics. For each tokenizer and baseline: the total saving (1 − all OPVS tokens ÷ all baseline tokens) with a 95% bootstrap interval (10,000 resamples, fixed seed), and the per-message spread. Breakdowns by body length, address form and "envelope only" (the message with its body removed) were fixed in advance.

Left out, as the method required: the 16 messages that use a sub-address (@alice+task1>bob). The parser of 8 November read them back wrong, so their OPVS form was not a correct message. That leaves 224 messages. The parsers have been fixed since (see Versions and changes).

One change after the first count: our own XML renderer repeated the message kind. Fixing it moved the XML saving from 55.6% to 55.2% (o200k). It is recorded in the method file with every other change.

Results

Messages (224)

Total saving of OPVS against each format, with the 95% interval:

Compared with

OpenAI cl100k_base

OpenAI o200k_base

Gemma 3

Qwen 2.5

Llama 3.2

indented JSON

42.2% (40.5–43.9)

42.2% (40.6–44.0)

46.8% (45.1–48.5)

41.4% (39.7–43.1)

42.1% (40.5–43.9)

compact JSON

20.9% (19.7–22.2)

22.1% (20.8–23.4)

21.9% (20.7–23.2)

20.4% (19.2–21.7)

20.8% (19.6–22.1)

the paper's JSON style

32.7% (31.2–34.3)

32.7% (31.2–34.3)

32.5% (31.0–34.0)

32.0% (30.5–33.5)

32.6% (31.1–34.2)

A2A JSON-RPC

47.9% (46.2–49.7)

48.5% (46.7–50.3)

48.0% (46.3–49.8)

48.3% (46.6–50.1)

47.9% (46.2–49.7)

YAML

23.3% (22.3–24.5)

23.4% (22.3–24.5)

25.5% (24.4–26.7)

22.8% (21.7–23.9)

23.3% (22.3–24.5)

XML (FIPA)

54.9% (53.1–56.7)

55.2% (53.4–57.0)

56.7% (54.9–58.5)

54.1% (52.3–55.9)

54.9% (53.1–56.7)

plain English

6.3% (5.5–7.1)

6.0% (5.2–6.8)

5.6% (4.9–6.4)

6.1% (5.3–6.9)

6.2% (5.5–7.1)

One number hides a wide spread. Per message (o200k), the saving against compact JSON runs from 6% to 47% (median 25%; 10th–90th percentile 12–40%). Against plain English it runs from −10% to +31%: for 17 of the 224 messages the plain sentence is shorter, and 12 more come out even.

What decides the saving: the body

The body is the same text in every format, so the longer it is, the smaller the saving (o200k):

Compared with

short body (73)

medium body (74)

long body (77)

routing only, no body

compact JSON

34.3%

25.9%

15.4%

39.8%

A2A JSON-RPC

64.4%

53.7%

36.8%

69.5%

YAML

34.7%

25.9%

17.9%

40.2%

plain English

11.6%

7.5%

3.4%

14.8%

The last column is what the notation itself does. The address form changes little: 20–25% against compact JSON for every form (direct, domain, pool, team, everyone).

The paper's own 6 messages, rendered by the same programs, give 37.8% against the paper's JSON style (cl100k), close to the paper's 38%. So the paper's figure is fair for those six short messages; on a wider mix of messages the same JSON style gives 33%.

Memory notes (51)

Tokens of each format ÷ tokens of the OPVS note (above 1 means the OPVS note is smaller):

Compared with

OpenAI cl100k_base

OpenAI o200k_base

Gemma 3

Qwen 2.5

Llama 3.2

the full memory as prose

1.07x

1.06x

0.99x

0.98x

1.07x

the note as one plain sentence

0.88x

0.88x

0.90x

0.90x

0.88x

the note as compact JSON

1.17x

1.20x

1.15x

1.15x

1.17x

the note as indented JSON

1.79x

1.79x

1.92x

1.70x

1.79x

the note as YAML

1.21x

1.21x

1.22x

1.18x

1.21x

Why this is not the paper's 2.7x. The paper compared its notes with wordy prose: its ten prose memories average 92 tokens (cl100k) and their notes 33, and our programs reproduce its ratio on them (2.74x). Our 51 memories are written as short, plain facts (42 tokens on average; their notes 39). A ratio against prose measures how wordy the prose was. The rows that hold the same note in each format measure the notation.

Fidelity. A note is a summary. Our notes keep 160 of 185 facts (86.5%), and 32 of 51 keep all of them. The paper's ten notes keep 24 of 31 facts. A note is not a lossless copy of the memory.

In a 5,000-token budget: 127 OPVS notes against 119–120 prose memories (cl100k and o200k), and 113 against 114 on Gemma 3.

Board tasks (50)

Compared with

cl100k_base

o200k_base

Gemma 3

Qwen 2.5

Llama 3.2

YAML

42.4%

42.5%

40.6%

40.7%

42.4%

compact JSON

42.7%

44.5%

38.1%

41.0%

42.4%

indented JSON

66.5%

66.6%

68.4%

65.0%

66.4%

As one board document (all 50 tasks together), OPVS uses 1,160 tokens against 2,349 for YAML (o200k), a saving of 51%.

Symbols

All 17 marks were counted alone and after a space. 16 are one token in both positions on all five tokenizers. /# (not this tag) is one token alone but two after a space ( / + #), and in a routing line it always follows a space. Four marks (::, /#, <-, !=) are two characters long.

What this changes in earlier claims

Earlier claim

What the tests show

"38% fewer tokens than JSON"

21% against compact JSON, 42% against indented JSON, 33% against the paper's JSON style. 38% holds only for the paper's six messages.

"48% fewer than A2A"

Holds: 48%.

"57% fewer than XML"

54–57% depending on the tokenizer.

"55–60%", "over 60%", "60% lower token overhead"

Withdrawn. No JSON style comes near 60% in total; over 60% happens only for short messages against A2A or XML.

Memories "2.7x smaller", "10x", "5–15x", "full fidelity"

Withdrawn. The notation saves 13–18% against JSON or YAML holding the same note; notes keep 86% of the facts.

Board tasks "85% smaller than YAML"

Withdrawn: about 42% per task, 51% as one document.

"Each symbol is a single token in all major tokenizers"

16 of 17 on the five tokenizers we ran; Claude and Gemini not measured.

Limits

  1. Two major tokenizers are missing. The Claude and Gemini token-count services refused our keys. Gemma 3 stands in for Gemini (Google describes its tokenizer as Gemini 2.0's; later Gemini models may differ). The five tokenizers we ran agree within 6 points everywhere, which suggests, but does not show, that the other two would too.

  2. We wrote the test set. An AI session working for OPVS wrote the bodies, memories and tasks. Rendering by program stops one format being tuned against another, but the mix of bodies, lengths and fields is still ours. It is published in full so that others can replace it.

  3. The body length mix sets the headline. More long messages shrink every saving; more short ones grow it. The body-length table gives each length separately.

  4. Baseline choices move the numbers. We used OPVS's own field names and flat objects, which favour JSON, and an A2A shape that carries the same fields as OPVS. Shorter key names, or another A2A shape, give other numbers.

  5. Tokens are not quality. We measured size only. We did not test whether a model understands, routes or answers an OPVS message as well as a JSON one.

  6. Memory notes are an author's choice. How short a note is, and which facts it keeps, decides both its size and its fidelity.

  7. Live use is not measured. These are test messages, not counts from OPVS mail in use.

  8. What we knew beforehand. Before the method was written, the paper's six messages had already been measured against compact JSON (about 22–24%). The method file says so.

Data

File

What it is

opvs-field-tests-2026-11-08.zip

everything in one file: the method, the test set in every format, the scripts, the raw counts (counts.csv, 22,530 rows: item × format × tokenizer) and the results

METHOD.txt

the plan, written before the first count, and every later change

tables.txt

every results table, with the per-message spread for each tokenizer

summary.json

the results, machine-readable

chart.svg

the chart above

Reproduce

Download the zip, then run one command. It needs Python 3.10 or later and internet access the first time (pinned packages and three tokenizer files, each checked against its SHA-256):

unzip opvs-field-tests-2026-11-08.zip && cd opvs-field-tests && bash reproduce.sh

It counts every item of the published test set on all five tokenizers, recomputes every table, and checks that the results match the published ones byte for byte. With ANTHROPIC_API_KEY or GEMINI_API_KEY set, it also counts the Claude or Gemini tokenizer.

Rebuilding the test set itself (build_corpus.py) uses the OPVS Python parser, which is not published as a package yet (see Parser libraries).

Field tests | OPVS