{"record":{"id":"36bd5dffd6250588","repo":"clockworklabs/SpacetimeDB","slug":"precheck-failed-added-sequence-sequence-name-re","errorCode":null,"errorMessage":"Precheck failed: added sequence {sequence_name} refers to unknown column","messagePattern":"Precheck failed: added sequence (.+?) refers to unknown column","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/engine/src/update.rs","lineNumber":231,"sourceCode":"    // to later steps.\n\n    for precheck in plan.prechecks {\n        match precheck {\n            spacetimedb_schema::auto_migrate::AutoMigratePrecheck::CheckAddSequenceRangeValid(key) => {\n                let (namespace, sequence_name) = key;\n                let (_, table_def) = plan.new.find_storing_table(namespace, sequence_name).ok_or_else(|| {\n                    anyhow::anyhow!(\"Precheck: sequence `{sequence_name}` not found in new module def\")\n                })?;\n                let sequence_def: &SequenceDef = plan.new.lookup(key).ok_or_else(|| {\n                    anyhow::anyhow!(\"Precheck: sequence `{sequence_name}` not found in new module def\")\n                })?;\n                let table_full_name = joined(namespace, &table_def.name);\n                let table_id = stdb.table_id_from_name_mut(tx, &table_full_name)?.unwrap();\n\n                let ty = table_def\n                    .get_column(sequence_def.column)\n                    .ok_or_else(|| {\n                        anyhow::anyhow!(\"Precheck failed: added sequence {sequence_name} refers to unknown column\")\n                    })?\n                    .ty\n                    .clone();\n\n                // Convert `SequenceDef` min/max to `AlgebraicValue`s of the correct type.\n                let min = ty\n                    .saturating_value_from_i128(sequence_def.min_value.unwrap_or(1))\n                    .ok_or_else(|| {\n                        anyhow::anyhow!(\"Precheck failed: added sequence {sequence_name} has invalid min value\")\n                    })?;\n\n                let max = match sequence_def.max_value {\n                    Some(max) => ty.saturating_value_from_i128(max),\n                    None => ty.saturating_value_from_i128(i128::MAX),\n                }\n                .ok_or_else(|| {\n                    anyhow::anyhow!(\"Precheck failed: added sequence {sequence_name} has invalid max value\")\n                })?;","sourceCodeStart":213,"sourceCodeEnd":249,"githubUrl":"https://github.com/clockworklabs/SpacetimeDB/blob/6dee26c6efc2856793e12b148a59742964f5d783/crates/engine/src/update.rs#L213-L249","documentation":"Auto-migrate precheck: an added sequence references a column via sequence_def.column that table_def.get_column cannot find in the new storing table's definition. The sequence points at a column that does not exist in the table it is stored on.","triggerScenarios":"A publish that renames or removes a column while also adding a sequence on it, with the diff not pairing the changes; a hand-written SequenceDef with a stale column name; upstream differ bug emitting a sequence before its column exists.","commonSituations":"Renaming an auto-inc column in the same module version that introduces a sequence; editing generated module defs by hand; version skew in the schema crate.","solutions":["Fix the module so the sequence's column exists in the new table def (keep names in sync)","If renaming was intended, update the sequence definition to the new column name and re-publish","Report upstream if the defs are consistent and the differ still produced the dangling reference"],"exampleFix":"// module (before): sequence refers to a removed/renamed column\n#[sequence(column = \"id_old\")]\nstruct MyTable { id_new: u64, ... }\n\n// after: column name matches\n#[sequence(column = \"id_new\")]\nstruct MyTable { id_new: u64, ... }","handlingStrategy":"validation","validationCode":"// Module authors: verify the sequence's column exists before publishing\nlet col = table_def.get_column(sequence_def.column);\nanyhow::ensure!(col.is_some(),\n    \"sequence {} refers to missing column {}\", sequence_name, sequence_def.column);","typeGuard":"fn sequence_column_exists(t: &TableDef, seq: &SequenceDef) -> bool {\n    t.get_column(seq.column).is_some()\n}","tryCatchPattern":"match auto_migrate_database(&stdb, &mut tx, auth, &plan, &logger) {\n    Err(e) if e.to_string().contains(\"refers to unknown column\") => {\n        // fix the module def (column name) and republish; retrying unchanged will fail again\n        anyhow::bail!(\"module error: {e:#}\");\n    }\n    r => r,\n}","preventionTips":["Keep sequence column attributes synchronized with column renames","Run module validation before publish","Prefer derives/macros over hand-written SequenceDefs"],"tags":["rust","spacetimedb","migration","sequence","column","module-def"],"backgroundTag":"migration-plan-invalid","analyzedSha":"6dee26c6efc2856793e12b148a59742964f5d783","analyzedAt":"2026-08-20T06:08:37.179Z","contentChangedAt":"2026-08-20T06:08:37.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}