Claude Code without the skills
With the plugin's hook alone
The plugin brings the skills, and Claude Code loads one when an agent's work matches its description or when you name it. An agent can work in the graph without them: the plugin's hook still stamps its fwd commands, so once it has named itself (fwd principal add <name> --role <role>) it acts as its own user. What it goes without is the skills' practice: the triage agent's passes and caps, what to do with each kind of notification, when to ask and when to file a task. What it keeps is fwd's own guidance, which says what to do in these places:
- a write before the agent has named itself is refused with the command that names it;
- an agent that selects lead where no triage agent answers for the scope it works in is told why and how to start a triage subagent for it, and a triage agent that serves nothing is told so on each of its commands, with the commands that bind it to a scope or endorse it for the whole project;
- each notification says why it is there, and ends with how to reply to it or dismiss it;
fwd <command> --helpgives each command's grammar, andfwd comment --help, likereply,askandforward, shows how to mention someone.
The inbox hooks work as they do with the skills (the how-to's section 7), and docs/using-fwd.md in the repository is the primer an agent can read in the skills' place.
With no plugin
The plugin is optional. Without it nothing stamps a command, so in a Claude Code session fwd reads --as and FWD_AS as it does at a terminal:
- The session's own thread names itself once,
fwd --as <name> principal add <name> --role lead, and setsFWD_ASto that name in theenvblock of its checkout's.claude/settings.local.json. Its commands, and its inbox hooks, then act as that principal. - A subagent passes
--as <its own name>on every command: the session'sFWD_ASreaches the subagent's commands too, so without--asit writes as its lead. Its hooks act for no one, so it reads its inbox withfwd --as <its own name> inbox pop. - Every fwd command goes through Claude Code's permission flow, as any other command does.
Where the plugin is installed
The plugin, once installed, stamps every command made only of fwd in every session on the machine, and a stamped command acts only as the agent's own principal, so an agent that runs fwd on its own names itself first. A command the plugin does not stamp, such as a script's, or one you type in a shell of your own that carries the session's id, acts as the principal a --as typed on it names, as it would at a terminal. In a session whose agents are bound, that typed --as is what lets such a command write: with FWD_AS alone it reads as that principal but writes nothing, since every agent of the session inherits the session's environment (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).