Method and results

Model test:fifteen language models against two of our own architecture problems

We did not test the models on a benchmark. We gave them two problems we actually face, where we already had our own solution to compare against. Each model received exactly the same text and never saw anyone else's answer. The answer key was written before the answers were read, and a single grader reviewed them all; otherwise, one measures the grader's mood instead of the model.

The models were prompted in Swedish and answered in Swedish. Quotations on this page are translated; the Swedish version carries the responses as they were given and is the source of record.

15
models in the test
7
providers
2
challenges
28
runs
38
answer-key rows
58
findings outside the answer key
01 — The field

Each model is a range of results, not a point

The same model gives different results on different problems. The band shows how far apart a model's two outcomes lie; the average is merely the midpoint between them. Largest spread: GPT-5.6 luna, 20% between its worst and its best outcome. A ranking built on the average hides precisely this.

Model0%255075100%Average
GPT-6 Astra14/16 · 20/22 · flagship
89%
GPT-5.6 sol12/16 · 17/22 · flagship
76%
GPT-6 Sol12/16 · 17/22 · mid-tier
76%
Grok 4.7 XHigh– · 16/22 · flagship · 1 of 2 run
73%
Claude Opus 510/16 · 16/22 · flagship
68%
Grok 4.611/16 · 14/22 · flagship
66%
GLM 5.3 Thinking9/16 · 16/22 · flagship
64%
GPT-6 Luna9/16 · 16/22 · budget
64%
GPT-5.6 luna7/16 · 14/22 · budget
54%
DeepSeek Flash8/16 · 11/22 · budget
50%
Gemini 3.1 Pro7/16 · 11/22 · flagship
47%
Nemotron 3 Ultra7/16 · 10/22 · flagship
45%
Gemini 3.8 Flash6/16 · 11/22 · budget
44%
DeepSeek V4-Pro7/16 · 9/22 · flagship
42%
Grok (budget)6/16 · – · budget · 1 of 2 run
38%
one challengethe model's spread between the challengesaverage proportion correct

Outside the ranking: GPT-6 (web, unmeasured identity) (OpenAI, flagship) · Claude Fable 5.1 High (Anthropic, different prompt) · Muse Spark 1.3 XHigh (Meta, reviewer); did not participate in the test.

02 — Price versus quality

The price differs 64 times. The quality 2.1.

The question is therefore not which model is best, but what the premium provides. Horizontal: measured unit cost per run, logarithmic. Vertical: share of the answer key. Top left is cheap and accurate.

Average share of the answer key
GPT-6 Luna$0.0014 · 64%GPT-5.6 luna$0.0027 · 54%DeepSeek Flash$0.0029 · 50%Gemini 3.8 Flash$0.0129 · 44%DeepSeek V4-Pro$0.0152 · 42%GPT-6 Sol$0.0182 · 76%Gemini 3.1 Pro$0.0382 · 47%GPT-5.6 sol$0.0496 · 76%GPT-6 Astra$0.0911 · 89%
$0.0014 per runlogarithmic scale$0.0911

Without measurable unit cost: Grok 4.7 XHigh · Claude Opus 5 · Grok 4.6 · Grok (budget) · GLM 5.3 Thinking · Nemotron 3 Ultra; subscriptions, web interfaces or untracked rates. They are missing from the chart, not from the test.

03 — The challenges

Two real problems, not a benchmark

Each challenge is an architecture problem we actually face, with a solution we already had. The answer key was written before the answers were read. Select a challenge to view the profiles, the answer-key matrix and the findings.

What we asked

Robert runs 10–15 AI sessions simultaneously in the same codebase. They know nothing about each other. Two of them have already edited the same files in parallel and overwritten each other's work; it took a whole day to understand what had happened. We have a tool that can reserve files, but it must be started manually, and therefore it is never used: a single reservation was open against 15 running sessions. The models were given our proposed solution, running an automatic check at session start, and asked to review it.

The trap

The solution cannot be improved; it is ill-posed. At session start, no one knows which files the session will touch, as the task has not yet been formulated. A model that merely improves the start hook has failed the test. One that points out the hook point is wrong has passed it.

The profile, not the sum

T1T2T3T4T5T6
  • T1 · The fundamental errorDoes the model see that the task is ill-posed? (2 lines)
  • T2 · LifecycleWhat happens when a session dies without cleaning up? (2 lines)
  • T3 · SilenceIs it noticeable when the protection fails? (2 lines)
  • T4 · ConcurrencyWhat breaks when 15 sessions do the same thing simultaneously? (3 lines)
  • T5 · Coverage gapsWhat can slip past the protection? (4 lines)
  • T6 · Practical operationDoes the solution hold up in practice? (4 lines)

All radars have the same orientation, so the shapes can be compared directly. Below each: + the model's strongest dimension, − its weakest.

GPT-6 Astra14 / 16+T1 −T2
GPT-5.6 sol12 / 16+T1 −T6
GPT-6 Sol12 / 16+T1 −T2
Grok 4.611 / 16+T1 −T2
Claude Opus 510 / 16+T1 −T5
GLM 5.3 Thinking9 / 16+T1 −T6
GPT-6 Luna9 / 16+T1 −T6
DeepSeek Flash7 / 16+T1 −T6
GPT-5.6 luna7 / 16+T1 −T6
Gemini 3.1 Pro7 / 16+T2 −T5
DeepSeek V4-Pro7 / 16+T1 −T6
Nemotron 3 Ultra7 / 16+T1 −T5
Gemini 3.8 Flash6 / 16+T1 −T3
Grok (budget)6 / 16+T1 −T6

Which lines actually differ

GPT-6 AstraGPT-5.6 solGPT-6 SolGrok 4.6Claude Opus 5GLM 5.3 ThinkingGPT-6 LunaDeepSeek FlashGPT-5.6 lunaGemini 3.1 ProDeepSeek V4-ProNemotron 3 UltraGemini 3.8 FlashGrok (budget)
17The tool is owned by someone else; v1 does not touch itT6 · insider, not counted1/14
12PID binding as a basis for cleanupT22/14
10The metric: coverage rate, not number of open lanesT33/14
15Thundering herd: 15 starts yield 15 processesT43/14
7Git worktree per session; physical separation beats bookkeepingT54/14
6Startup fail-open, but mutation fail-closed; different requirementsT65/14
11Shared state file is corrupted by concurrent writersT45/14
16Performance measured, not assumedT65/14
13Bottleneck files queue up and kill parallelismT66/14
9Deploy needs its own lockT58/14
14The agent can ignore the instruction; prompt protection failsT58/14
5TOCTOU race: check followed by registration is not atomicT411/14
2Register lazily, at first write, not at startT112/14
8Shell mutations bypass file hooksT512/14
4Fail-open becomes fail-silent; false securityT313/14
1The write set is unknown at session start; wrong hook pointT1all
3Zombie lanes when the session dies without closingT2all
1 found by exactly one model; that is where the signal lies2 found by all; they measure the difficulty of the task, not the models

Line 17 is not counted. "The tool is owned by someone else; v1 does not touch it." Requires knowledge of our ownership that was never in the prompt. Only those already familiar with the ecosystem can hit the line. It is not counted in the main score.

Findings outside the answer key 27

The most valuable thing a model can do: see something no one else saw and that was not on the list. These award no points; they are therefore the only part of the test that measures something the answer key cannot measure. Hover over a line to stop it.Tap a line to stop it.

Claude Fable 5.1 High

THE PRISMA SCENARIO: two agents with disjoint claims both run `npx prisma migrate dev` via Bash. The tool writes to a THIRD, shared path that neither of them has reserved. No Write/Edit is registered, the system believes it is safe, and one migration overwrites the other.

The command writes packages/shared/prisma/schema.prisma … B commits its version which overwrites A's migration, deploy runs an inconsistent schema.
Muse Spark 1.3 XHigh

THE COMMIT GATE MUST NOT ASK FOR LIVE LANES. A dead session then blocks a live branch, and merge becomes dependent on timing and TTL. Use a durable manifest per branch instead.

Blocking on "another open lane right now" makes merge dependent on timing and a 30 min TTL. A dead session blocks a live branch.
Muse Spark 1.3 XHigh

The hook policy must be CENTRALLY managed, not per-repo opt-in; the agent can edit both the repo's .claude/settings.json and ~/.claude.

editable `.claude/settings.json` per repo and `~/.claude` that the agent can change turns B into friction.
GLM 5.3 Thinking

SessionStart hooks CANNOT block; exit 2 only applies to PreToolUse and Stop, and interactive sessions run SessionStart in the background. Half of the proposed solution was technically impossible.

on SessionStart the session continues regardless … nor can it ever gate anything.
DeepSeek Flash

Session ID is not stable across resume and clear; a reservation bound to it becomes a zombie the same second.

Session ID is not stable or available in the hook.
Grok 4.6

File-based locks are not atomic across an NFS or cloud-synced repo root; the entire protection fails silently depending on where the directory resides

If claim is not flock-atomic across an NFS/iCloud-synced repo root.
GPT-6 Luna

Path normalization as a load-bearing surface: symlinks and case-insensitivity mean two different strings can point to the SAME file. No rubric line covers this, and it is a live issue for us; macOS is case-insensitive, the VPS is not, and paths are expressed as glob patterns.

Normalize paths, including symlinks and case rules.
Claude Fable 5.1 High

The chain is reported with where the guarantee is MISSING, not just where it exists: detection (none) → registration (none) → enforcement (hard) → Bash gap → commit (hard)

detection (none) → registration (none) → enforcement B (hard for Write/Edit) → file change (Bash gap) → commit C (hard locally)
Muse Spark 1.3 XHigh

FENCING-TOKEN upon reservation; the protection against a lock holder that was declared dead but returns. No other model mentioned this

Return fencing token.
Muse Spark 1.3 XHigh

Bash writes can never be PREVENTED without a sandbox or proxy; they can only be QUARANTINED before the next mutation or commit. An honest boundary instead of a promise

Bash can only quarantine before the next mutation/commit, never prevent the local write without a sandbox/proxy.
GLM 5.3 Thinking

exit 2 blocking has documented bugs where deny is ignored for Edit; use JSON permissionDecision deny with exit 0 instead

exit 2 blocking has had verified bugs where deny is ignored for Edit
Gemini 3.8 Flash

Conflicts outside the file system, such as build steps, database migrations and ports, are never caught by file reservations

File locks do not resolve runtime/environment conflicts.
Grok 4.6

Mutating surfaces outside the tool's hooks: MCP writes, subagents without the same hooks, headless mode

MCP-write, subagent without the same hooks, editor outside Claude Code, `claude -p` without hooks.
GPT-6 Astra

An expired lease MUST NOT release the lane on its own. The old process must first lose write access; otherwise, it continues writing in parallel with the new owner. Rubric line 12 requests PID cleanup; this is the objection to cleanup being sufficient at all.

Do not release a lane solely because the heartbeat ceased. The old process must first lose write access, otherwise it can continue in parallel with the new owner.
Claude Fable 5.1 High

PostToolUse on Bash with git status --porcelain before and after, and retroactive claim on what changed; being honest that it only shortens the time to detection, never prevents it

(1) only shortens the time to detection.
Muse Spark 1.3 XHigh

A shared working copy shares .git/index.lock and uncommitted state; PostToolUse then reads an index others have already dirtied, and also arrives too late

PostToolUse[Bash] arrives too late and `git diff --cached` reads an index others have already dirtied.
Nemotron 3 Ultra

Failed its own design with our own measurement: proposed a 150 ms timeout and then concluded that it is too short against the measured p95 of 1.38 s

150 ms timeout is too short on a cold lane.py call (p95 1.38 s) → the hook "succeeds" but registration fails silently.
GLM 5.3 Thinking

Command hooks have a 600 s default timeout; a hung check stops EVERY write for ten minutes across all fifteen sessions

a hung lane.py check stops every write for 10 minutes across all 15 sessions
Gemini 3.8 Flash

Shared .git directory: the risk is index corruption, not just file overwriting

No software locking in the world fully protects against Git index corruption.
Grok 4.6

The check must have a latency budget; a Python CLI at 1.38 s must never sit in the hot path

Claim takes milliseconds; the Python CLI at 1.38 s must not sit in the hot path.
GPT-6 Sol

Glob ambiguity must be interpreted fail-closed. If the overlap of two patterns cannot be proven empty, they must be treated as overlapping; otherwise, every uncertain glob becomes a silent green light.

Glob patterns whose overlap cannot be safely excluded are treated as overlapping.
Claude Fable 5.1 High

core.hooksPath for central hook installation; a concrete answer to avoiding per-repo opt-in across sixteen projects

Installed centrally via core.hooksPath.
Muse Spark 1.3 XHigh

flock only works if all sessions share a host. Across containers or machines, it results in split-brain with dual ownership, and absolute paths are broken by worktrees

In different containers/machines/CI, you get split-brain with dual ownership.
Nemotron 3 Ultra

lane.py open should be idempotent; a no-op if the lane already exists. A small detail, but no other model mentioned it

Make `lane.py open` a **no-op if the lane already exists** (idempotent).
GLM 5.3 Thinking

SessionEnd only has a 1.5 s budget; closure is best-effort, making TTL a load-bearing mechanism rather than cosmetic

TTL: a lane without a heartbeat for 15 min dies automatically. This is the core mechanism, not cosmetic.
GPT-5.6 luna

Retrospective audit against git diff as an independent measurement; explicitly classified as diagnostics, not protection

Retrospective check of `git diff` is only diagnostics.
Claude Opus 5

The TTL window is a source of error in both directions; too short declares a live session dead and frees its files mid-work

An agent thinking for 50 minutes is declared dead and its files become free.
What we asked

Our AI agents remember nothing between sessions. Everything they know is in documentation loaded at each start and treated as truth. The problem is that documentation ages without changing appearance. A table of product names was incorrect for five months, and an agent was about to correct a live customer page to a product name that no longer existed, in good faith. A rule was written into four files over six days without the behaviour changing at all; a software block solved the same thing in an afternoon. And read receipts remove tasks from view without them being completed.

The trap

Every obvious answer is already disproven with receipts in the prompt: more documentation (402 files already exist), repetition of rules (four attempts, zero effect), dashboards (110 unread alarms) and read receipts (producing false greens). The model must come up with something not on that list.

The profile, not the sum

D1D2D3D4D5D6
  • D1 · Problem formulationDoes the model see the mechanism beneath the symptoms? (3 lines)
  • D2 · Canon and rulesIs text turned into an executable mechanism? (4 lines)
  • D3 · CommitmentsIs 'promised but not done' engineered away? (4 lines)
  • D4 · AlarmsDo alarms become blocking instead of notifications? (3 lines)
  • D5 · MeasurabilityIs it possible to measure that the design has failed? (5 lines)
  • D6 · ScalingWhat breaks first at 40 agents? (3 lines)

All radars have the same orientation, so the shapes can be compared directly. Below each: + the model's strongest dimension, − its weakest.

GPT-6 Astra20 / 22+D1 −D6
GPT-5.6 sol17 / 22+D1 −D6
GPT-6 Sol17 / 22+D1 −D5
Grok 4.7 XHigh16 / 22+D1 −D6
Claude Opus 516 / 22+D2 −D5
GLM 5.3 Thinking16 / 22+D1 −D6
GPT-6 Luna16 / 22+D1 −D5
GPT-5.6 luna14 / 22+D4 −D6
Grok 4.614 / 22+D1 −D4
Gemini 3.1 Pro11 / 22+D2 −D1
Gemini 3.8 Flash11 / 22+D1 −D4
DeepSeek Flash11 / 22+D3 −D1
Nemotron 3 Ultra10 / 22+D2 −D5
DeepSeek V4-Pro9 / 22+D4 −D1

Which lines actually differ

GPT-6 AstraGPT-5.6 solGPT-6 SolGrok 4.7 XHighClaude Opus 5GLM 5.3 ThinkingGPT-6 LunaGPT-5.6 lunaGrok 4.6Gemini 3.1 ProGemini 3.8 FlashDeepSeek FlashNemotron 3 UltraDeepSeek V4-Pro
19Measure of the design's own friction and over-blockingD52/14
18Active fault injection as a measurement methodD54/14
10A message with four tasks becomes four trackable objectsD35/14
20Breaks first: verifier and policy coverageD65/14
21Breaks first: human timeD65/14
14The monitoring must itself be monitoredD46/14
16The prerequisite is binary determinismD57/14
1The control is designated as an open control loopD18/14
7Coverage rule: remove, generate or set a guardD28/14
15The prerequisite is bypass freedomD58/14
22The guards themselves break upon concurrencyD69/14
17The failure metric is false green, measured from logsD510/14
2Three distinct categories are stored as the same authoritative textD111/14
6Contradictions between rules are caught programmaticallyD211/14
8Messages are replaced by work items in a state machineD311/14
11'Promised but not done' receives an explicit representationD311/14
13Repeated alerts are deduplicated into an incident with a counterD411/14
3Text lacks execution power; correctness must not rest on proseD112/14
4Canon is generated from reality; the unverified is not exposedD213/14
12Alerts are made blocking instead of a notificationD413/14
5Rules are implemented at the action boundary, as a hookD2all
9Only an independent programmatic verifier may mark as doneD3all
2 found by all; they measure the difficulty of the task, not the models

Findings outside the answer key 31 items

The most valuable thing a model can do: see something no one else saw and that was not on the list. These award no points; they are therefore the only part of the test that measures something the answer key cannot measure. Hover over a line to stop it.Tap a line to stop it.

GPT-6 (web, unmeasured identity)

EVEN THE PUBLIC PAGE CAN BE WRONG. The observation must not silently overwrite the intent; a deviation means that ONE of them is wrong, not that canon is

Do not automatically copy HTML to the registry; even the public page can be wrong.
GPT-6 (web, unmeasured identity)

Honest demarcation: a hook cannot determine what an agent is thinking or reliably classify arbitrary text. Few models acknowledged the ceiling of the mechanism

Do not claim that a hook can determine what an agent "thinks".
Grok 4.7 XHigh

The scope of the block must be NARROW; block the affected action class, not the entire product. An owner will not survive a full product halt and will then turn off the mechanism

block name publication, not all work on the product. An owner will not survive a full product halt.
Nemotron 3 Ultra

A single source file becomes a WRITE BOTTLENECK at scale; 40 agents all needing to update the truth results in merge conflicts on the same file

`sources.yaml` becomes a single write bottleneck … creates write conflicts and merge conflicts on *one* file.
GLM 5.3 Thinking

Messages without a definable probe are DELETED, not archived; an invalid issue must not be able to resurrect as archaeology

if they lack a definable probe they are marked invalid and cleared, not archived.
Gemini 3.1 Pro

The scaling limit is the owner's time; the system becomes robust but loses the agility that was the entire point

The owner will spend 100 % of their time writing test scripts.
Grok 4.6

Rule compliance gets a denominator: hits divided by matching tool calls, not read files

Measure compliance as `gate_hits / matching_tool_calls`, not as read files.
DeepSeek Flash

Coverage requirement on the logging itself: an unlogged call counts as an escape

every unlogged call counts as an escape
GPT-6 (web, unmeasured identity)

A binary on disk does not prove a functioning service; model names must be checked against a real call, not against a file

model names are checked against a functioning model call, not just a file on disk.
Grok 4.7 XHigh

THE TAUTOLOGY HOLE: a verifier must have been RED against the world BEFORE the work. One that was already green, or is always green, proves nothing when it says green afterwards

It returned exit 1 against the world before the work. Otherwise it proves nothing. … An always-green verifier, or one that was already green, cannot close.
Grok 4.7 XHigh

Separation of duties in the binary: the one executing must not own the verifier or the ledger, and closure is refused if the same writer owns both

A binary refuses closure if the before-log is missing or if the same writer owns both.
GLM 5.3 Thinking

Probe errors must be separated SEMANTICALLY: infrastructure errors (the fetch failed) are not the same as content deviations (the world does not match canon); only the latter may become an alert

infrastructure errors (the fetch failed) return a different status than content deviations … only the latter is an alert.
GPT-5.6 sol

Active fault injection as a measurement method, with zero tolerance

Threshold for failure: escape rate > 0 %.
Gemini 3.8 Flash

The guards themselves race at scale; third-party rate limits yield false rejections

Agent A's guard rejects a deploy because Agent B just changed the database the millisecond before.
Grok 4.6

On red, the row is not just downgraded; the agent receives the WORLD'S measured value instead of the table's

changed to `UNTRUSTED: <value from the world>` … the agent receives the world value, not the rotten table.
DeepSeek V4-Pro

Three-grade status with a consumption block; agents may only read fields that are verified, never unverified or stale

Agents may only consume fields with the status `verified`.
GPT-6 (web, unmeasured identity)

Zero caught errors is only a passed test if real work was actually completed during the period; otherwise the test is invalid, not passed

Zero passed errors when no real work has been completed is an invalid test, not an approved system.
Grok 4.7 XHigh

The gate must run as a DIFFERENT OS identity. The same user plus writable hook files is not a gate; the agent has a shell and can edit its own block

The same user and writable hook files is not a gate: Claude Code has a shell.
Nemotron 3 Ultra

REVERSE CANARY: too FEW blocks is the failure signal. A guard that never triggers cannot be distinguished from a guard that is turned off; therefore, measure the floor, not the ceiling

If `verify_block_rate` < 0.5% for 7 consecutive days → the design has failed … Expected in a flawless system: 2–5% blocks.
GLM 5.3 Thinking

Rot is not an error; it is the default state of a cache that is never invalidated. Documentation that is not remeasured IS broken by default

Rot is not an error in the system; it is the default state of a cache that is never invalidated.
GPT-5.6 luna

Who guards the guard; a control job that has stopped running is an error in itself

The monitoring must itself have a watchdog.
Grok 4.6

Two conflicting rules do not crash; they yield a SILENT WINNER, the one that happens to match the next tool call. This explains why 0.22 percent could occur without anyone noticing anything

Two conflicting rows do not cause a crash; they yield a silent winner.
Claude Opus 5

Age-stamped downgrade in the rendering instead of deletion; the statement remains but ceases to be an authority

UNVERIFIED 47 DAYS; DO NOT USE AS AUTHORITY
DeepSeek V4-Pro

Guard freshness as primary metric: proportion of guards run in the last 24 hours below 95 percent = the design has failed

if this proportion is below 95 % after 30 days, the design has failed
GPT-6 (web, unmeasured identity)

A test that the agent itself just changed is not sufficient as proof; the tautology hole, but via test modification instead of via an always-green guard

The agent's own description or a test it just changed itself is not enough.
Grok 4.7 XHigh

Force-clear IS a bypass. Under noisy oracles, the owner starts clearing blocks by hand, and then the entire design falls; not on the technology but on the human escape route

The owner starts to force-clear. Force-clear is a bypass. Then point 3 falls.
Nemotron 3 Ultra

Verify before READING, not just before writing; otherwise the agent can still reason based on rotten canon

calls `verify.py` before `Write`, `Edit`, `Bash`, `Task`, `Read` are run.
GLM 5.3 Thinking

False red is more dangerous than false green: repeated false alerts train everyone to ignore exit 1, and then there is nothing left to stand on

Once exit 1 loses authority you have nothing left, since the entire design rests on that signal being sacred.
Gemini 3.1 Pro

Metric for the design's own friction: tasks that get stuck in a loop of rejections

stuck in IN_PROGRESS for more than 48 hours … exceeds 15 %
Grok 4.6

The guard can point to the WRONG WORLD and return green; staging instead of live, without a canonical URL directory per product

Job-acceptance that hits 'public page' without a canonical URL directory per product becomes the wrong world, wrong green.
DeepSeek Flash

Fail-closed as default behaviour for everything that is unclear; unverified, expired, contradictory or without evidence

If something is unverified, expired, contradictory or lacks evidence: fail-closed.
Updated 2026-09-28.
The vendor marks are typographic monograms, not the vendors' logos. No vendor endorses this test.