Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Rejection reasons

Start with the version’s reject_reason from GET /v1/versions/{id}. A submission request refusal, an admission rejection, a trial failure, and a failed match are different events; use the stage to decide what to do next.

Request refusals

These occur before a new version is successfully recorded.

Error or conditionMeaningNext step
hashes_requiredMissing or obviously malformed declared hashesSupply both weights_hash and manifest_hash as sha256:<64 hex>
season_not_openNo season accepting submissionsRead the season dates and wait for an open window
not_a_participantAccount not admitted by the season’s participant ruleCheck eligibility with the organizer
weights_already_enteredAnother owner already holds these weights under the season’s ruleCheck the rule scope and submit an eligible entry
version_in_flightThis model already has a testing or verified candidateFollow that candidate to a verdict; your other models are unaffected
unknown_modelThat model id is not one of yoursCreate the model first — a submission never creates one
model_retiredThe model takes no new versionsRevive it, or submit to another
too_many_in_flightYou are at the season’s limit for versions in admission at onceWait for one to reach a verdict
too_many_versionsYou have entered as many versions as the season allowsThe next season starts you fresh
cooling_downThe season asks for a gap between one model’s submissionsThe response carries the instant you may try again
entries_maxYou hold as many models as the season allowsRetire one to free a slot
name_requiredThe create call carried no nameA name is the whole of what an entry declares
model_name_takenYou already have a model with that nameNames are how yours are told apart; another competitor may hold the same one
401 / session_revokedSession absent, invalid, expired, or revokedSign in again

weights_already_entered is the season’s unique_weights rule and the only uniqueness conflict a submission can hit: there is no release tag to duplicate any more, so do not depend on an invented duplicate_release error code.

cooling_down is the one refusal that can legitimately disagree with itself between two calls a second apart, because it is a function of the current time. That is why it reports the instant you may retry rather than a yes or no.

The upload, and what arrived

ReasonMeaningNext step
ARTIFACT_MISSINGThe graph is not in the bucket at your version’s keyYou did not upload. Submit the same tag again for fresh URLs and PUT both files
MANIFEST_MISSINGThe graph arrived and the manifest did notThe same fix, for the second file
MANIFEST_MISMATCHWhat was uploaded does not hash to manifest_hashRe-run shasum -a 256 on the file you actually sent
MANIFEST_INVALIDThe document carries no inputs or no outputsIt is not an orion:model@1.0.0 manifest
RESULT_NOT_ALLOWEDThe manifest carries a result expressionThe platform reads the head. Delete it — see the manifest
DIGEST_FAILEDThe node re-hashed the graph and got something elseThe same fix as MANIFEST_MISMATCH, for model.onnx
SIZE_FAILEDThe object is past the node’s own ceiling, before any class is consideredReduce the file

Graph and policy

ReasonMeaningNext step
PARSE_FAILEDThe ONNX parses and no plan buildsRe-export. A graph that computes indices internally cannot declare named spatial axes — give it concrete ones
PROBE_FAILEDIt loads and will not run at your probe_dims, or takes longer than the node allows for five inferencesCheck that the declared shapes are what the graph actually takes
TOO_LARGES' — the two files’ bytes — is past the largest class this season runsMeasure both files and reduce the larger
OPSET_UNSUPPORTEDOpset outside deployed policyExport within the supported range
OP_NOT_ALLOWEDGraph uses an operator this season does not allowInspect the exported nodes, including If/Loop/Scan bodies, and use supported operations
CLASS_NOT_OFFEREDIt measured into a weight class this season does not runReach a class the season offers — this is not the same as being too large
PARAMS_EXCEEDEDMore parameters than this season allowsReduce the parameter count, not only the bytes. The count is every value the document carries, wherever it carries it
TOO_SLOWSlower than this season’s inference ceilingRare: most seasons set none. Simplify the graph

A slow graph does not automatically move to a larger class. See model format and weight classes.

Adapter and interface

ReasonMeaningNext step
ADAPTER_INVALIDAn adapter did not produce a tensor the graph takes, or produced none for a declared inputCheck operators, scopes, dtypes and shapes. A misspelt operator fails here, not at load
ADAPTER_OVER_BUDGETAn adapter exceeds its operation budget on a reference observationMeasure cases and reduce the work — the budget
HEAD_UNREADABLEThe policy output is not a shape the referee can readIt must be rank 2 or rank 4 — [N, 5] or [1, 5, H, W]. See the two head shapes

ADAPTER_OVER_BUDGET and ADAPTER_INVALID are deliberately different words: “too expensive” and “wrong” must not read the same. The detail carries the failing case index. Reproduce all three with tinybrains check, which measures what admission measures.

Every rejection carries a detail beside the word — the failing case index, the operator name, the two hashes, the byte counts, the stage that stopped. The word is what a version page shows; the detail is what tells you which observation or which node it was.

Trials and administrative outcomes

ReasonMeaningNext step
FORFEITCandidate reached five cumulative strikes in a completed trialInspect timing and adapter failures, then retest
FAULT:<reason>Failed trial attributed to the candidate seatInvestigate the underlying model fault
UNPLAYABLETrial repair limit exhaustedCheck whether failures came from the model or infrastructure
RUNNER_UNAVAILABLENo runner could load the candidate for its trials, as many times as the repair limitNot your model. Submit the same files again
SEASON_CLOSEDWaiting candidate could not proceed after closureEnter an eligible later season
TIMED_OUTAdmission exhausted attempts without completing verificationNot your model. Check service availability before a new tagged submission

A queued match that is withdrawn carries its own word rather than a rejection: withdrawn_reason is SEASON_CLOSED when the season closed under it, ENGINE_RETIRED when the season’s engine moved, and names the successor when your own next version replaced you. A withdrawn match is not a loss and changes no rating — see the life of a version.

Platform-side retries

A storage failure, a node that cannot be reached, or a game whose registration is incomplete leaves a candidate testing while admission retries — and does not spend one of your three attempts. An eventual timeout does not establish that the neural network is invalid. The words in this class are PROBE_UNREACHABLE and ADMISSION_UNREACHABLE, which say a node could not be reached, and MANIFEST_INCOMPLETE and SEASON_RULES_INCOMPLETE, which are guards against the platform rejecting you for its own missing configuration and are meant never to reach you at all.

The table above is what the platform publishes, not the whole of what it can emit. A stage failure is worded by upper-casing the stage that stopped, so a word ending _FAILED that is not listed here is still a stage name rather than a blank — read the detail and report it.

ARTIFACT_MISSING and MANIFEST_MISSING are not in this class, although they look like it. An empty bucket is your submission’s state, not the platform’s, and no amount of retrying makes bytes appear.

A rejected candidate does not displace your active version. Once you understand the cause, submit the corrected files and their hashes as the next version. Preserve the failed version and trial IDs in any report; they identify the evidence the operator needs.