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

Error codes

Every failure rivet names carries a stable RIVET_<FAMILY>_<NAME> code: in --json-errors output as code, and as a [CODE] prefix on the text error line. The KIND decides the exit code.

exitmeaning
1usage — fix the config or the command; retrying fails the same way
2a transient failure, or busy (another live rivet process holds the lease or lock this command needs) — retry the same command
3integrity — the data may be wrong; stop and investigate
4schema drift — the source shape changed; review before re-running
5refusal — rivet stopped on purpose to protect data; a human decides
6internal — an invariant did not hold; a bug, please report it
codekindexitwhat to do
RIVET_CONFIG_NO_EXPORTSusage1declare at least one export under exports:
RIVET_CONFIG_CHUNK_COUNT_INVALIDusage1set chunk_count to 1 or more
RIVET_CONFIG_CHUNK_BY_DAYS_INVALIDusage1set chunk_by_days to 1 or more
RIVET_CONFIG_CHUNK_COLUMN_NOT_INTEGERusage1use chunk_by_key: (keyset), an integer column, or mode: full
RIVET_CONFIG_DUPLICATE_EXPORTusage1give every export a unique name
RIVET_CONFIG_CDC_RESOURCE_CONFLICTusage1give each CDC export its own slot / server_id / checkpoint path
RIVET_CONFIG_CDC_ROLLOVER_INVALIDusage1set cdc.rollover to 1 or more, or omit it
RIVET_CONFIG_CDC_CONTINUOUS_UNSUPPORTEDusage1omit cdc.until_current (or --stream) and run the bounded drain on a schedule
RIVET_CONFIG_CSV_LOAD_UNSUPPORTEDusage1use format: parquet for an export with a load: section
RIVET_CONFIG_LOAD_PARTITION_UNSUPPORTEDusage1partition by a date or time column + granularity, and drop the options the target refuses
RIVET_CONFIG_SOURCE_MODE_UNSUPPORTEDusage1use a mode this source supports (MongoDB: full)
RIVET_CONFIG_SOURCE_URL_SCHEME_MISMATCHusage1make source.type and the URL scheme name the same engine
RIVET_CONFIG_KEYSET_KEY_UUID_OVERRIDEusage1key the keyset on another unique column, or use mode: full for this table
RIVET_CONFIG_CURSOR_COLUMN_CASEusage1spell cursor_column exactly as the result set names the column
RIVET_CONFIG_COLUMN_OVERRIDE_CASEusage1spell the columns: key exactly as the result set names the column
RIVET_CONFIG_FILE_UNREADABLEenvironment2 if transient, else 1check the config path and its read permission, or run rivet init to generate one
RIVET_CONFIG_YAML_INVALIDusage1fix the YAML syntax or the key the message names, moving it to where the message shows
RIVET_CONFIG_SOURCE_CONNECTION_INVALIDusage1give 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_UNSETenvironment2 if transient, else 1export the environment variable (or pass the --param) the message names, or make the named file readable
RIVET_CONFIG_GCP_SECRET_UNREADABLEenvironment2 if transient, else 1grant 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_INVALIDusage1give 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_INVALIDusage1add the setting the export’s mode requires, or remove the setting the mode does not take, as the message names
RIVET_CONFIG_DESTINATION_AUTH_INVALIDusage1configure one complete auth mode for the destination (keys, a credentials file, or allow_anonymous) and drop the others
RIVET_CONFIG_DESTINATION_ENDPOINT_UNSAFEusage1drop endpoint: to use the provider default, or point it at a loopback emulator with allow_anonymous: true
RIVET_CONFIG_VALUE_OUT_OF_RANGEusage1set the value in the range or form the message names, and set only one of two mutually exclusive sizing knobs
RIVET_CONFIG_CDC_SHAPE_INVALIDusage1list each captured table once, in a shape this source and destination take, with at most one baseline per table
RIVET_CONFIG_CSV_COMPRESSION_UNSUPPORTEDusage1use format: parquet for compression, or set compression: none / compression_profile: none
RIVET_CONFIG_TLS_VERIFICATION_DOWNGRADEusage1drop 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_INVALIDusage1declare the warehouse in a top-level load: block and override only what the export and target take
RIVET_CONFIG_PATH_UNSAFEusage1use a plain name and a bucket-relative path: no /, \, .., NUL, leading . or URI scheme
RIVET_CONFIG_ROW_HASH_INVALIDusage1list each column of one table once under meta_columns.row_hash, or use row_hash: true
RIVET_CONFIG_COLUMN_OVERRIDE_TABLE_UNKNOWNusage1use a bare column key, or qualify it with a table this export captures
RIVET_TYPE_UNSAFE_MAPPINGusage1add 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_TIMEOUTenvironment2 if transient, else 1raise tuning.statement_timeout_s, or narrow the chunk
RIVET_SOURCE_CURSOR_FINER_THAN_MICROSECONDrefusal5cursor on a column at microsecond precision or coarser, or cast the cursor to TIMESTAMP(6) in a curated query
RIVET_SOURCE_CDC_FOREIGN_CHECKPOINTrefusal5re-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_SHAREDrefusal5give 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_INVALIDrefusal5restore 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_GAPrefusal5restore 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_TRUNCATEDrefusal5re-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_UNDECODABLErefusal5re-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_UNSUPPORTEDrefusal5leave 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_PREREQUISITEenvironment2 if transient, else 1apply the setup statement the message names, then re-run (docs/reference/cdc.md)
RIVET_SOURCE_VALUE_UNREPRESENTABLErefusal5map the value to a representable one in the export’s query:, or exclude the column
RIVET_SOURCE_PROBE_UNREADABLErefusal5chunk, 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_READenvironment2 if transient, else 1run the export again: the next run probes and reads the table as it is now
RIVET_SOURCE_OVERRIDE_WIRE_MISMATCHusage1remove 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_UNSUPPORTEDusage1set 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_BEHINDrefusal5copy 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_APPLIEDrefusal5set 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_ERRORSenvironment2 if transient, else 1fix what the ERROR lines above name (the source, the state, the destination), then run rivet check again
RIVET_STATE_URL_TLS_REQUIREDrefusal5add ?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_WRITABLEenvironment2 if transient, else 1make 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_STOREDenvironment2 if transient, else 1repair 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_NEWERrefusal5upgrade rivet, or point this binary at a state DB it created
RIVET_STATE_BACKUP_FAILEDenvironment2 if transient, else 1free 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_MISMATCHrefusal5rivet state reset -c <config> --export <name> to start the new cursor with a full pass, or restore the previous cursor column
RIVET_STATE_CURSOR_INCOMPARABLErefusal5rivet state reset -c <config> --export <name> starts the cursor over with a full pass
RIVET_STATE_CURSOR_PAST_MANIFESTrefusal5rivet state reset -c <config> --export <name> starts the cursor over with a full pass
RIVET_STATE_CURSOR_STREAM_MISMATCHrefusal5give 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_MISMATCHrefusal5restore 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_RESPELLEDrefusal5if 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_MISMATCHrefusal5restore 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_REJOINEDrefusal5re-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_UNKNOWNrefusal5rivet state reset-chunks -c <config> --export <name> abandons the run; the next run of each config starts a fresh pass
RIVET_STATE_CHUNK_RUN_SUPERSEDEDrefusal5rivet state reset-chunks -c <config> --export <name> abandons the run; the next run starts a fresh pass
RIVET_STATE_KEYSET_SEQUENTIAL_ANCHOR_UNFINISHEDrefusal5re-run once with parallel: 1 to finish the interrupted run, then raise parallel:
RIVET_STATE_RUN_IN_PROGRESSbusy2wait for the run to finish, or stop its process, then repeat the command
RIVET_STATE_UPGRADE_BESIDE_LIVE_RUNbusy2run 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_TIMEOUTbusy2the other process still holds it: retry once it ends, or give --lock-wait more seconds
RIVET_STATE_CHUNK_CHECKPOINT_GONErefusal5run 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_CHANGEDrefusal5restore 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_BROKENrefusal5rivet 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_UNAVAILABLEenvironment2 if transient, else 1free 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_LOSTbusy2wait 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_UNREADABLEenvironment2 if transient, else 1fix what the message names (the connection, the credentials, or the table the export reads), then run rivet plan again
RIVET_SOURCE_COLLECTION_NOT_FOUNDenvironment2 if transient, else 1correct the export’s table: (a dotted collection name is written whole), or create the collection
RIVET_SOURCE_TABLE_NOT_FOUNDenvironment2 if transient, else 1correct 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_FOUNDenvironment2 if transient, else 1create the bucket or container, or correct destination.bucket
RIVET_DEST_RELATIVE_PATH_MOVEDrefusal5move 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_COMPLETErefusal5pass --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_RANGErefusal5the warehouse type cannot hold this value; declare a wider type (e.g. String) for the column, or fix the source value
RIVET_LOAD_COUNT_MISMATCHintegrity3compare the warehouse table with the run’s manifest before re-running; the source is kept
RIVET_LOAD_LEASE_LOST_DURING_WRITEintegrity3compare 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_MISMATCHrefusal5add the export’s new columns to the table (ALTER TABLE … ADD COLUMN) and re-run; do not rename it aside
RIVET_LOAD_TARGET_NOT_RIVETSrefusal5the 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_UNSAFEusage1rename 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_INVALIDusage1name 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_MISSINGusage1declare the key under the export’s load: block, e.g. pk: [id]
RIVET_LOAD_RESERVED_COLUMNusage1rename or exclude the column in the export’s query, or load the table with mode: full
RIVET_LOAD_LOOKALIKE_COLUMNusage1rename the column with Cyrillic look-alike letters in the source to Latin letters, as the message names
RIVET_LOAD_TARGET_COLLISIONusage1give each export its own table: or destination
RIVET_LOAD_STAGING_PREFIX_INVALIDusage1set a non-empty destination.prefix with no {date} or {run_id} above {partition}, and a literal segment before {partition}
RIVET_LOAD_DESTINATION_TYPE_UNSUPPORTEDusage1stage the export to a destination the target reads (GCS; ClickHouse also S3 and Azure), or drop the load: block
RIVET_LOAD_PARTITION_BUDGET_EXCEEDEDusage1partition by a coarser granularity, or export a narrower range per run, as the message names
RIVET_LOAD_FILE_LIMIT_EXCEEDEDusage1load after fewer runs, or write fewer, larger parts (lower the export’s parallelism)
RIVET_LOAD_COLUMN_TYPE_UNSUPPORTEDusage1CAST or drop the column in the export’s query:, or add a columns: override to a type the target takes
RIVET_LOAD_TLS_CA_INVALIDusage1point load.ca_file at a PEM bundle holding the server’s CA certificate
RIVET_LOAD_EMPTY_RUN_UNSUPPORTEDrefusal5TRUNCATE the warehouse table by hand, or keep its previous rows knowingly; nothing was written
RIVET_LOAD_RUN_NOT_LOADABLErefusal5re-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_UNSAFErefusal5investigate the staging bucket: remove the object the message names, then re-run the export and the load
RIVET_LOAD_SOURCES_SHAREDrefusal5give each export and each source its own destination prefix and its own target table
RIVET_LOAD_COLUMN_RESPELLEDrefusal5load 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_CONFLICTrefusal5drop or rename the warehouse object the message names, or align the config with it; nothing was written
RIVET_LOAD_COMPACT_BASE_MISSINGrefusal5load the backfill first (the cdc.backfill: export builds the base), or drop the buffer to discard its changes
RIVET_LOAD_CHANGELOG_PARTITION_CHANGEDrefusal5keep 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_COMPACTEDrefusal5run rivet compact first if the buffer belongs to the current base, or drop the buffer, then re-run the load
RIVET_LOAD_REBASELINE_OVER_CHANGESrefusal5TRUNCATE the change log the message names, then re-run the same rivet load
RIVET_LOAD_TABLE_BUSYbusy2wait for the other rivet load or rivet compact of that table to end, then run again
RIVET_LOAD_MANIFEST_INCONSISTENTintegrity3investigate the run’s manifest and parts before loading; re-run the export to replace them
RIVET_LOAD_SOURCE_FILE_MISMATCHintegrity3investigate the extract before loading; to accept the drift, set allow_source_drift: true in the export’s load: block
RIVET_LOAD_COPY_COUNT_MISMATCHintegrity3compare the tables the message names before re-running; rivet left them for inspection
RIVET_LOAD_LEDGER_UNREADABLEenvironment2 if transient, else 1restore the state backend (lower --pool if workers could not reconnect), then re-run
RIVET_LOAD_RUN_LANDED_DURING_LOADenvironment2 if transient, else 1run rivet load again: it types from the newest run
RIVET_LOAD_WAREHOUSE_AUTH_FAILEDenvironment2 if transient, else 1renew the warehouse credentials (gcloud auth application-default login, a service-account key, or the target’s connection settings)
RIVET_LOAD_WAREHOUSE_ACCESS_DENIEDenvironment2 if transient, else 1grant the load’s identity the warehouse permission the message names
RIVET_LOAD_WAREHOUSE_OBJECT_NOT_FOUNDenvironment2 if transient, else 1create the dataset or database the load writes into, or correct the names of the load: target
RIVET_LOAD_WAREHOUSE_REJECTEDenvironment2 if transient, else 1read the warehouse’s reason in the message and fix what it names, then re-run
RIVET_LOAD_WAREHOUSE_UNAVAILABLEtransient2re-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_UNREADABLEinternal6the warehouse answered in a shape rivet does not read — report it with the message
RIVET_INTERNAL_LOAD_INVARIANTinternal6a load invariant did not hold — a bug; report it with the message
RIVET_VALIDATE_FAILEDintegrity3run rivet validate on the prefix and settle each failed part before loading it; the export itself completed
RIVET_VALIDATE_UNVERIFIEDenvironment2 if transient, else 1restore read access to the destination and run rivet validate; the export itself completed
RIVET_INTERNAL_VALUE_CONVERTERinternal6a value changed between the source and the written part — a bug; report it with the column’s type
RIVET_INTERNAL_SPILLinternal6the CDC spill log is inconsistent — a bug or a damaged spill directory; report it and re-run
RIVET_INTERNAL_TYPE_BUILDERinternal6a column builder got a type it cannot build — a bug; report it with the column’s type
RIVET_LOAD_BLOCK_MISSINGusage1add a top-level load: { target, ... } block naming the warehouse, or run rivet run alone
RIVET_LOAD_SPEC_SOURCE_UNRESOLVEDusage1set the source’s variable (url_env: / password_env:) for rivet load as for rivet run
RIVET_CLI_EXPORT_UNKNOWNusage1pass --export a name declared under exports: in this config
RIVET_CLI_TABLE_UNKNOWNusage1pass --table a warehouse table this config loads, as the message lists
RIVET_CLI_RUN_ID_EXPORT_MISMATCHusage1pass the --export the run id belongs to, or omit --run-id
RIVET_CLI_OPTION_UNSUPPORTEDusage1drop the option, or give the command the config, export or mode it takes, as the message names
RIVET_CLI_REPORT_INVALIDusage1pass the report rivet reconcile --report wrote for this export
RIVET_CLI_OUTPUT_UNWRITABLEenvironment2 if transient, else 1check the output path and its directory’s write permission
RIVET_CLI_INPUT_UNREADABLEenvironment2 if transient, else 1check the path passed to the command and its read permission
RIVET_CLI_EXECUTABLE_UNRESOLVEDenvironment2 if transient, else 1run rivet from a binary the OS can resolve: not deleted, unmounted or replaced while it runs
RIVET_CLI_TEST_FAULT_INJECTEDenvironment2 if transient, else 1unset RIVET_TEST_ERROR_AT; the fault is rivet’s own test hook, not the source
RIVET_PLAN_NOTHING_TO_PLANusage1run the CDC streams and backfill recipes with rivet run; rivet plan plans batch exports only
RIVET_PLAN_ARTIFACT_STALErefusal5regenerate the plan with rivet plan, or pass --force to apply it as it is
RIVET_PLAN_ARTIFACT_NO_CREDENTIALSusage1re-plan from a config that gives the source url_env: or url_file:
RIVET_PLAN_PARTITION_TOKEN_UNEXPANDEDusage1run the config (rivet apply <config.yaml> or rivet run), or drop {partition} from the destination
RIVET_PLAN_REJECTEDusage1fix the config so the rule the message names passes; rivet check reports the same rules
RIVET_PLAN_CHUNK_KEY_SPARSEusage1set an explicit chunk_count: (or a larger chunk_size:), page by chunk_by_key:, or use mode: full
RIVET_PLAN_CHUNK_KEY_NULLrefusal5chunk 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_TEMPORALusage1point settle.column at a date or timestamp column, or omit it to settle on the cursor
RIVET_CONFIG_SPLIT_PREFIX_UNSTABLEusage1give the split export a destination without run-varying placeholders ({export} and {table} are stable)
RIVET_CONFIG_EXPORT_NAME_RESERVEDusage1rename the export: <name>#<n> names are reserved for split units
RIVET_CONFIG_BATCH_MEMORY_EXCEEDEDusage1lower batch_size, or set on_batch_memory_exceeded: auto_shrink
RIVET_CONFIG_CDC_CAPTURE_INSTANCE_MISMATCHusage1set table: to the relation the capture instance emits, or point capture_instance: at the table you meant
RIVET_SOURCE_VALUE_TOO_LARGEusage1raise tuning.max_value_mb, or set it to 0 to disable the guard
RIVET_SOURCE_KEYSET_KEY_COARSErefusal5page 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_MISSINGusage1set chunk_checkpoint: true and run the export before rivet reconcile
RIVET_STATE_CHUNK_RUN_UNFINISHEDrefusal5rivet run … --resume continues the unfinished chunk run; rivet state reset-chunks abandons it
RIVET_DEST_MANIFEST_MISSINGusage1finish the export (a complete run writes manifest.json at the prefix) before rivet repair
RIVET_DEST_MANIFEST_NOT_WRITTENenvironment2 if transient, else 1restore write access to the destination prefix and run again; until a run completes, no manifest names the parts already there
RIVET_DEST_OBJECT_NOT_FOUNDenvironment2 if transient, else 1run again: the object vanished between rivet’s two reads of it; if it repeats, check what else writes to the prefix
RIVET_DEST_UPLOAD_CORRUPTEDenvironment2 if transient, else 1run again: the part is uploaded afresh; if it repeats, check the network path and any proxy in front of the destination
RIVET_DEST_PREFIX_UNLISTABLEenvironment2 if transient, else 1restore list access to the destination prefix and retry the resume
RIVET_DEST_COMMITTED_PART_GONErefusal5rivet 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_INVALIDrefusal5inspect the manifest at the prefix: one rivet wrote parses and is small; restore or remove it, then run again
RIVET_DEST_PART_ROWS_MISMATCHintegrity3stop and report it: a writer bug or a damaged disk; the part was not committed
RIVET_RUN_UNITS_FAILEDenvironment2 if transient, else 1fix the first cause the message names and run again; a checkpointed run resumes from where it stopped
RIVET_RUN_RECONCILE_UNVERIFIEDenvironment2 if transient, else 1run again to obtain the reconcile assurance, or drop --reconcile; the export completed
RIVET_INTERNAL_RUN_INVARIANTinternal6a run invariant did not hold — a bug; report it with the message
RIVET_CONFIG_SOURCE_URL_INVALIDusage1write the source URL in the form the message shows (<scheme>://user:password@host:port/<database or service>)
RIVET_CONFIG_SOURCE_OPTION_UNSUPPORTEDusage1remove the setting the message names: this source type does not support it
RIVET_CONFIG_SOURCE_FEATURE_MISSINGusage1run a rivet built with the feature the message names (the release binaries include it)
RIVET_SOURCE_CDC_TABLE_UNRESOLVEDusage1set 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_UNSUPPORTEDusage1export the table in batch (mode: full), or capture a table the message’s supported list covers
RIVET_SOURCE_COLUMNS_UNREADABLEusage1grant the account SELECT on the columns the message names (at least the key), or drop the table from the export
RIVET_SOURCE_CDC_GRANTS_CHANGEDtransient2re-run: the next run reads the new grants and resumes from the checkpoint, so nothing is lost
RIVET_SOURCE_CDC_TRANSACTION_TOO_LARGEusage1split 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_UNREFERENCEABLEusage1give the column an alias in the export’s query: (e.g. ... AS row_id)
RIVET_SOURCE_RUNTIME_UNAVAILABLEenvironment2 if transient, else 1the 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_FAILEDenvironment2 if transient, else 1check the host, port, credentials and TLS settings in the source URL; the driver’s own words follow the colon
RIVET_SOURCE_QUERY_FAILEDenvironment2 if transient, else 1fix 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_UNLOCKABLEenvironment2 if transient, else 1point 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_UNWRITABLEenvironment2 if transient, else 1free 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_INVARIANTinternal6a source reader invariant did not hold — a bug; report it with the message
RIVET_SOURCE_KEYSET_KEY_UNORDEREDrefusal5remove 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_INVALIDusage1pass the option a value in the form the message names
RIVET_CLI_RUN_ID_UNKNOWNusage1pass a run id rivet state runs -c <config> lists
RIVET_CLI_PREFLIGHT_FAILEDusage1fix each check the output above names, then run the command again
RIVET_CLI_PREFLIGHT_UNVERIFIEDenvironment2 if transient, else 1run rivet doctor again once the source or destination the output names answers
RIVET_CONFIG_TARGET_UNKNOWNusage1set target: (or --target) to one of the names the message lists
RIVET_CONFIG_TLS_CA_INVALIDusage1point tls.ca_file at a readable PEM file holding the CA certificate
RIVET_CONFIG_FORMAT_COLUMN_UNSUPPORTEDusage1change format:, or cast or drop the column in the export’s query
RIVET_CONFIG_META_COLUMN_COLLISIONusage1alias the source column in a query:, or turn the colliding meta column off
RIVET_CONFIG_CANON_TYPE_UNSUPPORTEDusage1leave the column out of the gate the message names, or cast it in the query
RIVET_CONFIG_QUALITY_COLUMN_UNKNOWNusage1name columns the export projects under quality:, or add them to the query
RIVET_CONFIG_COLUMN_OVERRIDE_TYPE_INVALIDusage1give the columns: override one of the type names the message lists, with decimal(precision,scale) in range
RIVET_CONFIG_DESTINATION_SETTING_MISSINGusage1set the destination key the message names
RIVET_DEST_CREDENTIALS_INVALIDenvironment2 if transient, else 1issue the destination a fresh, complete credential (a new SAS, service-account key or gcloud auth application-default login)
RIVET_DEST_PREFIX_MODE_MISMATCHrefusal5give the export its own destination prefix; a batch and a CDC export must not share one
RIVET_DEST_IO_RUNTIME_UNAVAILABLEenvironment2 if transient, else 1raise the process’s thread and open-file limits, or lower the export parallelism, then run again
RIVET_INIT_CDC_NAME_TAKENrefusal5write the config under another -o name: the stem names its checkpoint and destination
RIVET_INIT_CONFIG_EXISTSrefusal5move the existing config aside, or write elsewhere with -o <new-path>
RIVET_INIT_TABLE_NOT_FOUNDusage1correct --table (and --schema), or grant the user SELECT on the table
RIVET_INIT_NO_TABLESusage1point --schema at a schema the user can read, and loosen --include / --exclude
RIVET_LOAD_SPLIT_GENERATIONS_MIXEDrefusal5load from a fresh destination prefix, or clear the stale split generation, and run again
RIVET_LOAD_SPEC_MISSINGrefusal5run rivet run for the export the message names so its column types are recorded, then load again
RIVET_MCP_REQUEST_INVALIDusage1send a method and tool name tools/list advertises, with params
RIVET_PLAN_ARTIFACT_INVALIDusage1pass a plan file rivet plan wrote, unedited; run rivet plan again to regenerate it
RIVET_PLAN_CHUNK_KEY_UNUSABLEusage1set 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_FAILEDenvironment2 if transient, else 1check the state database (the SQLite file, or the RIVET_STATE_URL server and the role’s rights), then run again
RIVET_STATE_FILE_CORRUPTenvironment2 if transient, else 1move the state file aside (rivet rebuilds it; cursors and skip-ledgers start fresh), or restore it from a backup
RIVET_STATE_COPY_SOURCE_EMPTYusage1name the config whose .rivet_state.db holds the state, or its RIVET_STATE_URL=sqlite:<path>
RIVET_STATE_COPY_TARGET_MISSINGusage1pass --to postgresql://…, or set RIVET_STATE_URL to the PostgreSQL state
RIVET_STATE_COPY_TARGET_NOT_EMPTYrefusal5copy into a PostgreSQL database (or schema) that holds no rivet state
RIVET_STATE_COPY_COUNT_MISMATCHintegrity3nothing was committed; keep using the SQLite state and report the table the message names
RIVET_STATE_MIGRATION_LOCKEDenvironment2 if transient, else 1wait for the other rivet process migrating this state database to finish, then run again
RIVET_INTERNAL_DEST_INVARIANTinternal6a destination invariant did not hold — a bug; report it with the message
RIVET_INTERNAL_STATE_INVARIANTinternal6a state-store invariant did not hold — a bug; report it with the message