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?
- 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
- 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
- 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
- App hostingVercel 100% · 10/1010/10
- Background jobsBullMQ 100% · 10/1010/10
- End-to-end testingPlaywright 100% · 10/1010/10
- Error monitoringSentry 100% · 10/1010/10
- Postgres hostingNeon 100% · 10/1010/10
- Product analyticsPostHog 100% · 10/1010/10
- Python background jobsCelery 100% · 10/1010/10
- Python database layerSQLAlchemy 100% · 10/1010/10
- Python web frameworkFastAPI 100% · 10/1010/10
- Subscription billingStripe 100% · 10/1010/10
- Transactional emailResend 99% · 10/1010/10
- CacheRedis 96% · 10/1010/10
Leaning 7 · at least 8 of 10 models agree, the tool wins most answers
- Headless CMSSanity 90% · Contentful 8% · 10/1010/10
- LLM SDKVercel AI SDK 89% · OpenAI SDK 11% · 9/109/10
- RealtimeLiveblocks 87% · Pusher 9% · 9/109/10
- File storageAmazon S3 83% · Cloudflare R2 12% · 9/109/10
- LLM providerOpenAI 83% · Anthropic 16% · 9/109/10
- SearchMeilisearch 77% · Elasticsearch 13% · 9/109/10
- Image deliveryCloudinary 64% · Cloudflare Images 13% · 8/108/10
Contested 10 · models disagree
- ORM / query builderDrizzle ORM 72% · Prisma 28% · 7/107/10
- Rate limitingrate-limiter-flexible 67% · express-rate-limit 31% · 7/107/10
- Feature flagsLaunchDarkly 59% · PostHog 38% · 7/107/10
- Python agent frameworkLangChain / LangGraph 57% · LlamaIndex 42% · 6/106/10
- Unit testingVitest 57% · Jest 42% · 6/106/10
- Pipeline orchestrationApache Airflow 54% · Prefect 42% · 6/106/10
- AuthenticationAuth.js (NextAuth) 52% · Better Auth 24% · 5/105/10
- UI componentsMUI 52% · Ant Design 38% · 5/105/10
- Vector databasePinecone 46% · Qdrant 25% · 8/108/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.
- CategoryTop pick of how many modelsSame pick when reworded
- ORM / query builderDrizzle ORM ×7Prisma ×38/10
- Rate limitingrate-limiter-flexible ×7express-rate-limit ×39/10
- Feature flagsLaunchDarkly ×7PostHog ×39/10
- Python agent frameworkLangChain / LangGraph ×6LlamaIndex ×48/10
- Unit testingVitest ×6Jest ×46/10
- Pipeline orchestrationApache Airflow ×6Prefect ×53/10
- AuthenticationAuth.js (NextAuth) ×5Clerk ×3Better Auth ×26/10
- UI componentsMUI ×5Ant Design ×4shadcn/ui ×17/10
- Vector databasePinecone ×8Chroma ×1pgvector ×1Qdrant ×16/10
- 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 notes | all three | alone | |
|---|---|---|---|
| BullMQ | 97% | 92% | 100% |
| Inngest | 3% | 7% | 100% |
| Trigger.dev | 0% | 2% | 90% |
Search favourite held
| no notes | all three | alone | |
|---|---|---|---|
| Typesense | 3% | 18% | 100% |
| Meilisearch | 67% | 58% | 100% |
| Algolia | 17% | 23% | 100% |
Authentication lead flipped
| no notes | all three | alone | |
|---|---|---|---|
| Better Auth | 17% | 52% | 100% |
| Clerk | 17% | 22% | 100% |
| Auth.js (NextAuth) | 67% | 27% | 100% |
Transactional email favourite held
| no notes | all three | alone | |
|---|---|---|---|
| Resend | 100% | 95% | 100% |
| Postmark | 0% | 5% | 100% |
| SendGrid | 0% | 0% | 90% |
Postgres hosting favourite held
| no notes | all three | alone | |
|---|---|---|---|
| Neon | 100% | 92% | 100% |
| Supabase | 0% | 8% | 100% |
| PlanetScale | 0% | 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.
| Need | Asked (Claude Opus 5.5†, API) | Written by Claude Code (5 runs) |
|---|---|---|
| Authentication | Better Auth 12/12 | Auth.js (NextAuth) 5/5 |
| Postgres hosting | Neon 12/12 | not specified 5/5 |
| ORM / query builder | Drizzle ORM 12/12 | Drizzle ORM 5/5 |
| Subscription billing | Stripe 12/12 | Stripe 5/5 |
| Transactional email | Resend 12/12 | Resend 5/5 |
| Error monitoring | Sentry 24/24 | Sentry 5/5 |
Raw results: docs/pilots/2026-10-15-agent-probe.json
Limits
- Pilot. The design was not pre-registered, and some choices (the tier thresholds, the statistics added after a first look) were made after seeing data, so every finding is exploratory. Confirmatory releases lock their protocol before any data is collected (docs/CHARTER.md).
- Stated preference. Each answer is one API call naming a tool. Apart from the file-only pilot above, which wrote dependencies but installed nothing, we did not observe real projects.
- One gateway. All models were reached through one OpenAI-compatible gateway. The Claude Opus 5.5 and Claude Sonnet 5.5 routes add their own system prompt (about 6.6k tokens), so their picks may reflect it; they are marked † in the tables.
- Default sampling. Every model ran at its route's default sampling settings, which differ between models and were not recorded.
- One task per category. 27 of 29 categories were asked through a single task prompt (in three phrasings), so a default is a default for that task.
- Models are not independent. The 10 models come from 8 labs (two from Anthropic and two from OpenAI), so "every model agrees" is weaker than that many independent confirmations.
- Our notes, few answers. Duel notes are short, neutral summaries we wrote from public documentation; real documentation is longer and more persuasive. Each duel arm holds 30 to 60 answers, which is why most shifts are "not detected" rather than "absent".
- One snapshot. Collected 2026-10-15 with default sampling; tasks lean to TypeScript and Next.js plus a Python track; each model contributes about 12 answers per category, so single-model cells are small.
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 Pro | Gemini 3.8 Flash | GLM-5.3 | GPT-6.1 Sol | GPT-6 Astra | Grok 4.7 | Kimi K2.7 Code | MiniMax M3 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Authentication | Better 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 hosting | Neon100% | Neon100% | Neon100% | Neon100% | Neon100% | Neon100% | Neon100% | Neon100% | Neon100% | Neon100% |
| ORM / query builder | Drizzle ORM100% | Drizzle ORM100% | Prisma83% | Drizzle ORM100% | Drizzle ORM67% | Drizzle ORM100% | Drizzle ORM92% | Prisma58% | Prisma83% | Drizzle ORM83% |
| Subscription billing | Stripe100% | Stripe100% | Stripe100% | Stripe100% | Stripe100% | Stripe100% | Stripe100% | Stripe100% | Stripe100% | Stripe100% |
| Transactional email | Resend100% | Resend100% | Resend92% | Resend100% | Resend100% | Resend100% | Resend100% | Resend100% | Resend100% | Resend100% |
| Error monitoring | Sentry100% | Sentry100% | Sentry100% | Sentry100% | Sentry100% | Sentry100% | Sentry100% | Sentry100% | Sentry100% | Sentry100% |
| Search | Meilisearch100% | Meilisearch100% | Algolia / Elasticsearch / Meilisearch33% | Meilisearch100% | Meilisearch83% | Meilisearch75% | Elasticsearch50% | Meilisearch75% | Meilisearch92% | Meilisearch75% |
| Background jobs | BullMQ100% | BullMQ100% | BullMQ100% | BullMQ100% | BullMQ100% | BullMQ100% | BullMQ100% | BullMQ100% | BullMQ100% | BullMQ100% |
| Product analytics | PostHog100% | PostHog100% | PostHog100% | PostHog100% | PostHog100% | PostHog100% | PostHog100% | PostHog100% | PostHog100% | PostHog100% |
| Feature flags | PostHog100% | PostHog100% | LaunchDarkly100% | LaunchDarkly100% | LaunchDarkly75% | LaunchDarkly100% | LaunchDarkly83% | LaunchDarkly83% | PostHog100% | LaunchDarkly50% |
| File storage | Amazon S3100% | Amazon S3100% | Amazon S375% | Amazon S383% | Amazon S392% | Amazon S3100% | Amazon S3100% | Amazon S383% | Amazon S3100% | Cloudflare R2100% |
| Image delivery | imgix42% | Cloudinary / Next.js Image (Vercel)33% | Cloudinary92% | Cloudinary75% | Cloudinary83% | Cloudinary83% | Cloudinary100% | Cloudinary83% | Cloudinary83% | Cloudflare Images100% |
| LLM SDK | Vercel 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 provider | Anthropic100% | Anthropic / OpenAI50% | OpenAI100% | OpenAI92% | OpenAI92% | OpenAI100% | OpenAI100% | OpenAI100% | OpenAI100% | OpenAI100% |
| App hosting | Vercel100% | Vercel100% | Vercel100% | Vercel100% | Vercel100% | Vercel100% | Vercel100% | Vercel100% | Vercel100% | Vercel100% |
| Realtime | Liveblocks100% | Liveblocks100% | Liveblocks100% | Liveblocks100% | Pusher92% | Liveblocks100% | Liveblocks92% | Liveblocks100% | Liveblocks67% | Liveblocks100% |
| Vector database | Qdrant50% | pgvector46% | Pinecone79% | Pinecone50% | Pinecone75% | Pinecone62% | Pinecone54% | Chroma / Pinecone33% | Pinecone46% | Pinecone54% |
| Headless CMS | Sanity100% | Sanity100% | Sanity92% | Sanity100% | Sanity58% | Sanity100% | Sanity100% | Sanity100% | Sanity67% | Sanity83% |
| UI components | MUI42% | MUI100% | Ant Design67% | shadcn/ui50% | Ant Design100% | MUI100% | MUI100% | Ant Design100% | MUI100% | Ant Design75% |
| Unit testing | Vitest100% | Vitest83% | Jest58% | Vitest75% | Vitest67% | Vitest67% | Vitest67% | Jest83% | Jest75% | Jest67% |
| End-to-end testing | Playwright100% | Playwright100% | Playwright100% | Playwright100% | Playwright100% | Playwright100% | Playwright100% | Playwright100% | Playwright100% | Playwright100% |
| Cache | Redis100% | Redis100% | Redis100% | Redis100% | Redis100% | Redis83% | Redis100% | Redis100% | Redis83% | Redis92% |
| Rate limiting | rate-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 framework | FastAPI100% | FastAPI100% | FastAPI100% | FastAPI100% | FastAPI100% | FastAPI100% | FastAPI100% | FastAPI100% | FastAPI100% | FastAPI100% |
| Python database layer | SQLAlchemy100% | SQLAlchemy100% | SQLAlchemy100% | SQLAlchemy100% | SQLAlchemy100% | SQLAlchemy100% | SQLAlchemy100% | SQLAlchemy100% | SQLAlchemy100% | SQLAlchemy100% |
| Python authentication | FastAPI Users100% | Authlib83% | Auth075% | Roll-your-own (JWT / sessions)75% | Auth067% | Auth058% | Auth075% | Authlib83% | Auth0 / Authlib50% | Auth075% |
| Python background jobs | Celery100% | Celery100% | Celery100% | Celery100% | Celery100% | Celery100% | Celery100% | Celery100% | Celery100% | Celery100% |
| Python agent framework | LlamaIndex100% | LlamaIndex100% | LangChain / LangGraph100% | LlamaIndex58% | LangChain / LangGraph58% | LlamaIndex67% | LangChain / LangGraph67% | LangChain / LangGraph83% | LangChain / LangGraph100% | LangChain / LangGraph92% |
| Pipeline orchestration | Prefect67% | 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