fwdcentaur with other agent harnesses
fwd's agents use the fwd command and nothing else, and its skills and hooks are thin instructions over that command, so any agent harness with a shell can play any of the four roles. What the Claude Code plugin adds is an identity with no effort: it stamps each command with the agent that ran it. Elsewhere nothing stamps a command, so an agent names the principal it acts as.
fwd --as impl-codex principal add impl-codex --role implementer # once: the agent names itself and selects its role
fwd --as impl-codex task next --claim # from then on a typed --as names it
export FWD_AS=impl-codex # or FWD_AS in the agent's environment does
fwd task submit <task id> --evidence 'commit 1a2b3c; tests green'
A typed --as <name> names the principal a command acts as, and FWD_AS=<name> in the environment does the same for a command that gives none; with neither, a command acts as the person fwd init recorded. --as never makes a principal: a name no principal of the project has is refused, with the command that makes one. This is local trust, and nothing checks who may use a name, so give each agent a name of its own: an agent that inherits another's FWD_AS writes as that one. An agent of another kind started from a Claude Code session inherits that session's id, and where the session's own agents are bound, only a typed --as lets its commands write there: with FWD_AS alone they read as that principal but write nothing (docs/DECISIONS.md, D120: agents that do not use the Claude Code hooks, and people who opt out of them, have an explicit way in).
The same commands keep an agent's context current, whatever runs them. fwd prime prints the scope, the ready tasks and the unread notifications; fwd inbox pop prints the notifications that arrived and marks them read; fwd inbox lists the unread ones without marking them; and fwd watch --count 1 exits as soon as a notification is unread, waiting for one when none is. Run them where the harness runs a command at a session's start, between an agent's steps or before it stops, or have the agent run them itself. --format hook prints the JSON a Claude Code hook prints, acting for --as or FWD_AS when no hook's JSON arrives on its standard input; --format text and --format json print the same for anything else. The three role skills are Markdown in integrations/claude-code/skills/, plain instructions over the command: an agent elsewhere can be given one as its brief, passing its own --as where the skill says the plugin's stamp names it.