The Tool That Vanished Underneath Our Skill
🌊 The drift: Our one-shot skill had a mandatory rule: spawn 2+ agents → call
TeamCreate first. The Claude Code harness later removed that whole Team API and replaced it with a single implicit team.💥 The break: A faithful run would call
TeamCreate and hit “unknown tool” at the first multi-agent phase. The skill still looked shipped. Nothing errored until you ran it.🔬 The catch: An audit read the skill against the current tool list, not the one it was written for. It found the vanished tool plus 8 more issues.
✅ The fix: Rewrote the protocol onto real tools, fixed all 9 findings, verified each against the live runner. Shipped v3.13.0 → v3.14.0.
Here is the uncomfortable part. The skill was correct the day we shipped it. Every instruction matched a real tool. It passed review.
Then the platform moved. And “it worked when we shipped it” quietly stopped meaning “it works now.”
What is tool drift?
Tool drift is when the platform an AI agent runs on changes the tools available underneath a skill after that skill has shipped. The skill's instructions stay frozen, but a tool they depend on gets renamed, removed, or altered, so a once-correct call now fails.
It is not a bug you wrote. It is a bug that grew around code you never touched.
Think of it like a train timetable that still lists a station that closed. You follow the printed instructions perfectly, ride to the end, and step off onto a platform that no longer exists. The timetable isn't “wrong” in any line you can point at. The world it describes just moved on.
To make it concrete, here is the exact call our skill kept making. Toggle between the day it shipped, today, and the fix.
Same instruction, three worlds. On ship day it resolved. Today the middle box turns amber and the whole protocol halts. Nothing in the skill file changed.
The break we almost shipped forever
The headline finding sat in a file called team-protocol.md. It opened with a rule marked “HARD RULE, no exceptions.”
The rule: any time the protocol spawns two or more agents, it must call TeamCreate first, spawn each agent with a team_name, message them through the team, and tear the team down at the end with TeamDelete.
That was a faithful description of how multi-agent work used to happen. The harness has since deleted that entire API. There is now a single implicit team, and you fan out by making parallel agent calls in one message.
Worse, a note in an old handover log already said, in plain text, “TeamCreate is NOT available in this harness.” A prior session had hit the wall and routed around it by hand. The skill itself was never patched. The knowledge existed; it just never made it back into the file that gives the orders.
“Mandatory” is the most dangerous word in a skill. An optional step built on a dead tool degrades. A step marked no exceptions built on a dead tool detonates — the model is told it may not route around the very thing that no longer works.
Logging into the void
The second real bug was quieter but just as revealing. The skill ends every run by logging the outcome — the score, the task type, the verdict — so the tool can learn from itself over time.
Three internal sources disagreed on when to log. One said log before the run is torn down. One said after. A third didn't mention logging at all.
The “after” path won by default. But tearing down the run clears its state first, so the logger read an empty run and wrote a receipt with no numbers on it.
[END] tear down the run — clears the active-run pointer
↓
[LOG] read the run to log it — but it's already gone
↓
🕳️ writes
taskType: "unknown", score: null, empty dimensions
The fix made one order canonical everywhere — log then tear down — and, as a belt-and-suspenders guard, taught the logger to recover the just-ended run if it ever finds the pointer already cleared. We verified both paths against the live runner: the recovered log now carries the real task type instead of “unknown.”
The full audit ledger
Tool drift was the headline, but an honest audit reads everything. Nine findings survived verification. Click any one to see where it lived and how it was fixed.
TeamCreate before any multi-agent phase. The harness removed the whole Team API.The privacy one is worth a sentence on its own. The logger sanitized the user's free-text notes before sending them to our server, but a second model-authored text field slipped past the filter unsanitized. It now runs through the same scrub. Full text stays only in the local log.
Why drift is invisible
None of this shows up in the places teams usually look. That is what makes drift dangerous rather than merely annoying.
Nothing errors at rest
The skill file is valid text. It only fails when a live run actually reaches the vanished tool. Reading the file tells you nothing.
No release note
A tool getting removed rarely comes with a changelog line pointed at your skill. The ground shifts silently under thousands of installs at once.
Stale folklore
The old instructions were right once. Every doc and memory that references them looks authoritative. Correct-in-2025 reads identical to correct-today.
Green tests, dead feature
Unit tests mock the tool layer, so they stay green. Only running the real happy path end to end surfaces the gap.
How do you audit for tool drift?
You cannot diff against a spec you don't have, so you build the spec fresh each time from the platform as it is now. The checklist we ran:
- Inventory every tool your skill names. Pull each tool and flag out of the instructions into a flat list.
- Diff that list against the platform's current tool set. Anything named that no longer exists is drift. Anything “deprecated; ignored” is drift wearing a disguise.
- Run the happy path end to end. Not unit tests — the actual flow, so a vanished tool has somewhere to fail loudly.
- Treat “mandatory” steps as the highest risk. A rule the model can't skip around is a rule that detonates instead of degrading.
- Find every place three sources should agree — docs, code, and runtime state — and confirm they still do.
- Re-audit on every platform version bump, not just when you change your own code. The drift arrives while your files sit still.
Do
Audit against the tools that exist today. Verify each fix by driving the real runner and watching the behavior change. Fold the lesson back into the file that gives the orders.
Don't
Trust “it passed review when we shipped it.” Don't leave a known workaround buried in a log while the source keeps giving the broken order. Don't let mock-backed tests stand in for a real run.
What shipped
A receipt, not a brag. This is the diff that closed all nine findings, straight from git.
| Metric | Value |
|---|---|
| Skill | one-shot-scripts |
| Version | 3.13.0 → 3.14.0 |
| Findings fixed | 9 (1 critical, 1 high, 1 medium, 6 low) |
| Files changed | 14 (5 docs, 9 runner files) |
| Lines | +147 / −65 |
| Reference sites re-homed off the dead API | 6 |
| Verification | every fix driven against the live runner |
| Verdict | Shipped |
The honest note: these are diff stats, not a scored build. Tool drift is caught by reading, not by a benchmark, and no scoring run happened here — so there is no composite to quote. The number that matters is the one finding that would have broken every multi-agent run, sitting under a rule marked “no exceptions,” invisible until someone read the skill against the world as it is now.
The lesson is not “the platform is unstable.” Platforms should evolve. The lesson is that a shipped skill is a claim about a moving target, and the only way to keep the claim true is to re-check it against the target after it moves. Our one-shot-scripts skill is sharper for it.
Ship skills that survive the platform moving
Every Godmode skill gets audited against the harness as it is, not the one it was born on. That maintenance rigor is the product.
See One-Shot Scripts Read the last audit