Instruction-following test: 15 AI models, 32 checkable tasks

We gave 15 open models 32 prompts, each with 1 to 3 rules a program can verify (exact word and sentence counts, bullet counts, forbidden words, JSON keys, casing), 3 runs each. Llama 3.2 3B passed 82% (71% to 93%) of trials strictly; TinyLlama 1.1B Chat 16% (7% to 28%). Small local models only; no vendor chatbots; indicative, not a benchmark.

Tested by us on 2026-10-26 (America/Chicago): open-weight models run locally on a CPU-only machine; every rule is verified by code, with no model judge. Original prompts in the style of IFEval, not the IFEval dataset. Indicative, not a benchmark.

Instruction following at a glance Every rule checked by code; no model judge.

Strict pass rate (%): every rule met

Llama 3.2 3B (winner)82% out of 100%
Gemma 2 2B80% out of 100%
Granite 3.3 2B79% out of 100%
Qwen2.5 7B77% out of 100%
Qwen3 1.7B (non-thinking)77% out of 100%
Falcon3 3B75% out of 100%
Gemma 3 1B71% out of 100%
Llama 3.2 1B68% out of 100%
Qwen2.5 3B67% out of 100%
SmolLM2 1.7B67% out of 100%
Qwen3 0.6B (non-thinking)67% out of 100%
Phi-3.5 mini66% out of 100%
Qwen2.5 1.5B53% out of 100%
Qwen2.5 0.5B34% out of 100%
TinyLlama 1.1B Chat16% out of 100%

Results

Strict = every rule in the prompt met. Counts are trials (32 prompts x 3 runs). The interval is 95%, from resampling prompts. Loose = share of individual rules met. Speed is native Ollama generation speed on a shared CPU (indicative)
RankModelStrict passesStrict pass rate (95% interval)Loose rule pass rateMedian tokens/sMedian seconds per answer
1Llama 3.2 3B79 of 9682% (71% to 93%)89%19.53.90
2Gemma 2 2B77 of 9680% (70% to 90%)85%22.22.48
3Granite 3.3 2B76 of 9679% (67% to 91%)87%14.27.08
4Qwen2.5 7B74 of 9677% (65% to 90%)85%5.311.22
5Qwen3 1.7B (non-thinking)74 of 9677% (64% to 89%)85%32.51.59
6Falcon3 3B72 of 9675% (60% to 88%)82%14.34.95
7Gemma 3 1B68 of 9671% (55% to 84%)79%42.11.65
8Llama 3.2 1B65 of 9668% (54% to 81%)80%39.01.75
9Qwen2.5 3B64 of 9567% (52% to 81%)77%17.33.17
10SmolLM2 1.7B64 of 9667% (52% to 80%)78%36.81.77
11Qwen3 0.6B (non-thinking)64 of 9667% (51% to 79%)78%59.60.72
12Phi-3.5 mini63 of 9666% (51% to 79%)76%13.98.33
13Qwen2.5 1.5B51 of 9653% (39% to 68%)69%28.21.98
14Qwen2.5 0.5B33 of 9634% (21% to 49%)53%58.10.82
15TinyLlama 1.1B Chat15 of 9516% (7% to 28%)28%31.96.26

Why intervals come from prompts: the 3 runs of one prompt are not independent, so a plain binomial interval would be too narrow. The raw pass counts per model are published in ifeval-results.json, including Wilson intervals on the pooled counts.

What we found

  • Llama 3.2 3B passed 79 of 96 trials strictly (every constraint met), 82% (71% to 93%); TinyLlama 1.1B Chat passed 15 of 95, 16% (7% to 28%). Intervals come from resampling the 32 prompts.
  • Hardest prompts (pooled across models): i21 (3 of 45 passed), i29 (9 of 45 passed), i30 (13 of 45 passed), i16 (18 of 45 passed). Easiest: i14 (45 of 45), i12 (45 of 45), i15 (42 of 45).
  • Hard-constraint types that trip small models most: exact_words (3 of 45), word_at_least (18 of 45), between_words (23 of 45), no_commas (80 of 135).
  • Run-to-run consistency: the number of the 32 prompts a model passed (or failed) on all 3 runs ranged from 21 to 29; the rest flipped between runs at temperature 0.7.

Pass counts by rule type

Rules passed / rules tried, per model, by rule type
Rule typeLlama 3.2 3BGemma 2 2BGranite 3.3 2BQwen2.5 7BQwen3 1.7B (non-thinking)Falcon3 3BGemma 3 1BLlama 3.2 1BQwen2.5 3BSmolLM2 1.7BQwen3 0.6B (non-thinking)Phi-3.5 miniQwen2.5 1.5BQwen2.5 0.5BTinyLlama 1.1B Chat
all_lowercase6/66/64/65/66/66/66/66/66/64/66/64/66/60/60/6
all_uppercase3/65/65/66/66/62/63/66/66/66/66/66/66/62/60/6
between_words3/32/30/30/32/30/33/33/32/32/31/32/31/32/30/3
bold_sections3/31/33/33/33/33/33/33/33/33/33/33/33/31/30/3
ends_with6/66/62/66/66/63/66/61/64/64/64/65/64/62/60/6
exact_bullets6/65/66/66/66/66/60/66/63/56/66/60/66/65/60/6
exact_numbered3/33/33/33/33/33/33/33/33/33/33/31/33/33/30/3
exact_paragraphs3/33/33/31/33/33/33/32/31/33/32/31/30/30/30/3
exact_sentences17/2120/2121/2112/2112/2113/2117/2116/2112/2111/218/2117/2112/219/214/21
exact_words2/30/30/31/30/30/30/30/30/30/30/30/30/30/30/3
forbid_words12/1212/1210/1212/128/1211/1212/1212/1211/128/1212/1212/1210/126/121/12
include_words9/98/97/97/98/98/96/96/95/98/99/96/96/96/97/9
json_keys6/99/98/99/99/99/99/97/99/99/99/99/97/93/93/9
letter_at_least3/32/33/33/33/33/33/32/33/33/33/33/33/32/31/2
max_words8/99/99/99/99/99/99/97/99/99/98/97/97/99/93/9
min_words9/99/99/96/96/96/99/99/93/99/95/99/97/98/99/9
no_commas9/94/96/99/97/99/97/99/96/93/92/91/92/93/93/9
one_of3/33/33/33/33/33/33/33/33/33/33/33/33/33/30/3
placeholders_at_least4/63/66/66/66/65/66/63/66/64/66/66/66/63/63/6
postscript6/66/66/66/66/66/63/63/66/66/65/65/60/61/61/6
starts_with6/66/66/66/66/66/66/66/66/66/66/66/66/66/62/6
title_brackets6/65/66/66/66/66/66/66/66/66/65/66/66/66/60/6
word_at_least0/31/33/31/33/32/30/30/30/31/33/32/30/30/32/3
wrap_quotes6/65/66/66/66/66/60/65/66/65/66/65/64/63/64/6

How the test works

  1. We wrote 32 prompts with 52 rules in all, in the style of the public IFEval idea (verifiable instructions) but entirely our own; scores are not comparable with published IFEval numbers.
  2. Each model answers each prompt 3 times (temperature 0.7, top-p 0.9, fixed seeds, up to 350 tokens), as the only message with no system prompt.
  3. A program checks every rule. A trial passes strictly only if all of its rules pass. The checkers have their own self-test with known good and bad answers (ifselftest.mjs).
  4. No model judges anything in this test, so the results do not depend on a rater.

Every prompt and its rules

Prompt text and the rules checked by code
PromptTaskRules
i01Write a short note thanking a neighbour for watering your plants. Use exactly 3 sentences.exact sentences (n=3)
i02Explain what a firewall does. Your answer must be at most 40 words and must not use the word 'network'.max words (n=40); forbid words (words=network)
i03List three tips for sleeping better. Use exactly 3 bullet points, each starting with '- ', and write nothing before or after the bullets.exact bullets (n=3)
i04Describe a lighthouse in at least 60 words. Include the words 'storm' and 'beacon'.min words (n=60); include words (words=storm/beacon)
i05Write a two-sentence description of autumn. Write it entirely in lowercase letters, with no capital letters at all.all lowercase; exact sentences (n=2)
i06Give a one-sentence reminder to back up your files. WRITE THE WHOLE ANSWER IN CAPITAL LETTERS.all uppercase; exact sentences (n=1)
i07Describe how to make toast without using any commas anywhere in your answer. Keep it under 60 words.no commas; max words (n=59)
i08Write a short poem about the sea. Put a title in double angular brackets, like <<Title Here>>, somewhere in your answer.title brackets
i09Write a friendly message inviting a friend to dinner. End your message with the exact phrase 'See you soon.' and nothing after it.ends with (text=See you soon.)
i10Write a short apology email to a colleague who was left out of a meeting. After the main text, add a postscript that begins with 'P.S.'.postscript (marker=P\.S\.)
i11Write a two-paragraph description of a farmers' market. Separate the two paragraphs with a blank line and write exactly 2 paragraphs.exact paragraphs (n=2)
i12Write a template for a job-offer letter. Include at least 3 placeholders in square brackets, such as [candidate name].placeholders at least (n=3)
i13Give a numbered list of exactly 4 steps for changing a flat bike tyre. Use the format '1. ', '2. ', and so on, with nothing else in the answer.exact numbered (n=4)
i14Reply with only a JSON object (no explanation) that has the keys "name" (string), "age" (integer) and "hobbies" (an array of strings) for an imaginary person.json keys (keys=name/age/hobbies, exact=true, types={"name":"string","age":"integer","hobbies":"array"})
i15Is the Pacific the largest ocean on Earth? Answer with exactly one word: either 'Yes' or 'No'.one of (options=Yes/No)
i16Write a sentence about rivers that contains the word 'water' at least three times.word at least (word=water, n=3)
i17Write a single sentence about a cat. Wrap your entire response in double quotation marks.wrap quotes; exact sentences (n=1)
i18Write a short review of a fictional cafe. Use at least 2 bold phrases written like this.bold sections (n=2)
i19Begin your answer with the exact words 'Honestly,' and then give one reason to learn to cook. Use exactly 2 sentences.starts with (text=Honestly,); exact sentences (n=2)
i20Write 50 to 70 words about why bees matter. Do not use the words 'honey' or 'flowers'.between words (lo=50, hi=70); forbid words (words=honey/flowers)
i21Write exactly 25 words describing a mountain village. Count carefully; the answer must be exactly 25 words.exact words (n=25)
i22Describe a thunderstorm in which the letter 'z' appears at least 3 times in total.letter at least (letter=z, n=3)
i23Reply with only a JSON object listing three programming languages under the key "languages" (array of exactly 3 strings) and one under the key "favourite" (string).json keys (keys=languages/favourite, exact=true, types={"languages":"array","favourite":"string"}, arrayLen={"languages":3})
i24Write a product tagline in lowercase only, without commas, in under 12 words.all lowercase; no commas; max words (n=11)
i25Write a short story of at least 90 words about a lost key. Put a title in double angular brackets, like <<Title>>, somewhere in your answer.title brackets; min words (n=90)
i26Give exactly 5 bullet points (each starting with '* ') on how to save money on groceries, and nothing else.exact bullets (n=5)
i27Write a short email declining a meeting invitation. It must include the word 'unfortunately', must not include the word 'sorry', and must end with a line starting with 'P.P.S.'.include words (words=unfortunately); forbid words (words=sorry); postscript (marker=P\.P\.S\.)
i28Reply with only a JSON object with a key "steps" holding an array of exactly 3 short strings for how to boil an egg.json keys (keys=steps, exact=true, types={"steps":"array"}, arrayLen={"steps":3})
i29Write about the benefits of walking. Use at least 80 words and at least 2 placeholders in square brackets like [name], and do not use any commas.min words (n=80); placeholders at least (n=2); no commas
i30WRITE TWO SENTENCES ABOUT THE MOON IN ALL CAPITAL LETTERS, and do not use the word 'night'.all uppercase; exact sentences (n=2); forbid words (words=night)
i31Write a message of exactly 2 sentences that starts with the word 'Dear' and ends with the exact phrase 'Best wishes.'starts with (text=Dear); ends with (text=Best wishes.); exact sentences (n=2)
i32Write a one-line slogan for a bakery, wrapped in double quotation marks, using the word 'fresh' at least once.wrap quotes; include words (words=fresh)

Limitations

  • All contestants are small open-weight models (0.5B to 8B, mostly Q4_K_M) on CPU. Hosted frontier models were not available to us and are not included.
  • 32 prompts is a small set; one prompt can swing a model by 3%.
  • Rule checks are strict by design (for example a leading preamble breaks "only a list" rules). Sentence counting uses a simple splitter.
  • Speed was measured on a shared machine under varying load, so tokens per second are indicative.
  • 1438 of 1440 planned trials are in the data; the others were aborted by the inference server (it stops a generation that repeats itself endlessly) and are excluded rather than counted as passes or failures, which slightly flatters the affected models. The rater model of the writing test (Mistral 7B) was not run on this test.

Raw data and code

Reproduce
# models are served by Ollama; add a contestant with one line in config.mjs
node scripts/tests/writing/generate.mjs      # 14 prompts x 3 runs per model (resumes)
node scripts/tests/writing/judge.mjs rubric   # single-answer rubric ratings
node scripts/tests/writing/judge.mjs pairwise # blind A/B, both orders
node scripts/tests/writing/ifrun.mjs          # instruction-following test
node scripts/tests/writing/aggregate.mjs && node scripts/tests/writing/build-pages.mjs

FAQ

Which model follows instructions best in this test?

Llama 3.2 3B Instruct had the highest strict pass rate (82% (71% to 93%)) among the 15 open models we could run. It says nothing about hosted frontier models.

How is this checked?

By code: exact word and sentence counts, bullet counts, forbidden and required words, JSON keys and types, casing, start and end phrases. No model acts as judge.

Markdown version for agents: /tests/instruction-following.md