RIVET_CONFIG_NO_EXPORTS | usage | 1 | declare at least one export under exports: |
RIVET_CONFIG_CHUNK_COUNT_INVALID | usage | 1 | set chunk_count to 1 or more |
RIVET_CONFIG_CHUNK_BY_DAYS_INVALID | usage | 1 | set chunk_by_days to 1 or more |
RIVET_CONFIG_CHUNK_COLUMN_NOT_INTEGER | usage | 1 | use chunk_by_key: (keyset), an integer column, or mode: full |
RIVET_CONFIG_DUPLICATE_EXPORT | usage | 1 | give every export a unique name |
RIVET_CONFIG_CDC_RESOURCE_CONFLICT | usage | 1 | give each CDC export its own slot / server_id / checkpoint path |
RIVET_CONFIG_CDC_ROLLOVER_INVALID | usage | 1 | set cdc.rollover to 1 or more, or omit it |
RIVET_CONFIG_CDC_CONTINUOUS_UNSUPPORTED | usage | 1 | omit cdc.until_current (or --stream) and run the bounded drain on a schedule |
RIVET_CONFIG_CSV_LOAD_UNSUPPORTED | usage | 1 | use format: parquet for an export with a load: section |
RIVET_CONFIG_LOAD_PARTITION_UNSUPPORTED | usage | 1 | partition by a date or time column + granularity, and drop the options the target refuses |
RIVET_CONFIG_SOURCE_MODE_UNSUPPORTED | usage | 1 | use a mode this source supports (MongoDB: full) |
RIVET_CONFIG_SOURCE_URL_SCHEME_MISMATCH | usage | 1 | make source.type and the URL scheme name the same engine |
RIVET_CONFIG_KEYSET_KEY_UUID_OVERRIDE | usage | 1 | key the keyset on another unique column, or use mode: full for this table |
RIVET_CONFIG_CURSOR_COLUMN_CASE | usage | 1 | spell cursor_column exactly as the result set names the column |
RIVET_CONFIG_COLUMN_OVERRIDE_CASE | usage | 1 | spell the columns: key exactly as the result set names the column |
RIVET_CONFIG_FILE_UNREADABLE | environment | 2 if transient, else 1 | check the config path and its read permission, or run rivet init to generate one |
RIVET_CONFIG_YAML_INVALID | usage | 1 | fix the YAML syntax or the key the message names, moving it to where the message shows |
RIVET_CONFIG_SOURCE_CONNECTION_INVALID | usage | 1 | give source: exactly one connection method (url_env, url, url_file, url_secret or complete host/user/database fields) and one password setting |
RIVET_CONFIG_SECRET_UNSET | environment | 2 if transient, else 1 | export the environment variable (or pass the --param) the message names, or make the named file readable |
RIVET_CONFIG_GCP_SECRET_UNREADABLE | environment | 2 if transient, else 1 | grant the credential rivet runs as roles/secretmanager.secretAccessor on the secret the message names, and check its project, name and version |
RIVET_CONFIG_EXPORT_SOURCE_INVALID | usage | 1 | give the export exactly one of query, query_file (a relative path inside the config directory), table (<name> or <schema>.<name>) or tables |
RIVET_CONFIG_MODE_SETTING_INVALID | usage | 1 | add the setting the export’s mode requires, or remove the setting the mode does not take, as the message names |
RIVET_CONFIG_DESTINATION_AUTH_INVALID | usage | 1 | configure one complete auth mode for the destination (keys, a credentials file, or allow_anonymous) and drop the others |
RIVET_CONFIG_DESTINATION_ENDPOINT_UNSAFE | usage | 1 | drop endpoint: to use the provider default, or point it at a loopback emulator with allow_anonymous: true |
RIVET_CONFIG_VALUE_OUT_OF_RANGE | usage | 1 | set the value in the range or form the message names, and set only one of two mutually exclusive sizing knobs |
RIVET_CONFIG_CDC_SHAPE_INVALID | usage | 1 | list each captured table once, in a shape this source and destination take, with at most one baseline per table |
RIVET_CONFIG_CSV_COMPRESSION_UNSUPPORTED | usage | 1 | use format: parquet for compression, or set compression: none / compression_profile: none |
RIVET_CONFIG_TLS_VERIFICATION_DOWNGRADE | usage | 1 | drop the danger knob and trust a private CA with tls.ca_file, or omit the explicit mode: for a loopback dev container |
RIVET_CONFIG_LOAD_BLOCK_INVALID | usage | 1 | declare the warehouse in a top-level load: block and override only what the export and target take |
RIVET_CONFIG_PATH_UNSAFE | usage | 1 | use a plain name and a bucket-relative path: no /, \, .., NUL, leading . or URI scheme |
RIVET_CONFIG_ROW_HASH_INVALID | usage | 1 | list each column of one table once under meta_columns.row_hash, or use row_hash: true |
RIVET_CONFIG_COLUMN_OVERRIDE_TABLE_UNKNOWN | usage | 1 | use a bare column key, or qualify it with a table this export captures |
RIVET_TYPE_UNSAFE_MAPPING | usage | 1 | add a columns: override the engine delivers exactly, CAST or drop the column in the export’s query:, or run without --strict to accept it with a warning |
RIVET_SOURCE_STATEMENT_TIMEOUT | environment | 2 if transient, else 1 | raise tuning.statement_timeout_s, or narrow the chunk |
RIVET_SOURCE_CURSOR_FINER_THAN_MICROSECOND | refusal | 5 | cursor on a column at microsecond precision or coarser, or cast the cursor to TIMESTAMP(6) in a curated query |
RIVET_SOURCE_CDC_FOREIGN_CHECKPOINT | refusal | 5 | re-baseline the stream: delete the checkpoint, empty the export’s destination, clear its cdc_snapshot rows, give it cdc.initial: snapshot, then re-run |
RIVET_SOURCE_CDC_CHECKPOINT_SHARED | refusal | 5 | give the export a cdc.checkpoint of its own and keep the shared file, the other export’s position; with cdc.initial: snapshot its first run re-reads every table |
RIVET_SOURCE_CDC_CHECKPOINT_INVALID | refusal | 5 | restore the checkpoint file, or re-baseline the stream: delete it, empty the export’s destination, clear its cdc_snapshot rows, give it cdc.initial: snapshot, then re-run |
RIVET_SOURCE_CDC_LOG_GAP | refusal | 5 | restore the missing log, or re-baseline the stream: delete the checkpoint, empty the export’s destination, clear its cdc_snapshot rows, give it cdc.initial: snapshot, then re-run |
RIVET_SOURCE_CDC_TRUNCATED | refusal | 5 | re-baseline the stream: delete the checkpoint (PostgreSQL: first advance the slot past the truncate), empty the export’s destination, clear its cdc_snapshot rows, give it cdc.initial: snapshot, then re-run |
RIVET_SOURCE_CDC_UNDECODABLE | refusal | 5 | re-baseline the stream: delete the checkpoint, empty the export’s destination, clear its cdc_snapshot rows, give it cdc.initial: snapshot, then re-run |
RIVET_SOURCE_CDC_CELL_UNSUPPORTED | refusal | 5 | leave the column out of the capture (SQL Server: @captured_column_list), then re-baseline the stream: delete the checkpoint, empty the export’s destination, clear its cdc_snapshot rows, give it cdc.initial: snapshot, then re-run |
RIVET_SOURCE_CDC_PREREQUISITE | environment | 2 if transient, else 1 | apply the setup statement the message names, then re-run (docs/reference/cdc.md) |
RIVET_SOURCE_VALUE_UNREPRESENTABLE | refusal | 5 | map the value to a representable one in the export’s query:, or exclude the column |
RIVET_SOURCE_PROBE_UNREADABLE | refusal | 5 | chunk, page or partition the export on a column of a type the message lists, remove parallel: from a keyset export, or use mode: full |
RIVET_SOURCE_COLUMNS_CHANGED_UNDER_READ | environment | 2 if transient, else 1 | run the export again: the next run probes and reads the table as it is now |
RIVET_SOURCE_OVERRIDE_WIRE_MISMATCH | usage | 1 | remove or correct the column’s columns: override (batch: or CAST the column to that type in the export’s query:; CDC: then re-snapshot the table) |
RIVET_STATE_URL_SCHEME_UNSUPPORTED | usage | 1 | set RIVET_STATE_URL to a postgres:// or postgresql:// URL or to sqlite:<path>, or unset it to keep the state in the SQLite file beside the config |
RIVET_STATE_URL_LEAVES_STATE_BEHIND | refusal | 5 | copy the state beside the config to the path RIVET_STATE_URL names with every run stopped (sqlite3 <old> ".backup <new>"), or unset RIVET_STATE_URL |
RIVET_SOURCE_SESSION_TIME_ZONE_NOT_APPLIED | refusal | 5 | set default_time_zone = '+00:00' on the MySQL server, keep rivet’s session variables on one backend in the proxy (ProxySQL: session-variable tracking, no multiplexing for rivet’s user), or connect directly |
RIVET_CLI_CHECK_REPORTED_ERRORS | environment | 2 if transient, else 1 | fix what the ERROR lines above name (the source, the state, the destination), then run rivet check again |
RIVET_STATE_URL_TLS_REQUIRED | refusal | 5 | add ?sslmode=require (or verify-ca / verify-full) to RIVET_STATE_URL with TLS enabled on the state server, or ?sslmode=disable to accept plaintext on a private network |
RIVET_STATE_NOT_WRITABLE | environment | 2 if transient, else 1 | make the state database writable (the SQLite file and its directory, a read-only filesystem, a read-only role) and run again; the export did not start |
RIVET_STATE_CURSOR_NOT_STORED | environment | 2 if transient, else 1 | repair the state database before the next run; the rows are delivered, and the next run delivers them again from the previous cursor |
RIVET_STATE_SCHEMA_NEWER | refusal | 5 | upgrade rivet, or point this binary at a state DB it created |
RIVET_STATE_BACKUP_FAILED | environment | 2 if transient, else 1 | free disk space or make the state writable for the copy (SQLite: the directory beside the state file; PostgreSQL: CREATE on the database) and run again; the state was not migrated, and the previous rivet release still opens it |
RIVET_STATE_CURSOR_OWNER_MISMATCH | refusal | 5 | rivet state reset -c <config> --export <name> to start the new cursor with a full pass, or restore the previous cursor column |
RIVET_STATE_CURSOR_INCOMPARABLE | refusal | 5 | rivet state reset -c <config> --export <name> starts the cursor over with a full pass |
RIVET_STATE_CURSOR_PAST_MANIFEST | refusal | 5 | rivet state reset -c <config> --export <name> starts the cursor over with a full pass |
RIVET_STATE_CURSOR_STREAM_MISMATCH | refusal | 5 | give each export that shares this state database its own name; if this export was edited (another table, another schema, another query: filter), restore what it read, or rivet state reset -c <config> --export <name> starts what it reads now with a full pass (it discards the progress that name holds on this source), or rivet state accept -c <config> --export <name> keeps the stored progress and records it as belonging to what the export reads now (rows of it below that progress are not delivered) |
RIVET_STATE_CURSOR_DESTINATION_MISMATCH | refusal | 5 | restore the destination and format the export had to continue from the stored progress, or rivet state reset -c <config> --export <name> starts over with a full pass delivered where the config points now (the parts already delivered stay where they are: empty that location first if the full pass lands in it too) |
RIVET_STATE_CURSOR_SOURCE_RESPELLED | refusal | 5 | if the two sources are one server, rivet state accept -c <config> --export <name> moves the progress onto the source the config names now and the next run continues from it; if they are two servers, rivet state accept followed by rivet state reset -c <config> --export <name> starts the export over with a full pass (the progress held on the other source is discarded), or give the export a destination of its own |
RIVET_STATE_INTERRUPTED_RUN_OWNER_MISMATCH | refusal | 5 | restore the settings the interrupted run had (its mode, its checkpoint, its format) and run once to finish it, then change them; or abandon it with the command the message names (rivet state reset for a keyset run, rivet state reset-chunks for a range-chunk run) and the next run starts with a full pass |
RIVET_STATE_CDC_TABLE_REJOINED | refusal | 5 | re-baseline the table the message names: move every file out of its directory in the destination, delete its cdc_snapshot row from the state DB, truncate its __changes table if a warehouse load consumes the stream, then re-run |
RIVET_STATE_CHUNK_RUN_OWNER_UNKNOWN | refusal | 5 | rivet state reset-chunks -c <config> --export <name> abandons the run; the next run of each config starts a fresh pass |
RIVET_STATE_CHUNK_RUN_SUPERSEDED | refusal | 5 | rivet state reset-chunks -c <config> --export <name> abandons the run; the next run starts a fresh pass |
RIVET_STATE_KEYSET_SEQUENTIAL_ANCHOR_UNFINISHED | refusal | 5 | re-run once with parallel: 1 to finish the interrupted run, then raise parallel: |
RIVET_STATE_RUN_IN_PROGRESS | busy | 2 | wait for the run to finish, or stop its process, then repeat the command |
RIVET_STATE_UPGRADE_BESIDE_LIVE_RUN | busy | 2 | run again once the rivet process holding a lease on the state ends; the state was not migrated, and the release that process runs still opens it |
RIVET_STATE_LOCK_TIMEOUT | busy | 2 | the other process still holds it: retry once it ends, or give --lock-wait more seconds |
RIVET_STATE_CHUNK_CHECKPOINT_GONE | refusal | 5 | run the export again: it starts a new chunk run (the parts the lost run wrote stay in the destination, in no manifest) |
RIVET_STATE_CHUNK_PLAN_CHANGED | refusal | 5 | restore the query and the chunk settings the interrupted run had and run once to finish it; or rivet state reset-chunks -c <config> --export <name> abandons it and the next run starts over |
RIVET_STATE_CHUNK_WINDOWS_BROKEN | refusal | 5 | rivet state reset-chunks -c <config> --export <name> abandons the run; the next run plans the export again and reads every key |
RIVET_STATE_LEASE_KEEPER_UNAVAILABLE | environment | 2 if transient, else 1 | free a connection on the state database (rivet holds one per worker plus one for the lease keeper), raise the open-file limit, or lower --pool, then run again; nothing ran under the lease |
RIVET_STATE_LEASE_LOST | busy | 2 | wait for the other rivet load or rivet compact of that table to end, then run again; nothing was written to the warehouse |
RIVET_PLAN_SOURCE_UNREADABLE | environment | 2 if transient, else 1 | fix what the message names (the connection, the credentials, or the table the export reads), then run rivet plan again |
RIVET_SOURCE_COLLECTION_NOT_FOUND | environment | 2 if transient, else 1 | correct the export’s table: (a dotted collection name is written whole), or create the collection |
RIVET_SOURCE_TABLE_NOT_FOUND | environment | 2 if transient, else 1 | correct the export’s table: (or the relation its query: reads), or remove the export from exports: if the table was dropped on purpose |
RIVET_DEST_CONTAINER_NOT_FOUND | environment | 2 if transient, else 1 | create the bucket or container, or correct destination.bucket |
RIVET_DEST_RELATIVE_PATH_MOVED | refusal | 5 | move the export’s files from the directory under the working directory to the one beside the config, or make destination.path absolute |
RIVET_DEST_ALREADY_COMPLETE | refusal | 5 | pass --force with --resume to continue an interrupted run or, with none, run as a plain run does (new parts beside the complete export); or use another destination prefix |
RIVET_LOAD_VALUE_OUT_OF_TARGET_RANGE | refusal | 5 | the warehouse type cannot hold this value; declare a wider type (e.g. String) for the column, or fix the source value |
RIVET_LOAD_COUNT_MISMATCH | integrity | 3 | compare the warehouse table with the run’s manifest before re-running; the source is kept |
RIVET_LOAD_LEASE_LOST_DURING_WRITE | integrity | 3 | compare the warehouse table with the source before relying on it: another load or compact may have written it at the same time; the next rivet load loads the same runs again |
RIVET_LOAD_ADOPTION_COLUMN_MISMATCH | refusal | 5 | add the export’s new columns to the table (ALTER TABLE … ADD COLUMN) and re-run; do not rename it aside |
RIVET_LOAD_TARGET_NOT_RIVETS | refusal | 5 | the warehouse object exists and this state DB has no record of rivet loading it: drop or rename it, or load into another table |
RIVET_LOAD_IDENTIFIER_UNSAFE | usage | 1 | rename the column or table in the source, or alias it in the export’s query:, to a plain identifier ([A-Za-z_][A-Za-z0-9_]*) |
RIVET_LOAD_KEY_COLUMN_INVALID | usage | 1 | name only columns the export delivers, in a type and number the target takes, under pk: / cluster_by: / partition: in the export’s load: block (or add the column to the export’s SELECT), as the message names |
RIVET_LOAD_PRIMARY_KEY_MISSING | usage | 1 | declare the key under the export’s load: block, e.g. pk: [id] |
RIVET_LOAD_RESERVED_COLUMN | usage | 1 | rename or exclude the column in the export’s query, or load the table with mode: full |
RIVET_LOAD_LOOKALIKE_COLUMN | usage | 1 | rename the column with Cyrillic look-alike letters in the source to Latin letters, as the message names |
RIVET_LOAD_TARGET_COLLISION | usage | 1 | give each export its own table: or destination |
RIVET_LOAD_STAGING_PREFIX_INVALID | usage | 1 | set a non-empty destination.prefix with no {date} or {run_id} above {partition}, and a literal segment before {partition} |
RIVET_LOAD_DESTINATION_TYPE_UNSUPPORTED | usage | 1 | stage the export to a destination the target reads (GCS; ClickHouse also S3 and Azure), or drop the load: block |
RIVET_LOAD_PARTITION_BUDGET_EXCEEDED | usage | 1 | partition by a coarser granularity, or export a narrower range per run, as the message names |
RIVET_LOAD_FILE_LIMIT_EXCEEDED | usage | 1 | load after fewer runs, or write fewer, larger parts (lower the export’s parallelism) |
RIVET_LOAD_COLUMN_TYPE_UNSUPPORTED | usage | 1 | CAST or drop the column in the export’s query:, or add a columns: override to a type the target takes |
RIVET_LOAD_TLS_CA_INVALID | usage | 1 | point load.ca_file at a PEM bundle holding the server’s CA certificate |
RIVET_LOAD_EMPTY_RUN_UNSUPPORTED | refusal | 5 | TRUNCATE the warehouse table by hand, or keep its previous rows knowingly; nothing was written |
RIVET_LOAD_RUN_NOT_LOADABLE | refusal | 5 | re-run the export so a complete run (a Success manifest and every part it declares) is under the prefix the load reads, then load |
RIVET_LOAD_STAGING_OBJECT_UNSAFE | refusal | 5 | investigate the staging bucket: remove the object the message names, then re-run the export and the load |
RIVET_LOAD_SOURCES_SHARED | refusal | 5 | give each export and each source its own destination prefix and its own target table |
RIVET_LOAD_COLUMN_RESPELLED | refusal | 5 | load the older runs by hand under the old spelling as the message describes, then delete their manifests; every run stays staged |
RIVET_LOAD_TARGET_OBJECT_CONFLICT | refusal | 5 | drop or rename the warehouse object the message names, or align the config with it; nothing was written |
RIVET_LOAD_COMPACT_BASE_MISSING | refusal | 5 | load the backfill first (the cdc.backfill: export builds the base), or drop the buffer to discard its changes |
RIVET_LOAD_CHANGELOG_PARTITION_CHANGED | refusal | 5 | keep the change log’s partitioning in the config, or rebuild it as the message names (rivet load --rebuild-changelog, or by hand where policies must be kept) |
RIVET_LOAD_BUFFER_NOT_COMPACTED | refusal | 5 | run rivet compact first if the buffer belongs to the current base, or drop the buffer, then re-run the load |
RIVET_LOAD_REBASELINE_OVER_CHANGES | refusal | 5 | TRUNCATE the change log the message names, then re-run the same rivet load |
RIVET_LOAD_TABLE_BUSY | busy | 2 | wait for the other rivet load or rivet compact of that table to end, then run again |
RIVET_LOAD_MANIFEST_INCONSISTENT | integrity | 3 | investigate the run’s manifest and parts before loading; re-run the export to replace them |
RIVET_LOAD_SOURCE_FILE_MISMATCH | integrity | 3 | investigate the extract before loading; to accept the drift, set allow_source_drift: true in the export’s load: block |
RIVET_LOAD_COPY_COUNT_MISMATCH | integrity | 3 | compare the tables the message names before re-running; rivet left them for inspection |
RIVET_LOAD_LEDGER_UNREADABLE | environment | 2 if transient, else 1 | restore the state backend (lower --pool if workers could not reconnect), then re-run |
RIVET_LOAD_RUN_LANDED_DURING_LOAD | environment | 2 if transient, else 1 | run rivet load again: it types from the newest run |
RIVET_LOAD_WAREHOUSE_AUTH_FAILED | environment | 2 if transient, else 1 | renew the warehouse credentials (gcloud auth application-default login, a service-account key, or the target’s connection settings) |
RIVET_LOAD_WAREHOUSE_ACCESS_DENIED | environment | 2 if transient, else 1 | grant the load’s identity the warehouse permission the message names |
RIVET_LOAD_WAREHOUSE_OBJECT_NOT_FOUND | environment | 2 if transient, else 1 | create the dataset or database the load writes into, or correct the names of the load: target |
RIVET_LOAD_WAREHOUSE_REJECTED | environment | 2 if transient, else 1 | read the warehouse’s reason in the message and fix what it names, then re-run |
RIVET_LOAD_WAREHOUSE_UNAVAILABLE | transient | 2 | re-run the same command later; the warehouse failed with a transient error (HTTP 5xx or 429, or a job reason it documents as retryable) that rivet’s retries did not outlast |
RIVET_LOAD_WAREHOUSE_ANSWER_UNREADABLE | internal | 6 | the warehouse answered in a shape rivet does not read — report it with the message |
RIVET_INTERNAL_LOAD_INVARIANT | internal | 6 | a load invariant did not hold — a bug; report it with the message |
RIVET_VALIDATE_FAILED | integrity | 3 | run rivet validate on the prefix and settle each failed part before loading it; the export itself completed |
RIVET_VALIDATE_UNVERIFIED | environment | 2 if transient, else 1 | restore read access to the destination and run rivet validate; the export itself completed |
RIVET_INTERNAL_VALUE_CONVERTER | internal | 6 | a value changed between the source and the written part — a bug; report it with the column’s type |
RIVET_INTERNAL_SPILL | internal | 6 | the CDC spill log is inconsistent — a bug or a damaged spill directory; report it and re-run |
RIVET_INTERNAL_TYPE_BUILDER | internal | 6 | a column builder got a type it cannot build — a bug; report it with the column’s type |
RIVET_LOAD_BLOCK_MISSING | usage | 1 | add a top-level load: { target, ... } block naming the warehouse, or run rivet run alone |
RIVET_LOAD_SPEC_SOURCE_UNRESOLVED | usage | 1 | set the source’s variable (url_env: / password_env:) for rivet load as for rivet run |
RIVET_CLI_EXPORT_UNKNOWN | usage | 1 | pass --export a name declared under exports: in this config |
RIVET_CLI_TABLE_UNKNOWN | usage | 1 | pass --table a warehouse table this config loads, as the message lists |
RIVET_CLI_RUN_ID_EXPORT_MISMATCH | usage | 1 | pass the --export the run id belongs to, or omit --run-id |
RIVET_CLI_OPTION_UNSUPPORTED | usage | 1 | drop the option, or give the command the config, export or mode it takes, as the message names |
RIVET_CLI_REPORT_INVALID | usage | 1 | pass the report rivet reconcile --report wrote for this export |
RIVET_CLI_OUTPUT_UNWRITABLE | environment | 2 if transient, else 1 | check the output path and its directory’s write permission |
RIVET_CLI_INPUT_UNREADABLE | environment | 2 if transient, else 1 | check the path passed to the command and its read permission |
RIVET_CLI_EXECUTABLE_UNRESOLVED | environment | 2 if transient, else 1 | run rivet from a binary the OS can resolve: not deleted, unmounted or replaced while it runs |
RIVET_CLI_TEST_FAULT_INJECTED | environment | 2 if transient, else 1 | unset RIVET_TEST_ERROR_AT; the fault is rivet’s own test hook, not the source |
RIVET_PLAN_NOTHING_TO_PLAN | usage | 1 | run the CDC streams and backfill recipes with rivet run; rivet plan plans batch exports only |
RIVET_PLAN_ARTIFACT_STALE | refusal | 5 | regenerate the plan with rivet plan, or pass --force to apply it as it is |
RIVET_PLAN_ARTIFACT_NO_CREDENTIALS | usage | 1 | re-plan from a config that gives the source url_env: or url_file: |
RIVET_PLAN_PARTITION_TOKEN_UNEXPANDED | usage | 1 | run the config (rivet apply <config.yaml> or rivet run), or drop {partition} from the destination |
RIVET_PLAN_REJECTED | usage | 1 | fix the config so the rule the message names passes; rivet check reports the same rules |
RIVET_PLAN_CHUNK_KEY_SPARSE | usage | 1 | set an explicit chunk_count: (or a larger chunk_size:), page by chunk_by_key:, or use mode: full |
RIVET_PLAN_CHUNK_KEY_NULL | refusal | 5 | chunk on a NOT NULL column, drop the NULL rows with WHERE <column> IS NOT NULL in the query, or use mode: full |
RIVET_CONFIG_SETTLE_COLUMN_NOT_TEMPORAL | usage | 1 | point settle.column at a date or timestamp column, or omit it to settle on the cursor |
RIVET_CONFIG_SPLIT_PREFIX_UNSTABLE | usage | 1 | give the split export a destination without run-varying placeholders ({export} and {table} are stable) |
RIVET_CONFIG_EXPORT_NAME_RESERVED | usage | 1 | rename the export: <name>#<n> names are reserved for split units |
RIVET_CONFIG_BATCH_MEMORY_EXCEEDED | usage | 1 | lower batch_size, or set on_batch_memory_exceeded: auto_shrink |
RIVET_CONFIG_CDC_CAPTURE_INSTANCE_MISMATCH | usage | 1 | set table: to the relation the capture instance emits, or point capture_instance: at the table you meant |
RIVET_SOURCE_VALUE_TOO_LARGE | usage | 1 | raise tuning.max_value_mb, or set it to 0 to disable the guard |
RIVET_SOURCE_KEYSET_KEY_COARSE | refusal | 5 | page on a unique key rivet reads exactly: an integer, text, uuid or date column, or a timestamp at microsecond precision or coarser (cast it in a curated query) |
RIVET_STATE_CHUNK_RUN_MISSING | usage | 1 | set chunk_checkpoint: true and run the export before rivet reconcile |
RIVET_STATE_CHUNK_RUN_UNFINISHED | refusal | 5 | rivet run … --resume continues the unfinished chunk run; rivet state reset-chunks abandons it |
RIVET_DEST_MANIFEST_MISSING | usage | 1 | finish the export (a complete run writes manifest.json at the prefix) before rivet repair |
RIVET_DEST_MANIFEST_NOT_WRITTEN | environment | 2 if transient, else 1 | restore write access to the destination prefix and run again; until a run completes, no manifest names the parts already there |
RIVET_DEST_OBJECT_NOT_FOUND | environment | 2 if transient, else 1 | run again: the object vanished between rivet’s two reads of it; if it repeats, check what else writes to the prefix |
RIVET_DEST_UPLOAD_CORRUPTED | environment | 2 if transient, else 1 | run again: the part is uploaded afresh; if it repeats, check the network path and any proxy in front of the destination |
RIVET_DEST_PREFIX_UNLISTABLE | environment | 2 if transient, else 1 | restore list access to the destination prefix and retry the resume |
RIVET_DEST_COMMITTED_PART_GONE | refusal | 5 | rivet state reset -c <config> --export <name> (keyset) or rivet state reset-chunks (range chunks) so the range is re-read, or export into a fresh prefix |
RIVET_DEST_CONTROL_ARTIFACT_INVALID | refusal | 5 | inspect the manifest at the prefix: one rivet wrote parses and is small; restore or remove it, then run again |
RIVET_DEST_PART_ROWS_MISMATCH | integrity | 3 | stop and report it: a writer bug or a damaged disk; the part was not committed |
RIVET_RUN_UNITS_FAILED | environment | 2 if transient, else 1 | fix the first cause the message names and run again; a checkpointed run resumes from where it stopped |
RIVET_RUN_RECONCILE_UNVERIFIED | environment | 2 if transient, else 1 | run again to obtain the reconcile assurance, or drop --reconcile; the export completed |
RIVET_INTERNAL_RUN_INVARIANT | internal | 6 | a run invariant did not hold — a bug; report it with the message |
RIVET_CONFIG_SOURCE_URL_INVALID | usage | 1 | write the source URL in the form the message shows (<scheme>://user:password@host:port/<database or service>) |
RIVET_CONFIG_SOURCE_OPTION_UNSUPPORTED | usage | 1 | remove the setting the message names: this source type does not support it |
RIVET_CONFIG_SOURCE_FEATURE_MISSING | usage | 1 | run a rivet built with the feature the message names (the release binaries include it) |
RIVET_SOURCE_CDC_TABLE_UNRESOLVED | usage | 1 | set table: to the one base table the capture follows, qualified schema.table as the catalog spells it, as the message explains |
RIVET_SOURCE_CDC_TABLE_UNSUPPORTED | usage | 1 | export the table in batch (mode: full), or capture a table the message’s supported list covers |
RIVET_SOURCE_COLUMNS_UNREADABLE | usage | 1 | grant the account SELECT on the columns the message names (at least the key), or drop the table from the export |
RIVET_SOURCE_CDC_GRANTS_CHANGED | transient | 2 | re-run: the next run reads the new grants and resumes from the checkpoint, so nothing is lost |
RIVET_SOURCE_CDC_TRANSACTION_TOO_LARGE | usage | 1 | split the source transaction, or raise RIVET_CDC_MAX_TX_ROWS / RIVET_CDC_MAX_TX_BYTES when a transaction this large is expected |
RIVET_SOURCE_QUERY_COLUMN_UNREFERENCEABLE | usage | 1 | give the column an alias in the export’s query: (e.g. ... AS row_id) |
RIVET_SOURCE_RUNTIME_UNAVAILABLE | environment | 2 if transient, else 1 | the process could not start the async runtime its driver needs (out of file descriptors or threads): raise the open-files limit (ulimit -n) or lower parallelism, then rerun |
RIVET_SOURCE_CONNECT_FAILED | environment | 2 if transient, else 1 | check the host, port, credentials and TLS settings in the source URL; the driver’s own words follow the colon |
RIVET_SOURCE_QUERY_FAILED | environment | 2 if transient, else 1 | fix what the server’s words name (the statement, the login’s rights on the object, or the session), then run again |
RIVET_SOURCE_CDC_SPILL_UNLOCKABLE | environment | 2 if transient, else 1 | point RIVET_CDC_SPILL_DIR at a local, flock-capable filesystem, or raise the rollover memory cap so the transaction stays in memory |
RIVET_SOURCE_CDC_SPILL_UNWRITABLE | environment | 2 if transient, else 1 | free space on the spill directory’s filesystem (RIVET_CDC_SPILL_DIR, else beside the checkpoint) and check its write permission, then re-run |
RIVET_INTERNAL_SOURCE_INVARIANT | internal | 6 | a source reader invariant did not hold — a bug; report it with the message |
RIVET_SOURCE_KEYSET_KEY_UNORDERED | refusal | 5 | remove page_size, resume and parallel so the collection is read in one ordered scan, or fix the _id values the message names |
RIVET_CLI_VALUE_INVALID | usage | 1 | pass the option a value in the form the message names |
RIVET_CLI_RUN_ID_UNKNOWN | usage | 1 | pass a run id rivet state runs -c <config> lists |
RIVET_CLI_PREFLIGHT_FAILED | usage | 1 | fix each check the output above names, then run the command again |
RIVET_CLI_PREFLIGHT_UNVERIFIED | environment | 2 if transient, else 1 | run rivet doctor again once the source or destination the output names answers |
RIVET_CONFIG_TARGET_UNKNOWN | usage | 1 | set target: (or --target) to one of the names the message lists |
RIVET_CONFIG_TLS_CA_INVALID | usage | 1 | point tls.ca_file at a readable PEM file holding the CA certificate |
RIVET_CONFIG_FORMAT_COLUMN_UNSUPPORTED | usage | 1 | change format:, or cast or drop the column in the export’s query |
RIVET_CONFIG_META_COLUMN_COLLISION | usage | 1 | alias the source column in a query:, or turn the colliding meta column off |
RIVET_CONFIG_CANON_TYPE_UNSUPPORTED | usage | 1 | leave the column out of the gate the message names, or cast it in the query |
RIVET_CONFIG_QUALITY_COLUMN_UNKNOWN | usage | 1 | name columns the export projects under quality:, or add them to the query |
RIVET_CONFIG_COLUMN_OVERRIDE_TYPE_INVALID | usage | 1 | give the columns: override one of the type names the message lists, with decimal(precision,scale) in range |
RIVET_CONFIG_DESTINATION_SETTING_MISSING | usage | 1 | set the destination key the message names |
RIVET_DEST_CREDENTIALS_INVALID | environment | 2 if transient, else 1 | issue the destination a fresh, complete credential (a new SAS, service-account key or gcloud auth application-default login) |
RIVET_DEST_PREFIX_MODE_MISMATCH | refusal | 5 | give the export its own destination prefix; a batch and a CDC export must not share one |
RIVET_DEST_IO_RUNTIME_UNAVAILABLE | environment | 2 if transient, else 1 | raise the process’s thread and open-file limits, or lower the export parallelism, then run again |
RIVET_INIT_CDC_NAME_TAKEN | refusal | 5 | write the config under another -o name: the stem names its checkpoint and destination |
RIVET_INIT_CONFIG_EXISTS | refusal | 5 | move the existing config aside, or write elsewhere with -o <new-path> |
RIVET_INIT_TABLE_NOT_FOUND | usage | 1 | correct --table (and --schema), or grant the user SELECT on the table |
RIVET_INIT_NO_TABLES | usage | 1 | point --schema at a schema the user can read, and loosen --include / --exclude |
RIVET_LOAD_SPLIT_GENERATIONS_MIXED | refusal | 5 | load from a fresh destination prefix, or clear the stale split generation, and run again |
RIVET_LOAD_SPEC_MISSING | refusal | 5 | run rivet run for the export the message names so its column types are recorded, then load again |
RIVET_MCP_REQUEST_INVALID | usage | 1 | send a method and tool name tools/list advertises, with params |
RIVET_PLAN_ARTIFACT_INVALID | usage | 1 | pass a plan file rivet plan wrote, unedited; run rivet plan again to regenerate it |
RIVET_PLAN_CHUNK_KEY_UNUSABLE | usage | 1 | set chunk_column: (integer) or chunk_by_key: (a single-column NOT NULL unique key of a supported type), add such an index, or use mode: full |
RIVET_STATE_BACKEND_FAILED | environment | 2 if transient, else 1 | check the state database (the SQLite file, or the RIVET_STATE_URL server and the role’s rights), then run again |
RIVET_STATE_FILE_CORRUPT | environment | 2 if transient, else 1 | move the state file aside (rivet rebuilds it; cursors and skip-ledgers start fresh), or restore it from a backup |
RIVET_STATE_COPY_SOURCE_EMPTY | usage | 1 | name the config whose .rivet_state.db holds the state, or its RIVET_STATE_URL=sqlite:<path> |
RIVET_STATE_COPY_TARGET_MISSING | usage | 1 | pass --to postgresql://…, or set RIVET_STATE_URL to the PostgreSQL state |
RIVET_STATE_COPY_TARGET_NOT_EMPTY | refusal | 5 | copy into a PostgreSQL database (or schema) that holds no rivet state |
RIVET_STATE_COPY_COUNT_MISMATCH | integrity | 3 | nothing was committed; keep using the SQLite state and report the table the message names |
RIVET_STATE_MIGRATION_LOCKED | environment | 2 if transient, else 1 | wait for the other rivet process migrating this state database to finish, then run again |
RIVET_INTERNAL_DEST_INVARIANT | internal | 6 | a destination invariant did not hold — a bug; report it with the message |
RIVET_INTERNAL_STATE_INVARIANT | internal | 6 | a state-store invariant did not hold — a bug; report it with the message |