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

Docs

Error code reference

Every error Thadam surfaces — in logs, /status, quarantine rows, diagnostics — carries one ThadamError shape: a domain and a stable snake_case code written as domain.code, a human message (never payloads or secrets), a retry class, a severity, and structured context.

  • Retry classes: Transient (retry with capped, jittered backoff; component Degraded), Permanent (retrying cannot help; per-event errors become rejects), Fatal (component Failed, readiness false, capture continues within policy).
  • Severity defaults from the retry class: Warning, Error, Critical.
  • Codes are stable: never reused for a different meaning, only added. The thadam-core codes are snapshot-tested; the Iceberg codes are defined in thadam-iceberg.

Domains and codes

connector — sources and protocol connections

CodeMeaning
connector.connect_failedOpening the connection failed.
connector.disconnectedAn established connection dropped.
connector.protocolThe peer violated the protocol.
connector.timeoutA protocol operation timed out.
connector.session_lostThe broker lost the session, so unacknowledged messages were redelivered.
connector.stale_ackAn acknowledgement belonged to an older connection epoch and was dropped.
connector.message_too_largeA message exceeded the configured size limit.
connector.panicThe connector task panicked.
connector.cancelledThe operation was cancelled by shutdown.

decode — payload decoding

CodeMeaning
decode.invalid_payloadThe payload could not be parsed.
decode.invalid_utf8The payload is not valid UTF-8 where text is required.
decode.unsupported_encodingThe payload uses an encoding with no decoder.
decode.too_largeThe payload exceeds the size limit.
decode.depth_exceededThe payload nests deeper than the limit.
decode.invalid_timeA timestamp could not be parsed.
decode.schema_ref_missingThe message does not carry the schema reference the decoder needs.
decode.unknown_schemaThe referenced schema hash is not in the schema store.

schema — declared schemas and shapes

CodeMeaning
schema.type_mismatchA value does not match its declared field type.
schema.missing_fieldA required field is missing.
schema.shape_limitThe shape registry reached max_shapes.
schema.narrowingA conversion would narrow a type.
schema.unsupported_typeA declared type is not supported.
schema.invalid_shapeA shape definition is invalid.

transform — transform steps

CodeMeaning
transform.failedA transform step failed on an event.
transform.unknown_unitA unit conversion is not defined (unknown UCUM code or incompatible dimensions).
transform.eval_failedA filter predicate could not be evaluated.
transform.panicA transform step panicked.

quality — data-quality rules

CodeMeaning
quality.rejectedThe event failed a quality rule and was rejected.
quality.out_of_rangeA value is outside its declared range.

buffer — the capture WAL and disk budget

CodeMeaning
buffer.budget_exhaustedThe disk budget is exhausted.
buffer.corruptA frame or segment failed its checksum.
buffer.fsync_failedfsync failed; the segment can no longer be trusted.
buffer.incompatibleThe on-disk format is newer or otherwise unreadable (exit code 3).
buffer.ioA filesystem operation failed.
buffer.evictedData was evicted under drop_oldest.

sink — sinks and shipping

CodeMeaning
sink.write_failedWriting a batch failed.
sink.timeoutThe sink target did not answer in time.
sink.unavailableThe sink target is unavailable.
sink.rejectedThe sink rejected an event.
sink.recover_failedRecovery after a crash failed.
sink.ioA local I/O operation failed.
sink.non_monotonic_appendA segment sink was given a batch not after its previous one.
sink.object_key_collisionA create-if-absent conflict found an object with different content (epoch or node-id misconfiguration); the shipper refuses to overwrite. Fatal.
sink.iceberg_unsupported_typeA segment’s footer has a type Iceberg cannot represent, such as UInt64 under unsigned: native. Fatal.
sink.iceberg_schema_mismatchThe table’s current schema cannot accept the segment’s schema. Fatal.
sink.iceberg_commitA commit kept conflicting with another writer past the bounded retry; retried on a later tick. Transient.
sink.panicThe sink task panicked.

auth — authentication and authorization

CodeMeaning
auth.failedCredentials were rejected.
auth.expiredCredentials expired.
auth.forbiddenThe credentials lack permission.

config — configuration

CodeMeaning
config.invalidA configuration value is invalid (exit code 2).
config.missingA required configuration value is missing.
config.unknown_kindNo connector is registered for the configured kind.
config.incompatibleA configuration or data-directory version is not supported (exit code 3 on the data-directory path; also raised for a non-loopback admin bind without a token).
config.iceberg_table_missingThe Iceberg table does not exist and create_table is false. Fatal.

Where codes show up

  • thadam validate diagnostics: error[config.invalid]: … with path, line, and hint.
  • /status component last_error objects ({ "domain", "code", "message" }).
  • Quarantine rows (error_domain, error_code, reason) with the raw bytes retained.
  • Reject metrics: thadam_rejects_total{sink, domain} aggregates per domain — per-code detail stays in logs and quarantine to keep label cardinality bounded.