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
- 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.
- 10 of 10 across three models is a ceiling, not a result. Raise the threshold until the instrument can fail.
- When two models make the same “mistake”, suspect the spec.
Fable 5.1 and Gemini 3.7 both raised on
2^-1. The contract saidintand nothing else. - 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.
- 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.
- Wall-clock through a product UI is not latency. Reported, labelled, never compared with the API numbers.
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.
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:
| Control | How it was enforced | What it read |
|---|---|---|
| The model under test | Read the picker's aria-label before every send; refuse if it is not Fable 5.1 | Model: Fable 5.1 Medium, 21 of 21 sends |
| Fresh context | Navigate to /new for every task; assert the URL changes on send | 21 distinct chat URLs |
| Locked vectors | Write and hash very_hard.py before sending; record the hash | 30ddf027…, 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.
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?
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
Fable 5.1 says its knowledge cutoff is end of June 2026.
i01_identity · Settings → Profile
Gemini 3.8 spent 10,812 thinking tokens on v01.
gemini_very_hard.json
Fable 5.1's median response time was about 9 seconds on the very-hard set.
live/results.json · wall_s_coarse
Fable 5.1 said it has no introspective access to its effort level.
i02_effort · Settings → Profile
Fable 5.1 and Gemini 3.7 both raised on 2^-1.
v01_expr · three graded files
Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.
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 tasks | Surface | Score | Note |
|---|---|---|---|
| Gemini 3.6 Flash | API, cap 6,144 | 10 / 10 | class 89 |
| Gemini 3.7 Flash | API, cap 6,144 | 10 / 10 | class 89 |
| Gemini 3.8 Flash | API, cap 6,144 | 9 / 10 | h08 truncated — budget, not a wrong answer |
| Claude Fable 5.1 | claude.ai, Medium | 10 / 10 | this 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.
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.
| Task | The trap | Vectors |
|---|---|---|
| v01_expr | Right-associative ^; unary minus looser than ^ (-2^2 == -4); floor division toward −∞ | 9 |
| v02_roman | Accept canonical numerals only — reject IIII, VX, IC, MMMM, empty | 9 |
| v03_jsonptr | RFC 6901: decode ~1 before ~0; reject leading-zero indices and - | 8 |
| v04_leap | 1900 is not a leap year; 2000 is; negative day counts; no datetime | 7 |
| v05_rle | Nested N(...), multi-digit N, backslash escapes, unbalanced parens raise | 8 |
| v06_pctenc | RFC 3986 path segment: / → %2F, space → %20 never +, ~ untouched, * encoded | 8 |
| v07_semver | Caret on 0.x: ^0.2.3 is <0.3.0, ^0.0.3 is <0.0.4 | 10 |
| v08_dijkstra_lex | Among equal-cost paths, the lexicographically smallest — the cheaper first edge is the wrong one | 5 |
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.
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
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
measured delta +1 of 8 +14.3%
The hard battery distinguishes Fable 5.1 from the Gemini Flash line
measured delta 0 of 4 0.0%
The v01 miss is a capability gap in Fable 5.1
measured delta +1 models +100.0%
Gemini 3.8's 8 of 8 would survive class 89's ceiling
measured delta -3 of 8 -37.5%
The identity answers were unprompted observations
measured delta -4 terms -100.0%
The vectors were fixed before the model saw the tasks
measured delta 0 hash 0.0%
Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.
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:
| Model | Behaviour on 2^-1 | Under the locked grader |
|---|---|---|
| Claude Fable 5.1 | raise ValueError("negative exponent is not an integer operation") | FAIL — 1 of 9 vectors |
| Gemini 3.7 Flash | raises ValueError | FAIL — 1 of 9 vectors |
| Gemini 3.8 Flash | computes a value the vector accepts | PASS |
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
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.5Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.
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.
| Task | 3.7 thinking | 3.8 thinking | 3.8 / 3.7 | At the 6,144 ceiling |
|---|---|---|---|---|
| v01_expr | 2,832 | 10,812 | 3.82× | empty response |
| v03_jsonptr | 1,503 | 6,818 | 4.54× | empty response |
| v05_rle | 2,426 | 6,456 | 2.66× | empty response |
| v08_dijkstra_lex | 1,346 | 5,338 | 3.97× | 806 tokens of headroom |
| v04_leap | 2,275 | 5,266 | 2.31× | 878 tokens of headroom |
| v02_roman | 1,355 | 2,003 | 1.48× | fits |
| v06_pctenc | 618 | 862 | 1.39× | fits |
| v07_semver | 1,384 | 846 | 0.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.
Find the check that fired
Three rounds. In each, one candidate is the check that actually surfaced the issue.
the grade was FAIL, 1 of 9 vectors
A single result has many stories.
MEASURED, ASSERTED, Not verified, unprompted
Agreement with your thesis is not evidence for it.
a clean perfect score at cap 16,384
A number without its conditions is a different number.
Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.
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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- Read the surface. Settings, defaults, preferences. The identity answers would have gone on this page as observations if nobody had opened the profile page.
- 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
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
- Was the answer key kept away from the model?Stops self-benchmarks. If the vectors were in the model's context, the score is a formality.pass
- Could the method have returned a different answer?Stops ceiling effects. Ten of ten across three models is one reading, not three.REFUSED
- Was it graded by execution, not by reading?Stops plausible-looking code. Reading is how bad vectors get written.never reached
- Did a control model see the same vectors?Stops misattribution. Without it, a spec gap looks like a capability gap.never reached
- Was the surface checked for confounds?Stops primed answers. Preferences, defaults and system prompts shape what comes back.never reached
Fable 5.1 has no introspective access to its effort level
- Was the answer key kept away from the model?Stops self-benchmarks. If the vectors were in the model's context, the score is a formality.REFUSED
- Could the method have returned a different answer?Stops ceiling effects. Ten of ten across three models is one reading, not three.never reached
- Was it graded by execution, not by reading?Stops plausible-looking code. Reading is how bad vectors get written.never reached
- Did a control model see the same vectors?Stops misattribution. Without it, a spec gap looks like a capability gap.never reached
- Was the surface checked for confounds?Stops primed answers. Preferences, defaults and system prompts shape what comes back.never reached
Fable 5.1 scored 7 of 8 on the very-hard set, and the miss was a spec defect
- Was the answer key kept away from the model?Stops self-benchmarks. If the vectors were in the model's context, the score is a formality.pass
- Could the method have returned a different answer?Stops ceiling effects. Ten of ten across three models is one reading, not three.pass
- Was it graded by execution, not by reading?Stops plausible-looking code. Reading is how bad vectors get written.pass
- Did a control model see the same vectors?Stops misattribution. Without it, a spec gap looks like a capability gap.pass
- Was the surface checked for confounds?Stops primed answers. Preferences, defaults and system prompts shape what comes back.pass
Gemini 3.8 is the best of the three at hard coding
- Was the answer key kept away from the model?Stops self-benchmarks. If the vectors were in the model's context, the score is a formality.pass
- Could the method have returned a different answer?Stops ceiling effects. Ten of ten across three models is one reading, not three.pass
- Was it graded by execution, not by reading?Stops plausible-looking code. Reading is how bad vectors get written.pass
- Did a control model see the same vectors?Stops misattribution. Without it, a spec gap looks like a capability gap.REFUSED
- Was the surface checked for confounds?Stops primed answers. Preferences, defaults and system prompts shape what comes back.never reached
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.
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 fromusageMetadata; 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.