{"record":{"id":"9ba679c8845eba48","repo":"thedotmack/claude-mem","slug":"schema-v46-target-table-target-column-row-9ba679","errorCode":null,"errorMessage":"schema v46: ${target.table}.${target.column} row ${row.row_id} is not a positive canonical uint64 revision","messagePattern":"schema v46: (.+?)\\.(.+?) row (.+?) is not a positive canonical uint64 revision","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"src/services/sqlite/SessionStore.ts","lineNumber":730,"sourceCode":"                 typeof(${target.column}) AS storage_type,\n                 CAST(${target.column} AS TEXT) AS revision\n          FROM ${target.table}\n        `))) {\n          const row = raw as { row_id: string; storage_type: string; revision: string | null };\n          if (row.storage_type === 'real') {\n            throw new Error(\n              `schema v46: ${target.table}.${target.column} row ${row.row_id} is REAL and unrecoverably rounded`\n            );\n          }\n          if (row.storage_type !== 'integer' && row.storage_type !== 'text') {\n            throw new Error(\n              `schema v46: ${target.table}.${target.column} row ${row.row_id} has unsupported ${row.storage_type} storage`\n            );\n          }\n          try {\n            assertCanonicalDecimal(row.revision, { positive: true });\n          } catch {\n            throw new Error(\n              `schema v46: ${target.table}.${target.column} row ${row.row_id} is not a positive canonical uint64 revision`\n            );\n          }\n        }\n\n        if (isText(source)) continue;\n        if (columns.some(info => info.name === target.temporary)) {\n          throw new Error(`schema v46: unexpected temporary column ${target.table}.${target.temporary}`);\n        }\n\n        this.db.run(\n          `ALTER TABLE ${target.table} ADD COLUMN ${target.temporary} TEXT NOT NULL DEFAULT '1'`\n        );\n        this.db.run(\n          `UPDATE ${target.table} SET ${target.temporary} = CAST(${target.column} AS TEXT)`\n        );\n        const mismatch = this.db.prepare(`\n          SELECT CAST(id AS TEXT) AS row_id","sourceCodeStart":712,"sourceCodeEnd":748,"githubUrl":"https://github.com/thedotmack/claude-mem/blob/d8bc9755e74915e5c3b999181e10a67c889bce2a/src/services/sqlite/SessionStore.ts#L712-L748","documentation":"The v46 migration validates every revision value with assertCanonicalDecimal(..., { positive: true }) — it must be a positive canonical decimal uint64 (no leading zeros, no signs). A value failing this check means the revision column holds invalid data, so the migration aborts.","triggerScenarios":"A row whose CAST(column AS TEXT) revision is e.g. '0', '-5', '007', 'abc', or exceeds uint64 range when ensureSyncRevisionTextAffinity streams rows.","commonSituations":"Rows written by an older buggy version; manual edits setting sync_rev to 0 or a negative number; values produced by float rounding then stored as text.","solutions":["Locate bad rows: SELECT CAST(id AS TEXT), sync_rev FROM <table> WHERE typeof(sync_rev)='text' AND (sync_rev GLOB '*[^0-9]*' OR sync_rev GLOB '0*' OR sync_rev = '')","Correct the revision to the expected positive canonical decimal string","Restore a backup taken before migration","Report as a bug including the offending value"],"exampleFix":"// before (invalid)\nsync_rev = '007'\n// after\nsync_rev = '7'","handlingStrategy":"validation","validationCode":"function isCanonicalUint64(v: string) {\n  return /^[1-9][0-9]*$/.test(v) && BigInt(v) <= 18446744073709551615n;\n}\nconst bad = db.query(\"SELECT sync_rev FROM sdk_sessions WHERE typeof(sync_rev)='text'\").all()\n  .filter(r => !isCanonicalUint64(r.sync_rev));","typeGuard":null,"tryCatchPattern":"try { store = new SessionStore(dbPath); } catch (e) {\n  if (String(e.message).includes('not a positive canonical uint64')) {\n    fixOrRestoreRevisionRows(dbPath);\n  } else throw e;\n}","preventionTips":["Never write 0, negative, zero-padded, or non-numeric values into revision columns","Use the library's revision-assignment APIs","Back up before migrating"],"tags":["schema","migration","sqlite","validation"],"backgroundTag":"schema-validation-failed","analyzedSha":"d8bc9755e74915e5c3b999181e10a67c889bce2a","analyzedAt":"2026-09-17T16:40:26.182Z","contentChangedAt":"2026-09-17T16:40:26.182Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}