The emission gate¶
A tool is emitted executable only if it earned it. Everything else is emitted disabled, carrying the reason.
Emitting a refused tool rather than dropping it is deliberate. A surface that silently omitted an operation would be indistinguishable from one where the operation never existed, and nobody reviews an absence.
What blocks emission¶
| Blocker | Meaning |
|---|---|
blocking_ambiguity |
The source document is unclear in a way that affects this tool. |
awaiting_approval |
A write, destructive or privileged tool with no recorded approval. |
rejected |
A reviewer refused it. |
unclassified_risk |
The side effect could not be determined, which is the normal state for SOAP. |
argument_name_collision |
Two inputs would compose to the same argument, so the tool cannot represent its inputs faithfully. |
composite_pending_confirmation |
A composite that changes state, with no confirmation recorded. |
policy_unresolved |
Policy could not be derived, such as a state-changing tool whose authorization cannot be demonstrated. |
Reads pass automatically once validated. That is the whole point of separating them: a reviewer clicking through twenty-three read tools individually is doing data entry, not governance, and a gate that is drudgery gets bypassed wholesale rather than carefully.
The gate blocks emission, not invocation¶
This is a deliberate choice about where the guarantee lives. An artifact that cannot invoke an unapproved destructive tool is a stronger guarantee than one that could if a deployment were misconfigured. The refusal is compiled in, not enforced at runtime by configuration.
Approval is granted by class¶
api-mcp-compiler approve SPEC --overlay OVERLAY --risk destructive
api-mcp-compiler approve SPEC --overlay OVERLAY --group warehouses
api-mcp-compiler approve SPEC --overlay OVERLAY --name permanently_remove_item_record_warehouse
A selection that names nothing is refused, and so is one that matches nothing. There is deliberately no flag that approves a whole surface without saying what class of thing it belongs to.
The command reports what the approval covered, what was already approved and what it left untouched, because a reviewer who cannot see what they just approved has not really approved it.
The human path¶
report, then approve, then serve.
A reviewer reads a self-contained HTML report, records a decision by class, and serves the approved part of the surface. At no point should anyone have to hand-edit an overlay.