Skip to Content
ReferenceError taxonomy

Error taxonomy

Every failure in Canis is machine-readable and belongs to one of five layers. Nothing fails silently: a spec that can’t render never renders, and every refusal carries a code from this page.

1. Validator verdicts (validateSpec)

The single gate. Every spec — model-generated, hand-written, or loaded from storage — gets one of:

VerdictMeaningWhat to do
BUILDRenders. Carries the normalized spec plus advisory notes.Render / save it.
CLARIFYUnder-determined — carries questions for the end user.Ask, regenerate.
REJECTReferences data, operators, or blocks outside the contract/policy — carries structured errors (below).Show the errors; never render.

SpecValidationError codes

CodeFired whenKey fields
SpecShapeErrorJSON doesn’t match the Spec v1 schemapath
SpecVersionErrorspecVersion unsupportedfound, supported
BlockCountErrormore blocks than the capcount, max
UnknownBlockTypeErrortype absent from the registrytype, allowed
BlockTypeNotAllowedErrortype outside tenant policytype, allowed
FrameSizeErrorframe outside the block’s min/maxaxis, found, min, max
ConfigSchemaErrorblock config fails its schemapath
ConfigFieldReferenceErrorconfig names a field the entity lacksfield, allowed
UnknownEntityErrorbinding names an entity with no contractentity, allowed
EntityNotAllowedErrorentity outside tenant policyentity, allowed
ContractViolationErrorquery exceeds the entity’s capabilitiesentity, violation, field
LayoutOverlapErrortwo frames overlapblockIds
BindingShapeErrorquery shape ≠ what the block rendersexpected, derived
AliasReferenceErrorconfig references an undeclared aggregation aliasalias, declared
FilterTargetErrorFilterBar targets a bad siblingtarget, reason

ContractViolationError.violation is one of: unknown_field, not_filterable, op_not_allowed, not_sortable, not_groupable, aggregation_not_allowed, limit_exceeded.

2. Read-time degradation (renderer)

A saved spec can outlive its contract. Blocks degrade individually — one broken block never takes down the workspace. Each degradation fires onBlockDegraded once with a reason:

ReasonMeaning
unknown-typeno component registered for the block’s type
missing-contractbound entity has no contract in this provider
contract-driftsaved spec references data the contract no longer exposes
fetch-errorthe vendor fetch / executor failed at runtime
render-errorthe block component threw while rendering

3. Workspace Service (/v1) error bodies

All errors are { statusCode, code, message, ... }:

StatuscodeWhen
422spec_rejectedsave re-gated server-side → REJECT (carries errors)
422spec_needs_clarificationsave re-gated → CLARIFY (carries questions)
422contract_invalidcontract registration that reviveContract can’t enforce
429budget_exceededtenant generation budget exhausted
429rate_limitedper-user generation rate cap hit
404unknown/deleted resource, or existence hidden (no view access)
403viewable but the specific right is missing

Every refused save also lands on the audit trail as workspace.spec_rejected with the validator’s errors — the vendor dashboard’s “rejected capabilities” report reads exactly these.

4. canis CLI

Exit codes: 0 ok · 1 CI-gating result (broken workspaces / error findings) · 2 usage error.

Lint/probe finding codes: contract_load_failed, capability_unknown_field (errors); missing_entity_description, vague_entity_description, missing_field_description, vague_field_description, enum_value_undocumented (warnings); probes add server_sort_unimplemented, server_filter_unimplemented, probe_fetch_failed (errors), probe_insufficient_rows, probe_unverified_server_op (warnings).

5. Engine limits

ErrorMeaningFix
RowCapExceededErrorfetch returned more rows than maxClientRowsnarrow the query, raise the cap, or declare the op execution: "server"
SpecParseErrorparseSpec on malformed JSONfix the document; carries zod paths
ContractDefinitionErrordefineEntity given an impossible contractthrown at build time, on purpose
ContractRevivalErrorstored contract definition can’t be revivedre-register the contract
Last updated on