Journal

Field notes, written as I ship. Newest first.

96 posts

Exactly one tool call is no longer expressible

disable_parallel_tool_use means at most one tool call under tool_choice auto, and exactly one under any or tool. Claude Opus 5.5, Fable 5.1 and Mythos 5.1 reject any and tool with a 400, so the exactly-one contract is not expressible on them at all.

9 min read178

The Claude models endpoint has no retirement field

GET /v1/models returns a capability tree and no lifecycle field at all. Meanwhile two of the five platforms that serve Claude run a different retirement clock, and their model tables still list identifiers the Claude API retired months ago.

11 min read227

Claude rate limit headers measure two things two ways

The anthropic-ratelimit headers are not one meter. Input is an estimate that gets corrected, output is a running tally, and the tokens header reports whichever limit currently binds.

12 min read224

Your JSON schema is a second cached artifact

Structured outputs and strict tool use turn your JSON schema into a separate cached artifact. It has its own 24 hour lifetime, invalidation rules that invert what you would guess, and a retention boundary that zero data retention does not cover.

10 min read142

Context engineering is four mechanisms, not one

Context engineering on the Claude platform is not a setting. It is four mechanisms at four points in the pipeline, and the one everybody enables first pays for context window with prompt cache.

14 min read179
AI dev workflow

Context rot: two guards, split by model, and one model gets neither

Context rot is real and Anthropic now names it in its own docs. The useful question in 2026 is narrower: your Claude model ships with one of two self regulation mechanisms, or with neither, and they do not overlap. Sonnet and Haiku get context awareness free and automatic. Opus needs a beta header. Opus 4.6 gets nothing.

12 min read206
AI dev workflow

Claude Opus vs Sonnet: what breaks when you swap the model string

Comparisons of Claude Opus, Sonnet and Haiku score capability, speed and price per token. None of them mention that the model string is part of your request contract. Swap it and thinking can turn itself on, your answer can move out of content[0], and a max_tokens you never touched can start truncating. Eight measured differences, September 2026.

13 min read126