ObjectStackObjectStack

Error Code Ledger — API Protocol reference

Error-Code Ledger. Reference for ErrorCode, ProvenanceWaiver, StandardSynonymWaiver: every property with its type and default.

Error-Code Ledger (ADR-0112 D3).

The top-level error.code vocabulary is two-tier:

  1. Standard catalog — StandardErrorCode (errors.zod.ts): a small, closed set with platform-wide HTTP semantics. It does NOT grow when a service invents a code.
  2. Registered extension codes — THIS ledger: every service-specific code a route may put in error.code, registered under its owning package.

ErrorCode (exported below) is the union, and is what ApiErrorSchema.code validates against. An unregistered code fails schema parse — which fails the envelope conformance suites — which fails CI. That friction is the point (ADR-0112: "no silent fourth state" for error codes, per ADR-0049/0078).

Scope: THIS ledger registers framework packages only (#4805)

Every owner key below is a package published from this repository, and that is a RULE — not an accident of the current list, and not something a reader should have to infer by scanning the package names. A downstream product repo (objectstack-ai/cloud, or any product built on the platform) does not register its codes here. It maintains its OWN ledger, in its own repo, and composes the validation itself:

  1. shape — envelopeViolations(body) (contract.zod.ts), and
  2. vocabulary — code ∈ StandardErrorCode ∪ <its own ledger>, which makeApiErrorSchema(<its own ledger>) (contract.zod.ts) gives as a single parse instead of the two-step assertion.

The deployed wire vocabulary stays closed and checkable either way — which is what ADR-0112's "no silent fourth state" asks for. It never asked for every entry to live physically in one file.

Why federated rather than admitting downstream entries (maintainer ruling on #4805, 2026-08-03, re-confirmed 2026-08-09; raised from cloud#930/#944):

  • A commercial vocabulary does not belong in an Apache-2.0 spec. The codes worth registering are precisely the product-specific ones (billing and plan-gating states, control-plane provisioning refusals), and registering them here would have the OSS spec enumerate a closed-source product's states under package names absent from this distribution.
  • Cadence mismatch breeds bypass. A downstream code arrives with a downstream feature; making each one cost a cross-repo PR plus a pin bump pushes authors toward reusing a semantically wrong existing code, which is less visible than inventing one.

The corollary for THIS file: a PR adding an owner key for a package that is not published from this repository is out of scope by construction — the fix for that need is a ledger in the owning repo, composed as above. The one thing a downstream repo must NOT do is emit a code registered nowhere: that is the silent fourth state, wherever the ledger lives.

Registering a new code

Add it to your package's entry (create the entry if your package has none — a framework package; see the scope rule above if yours ships from another repo), SCREAMING_SNAKE (^[A-Z][A-Z0-9_]*$ — lint-enforced by error-code-ledger.test.ts), with a trailing // comment when the name alone doesn't carry the meaning. Prefer a domain prefix for anything not self-evidently global (ATTACHMENT_*, APPROVAL_*, SETTINGS_*). If the condition is generic (not found / permission / validation / rate limit), use the standard catalog instead of registering a synonym.

Since #8211 (adjudicated 2026-08-12, option C) that last sentence is MECHANICAL, not prose: the admission gate (error-code-ledger.test.ts) refuses a new code that standardSynonymOf maps to a standard-catalog member, unless the code carries a STANDARD_SYNONYM_WAIVERS entry recording why it stays and which member it shadows. Four synonyms had accumulated by the time the rule got teeth precisely because nothing was checking; they (plus a fifth the detector surfaced on landing) are grandfathered via waivers below — their wire values are unchanged, and consolidating any of them onto its standard member is a deliberate wire change DEFERRED by the #8211 adjudication (option B) until a specific code has a measured victim.

One rule, two doors (#8087, completed by #9106): registration here is the ADMISSION door — what the vocabulary may contain. The DISPATCHER door is gated (#8087, option B-as-a-gate, maintainer 2026-08-12: check:dispatcher-error-vocabulary sweeps its producers) and, since the #9106 ruling (maintainer 2026-08-16), NARROWS exactly as the REST door always has: resolveThrownHttpError (@objectstack/types) answers code (a member of this union) for error.code at BOTH doors, and a producer's unregistered spelling is demoted to the wire's declaredCode — the open, author-authored channel ApiErrorSchema declares for it. Both doors state the same rule: a code either IS the standard member for its condition, or it is registered here — and if it merely re-spells a standard member, that registration is a recorded waiver, never drift. A code registered NOWHERE (a tenant app's own spelling) still reaches the wire, in declaredCode.

Door or no door — every code that ships in dist is registered (#16404)

Ruled by the director seat (decision batch #62, 2026-09-07, option D; maintainer 「同意」): the published contract face for error codes is THIS ledger together with StandardErrorCode. Any code that ships in a package's dist is registered here whether or not an HTTP door can ever answer with it — a thrown value's code is what a consumer's catch (e) { switch (e.code) } pins, and once shipped it cannot be renamed without breaking that consumer. Registering a code widens this face and is therefore a Clause-② change, door or no door; a code present in dist and absent here is a protocol gap, not a tier question.

ONE shape, no second list: a door: 'none' code is a row like any other — the string under the package that stamps it, and a comment that states its status and the reachability reading ("no HTTP door on this tree; the thrown value is the boundary"). Until commit 44c917a47 the dispatcher vocabulary (packages/runtime/src/dispatcher-error-vocabulary.ts) carried a boot-refusal verdict that recorded that same reachability for the codes NOT yet registered; it is RETIRED, because the gate below now refuses it — and every verdict like it — under any published package's src/. The one verdict that still parks a site there is pending-registration, and only outside packages/spec/src/**, under the dated allowance spelled out below. So a door: 'none' code has no resting place short of a row here, and the ratchet is the one pending-registration already had: a row here makes the site vanish from that scan. What registration changes for such a code is the face, not the wire: nothing demotes today, and if a door ever does answer with it, error.code carries the specific code instead of the status-derived member plus declaredCode. The declaredCode demotion (#9106) stays for genuinely unknown / third-party spellings only.

EVERY published package's src/** is held to this mechanically — commit 44c917a47 widened the rule from packages/spec/src/** alone, which is all #16449 could afford to measure. check:dispatcher-error-vocabulary refuses to classify a stamp site under one as anything but foreign-vocabulary (a different vocabulary that merely spells itself code) or runtime-pinned, and the only way out is the row here. Under packages/spec/src/** that is the whole rule, so a pending-registration row for a spec site is a finding (spec-face-unregistered); outside it, a pending-registration row keeps a named, dated allowance owed to #8846 and any OTHER verdict is a finding (published-face-unregistered).

A code emitted by several packages is listed once per emitting package — the union dedupes; the per-package rows are provenance, not identity.

Since #13353 that sentence has a mechanical half: the provenance gate (check:error-code-provenance, packages/spec/scripts/) sweeps every stamp site of a REGISTERED code in packages/** non-test source and fails when the stamping package's own owner key does not list it. The admission rules below never ask WHO emits, so before that gate an unlisted emitter was invisible to every gate the repo has (three hand sweeps found the same class three times: #7504, #13254, #13353). Two deliberate shapes are NOT rows and are recorded in PROVENANCE_WAIVERS instead: a DOOR in another package that names the wire vocabulary itself (FLOW_DISABLED, UPDATE_ID_MISMATCH — see their rows' comments), and a shared constructor package whose throw is served under another package's registration.

Retiring a code

A row whose last EMITTER is deleted comes out with it. The admission rules below check casing, duplication and shadowing — never whether anyone still throws the code — so a registered-but-unemittable row stays green forever while promising a client a code no response can carry. That is ADR-0112's "no silent fourth state" read backwards, and it is not hypothetical: OVERLAY_PERSISTENCE_FAILED outlived its only producer by one PR (#5264 deleted saveMetaItem's legacy raw-engine branch; #5783 unregistered the code). Nor does a row need to LOSE its producer to be in this class — a throw site whose error can never reach a response envelope was unemittable from birth: MONGODB_MULTI_TENANT_UNSUPPORTED (registered by #3724, unregistered by #8035) is a BOOT refusal — the CLI rethrows it pre-HTTP and aborts, and the one request-reachable trigger sits inside a documented best-effort catch that logs and continues. Its throw site and constant (MULTI_TENANT_UNSUPPORTED_CODE, @objectstack/driver-mongodb) live on: host boot matching is not wire vocabulary. ⚠️ That SECOND ground is superseded by #16404 ("Door or no door" above): a boot refusal that ships in dist is owed a row, so the codes left out or retired on the "not wire vocabulary" reasoning were registrations owed under the ruling, not re-argued per card — #16449 registered the nine measured on its tree, and commit 613bfbd3d the fourteen boot-refusal rows dispatcher-error-vocabulary.ts still carried, among them MONGODB_MULTI_TENANT_UNSUPPORTED itself, back under @objectstack/driver-mongodb with the #8035 removal reversed on the record. What still retires a row is the FIRST ground only: no producer left anywhere in packages/** source. Before deleting a row, check that no producer remains repo-wide AND that no consumer — including objectui and cloud — reads the literal; tests that merely CONSTRUCT the code are not producers, and a test pinned to a producerless code is pinning nothing (#4984's phantom-check family).

Field-level codes (FieldErrorSchema.code, the fields[] array) are a SEPARATE vocabulary and do not belong here — see #3977 (ADR-0112 D6).

Source: packages/spec/src/api/error-code-ledger.zod.ts

TypeScript Usage

import { ErrorCode, ProvenanceWaiverSchema, StandardSynonymWaiverSchema } from '@objectstack/spec/api';
import type { ErrorCode, ProvenanceWaiver, StandardSynonymWaiver } from '@objectstack/spec/api';

// Validate data
const result = ErrorCode.parse(data);

ErrorCode

Allowed Values

  • VALIDATION_ERROR
  • INVALID_FIELD
  • MISSING_REQUIRED_FIELD
  • INVALID_FORMAT
  • VALUE_TOO_LONG
  • VALUE_TOO_SHORT
  • VALUE_OUT_OF_RANGE
  • INVALID_REFERENCE
  • DUPLICATE_VALUE
  • INVALID_QUERY
  • INVALID_FILTER
  • INVALID_SORT
  • MAX_RECORDS_EXCEEDED
  • UNAUTHENTICATED
  • INVALID_CREDENTIALS
  • EXPIRED_TOKEN
  • INVALID_TOKEN
  • SESSION_EXPIRED
  • MFA_REQUIRED
  • EMAIL_NOT_VERIFIED
  • PERMISSION_DENIED
  • INSUFFICIENT_PRIVILEGES
  • FIELD_NOT_ACCESSIBLE
  • RECORD_NOT_ACCESSIBLE
  • LICENSE_REQUIRED
  • IP_RESTRICTED
  • TIME_RESTRICTED
  • RESOURCE_NOT_FOUND
  • OBJECT_NOT_FOUND
  • RECORD_NOT_FOUND
  • FIELD_NOT_FOUND
  • ENDPOINT_NOT_FOUND
  • RESOURCE_CONFLICT
  • CONCURRENT_MODIFICATION
  • DELETE_RESTRICTED
  • DUPLICATE_RECORD
  • LOCK_CONFLICT
  • METHOD_NOT_ALLOWED
  • PRECONDITION_REQUIRED
  • RATE_LIMIT_EXCEEDED
  • QUOTA_EXCEEDED
  • INTERNAL_ERROR
  • DATABASE_ERROR
  • TIMEOUT
  • SERVICE_UNAVAILABLE
  • NOT_IMPLEMENTED
  • EXTERNAL_SERVICE_ERROR
  • INTEGRATION_ERROR
  • WEBHOOK_DELIVERY_FAILED
  • ACCOUNT_LOCKED
  • ACTION_CONFIRMATION_REQUIRED
  • ACTION_DISABLED
  • ALREADY_REVERTED
  • AMBIGUOUS_MATCH
  • ANALYTICS_DATE_RANGE_UNRECOGNIZED
  • ANALYTICS_QUERY_FAILED
  • APPROVAL_ACTIONS_FAILED
  • APPROVAL_APPROVE_FAILED
  • APPROVAL_COMMENT_FAILED
  • APPROVAL_REASSIGN_FAILED
  • APPROVAL_RECALL_FAILED
  • APPROVAL_REJECT_FAILED
  • APPROVAL_REMIND_FAILED
  • APPROVAL_REQUEST_GET_FAILED
  • APPROVAL_REQUEST_INFO_FAILED
  • APPROVAL_REQUEST_LIST_FAILED
  • APPROVAL_RESUBMIT_FAILED
  • APPROVAL_REVISE_FAILED
  • ASYNC_NOT_SUPPORTED
  • ATTACHMENT_DELETE_DENIED
  • ATTACHMENT_DOWNLOAD_DENIED
  • ATTACHMENT_PARENT_ACCESS
  • AUDIENCE_NOT_ALLOWED
  • AUDIT_TYPE_NOT_CANONICAL
  • AUTH_CONFIG_ERROR
  • AUTH_REQUIRED
  • AUTOMATION_UNSCOPED_RUN_DATA_ACCESS
  • BATCH_ABORTED
  • BATCH_NOT_ATOMIC
  • BATCH_TOO_LARGE
  • BATCH_UNRESOLVED_REF
  • BLANK_MATCH_KEY
  • CLONE_DISABLED
  • CLOUD_FETCH_FAILED
  • CLOUD_UNCONFIGURED
  • COMMIT_NOT_FOUND
  • CONCURRENT_UPDATE
  • CONFLICT
  • CONFLICTING_MAPPING
  • CONNECTOR_UPSTREAM_UNAVAILABLE
  • CREATE_FAILED
  • CUBE_NOT_FOUND
  • DATASET_INVALID
  • DATASOURCE_ADMIN_ERROR
  • DELEGABLE_SCOPE_FAILED
  • DELETE_HOOK_RESULT_NOT_WRITE_SHAPE
  • DELIVERY_NEVER_SENT
  • DELIVERY_NOT_ELIGIBLE
  • DESTRUCTIVE_CHANGE
  • DEVICE_CODE_FAILED
  • DOMAIN_VERIFICATION_DISABLED
  • DOMAIN_VERIFICATION_FAILED
  • DRIVER_UNAVAILABLE
  • DUPLICATE_ARTIFACT_OBJECT_NAME
  • DUPLICATE_ARTIFACT_PACKAGE
  • DUPLICATE_REQUEST
  • DUPLICATE_SOURCE_NOT_A_BASE
  • ELIGIBILITY_UNEVALUABLE
  • EMAIL_DOMAIN_NOT_ALLOWED
  • EMAIL_SEND_FAILED
  • EMAIL_SERVICE_REQUIRED
  • ENQUEUE_FAILED
  • ENVIRONMENT_BIND_FAILED
  • ENVIRONMENT_NOT_FOUND
  • ENV_ACCESS_DENIED
  • ERR_AUTONUMBER_COLLISION
  • ERR_BULK_RESULT_MISMATCH
  • ERR_CROSS_DATASOURCE_TRANSACTION_WRITE
  • ERR_DATASOURCE_UNAVAILABLE
  • ERR_DRIVER_CONNECT
  • ERR_FILE_CONSTRAINT
  • ERR_FILE_REFERENCE_COPY
  • ERR_HOOK_TARGET_REBIND
  • ERR_READONLY_FIELD_REJECTED
  • ERR_SUMMARY_RECOMPUTE
  • ERR_SYSTEM_WRITE_ORGANIZATION_REQUIRED
  • ERR_TRANSACTION_UNSUPPORTED
  • EXECUTION_ERROR
  • EXPIRED_OR_REVOKED
  • EXPIRY_IN_PAST
  • EXPIRY_TOO_LONG
  • EXPLAIN_FAILED
  • EXPORT_NOT_PERMITTED
  • EXTERNAL_DATASOURCE_ERROR
  • EXTERNAL_IMPORT_ERROR
  • EXTERNAL_SCHEMA_MISMATCH
  • EXTERNAL_SCHEMA_MODE_VIOLATION
  • EXTERNAL_WRITE_FORBIDDEN
  • FEEDS_DISABLED
  • FIELD_VISIBILITY_UNRESOLVED
  • FILES_DISABLED
  • FILE_DOWNLOAD_DENIED
  • FILE_FIELD_BULK_WRITE_REFUSED
  • FILE_NOT_FOUND
  • FILTER_TOKEN_UNKNOWN
  • FILTER_TOKEN_UNRESOLVED
  • FIND_HOOK_RESULT_NOT_ARRAY
  • FIND_ONE_HOOK_RESULT_NOT_RECORD
  • FLOW_CONVERSION_CONFLICT
  • FLOW_DISABLED
  • FLOW_FAILED
  • FLOW_INPUT_SCHEMA_INVALID
  • FLOW_NO_START_NODE
  • FORBIDDEN
  • FORM_NOT_FOUND
  • FORM_RESOLVE_FAILED
  • HOOK_UNSCOPED_DATA_ACCESS
  • IMPORT_JOB_CREATE_FAILED
  • IMPORT_ROW_FAILED
  • INTERNAL
  • INVALID_ARTIFACT_PACKAGES
  • INVALID_ARTIFACT_PACKAGE_ENTRY
  • INVALID_EMAIL
  • INVALID_EXPIRY
  • INVALID_METADATA
  • INVALID_OR_EXPIRED
  • INVALID_PHONE
  • INVALID_REQUEST
  • INVALID_RESUME_TOKEN
  • INVALID_SCREEN_INPUT
  • INVALID_SIGNAL
  • INVALID_SIGNATURE
  • INVALID_STATE
  • INVITE_EMAIL_FAILED
  • INVITE_REQUIRES_EMAIL
  • INVITE_SMS_FAILED
  • IP_NOT_ALLOWED
  • ITEM_LOCKED
  • LAST_LOCAL_CREDENTIAL
  • MANIFEST_CONFLICT
  • MAPPING_FORMAT_MISMATCH
  • MAPPING_FORMAT_UNSUPPORTED
  • MAPPING_NOT_FOUND
  • MAPPING_TARGET_MISMATCH
  • MARKETPLACE_PROXY_FAILED
  • MARKETPLACE_STORAGE_FAILED
  • MARKETPLACE_UNAVAILABLE
  • MEMORY_MULTI_TENANT_UNSUPPORTED
  • METADATA_BRANCH
  • METADATA_CONFLICT
  • METADATA_NOT_FOUND
  • METADATA_SCHEMA_INVALID
  • MIXED_ARTIFACT_COLLECTION_SHAPE
  • MONGODB_MULTI_TENANT_UNSUPPORTED
  • MULTI_UPDATE_HOOK_KEY_DIVERGENCE
  • NAMESPACE_CONFLICT
  • NAMESPACE_PREFIX
  • NEEDS_PASSWORD
  • NODE_FAILURE
  • NOTHING_TO_PURGE
  • NOT_ATTEMPTED
  • NOT_COMPENSABLE
  • NOT_CREATABLE
  • NOT_FOUND
  • NOT_OVERRIDABLE
  • NOT_UNDOABLE
  • NO_DRAFT
  • NO_EXECUTOR
  • NO_IDENTITY
  • NO_MATCH
  • NO_PENDING_VERIFICATION
  • NO_SUCH_RUN
  • OAUTH_REGISTER_FAILED
  • OBJECT_API_DISABLED
  • OBJECT_API_METHOD_NOT_ALLOWED
  • OBJECT_OVERLAY_PACKAGE_MISMATCH
  • OBJECT_OWNERSHIP_CONFLICT
  • OBJECT_PACKAGE_DISABLED
  • OPENAPI_UNAVAILABLE
  • OS_PROTOCOL_INCOMPATIBLE
  • PACKAGE_DELETE_FAILED
  • PACKAGE_DELETE_PARTIAL
  • PACKAGE_MANIFEST_INVALID
  • PACKAGE_PUBLISH_FAILED
  • PASSWORD_ALREADY_SET
  • PASSWORD_EXPIRED
  • PASSWORD_POLICY_VIOLATION
  • PASSWORD_REUSE
  • PAYLOAD_TOO_LARGE
  • PERMISSION_NOT_ALLOWED
  • PHONE_NOT_ENABLED
  • PLAN_CHANGED
  • PLUGIN_CONTRACT_VIOLATION
  • PLUGIN_INSTALL_FAILED
  • PLUGIN_MANIFEST_INVALID
  • PLUGIN_REGISTER_FAILED
  • PLUGIN_UI_REQUIRED_KEY_MISSING
  • PREFLIGHT_FAILED
  • PROJECT_MEMBERSHIP_REQUIRED
  • PROJECT_NOT_FOUND
  • PROJECT_PROVISIONING
  • PROJECT_PROVISIONING_FAILED
  • QUERY_OBJECT_MISMATCH
  • RAW_SQL_UNSUPPORTED
  • READ_BACK_FAILED
  • READ_SCOPE_COMPILE_FAILED
  • RECORD_GONE
  • RECORD_LOCKED
  • RECORD_NOT_ELIGIBLE
  • REGISTRY_TYPE_NOT_CANONICAL
  • REQUEST_NOT_FOUND
  • RESEED_NO_ROWS
  • RESEED_SKIPPED
  • RESUME_FAILED
  • RESUME_IN_PROGRESS
  • RESUME_TARGET_LOST
  • ROLLED_BACK
  • ROUTE_NOT_FOUND
  • RULE_DEFINE_FAILED
  • RULE_DELETE_FAILED
  • RULE_EVALUATE_FAILED
  • RULE_GET_FAILED
  • RULE_LIST_FAILED
  • RULE_NOT_FOUND
  • RUN_NOT_FOUND
  • SAML_REGISTER_FAILED
  • SELF_REGISTRATION_CLOSED
  • SERVICE_NOT_REGISTERED
  • SETTINGS_ACTION_FAILED
  • SETTINGS_CRYPTO_UNAVAILABLE
  • SETTINGS_ENGINE_NOT_BOUND
  • SETTINGS_FORBIDDEN
  • SETTINGS_LOCKED
  • SETTINGS_UNKNOWN_KEY
  • SETTINGS_UNKNOWN_NAMESPACE
  • SETTINGS_VALIDATION
  • SHARES_LIST_FAILED
  • SHARE_GRANT_FAILED
  • SHARE_REVOKE_FAILED
  • SHARING_NOT_ENABLED
  • SIGN_IN_REQUIRED
  • SMS_SERVICE_REQUIRED
  • SQL_DIALECT_EMISSION_UNSUPPORTED
  • SSO_REGISTER_FAILED
  • SSO_REGISTER_FORBIDDEN
  • STACK_CAPABILITY_UNKNOWN
  • STACK_COMPOSE_ACTION_KEY_COLLISION
  • STACK_COMPOSE_COLLECTION_CONFLICT
  • STACK_COMPOSE_FUNCTIONS_SHAPE_CONFLICT
  • STACK_COMPOSE_FUNCTION_CONFLICT
  • STACK_COMPOSE_KEY_CONFLICT
  • STACK_COMPOSE_OBJECT_CONFLICT
  • STACK_CROSS_REFERENCE_INVALID
  • STACK_HIERARCHY_SCOPE_CAPABILITY_REQUIRED
  • STACK_NAMESPACE_PREFIX_INVALID
  • STACK_PROVENANCE_MISSING
  • STACK_SCHEMA_INVALID
  • STACK_SINGLE_APP_VIOLATION
  • STACK_TRIGGER_CAPABILITY_REQUIRED
  • STORED_TYPE_NOT_CANONICAL
  • STORE_UNAVAILABLE
  • SUGGESTION_CONFIRM_FAILED
  • SUGGESTION_DISMISS_FAILED
  • SUGGESTION_LIST_FAILED
  • SUGGESTION_NOT_FOUND
  • SUGGESTION_STATE
  • SUMMARY_RECOMPUTE_FAILED
  • TENANT_SCOPE_REQUIRED
  • THROTTLED
  • UNAUTHORIZED
  • UNIQUE_SCOPE_CONFIRMATION_REQUIRED
  • UNIQUE_VIOLATION
  • UNKNOWN_KEY
  • UNKNOWN_NAMESPACE
  • UNSUPPORTED
  • UNSUPPORTED_QUERY_PARAM
  • UNSUPPORTED_TRANSFORM
  • UPDATE_HOOK_RESULT_NOT_WRITE_SHAPE
  • UPDATE_ID_MISMATCH
  • UPLOAD_SESSION_EXPIRED
  • UPLOAD_SESSION_NOT_FOUND
  • USER_ALREADY_EXISTS
  • USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL
  • VALIDATION_FAILED
  • VERSION_NOT_FOUND
  • VERSION_NOT_RESTORABLE
  • WALLED_MEMBERSHIP_POLICY_UNDECLARED
  • WRITABLE_PACKAGE_REQUIRED
  • WRONG_PASSWORD

ProvenanceWaiver

Properties

PropertyTypeRequiredDescription
packagestring✅The package whose source stamps the code without an owner-key row
codestring✅The registered code the package stamps
registeredUnderstring✅The owner key that deliberately carries the row instead
reasonstring✅Why the stamping package carries no row — recorded so provenance is a decision, not drift

StandardSynonymWaiver

Properties

PropertyTypeRequiredDescription
codestring✅The registered extension code the waiver keeps admissible
shadowsEnum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | 'INVALID_FORMAT' | 'VALUE_TOO_LONG' | 'VALUE_TOO_SHORT' | 'VALUE_OUT_OF_RANGE' | … +42 more>✅The standard-catalog member whose condition the code re-spells
reasonstring✅Why the synonym stays registered — recorded so admission is a decision, not drift

Allowed Values: StandardSynonymWaiver.shadows

  • VALIDATION_ERROR
  • INVALID_FIELD
  • MISSING_REQUIRED_FIELD
  • INVALID_FORMAT
  • VALUE_TOO_LONG
  • VALUE_TOO_SHORT
  • VALUE_OUT_OF_RANGE
  • INVALID_REFERENCE
  • DUPLICATE_VALUE
  • INVALID_QUERY
  • INVALID_FILTER
  • INVALID_SORT
  • MAX_RECORDS_EXCEEDED
  • UNAUTHENTICATED
  • INVALID_CREDENTIALS
  • EXPIRED_TOKEN
  • INVALID_TOKEN
  • SESSION_EXPIRED
  • MFA_REQUIRED
  • EMAIL_NOT_VERIFIED
  • PERMISSION_DENIED
  • INSUFFICIENT_PRIVILEGES
  • FIELD_NOT_ACCESSIBLE
  • RECORD_NOT_ACCESSIBLE
  • LICENSE_REQUIRED
  • IP_RESTRICTED
  • TIME_RESTRICTED
  • RESOURCE_NOT_FOUND
  • OBJECT_NOT_FOUND
  • RECORD_NOT_FOUND
  • FIELD_NOT_FOUND
  • ENDPOINT_NOT_FOUND
  • RESOURCE_CONFLICT
  • CONCURRENT_MODIFICATION
  • DELETE_RESTRICTED
  • DUPLICATE_RECORD
  • LOCK_CONFLICT
  • METHOD_NOT_ALLOWED
  • PRECONDITION_REQUIRED
  • RATE_LIMIT_EXCEEDED
  • QUOTA_EXCEEDED
  • INTERNAL_ERROR
  • DATABASE_ERROR
  • TIMEOUT
  • SERVICE_UNAVAILABLE
  • NOT_IMPLEMENTED
  • EXTERNAL_SERVICE_ERROR
  • INTEGRATION_ERROR
  • WEBHOOK_DELIVERY_FAILED

On this page