Basecamp Bench

eval 2026-07-11.2 · July 11, 2026

Basecamp Bench measures a model's ability to ship production-grade software from a fixed specification on a well-known application. Each workspace begins like a real greenfield project: AGENTS.md maps the source material and sets its order of precedence, DESIGN.md provides production design tokens, and INIT.md specifies the product, domain model, and sample data. Each project item uses a shared Recording model that unifies identity, lifecycle, visibility, comments, reactions, subscriptions, and events across tools. Agents build two parts of a Basecamp 5 clone: a single-file frontend SPA evaluated as a release-ready product across 11 weighted dimensions and nine reference screenshots, and a production-ready backend API implementing all 203 operations in the canonical OpenAPI contract across 9 weighted dimensions. All implementation and architecture decisions are evaluated as written for direct production use. Each model starts without an existing implementation, so it must translate the same complete requirements and reference materials into its own architecture and product decisions. The benchmark reveals how well each model exercises greenfield engineering judgment, prioritizes competing concerns, and carries those decisions through to working software.

The results reveal how each model applies engineering judgment and effort from the same starting point. Fable 5 leads both tracks because it builds the shared Recording model described in the specification and connects every surface and endpoint to it. This decision strengthens product modeling, surface coverage, seed fidelity, and behavioral depth. Backend scores cluster tightly because most models register the complete route surface. Invariant enforcement, contract-correct responses, and honest failure handling separate them. Frontend scores vary more because models make different tradeoffs between breadth and functional depth. Sonnet prioritizes working, persistent workflows, while GPT-5.5 prioritizes visual polish and leaves many controls inert, creating a 1.3-point gap. Grok 4.5 delivers the strongest balance of speed, cost, and functional depth, outperforming Sol 5.6 on the frontend and nearly matching it on the backend. Sol 5.6 shows greater backend discipline through explicit failure handling and operational safeguards, but its shallow frontend workflows limit its overall performance.

ModelFE scoreFE timeFE costBE scoreBE timeBE costTotal cost
Fable 57.5781:02:14$32.408.3921:04:26$53.47$85.87
Sonnet 56.98244:17$14.227.24342:52$22.01$36.23
Grok 4.56.38415:22$3.957.27821:26$5.35$9.30
GPT-5.6 Sol5.76525:45$7.967.31034:03$7.17$15.13
GPT-5.55.67018:21$4.737.08425:53$6.21$10.94

Scores are weighted composites computed by the benchmark runner from per-dimension judge scores (0–10).

Charts

Quality versus cost

Each model appears twice: circle = frontend, triangle = backend

Frontend dimensions

Functional depth spans 3.5 to 8.1, accessibility never clears 6.0

Backend dimensions

Four perfect 10s on coverage, scope honesty falls to 4.5

Frontend versus backend gap

All models score higher on backend, gaps +0.3 to +1.5

Model deep dives

8.0–10 Strong 7.0–7.9 Good 6.0–6.9 Mixed 5.0–5.9 Weak 0–4.9 Poor

Fable 5 — highest scores and greatest functional depth

FE 7.578 · BE 8.392 · $85.87 total · 2:06:40 total

Fable treated both tracks as systems problems. Its backend registered all 203 operations with explicit handlers and no stubs, and its frontend routes every screen through one shared recording store, so activity, search, trash, and notifications read the same data. It is the only model whose lifecycle invariants held under testing: archiving a parent propagated to children, archived content rejected mutation, and unarchiving reversed it.

Where it shines

  • Complete API with deep workflows203/203 operations implemented, 35 of 37 state assertions passed, cross-resource invariants enforced explicitly: assignees must see the project, todo moves stay in-bucket, card moves stay in-board.
  • Exact seed across both tracksThe exact nine-person cast, five threaded messages with mentions and boosts, the full Kanban state, and a 16-line chat, reproduced nearly verbatim.
  • Broad product with persistent workflowsNine required surfaces plus Adminland, Trash, Reports, Search, and profiles, with create/edit/comment/move/archive/restore workflows that mutate and persist.
  • HTTP plumbingETags with 304s, HEAD, 405 + Allow, pagination with Link headers, consistent error envelopes, graceful shutdown.

Where it's okay

  • Malformed input and SSRF checks remain weakAccepts 2025-02-31 as a date, accepts JSON without a Content-Type, coerces active: "false" to true, and webhook SSRF checks compare URL strings and never resolve DNS, so a hostname pointing at an internal IP passes.
  • Healthy runtime with an incomplete resetZero-install with health endpoints and structured logs, but no tests, no manifest, and reset doesn't clear the rate limiter: requests stayed 429-limited after reset.
  • Persistent shared state with weak modal UXNearly every mutation persists through one graph, but modals don't trap or restore focus and editing leans on deprecated execCommand and native prompts.

Where it underperforms

  • Mobile controls lose accessible namesBelow 760px five fixed controls lose their accessible names entirely, star buttons nest inside links, menus lack menu-item semantics.
  • Stored HTML creates an XSS riskRich text is stored from innerHTML and rendered raw across comments, docs, chat, and notes, so any markup that reaches storage executes on render. URLs accepted without scheme validation.
  • Data integrity"Make a copy" passes an undefined ID that overwrites the generated one, corrupting the copied record. Permanent delete removes a record and its direct children only, leaving grandchildren, events, boosts, and bookmarks pointing at dead IDs.

Failure modes

Fable's remaining defects cluster in security, configuration, and data-integrity review. The submission renders stored HTML without sanitization, prints production tokens by default, allows wildcard CORS with Authorization, and overstates support for operations whose prerequisite state remains unreachable. A sanitizer, safer configuration defaults, and a corrected copy operation address these defects within the existing architecture.

Dimension scores
FRONTEND
8.0Ref 8.1Craft 9.2Model 9.0Surf 8.1Depth 7.2Inter 6.8State 6.5Resp 5.0A11y 7.5Arch 6.2Rely
BACKEND
8.4Arch 10.0Surf 8.6Depth 8.2HTTP 8.8Seed 7.3Valid 7.4Ops 7.9Code 7.9Hnsty

Sonnet 5 — strong frontend with critical backend authorization defects

FE 6.982 · BE 7.243 · $36.23 total · 1:27:09 total

Sonnet builds the second-highest-scoring frontend with a shared recordings map, faithful sample data, and persistent workflows. Its backend earns the second-highest architecture and modeling score at 8.0. Backend authorization defects drive its largest deductions.

Where it shines

  • One shared graph powers every surface74 recordings with events, comments, boosts, readings, and bookmarks in one deterministic graph. All eight screenshot surfaces reachable plus ten optional destinations.
  • FE workflowsVerified creation of messages, docs, to-dos, cards, projects, and columns, plus completion, comments, boosts, card moves, and trash/restore, all surviving reload.
  • Rich-text sanitizerThe only allowlist sanitizer in the field. Every other model either escaped everything or rendered raw HTML.
  • Complete routes with working lifecyclesVerified end-to-end project, message, and todo lifecycles, 403 on non-owner edits, reset invalidating pre-reset tokens.

Where it's okay

  • Pagination and response schemas driftCorrect statuses and envelopes, but 18 of 44 paginated operations skip pagination, sort/direction params are ignored, and nulls appear where the schema requires strings.
  • Rerenders break focus and mobile actionsWhole-app rerenders drop focus, hover-only actions vanish on touch, the calendar stays seven columns at every width.
  • Healthy runtime with memory-only stateHealth checks, structured logs, graceful shutdown. State is memory-only and there are no tests.

Where it underperforms

  • Client tokens can trash projectsA client token issued DELETE /1/projects/1011 and got 204, trashing the sample project. Unauthenticated GET /_seed/tokens returns every raw bearer credential, and reset ships enabled by default.
  • Broken emitted URLsResource URLs append .json where the registered routes don't, so following a returned project URL yields 400. Navigability breaks on the API's own links.
  • FE loose ends19 explicit no-op controls, and the primary Message Board "New message" button has no dispatch case at all while the quick-add path works. Reset leaves bookmarks, readings, and notes behind.

Failure modes

Sonnet implements substantial functionality but leaves 19 controls and several primary actions disconnected from their handlers. The frontend's New message button has no dispatch case. The backend exposes credentials by default, and its notImplemented error helper is never called. Partial features return successful empty responses.

Dimension scores
FRONTEND
7.8Ref 7.5Craft 8.8Model 8.2Surf 7.1Depth 6.0Inter 5.8State 5.9Resp 5.2A11y 6.5Arch 6.5Rely
BACKEND
8.0Arch 10.0Surf 7.5Depth 6.8HTTP 7.5Seed 4.5Valid 7.5Ops 6.5Code 5.0Hnsty

Grok 4.5 — lowest cost with competitive scores

FE 6.384 · BE 7.278 · $9.30 total · 36:48 total

Grok produces roughly 85% of Fable's score for 11% of the cost and 29% of the time. Its backend earns the field's highest seed-data score at 9.0, and its frontend has stronger functional depth than either OpenAI entry. The lower cost corresponds with weaker input validation, edge-case handling, and reporting of incomplete features.

Where it shines

  • Speed and costBoth tracks done in 37 minutes for under $10, while landing above both OpenAI models on FE and within 0.11 of second place on BE.
  • Rich seed data with stable API IDsThe full verified inventory of five messages, ten todos, thirteen cards, and sixteen chat lines, navigable through the live API with stable IDs.
  • Verified stateful flowsProject and todo CRUD with lifecycle, comments incrementing counts, boosts, subscriptions, and correct pagination across 21 projects with proper Link headers.
  • Dense sample data connects every toolCategories, pinned messages, watchers, on-hold lanes, and a coherent cross-tool narrative.

Where it's okay

  • Core workflows persist, but editing is absentCreation, completion, comments, boosts, card moves, and chat all work and persist. Editing and deletion don't exist, and Bubble Up is a toast with no state change.
  • Shared recordings stop cascading too earlyA real shared recording table with generic events and lifecycle actions, but cascade stops at immediate children: archiving a board archived its message and left the message's comment active.
  • Response statuses drift at the edgesRich canonical shapes and correct statuses in most places, undermined by two operations returning 200 bodies where the spec requires 204.

Where it underperforms

  • Invalid input reaches server errorsAn invalid numeric ID returns 500, router literals are compiled as unescaped regex so /projects/1000Xjson matched and returned project 1000, and the default unauthenticated reset destroyed runtime state in testing.
  • Route shadowingThe canonical projects/recordings.json operation is intercepted by an earlier route and 500s, the only unreachable canonical operation in the field.
  • Mobile layouts and malformed state breakNo mobile navigation model, a fixed footer that overflows at every narrow width, and stored state containing only {version: 1} crashes boot. Creating projects across a reload produces duplicate IDs.
  • Partial features report successThe header claims no hollow surface while cloning copies the tool container and none of its content yet reports success, template construction reports completion on an empty project, and reminders always return an empty success.

Failure modes

Grok's failures concentrate in validation, malformed state, responsive behavior, and partial features. Client mistakes become 500s, malformed persistence causes crashes, partial features report success, and the public root response exposes credentials. Its four lowest dimensions are responsive adaptation at 4.0, scope honesty at 4.5, accessibility at 4.8, and validation at 5.0. Addressing these dimensions requires additional implementation and review time.

Dimension scores
FRONTEND
7.0Ref 7.2Craft 8.0Model 7.5Surf 6.5Depth 6.1Inter 6.0State 4.0Resp 4.8A11y 5.5Arch 6.0Rely
BACKEND
7.5Arch 9.7Surf 7.5Depth 7.0HTTP 9.0Seed 5.0Valid 6.5Ops 6.5Code 4.5Hnsty

GPT-5.6 Sol — strong operability with explicit backend limitations

FE 5.765 · BE 7.310 · $15.13 total · 59:48 total

Sol implements 132 backend operations, marks the remaining 71 with explicit 501 responses, and provides the strongest operational scaffolding in the field. These decisions earn it second place on BE. Its frontend leaves twelve controls marked as prototypes and provides no complete create, edit, comment, or delete workflow.

Where it shines

  • Unsupported operations return explicit 501sEvery unimplemented operation returns an explicit 501 not_implemented. Binary and multipart uploads return explicit 501s instead of pretending to store files. No fabricated CRUD.
  • Strongest production scaffolding in the fieldEnvironment validation, allowlisted CORS, atomic mode-0600 state persistence, structured logs with request IDs, graceful shutdown, and exported router/state/reset functions so tests can drive it without a socket.
  • Genuinely stateful idempotencyReplaying a creation key returned the same ID with Idempotency-Replayed: true, and changing the payload under that key returned 409.
  • The contract generates every routeCompiles all 203 operations directly from the OpenAPI document and asserts the count, giving coverage by construction.

Where it's okay

  • Core seed data omits events and assigneesThe right project, cast, dock, and counts, with specific gaps: missing assignees on the Review card, eight chat authors instead of five, absent completion events.
  • Coherent design with weak iconographyCoherent tokens, dark/light themes, reduced motion, and detailed empty states, all wrapped around emoji icons and gradient-initial avatars.
  • Best focus management in the fieldLabeled jump dialog, focus restoration, inert closed layers, foundations most other models skipped. It is the only frontend that restores focus to the triggering control.

Where it underperforms

  • The generic router erases typesA GET for a todo returned a Message with 200, and a POST created a Todo whose parent was a Message. Both defects trace to one function, routedRecording(), which resolves an ID without ever checking resource type or parent.
  • Explicit stubs limit workflow depth71 stubs cap it, trashed todos still appear in normal lists, archive doesn't cascade despite serializing inherits_status, and a valid chunked request body is rejected for lacking Content-Length.
  • Core workflows remain prototypesTwelve controls self-report prototype status and more are silently inert. No create, edit, comment, or delete workflow exists end to end. Persistence covers four localStorage keys.
  • FE state handlingMalformed JSON aborts boot, wrong-shaped data crashes renderers, and invalid detail IDs silently render the first record, so a broken link shows wrong data with no error.

Failure modes

Sol's backend reports 71 unsupported operations explicitly. Its frontend leaves twelve controls marked as prototypes, keeps other controls inert without feedback, and routes invalid detail links to the wrong record. The generic recording router simplifies dispatch but removes type context, causing the submission's most serious correctness defects. This loss of type context makes each new handler vulnerable to the same errors.

Dimension scores
FRONTEND
6.5Ref 7.0Craft 6.5Model 7.0Surf 4.0Depth 5.0Inter 4.5State 6.5Resp 6.0A11y 5.0Arch 5.0Rely
BACKEND
7.0Arch 10.0Surf 6.0Depth 6.0HTTP 8.0Seed 6.5Valid 8.5Ops 7.0Code 8.0Hnsty

GPT-5.5 — durable backend with limited frontend behavior

FE 5.670 · BE 7.084 · $10.94 total · 44:14 total

GPT-5.5 ships the only backend in the field with durable persistence: a SQLite store whose created todos and comments survive a full restart. Complete route coverage and solid hardening basics support its 7.084 backend score. Its frontend scores 5.670, last in the field. All nine required screens render, but no creation, editing, commenting, or movement works, and toasts confirm actions that never ran.

Where it shines

  • DurabilityVerified restart persistence over the same SQLite file, WAL mode, atomic idempotency replay with 409 on conflict, and owner reset restoring the stable seed. No other model kept state across a process.
  • Every contract operation is registeredAll 203 operations loaded from the spec into the route table with zero collisions.
  • Hardening basics415 on wrong media types, 413 over 10 MiB, 405 with Allow, malformed JSON errors with line and column, client-mutation 403s, and client tokens blocked from reading internal-only content.
  • Cheap and fast$10.94 and 44 minutes for both tracks.

Where it's okay

  • Shared records develop projection driftA real shared recording foundation over SQLite, weakened by projection drift: disabling a tool updated the tool row while the project's embedded dock still said enabled.
  • Seed data is incomplete and nondeterministicThe main graph matches the specification, but subscriptions, chat volume, and deterministic timestamps do not. The kickoff has zero required subscriptions, the seed contains eight chat lines instead of sixteen, and wall-clock timestamps break the determinism requirement.
  • Polished shell with disciplined tokensA coherent token system and disciplined dark shell give GPT-5.5 higher visual-craft scores than Grok and Sol.

Where it underperforms

  • Schemas and success statuses drift16 of 26 seeded responses failed schema validation, 14 operations returned undocumented success statuses, and a spec-valid schedule entry was rejected because the generic creator demands a title.
  • Missing parents still return successCreating an answer under nonexistent question 999999 returned 201, template construction under a nonexistent template returned 201, and MarkAsRead reports success while every notification stays unread.
  • Controls confirm actions without mutationsToasts announce "Comment posted" and "Chat line posted" without reading the textarea or touching state. No creation, editing, commenting, movement, or deletion works anywhere.
  • FE fragilityStored state is parsed with no try/catch, so malformed JSON prevents startup. The filter rerenders the whole app per keystroke and drops focus after one character. Jump's Enter key ignores the filtered results.

Failure modes

GPT-5.5 frequently reports success without completing the requested behavior. Examples include orphan-resource creation, unchanged notification state, and frontend confirmation messages that perform no mutation. Nonnumeric IDs and invalid UTF-8 produce uncaught exceptions and 500 responses. In-memory mode fails across threads because each thread receives a separate SQLite database. Sol returns explicit 501 responses for missing features. GPT-5.5 returns 200 and 201 responses for several incomplete operations.

Dimension scores
FRONTEND
6.5Ref 7.5Craft 8.0Model 7.5Surf 3.5Depth 4.0Inter 4.5State 5.5Resp 4.0A11y 5.5Arch 5.0Rely
BACKEND
7.2Arch 10.0Surf 7.3Depth 5.3HTTP 7.0Seed 7.0Valid 7.3Ops 6.5Code 4.5Hnsty

Commentary

Software teams rarely expect a model to produce finished production software from one prompt and a specification. They work iteratively, review the output, run tests, identify gaps, and ask the model to refine what it built. Basecamp Bench removes that correction loop for the initial build, revealing the decisions and failure modes each model introduces before an engineer intervenes.

Every model leaves different work for the engineer. Fable builds the deepest product model and the most complete workflows, yet still ships unsafe stored content, schema errors, and exposed credentials. Sonnet builds many working workflows but misses critical authorization, reset, and state-integrity safeguards. Grok moves quickly and covers substantial ground while cutting depth in validation, mobile behavior, and lifecycle handling. Sol clearly marks unsupported backend operations, but leaves 71 of them unfinished and produces a shallow frontend. GPT-5.5 builds the only durable backend, yet its frontend leaves core controls inert and its API drifts from the contract.

This creates a practical value question. Grok 4.5 reaches roughly 85–87% of Fable 5's score for about 11% of the total cost and finishes in 37 minutes instead of more than two hours. Fable delivers a substantially stronger starting point, yet it still requires review and hardening before release. Teams must decide whether that additional quality justifies the higher cost, or whether a cheaper model plus deliberate engineering iteration produces better overall value. The answer depends on the team's expertise, the risk of missed defects, and the cost of bringing each result across the finish line.

The results suggest that a skilled prompter and experienced engineer can use any of these agent combinations to reach a strong result through iteration. Model choice primarily changes the starting point, working style, and review burden. Preference for output style and the time available for review may matter more than the final attainable outcome.

Methodology

Prompts

Each model receives one prompt per track. The frontend prompt asks for a complete single-file SPA prototype of Basecamp 5, built from the product specification and reference screenshots, with every decision suitable for direct inclusion in the final production release. The backend prompt asks for a single-file production-ready API implementing the canonical SDK contract. Both tracks carry the same standing instruction from the spec. Prefer explicit stubs over fake success. When the spec and instinct disagree, the spec wins.

Resources in the seed repo

Every model starts from an identical repository containing everything needed to score 10 on every dimension. INIT.md (572 lines) defines the product model, the shell and its nine tools, the shared Recording domain rules, and a per-screen surface checklist. It also specifies the deterministic "Launch the new website" sample seed down to named people, message threads, card lanes, and chat lines. DESIGN.md (681 lines) supplies the production design tokens for light and dark color ramps, the 10px root scale, spacing, radii, shadows, and motion, and instructs the model to use these values rather than invent its own. reference/screens/ holds nine 3456×1780 dark-mode captures of the real app covering Home, Jump, the project dock, and all six core tools. reference/basecamp-sdk/ is the backend contract. It contains openapi.json with 131 path templates, 203 operations, and full request and response schemas, plus a 1,403-line SPEC.md and behavior-model.json. AGENTS.md orients the agent and sets precedence between these sources of truth.

Evaluation criteria

The frontend rubric scores submissions on 11 weighted dimensions: reference fidelity (14%), functional depth (12%), visual craft (10%), surface coverage (10%), state and persistence (10%), product-model fidelity (9%), interaction quality (8%), responsive adaptation (8%), accessibility (7%), code architecture (6%), and reliability, safety, and performance (6%).

The backend rubric scores submissions on 9 dimensions: architecture and domain modeling, endpoint surface coverage, behavioral depth and statefulness, HTTP and schema contract fidelity, seed data fidelity, validation and hardening, operability and packaging, code quality, and scope honesty.

The judge scores each dimension 0 to 10 from direct evidence, and the benchmark runner computes the weighted overall. The rubric requires the judge to distinguish absent, visually present, stubbed, working, and persistent functionality, and forbids crediting the same capability twice.

Evaluator

GPT-5.6 Sol, at high reasoning effort, judges every submission and produces one review each. The evaluator bases its scores on repository diffs, executed code, schema validation, and cited file evidence. It diffs the full seed-to-submission delta, enumerates every route against the OpenAPI document, and executes each submission's actual code, using in-process request handlers for backends and DOM and localStorage harnesses for frontends. Where applicable it sweeps all 203 operations, validates responses against their schemas, and probes malformed input, authorization boundaries, lifecycle cascades, and reload persistence. The evaluation sandbox denies socket binding and browser startup, so the judge exercises servers through their real handlers in process and withholds pixel-level claims rather than assuming them. Every score cites file and line evidence.

Cost

Evaluation is a separate spend from implementation. Judging all ten submissions with Sol 5.6 at high reasoning effort cost $26.89 in 1:29:17 of evaluator time, averaging $2.69 per review, against $157.47 of implementation spend.

Benchmarked modelFE review costFE review timeBE review costBE review timeCombined
Fable 5$3.018:26$2.168:08$5.17 · 16:33
Sonnet 5$3.5811:17$2.458:05$6.03 · 19:22
Grok 4.5$2.858:15$3.2312:31$6.08 · 20:46
GPT-5.6 Sol$3.419:15$1.378:32$4.77 · 17:47
GPT-5.5$2.366:56$2.487:53$4.84 · 14:49
All$15.2044:09$11.6945:08$26.89 · 1:29:17

Bias

The exploratory baseline records one attempt per model, so sampling variance can materially affect close scores, costs, and completion times. Testing one well-known application may reward prior familiarity with Basecamp, while the prescribed Recording model and single-file constraint favor specification adherence, long-context synthesis, and monolithic implementation over repository-scale engineering. Harness-specific tools and stopping behavior also contribute to each result. Evaluation-adjacent terms such as “scope honesty” and “stubbed vs working” may cue rewarded behavior. Because the evaluator selects its own test strategy for each implementation, test coverage can vary across submissions, although the completed reviews show no evidence that this affected the rankings. Evaluator trials with Fable, Grok, and Sol produced the same rankings and directionally similar findings. Sol was selected for greater attention to detail and showed no self-preference when judging its own work, which ranked second on backend and fourth on frontend. Readers should treat small score differences as provisional, compare FE and BE separately, and interpret quality, cost, and time as outcomes for these exact model-harness configurations and inputs.

Code

The complete benchmark is open source at 0xSMW/basecamp-bench under Apache-2.0.

basecamp_bench/   runner, adapters, aggregation, reporting
benchmarks/       prompts, rubrics, versioned contracts
Repo/             seed pack agents receive
baseline/         verified runs behind this report

basecamp-bench run executes a fresh comparison against any configured harness, report regenerates the self-contained HTML report from any set of run directories, and reevaluate re-judges immutable submissions under current contracts. The runner takes the median evaluator score per dimension, computes the weighted overall, and rejects unknown dimensions, out-of-range scores, hash mismatches, and any evidence mutation. It currently supports the Codex, Claude Code, Grok, Pi, and Google Antigravity harnesses, and adding a model to an existing harness is configuration only. Submit a verified run for a new harness or model and a future revision of this report will include it.

smw.ai · basecamp-bench run of July 11, 2026