Troubleshooting · access
Use when
A command exited with code 4 and printed
outcome: pending, or an MCP call returned pending_approval.Looking for something else?
A change that was refused for a missing permission (card Credential). A change with no reply or
outcome: unknown (problem The reply to a change was lost).Signs
- A
penumbracommand exits with code 4 and printsoutcome: pending (approval_required). - The output has an
approve at:URL, ahandle:and arequest-id:. - A line beside the URL says to give the link to the person. An owner or admin approves there, and nothing runs until they do.
- The last line is
next: penumbra operations wait <handle>. - An MCP call returns
pending_approvalwithoperation_handle,approval_url,expires_atand anextthat tells you to give the link to the person. A Domain Mode program returns the approval link and the same line. - A workspace read shows that the workspace cannot be submitted again while the approval is active.
Why it happens
The change is one that the project’s approval policy holds. Your credential is an API key or a connected agent. A person’s own session never waits. Rules approval.1 and approval.2 say which changes wait.What Penumbra does
By itself:- Holds the request, and changes nothing.
- Returns the same handle when you send the same request id and the same body.
- Pins the exact target. If the policy or the target changed before the approved request runs, it refuses the run.
- Runs an approved change once.
- Lets the request expire after 24 hours.
- Give the person the approval URL and say what waits.
- Follow the handle.
- Read the result after the approval is decided.
penumbra status --explain "<command>"does not warn that a submit or a publish may wait. It names destructive and paid commands only.
Do
- Stop. Do not run the command again.
- Keep the handle and the request id.
- Tell the person what the command would do, that nothing has changed yet, and give them the approval URL.
- Follow the handle:
penumbra operations wait <handle>. It works for a key and for a connection. If the wait ends before anyone decides, the command exits with code 4 again. Run it again with the same handle. When the request ran, it prints the result, and for an extraction the command that follows the run. - In the default MCP catalog, call
check_statuswith the approval reference. In the full catalog and in Kits, callpenumbra_action_statuswith theoperation_handle. - When the approval runs, read the real state. For a submit, run
penumbra graph workspace show "<name>"and look forsubmission: applied. - If the person denies the request, the change does not run. Tell the person and stop.
Don’t
- Don’t send the change again. The same request that still waits gets the same handle. A request that finished is a new request, and it waits for its own approval.
- Don’t edit the workspace while its submit waits. The approval is for the exact
revision, and an edit makes Penumbra refuse the run with
target_changed. - Don’t tell the person that the change failed. It has not run yet.
- Don’t assume the approval never expires. After 24 hours, ask the person before you send the change again.
Check
penumbra operations wait <handle>ends with the result of the change, or the workspace read showssubmission: applied.- No second request for the same change is waiting.