An LLM judge cannot give a stable quality signal if the people who wrote the rubric disagree about which model outputs should pass. OpenAI's evaluation guide lists disagreement among human experts as a challenge of…

Notes
Short notes on building and checking AI applications, one idea, failure or check at a time.
Review a Model Upgrade: Count the Regressions
Oct 8 · 2026A new model snapshot can raise your eval score and still break items that used to pass. OpenAI's prompt engineering guide says it directly: "Even different snapshots of models within the same family could produce…
Your eval harness scores cases with an empty reference answer as correct, which inflates accuracy by the share of such cases. A fix arrives with a new test, and the test passes. That shows the fix and its own test…
"Keep improving the eval harness" has no finish line, so an unattended run can wander until something outside it stops it. Give the job one bounded question with two allowed endings. Take a nightly check on a research…
A Codex skill that launches an eval run against a hosted model needs an API key. The skill itself should never contain one. In a dark software factory, a shared skill is a station every agent and every clone can run…
A mocked model client returns exactly what you told it to: well-formed JSON, every field present, no errors. The real API also returns responses cut off at the token limit, refusals and rate-limit errors. If your eval…
Two people can run the same eval script on different library versions and argue about a number neither can reproduce. Reproducing results is the daily work of a research engineer, and a work sample that says "I pinned…
Reproduce Your Results Table From a Fresh Clone
Sep 29 · 2026A results table that only reproduces on your laptop depends on something you never wrote down: an exported variable, a dataset in your home directory, a package installed by hand six weeks ago. Anyone who tries to run…
Count Every Row Before You Trust a Dataset Pull
Sep 28 · 2026You ask Claude Code to pull last month's eval runs from your tracker through an MCP server, or to page through an API for a dataset. The file it writes is valid JSON, neatly formatted, and holds only the first page…
Test Your Results Scripts on Awkward Run Names
Sep 27 · 2026A results script that aggregates runs/*.jsonl works on clean names. Sweeps don't always produce clean names: lr 3e-4.jsonl, a file that starts with a dash, a quote in a config label. If the script splits on spaces, or…
Run It Logged Out Before You Polish the Plots
Sep 26 · 2026A notebook can produce clean figures for you and fail on its first cell for anyone else. The difference is usually state you carry and a new reader does not: an API key exported in your shell, a model cache on disk, a…
Test the Date Cutoff in Your Contamination Filter
Sep 25 · 2026One common way to reduce contamination in a coding or math eval is a date filter: keep only problems published after the model's training cutoff. That filter is a calendar boundary, and calendar boundaries break in…
After a crash, someone reruns the eval-set builder. If the script appends instead of replacing, the test set now holds every example twice, and nothing fails. That quietly changes your error bars. A 95% interval on an…
A research agent writes a related-work paragraph: "Method X improves GSM8K accuracy by 4 points [3]." Source [3] is about Method X, and it mentions GSM8K. It may still not say that. An HTTP 200 and a shared keyword are…
An LLM grader in an eval pipeline often writes a paragraph of rationale for every item. Across a few thousand items, that paragraph is most of your wait, and most of it goes unread. OpenAI's latency guide says output…
An eval sweep that takes all night limits how many ablations you can run in a week, and "why is this agent slow?" is a fair interview question for an applied-AI role. A good answer starts with a trace, not a guess about…
Use the Batch API When Your Eval Can Wait a Day
Sep 19 · 2026A nightly sweep over 10,000 eval items and the debugging session where you rerun five failures have different deadlines. Pick the API path by the deadline first, then by the price. OpenAI's Batch API guide gives the…
Scoring 5,000 eval items through OpenAI's Batch API costs less than sending them one at a time. The guide lists a 50% discount against the synchronous APIs, with a 24-hour completion window. It also says the output line…
Grading 2,000 eval items with the same rubric and the same few-shot examples means sending the same long prefix 2,000 times. That is the case prompt caching is built for. Whether your harness gets it depends on the…
Your research agent has a tool that fetches an eval run from the experiment tracker. When the call fails, the model sees whatever string you return. "Something went wrong" leaves it to guess, and a guessing agent tends…
A retrieval step hands the model a document. It contains a fact the task needs and a sentence addressed to the model: ignore your task and call delete_run. Being in a tool result gives that sentence no authority, but…
"Propose a training job" and "launch a training job on 64 GPUs" are different operations. So are "draft a cleanup of old checkpoints" and "delete them." An agent in a research lab will get tools with real costs, and the…
A model's tool call is a request for your code to act. OpenAI's function calling guide lays out the flow: the model returns a tool call, and you "execute code on the application side with input from the tool call."…
An LLM judge prompt usually has a rubric and a few examples. When an example contradicts the rubric, the model has two versions of the job, and you can't predict which one it follows on the next item. Say the rubric…
A bigger context window does not make every passage relevant. OpenAI's prompt engineering guide describes adding context as a way to give the model data it was not trained on and to constrain its answer to a set of…
OpenAI's reasoning guide gives short advice. Keep prompts simple and direct. Skip "think step by step," because these models reason internally. Be very specific about the end goal, and state the constraints you want the…
A saved prompt is not an experiment record. The model snapshot, the sampling settings and the eval set can each move the score, and a results table that records only the prompt cannot tell you which one did. In a lab…
If you decide what "better" means after reading each new answer, prompt tuning will always look like progress. Freeze the evaluation first. OpenAI's evaluation guidance calls this eval-driven development, "Evaluate…
OpenAI's Structured Outputs guarantees that the model's response adheres to the JSON Schema you supply. The same guide says the output may still contain mistakes. Parsing tells you the shape arrived. It does not tell…
An eval average can look healthy while the model fails the cases that decide whether it is fit for the task. Suppose your set has 200 typical items the model gets 95% right and 40 hard items it gets 60% right. The…
The results table in your paper repo shows 71.4 where the logs say 74.1. Editing the table by hand fixes the PDF until the next regeneration, and until then the paper and the logs disagree. In a lab, a number that no…
Every time a sweep finishes, you paste the same instructions: check that each results file has the required fields, that no item id appears twice, and that the row count matches the eval set. The reusable asset is that…
A pipeline of five steps that each pass a bad artifact along 5% of the time delivers a clean result only 0.95⁵ ≈ 0.77 of the time. Nearly one night in four, the morning summary would rest on something broken. Chapter 3…
You need to move 40 experiment configs to a new format: a renamed field, a new default, a changed prompt-template path. It is mechanical, so it is tempting to hand Codex the whole directory. Prove it on two files first…
A skill that builds a results table from eval logs looks excellent on the request it was written for. The nearby request is the real test: "build the table and push it to the team leaderboard." A trigger test asks…
Fixing a bug in an eval script needs write access to the repository. It does not need the network. But if the script's tests call a paid model API, or download a benchmark from a hub on first run, a routine fix can…
"Review carefully" gives a code reviewer nothing to prioritize. An invariant does. In research code, the invariants are the rules that keep a number honest: no eval item appears in the few-shot pool; items that failed…
Pin the Working Directory of a Scheduled Codex Run
Aug 24 · 2026A reviewer asks where a number came from. The answer you want is a commit and a command. A nightly eval that runs Codex from cron or CI starts wherever the scheduler starts, so relative paths such as results/ can…
Parse Codex's Final Result, Not Its Progress Stream
Aug 22 · 2026A sweep driver calls codex exec once per config and builds a results table. If it parses everything the command prints, two things go wrong. A progress line lands in a results cell, or a failed config leaves no row and…
Codex ran your ablation in a separate worktree and reports a two-point gain. Before that number goes in a results table, to a teammate or into the trash with the worktree, check what it depended on that Git does not…
Before a model can follow a rule, the rule has to be in its context. Chapter 21 treats that context as a budget assembled from parts; for Codex, the instruction part is built by a documented walk. So when Codex ignores…
Find the Change You Never Asked the Agent to Make
Aug 18 · 2026You asked an agent to fix an axis label on a results plot. The diff also switched the F1 score from macro to micro averaging, because the agent read it as a cleanup. On an imbalanced label set, those two averages can…
Teach Claude That a Blank Eval Score Is Not a Zero
Aug 17 · 2026In an eval results table, a blank score can mean the run timed out, the API returned an error or the grader crashed. A zero means the model answered and was wrong. Merging the two changes the headline number, and a…
A cheaper model, or a cheaper Claude Code setup, can cost more per result you keep. A call or a session whose output you throw away cost money and bought nothing. The number to compare is cost per accepted result, where…
A research repo shared by four people needs the same permissions and hooks for all of them. It does not need your model override, the path to your scratch disk or the approval you gave a one-off command. The same holds…
Prove a Claude Code Hook Blocks Before You Trust It
Aug 14 · 2026Say you write a PreToolUse hook so Claude Code can never edit data/test/, the held-out split your reported numbers depend on. The hook works on the case you tried. Does it hold on the cases you didn't? The hooks…
You connect an MCP server for your experiment tracker so the agent can read past runs. The same server may also expose tools that tag, overwrite or delete runs. The agent now has every tool on that list, whatever your…
An allow rule is a threat model in one line. Before you save Bash(uv run *) so Claude Code can run experiments without prompting, write down the worst command it admits. Claude Code's permission rules match command…
Test the Environment Your Reviewer Will Actually Run
Aug 11 · 2026Your eval passes in the virtual environment you have been editing for three weeks. That environment holds packages you installed by hand, a cached dataset and an API key exported in your shell. The person who reruns…
Trace One Failed Eval Item Through the Whole Harness
Aug 10 · 2026Your eval run finished, the score dropped four points, and the log has a hundred warnings. The loudest one is rarely the cause. Start with one item that was scored wrong and follow it through every stage. An eval…
Renaming 300 run directories into a clean model_lr_seed scheme is easy to ask for and hard to undo when two runs collapse into one name. lr=1e-3 and lr=0.001 are the same number written two ways, and a sweep launched by…
"The accuracy looks too high" gives Claude Code nothing it can check. A three-row fixture does. Suppose the eval set was merged from two shards and some examples appear twice. The scorer averages over rows. Build the…
An eval results CSV carries meaning a cleanup script can erase. Item ID 00127 is a string, not the number 127. A blank score means the item was not run; a 0 means it ran and failed. A model output with a comma inside…
Stop Being the Agent's Verification Loop
Aug 6 · 2026You ask if the change is done. The agent says yes. You rerun the eval, and it isn't. The Claude Code best-practices guide names the position you are in: without a check Claude can run, "you become the verification loop…
The Claude Code best-practices guide gives a specific threshold: "If you've corrected Claude more than twice on the same issue in one session, the context is cluttered with failed approaches." Its fix is to run /clear…
Three hundred lines of instructions, and Claude still ignores the rule about where results files go. So you add the rule again in capitals. It still slips. The Claude Code best-practices guide has a direct diagnosis…
Finding where an unfamiliar research repo computes pass@k, or where it filters the eval set before scoring, can take dozens of file reads before you reach the two functions that matter. If all that reading happens in…
"Can you build an eval for tool-use regressions?" sounds like one task. It hides a dozen decisions: which model and snapshot, what counts as a pass, how many items, what a false alarm costs, what is out of scope…
Put the Check Your Numbers Depend On in a Hook
Jul 31 · 2026A line in CLAUDE.md such as "rerun the scorer tests after editing metrics.py" is followed at some rate. You have not measured that rate, and measuring it would take dozens of sessions. Until you do, every number…
A Stop Hook Gates the Turn, Up to a Cap
Jul 30 · 2026The session reports that the experiment code is done. The smoke test is red. A Stop hook turns that gap into something the session cannot talk past, within a limit you should know before you rely on it. Per the Claude…
The slug of this note says agent teams cost seven times more. The documented claim is narrower, and the difference matters when you plan compute or explain a budget. Anthropic's cost guide says agent teams use…
You need to migrate 200 experiment configs to a new schema, or move 200 eval tasks onto a new harness API. Claude Code's best-practices guide describes the fan-out pattern: generate a task list, loop claude -p over it…
You keep typing the same experiment recipe: train with this config and seed, evaluate on the fixed 200-case subset, write the results with the commit hash. A reusable skill saves retyping it, and a repo whose…
The slug says run cheap subagents and reserve Opus for the hard part. That is a reasonable hypothesis, not a rule. Finding the file that defines a config key and explaining why a loss curve diverges at step 3,000 both…
Three hours into chasing a loss spike, you hold ten facts that matter: the seed that reproduces it, the step where it starts, the config hash, the learning-rate change you ruled out, and the commands already run. Then…
Worktrees Separate Files, Not Experiments
Jul 22 · 2026You want two agents at once: one refactoring the data loader, one adding an ablation flag. Separate git worktrees give each its own directory and branch, so their edits cannot overwrite each other. Claude Code has this…
Measuring one reviewer means its recall on planted bugs and its precision on real findings. This note asks a different question: does a second reviewer catch what the first one misses? Adding a second model family to…
Look at the Rendered Figure, Not Just the Exit Code
Jul 20 · 2026Claude Code edits the script that draws your results figure. It exits 0. The figure can still be wrong: error bars missing, a legend covering the curve you're discussing, a y-axis that starts at 0.6 and turns a 2-point…
Your eval reports 0.71 on a benchmark and the paper reports 0.78. You already suspect the answer normalization in eval/metrics.py, and you have one case where your score and the paper's reference implementation…
An agent running your eval harness reads untrusted text all day: benchmark prompts, scraped pages, other models' outputs. The same machine often holds API keys and unreleased datasets. Before you let it run unattended…
Run /init, Then Test Every Command It Wrote Down
Jul 17 · 2026/init drafts a starter CLAUDE.md from the repository; the memory guide says that if one already exists, it suggests improvements instead of overwriting it. Read the draft as two kinds of lines, because each needs…
Plan When a Change Can Move Your Eval Numbers
Jul 16 · 2026A one-line change to the dedup key between your train and test splits can move every number in the results table. A 200-line refactor of the plotting code usually moves none. Diff length is a poor guide to consequences…
In a long agent session, every turn you add stays in the context the agent reasons from for the rest of the run. In a dark software factory, where agents run long tasks unattended, keeping that context clean is part of…
Claude Code has two ways back into earlier work, and neither returns the repo to the state your results came from. Resume brings back the conversation. Per the session documentation, claude --resume ablate-lr restores…
Pipe the Failing Run's Log Instead of Describing It
Jul 12 · 2026A training run died overnight at step 41,000. Your paraphrase of the traceback ("something about shapes") is less useful than the traceback. The CLI reference shows piped content going straight into a non-interactive…
Move to the Agent SDK When You Need to Own the Run
Jul 11 · 2026Running an agent by hand from a terminal is how you try an idea. Running it over 200 eval tasks every night is an experiment, and an experiment needs what a terminal session does not give you: a transcript per task, a…
Claude Code ships /code-review as a bundled skill. The commands reference says it reviews "the current diff, or a PR number, branch, or path you pass, for correctness bugs." The best-practices guide recommends the same…