ProvenPin Install
● Benchmark · October 17, 2026

Token test: with a recipe vs without

We gave a model 20 coding tasks, once with just the task and once with the matching ProvenPin recipe. Here is what happened, including the parts that don't look good for us.

The short version

Recipes did not cut total tokens. With a recipe, the model used 6.9% more tokens in total, because the recipe itself adds input. But it wrote far less: output tokens dropped 63%. Output costs more than input, so the runs with a recipe cost about 45% less, ran about 2.4x faster, and needed fewer fixes (2 vs 8).

+6.9%total tokens
-63%output tokens
~45%lower cost
~2.4xfaster (median)

Side by side

Task onlyTask + recipe
Passed in the end60/6060/60
Passed on the first try52/6058/60
Fix attempts82
Total tokens314,215335,994
Input tokens89,765252,953
Output tokens224,45083,041
Cost (all 60 runs)$0.121$0.067
Median model time per run14.2 s5.8 s

60 runs per side. Cost uses the model's list price: $0.10 per million input tokens, $0.50 per million output tokens.

How we ran it

  • Tasks: 20 (10 Python, 10 TypeScript). They were picked by a fixed rule before any model call: for each of the most common library stacks in our recipes, the first recipe for that stack in alphabetical order. One task was swapped before any run, because its reference recipe would not install on our test machine.
  • Model: claude-haiku-5-5, the same on both sides. Its temperature can't be set, so every task ran 3 times per side. That's 120 runs, and all of them are reported.
  • Task only: the task text, the pinned versions, the files to write, and the recipe's test files.
  • Task + recipe: the same, plus the top result from our MCP server's search_recipes for that task, fetched with get_recipe. The recipe counts as input tokens.
  • Grading: the model's files were run against the recipe's own tests, installed on its pinned versions. If tests failed, the model got up to 2 fix attempts with the failing test output. Same rule on both sides. Tokens from every call are counted.
  • When: October 17, 2026, between about 6:24 and 6:55 PM Alaska time.

Where it didn't help

  • With a recipe, total tokens were lower on only 5 of 20 tasks. On the other 15, the recipe added about 2,100 to 4,200 input tokens per run, and the output it saved didn't cover that.
  • On fastify-json-schema, search returned the wrong recipe all 3 times. Those runs still passed, but used more tokens than the task alone, and it was the one task where output didn't go down.
  • On easy tasks, the model was already cheap without help, so the recipe mostly added input.

Limits

  • Small sample: 20 tasks, 3 runs each, one model, one day.
  • The tasks come from our own recipes and are graded by our own tests. With a recipe, the model gets a solution that already passes, so its pass rate is close to the ceiling by design. This measures what it costs to reach passing code, not general coding skill.
  • The task text is the recipe's own title and summary, so search had it easy. Real users will word things differently.
  • Both sides saw the test files. That makes things easier for the task-only side.
  • Without a recipe, billed output tokens were much higher than the visible reply text. That's likely the model's internal reasoning being billed as output. We haven't verified it.
  • Model time leaves out the 0.5 to 1 second it took to fetch the recipe.

Every task

Median tokens over 3 runs per side. Green means the recipe side used fewer total tokens.

TaskLangTotal tokensOutput tokensFixesRight recipe
Task only+ RecipeTask only+ Recipeonly vs +found
ajv-formats-json-schemaTypeScript3,3814,0172,5871,0581 vs 03/3
better-sqlite3-zod-transactionsTypeScript6,5617,3925,0932,0931 vs 03/3
celery-beat-schedule-crontabPython5,2624,2134,4661,0261 vs 03/3
django-celery-eager-signalsPython13,8076,6329,8401,4323 vs 03/3
drizzle-pglite-migrationsTypeScript5,4366,4904,3381,8670 vs 03/3
express-helmet-rate-limitTypeScript2,3703,7701,4747680 vs 03/3
fastapi-argon2-loginPython2,7265,4571,4231,1200 vs 03/3
fastify-json-schemaTypeScript2,0174,7721,3621,4901 vs 10/3
flask-jwt-extended-authPython2,9754,2342,1789300 vs 03/3
graphql-js-schema-executeTypeScript4,0245,8962,8761,5710 vs 03/3
hono-jwt-authTypeScript2,5204,0851,6529820 vs 03/3
httpx-pydantic-typed-clientPython3,8494,9542,6941,0930 vs 03/3
i18next-react-ssrTypeScript4,3635,2743,2291,3470 vs 03/3
jsonwebtoken-hs256-rs256TypeScript7,3228,1014,9751,5220 vs 13/3
pandas-openpyxl-excel-reportPython5,3055,7564,2421,8620 vs 03/3
pydantic-annotated-after-validatorPython5,2735,0214,3441,3160 vs 03/3
pydantic-settings-dotenv-secretsPython4,1536,0242,8411,5770 vs 03/3
rich-typer-progress-cliPython7,3325,3996,3701,5600 vs 03/3
sqlalchemy-aiosqlite-session-factoryPython2,5804,7971,3966740 vs 03/3
zod-env-dotenv-configTypeScript5,1134,7304,0501,2841 vs 03/3

Raw data

One row per run: task, side, pass or fail, fix attempts, tokens, cost, time, and which recipe search returned. No prompts or code.

Download runs.csv