<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Alex Voloshin]]></title><description><![CDATA[Vendor-agnostic agentic-dev tooling, eval rubrics, and production patterns across Claude Code, Codex, and Windsurf.]]></description><link>https://voloshin.net</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Alex Voloshin</title><link>https://voloshin.net</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 24 May 2026 14:21:50 GMT</lastBuildDate><atom:link href="https://voloshin.net/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Three things that don't port between Claude Code, Codex, and Windsurf]]></title><description><![CDATA[Claude Code, Codex, and Windsurf now look alike: all three have skills, hooks, and plugins. So it's natural to assume your setup ports between them. It mostly doesn't.
I maintain a repo that targets a]]></description><link>https://voloshin.net/three-things-that-dont-port-claude-code-codex-windsurf</link><guid isPermaLink="true">https://voloshin.net/three-things-that-dont-port-claude-code-codex-windsurf</guid><category><![CDATA[AI]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[ai agents]]></category><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[Alex Voloshin]]></dc:creator><pubDate>Sat, 23 May 2026 22:51:04 GMT</pubDate><content:encoded><![CDATA[<p>Claude Code, Codex, and Windsurf now look alike: all three have skills, hooks, and plugins. So it's natural to assume your setup ports between them. It mostly doesn't.</p>
<p>I maintain a repo that targets all three runtimes and keeps a parity matrix. Here are the three gaps that cost the most time, and what to do about each.</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Claude Code</th>
<th>Codex</th>
<th>Windsurf</th>
</tr>
</thead>
<tbody><tr>
<td>Hooks</td>
<td><code>PreToolUse</code> runs before a tool and can block it</td>
<td>command hooks run; prompt/agent hooks parsed but skipped</td>
<td>Cascade Hooks fire <em>after</em> the action</td>
</tr>
<tr>
<td>Skill triggering</td>
<td>model-invoked from the description</td>
<td>implicit invocation is a toggle</td>
<td>rules and workflows</td>
</tr>
<tr>
<td>Distribution</td>
<td><code>plugin.json</code> plus a marketplace git repo</td>
<td>its own plugin format</td>
<td>rules/workflows plus MDM</td>
</tr>
</tbody></table>
<h2>Will my hooks still block what they blocked before?</h2>
<p>Not always. On Claude Code, a <a href="https://code.claude.com/docs/en/hooks"><code>PreToolUse</code> hook</a> runs before the tool and can stop it. That is a real guardrail. On Windsurf, Cascade Hooks fire <em>after</em> the agent acts, so they can flag or revert, but they never prevent. Codex runs command hooks, but <a href="https://developers.openai.com/codex/hooks">currently parses and skips prompt and agent hooks</a>. A hook that blocks a dangerous command on one runtime only logs it on another.</p>
<h2>Will my skills trigger the same way?</h2>
<p>The <a href="http://SKILL.md"><code>SKILL.md</code></a> body ports. The trigger does not. Claude Code auto-invokes a skill from its description. Codex makes implicit invocation a switch: turn <code>allow_implicit_invocation</code> off and the skill runs only when you type <code>$skill</code> yourself. Codex also reads skills from a different path. The skill still works. It just may never fire on its own.</p>
<h2>Can I publish a plugin once and install it everywhere?</h2>
<p>No. Claude Code, Codex, and Windsurf each have their own manifest, catalog, and versioning. One plugin means three manifests to maintain and three install paths to test. "Publish once, install everywhere" is a slogan, not a workflow. Budget distribution as a per-runtime cost.</p>
<h2>What to do</h2>
<ol>
<li><p><strong>Keep a parity matrix.</strong> Write down what you have verified on each runtime. Treat the rest as unknown, not assumed.</p>
</li>
<li><p><strong>Re-test on every runtime</strong>, especially any hook that enforces a security rule.</p>
</li>
<li><p><strong>Budget distribution per runtime</strong>, not once.</p>
</li>
</ol>
<h2>FAQ</h2>
<p><strong>Do skills written for Claude Code work in Codex?</strong> The <a href="http://SKILL.md"><code>SKILL.md</code></a> body usually does. The discovery path and the invocation policy need adjusting per runtime.</p>
<p><strong>Which runtime has the strongest hook guarantee?</strong> Claude Code. Its <code>PreToolUse</code> hook can block a tool call before it runs. Treat hooks on the other runtimes as observe-and-react.</p>
<p>The parity matrix I keep is public, in the repo: <a href="https://github.com/alex-voloshin-dev/ai-skills">github.com/alex-voloshin-dev/ai-skills</a>. If you run more than one of these runtimes, start your own.</p>
]]></content:encoded></item></channel></rss>