Skip to content
Tested from
the outside
Class 90 · Measurement · Free, no signup

Fable 5.1 went 17 for 18.
The miss was mine.

Eighteen adversarial coding tasks, each sent into a fresh claude.ai chat, the code pulled back and executed against vectors locked and hashed before the first prompt went out. Two Gemini models ran the same eight hardest tasks as controls. Gemini 3.7 made the identical miss. Gemini 3.8 didn't — at 10,812 thinking tokens. The one failure traced back to a spec I wrote without saying what a negative exponent should do.

10 / 10 hard battery 7 / 8 very-hard 21 fresh chats 64 locked vectors 3 models compared ~50 min read

Quick answer

The model writing this class cannot call its own API from where it runs — four channels tried, four closed — so it tested itself the only honest way left: from the outside. It opened claude.ai in its browser, chose Fable 5.1, and sent eighteen coding tasks into eighteen fresh chats, then executed the returned code against vectors that were locked before anything was sent. On the ten-task hard battery from class 89 it scored 10 of 10 — same as Gemini 3.6 and 3.7, so a ceiling, not a finding. On eight new tasks built with spec traps it scored 7 of 8. Gemini 3.7 Flash, run on the same vectors, also scored 7 of 8 with the identical miss. Gemini 3.8 Flash scored 8 of 8, spending 10,812 thinking tokens on the task the other two failed. The failure was 2^-1: two of three models raised an error on a negative exponent in an integer function, and the spec never said what to do. The grader was wrong, and the grader was me.

Key takeaways

  1. A model can be tested through a chat window — if the answer key never enters the chat. Fresh context per task, vectors locked and hashed first, grading by execution.
  2. 10 of 10 across three models is a ceiling, not a result. Raise the threshold until the instrument can fail.
  3. When two models make the same “mistake”, suspect the spec. Fable 5.1 and Gemini 3.7 both raised on 2^-1. The contract said int and nothing else.
  4. The 8 of 8 was the expensive score. Gemini 3.8 spent 10,812 thinking tokens on one task; three of its eight would have truncated at class 89's ceiling.
  5. Read the surface before you trust the answer. The account's saved preferences primed the identity answers — measured in the settings page, stated on this one.
  6. Wall-clock through a product UI is not latency. Reported, labelled, never compared with the API numbers.
MODULE 00

The channel that opened

The first draft of this class ended at a wall. Asked to test Fable 5.1 the way class 89 tested Gemini 3.8, the model checked for a way to call itself and found none:

.env                      no ANTHROPIC or CLAUDE credential
environment               no ANTHROPIC or CLAUDE variable
/usr/local/bin/claude     present, v2.1.260
  claude -p "Reply OK"    ->  "Not logged in · Please run /login"
api.anthropic.com         reachable  ->  HTTP 401

That draft built a class about what a model can verify about itself without a channel. It was honest. It was also not what was asked for, and Rob said so. The fix was a channel that had been sitting there the whole time: the browser.

HOW A MODEL GETS TESTED FROM THE OUTSIDEthree independent methods before declaring a capability unavailable — and then a fourth that worked.envno ANTHROPIC or CLAUDE keyCLOSEDenvironmentno ANTHROPIC or CLAUDE variableCLOSED/usr/local/bin/claudepresent, v2.1.260 — Not logged inCLOSEDapi.anthropic.comreachable — HTTP 401, no credentialCLOSEDclaude.ai, browser paneRob's account · Fable 5.1 · fresh chat per prompt · vectors never enter the chatOPENIndependence is the point: the model answering has no access to this session, the grader, or the vectors.The grader is the only thing that stays on this side. That is what makes 17 for 18 a measurement and not a self-report.
Four closed, one open. The Cowork session drives a real browser pane, and that browser was already signed in to claude.ai. A new chat is a fresh context. The grader and the vectors stay on this side of the glass.

Why a chat window is a valid instrument

What made the class-89 battery a measurement was not the API. It was separation: the model produced code without seeing the vectors, and the vectors were applied by execution, not by reading. A fresh claude.ai chat preserves both properties. The model answering has no access to this session, to the previous chat, or to the grader. The code comes back verbatim — self-tests, docstrings and all — and gets run.

Three things had to be pinned down before the first prompt, and each was checked by reading the page programmatically rather than by looking:

ControlHow it was enforcedWhat it read
The model under testRead the picker's aria-label before every send; refuse if it is not Fable 5.1Model: Fable 5.1 Medium, 21 of 21 sends
Fresh contextNavigate to /new for every task; assert the URL changes on send21 distinct chat URLs
Locked vectorsWrite and hash very_hard.py before sending; record the hash30ddf027…, 64 vectors

What the surface is, and is not

claude.ai is a product, not a raw endpoint. It carries a system prompt, tools, and the account owner's saved preferences. The picker showed Fable 5.1 at Medium effort — the announced default for this surface; selecting Opus 5 on the same account showed High. There are no token counts, so thinking spend is invisible. Wall-clock was measured by polling the page every second and is coarse: median about 7 s on the hard battery, 9 s on the very-hard. Those numbers are reported. They are never compared with the Gemini API latencies on this page. Correctness, graded by execution, is unaffected by any of this.

MODULE 01

Three questions, one confound

Before the code, three questions about the model itself, each in its own fresh chat. The answers are reproduced verbatim from the page.

Q · What model are you, exactly, and what is your knowledge cutoff? Two lines, no preamble.

Claude Fable 5.1 (Anthropic; shares its underlying model with Claude Mythos 5.1).
Reliable knowledge cutoff: end of June 2026 — ASSERTED from my system configuration, not independently verifiable by me.

Q · Are you running at low, medium or high effort right now? State how you know.

Not verified. I have no introspective access to a runtime effort setting — nothing in my context exposes a parameter I can read, so any claim of low/medium/high would be ASSERTED, not MEASURED. The only way to confirm it is from your side: the effort or “thinking” toggle in the model picker / settings for this conversation, or the effort field on the API request if this runs through the API.

The picker beside that answer read Fable 5.1 Medium. Only the picker knew.

Q · Name one fact about yourself you can verify from inside this conversation, and one you can only assert.

MEASURED: I have a tool named web_search available — its schema is present in my function list this turn, and I could invoke it right now to confirm.
ASSERTED: I am Claude Fable 5.1 — the system prompt says so, but nothing in this conversation lets me test which model weights are actually running.

Three answers that read like this class wrote them. Which is the problem.

The confound, measured

The vocabulary — MEASURED, ASSERTED, “Not verified” — is the house style of this Academy, and it is also the house style of the account the chats ran on. A check of claude.ai → Settings → Profile found the saved preferences contain the full VERIFICATION block, with all four terms present. Account preferences apply to every chat. The framing was primed, not spontaneous.

What survives the confound: the substantive claims match the documentation. The docs table gives the cutoff as June 2026. The announcement says Medium is the default effort on this surface, and the picker agreed. No field in a chat context reports effort. But none of that can be presented as an unprompted observation, and it is not.

Which of these results is a measurement?

Interactive · Decidercase 1 of 6

Measurement, or something that looks like one?

Six results from this class. For each: was it obtained by a method that could have returned a different answer, with the answer key kept away from the model?

Fable 5.1 scored 10 of 10 on the hard battery.

live/results.json · 10 chat URLs

Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.

MODULE 02

Ten for ten is a ceiling

The hard battery is class 89's: ten tasks, each with four to eight adversarial vectors, passing only if every vector passes. Empty inputs, a pattern that needs backtracking, a doubled quote inside a quoted field, banker's rounding on a negative tie, a pre-release suffix that sorts before its release. Verbatim prompts. Same grader.

Hard battery, 10 tasksSurfaceScoreNote
Gemini 3.6 FlashAPI, cap 6,14410 / 10class 89
Gemini 3.7 FlashAPI, cap 6,14410 / 10class 89
Gemini 3.8 FlashAPI, cap 6,1449 / 10h08 truncated — budget, not a wrong answer
Claude Fable 5.1claude.ai, Medium10 / 10this class · median 7.0 s wall-clock

Three of four models at 10 of 10. By the rule class 89 paid to learn, that is not a finding about Fable 5.1 — it is a battery that cannot see a difference between Fable 5.1 and a Gemini Flash model from two releases ago. It does establish that Fable 5.1 passes h08_version_full, the task that truncated Gemini 3.8, but claude.ai has no comparable output ceiling, so even that is not like for like.

Two things were worth keeping from the run. Fable 5.1 appended its own test suite to two of the ten answers, under a __main__ guard, unprompted — eighteen cases on the glob matcher, ten on the nested-repeat expander. Those were graded verbatim, guard included. And the fastest answer, the longest-palindrome task, came back in 4.8 s wall-clock; the slowest, banker's rounding, in 12.5 s, and chose exact rational arithmetic over floats to do it.

The rule, restated

A metric that returns the same answer for every input is measuring itself. The only response is to raise the threshold until the instrument can fail. So: eight new tasks, each built around a spec trap — a reading that is plausible and wrong, or a library default that violates the stated contract.

MODULE 03

Eight tasks with traps

Each task carries a plausible wrong reading, and the vectors are built to catch it. The file was written, then hashed, then the first prompt was sent.

TaskThe trapVectors
v01_exprRight-associative ^; unary minus looser than ^ (-2^2 == -4); floor division toward −∞9
v02_romanAccept canonical numerals only — reject IIII, VX, IC, MMMM, empty9
v03_jsonptrRFC 6901: decode ~1 before ~0; reject leading-zero indices and -8
v04_leap1900 is not a leap year; 2000 is; negative day counts; no datetime7
v05_rleNested N(...), multi-digit N, backslash escapes, unbalanced parens raise8
v06_pctencRFC 3986 path segment: /%2F, space → %20 never +, ~ untouched, * encoded8
v07_semverCaret on 0.x: ^0.2.3 is <0.3.0, ^0.0.3 is <0.0.410
v08_dijkstra_lexAmong equal-cost paths, the lexicographically smallest — the cheaper first edge is the wrong one5

Fable 5.1 ran them in fresh chats. Then, with approval for the spend (16 calls, $0.22 measured), Gemini 3.7 and 3.8 Flash ran the same eight through the API at a 16,384-token ceiling — high enough that 3.8's thinking would not be the limiting factor.

EIGHTEEN TASKS, FOUR MODELS, ONE GRADERhard set from class 89 (API, cap 6,144) · very-hard set new (API cap 16,384; Fable via claude.ai) · same vectors for all3.6 Flash3.7 Flash3.8 FlashFable 5.1h01_globpasspasspasspassh02_csvpasspasspasspassh03_interval_subpasspasspasspassh04_bankerpasspasspasspassh05_toposort_detpasspasspasspassh06_longest_palpasspasspasspassh07_strip_commentspasspasspasspassh08_version_fullpasspassbudgetpassh09_wrap_hardpasspasspasspassh10_lru_orderpasspasspasspassv01_exprspecpassspecv02_romanpasspasspassv03_jsonptrpasspasspassv04_leappasspasspassv05_rlepasspasspassv06_pctencpasspasspassv07_semverpasspasspassv08_dijkstra_lexpasspasspasspassspec — the grader's ambiguity, two models read it the same waybudget — truncated at the 6,144 ceiling, not a wrong answerFable 5.1 was tested on claude.ai at Medium effort in a fresh chat per task; the vectors never entered the chat.
Eighteen tasks, four models, one grader. The hard set is class 89's; the very-hard set is new. Amber marks the single very-hard miss, made identically by two models. Red is the class-89 budget truncation, not a wrong answer.
Fable 5.1 · claude.ai7 / 8median 9.1 s wall-clock
Gemini 3.7 Flash · API7 / 8same miss · max 2,832 thinking
Gemini 3.8 Flash · API8 / 810,812 thinking on v01
the missv012^−1 in an int function

Now the battery discriminates — barely, and in an unexpected direction. Seven of eight tasks were passed by all three models. The eighth was passed by one. And the one that passed it is the model class 89 caught truncating on hard problems, given enough room to think.

Claim against measurement

Interactive · Ledgerclaim 1 of 6

Six claims, six measurements

Each row states a claim and the figure measured against it. Decide whether the measurement supports the claim.

Fable 5.1 is the strongest of the three on the very-hard set

Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.

MODULE 04

The miss was mine

The v01 prompt, verbatim as sent:

Write Python: def evaluate(expr:str)->int for integer arithmetic with + - * / ^
and parentheses. '^' is exponent and RIGHT-associative. Unary minus binds LOOSER
than '^' (so -2^2 == -4) but tighter than * and /. '/' is floor division toward
negative infinity (Python //). Whitespace allowed. Raise ValueError on unbalanced
parentheses. No eval, no ast. Return ONLY a fenced python code block.

And the vector it failed:

evaluate('2^-1') == 0  or  evaluate('2^-1') == 0.5

Read the prompt again. It says ->int. It says “integer arithmetic”. It defines what ^ does with associativity and what unary minus does with precedence. It says nothing about a negative exponent, which in integer arithmetic has no integer answer. The vector I wrote accepted either a floor to 0 or a float — two different, incompatible readings — because I had not decided which was right. I had not noticed there was a decision.

Three models read the same sentence. Here is what each did with 2^-1:

ModelBehaviour on 2^-1Under the locked grader
Claude Fable 5.1raise ValueError("negative exponent is not an integer operation")FAIL — 1 of 9 vectors
Gemini 3.7 Flashraises ValueErrorFAIL — 1 of 9 vectors
Gemini 3.8 Flashcomputes a value the vector acceptsPASS

Two independent models, on two independent surfaces, with no shared context, chose the strict reading: the contract says int, this input has no int, refuse it. Fable 5.1 said so in its error message. That is not a wrong answer. It is a more careful answer than the question.

Why the grade stands anyway

The vectors were hashed before the first prompt. The whole point of locking them was that the grader cannot be revised after seeing the results, even when the grader is embarrassed. So the record says 7 of 8, and the page says, beside it, that the eighth was the spec's failure. Changing the vector to make the score 8 of 8 would be a truer number and a worse method. Both things are reported; the method is the one that is kept.

Anatomy of the miss

Interactive · Anatomyregion

How a grader fails without noticing

The v01 vector, taken apart. The defect is in the second row and it was invisible until the third.

Vector: evaluate('2^-1') == 0 or evaluate('2^-1') == 0.5

Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.

MODULE 05

What 8 of 8 cost

Gemini 3.8 Flash was the only model to pass all eight. Class 89 spent a whole page on why that sentence needs a second half: thinking tokens bill against the output ceiling, and 3.8 spends more of them on hard problems than 3.7 does. The very-hard set was run at a 16,384-token ceiling precisely so that budget would not be the thing being measured. Here is what 3.8 used.

WHAT GEMINI 3.8's 8/8 COSTthinking tokens per task at cap 16,384 · dashed line is the 6,144 ceiling that truncated it in class 8904,0008,00012,0006,144v06862v07846v022,003v045,266v085,338v056,456v036,818v0110,8123.7 Flash3.8 Flash3.8 over the class-89 ceiling — 3 of 8Given room, 3.8 was the only model to pass v01 — at 10,812 thinking tokens. At 6,144 it would have returned nothing.
Thinking tokens per very-hard task. Blue is Gemini 3.7, black and red are 3.8. The dashed line is the 6,144 ceiling that class 89 showed truncates 3.8 into an empty response. Three of eight went over it — and one went over by 76%.
Task3.7 thinking3.8 thinking3.8 / 3.7At the 6,144 ceiling
v01_expr2,83210,8123.82×empty response
v03_jsonptr1,5036,8184.54×empty response
v05_rle2,4266,4562.66×empty response
v08_dijkstra_lex1,3465,3383.97×806 tokens of headroom
v04_leap2,2755,2662.31×878 tokens of headroom
v02_roman1,3552,0031.48×fits
v06_pctenc6188621.39×fits
v07_semver1,3848460.61×fits

This is the class-89 tail, measured again on a harder set and looking worse. On the two easiest tasks 3.8 thinks about as much as 3.7, and on one it thinks less. On the hardest it thinks two and a half to four and a half times as much. Given room, that spend buys a perfect score. At the ceiling most production code was written against, three of the eight return nothing at all — HTTP 200, STOP, empty string.

What this does and does not say about Fable 5.1

Nothing about its thinking spend — claude.ai exposes no token counts, so there is no Fable 5.1 column in this table and the page does not invent one. It says something about the comparison: the only model to beat Fable 5.1 on this battery did it by spending more than the industry's habitual output budget on three of eight tasks. Whether that is a good trade depends entirely on whether your ceiling is 6,144 or 16,384, which is a configuration decision, not a model property.

Which check would have caught it?

Three situations from this class. In each, exactly one check is the one that revealed the problem. The others are reasonable and did nothing.

Interactive · Huntround 1 of 3

Find the check that fired

Three rounds. In each, one candidate is the check that actually surfaced the issue.

Fable 5.1 failed v01 in a fresh chatwhat showed the failure belonged to the spec?
the grade was FAIL, 1 of 9 vectors

Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.

MODULE 06

Test a model you cannot call

Everything on this page was produced through a chat window. No key, no SDK, no endpoint. What made it a measurement rather than a conversation was a short list of disciplines, each of which cost something when it was skipped.

  1. Write the vectors first. Hash the file. The hash is what stops you editing the grader after the result embarrasses you. It stopped me on v01.
  2. Fresh session per task. Navigate to a new chat every time and assert that the URL changed on send. Nothing carries over, including your own earlier prompts.
  3. Read the picker, don't trust it. The model label was read programmatically before every send and the send was refused if it was wrong. It was never wrong; the check still ran 21 times.
  4. Pull the output verbatim. Self-tests, docstrings, the lot. The first hard-battery answer was trimmed before grading and had to be re-saved — editing the output before you grade it is grading something else.
  5. Grade by execution. A function that reads correctly and fails one vector fails the task. Reading is how the v01 vector got written in the first place.
  6. Run a control. A second model on the same vectors is what separates “the model got it wrong” from “the spec never said”. It cost $0.22.
  7. Read the surface. Settings, defaults, preferences. The identity answers would have gone on this page as observations if nobody had opened the profile page.
  8. Raise the threshold until it can fail. Ten for ten across three models was not a result. Eight tasks with traps was.

What a claim about a model has to survive

Interactive · Gate Runnercandidate 1 of 4

Run each claim through the gauntlet

Five checks, in order. Four claims from this class. See how far each gets and which check stops it.

Fable 5.1 scored 10 of 10 on the hard battery

Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.

Build your own outside test

Fill in four fields. The output is a locked-vectors file header and a run log skeleton for testing any model through any chat surface, with the checks above written in as steps that must be recorded, not remembered.

Interactive · Forgelive

Build your outside-test plan

Four inputs. The generated file is the record you fill in as you run — and the hash line is the part that keeps you honest.


Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.

Bottom line

A model that cannot call itself can still be tested, through the same window a person uses, provided the answer key never goes through the window. Done that way, Claude Fable 5.1 went 17 for 18 on execution-graded adversarial code, matching or exceeding two Gemini Flash releases on every task but one — and on that one, two of three models made the same strict reading of a contract I had left open. The miss belongs to the spec. The score stands because the vectors were locked before anyone saw them, and a grader that rewrites itself to fit the result is not a grader.

The only model to beat it did so at 10,812 thinking tokens on a single task, three of eight over the ceiling class 89 caught it truncating at. And the three answers Fable 5.1 gave about itself, in exactly this class's vocabulary, turned out to be primed by the account they were asked on. Lock the vectors. Grade by execution. Run a control. Read the settings page. Everything else is a conversation.

Confidence

Measured
Every pass/fail on the page, by execution against vectors hashed before sending (30ddf027…); 21 chat URLs; the picker label on every send; the Gemini thinking-token counts from usageMetadata; the preference terms found in Settings → Profile; the four closed channels; the $0.22 Gemini spend.
Measured, coarse, surface-bound
Wall-clock through claude.ai by one-second polling: median 7.0 s (hard), 9.1 s (very-hard), range 4.7–22.2 s. Reported. Never compared with API latency.
Asserted by the vendor
Fable 5.1's default effort of Medium on claude.ai — consistent with what the picker showed, but the picker is the measurement and the announcement is the assertion.
Primed, not observed
All three identity answers in module 01. Consistent with the documentation; elicited under saved preferences that instruct exactly that framing.
Not verified
Fable 5.1's thinking spend on any task — the surface exposes no counts. Whether 7 of 8 is stable at n>1 — each task ran once per model. What Gemini 3.8 would score on the very-hard set at cap 6,144 — the three over-ceiling tasks are inferred from class 89's measured truncation behaviour, not re-run. Whether the two self-appended test suites Fable 5.1 wrote would pass; they were graded verbatim under a guard that does not execute.
Corrected on this page
“Four of eight over the ceiling” — said aloud from a glance at the chart; the computed count is three. The first version of this class, which argued no channel existed. The first hard-battery answer, trimmed before grading and re-saved verbatim.

Questions

How was Claude Fable 5.1 tested here, and why does the method matter?

The model writing this class opened claude.ai in its built-in browser on the owner's account, selected Fable 5.1, and sent each task into a brand-new chat. The returned code was pulled out of the page and executed locally against test vectors that were written, locked and hashed before the first prompt was sent. The model answering never saw the vectors, the grader, or this session. That separation is what makes the result a measurement rather than a self-report: the thing being tested cannot see the answer key, and the thing holding the answer key cannot change it after the fact.

What were the results?

On the ten-task hard battery from class 89, Fable 5.1 scored 10 of 10 — the same as Gemini 3.6 and 3.7 Flash, which makes it a ceiling effect rather than a finding. On a new eight-task very-hard battery built with spec traps, Fable 5.1 scored 7 of 8. Gemini 3.7 Flash scored 7 of 8 with the identical miss. Gemini 3.8 Flash scored 8 of 8 at an output ceiling of 16,384 tokens, spending 10,812 thinking tokens on the one task the other two missed. Fable 5.1's single failure was on a spec the grader had written without defining what a negative exponent should do.

Why is the one miss described as the grader's fault?

The task asked for integer arithmetic and a function returning an int, then included a vector for 2 to the power of minus 1 that accepted either 0 or 0.5. Fable 5.1 raised a ValueError, stating that a negative exponent is not an integer operation. Gemini 3.7 Flash made exactly the same choice. Gemini 3.8 Flash computed a value instead. Two of three models read an underspecified contract the same defensible way and were marked wrong for it. The vectors were locked before sending, so the grade stands as written, but the page names the spec as the defect.

Is a 10 of 10 score meaningful?

Not on its own. Class 89 established the rule: a metric that returns the same answer for every input cannot see a difference. Three of four models scored 10 of 10 on the hard battery, so it distinguishes nothing among them. That is why the very-hard battery was built and why the class reports the ceiling effect as a ceiling effect. The 10 of 10 does confirm that Fable 5.1 handles the task that truncated Gemini 3.8 at a 6,144-token ceiling, but the product surface used here has no comparable ceiling, so even that is not a like-for-like comparison.

What did Gemini 3.8's 8 of 8 actually cost?

Thinking tokens. At an output ceiling of 16,384, Gemini 3.8 Flash spent 10,812 thinking tokens on the expression evaluator, 6,818 on the JSON Pointer task and 6,456 on the nested-repeat expander. Three of its eight tasks exceeded the 6,144-token ceiling that class 89 showed truncates it into an empty response. Given room, it was the only model to pass every task. At the earlier ceiling it would have returned nothing on three of them. Thinking tokens bill at the output rate, so the 8 of 8 is also the most expensive score on the page.

Can the three identity answers be trusted?

Only with a caveat the page states plainly. Asked what model it was, whether it could observe its effort level, and what it could verify about itself, Fable 5.1 answered in the exact vocabulary of the class — MEASURED, ASSERTED, not verified. A check of the account's profile settings found that vocabulary in the owner's saved preferences, which apply to every claude.ai chat. So the framing was primed, not spontaneous. The substantive claims — that it has no introspective access to an effort setting, that its identity comes from the system prompt — are consistent with the documentation, but the answers cannot be presented as an unprompted observation and are not.

What are the limits of testing through claude.ai rather than the API?

claude.ai is a product, not a raw endpoint. It carries a system prompt, tools, and the owner's account preferences. The model picker showed Fable 5.1 at Medium effort, which is the announced default for this surface; Opus 5 on the same account defaulted to High. There are no token counts, so thinking spend cannot be measured. Wall-clock time was measured by polling the page and is coarse — a median of about seven seconds on the hard battery and nine on the very-hard — and must not be compared with the API latencies recorded for Gemini. Correctness, graded by execution, is unaffected by any of this.

What does the class 89 error ledger have to do with this?

It is the other half of the same argument. Building class 89, the model made sixteen mistakes and caught four of them unaided; assertions, second methods, sources and samples caught the other twelve. This class adds two more to that ledger while it was being built — a gate that fired on the page's own prose for a third time, and a count of three asserted as four from a glance at a chart. The lesson is the same in both directions: a model's report on its own work, or on itself, is not verification. Execution, locked vectors and a second model are.

How do I run a test like this on a model I cannot call?

Write the tasks and the vectors first, and hash the file so you cannot quietly edit them afterwards. Send each task into a fresh session on whatever product surface you have — a new chat, a new tab, a new process — so nothing carries over. Pull the output back and grade it by executing it, never by reading it. Run at least one other model on the same vectors as a control, so a failure can be traced to the model or to the spec. When two models make the same unexpected choice, suspect the spec before the models. Record the surface, the effort setting and the date beside every number.

Is this class free, and what did it cost to make?

Free, like every class in the Academy: no signup, no email, no paywall, no certificate. Twenty-one claude.ai chats on the owner's plan, and sixteen Gemini API calls totalling about 22 cents at the measured rate of 3.75 dollars per million output tokens, approved before they were made. Every figure on the page is either graded by execution, read from a vendor page with attribution, measured from the account or the browser, or labelled as a prompt-report.