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 URIhttps://smeldr.dev/problems/<id>),id,class,ruleandvalues. A request withAccept: application/problem+jsongets an RFC 9457 problem+json body with the same members. - In Go,
smeldr.ProblemTypeOf(err)returns the id,smeldr.ProblemValuesOf(err)the values, andsmeldr.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:
personmeans a person meets it in a UI.developermeans a program called the API wrongly.operatormeans 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.
| Id | Status | Audience | Values | Rule | When | Retired |
|---|---|---|---|---|---|---|
ratify.automated_class | 403 | person | token_class, act, place | D142 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_role | 403 | person | role, operation | D142, D156 pt 3, T984 | An agent grantor grants a role that holds ratify or approve-change | |
grant.automated_holds_ratify | 403 | person | token_class, role | D142, T971 | A grant would give an agent/job token a role holding ratify | |
grant.automated_approve_change_not_area | 403 | person | token_class, role, suggested_role | D142, T971 | An agent/job token is granted approve-change by a role that is not an Area role anchored on an Area | |
grant.automated_needs_human_grantor | 403 | person | token_class, role, grantor_class | D142, T971 | An agent/job token's approval-role grant has no known grantor, or the grantor is not a human token | |
grant.grantor_lacks_area_authority | 403 | person | area, token_class | T971, D144 | The 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_grants | 403 | person | role | D156, T986 | A job token tries to grant any role | |
grant.item_approver_needs_human_grantor | 403 | person | role, grantor_class | D144 | An item-change-approver grant has no known grantor, or the grantor is not human | |
grant.check_has_no_approval_area | 403 | person | D144 | Delegating approval of a Check that has no Area requiring approval | ||
token.job_never_mints | 403 | person | D156, T986 | A job token tries to create a token | ||
token.agent_mints_automated_only | 403 | person | token_class | D142, T984 | An agent token tries to mint a human or unclassified token | |
token.identity_not_active | 403 | person | identity, state | D165 | Minting a token for an identity whose status is not active (e.g. retired) | |
token.identity_unclassified | 403 | person | identity | D165 | Minting a token for an identity with no class | |
transition.gate | 403 | person | type, from, to, operation | D34, D40 | The actor does not hold the operation a transition requires (or the check itself failed, fail closed) | |
transition.no_actor | 403 | person | from, to, operation | D34 | A strict gated transition is attempted with no actor in context | |
place.authority_required | 403 | person | act, operation, place | D145, D146 | Placing or moving a Decision/Area needs ratify over the place and the actor lacks it | |
place.no_actor | 403 | person | act, operation, place | D145, D146 | A place act needing authority runs with no actor known | |
decision.scope_role | 403 | person | scope, role | A Decision's scope maps to a required role the actor is not granted (or the grant lookup failed) | ||
decision.sources_need_place | 403 | person | decision | D148 | Changing a Decision's sources when it has no place to hold ratify over | |
change_check.core_only | 403 | person | D143 | A caller tries to create or move a ChangeCheck directly instead of via check_change / core | ||
change_check.not_deletable | 403 | person | D143 | A caller tries to delete a ChangeCheck | ||
change_check.no_caller | 403 | person | check_change is called with no caller | |||
change_check.answer_authority | 403 | person | area, role | D144, T884 | Answering a Check for an Area without approve-change over it (or item-change-approver on the Check), or with no actor | |
signal.condition_system_only | 403 | person | signal_type | D115 | A caller creates a condition-kind Signal, or tries to resolve a condition | |
signal.answer_not_permitted | 403 | person | D115 | Answering/withdrawing a Signal without capability while governance is on and no capability context exists | ||
administrators.unauthenticated | 403 | person | Asking who administers without being authenticated | |||
subscription.no_caller | 403 | person | D116 | A subscription API is called with governance on and no caller/identity in context | ||
subscription.not_owner | 403 | person | D116 | Creating or changing a subscription owned by another token without administer | ||
subscription.webhook_needs_admin | 403 | person | D116 | A subscription asks for webhook delivery without administer | ||
subscription.seed_needs_admin | 403 | person | D116 | Seeding role subscriptions without administer | ||
capability.denied | 403 | person | AuthorizeCapability refuses: legacy floor not met, no user ID, capability not granted, or read scope does not reach the target type/item | |||
role.insufficient | 403 | person | An 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_readable | 403 | person | The token's read scope does not cover the requested type | |||
write.not_permitted | 403 | person | A Module create/update/delete fails its write-operation check (checkWriteOp) | |||
csrf.invalid | 403 | person | CSRF cookie missing/empty, or header does not match it | |||
auth.unauthenticated | 401 | person | An endpoint requires a valid bearer/session and none authenticates | |||
auth.token_invalid | 401 | person | A signed session token is malformed, has a bad HMAC, bad payload or is expired | |||
auth.upload_token_invalid | 401 | person | An upload token is malformed, has a bad HMAC or is expired | |||
auth.preview_token_invalid | 404 | person | A preview token is malformed, has a bad HMAC or is expired (answered as not found on purpose) | |||
token.last_admin | 409 | person | Revoking the last active admin token | |||
transition.not_permitted | 409 | person | type, from, to | The from-to transition is not in the type's flow | ||
transition.singleton_state | 409 | person | type, state | The type already has an item in a state that admits only one | ||
item.locked_state | 409 | person | type, record, state | Editing (or re-slugging) an item in a locked state | ||
slug.published_immutable | 409 | person | Changing the slug of a published item | |||
decision.place_missing | 409 | person | decision | D142 pt 4, T883, D83 | Ratifying a Decision that has no place | |
decision.place_exists | 409 | person | decision, kind, place | D142 | Placing a Decision that already has a place | |
decision.replacement_state | 409 | person | decision, replacement, state | T1054 | Replacing a Decision needs a ratified replacement, and the replaced Decision at ratified or pending-re-evaluation | |
places.domain_prefix_held | 409 | person | prefix | Setup of places while the runtime domain type still holds the DOM prefix | ||
change_check.area_comment_only | 409 | person | area, check, approval_mode | D144 | Answering for an Area whose mode is comment-only | |
signal.request_not_resolvable | 409 | person | signal_type | D115 | Resolving a request-kind Signal (it is answered or withdrawn) | |
signal.condition_not_answerable | 409 | person | signal_type | D115 | Answering or withdrawing a condition-kind Signal | |
subscription.default_fixed | 409 | person | D116 | Changing the filter of a default subscription | ||
subscription.default_undeletable | 409 | person | D116 | Deleting a default subscription | ||
migrate.duplicate_published_slugs | 409 | operator | table, slugs | The published-slug index cannot be made because slugs are published twice | ||
item.not_found | 404 | person | D110 (resolution order) | The record does not exist, or exists but is hidden from the caller's read scope (answered alike) | ||
route.not_found | 404 | person | No 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_found | 404 | person | relation | T1010 | The relation (or a relation end) does not exist or cannot be read | |
grant.not_found | 404 | person | grant | The grant ID does not exist | ||
premise.condition_not_found | 404 | person | signal | D149 | No readable premise-flagged condition by that name | |
redirect.gone | 410 | person | A redirect entry with no target (content removed) | |||
content_type.not_runtime | 400 | person | type | Redefining a type that was not defined at runtime | ||
slug.record_type_fixed | 400 | person | type | D110 | Setting the slug of a record type (its address is its identity) | |
subscription.owner_limit | 400 | person | limit | D116 | The owner already holds the maximum number of subscriptions | |
eventstream.too_many_streams | 429 | person | D116 | The token already holds the maximum number of open streams | ||
reference.write_once | 422 | person | record | D113 | Changing or clearing a write-once reference (amends, task_ref, other refs) | |
relation.pair_not_permitted | 422 | person | kind, source, target | D142 | The relation kind does not permit this source-target type pair | |
relation.to_itself | 422 | person | kind, record | T1054 | A relation names the same record as its source and its target | |
field.immutable | 422 | person | D110 | An update tries to change a server-assigned or flow-controlled field (address, address_no, status, other immutable keys) | ||
content_type.redefine_incompatible | 422 | person | from_type, to_type | A redefinition would remove/retype a field items hold, make one required, add a required field, or change url_prefix | ||
address.prefix_reserved | 422 | person | type, prefix | D110 | A type asks for a prefix other than the one reserved for it | |
address.prefix_fixed | 422 | person | type, prefix | D110 | Changing the prefix of a type that already has addresses | |
places_migrate.address_held | 422 | operator | type, record, holder_type, holder | A legacy place's address is already held by the compiled type |
Correction
Fix the input. A UI shows it at the field. 72 types.
| Id | Status | Audience | Values | Rule | When | Retired |
|---|---|---|---|---|---|---|
grant.item_approver_scope | 403 | person | role | D144 | An item-change-approver grant does not name exactly one ChangeCheck | |
plan.relations_core_owned | 403 | person | T1015 | A caller asserts a plan's belongs_to_area / checked_against relation by hand | ||
transition.unknown_target | 409 | person | type, to | The target state does not exist in the type's flow | ||
state.unknown_initial | 409 | person | type, state | A create names an initial status that is not a state in the registered flow | ||
slug.taken | 409 | person | slug, prefix, suggested_slug, type | The URL/slug is already published (same prefix, or a linked type sharing the URL space) | ||
slug.ambiguous | 409 | person | slug | A slug names more than one readable item | ||
change_check.use_answer_change_check | 409 | person | D144 | A Check's per-Area approval request is answered via answer_signal instead of answer_change_check | ||
change_check.area_not_touched | 409 | person | check, area | D144 | Answering for an Area the change does not touch | |
content_type.not_found | 404 | person | type | The named content type is not registered, or is not a content (web) type | ||
relation.kind_unknown | 404 | person | A relation call names a relation kind that is not registered | |||
place.not_found | 404 | person | place, area, decision | The named Organization/Domain/Area (or a place edge's Decision/Area) does not exist or is not readable | ||
identity.not_found | 404 | person | identity | D165 | The named identity does not exist (lookup, or minting a token for it) | |
role.not_found | 404 | person | role | The named role is not defined (get, or grant) | ||
request.malformed_body | 400 | person | The JSON body cannot be decoded, or does not fit the type's struct | |||
request.invalid_param | 400 | person | A query/argument is missing or out of range (time, level, limit, depth, anchor, direction, ids) | |||
content_type.define_failed | 400 | person | define_content_type over HTTP fails (cause logged, generic 400 returned) | |||
transition.status_required | 400 | person | The transition request body has no status | |||
transition.reason_required | 400 | person | from, to | A transition that requires a reason is sent without one | ||
type.not_registered | 400 | person | type | A transition/lookup names a type that is not registered | ||
capability.unknown | 400 | person | resource, verb | AuthorizeCapability is asked for a resource/verb pair that does not exist | ||
limit.paths_per_call | 400 | person | limit | More paths than a call accepts (check_change, decisions_for_paths, check_coverage) | ||
limit.rest_count_items | 400 | person | limit | More items than the stored rest-counts call accepts | ||
limit.findings | 400 | person | max | Findings limit outside 0..max | ||
subscription.item_limit | 400 | person | limit | D116 | A subscription filter names more items than allowed | |
subscription.role_defaults_need_band | 400 | person | D116 | Seeding role defaults without a band or Architect | ||
subscription.webhook_not_stream | 400 | person | record | D116 | Opening the stream on a subscription that delivers to a webhook | |
search.query_invalid | 400 | person | min, max, length, type | Search has no text or filter, text length out of bounds, negative limit/offset, or an unsearchable type | ||
change_check.filter_required | 400 | person | Listing Checks without a repository, Area or Decision filter | |||
approvers.place_required | 400 | person | approvers_of is called without naming a place | |||
eventstream.params_conflict | 400 | person | D116 | ?subscription= and ?channel= combined | ||
event_log.cursor_invalid | 400 | person | D117 | The cursor is not one this instance issued | ||
flow.standing_invalid | 400 | developer | flow, state, value, allowed | RegisterFlow with an illegal Standing tag | ||
references.signal_in_tx | 400 | developer | InsertSignal called inside a caller's transaction | |||
migrate.precondition | 400 | operator | table, value | D115, D116 | A migrate/backfill command lacks a database, table, relation store, or has bad mapping input | |
content.not_acceptable | 406 | person | The Accept header asks for a representation the route cannot give (no template, no markdown) | |||
request.too_large | 413 | person | The body exceeds the size limit | |||
rev.missing | 422 | person | record, write | T1010 | After the rev cutover, a write to a governance type (or a governance relation, change-check answer, premise confirmation) names no rev | |
rev.not_applicable | 422 | person | grantee | D165 | A grant names a rev for a grantee that is no identity | |
title.cutover | 422 | person | length, limit, type | D112, T274 | After 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_refused | 422 | person | signal_type, suggested_signal_type | D115 | After the signal event cutover, a history-kind signal_type is sent | |
signal.message_too_long | 422 | person | length, limit | D114 | After the Signal cutover, a message is over 500 characters | |
amendment.type_not_in_list | 422 | person | value, allowed | D112 | amendment_type is not one of the closed list | |
plan.repository_paths_required | 422 | person | T1015 | After cutover, a plan whose work ends in a commit is submitted without repository or paths | ||
schedule.needs_time | 422 | person | type, record | T1009 | Moving to scheduled without scheduled_at | |
grant.grantee_not_identity | 422 | person | grantee | D165 | A grant names a token_id that is not an identity | |
reference.addon_not_run | 422 | person | type | T881 | A reference field names an add-on type (Task/Goal/Run) on an instance that does not run the add-on | |
reference.not_found | 422 | person | value, type | D113, D104 | A reference field names no record the caller can read (guided refusal for Signal task_ref; Decision/Amendment for amends; scope pattern) | |
reference.subject_type_unknown | 422 | person | A Signal's subject_type names no registered content type | |||
ident.ambiguous | 422 | person | value, count, type | D110 | An identifier (old number, slug, address) matches more than one record | |
relation.kind_unknown_assert | 422 | person | kind | Assert names an unknown relation kind | ||
relation.edge_class_not_asserted | 422 | person | allowed | Assert is sent an edge_class other than asserted | ||
decision.sources_too_many | 422 | person | count, limit | D148 | A Decision carries more sources than the maximum | |
decision.source_duplicate | 422 | person | index | D148 | Two sources name the same repository, commit, path and anchor | |
address.prefix_single_letter | 422 | person | prefix, type | D110 | A non-core type asks for a single-letter prefix | |
address.prefix_taken | 422 | person | prefix, type | D110 | The prefix belongs to another type | |
address.prefix_unavailable | 422 | person | type | D110 | No prefix can be proposed (name too short, or every candidate taken) | |
address.prefix_web_content | 422 | person | D110 | A web-content type (url_prefix) is given an address prefix | ||
webhook.url_not_allowed | 422 | person | A webhook URL is not HTTPS, targets localhost/.local, cannot resolve, or resolves to a private IP | |||
config.invalid | 422 | person | value, min | T969 | ValidateConfig rejects a Config field | |
role.level_mismatch | 422 | developer | A role is registered twice with different levels | |||
validation.failed | 422 | person | Several fields failed validation; each field carries its own type | |||
field.required | 422 | person | A required value is empty | |||
field.too_long | 422 | person | limit | A string exceeds its length limit | ||
field.too_short | 422 | person | min | A string is under its minimum length | ||
field.out_of_range | 422 | person | min, max, value | A number is outside its allowed range (negative, zero, below/above bound, inconsistent count) | ||
field.too_many | 422 | person | limit | A list has more entries than allowed | ||
field.one_line | 422 | person | A value must be a single line | |||
field.invalid_format | 422 | person | value | The value does not match the required pattern or syntax | ||
field.not_in_list | 422 | person | allowed, value, schema_field | The value is not one of a closed list or a registered set | ||
field.type_mismatch | 422 | person | expected | A dynamic field's JSON value has the wrong type | ||
field.unknown | 422 | person | A dynamic item names a field the schema does not have | |||
schema.field_invalid | 422 | person | schema_field, value, field_type, type, limit | A 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.
| Id | Status | Audience | Values | Rule | When | Retired |
|---|---|---|---|---|---|---|
rev.conflict | 409 | person | type, record, rev_sent, rev_current | T1010 | A write names a rev the record no longer has (*RevConflictError; SQLRepo returns the bare sentinel) | |
relation.already_exists | 409 | person | relation | T1019, A628 | A first assert lost the race to another writer for the same live relation | |
relation.ended | 409 | person | relation, ended_at | Re-asserting by id a relation that has already ended | ||
relation.already_withdrawn | 409 | person | relation, ended_at | T1010 | Withdrawing a relation that already ended | |
relation.withdraw_failed | 409 | person | relation | T1010 | Withdrawing a relation whose row could not be updated (changed concurrently) | |
change_check.supersede_race | 409 | person | check | T918 | A Check kept changing while being superseded | |
change_check.not_awaiting | 409 | person | check, state | D144 | Answering a Check that is not awaiting approval | |
change_check.superseded | 409 | person | check | D144 | Answering an audit for a superseded Check | |
change_check.already_answered | 409 | person | area, check, verdict | D144 | The Area already answered this Check | |
change_check.answer_race | 409 | person | area, check | D144 | Another answer for the same Area landed at the same moment | |
premise.no_open_flag | 409 | person | decision | D149 | Confirming a premise that has no open premise-flagged condition | |
premise.already_confirmed | 409 | person | decision | D149 | The premise was already confirmed for its current state | |
premise.condition_not_open | 409 | person | signal, state | D149 | The named premise-flagged condition is no longer open | |
signal.not_open | 409 | person | state | D115 | Answering/withdrawing a Signal that is not open |
Failure
Outside the caller's reach. 9 types.
| Id | Status | Audience | Values | Rule | When | Retired |
|---|---|---|---|---|---|---|
grant.authority_unreadable | 403 | person | grantee, grantor, token_class, role, area | D142, T971 | A grant check fails closed because the grantee/grantor class, the anchor, or the grantor's authority/Areas cannot be read | |
transition.gate_unwired | 403 | person | from, to, operation | D142, T884 | A strict gated transition runs with no governance wired | |
feature.not_enabled | 404 | person | feature | Findings or provenance are not recorded on this instance | ||
addon.not_run | 400 | person | type | T881 | Reading/writing a Task/Goal/Run on an instance without the Orchestration add-on, or a type the instance keeps no records of | |
eventstream.no_subscriptions | 400 | person | D116 | ?subscription= on an instance that keeps no subscriptions | ||
event_log.not_enabled | 400 | person | D117 | ?after= or an event page is asked for on an instance without the event log | ||
rate.limited | 429 | person | The rate limiter refuses the request | |||
identity.schema_not_ready | 422 | operator | D165 | Minting a classified token before the token/identity columns exist | ||
amends.no_database | 422 | person | amends cannot be checked because no database is configured |