Agent Stack Index · October 2026

AI coding models already have a default stack

We asked 10 models from 8 labs to start the same 16 projects from scratch and name one tool for each of 29 needs, in three phrasings, four times each (1,920 answers). Then we put neutral notes on competing tools in front of them 750 more times.

Pilot. The design was not pre-registered, so every finding below is exploratory. Each one is checked against a noise model; see Limits for how far it holds.

Question Which tools do AI coding models pick when they start a project from scratch, and what moves the pick: the wording, the order of candidates, or documentation in context?

  1. Most categories already have a default. In 12 of 29 categories every model picks the same tool and it takes at least 95% of the answers; in 7 more, at least 8 of 10 models agree. exploratory
  2. Without a default, the pick also moves with the wording. In the 10 contested categories, 31 of 100 model–category pairs change their top pick when the request is reworded, against about 17 expected from sampling noise alone; in the default categories, none do. exploratory
  3. What the model reads can decide the pick. With only one candidate's notes in context, models pick it 85–100% of the time. With all candidates' notes side by side, the favourite showed no detectable change in four of the five categories we tested (shifts under about 19–30 points cannot be ruled out); in authentication, which has no default, the lead flipped. exploratory

1 · Most categories already have a default

Twelve categories are settled: every model picks the same tool and it takes at least 95% of the answers. Seven more lean one way: at least 8 of 10 models agree and the tool wins most answers. Ten are contested.

Pooled share of answers, each model weighted equally · right column: models whose top pick it is.

Settled 12 · every model picks the same tool, at least 95% of answers

  1. App hostingVercel 100% · 10/1010/10
  2. Background jobsBullMQ 100% · 10/1010/10
  3. End-to-end testingPlaywright 100% · 10/1010/10
  4. Error monitoringSentry 100% · 10/1010/10
  5. Postgres hostingNeon 100% · 10/1010/10
  6. Product analyticsPostHog 100% · 10/1010/10
  7. Python background jobsCelery 100% · 10/1010/10
  8. Python database layerSQLAlchemy 100% · 10/1010/10
  9. Python web frameworkFastAPI 100% · 10/1010/10
  10. Subscription billingStripe 100% · 10/1010/10
  11. Transactional emailResend 99% · 10/1010/10
  12. CacheRedis 96% · 10/1010/10

Leaning 7 · at least 8 of 10 models agree, the tool wins most answers

  1. Headless CMSSanity 90% · Contentful 8% · 10/1010/10
  2. LLM SDKVercel AI SDK 89% · OpenAI SDK 11% · 9/109/10
  3. RealtimeLiveblocks 87% · Pusher 9% · 9/109/10
  4. File storageAmazon S3 83% · Cloudflare R2 12% · 9/109/10
  5. LLM providerOpenAI 83% · Anthropic 16% · 9/109/10
  6. SearchMeilisearch 77% · Elasticsearch 13% · 9/109/10
  7. Image deliveryCloudinary 64% · Cloudflare Images 13% · 8/108/10

Contested 10 · models disagree

  1. ORM / query builderDrizzle ORM 72% · Prisma 28% · 7/107/10
  2. Rate limitingrate-limiter-flexible 67% · express-rate-limit 31% · 7/107/10
  3. Feature flagsLaunchDarkly 59% · PostHog 38% · 7/107/10
  4. Python agent frameworkLangChain / LangGraph 57% · LlamaIndex 42% · 6/106/10
  5. Unit testingVitest 57% · Jest 42% · 6/106/10
  6. Pipeline orchestrationApache Airflow 54% · Prefect 42% · 6/106/10
  7. AuthenticationAuth.js (NextAuth) 52% · Better Auth 24% · 5/105/10
  8. UI componentsMUI 52% · Ant Design 38% · 5/105/10
  9. Vector databasePinecone 46% · Qdrant 25% · 8/108/10
  10. Python authenticationAuth0 42% · Authlib 27% · 6/106/10

2 · Without a default, the pick moves with the model and the wording

Where no tool is settled, models split. In authentication, Auth.js (NextAuth) is the top pick of 5 models, Clerk of 3 and Better Auth of 2.

The same model's answer also depends on the wording: in contested categories, 31 of 100 model–category pairs change their top pick across the three phrasings. Shuffling the phrasing labels over the same answers gives 17 ± 3 (sampling noise alone), so the wording accounts for roughly 14 of the 100 (p = 0.001).

In leaning categories 7 of 70 change, against about 6 expected (no detectable wording effect); in default categories, none.

The split is not just the Claude Opus 5.5 and Claude Sonnet 5.5 routes, which add a hidden system prompt (see Limits): in 9 of 10 contested categories, at least one other model also disagrees with the pooled pick.

  1. CategoryTop pick of how many modelsSame pick when reworded
  2. ORM / query builderDrizzle ORM ×7Prisma ×38/10
  3. Rate limitingrate-limiter-flexible ×7express-rate-limit ×39/10
  4. Feature flagsLaunchDarkly ×7PostHog ×39/10
  5. Python agent frameworkLangChain / LangGraph ×6LlamaIndex ×48/10
  6. Unit testingVitest ×6Jest ×46/10
  7. Pipeline orchestrationApache Airflow ×6Prefect ×53/10
  8. AuthenticationAuth.js (NextAuth) ×5Clerk ×3Better Auth ×26/10
  9. UI componentsMUI ×5Ant Design ×4shadcn/ui ×17/10
  10. Vector databasePinecone ×8Chroma ×1pgvector ×1Qdrant ×16/10
  11. Python authenticationAuth0 ×6Authlib ×3Roll-your-own (JWT / sessions) ×1FastAPI Users ×17/10

A model tied between two tools counts for both. Per-model picks are in the appendix.

3 · What the model reads can decide the pick

In five duels we gave the same single-need task three ways: no notes; neutral notes on three candidates, in rotated order; and one candidate's notes alone. Alone, every candidate won 85–100% of picks, including tools that got 0% with no notes (Supabase 0% → 100%, Postmark 0% → 100%, Trigger.dev 0% → 90%). That is close to a forced choice: it shows the notes are read, not that they persuade.

Side by side, the no-notes favourite stayed on top in four of five duels, with no detectable shift (BullMQ 97% → 92%, Meilisearch 67% → 58%, Resend 100% → 95%, Neon 100% → 92%). With 30 and 60 answers per arm, shifts under about 19–30 points cannot be told apart from noise, so this means no detectable change, not no change.

In authentication, where models had no default, the lead flipped: Auth.js (NextAuth) 67% → 27%, Better Auth 17% → 52% (significant after correcting for 15 comparisons).

Order mattered: the first-listed candidate won 43% of side-by-side picks (95% interval 38–49%; chance is 33%; p < 0.001).

Share of picks per arm, models weighted equally. “All three”: neutral notes on all three candidates, order rotated. “Alone”: only that candidate's notes.

Background jobs favourite held

no notesall threealone
BullMQ97%92%100%
Inngest3%7%100%
Trigger.dev0%2%90%

Search favourite held

no notesall threealone
Typesense3%18%100%
Meilisearch67%58%100%
Algolia17%23%100%

Authentication lead flipped

no notesall threealone
Better Auth17%52%100%
Clerk17%22%100%
Auth.js (NextAuth)67%27%100%

Transactional email favourite held

no notesall threealone
Resend100%95%100%
Postmark0%5%100%
SendGrid0%0%90%

Postgres hosting favourite held

no notesall threealone
Neon100%92%100%
Supabase0%8%100%
PlanetScale0%0%85%

What this means

If you build with agents: an agent's stack is mostly the model's default plus whatever documentation reaches its context. If you care which tool you get, name it; in contested categories, rewording the request can change the answer, and the order of a list you give it matters.

If you make developer tools: if you are not the default, the lever is being read, and being listed first helps. Alone in context, every candidate's notes won 85–100% of picks; next to a settled default we detected no shift, and where there was no default the notes flipped the lead. The open ground is the contested categories, where models already disagree: for example Python authentication, vector database, authentication, UI components and pipeline orchestration.

Early check: asked vs done

We ran Claude Code (model route Opus 5.5) five times on the SaaS-starter task with file tools only, and mapped the dependencies it wrote into package.json to the catalog. Four of six rows name the same package or service as the same model's direct API answers.

Differences: all five runs wrote next-auth for authentication, where the API answers named Better Auth 12/12; the Postgres hosting row stays unspecified in the generated files (DATABASE_URL on localhost), where the API answers named Neon 12/12.

The runs did not install, execute or test anything, and used a different harness and system prompt from the API calls, so this pilot does not say why the outputs differ or compare library quality.

NeedAsked (Claude Opus 5.5†, API)Written by Claude Code (5 runs)
AuthenticationBetter Auth 12/12Auth.js (NextAuth) 5/5
Postgres hostingNeon 12/12not specified 5/5
ORM / query builderDrizzle ORM 12/12Drizzle ORM 5/5
Subscription billingStripe 12/12Stripe 5/5
Transactional emailResend 12/12Resend 5/5
Error monitoringSentry 24/24Sentry 5/5

Raw results: docs/pilots/2026-10-15-agent-probe.json

Limits

Data and method

Raw answers, the vendor catalog and the code are open, and every number on this page is regenerated from them in CI: methodology · results.json · picks.csv · raw answers · report as Markdown · code. Answers not matched to the catalog: 0%. Data CC BY 4.0: cite as “Agent Stack Index, release 2026-10”. Protocol: protocols/2026-10.md (pilot). Harness this round: the story-driven report, share cards and an inference module (null models, corrected tests).

Top pick by model, all 29 categories
Claude Opus 5.5†Claude Sonnet 5.5†DeepSeek V4 ProGemini 3.8 FlashGLM-5.3GPT-6.1 SolGPT-6 AstraGrok 4.7Kimi K2.7 CodeMiniMax M3
AuthenticationBetter Auth100%Better Auth83%Auth.js (NextAuth)83%Clerk67%Auth.js (NextAuth)83%Clerk50%Auth.js (NextAuth)67%Auth.js (NextAuth)67%Auth.js (NextAuth)83%Clerk58%
Postgres hostingNeon100%Neon100%Neon100%Neon100%Neon100%Neon100%Neon100%Neon100%Neon100%Neon100%
ORM / query builderDrizzle ORM100%Drizzle ORM100%Prisma83%Drizzle ORM100%Drizzle ORM67%Drizzle ORM100%Drizzle ORM92%Prisma58%Prisma83%Drizzle ORM83%
Subscription billingStripe100%Stripe100%Stripe100%Stripe100%Stripe100%Stripe100%Stripe100%Stripe100%Stripe100%Stripe100%
Transactional emailResend100%Resend100%Resend92%Resend100%Resend100%Resend100%Resend100%Resend100%Resend100%Resend100%
Error monitoringSentry100%Sentry100%Sentry100%Sentry100%Sentry100%Sentry100%Sentry100%Sentry100%Sentry100%Sentry100%
SearchMeilisearch100%Meilisearch100%Algolia / Elasticsearch / Meilisearch33%Meilisearch100%Meilisearch83%Meilisearch75%Elasticsearch50%Meilisearch75%Meilisearch92%Meilisearch75%
Background jobsBullMQ100%BullMQ100%BullMQ100%BullMQ100%BullMQ100%BullMQ100%BullMQ100%BullMQ100%BullMQ100%BullMQ100%
Product analyticsPostHog100%PostHog100%PostHog100%PostHog100%PostHog100%PostHog100%PostHog100%PostHog100%PostHog100%PostHog100%
Feature flagsPostHog100%PostHog100%LaunchDarkly100%LaunchDarkly100%LaunchDarkly75%LaunchDarkly100%LaunchDarkly83%LaunchDarkly83%PostHog100%LaunchDarkly50%
File storageAmazon S3100%Amazon S3100%Amazon S375%Amazon S383%Amazon S392%Amazon S3100%Amazon S3100%Amazon S383%Amazon S3100%Cloudflare R2100%
Image deliveryimgix42%Cloudinary / Next.js Image (Vercel)33%Cloudinary92%Cloudinary75%Cloudinary83%Cloudinary83%Cloudinary100%Cloudinary83%Cloudinary83%Cloudflare Images100%
LLM SDKVercel AI SDK100%Vercel AI SDK100%Vercel AI SDK100%Vercel AI SDK100%Vercel AI SDK100%Vercel AI SDK92%Vercel AI SDK83%Vercel AI SDK100%OpenAI SDK83%Vercel AI SDK100%
LLM providerAnthropic100%Anthropic / OpenAI50%OpenAI100%OpenAI92%OpenAI92%OpenAI100%OpenAI100%OpenAI100%OpenAI100%OpenAI100%
App hostingVercel100%Vercel100%Vercel100%Vercel100%Vercel100%Vercel100%Vercel100%Vercel100%Vercel100%Vercel100%
RealtimeLiveblocks100%Liveblocks100%Liveblocks100%Liveblocks100%Pusher92%Liveblocks100%Liveblocks92%Liveblocks100%Liveblocks67%Liveblocks100%
Vector databaseQdrant50%pgvector46%Pinecone79%Pinecone50%Pinecone75%Pinecone62%Pinecone54%Chroma / Pinecone33%Pinecone46%Pinecone54%
Headless CMSSanity100%Sanity100%Sanity92%Sanity100%Sanity58%Sanity100%Sanity100%Sanity100%Sanity67%Sanity83%
UI componentsMUI42%MUI100%Ant Design67%shadcn/ui50%Ant Design100%MUI100%MUI100%Ant Design100%MUI100%Ant Design75%
Unit testingVitest100%Vitest83%Jest58%Vitest75%Vitest67%Vitest67%Vitest67%Jest83%Jest75%Jest67%
End-to-end testingPlaywright100%Playwright100%Playwright100%Playwright100%Playwright100%Playwright100%Playwright100%Playwright100%Playwright100%Playwright100%
CacheRedis100%Redis100%Redis100%Redis100%Redis100%Redis83%Redis100%Redis100%Redis83%Redis92%
Rate limitingrate-limiter-flexible100%rate-limiter-flexible100%rate-limiter-flexible83%rate-limiter-flexible92%rate-limiter-flexible75%rate-limiter-flexible67%rate-limiter-flexible83%express-rate-limit92%express-rate-limit75%express-rate-limit58%
Python web frameworkFastAPI100%FastAPI100%FastAPI100%FastAPI100%FastAPI100%FastAPI100%FastAPI100%FastAPI100%FastAPI100%FastAPI100%
Python database layerSQLAlchemy100%SQLAlchemy100%SQLAlchemy100%SQLAlchemy100%SQLAlchemy100%SQLAlchemy100%SQLAlchemy100%SQLAlchemy100%SQLAlchemy100%SQLAlchemy100%
Python authenticationFastAPI Users100%Authlib83%Auth075%Roll-your-own (JWT / sessions)75%Auth067%Auth058%Auth075%Authlib83%Auth0 / Authlib50%Auth075%
Python background jobsCelery100%Celery100%Celery100%Celery100%Celery100%Celery100%Celery100%Celery100%Celery100%Celery100%
Python agent frameworkLlamaIndex100%LlamaIndex100%LangChain / LangGraph100%LlamaIndex58%LangChain / LangGraph58%LlamaIndex67%LangChain / LangGraph67%LangChain / LangGraph83%LangChain / LangGraph100%LangChain / LangGraph92%
Pipeline orchestrationPrefect67%Apache Airflow / Prefect50%Apache Airflow58%Apache Airflow67%Apache Airflow58%Prefect58%Prefect58%Apache Airflow100%Prefect50%Apache Airflow67%
Models
  • Claude Opus 5.5† · Anthropic · 267 answers · reported as claude-opus-5-5
  • Claude Sonnet 5.5† · Anthropic · 267 answers · reported as claude-sonnet-5.5
  • DeepSeek V4 Pro · DeepSeek · 267 answers · reported as deepseek-v4-pro-202606
  • Gemini 3.8 Flash · Google · 267 answers · reported as gemini-3.8-flash
  • GLM-5.3 · Zhipu · 267 answers · reported as glm-5.3
  • GPT-6.1 Sol · OpenAI · 267 answers · reported as gpt-6.1-sol
  • GPT-6 Astra · OpenAI · 267 answers · reported as gpt-6-astra
  • Grok 4.7 · xAI · 267 answers · reported as grok-4.7-build
  • Kimi K2.7 Code · Moonshot · 267 answers · reported as kimi-k2.7-code
  • MiniMax M3 · MiniMax · 267 answers · reported as MiniMax-M3