# Refusals

Every refusal the platform gives, whether trying again can help, and what to do.

Every refusal the platform gives, in every group of its closed union. Each has a `_tag`, `retryable` (whether trying the same thing again can help) and `next` (the command to run next), and no message: match on the tag. Git prints them on its `remote:` lines, `myr check` and `myr status` print them, an MCP tool returns them as JSON, and the verdict note holds them. The refusals about an answer's files arrive together, so one push hears about all of them.

| `_tag` | Group | Retryable | Exit code | `next` | What to do |
| --- | --- | --- | --- | --- | --- |
| `NotClaimed` | Push and claim | yes | 75 | `myr claim <ask>` | Claim the ask, then push again. |
| `ClaimLapsed` | Push and claim | yes | 75 | `myr claim <ask>` | Your claim lapsed after a spell without a push: claim the ask again if it is still open. |
| `NotVouched` | Push and claim | no | 77 | `myr status` | Ask a member of the project to vouch for you. |
| `CapReached` | Push and claim | yes | 75 | `myr status` | Read `limit`: for claims, release or land a claim you hold; for proposals, wait for an open one to be decided; for drafts, the proposal has had every draft round it takes; with `retryAfter`, wait that many seconds and try again. |
| `AskFull` | Push and claim | yes | 75 | `myr asks` | Someone else holds the claim: pick another ask. |
| `NoAsk` | Push and claim | no | 66 | `myr asks` | Push to the fork your claim gave you, which names its ask. |
| `RepoBusy` | Push and claim | yes | 75 | `git push` | Push again. |
| `DirectPush` | Push and claim | no | 77 | `myr asks` | Main moves only by a landing: push your answer to your claim's fork. |
| `AskBlocked` | Push and claim | yes | 75 | `myr asks` | Wait for the asks it names to land, or answer one of them first. |
| `Denounced` | Push and claim | no | 77 | `myr status` | The project's vouch file denounces you: it takes no claims or proposals from you. |
| `OutOfScope` | Shape | no | 65 | `myr check` | Undo your changes to the paths it names: they are outside the ask's territory. |
| `TouchedJudge` | Shape | no | 65 | `myr check` | Undo your changes to the paths it names: they decide what the checks do. |
| `Weakened` | Shape | no | 65 | `myr check` | Take the marker out; a marker without a reason may get one after ` -- ` for a maintainer to weigh, but one a maintainer declined stays out; never raise a ratchet. |
| `PrivatePathInPublicTree` | Shape | no | 65 | `myr check` | Take the held-back paths it names out of your answer. |
| `ReachedInternals` | Shape | no | 65 | `myr check` | Import the other module only through its public files. |
| `StaleBase` | Merge | yes | 75 | `git pull --rebase` | Main moved: rebase onto it, resolve the conflicts it names, and push again. `movedBy` names the landing that last changed each conflicting path, with its `author` and `ask`: keep that change as you resolve. |
| `StaleLayer` | Merge | yes | 75 | `myr status` | Nothing: the answer is checked again. |
| `ChecksFailed` | Checks | no | 65 | the command that reproduces the failure | Run `next` to see the failure, fix it, and push again. |
| `HeldBackFailed` | Checks | no | 65 | `myr status` | A held-back check failed; you see only its area and suite. Fix the behaviour and push again. |
| `AttemptsExhausted` | Checks | yes | 75 | `myr status` | Wait until `resetsAt`: you used every attempt on that area's held-back checks for now. |
| `Flake` | Never counted against the answerer | yes | 75 | `myr status` | Nothing: the check failed and then passed on the same tree, and the platform runs it again. |
| `VerifierBlocked` | Never counted against the answerer | yes | 75 | `myr status` | Nothing: the platform could not run the checks, and runs them again. |
| `NotRedFirst` | At ask open | no | 65 | `myr check` | Make the ask's check fail on main by an assertion, the same way twice, then open the ask again. |
| `WeakCheck` | At ask open | no | 65 | `myr check` | Strengthen the check: as it stands, the trivial answer `weakness` names would pass it. |
| `IncompleteBrief` | At ask open | no | 65 | `myr check` | Fill in the fields `missing` names: the ask's kind requires them. |
| `LayerContentInPublicTree` | Maintainers only | no | 65 | `myr check` | Take the paths it names out: their files stay private and never enter a public tree. |
| `SecretInOutput` | Maintainers only | no | 65 | `myr check` | Take the write-only value of `item` out of the output or the tree (`where`), then check again. |
| `UnstatedRequirement` | Maintainers only | no | 65 | `myr check` | State in public what the area's held-back check holds, or take the check out of the suite. |
| `PostureChange` | Decision | no | 65 | `myr today` | A maintainer declined the posture change it names (`from`, `to`): take out what changes the posture; `next` lists the decisions. |
| `NotDecider` | Decision | no | 77 | `myr status` | Only one of the project's maintainers may do this: ask one of them. |
| `DecisionClosed` | Decision | no | 66 | `myr today` | Nothing to decide: it was taken already, or expired to its default. |
| `ProposalClosed` | Decision | no | 66 | `myr today` | Nothing more is drafted for it: the proposal was accepted, declined or expired. |
| `DraftInProgress` | Decision | yes | 75 | `myr proposal <proposal>` | Wait: the platform is drafting this proposal's ask already, and `next` shows when it settles. |
| `UnknownProject` | Lookup | no | 66 | `myr asks` | Check the project's name: every project is listed in the index. |
| `UnknownAsk` | Lookup | no | 66 | `myr asks` | Check the ask's name: `next` lists the project's open asks. |
| `UnknownCommit` | Lookup | no | 66 | `git fetch` | Fetch the project, then name a commit it holds. |
| `UnknownDecision` | Lookup | no | 66 | `myr today` | Check the decision's id: `next` lists the decisions waiting on you. |
| `UnknownPath` | Lookup | no | 66 | `git ls-tree` | Name a path the commit holds: `next` lists its files. |
| `UnknownRevision` | Lookup | no | 66 | `git ls-remote` | Name `main`, a commit the project holds or one of its tags: `next` lists its refs. |
| `UnknownProposal` | Lookup | no | 66 | `myr today` | Check the proposal's id: `next` lists the proposals waiting on you. |
| `ProjectExists` | Setup | no | 65 | `myr asks` | Pick another name: that one is taken. |
| `NotYourNamespace` | Setup | no | 77 |  | Make the project in your own namespace: `next` names it with your handle. |
| `ImportFailed` | Setup | yes | 75 | `myr init` | Read `reason`, then import again. |
| `UnknownEnvItem` | Env | no | 66 | `myr env shape` | Name a key the project's env shape has: `next` lists them. |
| `NotSensitive` | Env | no | 65 | `myr env shape` | Only an `@sensitive` item holds a write-only value: `next` shows which items are. |
| `ValueTooShort` | Env | no | 65 | `myr env set <key>`, with `--acknowledge-short` when the value is above the floor | Give a longer value, or acknowledge a short one where the floor allows it. |

## Exit codes

`myr` exits with a code from sysexits(3), so a script or an agent can tell what to do next without reading stderr. A refusal's code follows from its `retryable`: 75 when trying again can help, else the code for what has to change, as the Refusals table lists it. A command that meets several refusals at once exits with the first of 77, 66, 65, 75 among them.

| Exit code | Means |
| --- | --- |
| 0 | It did what it was asked. |
| 1 | Something else went wrong; stderr says what. |
| 2 | The command was misused; stderr names the flag or value, and nothing was sent. |
| 65 | Refused: what you sent has to change (the answer, the ask or the value). |
| 66 | Refused: what you named does not exist, or no longer stands open; `next` lists what does. |
| 69 | No platform answered: it is down, or the URL is wrong. |
| 75 | Refused for now: run the refusal's `next`, then try the same thing again. |
| 77 | Refused: you may not do this until you sign in, or someone lets you in. |
