How it works
- Your agent sends the files it has open to
POST /v1/plan-fixes, the REST twin of theplan_fixesverb. - Each file is planned against your workspace’s red questions, the ones the engines answer without naming you. It comes back as a unified diff that
git applyaccepts, beside a change filed in your workspace (origin: ide,status: drafted). - Your agent applies the diff, you review it as you would any change, and it is committed.
- Your agent calls
actwithshipon the change and{"commit_sha": "..."}. The change is marked live on the page it was planned for, and its checks are scheduled at +3, +7, +14 and +30 days. - Each check reads the engines again; the change’s receipt says what moved, or that nothing moved that we can prove.
Before you start
- A key with the right scopes.
plan_fixesneedssteerand, on an API key, aspendscope;actwithshipneedssteer. Mint one under API keys and keep it out of the repository: put it in your shell’s environment, not in a committed file. - Credits. One credit per file that comes back with a patch, never more than
max_credits(default 10). A file sent again unchanged, a file that moved, a file already carrying its patch and a file that comes back without a patch cost nothing. - Which paths may be patched. Only paths inside your workspace’s
act_path_allowlistare ever patched. Site and build configuration (package.json,*.config.*,vercel.json), CI, lockfiles and dotfiles never are; they come back inskippedasoutside_allowlist.
Over REST
Any agent that can run a shell command can call the route. Send each file whole, with its git blob id, so a patch always applies to the bytes it was made from:Shell
patches carries path, diff and change (its uri). Save the diff and apply it:
Shell
Shell
From Claude Code or Cursor
Connect the MCP server to your editor, and give the agent the key in its environment for the REST call. Then ask in plain words, for example:Ask Attensira for fixes to the pages inThe agent reads the answer’ssrc/pagesthat lose answers. Send each file whole with itsgit hash-objectsha toPOST /v1/plan-fixes. Show me each diff before you apply it. After I commit, ship each change withactand the commit sha.
next field, which says the same steps: apply, commit, then ship with commit_sha. The MCP changelog says when plan_fixes joins the MCP tool list; until then the agent calls the REST route.
When a patch no longer applies
You do nothing. Callplan-fixes again with the files as they are now:
- A file whose content changed is planned again, and its change is revised in place (
regenerated: true, same change). - A file that moved keeps its change, which now names the new path (
moved_from). - A file that already carries its patch is skipped as
applied, pointing at the change to ship.
skipped[].reason names every other case, such as underway (a change to this file is already approved or on its way: ship or decline it first) or budget_reached.
What it will not do
- It never pushes, commits or opens a pull request in your repository. Your agent and you do that.
- It never patches configuration, CI, lockfiles or dotfiles, or a path outside your allowlist.
- It never marks anything live on its own. A change is live when your agent ships it, and a ship that turns out false only reads as
not_liveon its checks.
Related
POST /v1/plan-fixes: every field and every skip reason.- MCP verbs
- Connect the MCP server