Failure taxonomy
Every bundle failure is classified into one of five canonical classes. Each class has a distinct recovery policy that the agent applies automatically.| Class | Cause | Agent recovery |
|---|---|---|
fee_too_low | Tip below current auction floor | getRawTx → requeue → submit at escalated percentile |
expired_blockhash | Slot exceeded lastValidBlockHeight | getRawTx → requeue → submit (sidecar fetches fresh blockhash) |
compute_exceeded | InstructionError: ComputationalBudgetExceeded | writeTrace + hold — the instruction itself is broken |
bundle_failed | On-chain execution error or post-send RPC error | Inspect raw_error → retry or hold based on error content |
slot_skip | Leader produced no block (SLOT_DEAD event) | getRawTx → requeue → submit at same tip |
Injecting a fault
The fault injection system lets you trigger any failure class on demand — without real network conditions. Register a one-shot fault before enqueueing a transaction:The fault is consumed after a single use. The next submit after the faulted one goes to real Jito.
How it works
When a fault is registered viaPOST /debug/fault, the sidecar stores it in a next_fault field. The next call to POST /internal/submit:
- Drains the tx queue normally (bytes are retained for retry)
- Detects the pending fault
- Synthesizes a failed lifecycle entry with the specified
failure_class - Emits
TxStatusChanged+BundleSettledSSE events - Returns HTTP 200 with a structured result — no Jito call is made
Running the full demo
Thefault_demo.ts script in the agents/ directory automates the full sequence:
Valid fault classes
One of the five canonical classes:
fee_too_lowexpired_blockhashbundle_failedcompute_exceededslot_skip
Optional custom error string stored in the lifecycle entry’s
raw_error field.
Defaults to "Injected fault: {failure_class} (demo)".