Skip to main content

Tool-result codes

When enforcement does not call the original tool, ActionRail returns a redacted tool-result message containing a bracketed code.

CodeTriggerRetry guidance
ACTIONRAIL_BLOCKEDFinal decision is block.Do not retry the same call unchanged. Correct the proposal or underlying trusted fact.
ACTIONRAIL_HELDA hold remains unresolved, times out, expires, or has no remote review queue.Do not retry unchanged. Follow the application’s review/exception flow.
ACTIONRAIL_REJECTEDA human rejected the held action.Do not retry unchanged.
ACTIONRAIL_REVIEW_UNAVAILABLEReview could not open or remained unreachable at deadline.Retry only after review service recovery and after re-evaluating the action.
ACTIONRAIL_CONFIG_STALERemote enforcement authority exceeded its staleness limit.Retry only after control-plane configuration validation recovers.

Example:

⛔ [ACTIONRAIL_BLOCKED] ActionRail blocked this tool call before execution.
Verification failed for argument 'order_id'. Do not retry the same call unchanged.

The human-readable text can evolve. Application logic should detect the stable code token rather than parse the full sentence.

No allow code​

An allowed action returns the original tool’s result. ActionRail does not replace a successful result with ACTIONRAIL_ALLOWED.

Use the local decision callback or Activity when the application needs an explicit audit/metric for allows.

Monitor mode​

Monitor mode may report a hypothetical block or hold, but it still executes the original tool and returns that tool’s result. Model-facing failure codes therefore represent enforced outcomes, not monitored observations.

Keep recovery outside the model​

Do not let a model decide that a safety code can be ignored. The host application should own retry timing, escalation, and operator messaging for infrastructure codes such as ACTIONRAIL_REVIEW_UNAVAILABLE and ACTIONRAIL_CONFIG_STALE.

For diagnostic steps, see Troubleshooting.