Michael Denyer has published pstack-claude, a port of Lauren Tan’s pstack skill stack that moves her opinionated Cursor workflows onto Claude Code, Codex, Pi, OpenCode, Gemini, and Prime Agent. The original pstack is a set of agent playbooks built for Cursor’s primitives. The port’s job is to translate those primitives into other harnesses without losing the behavior that made them work. Tan publishes as “poteto,” and the port keeps her name on the routing layer: you type “poteto-mode” and the stack picks the workflow.

The interesting part is not that someone ported a skill pack. It is that the port exists at all, and that it was worth doing. For two years the agent tooling conversation has assumed each harness would grow its own idioms, its own plugin format, its own way of describing a subagent or a hook. Denyer’s repo is a bet that the workflows are the durable asset and the harness is swappable plumbing.

What the port actually does

The mechanics are concrete. On Claude Code you run /plugin marketplace add michael-denyer/pstack-claude and then /plugin install pstack@pstack-claude. Codex gets the same treatment through codex plugin marketplace add and codex plugin add. Pi installs from git with pi install git:github.com/michael-denyer/pstack-claude, which loads the skills plus a Pi extension that adds the subagent, question, and wake-up tools the skills depend on, along with /loop and the routing instruction. Skills are invoked as /skill:<name>.

The setup command, setup-pstack, is where the port gets specific about models. You can set a reasoning effort per role. The README’s own example is an arena runner configured as “opus @xhigh, fable @max.” Claude Code dispatches those through generated agents named pstack:effort-<level> or pstack:poteto-agent-<level>. Roles with no explicit level inherit the session’s effort unless the configuration sheet names a default. That is a small detail with a large implication: the port treats “which model, at which effort” as a first-class routing decision, not something the user hand-tunes per prompt.

The routing hook is the other piece worth naming. The plugin installs it on Claude Code and Codex. On Codex it asks you to trust the hook through /hooks before it runs. On Pi the extension injects the same routing instruction. So the port is not just copying markdown files around. It is reimplementing a dispatch mechanism three different ways to get roughly the same behavior.

Why the translation layer matters

Cursor’s primitives are not Claude Code’s primitives, and neither set matches Codex’s. A skill that says “delegate this to a subagent” means something different in each place. Denyer’s port has to map those verbs onto whatever the host harness exposes, and where the host exposes nothing, the port ships an extension that adds the missing tool. That is the unglamorous work that determines whether cross-harness agent skills are a real category or a demo.

The repo also carries named policy forks, declared in tools/forks.json, and it tracks upstream. That structure is a quiet admission that ports drift. If you fork a skill stack to run it somewhere else, you now own the divergence, and you need a place to record which forks are deliberate. Denyer put that in a JSON file instead of letting it live in commit messages.

There is a boundary the port draws deliberately. For concurrency bugs and invariants that tests cannot reach, the README points to a separate plugin, agent-formal-verify, which adds TLA+ model checking and Lean proofs. That is a notable line to draw. The main stack handles the ordinary loop: reproduce the failure, investigate with “how” and “why,” delegate the fix, rerun the failing case, and if the fix crosses a function boundary, pull in an architect before implementation. You get back the fix plus the failing and passing evidence. The formal methods live outside, for the cases where evidence from tests is not enough.

The economics of a port

The data-handling section is short and worth reading twice. pstack has no server and no telemetry. Anything its skills ask your agent to read, including session transcripts, goes to your model provider. Scripts run locally, and the PR tools use your existing GitHub CLI login. That is the correct posture for a tool that sits between you and a frontier model, and it is also a constraint: the port cannot phone home to improve itself. Its quality is whatever the maintainer and contributors put into it.

The licensing is MIT across the board. The port is © 2026 Michael Denyer. The original pstack is © 2026 Lauren Tan. The imported cursor-team-kit skills are © 2026 Cursor, with separate LICENSE-cursor-team-kit and NOTICE.md files. That is a clean chain of attribution for a project that is, structurally, a derivative work of two other projects. It also tells you the port is not trying to capture value from the workflows. It is trying to make them run.

What it means for agent builders

The takeaway for anyone building agent tooling is that the workflow layer is getting portable before the harness layer does. Denyer’s port does not wait for a universal plugin standard. It writes three install paths and a routing hook per host and ships. That is the same pattern that made linters and formatters portable across editors a decade ago: you accept some duplication in the adapter layer to keep the valuable logic in one place.

The open question is maintenance. Tracking upstream plus carrying declared forks plus reimplementing routing on three harnesses is a real load for a project with no telemetry and no revenue. The next thing to watch is whether the forks in tools/forks.json stay small, or whether each harness’s quirks pull the stack apart until the port is six stacks wearing one name.