Swarm Denial Codes
Find a refused swarm action’s code or message, the binding that failed, and the repair that keeps prior effects intact.
On this page
A swarm refusal names what broke: a graph relationship, a widened scope, a revoked task, or a reused continuation. Each runtime code and verifier message below points at the artifact and the binding to repair.
Search a code, a message fragment, or an artifact id. Keep the denied request and its signed receipt beside the repair so the change can be reviewed.
Try scope discontinuity, chio_swarm_continuation_replay, or route metadata.
Repairs by failed binding
Read the stable code with its detail and the request’s evidence references. Reproduce the matching positive example, then compare the first input that diverges.
- Missing or untrusted witness signer. Configure the verified public key on the host with
with_swarm_witness_keys, and remove trust material from the request. An issuer key that appears in a submitted artifact is never adopted for that reason. Example: configured kernel. - Graph or witness digest mismatch. Finalize and sign the referenced object before hashing it, rebind and re-sign its dependent continuations, and store and reference the same serialized artifact. Example: graph and continuation binding.
- Route mismatch. Compare
bridge,protocolTarget, andselectedRoutefrom the host’s selected route with the child’s signed receipt. A changed route needs a newly authorized plan; the host’s selection outranks request metadata. Example: task-bound route. - Over-allocation or inactive allocation. Reconcile allocation units against the pool and the producer’s ledger. Admission requires the continuation’s allocation to be active, fan-out returns
Reserved, and an operator-owned state transition authorizes activation. Example: reservation and release. - Continuation replay. Find out whether the first attempt reached dispatch. Release only a reservation aborted before any effect; if an effect may have happened, reconcile the result before issuing new authority, and leave replay state intact. Example: abort and replay.
- Stale or revoked evidence. Obtain the current trusted epoch and newly authorized evidence. A revoked task re-signed under the same revoked set stays revoked. Example: signed revocation.
Failure sources
| You have | What it identifies | Where to look |
|---|---|---|
Runtime failure code | A request- | |
Verifier message | The first failed check in a supplied bundle, often with an artifact or task id | |
Negative- | The failure a proof-room test descriptor expects |
chio_swarm_authority_rejected groups bundle-verifier failures with live route mismatches, and a slug is derived from a message. Keep the exact message, artifact ids, request evidence references, trusted-key configuration, evaluation time, and relevant store state: together they separate an invalid artifact from wrong evidence selection, expired authority, or a replay reservation.
Check order
bbundleeevidencerrouteκauthorityccontinuationπadmissionr′revalidate
The child is admitted, then revalidated before dispatch
The runtime loads the stored bundle for the request’s artifact references and compares their ids and digests. It compares bridge, protocol target, and selected route with the stored route plan, verifies the bundle at the request’s evaluation time, and reserves the single-use continuation id. After the remaining admission checks it records the normalized route, then revalidates that record and the reloaded bundle before dispatch. One child task, admitted.
The runtime checks the request’s evidence references against its stored bundle, compares live route metadata, verifies the bundle, and then consumes a single-use continuation. A failure at one boundary stops the later checks. Presentations that share one coordinated store compete for the same continuation marker before policy evaluation runs. Proof verification evaluates the supplied artifacts only, so live route comparison and the store’s replay state belong to runtime admission.
Inside the library the order is pinned keys, task graph and its signature, required delegation evidence, routes, joins, budgets, revocation epoch, terminal receipts, continuations, then witness chains. The verifier returns its first error and produces no partial acceptance report. Swarm Authority covers the architecture.
Runtime and store codes
Admission refusals place a code in metadata.chio_runtime.failure_code. Store insertion and state-validation errors normally return through the store API. Other admission rules can also refuse a swarm-bound request; this table lists the swarm-specific codes.
| Failure code | Produced when | Next |
|---|---|---|
invalid_ | The chioSwarm key exists on the governed intent but is not a JSON object. | Send an object in governed intent context. |
request_ | The context carries any of trustRoot, trustRoots, trustBundle, authorityBundle, signingKey, witnessKeys. | Trust is verifier-owned. Remove the key; there is no override. |
request_ | The context carries dynamicTrust, dynamic, or peerDiscovery. | Same. Checked before any reference is parsed. |
missing_ | One of the seven references is absent, or present without both an id and a digest. | All seven are mandatory: task graph, continuation token, route-plan receipt, delegation witness, join receipt, revocation epoch, budget pool. |
invalid_ | A named reference is not a JSON object, its id trims to empty, or its digest is not exactly 64 ASCII hex characters. The shape check, is_sha256_hex in chio-, accepts uppercase. | Send the canonical digest of the stored artifact, lowercase. An uppercase digest passes this check and then fails the comparison as chio_, because canonical_ emits lowercase. |
missing_ | No bundle is stored under the referenced task-graph id, or the store keeps the trait default for swarm_, which returns Ok(None). | Inspect the selected store and graph id. The host populates the store through insert_ and pins witness keys with with_. |
chio_ | A referenced id or canonical digest disagrees with the stored artifact; a referenced artifact is absent from the stored bundle; or the continuation names a different route plan than the request did. | Re-read the stored bundle and recompute digests. Check both the request’s references and the stored artifact version. |
chio_ | Route metadata did not match the route-plan receipt, or the verifier refused the bundle. | Inspect live route metadata first. For artifact diagnosis, use the Chio library verifier or chio proof verify on a transaction passport carrying the bundle. Route metadata is compared only at runtime. |
chio_ | A single-use continuation id was already consumed. Every store arm agrees: in-memory set insert, JSON list scan, and SQLite INSERT OR IGNORE returning zero rows. | Check whether this is a retry of work already admitted. A new action needs newly authorized continuation evidence. Continuation Tokens covers the lifecycle and the resumable exemption. |
chio_ | The admission store keeps the trait default for consume_ or release_, which refuses. The detail names the operation. | Use a store that implements continuation consumption. |
swarm_ | Consumption failed for a reason that is not replay, including a caught panic. | Ownership is ambiguous. The metadata adds ambiguous_, reservation_, and reservation_. Treat the id as burned. |
runtime_ | A bundle is inserted with an empty or whitespace-only task_. All three backends check on insert; SQLite also checks on lookup, and the JSON store re-checks every stored bundle in validate_state. | Store-side, not request-side. Fix the writer. |
duplicate_ | A second bundle is inserted under an existing graph id with a different canonical digest. An identical re-insert is idempotent and returns success. | An insert does not replace an existing graph. Inspect the conflicting versions; publish newly authorized evidence through the integration’s supported state-update procedure. |
duplicate_ | The JSON store’s state validation found the same consumed continuation id twice in its own file. | Inspect the stored state and its writer; state validation fails until the duplicate is resolved. |
The JSON store also emits duplicate_swarm_authority_bundle when its own state repeats a graph id.
An admission denial receipt carries the code; the ordinary denial path drops the verifier’s detail sentence. Dispatch revalidation wraps the detailed error in KernelError::Internal. To recover the sentence for a refused bundle, run the verifier on it.
Verifier messages by artifact
Search a diagnostic fragment to narrow these tables to matching rows. Braces show interpolated values. Message text is diagnostic vocabulary, several checks share one message, and the runtime codes are the stable contract.
Choose the repair from the cause: correct a reference, fix trusted-key configuration, obtain fresh authority, or reissue a changed signed artifact. Re-signing the same invalid fields fails the same check. A passing artifact replay says nothing about a runtime replay reservation.
Field-shape messages
| Message template | Inspect |
|---|---|
{label} must not be empty | The named string is empty. The library helper checks emptiness, without trimming whitespace. |
{label} must be a lowercase sha256 digest | The named value must contain exactly 64 ASCII hexadecimal characters, with no uppercase letters. |
duplicate {label}: {value} | The same string occurs twice in a list that must be unique. Empty entries fail the emptiness check first. |
swarm {label} graph id mismatch | The artifact names a different graph from the supplied task graph. |
An unknown JSON key fails deserialization before these checks. Signature-body conversion can separately report swarm {family} signature body invalid: {id}, optionally with an underlying error. Retain that detail when diagnosing serialization.
Bundle level and trust
| Denial string | Produced when | Mechanism |
|---|---|---|
trust:role-unpinned: no key is pinned for swarm.witness | No key is pinned for the swarm.witness role, so chio proof verify exits 2 before it reads an artifact. The library refuses the same empty slice with trusted swarm witness keys missing. Pin the verifier’s own keys with chio trust pin swarm.witness before diagnosing the bundle; never take replacement trust keys from the request. | |
signed swarm delegation evidence missing: continuation tokens and witness chains are required | Either continuation_ or witness_chains is empty. Checked fourth, after the key-slice precondition, the task graph, and the graph signature. | |
swarm witness issuer did:chio is not self-certifying | An issuer prefixed did:chio: whose remainder is not exactly 64 lowercase hex characters. Raised for any artifact family, not only witnesses. | |
swarm witness issuer public key invalid: {error} | The issuer does not parse as a supported public key. The did:chio form encodes Ed25519; other accepted encodings use the shared PublicKey parser. Also raised for any family: witness_ is the shared parser. | |
swarm authority canonical JSON failed: {detail} | The Swarm variant, whose text comes from its Display in crates/. Canonical JSON encoding or signature verification raised an error instead of returning false: a fault in the input or library, outside policy. |
Task graph structure
| Denial string | Produced when | Mechanism |
|---|---|---|
unsupported swarm task graph schema: {schema} | Schema tag is not chio.. | |
swarm task graph is from the future | created_ is after the bundle’s now_unix_ms. | |
swarm task graph is expired | expires_ is at or before now. Expiry is inclusive. | |
swarm task graph requires at least one task | Empty nodes. | |
swarm task graph max_fanout must be positive | A zero ceiling would forbid every edge. max_depth has no equivalent floor. | |
swarm task graph requires exactly one root task | The count of nodes with no parent and depth zero is not one. | |
swarm root-depth task has parent: {task_id} | Depth zero with a parent_task_id. | |
swarm non-root task missing parent: {task_id} | Depth above zero with no parent. | |
duplicate swarm task id: {task_id} | Two nodes share an id. Raised while building the task index, before any edge is read. | |
unknown swarm edge source: {task_id} | An edge names a task that is not in the graph. Raised from both edge validation and depth validation. | |
unknown swarm edge target: {task_id} | Same, on the other end of the edge. | |
duplicate swarm task graph edge | The deduplicated edge set is smaller than the edge list. The message names no edge. | |
swarm task parent edge missing: {parent} -> {child} | A node declares a parent with no corresponding edge. Parentage must be stated twice and agree. | |
swarm task depth mismatch: {from} -> {to} | Child depth is not parent depth plus one. The rule is exact equality. | |
swarm task depth overflow | Parent depth plus one overflows the integer type. | |
swarm task exceeds max depth: {task_id} | A node’s depth is above the signed max_depth. Fixture max-. | |
swarm task exceeds max fanout: {task_id} | Outgoing edge count from one task passes max_fanout. The id named is the parent. | |
swarm task graph cycle at {task_id} | Depth-first walk re-enters a task still on the stack. Fixture graph-cycle. | |
swarm task graph issuer is not trusted: {graph_id} | The graph’s issuer key parsed but is not in the pinned slice. | |
swarm task graph signature invalid: {graph_id} | Signature verified false over the graph body with signature removed. A trailing : {error} means the hex did not parse at all. | |
duplicate swarm join id: {join_id} | Two joins declared in the graph share an id. | |
swarm join requires parents: {join_id} | Empty parent_task_ids. | |
swarm join requires at least two parents: {join_id} | Exactly one parent. A one-parent fan-in is an edge, and must be modeled as one. | |
swarm join next task is unknown: {next_task_id} | The join targets a task that is not in the graph. | |
swarm join next task is a parent: {join_id} | The join’s target also appears among its parents. | |
swarm join parent task is unknown: {parent_task_id} | A declared parent is not in the graph. |
Route-plan receipts
| Denial string | Produced when | Mechanism |
|---|---|---|
unsupported swarm route-plan receipt schema: {schema} | Schema tag is not the route-plan receipt tag. | |
swarm route-plan egress constraints missing: {route_plan_id} | Empty egress_. At least one is required. | |
unsupported swarm route-plan egress constraint: {constraint} | Any entry other than the literal deny-. The vocabulary is closed at one value. Fixture egress-. | |
swarm route-plan selected route bridge mismatch: {route_plan_id} | selected_route has no :, or its prefix is not bridge_id. Fixture route-. | |
swarm route-plan protocol target bridge mismatch: {route_plan_id} | protocol_target does not start with {bridge_id}://. | |
swarm route-plan egress contract bridge mismatch: {route_plan_id} | egress_ does not start with {bridge_id}:. | |
swarm route-plan attenuation was not accepted | attenuation_ is any string other than accepted. The message names no receipt. | |
swarm route-plan receipt is stale: {route_plan_id} | Receipt expiry is at or before now. Fixture stale-. | |
swarm route-plan issuer is not trusted: {route_plan_id} | Parsed issuer key is not in the pinned slice. | |
swarm route-plan signature invalid: {route_plan_id} | Signature verified false, or with a trailing : {error}, the hex did not parse. | |
swarm route-plan task is unknown: {task_id} | The receipt is scoped to a task that is not in the graph. | |
unknown swarm route-plan ref: {route_plan_id} | A supplied receipt is not listed in the graph’s route_plan_refs. | |
missing swarm route-plan receipt: {route_plan_ref} | A declared ref has no receipt. The other half of the same totality check. | |
duplicate swarm route-plan receipt: {route_plan_id} | Two receipts share an id. |
Join receipts
| Denial string | Produced when | Mechanism |
|---|---|---|
unsupported swarm join receipt schema: {schema} | Schema tag is not the join receipt tag. | |
swarm join receipt dag ordinal must be positive: {join_id} | Ordinal is zero. Enforced both at mint and at verification. | |
swarm join receipt is from the future: {join_id} | hlc_unix_ms is after now. A join receipt’s age has no upper bound. | |
unknown swarm join receipt: {join_id} | A receipt whose id matches no join declared in the graph. | |
missing swarm join receipt: {join_id} | A declared join has no receipt. | |
duplicate swarm join receipt: {join_id} | Two receipts share a join id. | |
swarm join receipt next task mismatch: {join_id} | The receipt’s next_task_id differs from the graph join’s. | |
swarm join receipt next task is unknown: {next_task_id} | That target is not a task in the graph. | |
swarm join receipt parent count mismatch: {join_id} | Expected- | |
swarm join receipt predicate unsupported: {join_predicate} | Predicate is not all_success, any_success, or quorum:N; or N does not parse, is zero, or exceeds the expected parent count. | |
swarm join receipt parent set mismatch: {join_id} | Four call sites share this string: all_success with unequal expected and actual sets, any_success with zero actuals, quorum:N with fewer actuals than N, and an actual receipt id that is not in the expected set. Fixture join-. | |
swarm join receipt parent set hash mismatch: {join_id} | The declared parent_set_hash differs from the recomputed digest over the chain id plus sorted actual receipt ids. | |
swarm join receipt parent task receipts mismatch: {join_id} | The per-parent receipt list does not correspond one to one with the expected- | |
swarm join receipt issuer is not trusted: {join_id} | Parsed issuer key is not in the pinned slice. | |
swarm join receipt signature invalid: {join_id} | Signature verified false, or with a trailing : {error}, the hex did not parse. |
Budget pool and allocations
| Denial string | Produced when | Mechanism |
|---|---|---|
unsupported swarm budget pool schema: {schema} | Schema tag is not the budget pool tag. | |
swarm budget pool ref mismatch | The pool’s id is not the graph’s budget_pool_ref. One graph, one pool. | |
swarm budget allocation task is unknown: {task_id} | An allocation is scoped to a task that is not in the graph. | |
swarm budget allocation unit rollup mismatch: {allocation_id} | Reserved plus active plus consumed plus released plus reversed does not equal max_units exactly. | |
swarm budget allocation has no active units: {allocation_id} | State is active with zero active units. | |
swarm budget allocation is not active: {allocation_id} | A continuation names an allocation in any state other than active. Raised during continuation validation, which is why a released allocation denies the child rather than the pool. | |
duplicate swarm budget allocation: {allocation_id} | Two allocations share an id. | |
swarm budget allocations exceed pool total | Summed max_units is above total_units. Fixture budget-. | |
swarm budget allocation overflow | Summing allocations across the pool overflowed. Checked arithmetic throughout, never clamped. | |
swarm budget allocation unit overflow | Summing one allocation’s five state counts overflowed. |
Revocation epoch
| Denial string | Produced when | Mechanism |
|---|---|---|
unsupported swarm revocation epoch schema: {schema} | Schema tag is not the revocation epoch tag. | |
swarm revocation epoch ref mismatch | The epoch’s id is not the graph’s revocation_. | |
swarm revocation epoch is from the future | issued_ is after now. | |
swarm revocation epoch window is empty | valid_ is at or before issued_. | |
swarm revocation epoch is stale | The window closed at or before now. An expired epoch refuses the whole bundle. | |
swarm revocation epoch root mismatch | The declared root_hash differs from the digest recomputed over the sorted revoked-subject and revoked-task lists. | |
swarm revocation epoch issuer is not pinned: {epoch_id} | Issuer key is not in the pinned slice. Check the epoch issuer against the verifier-owned key set. | |
swarm revocation epoch signature invalid: {epoch_id} | Signature verified false, or with a trailing : {error}, the hex did not parse. | |
swarm authority subject is revoked: {subject} | The epoch names the graph issuer, the planner subject, or any witness hop issuer. validate_ tests exactly those three roles against revoked_; route-plan, join-receipt, continuation, terminal- | |
swarm task is revoked: {task_id} | A revoked task id is present in the graph. Fixture revoked-task. |
Terminal graph receipts
Join & Terminal Receipts owns the artifact and the set-equality rule. Sub-Agent Budgets owns the rollup arithmetic these rows compare against, so the budget rows point there.
| Denial string | Produced when | Mechanism |
|---|---|---|
missing swarm terminal graph receipt | Empty terminal_. The field is serde(default), so an absent field and an empty list both land here. | |
unsupported swarm terminal receipt schema: {schema} | Schema tag is not the terminal graph receipt tag. | |
duplicate swarm terminal receipt: {receipt_id} | Two terminal receipts share an id. | |
swarm terminal receipt is from the future: {receipt_id} | completed_ is after now. | |
swarm terminal budget pool mismatch: {receipt_id} | The receipt names a different pool id than the bundle’s. | |
swarm terminal revocation epoch mismatch: {receipt_id} | The receipt names a different epoch id than the bundle’s. | |
swarm terminal task is unknown: {terminal_ | A terminal task id is not in the graph. The list references known tasks and need not cover them. | |
swarm terminal completed task set mismatch: {receipt_id} | Completed task ids are not exactly the graph’s task set. Set equality, so a receipt cannot close part of a graph. | |
swarm terminal join receipt set mismatch: {receipt_id} | Join receipt ids are not exactly the validated join set. | |
swarm terminal route-plan set mismatch: {receipt_id} | Route-plan receipt ids are not exactly the validated route set. | |
duplicate swarm terminal budget rollup: {dimension_id} | Two rollups share a dimension. | |
swarm terminal budget rollup total mismatch: {dimension_id} | One rollup’s five state counts do not sum to its own declared total_units. | |
swarm terminal budget rollup mismatch: {receipt_id} | The declared per-dimension map differs from the map recomputed over the pool’s validated allocations, every one of them whatever its state. Compared whole, so a missing dimension is the same failure as a wrong count. | |
swarm terminal budget exceeds pool total: {receipt_id} | Summed rollup totals are above total_units. | |
swarm terminal budget rollup overflow | Any rollup addition overflowed: one per unit column in add_allocation, one in total_units, and one folding the per-dimension totals. Several additions share this string; inspect both the per-dimension columns and the total. | |
swarm terminal receipt issuer is not trusted: {receipt_id} | Parsed issuer key is not in the pinned slice. | |
swarm terminal receipt signature invalid: {receipt_id} | Signature verified false, or with a trailing : {error}, the hex did not parse. |
Continuation tokens
A continuation binds every other artifact, so this family is the largest. Each row points at the binding that failed.
| Denial string | Produced when | Mechanism |
|---|---|---|
unsupported swarm continuation token schema: {schema} | Schema tag is not the continuation token tag. | |
swarm continuation token is from the future: {token_id} | issued_ is after now. | |
swarm continuation token is stale: {token_id} | Expiry is at or before now. Fixture stale-. | |
swarm continuation nonce replay: {token_id} | Two tokens in one bundle share a nonce. Within-bundle only. Fixture replayed-. | |
duplicate swarm continuation token: {token_id} | Two tokens share an id. | |
swarm task continuation token ref missing: {task_id} | A task with a parent names no continuation token. | |
missing swarm continuation token: {token_ref} | A task names a token id that is not in the bundle. The token reference must resolve within the supplied bundle. | |
swarm continuation token task mismatch: {token_ref} | The named token exists but its child_task_id is a different task. | |
swarm continuation child task is unknown: {child_task_id} | The token names a task that is not in the graph. | |
swarm continuation graph digest mismatch: {token_id} | graph_sha256 differs from the canonical digest of the whole task graph, signature field included. | |
swarm continuation must choose parent task or join receipt: {token_id} | Both parent_task_id and join_receipt_id are set. | |
swarm continuation missing parent context: {token_id} | Neither is set. | |
swarm continuation parent task mismatch: {token_id} | The token’s parent is not the child task’s declared parent. | |
swarm continuation parent edge mismatch: {token_id} | No graph edge runs from that parent to that child. | |
swarm continuation lacks parent receipt: {token_id} | A parent-task token carries an empty parent_. | |
swarm continuation join receipt is unknown: {join_receipt_id} | A join token names a receipt that did not validate into the join index. | |
swarm continuation join target mismatch: {token_id} | The join’s next_task_id is not the token’s child task. | |
swarm continuation join parent receipts mismatch: {token_id} | The token’s parent receipt ids, sorted, differ from the join receipt’s actual parent receipt ids. | |
swarm continuation witness chain binding missing: {token_id} | A parent-task token carries no witness_. Also enforced at mint. | |
swarm continuation witness chain digest missing: {token_id} | A ref without its witness_. | |
swarm continuation witness chain binding without parent task: {token_id} | A join token carries a witness ref or digest. A fan-in is witnessed per edge. | |
swarm continuation witness chain mismatch: {token_id} | No chain with that id, or its parent and child tasks are not the token’s. | |
swarm continuation witness chain digest mismatch: {token_id} | The declared digest differs from the canonical digest of the referenced chain. | |
swarm continuation route-plan ref missing: {token_id} | The child task declares no route_plan_ref. Every continued task must be routed. | |
swarm continuation route-plan ref mismatch: {token_id} | The child task’s declared ref is not the token’s route_. | |
swarm continuation route-plan receipt is unknown: {route_ | The named receipt did not validate into the route index. | |
swarm continuation route-plan task mismatch: {token_id} | The receipt is scoped to a different task than the token’s child. | |
swarm continuation budget ref missing: {token_id} | The child task declares no budget_. | |
swarm continuation budget ref mismatch: {token_id} | That ref is not the token’s budget_. | |
swarm continuation budget allocation is unknown: {budget_ | The named allocation is not in the validated pool. | |
swarm continuation budget task mismatch: {token_id} | The allocation is scoped to a different task than the token’s child. | |
swarm continuation revocation epoch mismatch: {token_id} | The token names a different epoch id than the bundle’s. | |
swarm continuation revocation epoch root mismatch: {token_id} | The token’s epoch root hash differs from the epoch’s. The token binds the epoch id and list root only. | |
swarm continuation issuer is not trusted: {token_id} | Parsed issuer key is not in the pinned slice. | |
swarm continuation signature invalid: {token_id} | Signature verified false, or with a trailing : {error}, the hex did not parse. |
Delegation witness chains
| Denial string | Produced when | Mechanism |
|---|---|---|
unsupported swarm delegation witness chain schema: {schema} | Schema tag is not the witness chain tag. | |
missing swarm delegation witness chain: {parent} -> {child} | A graph edge has no chain. Every edge must be covered. | |
duplicate swarm delegation witness chain: {parent} -> {child} | Two chains cover the same edge. Each edge is covered exactly once. | |
swarm witness chain edge mismatch: {chain_id} | The chain’s parent and child pair is not an edge in the graph. | |
swarm witness chain parent task is unknown: {parent_task_id} | The chain names a parent that is not in the graph. | |
swarm witness chain child task is unknown: {child_task_id} | Same, for the child. | |
swarm witness chain has no hops: {chain_id} | Empty hops. | |
swarm witness parent scope mismatch: {chain_id} | The first hop’s parent scope hash is not the parent task’s scope_hash. | |
swarm witness child scope mismatch: {chain_id} | The last hop’s child scope hash is not the child task’s. Fixture witness-. | |
swarm multi-hop witness chain feature gate missing: {chain_id} | More than one hop while the signed graph does not set multi. The gate is a per-graph field inside the signed artifact. | |
swarm witness hop scope discontinuity: {chain_id} | One hop’s child scope hash is not the next hop’s parent scope hash. | |
swarm witness hop capability discontinuity: {chain_id} | Same break, in the capability digests. | |
swarm witness hop is stale: {chain_id} | A hop’s expiry is at or before now. The message names the chain. | |
swarm attenuation witness invalid: {error} | The scope-subset proof failed. The nested text comes from validate_ in chio-core-types and uses capability vocabulary. | |
swarm witness issuer is not trusted: {chain_id} | A hop’s issuer key is not in the pinned slice. | |
swarm witness signature invalid: {chain_id} | A hop signature verified false, or with a trailing : {error}, the hex did not parse. |
Route metadata, runtime only
These eight messages come from verify_route_metadata_matches in chio-runtime-core, which compares the live route selection the kernel is about to take with the signed route-plan receipt. They occur only at runtime, each arrives as chio_swarm_authority_rejected, and each belongs to Route Plans.
The outer key is read as route, route_selection, or routeSelection. Each inner field accepts the alternate spellings listed in the table, and the first match wins. On acceptance the hook stores its own normalized { route: { bridge, protocolTarget, selectedRoute } } under verified_swarm_route_metadata, and dispatch revalidation compares against that record.
| Denial string | Produced when |
|---|---|
swarm route metadata missing for route plan {route_plan_id} | No metadata was passed with the request at all. |
swarm route metadata missing routed entry for route plan {route_plan_id} | Metadata carries none of the three route keys. |
swarm route metadata missing bridge for route plan {route_plan_id} | No bridge, bridgeId, targetProtocol, or selected string. |
swarm route metadata bridge mismatch: expected {expected}, got {actual} | The live bridge is not the receipt’s bridge_id. |
swarm route metadata missing protocol target for route plan {route_plan_id} | No protocolTarget or protocol_target string. |
swarm route metadata target mismatch: expected {expected}, got {actual} | The live target is not the receipt’s. |
swarm route metadata missing selected route for route plan {route_plan_id} | No selectedRoute, selected_route, selectedRouteId, or selected_ string. |
swarm route metadata selected route mismatch: expected {expected}, got {actual} | The live route is not the receipt’s. |
Captured refusals
Every refusal on this page can be reproduced on your machine. chio proof fixture generate recursive-runtime-swarm --with-negatives --out ./swarm writes the eleven negatives and a fixture trust file; one command verifies the whole directory and expects each bundle to be refused.
$ chio proof verify ./swarm/negatives --trust ./swarm/trust.toml --expect refuseREFUSED budget-allocations-exceed-pool swarm budget allocations exceed pool total REFUSED egress-constraint-unsupported unsupported swarm route-plan egress constraint: allow-private-network REFUSED graph-cycle swarm task graph cycle at task-child-a REFUSED join-parent-set-mismatch swarm join receipt parent set mismatch: join-child-results REFUSED max-depth-exceeded swarm task exceeds max depth: task-child-a REFUSED replayed-continuation-nonce swarm continuation nonce replay: continuation-child-b REFUSED revoked-task swarm task is revoked: task-child-a REFUSED route-plan-mismatch swarm route-plan selected route bridge mismatch: route-child-a REFUSED stale-continuation swarm continuation token is stale: continuation-child-a REFUSED stale-route-plan swarm route-plan receipt is stale: route-child-a REFUSED witness-child-scope-mismatch swarm witness child scope mismatch: witness-child-a 11 of 11 refused, as expected trust ./swarm/trust.toml (fixture keys)
Each line names the negative and the verifier’s reason, the string the tables above index. Exit status 0 means every input met --expect refuse; a negative that verified would print VERIFIED and fail the run with exit 1, which makes the command a regression check for your own verifier build.
Negative-fixture slugs
The CLI takes the text after proof verify:, removes supported wrapper prefixes, and drops a suffix after : unless the remaining message already looks like a dotted code. It lowercases an ordinary message, replaces each run of non-alphanumeric characters with a hyphen, and prefixes proof-room.negative..
message swarm route-plan receipt is stale: route-child-a
slug proof-room.negative.swarm-route-plan-receipt-is-stale
message swarm task graph cycle at task-child-a
slug proof-room.negative.swarm-task-graph-cycle-at-task-child-aThe first message loses its artifact id at the colon; the cycle message keeps its task id. Already-dotted codes are preserved, and an empty normalized value becomes proof-room.negative.unknown. Slugs belong to proof fixture matching; admission reports the runtime codes above.
Negative transaction-passport descriptors carry an expected failure code for the proof-package doctor scenario. The swarm-authority doctor scenario checks its selected cases against message substrings, so a passing scenario covers the cases it lists.
Construction failures
Minting, signing, and the budget fan-out and fan-in helpers also return SwarmAuthorityError::Rejected. An issuer and signer mismatch, an invalid expiry, a missing parent receipt, or a budget arithmetic error can arise while producing evidence, before any admission attempt.
A constructor failure has no admission outcome to recover: correct the inputs and issue the artifact. The shared swarm witness issuer public key invalid message also occurs during verification, so the calling operation tells the two paths apart.
Refusal scope
- First error. The library returns one refusal and no partial report. Later artifacts may hold further failures, so repair and verify again.
- Evaluation time. The library evaluates the supplied bundle at the time it carries. Proof paths supply their clock; the runtime supplies its admission or revalidation time.
- Runtime replay. Single-use continuations are consumed through the admission store; resumable tokens take no consume path. Duplicate nonces inside one bundle are a separate verifier rule.
- Ambiguous consumption. A consume error or panic leaves ownership uncertain. The hook records the ambiguous swarm id and attempts to release the treaty reservation; inspect the recorded state before authorizing a new action.
- Admission path. The kernel’s admission path runs the swarm hook against the configured store and the pinned witness keys, so these codes come from the serving path itself.
- Completed graphs. Verification requires terminal receipts whose completed task set equals the graph’s task set. A refusal reports a broken binding; scheduler status lives elsewhere.
- Message stability. Error variants carry strings. Preserve the original detail, and key automation on the runtime codes.
Source files
The bundle verifier, its witness checks, and field helpers define the artifact messages. The runtime authority adapter and request-reference parser define the admission boundary. The proof command defines negative-fixture normalization.