4925 words
25 minutes
You Wrote One Skill File. You Are Maintaining Three: Cross-Harness Skill Engineering

You write a skill for Claude Code: a SKILL.md file of instructions the agent loads when a task matches it. You test it on the model you use every day. It works, so you share it with your team. Then a colleague installs it in Codex (OpenAI’s coding agent), or runs it on a cheaper model to save money, and the skill quietly does something else. Nothing errors. The output is just worse. Everyone blames the model.

Paul Bakaus hit this at scale. He builds and maintains Impeccable, an open-source design skill that installs into Claude Code, Codex, Cursor (an AI code editor) and several other harnesses [1]. A harness is the program wrapped around a model that gives it tools, files and rules, so Claude Code, Codex and Cursor are all harnesses. In “The Dark Arts of Skill Engineering,” a workshop he gave at the AI Engineer World’s Fair in late June 2026, he walked through what it took to make one skill behave the same in all of them [2], [3], [4]. The recording went up on YouTube on September 21. His summary of the job: “prompting is sort of like the starter level, but harness engineering is where you should end up” [2].

We checked every harness claim in the talk against the vendors’ own docs and source code on October 6, 2026, and some had already changed in the three months since he gave it. We flag each change where it comes up, since those changes are what this article is about.

Figure 1 - Diagram of one skill file feeding Claude Code, Codex and Cursor, each producing a different behaviour from the same instructions

Figure 1 - One File, Three Programs: The same SKILL.md runs in three harnesses on different models. Each harness has its own rules.


The skill that worked in one harness and quietly failed in another#

Bakaus’s clearest example is Impeccable’s critique command. Asking one model to review its own design is, in his words, “like grading your own homework” [2]. So critique starts two sub-agents (separate model sessions, each with its own context, launched by the main agent) that never see each other’s work. One plays a design director and inspects the live page. The other runs Impeccable’s detector, a script that flags known bad patterns. The main agent then reconciles the two. His slide sums it up: “two blind opinions beat one confident guess” [3]. The idea of splitting the maker from the judge is the one we covered in The Adversarial Evaluator [5].

In Claude Code this works, because the agent may start sub-agents on its own when a task fits [6]. In Codex, when Bakaus built it, it didn’t. Codex delegated only when the user explicitly asked for sub-agents, so a skill that asked on its own got nothing [2]. Nothing told the user, either. “If there is no punishment for not spawning sub agents it will simply not spawn them,” he said [2]. The critique ran in one context, graded its own homework, and reported a result.

Figure 2 - Diagram of a critique skill that splits into two blind reviewers in Claude Code, while in Codex at the time it ran as a single reviewer with no warning

Figure 2 - The Critique That Lost Its Second Opinion: In Claude Code the critique spawns two reviewers that never see each other’s work. In Codex, as Bakaus first built it, one model reviewed its own output, and nothing said so.

The prose was identical in both places. What differed was a rule the skill file never mentions, one its author never had to think about while testing in a single harness: who is allowed to start a sub-agent. Bakaus found several more rules like it [2]:

  • Asking the user a question. Codex has a tool for putting one to three short questions to the user, but only in plan mode (a mode where the agent proposes a plan before it touches any files). Outside plan mode, a skill that wants to ask usually just guesses from context. Codex’s own source still describes the tool as “only available in Plan mode” by default [7], and the switch that would allow it elsewhere is marked as under development and turned off [8].
  • Waking up when background work ends. When a background command finishes, Claude Code sends the model a notification so it can react [6], [9]. Bakaus reports that Codex and other harnesses don’t, so the user has to prompt the model to go and look [2]. No Codex doc we found settles it, so that half is his finding.
  • Which model reads the file. Bakaus found that GPT models in Codex favour tight letter-spacing and very rounded borders, and that Gemini (Google’s model) adds a hover zoom to every image [2]. His talk materials name the exact tells, letter-spacing: -0.06em and img:hover { scale(1.1) } [3]. When he told Claude not to tighten letter-spacing so much, it overcorrected in the opposite direction [2].

Each one is an assumption baked into a skill that looks portable. One file run in three harnesses on three models behaves like three programs, and its author tested only one.

Figure 3 - Diagram of one skill file with four hidden assumptions underneath it: who may start a sub-agent, when the model may ask a question, who wakes the model, and which model reads the file

Figure 3 - What the File Never Says: Four rules decide how a skill behaves, and none of them appears in the skill. Each harness answers them differently.

The obvious fix: write better instructions#

The first thing most of us reach for is better prose. Bakaus started where many of us did, with Anthropic’s frontend-design skill: a list of named bans, with no scripts and no routing [2], [3]. The original told the model never to use “overused font families (Inter, Roboto, Arial, system fonts)” [10].

It worked some of the time. Mostly it didn’t, he said [2]. For any brief, a model has a default answer: the most typical output its training pulls it toward. His slide calls this “the median is the model’s gravity” [3]. A ban doesn’t remove the pull. As he put it, “a ban only moves the model around inside its own cluster” [2]. Forbid one font and you get the next most typical font, not a fresh idea. His slide is blunt about how far prose can go: “Even 250 lines of real taste can’t out-write it” [3].

Two changes inside the skill helped. The first is to hand the model a starting point it would never choose. Impeccable ships a script holding over 100 hand-picked colours, and it gives the model one at random when a project starts, so the same brief produces different palettes [2]. Bakaus calls this an anti-attractor. We’d use the same trick in any skill that keeps converging on the same answer, such as one that brainstorms test cases.

Figure 4 - Diagram of a model's cluster of typical answers, where a ban moves the output to the next nearest point inside the cluster, while a random seed lands it outside

Figure 4 - A Ban Moves, a Seed Escapes: Banning the model’s first choice moves it to its second choice in the same cluster. A random seed from a script starts it somewhere it would never go on its own.

The second change is to stop loading rules that don’t apply. “Avoid system fonts” is sound advice for a landing page and poor advice for an app’s settings screen, where system fonts look native [2]. One big file full of if-this-then-that branches wastes tokens (the units a model reads and is billed by) and gets followed poorly, he argues. So Impeccable uses a small router: a short root file that loads other instruction files only when a task needs them. The critique and polish commands each load their own file, and the skill quietly decides whether a brief is brand work or product work, then loads a different rule set for each [2]. Anthropic rewrote its frontend-design skill in June, and the system-fonts line is gone [11].

The same shape fits a code-review skill. A small root file sends an authentication change to a security rules file and a UI change to a style rules file, so neither set of rules gets in the other’s way.

Figure 5 - Comparison of one large skill file full of conditional rules against a small router in an illustrative code-review skill that loads one rules file per task

Figure 5 - Load Only the Rules the Task Needs: A router loads only the file the current task needs. In this illustrative code-review skill, an authentication change gets the security rules and a UI change gets the style rules.

These fixes still leave a gap. Each one is text the model has to choose to read and follow. Strong models mostly do. Weak ones skim. Bakaus calls GPT-5 mini (a small OpenAI model) “not a very good rule follower” and says it consistently fails to load some of Impeccable’s files [2]. If a skill has to survive the cheapest model someone on your team runs, better prose can’t carry the rules that matter.

The second fix: move the rules into things the harness runs#

Bakaus’s next move was to put instructions where the model can’t skip them, starting with script output. His context.mjs script runs at the start of every call to gather the project’s design notes. When those notes are missing, the script doesn’t leave the model to find the right rule somewhere in the prose. It prints structured output that tells the model the exact next step [2]. His finding was that when an instruction comes “from the standard out of a script,” the model follows it “a lot more” than a rule buried in the skill [2]. Claude Code supports this directly: a skill can contain a !`command` line, and Claude Code runs the command and puts its output into the skill before the model sees it [12]. Anthropic’s skill-writing guide makes a similar case for bundled scripts, which it calls “More reliable than generated code” [13].

This has a cost, and Bakaus names it on his slide: “it breaks prompt caching” [3]. Prompt caching lets a provider reuse the processed start of a prompt it has already seen, which saves time and money. The cache works on the beginning of the prompt, and in Anthropic’s words, “Changes at each level invalidate that level and all subsequent levels” [14]. So output that changes on every run can’t come from an earlier run’s cache. The cache stops helping at the point where the script output begins. Bakaus’s advice is to skip the technique for a skill you call very often and need cached [2].

Figure 6 - Comparison of a rule buried in skill prose, which the model skims, against script output that tells the model its next step, with the prompt cache ending where the script output begins

Figure 6 - The Rule the Model Actually Reads: A rule in the middle of the prose gets skimmed. The same rule printed by a script gets followed. The price is the cache, which stops where the changing output begins.

Hooks came next. A hook is a script the harness runs on its own at a fixed point, such as just before or just after a file is written. Even an installed skill gets forgotten when the user doesn’t mention it, so Impeccable also ships a design-lint hook that checks every edit. His slide: “passive guardrails beat a command no one remembers to run” [3]. He found that the right timing depends on the model. A PostToolUse hook fires after the file is written and asks the model to fix what it finds. A PreToolUse hook fires before the write and can refuse it. With weaker models (his example is Composer, Cursor’s own fast model), the after-the-fact warning wasn’t followed reliably, so Impeccable blocks the write instead [2]. Claude Code’s docs confirm the mechanism: a PostToolUse hook “cannot undo” a tool call that already ran [15]. He also warns that hooks throw false positives, so any hook you ship needs a way for users to add ignore rules [2].

We run the same idea on this site. Our writing rules ban em dashes, a rule written into our project instructions. A PostToolUse hook now checks every file write for them and hands any hits back to the agent, which fixes them on the spot. In August we found 7 dash violations that had reached visible copy on our page templates, 2 of them in meta tags, because the hook had never checked those files. We widened it to cover them. Ours is an after-the-write warning, and it holds on a strong model, which fits Bakaus’s point that only the weaker models needed the hard block.

Figure 7 - Comparison of a PostToolUse hook that warns after a file is written against a PreToolUse hook that refuses the write before it happens

Figure 7 - Warn After, or Block Before: A PostToolUse hook can only ask the model to fix a file it already wrote. A PreToolUse hook can refuse the write, which Bakaus found weaker models needed.

Memory was the third piece. A skill starts fresh every time it runs. Impeccable writes each critique into a .impeccable folder in the project, and a later polish run, maybe days later, reads those notes, including a user’s earlier objection to a font change [2].

Claude Code’s docs now draw the line between these pieces: pick a skill when “You keep pasting the same instructions into chat,” and a settings hook when “You want to block, allow, or log an event with a script you already have” [16]. We covered Claude Code’s newer mods (plugin code that stays running inside the session) in Hooks Run Once. Mods Stay Resident [17].

So the machinery works, but all of it belongs to a harness, and the harnesses don’t match:

  • The skill’s own folder. Claude Code gives a skill ${CLAUDE_SKILL_DIR}, a variable that resolves to the skill’s own folder, so its scripts can find their files [12]. Codex tells the model the skill’s file path but offers no such variable [18]. Cursor uses paths relative to the skill folder [19], and Gemini CLI (Google’s command-line agent) adds the folder to the agent’s allowed paths [20]. Impeccable’s harness notes put it flatly: “No other harness supports substitution in skills” [21].
  • Hooks. These look alike now. Codex and Claude Code use near-identical JSON, and both let a PreToolUse hook deny a call [22], [15]. The differences moved elsewhere. The config files live in different places. Codex documents 12 hook events and Claude Code documents 33. Codex reports file edits as apply_patch, so a script that checks the tool name has to branch by harness [22], [15]. Codex also states that “Non-managed hooks must be reviewed and trusted before they run” [22]. A hook you ship isn’t live on Codex until each user approves it, and Impeccable’s README tells Codex users to do that at /hooks [1].

So the fix that made the skill reliable also tied more of it to each harness. Every piece that leans on one harness is a piece you have to rewrite for the next.

Figure 8 - Diagram of one hook script installed into Claude Code and Codex, showing different config locations, 33 versus 12 events, the apply_patch tool name, and a trust step on Codex

Figure 8 - One Hook, Two Installs: The JSON has converged. What differs is where the file lives, 33 events against 12, the apply_patch name, and Codex’s trust step.

KEY INSIGHT: Move any rule that has to hold out of the prose and into a script’s output or a hook. Then write down which harness each of those pieces depends on, because that list is what it costs you to support the next harness.

The third fix: make the skill say when it can’t do the job#

The Codex sub-agent problem had no machinery fix, so Bakaus wrote a behavioural one. If Codex has sub-agents available but no permission to use them, the skill tells it to stop and ask the user [2]. If it still can’t use them, it must tell the user it is giving them a degraded experience. Codex, he said, hates admitting that, so he uses it to his advantage [2]. Impeccable’s current critique file asks once whether it may use sub-agents, and if the answer is no, it prints a DEGRADED: single-context banner before the critique [23]. The user still gets the weaker critique, but now the report says so.

He applied the same thinking to weaker models. “A weaker model has opinions just fine, but what it loses is the discipline to follow yours,” his slide reads [3]. GPT-family models (the OpenAI models Codex runs on), he found, respond to the word “gate,” so Impeccable’s Codex-only instructions give the model 8 numbered gates. It has to pass every gate, log the result of each one, and is not allowed to compress them. Without that, it skims the list, does gates 1, 2 and 5, and reports success [2]. His rule: “If the gate can be skipped, it will be” [3]. The logs make it hard for the model to quietly take the easier route.

Figure 9 - Diagram of eight numbered gates, each with its own logged result, set against a skimmed list where only gates one, two and five were done

Figure 9 - Gates That Log Their Own Result: A long checklist gets skimmed, and the model reports success after doing 3 of 8. Gates that each log a result leave a record of every skipped step.

Then the ground moved. Codex reads AGENTS.md (a plain instructions file at a repository’s root that coding agents read at startup). On June 26, 2026, three days before the World’s Fair opened, Codex merged a change titled “allow AGENTS.md and skills to authorize delegation” [24]. Codex’s docs now say: “Current local Codex releases delegate when you ask directly or when applicable AGENTS.md or skill instructions request it” [25]. The rule Codex gives its model still forbids spawning sub-agents unless the user or those instructions “explicitly ask” [26]. Codex made Bakaus’s workaround the rule. The skill asks, and that counts. At most intelligence levels, Codex still won’t delegate on its own judgement the way Claude Code and Cursor do [25], [6], [27]. Its docs say only the top Ultra level delegates proactively [25].

That’s good news for Impeccable, and it also shows the problem, since by the time most people watched the talk, its lead example had partly aged. Claude Code moved as well, and since v2.1.277 it reads AGENTS.md directly [28].

Figure 10 - Timeline from Bakaus building the critique skill, through the Codex delegation change on June 26 2026 and the late-June talk, to the YouTube release on September 21 and our October 6 docs check

Figure 10 - The Harness Moved Under the Talk: Codex changed its sub-agent rule on June 26, 2026, three days before the conference opened. When we checked on October 6, Codex’s docs confirmed that a skill’s own instructions can authorize delegation.

What’s still broken: the skill now carries a Codex branch, a GPT gate block and a Gemini block, all in one place, and those branches don’t stay right. OpenAI’s blog post on rethinking skills for GPT-6 Astra, its newest model, warns that guidance written for its other models (it names Sol and Luna) “may overconstrain GPT-6 Astra” [29]. That cuts against the numbered gates Bakaus wrote for the GPT models Codex ran when he built them [2]. Anthropic says the same of Opus and Haiku, its largest and smallest models: “What works perfectly for Opus might need more detail for Haiku” [13]. Shipping the branches is hard too. The common npx skills command-line installer finds one build by name and points every agent at a single copy. Bakaus has an open pull request to change that, and it notes that “pbakaus/impeccable ships ~12 per-agent builds” [30].

KEY INSIGHT: Give every shared skill a fallback that prints a visible warning when a harness or model can’t run the full version. Then a user who gets the reduced result knows it.

Treat a shared skill as a small cross-platform product#

The skill that holds up is built the way you’d build any program that ships to three operating systems. It has four parts:

  1. One shared body, plus small per-harness and per-model pieces added at install time. Impeccable compiles about 12 builds from one source, each carrying blocks for the drift its model shows [30], [2]. Octen (a search-API company) ships a lighter version anyone can open: one shared SKILL.md per skill plus a small agents/openai.yaml file that carries only Codex’s display text, installed to either harness by changing one flag, -a codex or -a claude-code [31].
  2. Machinery for every rule that must hold, from the second fix, with each harness dependency written down.
  3. A loud fallback, from the third fix.
  4. Evidence for each line. Bakaus says “every line of impeccable is ablation tested” [2]. Ablation means removing one part to see if the result changes. His private eval harness (a test rig that runs the skill and scores its output) mimics the Claude Code, Codex and Gemini tool sets, removes one tagged rule at a time, and re-scores the output across models with Impeccable’s detector [2]. It isn’t public. Don’t Ship Skills Without Evals covers how to build evals (repeatable tests that score a skill’s output) for your own skill [32].

This fixes the problem from the first section. The hidden assumptions used to be written down nowhere. Now each one sits in a place you can see. The sub-agent rule lives in the Codex branch. The letter-spacing drift lives in the Codex model block. The missing folder variable is handled at install. When a vendor changes one of them, you know which small file to edit, and your evals tell you whether the edit worked.

Figure 11 - Diagram of one shared skill body with small per-harness and per-model pieces attached at install, producing separate builds for Claude Code, Codex and Cursor

Figure 11 - Shared Body, Small Differences: One instruction body, written once, with per-harness and per-model pieces attached at install. Octen does it with one small Codex file, Impeccable with about 12 compiled builds.

A skill that writes its own notes changes over time, so those changes need review too. On a first run, Anthropic’s /verify skill writes the steps that worked to .claude/skills/verify/SKILL.md [12], and Anthropic advises extending that file rather than accepting it as is [33]. Before v2.1.205, it folded in everything each run learned, which “caused frequent merge conflicts,” so Anthropic narrowed it to edit the file only when a run went wrong [12]. At Warp, Suraj Gupta, who leads harness development there, describes an outer-loop agent that watches another agent’s runs and user feedback, then opens a pull request against that agent’s skill file for a person to review, though he gives no numbers for it [34]. A skill change becomes a diff you can read and revert.

One result suggests a skill can carry across models and harnesses when it is learned rather than written. GEPA (an open-source optimizer for prompts and other text) has a feature called GSkill that learns a skill from an agent’s own attempts instead of having a person write it. Lakshya A. Agrawal, one of GEPA’s creators, presented it [35]. In the team’s write-up, a skill learned on a simple agent called Mini-SWE-Agent, running the cheap gpt-5-mini model, lifted its resolve rate (the share of tasks it fixed) on the Bleve Go repository from 24% to 93%. That was on a held-out test set: about 60 synthetic tasks the skill never learned from [36]. The same skill, dropped into Claude Code with Anthropic’s Sonnet 4.5 model, raised the pass rate from 94.8% to 100% and cut average time from 285 to 169 seconds, about 41% [36]. Read the 100% as a ceiling, since Sonnet was already close to it. The time saving is the useful number. What transferred, across both a model and a harness, was knowledge about the repository: where things live and how to run its tests. It only works where every attempt can be scored, which brings you back to evals.

Figure 12 - Bar chart of GSkill results: gpt-5-mini from 24% to 93% on Bleve, and Claude Sonnet 4.5 from 94.8% to 100% with average time cut from 285 to 169 seconds

Figure 12 - A Learned Skill That Travelled: A skill learned on gpt-5-mini took it from 24% to 93% on about 60 held-out Bleve tasks. On Sonnet 4.5 in Claude Code it moved 94.8% to 100% and cut average time by about 41%.

KEY INSIGHT: Keep one shared skill body and put each harness or model difference in its own small, named file beside it. When a vendor changes a behaviour, you edit that one file and rerun your evals instead of hunting through prose.

Where this stops working#

Most per-harness findings come from one maintainer, using evals nobody else can run. We confirmed the ones the vendors document. The Codex background-wake gap, the finding that weaker models need a PreToolUse block, and every model’s drift remain Bakaus’s observations.

Harness behaviour also moves in point releases. We checked the docs and source on October 6, 2026, so read every harness fact here as true on that day.

Every fix also has a running cost. Script output gives up part of the prompt cache, hooks need ignore rules and a trust step on Codex, and per-model blocks need retesting whenever a model changes. GSkill’s skills hold knowledge about one repository, and its 100% sits on about 60 synthetic tasks.

Bakaus is candid: “I would rather see less skills in the ecosystem that are really battle tested and proven,” he said [2].

Conclusion#

Bakaus’s critique skill failed in Codex without a word of warning. What made it dependable was a set of named pieces: a shared body, a small branch for each harness and model, scripts and hooks for the rules that must hold, a visible fallback, and evals behind each line. Built that way, a skill survives a vendor changing the rules under it, which Codex did three days before the conference opened.

Start with one skill your team already shares. Run it in the second harness, or on the cheapest model, that someone on your team actually uses. When it finishes, ask the agent which tool it actually called, because a success message doesn’t prove the skill ran. Then move the one rule that has to hold out of the prose and into a script or a hook, and make the skill say out loud when it is running the reduced version.


References#

[1] P. Bakaus, “Impeccable,” GitHub repository (Apache-2.0), accessed Oct. 6, 2026. https://github.com/pbakaus/impeccable

[2] P. Bakaus, “The Dark Arts of Skill Engineering,” AI Engineer World’s Fair 2026 workshop, YouTube, published Sep. 21, 2026. https://www.youtube.com/watch?v=SQMCtZX3trg

[3] P. Bakaus, “impeccable-talks: dark-arts,” talk materials for the AI Engineer World’s Fair workshop, GitHub, Jul. 2026. https://github.com/pbakaus/impeccable-talks/tree/main/dark-arts

[4] AI Engineer, “AI Engineer World’s Fair 2026,” ai.engineer, accessed Oct. 6, 2026. https://ai.engineer/worldsfair/2026

[5] G. Dotzlaw, K. Dotzlaw, and R. Dotzlaw, “The Adversarial Evaluator: GAN-Inspired Harness Architecture from Anthropic,” Dotzlaw Consulting, June 23, 2026. /insights/ai-03-adversarial-evaluator/

[6] Anthropic, “Create custom subagents,” Claude Code Documentation, accessed Oct. 6, 2026. https://code.claude.com/docs/en/sub-agents

[7] OpenAI, “request_user_input_spec_tests.rs,” openai/codex repository, GitHub, commit c0c230e, accessed Oct. 6, 2026. https://github.com/openai/codex/blob/c0c230e6730b3b3c9101b8aff4b9aea4027cea5b/codex-rs/core/src/tools/handlers/request_user_input_spec_tests.rs#L176-L181

[8] OpenAI, “features/src/lib.rs,” openai/codex repository, GitHub, commit c0c230e, accessed Oct. 6, 2026. https://github.com/openai/codex/blob/c0c230e6730b3b3c9101b8aff4b9aea4027cea5b/codex-rs/features/src/lib.rs#L1739-L1743

[9] Anthropic, “Tools reference,” Claude Code Documentation, accessed Oct. 6, 2026. https://code.claude.com/docs/en/tools-reference

[10] Anthropic, “frontend-design SKILL.md” (original version), anthropics/claude-code repository, GitHub, Nov. 2025. https://github.com/anthropics/claude-code/blob/62c3cbc47147ddbf666b210be13a91133e7d449e/plugins/frontend-design/skills/frontend-design/SKILL.md

[11] Anthropic, “Update frontend-design skill,” Pull Request #1293, anthropics/skills repository, GitHub, merged June 9, 2026. https://github.com/anthropics/skills/pull/1293

[12] Anthropic, “Extend Claude with skills,” Claude Code Documentation, accessed Oct. 6, 2026. https://code.claude.com/docs/en/skills

[13] Anthropic, “Skill authoring best practices,” Claude Platform Documentation, accessed Oct. 6, 2026. https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices

[14] Anthropic, “Prompt caching,” Claude Platform Documentation, accessed Oct. 6, 2026. https://platform.claude.com/docs/en/build-with-claude/prompt-caching

[15] Anthropic, “Hooks reference,” Claude Code Documentation, accessed Oct. 6, 2026. https://code.claude.com/docs/en/hooks

[16] Anthropic, “Mods overview,” Claude Code Documentation, accessed Oct. 6, 2026. https://code.claude.com/docs/en/plugins/mods/overview

[17] G. Dotzlaw, “Hooks Run Once. Mods Stay Resident: Where a Rule Should Live in Claude Code,” Dotzlaw Consulting, October 9, 2026. /insights/claude-code-22-mods-vs-hooks-resident-guardrails/

[18] OpenAI, “Build skills,” Codex Documentation, learn.chatgpt.com, accessed Oct. 6, 2026. https://learn.chatgpt.com/docs/build-skills

[19] Cursor, “Skills,” Cursor Documentation, accessed Oct. 6, 2026. https://cursor.com/docs/skills

[20] Google, “Agent Skills,” Gemini CLI Documentation, accessed Oct. 6, 2026. https://geminicli.com/docs/cli/skills/

[21] P. Bakaus, “HARNESSES.md,” Impeccable repository, GitHub, accessed Oct. 6, 2026. https://github.com/pbakaus/impeccable/blob/main/docs/HARNESSES.md

[22] OpenAI, “Hooks,” Codex Documentation, learn.chatgpt.com, accessed Oct. 6, 2026. https://learn.chatgpt.com/docs/hooks

[23] P. Bakaus, “critique.md,” Impeccable repository, GitHub, accessed Oct. 6, 2026. https://github.com/pbakaus/impeccable/blob/main/skill/reference/critique.md

[24] OpenAI, “[codex] allow AGENTS.md and skills to authorize delegation,” Pull Request #30274, openai/codex repository, GitHub, merged June 26, 2026. https://github.com/openai/codex/pull/30274

[25] OpenAI, “Subagents,” Codex Documentation, learn.chatgpt.com, accessed Oct. 6, 2026. https://learn.chatgpt.com/docs/agent-configuration/subagents

[26] OpenAI, “multi_agents_spec.rs,” openai/codex repository, GitHub, commit c0c230e, accessed Oct. 6, 2026. https://github.com/openai/codex/blob/c0c230e6730b3b3c9101b8aff4b9aea4027cea5b/codex-rs/core/src/tools/handlers/multi_agents_spec.rs#L738-L739

[27] Cursor, “Subagents,” Cursor Documentation, accessed Oct. 6, 2026. https://cursor.com/docs/subagents

[28] Anthropic, “Manage Claude’s memory: AGENTS.md,” Claude Code Documentation, accessed Oct. 6, 2026. https://code.claude.com/docs/en/memory#agents-md

[29] E. Provencher, “Rethinking skills and prompts for GPT-6 Astra,” OpenAI Developers Blog, Sep. 11, 2026. https://developers.openai.com/blog/rethinking-skills-and-prompts-for-gpt-6-astra

[30] P. Bakaus, “feat: honor per-provider skill variants on install,” Pull Request #1291 (open), vercel-labs/skills repository, GitHub, opened May 28, 2026. https://github.com/vercel-labs/skills/pull/1291

[31] Octen, “octen-skills,” GitHub repository (MIT), accessed Oct. 6, 2026. https://github.com/Octen-Team/octen-skills

[32] G. Dotzlaw, “Don’t Ship Skills Without Evals: A Reproducible Way to Prove Your Claude Code Skills Work,” Dotzlaw Consulting, September 9, 2026. /insights/claude-code-18-skill-eval-methodology/

[33] Anthropic, “Building verification loops in Claude Code,” Claude (YouTube), Sep. 25, 2026. https://www.youtube.com/watch?v=mQZB0l-rhxE

[34] S. Gupta, “Building Self-Improving Agent Software Factories,” AI Engineer, YouTube, Sep. 27, 2026. https://www.youtube.com/watch?v=TN3mj92oZ8I

[35] L. A. Agrawal, “Beating RL With Reflection: GEPA and Optimize Anything,” AI Engineer, YouTube, Sep. 26, 2026. https://www.youtube.com/watch?v=OA-Mc60Rboo

[36] S. Tan, L. A. Agrawal, R. Sandadi, D. Klein, K. Sen, A. G. Dimakis, and M. Zaharia, “Automatically Learning Skills for Coding Agents,” GEPA Blog, Feb. 18, 2026. https://gepa-ai.github.io/gepa/blog/2026/02/18/automatically-learning-skills-for-coding-agents/

You Wrote One Skill File. You Are Maintaining Three: Cross-Harness Skill Engineering
https://dotzlaw.com/insights/claude-code-20-cross-harness-skill-engineering/
Author
Gary Dotzlaw
Published at
2026-10-13
License
CC BY-NC-SA 4.0

Building production AI, or modernizing a legacy system?

That is the kind of work we do at Dotzlaw Consulting. Book a free 20-minute intro call and tell us what you are trying to build, or what is slowing you down.

Related reading

WordPress to Astro: Migrating a Production Site with AI-Assisted Infrastructure
41 WordPress articles, 187 images, a design-matched dark theme, and a Projects section -- all extracted from a SQL backup file and rebuilt in Astro. This is the story of migrating dotzlaw.com from WordPress to a modern static site, and what the Bootstrap Framework actually contributed.
2026-02-27·Claude Code
An Agent Swarm That Builds Agent Swarms: How We Used Claude Code to Generate Claude Code Infrastructure
We built a framework where Claude Code agents analyze an existing codebase, generate tailored agent teams, hooks, and skills. Two migrations later -- the second harder but faster -- the compound returns are real.
2026-02-11·Claude Code
Claude Code Agent Teams: Building Coordinated Swarms of AI Developers
16 parallel Claude agents built a 100,000-line C compiler from scratch, a Rust-based compiler capable of building the Linux kernel across x86, ARM, and RISC-V. No single agent could hold that codebase in context. The team succeeded because focused context and parallel execution are architecturally superior to a single overwhelmed context window.
2026-01-26·Claude Code
Your 1M-Token Context Window Is a Lie After 120K: Budgeting Sessions with /handoff
Anthropic's own docs now name 'context rot' as a real degradation curve. A Claude Code session advertising 1M tokens still has a practitioner-observed usable zone far below that ceiling, and /compact just piles lossy sediment on top of it. Here is the /handoff discipline that forks a clean session instead.
2026-07-30·Claude Code
← Back to Insights