Documentation
Errors and refusals

Refusal types

Generated from core v1.189.3 by generator 0c423a7. Not edited by hand.

Every refusal and validation error a Smeldr server answers with carries a stable type: an id such as transition.gate that never changes when the English message does. A UI looks up its own text by the id. This page lists all 167 types, grouped by class.

  • Over HTTP, the JSON error carries type (the URI https://smeldr.dev/problems/<id>), id, class, rule and values. A request with Accept: application/problem+json gets an RFC 9457 problem+json body with the same members.
  • In Go, smeldr.ProblemTypeOf(err) returns the id, smeldr.ProblemValuesOf(err) the values, and smeldr.ProblemTypes() this list.
  • Values are named strings a UI can fill its own text with. A refusal sends only the values its message states, so write your text so that it still reads well when any one value is missing. A value in bold is sent by every refusal of the type. A 401, 403 or 404 without a reason sends no values at all.
  • Audience: person means a person meets it in a UI. developer means a program called the API wrongly. operator means a migration or setup command.
  • An id or a value name is never renamed or reused. A type that goes out of use is retired: it stays in the list with the version it was retired in.

Refusal

A rule says no. 72 types.

IdStatusAudienceValuesRuleWhenRetired
ratify.automated_class403persontoken_class, act, placeD142 pt 5, T884 (places path: D145, D146)An agent or job token tries a transition gated on ratify, or an act needing ratify over a place (placing/moving a Decision or Area)
grant.agent_grants_approval_role403personrole, operationD142, D156 pt 3, T984An agent grantor grants a role that holds ratify or approve-change
grant.automated_holds_ratify403persontoken_class, roleD142, T971A grant would give an agent/job token a role holding ratify
grant.automated_approve_change_not_area403persontoken_class, role, suggested_roleD142, T971An agent/job token is granted approve-change by a role that is not an Area role anchored on an Area
grant.automated_needs_human_grantor403persontoken_class, role, grantor_classD142, T971An agent/job token's approval-role grant has no known grantor, or the grantor is not a human token
grant.grantor_lacks_area_authority403personarea, token_classT971, D144The grantor holds no approve-change over the Area it tries to delegate (Area role, or item-change-approver for a Check's Area)
grant.job_never_grants403personroleD156, T986A job token tries to grant any role
grant.item_approver_needs_human_grantor403personrole, grantor_classD144An item-change-approver grant has no known grantor, or the grantor is not human
grant.check_has_no_approval_area403personD144Delegating approval of a Check that has no Area requiring approval
token.job_never_mints403personD156, T986A job token tries to create a token
token.agent_mints_automated_only403persontoken_classD142, T984An agent token tries to mint a human or unclassified token
token.identity_not_active403personidentity, stateD165Minting a token for an identity whose status is not active (e.g. retired)
token.identity_unclassified403personidentityD165Minting a token for an identity with no class
transition.gate403persontype, from, to, operationD34, D40The actor does not hold the operation a transition requires (or the check itself failed, fail closed)
transition.no_actor403personfrom, to, operationD34A strict gated transition is attempted with no actor in context
place.authority_required403personact, operation, placeD145, D146Placing or moving a Decision/Area needs ratify over the place and the actor lacks it
place.no_actor403personact, operation, placeD145, D146A place act needing authority runs with no actor known
decision.scope_role403personscope, roleA Decision's scope maps to a required role the actor is not granted (or the grant lookup failed)
decision.sources_need_place403persondecisionD148Changing a Decision's sources when it has no place to hold ratify over
change_check.core_only403personD143A caller tries to create or move a ChangeCheck directly instead of via check_change / core
change_check.not_deletable403personD143A caller tries to delete a ChangeCheck
change_check.no_caller403personcheck_change is called with no caller
change_check.answer_authority403personarea, roleD144, T884Answering a Check for an Area without approve-change over it (or item-change-approver on the Check), or with no actor
signal.condition_system_only403personsignal_typeD115A caller creates a condition-kind Signal, or tries to resolve a condition
signal.answer_not_permitted403personD115Answering/withdrawing a Signal without capability while governance is on and no capability context exists
administrators.unauthenticated403personAsking who administers without being authenticated
subscription.no_caller403personD116A subscription API is called with governance on and no caller/identity in context
subscription.not_owner403personD116Creating or changing a subscription owned by another token without administer
subscription.webhook_needs_admin403personD116A subscription asks for webhook delivery without administer
subscription.seed_needs_admin403personD116Seeding role subscriptions without administer
capability.denied403personAuthorizeCapability refuses: legacy floor not met, no user ID, capability not granted, or read scope does not reach the target type/item
role.insufficient403personAn HTTP endpoint's role floor is not met (Editor/Author/Admin), or an unauthenticated caller on an endpoint that answers 403 not 401
scope.type_not_readable403personThe token's read scope does not cover the requested type
write.not_permitted403personA Module create/update/delete fails its write-operation check (checkWriteOp)
csrf.invalid403personCSRF cookie missing/empty, or header does not match it
auth.unauthenticated401personAn endpoint requires a valid bearer/session and none authenticates
auth.token_invalid401personA signed session token is malformed, has a bad HMAC, bad payload or is expired
auth.upload_token_invalid401personAn upload token is malformed, has a bad HMAC or is expired
auth.preview_token_invalid404personA preview token is malformed, has a bad HMAC or is expired (answered as not found on purpose)
token.last_admin409personRevoking the last active admin token
transition.not_permitted409persontype, from, toThe from-to transition is not in the type's flow
transition.singleton_state409persontype, stateThe type already has an item in a state that admits only one
item.locked_state409persontype, record, stateEditing (or re-slugging) an item in a locked state
slug.published_immutable409personChanging the slug of a published item
decision.place_missing409persondecisionD142 pt 4, T883, D83Ratifying a Decision that has no place
decision.place_exists409persondecision, kind, placeD142Placing a Decision that already has a place
decision.replacement_state409persondecision, replacement, stateT1054Replacing a Decision needs a ratified replacement, and the replaced Decision at ratified or pending-re-evaluation
places.domain_prefix_held409personprefixSetup of places while the runtime domain type still holds the DOM prefix
change_check.area_comment_only409personarea, check, approval_modeD144Answering for an Area whose mode is comment-only
signal.request_not_resolvable409personsignal_typeD115Resolving a request-kind Signal (it is answered or withdrawn)
signal.condition_not_answerable409personsignal_typeD115Answering or withdrawing a condition-kind Signal
subscription.default_fixed409personD116Changing the filter of a default subscription
subscription.default_undeletable409personD116Deleting a default subscription
migrate.duplicate_published_slugs409operatortable, slugsThe published-slug index cannot be made because slugs are published twice
item.not_found404personD110 (resolution order)The record does not exist, or exists but is hidden from the caller's read scope (answered alike)
route.not_found404personNo page/route serves the path (aggregate, unknown dynamic type route, api-only module asked for HTML, unmatched redirect, missing sitemap, missing AI doc)
relation.not_found404personrelationT1010The relation (or a relation end) does not exist or cannot be read
grant.not_found404persongrantThe grant ID does not exist
premise.condition_not_found404personsignalD149No readable premise-flagged condition by that name
redirect.gone410personA redirect entry with no target (content removed)
content_type.not_runtime400persontypeRedefining a type that was not defined at runtime
slug.record_type_fixed400persontypeD110Setting the slug of a record type (its address is its identity)
subscription.owner_limit400personlimitD116The owner already holds the maximum number of subscriptions
eventstream.too_many_streams429personD116The token already holds the maximum number of open streams
reference.write_once422personrecordD113Changing or clearing a write-once reference (amends, task_ref, other refs)
relation.pair_not_permitted422personkind, source, targetD142The relation kind does not permit this source-target type pair
relation.to_itself422personkind, recordT1054A relation names the same record as its source and its target
field.immutable422personD110An update tries to change a server-assigned or flow-controlled field (address, address_no, status, other immutable keys)
content_type.redefine_incompatible422personfrom_type, to_typeA redefinition would remove/retype a field items hold, make one required, add a required field, or change url_prefix
address.prefix_reserved422persontype, prefixD110A type asks for a prefix other than the one reserved for it
address.prefix_fixed422persontype, prefixD110Changing the prefix of a type that already has addresses
places_migrate.address_held422operatortype, record, holder_type, holderA legacy place's address is already held by the compiled type

Correction

Fix the input. A UI shows it at the field. 72 types.

IdStatusAudienceValuesRuleWhenRetired
grant.item_approver_scope403personroleD144An item-change-approver grant does not name exactly one ChangeCheck
plan.relations_core_owned403personT1015A caller asserts a plan's belongs_to_area / checked_against relation by hand
transition.unknown_target409persontype, toThe target state does not exist in the type's flow
state.unknown_initial409persontype, stateA create names an initial status that is not a state in the registered flow
slug.taken409personslug, prefix, suggested_slug, typeThe URL/slug is already published (same prefix, or a linked type sharing the URL space)
slug.ambiguous409personslugA slug names more than one readable item
change_check.use_answer_change_check409personD144A Check's per-Area approval request is answered via answer_signal instead of answer_change_check
change_check.area_not_touched409personcheck, areaD144Answering for an Area the change does not touch
content_type.not_found404persontypeThe named content type is not registered, or is not a content (web) type
relation.kind_unknown404personA relation call names a relation kind that is not registered
place.not_found404personplace, area, decisionThe named Organization/Domain/Area (or a place edge's Decision/Area) does not exist or is not readable
identity.not_found404personidentityD165The named identity does not exist (lookup, or minting a token for it)
role.not_found404personroleThe named role is not defined (get, or grant)
request.malformed_body400personThe JSON body cannot be decoded, or does not fit the type's struct
request.invalid_param400personA query/argument is missing or out of range (time, level, limit, depth, anchor, direction, ids)
content_type.define_failed400persondefine_content_type over HTTP fails (cause logged, generic 400 returned)
transition.status_required400personThe transition request body has no status
transition.reason_required400personfrom, toA transition that requires a reason is sent without one
type.not_registered400persontypeA transition/lookup names a type that is not registered
capability.unknown400personresource, verbAuthorizeCapability is asked for a resource/verb pair that does not exist
limit.paths_per_call400personlimitMore paths than a call accepts (check_change, decisions_for_paths, check_coverage)
limit.rest_count_items400personlimitMore items than the stored rest-counts call accepts
limit.findings400personmaxFindings limit outside 0..max
subscription.item_limit400personlimitD116A subscription filter names more items than allowed
subscription.role_defaults_need_band400personD116Seeding role defaults without a band or Architect
subscription.webhook_not_stream400personrecordD116Opening the stream on a subscription that delivers to a webhook
search.query_invalid400personmin, max, length, typeSearch has no text or filter, text length out of bounds, negative limit/offset, or an unsearchable type
change_check.filter_required400personListing Checks without a repository, Area or Decision filter
approvers.place_required400personapprovers_of is called without naming a place
eventstream.params_conflict400personD116?subscription= and ?channel= combined
event_log.cursor_invalid400personD117The cursor is not one this instance issued
flow.standing_invalid400developerflow, state, value, allowedRegisterFlow with an illegal Standing tag
references.signal_in_tx400developerInsertSignal called inside a caller's transaction
migrate.precondition400operatortable, valueD115, D116A migrate/backfill command lacks a database, table, relation store, or has bad mapping input
content.not_acceptable406personThe Accept header asks for a representation the route cannot give (no template, no markdown)
request.too_large413personThe body exceeds the size limit
rev.missing422personrecord, writeT1010After the rev cutover, a write to a governance type (or a governance relation, change-check answer, premise confirmation) names no rev
rev.not_applicable422persongranteeD165A grant names a rev for a grantee that is no identity
title.cutover422personlength, limit, typeD112, T274After the title cut, a create/update lacks a title or has one over 120 chars (codes title_missing / title_too_long), or a dynamic field exceeds max_length (field_too_long)
signal.history_type_refused422personsignal_type, suggested_signal_typeD115After the signal event cutover, a history-kind signal_type is sent
signal.message_too_long422personlength, limitD114After the Signal cutover, a message is over 500 characters
amendment.type_not_in_list422personvalue, allowedD112amendment_type is not one of the closed list
plan.repository_paths_required422personT1015After cutover, a plan whose work ends in a commit is submitted without repository or paths
schedule.needs_time422persontype, recordT1009Moving to scheduled without scheduled_at
grant.grantee_not_identity422persongranteeD165A grant names a token_id that is not an identity
reference.addon_not_run422persontypeT881A reference field names an add-on type (Task/Goal/Run) on an instance that does not run the add-on
reference.not_found422personvalue, typeD113, D104A reference field names no record the caller can read (guided refusal for Signal task_ref; Decision/Amendment for amends; scope pattern)
reference.subject_type_unknown422personA Signal's subject_type names no registered content type
ident.ambiguous422personvalue, count, typeD110An identifier (old number, slug, address) matches more than one record
relation.kind_unknown_assert422personkindAssert names an unknown relation kind
relation.edge_class_not_asserted422personallowedAssert is sent an edge_class other than asserted
decision.sources_too_many422personcount, limitD148A Decision carries more sources than the maximum
decision.source_duplicate422personindexD148Two sources name the same repository, commit, path and anchor
address.prefix_single_letter422personprefix, typeD110A non-core type asks for a single-letter prefix
address.prefix_taken422personprefix, typeD110The prefix belongs to another type
address.prefix_unavailable422persontypeD110No prefix can be proposed (name too short, or every candidate taken)
address.prefix_web_content422personD110A web-content type (url_prefix) is given an address prefix
webhook.url_not_allowed422personA webhook URL is not HTTPS, targets localhost/.local, cannot resolve, or resolves to a private IP
config.invalid422personvalue, minT969ValidateConfig rejects a Config field
role.level_mismatch422developerA role is registered twice with different levels
validation.failed422personSeveral fields failed validation; each field carries its own type
field.required422personA required value is empty
field.too_long422personlimitA string exceeds its length limit
field.too_short422personminA string is under its minimum length
field.out_of_range422personmin, max, valueA number is outside its allowed range (negative, zero, below/above bound, inconsistent count)
field.too_many422personlimitA list has more entries than allowed
field.one_line422personA value must be a single line
field.invalid_format422personvalueThe value does not match the required pattern or syntax
field.not_in_list422personallowed, value, schema_fieldThe value is not one of a closed list or a registered set
field.type_mismatch422personexpectedA dynamic field's JSON value has the wrong type
field.unknown422personA dynamic item names a field the schema does not have
schema.field_invalid422personschema_field, value, field_type, type, limitA content type definition has an illegal field (reserved name, bad max_length, max_length on non-string, reference on non-string, title over the D112 limit)

Conflict

The record moved: read it again. 14 types.

IdStatusAudienceValuesRuleWhenRetired
rev.conflict409persontype, record, rev_sent, rev_currentT1010A write names a rev the record no longer has (*RevConflictError; SQLRepo returns the bare sentinel)
relation.already_exists409personrelationT1019, A628A first assert lost the race to another writer for the same live relation
relation.ended409personrelation, ended_atRe-asserting by id a relation that has already ended
relation.already_withdrawn409personrelation, ended_atT1010Withdrawing a relation that already ended
relation.withdraw_failed409personrelationT1010Withdrawing a relation whose row could not be updated (changed concurrently)
change_check.supersede_race409personcheckT918A Check kept changing while being superseded
change_check.not_awaiting409personcheck, stateD144Answering a Check that is not awaiting approval
change_check.superseded409personcheckD144Answering an audit for a superseded Check
change_check.already_answered409personarea, check, verdictD144The Area already answered this Check
change_check.answer_race409personarea, checkD144Another answer for the same Area landed at the same moment
premise.no_open_flag409persondecisionD149Confirming a premise that has no open premise-flagged condition
premise.already_confirmed409persondecisionD149The premise was already confirmed for its current state
premise.condition_not_open409personsignal, stateD149The named premise-flagged condition is no longer open
signal.not_open409personstateD115Answering/withdrawing a Signal that is not open

Failure

Outside the caller's reach. 9 types.

IdStatusAudienceValuesRuleWhenRetired
grant.authority_unreadable403persongrantee, grantor, token_class, role, areaD142, T971A grant check fails closed because the grantee/grantor class, the anchor, or the grantor's authority/Areas cannot be read
transition.gate_unwired403personfrom, to, operationD142, T884A strict gated transition runs with no governance wired
feature.not_enabled404personfeatureFindings or provenance are not recorded on this instance
addon.not_run400persontypeT881Reading/writing a Task/Goal/Run on an instance without the Orchestration add-on, or a type the instance keeps no records of
eventstream.no_subscriptions400personD116?subscription= on an instance that keeps no subscriptions
event_log.not_enabled400personD117?after= or an event page is asked for on an instance without the event log
rate.limited429personThe rate limiter refuses the request
identity.schema_not_ready422operatorD165Minting a classified token before the token/identity columns exist
amends.no_database422personamends cannot be checked because no database is configured

Verified against

Core v1.189.3