Using tags and formatting

Do XML tags beat markdown?

We could not measure this one. Both ways of marking up the prompt scored full marks, so the test could not tell them apart.

Why it matters

When everything passes, the test is measuring the task, not the technique.

Inconclusive

Every model scored full marks with and without it, so the task set separated nothing. Those results are tested via API. Also measured in Claude Code and Codex, reported separately on this page and never averaged with this.

All 8 models tested already passed this without the change, and still passed with it.

There is no chart here because there is no shape to draw: every value sits at one end of the scale, the models agree, and no range of likely values is wide enough to see. The per-model numbers are in the tables below.

tested via API · Could not measure on Claude Haiku 4.5, tested via API · Could not measure on GPT-5 mini, tested via API · Could not measure on Gemini 3.1 Flash Lite, tested via API

tested in Claude Code · Could not measure on Claude Fable 5, tested in Claude Code · Could not measure on Claude Opus 5, tested in Claude Code · Could not measure on Claude Haiku 4.5, tested in Claude Code · Could not measure on Claude Sonnet 5, tested in Claude Code · Could not measure on Claude Fable 5.1, tested in Claude Code

tested in Codex · Could not measure on GPT-5.4 mini, Codex run on GPT-5.4 mini, tested in Codex · No measured effect on GPT-5.6 Luna, Codex run on GPT-5.6 Luna, tested in Codex · Could not measure on GPT-5.6 Terra, Codex run on GPT-5.6 Terra, tested in Codex

What the marks mean

  • Could not measure
Show per-task detail

Every item, without and with, per model

Via API tested via API

  • Claude Haiku 4.5
  • Gemini 3.1 Flash Lite
  • GPT-5 mini

deterministic pass rate, 0 to 1

Hover or focus an item to read its task and every model’s two values.

Pooled: the interval is taken over the records, not these means. These are those same records collapsed per item, so where an item carries more passes than another the lines need not average to the figure the table prints.

The item means behind this plot
Per-item arm means. Without is the unaided arm, with is the treated arm.
ItemClaude Haiku 4.5 Gemini 3.1 Flash Lite GPT-5 mini
Task without with without with without with
t01 1.000 1.000 1.000 1.000 1.000 1.000
t02 1.000 1.000 1.000 1.000 1.000 1.000
t03 1.000 1.000 1.000 1.000 1.000 1.000
t04 1.000 1.000 1.000 1.000 1.000 1.000
t05 1.000 1.000 1.000 1.000 1.000 1.000
t06 1.000 1.000 1.000 1.000 1.000 1.000
t07 1.000 1.000 1.000 1.000 1.000 1.000
t08 1.000 1.000 1.000 1.000 1.000 1.000
t09 1.000 1.000 1.000 1.000 1.000 1.000
t10 1.000 1.000 1.000 1.000 1.000 1.000

In Claude Code tested in Claude Code

  • Claude Fable 5
  • Claude Fable 5.1
  • Claude Haiku 4.5
  • Claude Opus 5
  • Claude Sonnet 5

deterministic pass rate, 0 to 1

Hover or focus an item to read its task and every model’s two values.

Pooled: the interval is taken over the records, not these means. These are those same records collapsed per item, so where an item carries more passes than another the lines need not average to the figure the table prints.

The item means behind this plot
Per-item arm means. Without is the unaided arm, with is the treated arm.
ItemClaude Fable 5 Claude Fable 5.1 Claude Haiku 4.5 Claude Opus 5 Claude Sonnet 5
Task without with without with without with without with without with
t01 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
t02 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
t03 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
t04 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
t05 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
t06 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
t07 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
t08 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
t09 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
t10 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
A picture of the per-item means behind the per-model numbers. The tables are the source. Each model draws two lines over the same task set: a dashed line through its unaided scores and a solid line through its treated ones. Items are ordered by the mean unaided score across the models that measured them, lowest first. The two instruments are reported separately and never averaged.

Result

XML tag delimiters showed no separation on all three models tested via API, where every model scored full marks with and without it, and could not be measured on all five models tested in Claude Code, and could not be measured on GPT-5.4 mini via the Codex run on GPT-5.4 mini, and showed no measured effect on GPT-5.6 Luna via the Codex run on GPT-5.6 Luna, and could not be measured on GPT-5.6 Terra via the Codex run on GPT-5.6 Terra. Measured 2026-08-12.

Show the per-model numbers

Claim tested: XML tag delimiters improve instruction compliance over markdown headers on a multi-constraint task.

Could not be measured on Claude Haiku 4.5, GPT-5 mini and Gemini 3.1 Flash Lite.

Circulates in practitioner communities. Tested because it circulates, not because it is endorsed.

This tip is OpenAddict's plain-language read of the measured result. The measurement below is the evidence, and it is what the reading has to answer to.

Ledger idC03-xml-delimiters

Clarification, . Until 2026-08-31 this figure read 5, which was the pass count rather than a number of calls. What changed, and why it is filed once.

What was tested

This claim circulates in practitioner communities as advice about how to write prompts. That it circulates is an input to what gets tested here. It is a reason to test the claim, and it is not evidence for or against it. The result below is the evidence, and it is the only thing on this page that carries weight.

The comparison is paired. Two prompts differ in one respect, the manipulated variable, and are otherwise identical by construction. Nothing here supports a causal reading beyond that pairing.

Per-model numbers

Per-model results. Means are over valid scored records only. Invalid records are excluded from every denominator and counted in coverage.
MeasureClaude Haiku 4.5GPT-5 miniGemini 3.1 Flash Lite
Control arm1.000n 501.000n 501.000n 50
Treatment arm1.000n 501.000n 501.000n 50
Delta+0.000+0.000+0.000
Interval, 95 percent0.000 to 0.0000.000 to 0.0000.000 to 0.000
OrbitUnobservable100 of 100 recordsUnobservable100 of 100 recordsUnobservable100 of 100 records
Same answer on a repeat20 of 20repeated tasksat temperature 020 of 20repeated tasksat the vendor default20 of 20repeated tasksat temperature 0
  • Claude Haiku 4.5. It gave the same answer on 20 of 20 repeated tasks. Those answers were held at temperature 0.
  • GPT-5 mini. It gave the same answer on 20 of 20 repeated tasks. Those answers were at the vendor's own default setting, because it refused temperature 0.
  • Gemini 3.1 Flash Lite. It gave the same answer on 20 of 20 repeated tasks. Those answers were held at temperature 0.

A separate run asked each of these tasks five times, with no tip applied. Its figures are not part of the table above.

  • GPT-5 mini. Asked each task five times, it gave the same answer all five times on 10 of 10. The likely range for that share is 72 to 100 percent. Those answers were at the vendor's own default setting, because it refused temperature 0.
  • Gemini 3.1 Flash Lite. Asked each task five times, it gave the same answer all five times on 10 of 10. The likely range for that share is 72 to 100 percent. Those answers were held at temperature 0.

Orbit is assigned by the frozen status_v1 rule. On this scale, deterministic pass rate, 0 to 1, the pass threshold is +0.20 and the failure floor is -0.20, each requiring an interval that excludes zero.

In Claude Code

These cells are tested in Claude Code, on a subscription path with no API key. They are a second instrument and are never averaged with the figures above, which are tested via API. What that means, and how it was calibrated.

Single-turn cells, replayed from the committed claims on the Claude Code CLI.
ModelControlTreatmentDeltaIntervalPairsOrbit
Claude Fable 51.00001.0000+0.0000.000 to 0.00050Unobservable
Claude Opus 51.00001.0000+0.0000.000 to 0.00050Unobservable
Claude Haiku 4.51.00001.0000+0.0000.000 to 0.00050Unobservable
Claude Sonnet 51.00001.0000+0.0000.000 to 0.00050Unobservable
Claude Fable 5.11.00001.0000+0.0000.000 to 0.00050Unobservable

Two separate runs asked each of these tasks five times, with no tip applied. Claude Fable 5 was asked in the later one, the same way. Their figures are not part of the table above.

  • Claude Fable 5. Asked each task five times, it gave the same answer all five times on 10 of 10. The likely range for that share is 72 to 100 percent. Those answers were with no sampling control, which this way of testing does not offer.
  • Claude Opus 5. Asked each task five times, it gave the same answer all five times on 10 of 10. The likely range for that share is 72 to 100 percent. Those answers were with no sampling control, which this way of testing does not offer. Added 25 September 2026, as a report and not a finding. Outside reports say an unreleased Opus 5.2 answered some requests sent to Opus 5 between 14 and 17 September. Every answer in this run was made on 17 September. Each one names Opus 5 as the model that answered. That name would not have told the two apart, so this run cannot say whether it was affected.
  • Claude Haiku 4.5. Asked each task five times, it gave the same answer all five times on 10 of 10. The likely range for that share is 72 to 100 percent. Those answers were with no sampling control, which this way of testing does not offer.
  • Claude Sonnet 5. Asked each task five times, it gave the same answer all five times on 10 of 10. The likely range for that share is 72 to 100 percent. Those answers were with no sampling control, which this way of testing does not offer.
  • Claude Fable 5.1. Asked each task five times, it gave the same answer all five times on 10 of 10. The likely range for that share is 72 to 100 percent. Those answers were with no sampling control, which this way of testing does not offer.
A separate run, each task asked once: Opus 5.5, on the same tasks. With one answer per task its range is wider than the table above, and the two are never averaged.
ModelControlTreatmentDeltaIntervalPairsOrbit
Claude Opus 5.51.00001.0000+0.0000.000 to 0.00010Unobservable

Method for this claim

Task set
10 writing tasks, each carrying three independently checkable constraints. The constraint text is identical between arms; only the delimiter style around the sections differs. Hardened for instrument v2: v1 carried three constraints in a short task, which both delimiter styles satisfied every time. v2 carries five constraints, embeds them in a longer brief that also contains prose the model could mistake for instructions, and places a decoy sentence between the task and the rules. Delimiter clarity now has work to do.
Runs per model per arm
5 passes x 10 items
Scoring
Deterministic, via scoreConstraintCompliance. A committed function scores each answer with no model in the loop.
Pass criterion as written for the pilot
Treatment full-compliance rate exceeds control by at least 10 percentage points on the same 10 tasks.

The published verdict comes from status_v1, not from the pass criterion above. The criterion is recorded because it is what the claim was registered with before the run.

Model versions, as recorded

Read from the run records, not from configuration.
ModelVersion string returnedDelta on this claimInterval
Claude Haiku 4.5claude-haiku-4-5-20251001+0.0000.000 to 0.000
GPT-5 minigpt-5-mini-2025-08-07+0.0000.000 to 0.000
Gemini 3.1 Flash Litegemini-3.1-flash-lite+0.0000.000 to 0.000

Reading across models

Sampling was not held constant across vendors, so comparing one model column against another compares two settings as well as two models.

GPT-5 mini rejected the fixed sampling setting and ran at its own default on all 1,040 of its calls. The other models ran at temperature 0.

The tip above is editorial. Every figure inside the measurement is computed at build time from the committed pilot records by the status_v1 rule, and none of it is written by hand.