@dbsp/adapter-pgsql 3.5.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/naming-plugin.ts","../src/db-type.ts","../src/validate.ts","../src/transition/ids.ts","../src/transition/constants.ts","../src/postgresql-capabilities.ts","../src/ddl/index-feature-capabilities.ts","../src/transition/index-feature-capabilities.ts","../src/ddl/index-render.ts","../src/expression-provenance.ts","../src/ddl/phases/utils.ts","../src/ddl/rendered-sql.ts","../src/ddl/schema-diff.ts","../src/check-constraint-name.ts","../src/check-expression.ts","../src/ddl/ddl-generator.ts","../src/ddl/generated-source-normalizers.ts","../src/ddl/phases/comments.ts","../src/ddl/phases/types.ts","../src/ddl/phases/constraints.ts","../src/ddl/phases/drop-statements.ts","../src/ddl/phases/enum-types.ts","../src/ddl/phases/extensions.ts","../src/ddl/phases/indexes.ts","../src/ddl/phases/rls.ts","../src/ddl/migration-sql.ts","../src/ddl/schema-scope.ts","../src/ddl/type-mapping.ts","../src/ddl/column-emission-decision.ts","../src/ddl/phases/sequences.ts","../src/ddl/phases/tables.ts","../src/ddl/destructive-classification.ts","../src/transition/catalogue-identity.ts","../src/ddl/managed-step-manifest.ts","../src/ddl/generated-postcondition-v3-validator.ts","../src/ddl/generated-postcondition-verifier.ts","../src/transition/lock-identifier.ts","../src/transition/lock-relation.ts","../src/ddl/lock-timeout.ts","../src/transition/chain-reader.ts","../src/transition/database-writability.ts","../src/transition/lessor.ts","../src/transition/reinitialize-preflight.ts","../src/transition/ledger.ts","../src/transition/ledger-deparse-fixtures/pg-15.json","../src/transition/ledger-deparse-fixtures/pg-16.json","../src/transition/ledger-deparse-fixtures/pg-17.json","../src/transition/ledger-deparse-fixtures/pg-18.json","../src/transition/ledger-spec.ts","../src/transition/post-lock-admission-evidence.ts","../src/transition/outcome-protocol.ts"],"sourcesContent":["/**\n * NamingPlugin - Identifier transformation between model and database naming conventions\n *\n * Inspired by Kysely's CamelCasePlugin architecture.\n * The plugin transforms identifiers bidirectionally:\n * - toDatabase: model name (camelCase) → database name (snake_case)\n * - toModel: database name (snake_case) → model name (camelCase)\n */\n\n/**\n * Interface for naming convention transformation plugins\n */\nexport interface NamingPlugin {\n\t/**\n\t * Transform a model identifier to database format\n\t * Example: \"createdAt\" → \"created_at\"\n\t */\n\ttoDatabase(identifier: string): string;\n\n\t/**\n\t * Transform a database identifier to model format\n\t * Example: \"created_at\" → \"createdAt\"\n\t */\n\ttoModel(identifier: string): string;\n}\n\n/**\n * Identity plugin - no transformation\n * Use this when model and database naming conventions match\n */\nexport class IdentityNamingPlugin implements NamingPlugin {\n\ttoDatabase(identifier: string): string {\n\t\treturn identifier;\n\t}\n\n\ttoModel(identifier: string): string {\n\t\treturn identifier;\n\t}\n}\n\n/**\n * CamelCase ↔ snake_case transformation plugin\n *\n * Follows the same logic as Kysely's CamelCasePlugin:\n * - Handles consecutive uppercase letters (e.g., \"parseJSON\" → \"parse_json\")\n * - Handles numbers (e.g., \"field1Name\" → \"field1_name\")\n * - Preserves leading underscores\n */\nexport class CamelCaseNamingPlugin implements NamingPlugin {\n\t/**\n\t * camelCase → snake_case\n\t */\n\ttoDatabase(identifier: string): string {\n\t\t// Handle empty strings\n\t\tif (!identifier) return identifier;\n\n\t\t// Preserve leading underscores\n\t\tconst leadingUnderscores = identifier.match(/^_+/)?.[0] ?? '';\n\t\tconst rest = identifier.slice(leadingUnderscores.length);\n\n\t\tif (!rest) return identifier;\n\n\t\t// Convert camelCase to snake_case\n\t\t// Handles: wordWord, wordWORD, word123Word\n\t\tconst snakeCase = rest\n\t\t\t// Insert underscore before uppercase letters that follow lowercase/numbers\n\t\t\t.replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n\t\t\t// Insert underscore before the last uppercase in a sequence followed by lowercase\n\t\t\t.replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n\t\t\t.toLowerCase();\n\n\t\treturn leadingUnderscores + snakeCase;\n\t}\n\n\t/**\n\t * snake_case → camelCase\n\t */\n\ttoModel(identifier: string): string {\n\t\t// Handle empty strings\n\t\tif (!identifier) return identifier;\n\n\t\t// Preserve leading underscores\n\t\tconst leadingUnderscores = identifier.match(/^_+/)?.[0] ?? '';\n\t\tconst rest = identifier.slice(leadingUnderscores.length);\n\n\t\tif (!rest) return identifier;\n\n\t\t// Convert snake_case to camelCase\n\t\t// First character stays lowercase, subsequent segments are capitalized\n\t\tconst camelCase = rest.replace(/_([a-z0-9])/gi, (_, char: string) =>\n\t\t\tchar.toUpperCase(),\n\t\t);\n\n\t\treturn leadingUnderscores + camelCase;\n\t}\n}\n\n/**\n * Singleton instances for convenience\n */\nexport const identityNaming = new IdentityNamingPlugin();\nexport const camelCaseNaming = new CamelCaseNamingPlugin();\n\n/**\n * Get a naming plugin by DbCasing (intuitive semantics).\n * - `'snake_case'`: DB uses snake_case → CamelCaseNamingPlugin (transforms to camelCase)\n * - `'camelCase'`: DB uses camelCase → IdentityNamingPlugin (no transform)\n * - `'preserve'`: No transformation → IdentityNamingPlugin\n */\nexport function getNamingPluginForDbCasing(\n\tcasing: 'snake_case' | 'camelCase' | 'preserve',\n): NamingPlugin {\n\tswitch (casing) {\n\t\tcase 'snake_case':\n\t\t\treturn camelCaseNaming;\n\t\tcase 'camelCase':\n\t\tcase 'preserve':\n\t\t\treturn identityNaming;\n\t\tdefault:\n\t\t\treturn identityNaming;\n\t}\n}\n","import type { ColumnIR, ColumnType } from '@dbsp/types';\n\ntype SplitDbType = {\n\tbase: string;\n\tmodifier: string | undefined;\n\tisArray: boolean;\n\tschemaQualified: boolean;\n};\n\nconst TEMPORAL_TZ_SUFFIXES = [' without time zone', ' with time zone'] as const;\nconst SAFE_LOWERCASE_IDENTIFIER_RE = /^[a-z_][a-z0-9_]*$/;\n\nconst MULTIWORD_BASE_TYPES = new Set([\n\t'timestamp with time zone',\n\t'timestamp without time zone',\n\t'time with time zone',\n\t'time without time zone',\n\t'double precision',\n\t'character varying',\n\t'bit varying',\n]);\n\nconst TYPE_ALIASES = new Map<string, string>([\n\t['character varying', 'varchar'],\n\t['character', 'char'],\n\t['bpchar', 'char'],\n\t['bit varying', 'varbit'],\n\t['timestamp with time zone', 'timestamptz'],\n\t['timestamp without time zone', 'timestamp'],\n\t['time with time zone', 'timetz'],\n\t['time without time zone', 'time'],\n\t['int', 'integer'],\n\t['int4', 'integer'],\n\t['int8', 'bigint'],\n\t['int2', 'smallint'],\n\t['float', 'double precision'],\n\t['float8', 'double precision'],\n\t['float4', 'real'],\n\t['bool', 'boolean'],\n\t['decimal', 'numeric'],\n\t['serial', 'integer'],\n\t['serial4', 'integer'],\n\t['bigserial', 'bigint'],\n\t['serial8', 'bigint'],\n\t['smallserial', 'smallint'],\n\t['serial2', 'smallint'],\n]);\n\nconst BUILTIN_BASE_TYPES = new Set([\n\t...TYPE_ALIASES.keys(),\n\t...TYPE_ALIASES.values(),\n\t'bigint',\n\t'bit',\n\t'boolean',\n\t'box',\n\t'bytea',\n\t'char',\n\t'cidr',\n\t'circle',\n\t'date',\n\t'float',\n\t'inet',\n\t'integer',\n\t'interval',\n\t'json',\n\t'jsonb',\n\t'line',\n\t'lseg',\n\t'macaddr',\n\t'macaddr8',\n\t'money',\n\t'numeric',\n\t'path',\n\t'pg_lsn',\n\t'point',\n\t'polygon',\n\t'real',\n\t'text',\n\t'time',\n\t'timestamp',\n\t'timetz',\n\t'timestamptz',\n\t'tsquery',\n\t'tsvector',\n\t'txid_snapshot',\n\t'uuid',\n\t'varbit',\n\t'varchar',\n\t'xml',\n\t'jsonpath',\n\t'name',\n\t'oid',\n\t'regclass',\n\t'regtype',\n\t'regrole',\n\t'regnamespace',\n\t'regproc',\n\t'regprocedure',\n\t'xid',\n\t'xid8',\n\t'cid',\n\t'tid',\n\t'daterange',\n\t'int4range',\n\t'int8range',\n\t'numrange',\n\t'tsrange',\n\t'tstzrange',\n\t'datemultirange',\n\t'int4multirange',\n\t'int8multirange',\n\t'nummultirange',\n\t'tsmultirange',\n\t'tstzmultirange',\n]);\n\nconst UNQUOTED_IDENTIFIER = '[A-Za-z_][A-Za-z0-9_]*';\n// SQL-standard quoted identifier: >= 1 unit (any non-quote char, or an escaped\n// \"\"), so an empty \"\" is rejected as a malformed type name.\nconst QUOTED_IDENTIFIER = '\"(?:[^\"]|\"\")+\"';\nconst IDENTIFIER_RE = new RegExp(\n\t`^(?:${UNQUOTED_IDENTIFIER}|${QUOTED_IDENTIFIER})$`,\n);\nconst QUALIFIED_IDENTIFIER_RE = new RegExp(\n\t`^(?:${UNQUOTED_IDENTIFIER}|${QUOTED_IDENTIFIER})\\\\.(?:${UNQUOTED_IDENTIFIER}|${QUOTED_IDENTIFIER})$`,\n);\nconst QUOTED_IDENTIFIER_RE = new RegExp(QUOTED_IDENTIFIER, 'g');\nconst INTERVAL_FIELD = '(?:year|month|day|hour|minute|second)';\nconst INTERVAL_BASE_RE = new RegExp(\n\t`^interval(?: ${INTERVAL_FIELD}(?: to ${INTERVAL_FIELD})?)?$`,\n\t'i',\n);\n// No valid PostgreSQL type modifier contains a quote — numeric (n[,s]), a\n// length, or a type-specific token like geometry(Point,4326). Disallowing `'`\n// rejects malformed/unbalanced string literals such as geometry('unterminated).\nconst MODIFIER_CONTENT_RE = /^[A-Za-z0-9_,.\\- ]+$/;\nconst MODIFIER_OPERATOR_RE = /[=<>+*/%|&!@#^~]/;\n\n// Built-in types whose only valid modifier is a single length/precision integer\n// — (n). Rejects malformed inputs like varchar('x') / bit(8,-1) / varchar(1 2) at\n// the adapter boundary. interval field specs (interval day to second) are matched\n// via INTERVAL_BASE_RE, not this set.\nconst SINGLE_INT_MODIFIER_BUILTINS = new Set([\n\t'varchar',\n\t'character varying',\n\t'char',\n\t'character',\n\t'bpchar',\n\t// float(p): PostgreSQL treats float(1..24) as real, float(25..53) as double\n\t// precision — a single-integer mantissa precision.\n\t'float',\n\t'bit',\n\t'bit varying',\n\t'varbit',\n\t'timestamp',\n\t'timestamptz',\n\t'timestamp with time zone',\n\t'timestamp without time zone',\n\t'time',\n\t'timetz',\n\t'time with time zone',\n\t'time without time zone',\n\t'interval',\n]);\n// Built-in types whose modifier is precision with an optional scale — (p) or\n// (p,s). The scale may be negative on PostgreSQL 15+ (numeric(10,-2)).\nconst PRECISION_SCALE_BUILTINS = new Set(['numeric', 'decimal']);\n\nfunction splitDbType(input: string): SplitDbType {\n\tconst trimmed = input.trim();\n\tlet rest = trimmed;\n\tlet isArray = false;\n\n\tif (rest.endsWith('[]')) {\n\t\tisArray = true;\n\t\trest = rest.slice(0, -2).trimEnd();\n\t}\n\n\tconst lowerRest = rest.toLowerCase();\n\tfor (const suffix of TEMPORAL_TZ_SUFFIXES) {\n\t\tif (!lowerRest.endsWith(suffix)) continue;\n\n\t\tconst beforeSuffix = rest.slice(0, -suffix.length).trimEnd();\n\t\tconst temporal = splitTrailingModifier(beforeSuffix);\n\t\tconst temporalBase = normalizeBase(temporal.base).toLowerCase();\n\n\t\tif (temporalBase === 'timestamp' || temporalBase === 'time') {\n\t\t\tconst base = normalizeBase(`${temporal.base}${suffix}`);\n\t\t\treturn {\n\t\t\t\tbase,\n\t\t\t\tmodifier: temporal.modifier,\n\t\t\t\tisArray,\n\t\t\t\tschemaQualified: isSchemaQualified(base),\n\t\t\t};\n\t\t}\n\t}\n\n\tconst split = splitTrailingModifier(rest);\n\tconst base = normalizeBase(split.base);\n\n\treturn {\n\t\tbase,\n\t\tmodifier: split.modifier,\n\t\tisArray,\n\t\tschemaQualified: isSchemaQualified(base),\n\t};\n}\n\nfunction splitTrailingModifier(input: string): {\n\tbase: string;\n\tmodifier: string | undefined;\n} {\n\tconst match = input.match(/^(.*)\\(([^()]*)\\)$/);\n\tif (!match) return { base: input.trim(), modifier: undefined };\n\n\treturn {\n\t\tbase: (match[1] ?? '').trimEnd(),\n\t\tmodifier: (match[2] ?? '').trim(),\n\t};\n}\n\nfunction normalizeBase(base: string): string {\n\tconst trimmed = base.trim();\n\treturn trimmed.includes('\"') ? trimmed : trimmed.replace(/\\s+/g, ' ');\n}\n\nfunction isSchemaQualified(base: string): boolean {\n\treturn QUALIFIED_IDENTIFIER_RE.test(base);\n}\n\nexport function splitQualifiedIdentifier(\n\tbase: string,\n): { schema: string; name: string } | null {\n\tconst normalized = normalizeBase(base);\n\tif (!isSchemaQualified(normalized)) return null;\n\n\tlet inQuote = false;\n\tfor (let i = 0; i < normalized.length; i++) {\n\t\tconst ch = normalized[i];\n\t\tif (ch === '\"') {\n\t\t\tif (inQuote && normalized[i + 1] === '\"') {\n\t\t\t\ti++;\n\t\t\t} else {\n\t\t\t\tinQuote = !inQuote;\n\t\t\t}\n\t\t} else if (ch === '.' && !inQuote) {\n\t\t\treturn {\n\t\t\t\tschema: normalized.slice(0, i),\n\t\t\t\tname: normalized.slice(i + 1),\n\t\t\t};\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction canonicalizeDbType(type: string): string {\n\tconst split = splitDbType(type);\n\tconst base = normalizeBase(split.base);\n\tconst canonicalBase = base.includes('\"')\n\t\t? base\n\t\t: (TYPE_ALIASES.get(base.toLowerCase()) ?? base.toLowerCase());\n\t// Normalize whitespace only AROUND the comma so numeric(10, 2) canonicalizes\n\t// equal to numeric(10,2) (format_type emits no spaces; authored DSL may) —\n\t// without collapsing space WITHIN a token, so a malformed varchar(1 20) does\n\t// not canonicalize equal to varchar(120) and mask real drift.\n\tconst modifier =\n\t\tsplit.modifier === undefined\n\t\t\t? ''\n\t\t\t: `(${split.modifier.replace(/\\s*,\\s*/g, ',').trim()})`;\n\tconst arraySuffix = split.isArray ? '[]' : '';\n\n\treturn `${canonicalBase}${modifier}${arraySuffix}`;\n}\n\n/**\n * Return a truncation-safe PostgreSQL CAST target for a database type string.\n */\nexport function dbTypeCastTarget(originalDbType: string): string {\n\tconst split = splitDbType(originalDbType);\n\tconst base = normalizeBase(split.base).toLowerCase();\n\tconst hasModifier = split.modifier !== undefined;\n\tconst arraySuffix = split.isArray ? '[]' : '';\n\n\tif (base === 'varchar' || base === 'character varying') {\n\t\treturn hasModifier ? `varchar${arraySuffix}` : originalDbType;\n\t}\n\n\tif (base === 'char' || base === 'character' || base === 'bpchar') {\n\t\treturn `text${arraySuffix}`;\n\t}\n\n\tif (base === 'bit' || base === 'bit varying' || base === 'varbit') {\n\t\treturn hasModifier ? `bit varying${arraySuffix}` : originalDbType;\n\t}\n\n\tif (base === 'numeric' || base === 'decimal') {\n\t\treturn hasModifier ? `numeric${arraySuffix}` : originalDbType;\n\t}\n\n\tif (base === 'timestamp with time zone' || base === 'timestamptz') {\n\t\treturn hasModifier\n\t\t\t? `timestamp with time zone${arraySuffix}`\n\t\t\t: originalDbType;\n\t}\n\n\tif (base === 'timestamp without time zone') {\n\t\treturn hasModifier\n\t\t\t? `timestamp without time zone${arraySuffix}`\n\t\t\t: originalDbType;\n\t}\n\n\tif (base === 'timestamp') {\n\t\treturn hasModifier\n\t\t\t? `timestamp without time zone${arraySuffix}`\n\t\t\t: originalDbType;\n\t}\n\n\tif (base === 'time with time zone' || base === 'timetz') {\n\t\treturn hasModifier ? `time with time zone${arraySuffix}` : originalDbType;\n\t}\n\n\tif (base === 'time without time zone') {\n\t\treturn hasModifier\n\t\t\t? `time without time zone${arraySuffix}`\n\t\t\t: originalDbType;\n\t}\n\n\tif (base === 'time') {\n\t\treturn hasModifier ? `time${arraySuffix}` : originalDbType;\n\t}\n\n\t// interval, optionally with a field spec (e.g. `interval day to second`):\n\t// drop the precision modifier so the cast never rounds fractional seconds.\n\tif (INTERVAL_BASE_RE.test(base)) {\n\t\treturn hasModifier ? `${base}${arraySuffix}` : originalDbType;\n\t}\n\n\t// Custom/UDT or any other type: emit the already-valid SQL spelling as-is. A\n\t// bare name folds per PostgreSQL's identifier rules; a case-sensitive type is\n\t// already quoted upstream (introspection renders catalog names via\n\t// quoteTypeIdentifier). Re-quoting here would change a bare name's meaning.\n\treturn originalDbType;\n}\n\nexport function dbTypesEqual(a: string, b: string): boolean {\n\treturn canonicalizeDbType(a) === canonicalizeDbType(b);\n}\n\n/**\n * Classify a rendered physical built-in type for emission decisions. Unlike\n * dbTypesEqual(), this recognizes only the spellings PostgreSQL resolves to\n * the physical integer-family built-ins. Keyword aliases apply only to bare,\n * unquoted names; qualified and quoted names must be physical catalog names.\n */\nexport function pgBuiltInTypeFamily(\n\ttype: string,\n): 'integer' | 'bigint' | undefined {\n\tconst physicalBuiltInFamily = (\n\t\tname: string,\n\t): 'integer' | 'bigint' | undefined =>\n\t\tname === 'int4' ? 'integer' : name === 'int8' ? 'bigint' : undefined;\n\tconst split = splitDbType(type);\n\tif (split.modifier !== undefined || split.isArray) return undefined;\n\tconst qualified = splitQualifiedIdentifier(split.base);\n\tif (qualified !== null) {\n\t\tif (normalizeIdentifierForComparison(qualified.schema) !== 'pg_catalog')\n\t\t\treturn undefined;\n\t\treturn physicalBuiltInFamily(\n\t\t\tnormalizeIdentifierForComparison(qualified.name),\n\t\t);\n\t}\n\tconst base = normalizeBase(split.base);\n\tconst name = normalizeIdentifierForComparison(base);\n\t// Quoted identifiers retain their case and are catalog names, not grammar\n\t// keywords. Only a bare unquoted spelling reaches PostgreSQL's alias rewrite.\n\tif (base.includes('\"')) return physicalBuiltInFamily(name);\n\tconst canonical = TYPE_ALIASES.get(name) ?? name;\n\treturn canonical === 'integer' || canonical === 'bigint'\n\t\t? canonical\n\t\t: undefined;\n}\n\n/**\n * True when a database type string is a recognized built-in PostgreSQL type\n * spelling rather than a custom/UDT identifier.\n */\nexport function isPgBuiltInTypeName(type: string): boolean {\n\tconst split = splitDbType(type);\n\tconst base = normalizeBase(split.base);\n\n\tif (base.includes('\"') || split.schemaQualified) return false;\n\n\t// Built-in check is case-insensitive and comes FIRST: a mixed-case spelling\n\t// of a built-in (VarChar, Numeric, Timestamp) is a built-in — PostgreSQL\n\t// folds it to the canonical type. Only a bare name that resolves to no\n\t// built-in is treated as a custom/UDT identifier. A bare name that collides\n\t// (case-insensitively) with a built-in — e.g. `Money` vs `money` — is the\n\t// built-in; a case-sensitive custom type must be quoted (`\"Money\"`), which\n\t// introspection stores via quoteTypeIdentifier.\n\tconst baseLower = base.toLowerCase();\n\treturn (\n\t\tMULTIWORD_BASE_TYPES.has(baseLower) ||\n\t\tINTERVAL_BASE_RE.test(base) ||\n\t\tBUILTIN_BASE_TYPES.has(baseLower)\n\t);\n}\n\n/**\n * Render a RAW catalog identifier (a bare typname, e.g. from pg_type.typname)\n * so a mixed-case catalog type (`Status`, `Money`) survives PostgreSQL identifier\n * folding: a safe lowercase identifier stays bare; anything case-sensitive is\n * quoted with inner `\"` doubled.\n *\n * This is the ONLY place quoting is added. Callers that already hold a rendered\n * SQL type string (originalDbType) must emit it as-is — re-quoting a bare name\n * would change its meaning, since PostgreSQL folds unquoted identifiers.\n *\n * Scope: this handles CASE sensitivity only. A pathological custom type whose\n * lowercase catalog name collides with a reserved word or a built-in (a type\n * literally named `select` or `text`) is NOT disambiguated here — that needs\n * oid/namespace-aware rendering and is a pre-existing limitation of the\n * udt_name fallback (only the typmod/array format_type paths are oid-accurate).\n */\nexport function quoteTypeIdentifier(rawIdentifier: string): string {\n\t// Do NOT trim: leading/trailing whitespace is part of a raw catalog typname\n\t// (e.g. a type literally named ` Money`), so trimming would target a different\n\t// type. Such a name is not a safe lowercase identifier and is quoted verbatim.\n\tif (SAFE_LOWERCASE_IDENTIFIER_RE.test(rawIdentifier)) return rawIdentifier;\n\treturn `\"${rawIdentifier.replace(/\"/g, '\"\"')}\"`;\n}\n\n/**\n * Render a raw schema identifier for schema-qualified custom type names.\n * Always quotes so reserved words, mixed case, and punctuation are valid without\n * a separate keyword allowlist.\n */\nexport function quoteTypeSchemaIdentifier(rawIdentifier: string): string {\n\treturn `\"${rawIdentifier.replace(/\"/g, '\"\"')}\"`;\n}\n\n/** Unwrap one layer of SQL identifier quoting, collapsing doubled `\"\"`. */\nfunction unquoteIdentifier(id: string): string {\n\tconst t = id.trim();\n\tif (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) {\n\t\treturn t.slice(1, -1).replace(/\"\"/g, '\"');\n\t}\n\treturn t;\n}\n\nfunction normalizeIdentifierForComparison(id: string): string {\n\tconst normalized = normalizeBase(id);\n\treturn normalized.includes('\"')\n\t\t? unquoteIdentifier(normalized)\n\t\t: unquoteIdentifier(normalized).toLowerCase();\n}\n\nfunction mapColumnTypeFallback(type: ColumnType): string {\n\tswitch (type) {\n\t\tcase 'string':\n\t\t\treturn 'VARCHAR(255)';\n\t\tcase 'text':\n\t\t\treturn 'TEXT';\n\t\tcase 'number':\n\t\tcase 'integer':\n\t\t\treturn 'INTEGER';\n\t\tcase 'bigint':\n\t\t\treturn 'BIGINT';\n\t\tcase 'decimal':\n\t\t\treturn 'NUMERIC';\n\t\tcase 'boolean':\n\t\t\treturn 'BOOLEAN';\n\t\tcase 'date':\n\t\t\treturn 'DATE';\n\t\tcase 'time':\n\t\t\treturn 'TIME';\n\t\tcase 'datetime':\n\t\tcase 'timestamp':\n\t\t\treturn 'TIMESTAMPTZ';\n\t\tcase 'json':\n\t\tcase 'jsonb':\n\t\t\treturn 'JSONB';\n\t\tcase 'uuid':\n\t\t\treturn 'UUID';\n\t\tcase 'daterange':\n\t\t\treturn 'DATERANGE';\n\t\tcase 'tsrange':\n\t\t\treturn 'TSRANGE';\n\t\tcase 'tstzrange':\n\t\t\treturn 'TSTZRANGE';\n\t\tcase 'int4range':\n\t\t\treturn 'INT4RANGE';\n\t\tcase 'int8range':\n\t\t\treturn 'INT8RANGE';\n\t\tcase 'numrange':\n\t\t\treturn 'NUMRANGE';\n\t\tdefault:\n\t\t\treturn 'TEXT';\n\t}\n}\n\nexport function stripDbTypeSchema(dbType: string): string {\n\tconst split = splitDbType(dbType);\n\tconst qualified = splitQualifiedIdentifier(split.base);\n\t// No schema qualifier → return verbatim. Reassembling base+modifier would\n\t// mis-place the modifier for built-ins whose modifier is not a simple trailing\n\t// group, e.g. `time(3) without time zone` → `time without time zone(3)`.\n\t// Only schema-qualified custom types (no such tz suffix) need stripping.\n\tif (!qualified) return dbType;\n\tconst modifier = split.modifier !== undefined ? `(${split.modifier})` : '';\n\treturn `${qualified.name}${modifier}${split.isArray ? '[]' : ''}`;\n}\n\n/**\n * Render a column's PostgreSQL type at an emission site. Structural custom type\n * identity lives in `originalDbTypeSchema`/`originalDbTypeSchemaScope`; this\n * function decides whether and how to qualify against the current target schema.\n */\nexport function renderColumnDbType(\n\tcol: ColumnIR,\n\ttargetSchema?: string,\n): string {\n\tconst originalDbType = col.originalDbType?.trim();\n\tif (!originalDbType) return mapColumnTypeFallback(col.type);\n\n\tconst originalSchema = col.originalDbTypeSchema;\n\t// A defined non-pg_catalog schema means a CUSTOM type — qualify it even if its\n\t// bare name collides with a built-in (a custom type literally named `text`).\n\tif (\n\t\toriginalSchema !== undefined &&\n\t\toriginalSchema !== '' &&\n\t\toriginalSchema !== 'pg_catalog'\n\t) {\n\t\t// Missing scope defaults to 'absolute' so an explicitly-schema'd authored\n\t\t// type is never silently retargeted; introspection always sets scope.\n\t\tconst scope = col.originalDbTypeSchemaScope ?? 'absolute';\n\t\tconst effectiveSchema =\n\t\t\tscope === 'absolute' ? originalSchema : (targetSchema ?? originalSchema);\n\t\t// A TARGET public type stays bare (no churn to the default output); an\n\t\t// ABSOLUTE public type is qualified so it resolves regardless of search_path.\n\t\t// An always-fully-qualify-public opt-in is a deferred policy question (#303).\n\t\tif (effectiveSchema === 'public' && scope === 'target') {\n\t\t\treturn stripDbTypeSchema(originalDbType);\n\t\t}\n\t\treturn `${quoteTypeSchemaIdentifier(effectiveSchema)}.${stripDbTypeSchema(originalDbType)}`;\n\t}\n\n\t// Built-in (pg_catalog or no structural schema field): emit verbatim.\n\tif (originalSchema === 'pg_catalog' || isPgBuiltInTypeName(originalDbType)) {\n\t\treturn originalDbType;\n\t}\n\n\t// Legacy authored string with no schema field: emit exactly as authored — a\n\t// qualified string stays qualified, a bare string stays bare, never retargeted.\n\treturn originalDbType;\n}\n\nexport function columnDbTypeSchemaIdentity(col: ColumnIR): string | undefined {\n\tconst originalDbType = col.originalDbType?.trim();\n\tif (!originalDbType) return undefined;\n\n\tconst originalSchema = col.originalDbTypeSchema;\n\t// A defined non-pg_catalog schema is a CUSTOM type (even if its bare name\n\t// collides with a built-in) — carry its schema identity so diffs see the drift.\n\tif (\n\t\toriginalSchema !== undefined &&\n\t\toriginalSchema !== '' &&\n\t\toriginalSchema !== 'pg_catalog'\n\t) {\n\t\tconst scope = col.originalDbTypeSchemaScope ?? 'absolute';\n\t\treturn scope === 'absolute' ? `absolute:${originalSchema}` : 'target';\n\t}\n\n\t// Built-ins get a distinct identity (not undefined) so a custom type whose bare\n\t// name collides with a built-in (`tenant_1.text` vs pg_catalog `text`) is seen as\n\t// a real change; only a schema-agnostic AUTHORED bare custom type stays undefined.\n\tif (originalSchema === 'pg_catalog') return 'builtin';\n\tif (isPgBuiltInTypeName(originalDbType)) return 'builtin';\n\n\t// Legacy: no structural schema field. A QUALIFIED string carries an explicit\n\t// schema (absolute identity), so two different qualified schemas must diff; a\n\t// BARE string is schema-agnostic (authored — it matches an introspected type of\n\t// the same base regardless of schema, so it never false-diffs).\n\tconst split = splitDbType(originalDbType);\n\tconst qualified = splitQualifiedIdentifier(split.base);\n\tif (qualified !== null) {\n\t\treturn `absolute:${normalizeIdentifierForComparison(qualified.schema)}`;\n\t}\n\treturn undefined;\n}\n\n/**\n * Classify how a rendered originalDbType references a given catalog typname, so\n * the enum drop-dependency scan can rewrite the column correctly before the type\n * is dropped: `scalar` -> cast to `text`, `array` -> cast to `text[]`. Returns\n * null when it does not reference the type. A bare reference matches by typname\n * only, regardless of enum schema, preferring a safe over-protective cast to\n * missing a dependency before `DROP TYPE ... CASCADE`. A schema-qualified\n * reference matches only when its schema also matches the enum schema.\n */\nexport function enumReferenceKind(\n\toriginalDbType: string,\n\ttypname: string,\n\ttypschema?: string,\n\toriginalDbTypeSchema?: string,\n): 'scalar' | 'array' | null {\n\tconst split = splitDbType(originalDbType);\n\tconst qualified = splitQualifiedIdentifier(split.base);\n\tconst baseName = unquoteIdentifier(\n\t\tnormalizeBase(qualified?.name ?? split.base),\n\t);\n\tif (baseName !== typname) return null;\n\tconst referenceSchema =\n\t\toriginalDbTypeSchema ??\n\t\t(qualified !== null\n\t\t\t? normalizeIdentifierForComparison(qualified.schema)\n\t\t\t: undefined);\n\tif (\n\t\treferenceSchema !== undefined &&\n\t\ttypschema !== undefined &&\n\t\treferenceSchema !== typschema\n\t) {\n\t\treturn null;\n\t}\n\treturn split.isArray ? 'array' : 'scalar';\n}\n\n/**\n * Validate that a database type string is structurally a type name.\n */\nexport function validateDbType(type: string): string {\n\tif (typeof type !== 'string') {\n\t\tthrow new Error(\n\t\t\t`Unsafe database type name: expected a string, received ${typeof type}`,\n\t\t);\n\t}\n\n\tif (!isStructurallyValidDbType(type)) {\n\t\tthrow new Error(\n\t\t\t`Unsafe database type name: \"${type}\". Must be a structurally valid PostgreSQL type name.`,\n\t\t);\n\t}\n\n\treturn type;\n}\n\nfunction isStructurallyValidDbType(type: string): boolean {\n\tconst trimmed = type.trim();\n\tif (trimmed.length === 0 || trimmed !== type) return false;\n\tif (/[;]|--|\\/\\*|\\*\\//.test(trimmed)) return false;\n\tif (trimmed.endsWith('[][]')) return false;\n\tif (hasForbiddenTypeKeyword(trimmed)) return false;\n\n\tconst split = splitDbType(trimmed);\n\tconst base = split.base;\n\tconst baseLower = base.toLowerCase();\n\n\tif (\n\t\tsplit.modifier !== undefined &&\n\t\t!isSafeModifier(split.modifier, baseLower)\n\t) {\n\t\treturn false;\n\t}\n\n\tif (MULTIWORD_BASE_TYPES.has(baseLower)) {\n\t\treturn true;\n\t}\n\n\tif (INTERVAL_BASE_RE.test(base)) {\n\t\treturn true;\n\t}\n\n\treturn IDENTIFIER_RE.test(base) || split.schemaQualified;\n}\n\nfunction isSafeModifier(modifier: string, baseLower: string): boolean {\n\tconst structurallySafe =\n\t\tmodifier.length > 0 &&\n\t\t!/[();]|--|\\/\\*|\\*\\//.test(modifier) &&\n\t\t!MODIFIER_OPERATOR_RE.test(modifier) &&\n\t\tMODIFIER_CONTENT_RE.test(modifier) &&\n\t\t!hasForbiddenTypeKeyword(modifier);\n\tif (!structurallySafe) return false;\n\n\t// numeric/decimal: precision with an optional (possibly negative) scale.\n\tif (PRECISION_SCALE_BUILTINS.has(baseLower)) {\n\t\treturn /^\\d+(\\s*,\\s*-?\\d+)?$/.test(modifier);\n\t}\n\t// A single-integer-modifier built-in, or an interval (with an optional field\n\t// spec): the modifier must be exactly one non-negative integer. Rejects\n\t// varchar('x'), varchar(10,-2), bit(8,-1), interval day to second(foo),\n\t// varchar(1 2).\n\tif (\n\t\tSINGLE_INT_MODIFIER_BUILTINS.has(baseLower) ||\n\t\tINTERVAL_BASE_RE.test(baseLower)\n\t) {\n\t\treturn /^\\d+$/.test(modifier.trim());\n\t}\n\t// A recognized built-in that takes no modifier at all (integer, text, double\n\t// precision, uuid, oid, ...) — reject any modifier.\n\tif (\n\t\tBUILTIN_BASE_TYPES.has(baseLower) ||\n\t\tMULTIWORD_BASE_TYPES.has(baseLower)\n\t) {\n\t\treturn false;\n\t}\n\t// Non-built-in (custom / extension) types keep an opaque modifier so\n\t// geometry(Point,4326) / vector(768) pass.\n\treturn true;\n}\n\nfunction hasForbiddenTypeKeyword(type: string): boolean {\n\tconst withoutQuotedIdentifiers = type.replace(QUOTED_IDENTIFIER_RE, '\"\"');\n\n\treturn /\\bnot\\s+null\\b|\\b(default|references|check|primary|unique|constraint|select|insert|update|delete|drop|alter|create|truncate|grant|revoke|copy)\\b/i.test(\n\t\twithoutQuotedIdentifiers,\n\t);\n}\n","/**\n * Identifier Validation for adapter-pgsql\n *\n * Security layer to prevent SQL injection via identifiers.\n * All table names, column names, schema names, and aliases MUST pass validation.\n */\n\nimport { validateDbType } from './db-type.js';\n\n// ============================================================================\n// SQL Reserved Keywords (PostgreSQL)\n// ============================================================================\n\n/**\n * PostgreSQL reserved keywords that cannot be used as unquoted identifiers.\n * This is a subset of the most common ones - full list is much larger.\n * We allow these but they must be quoted.\n */\nconst SQL_RESERVED_KEYWORDS = new Set([\n\t'all',\n\t'analyse',\n\t'analyze',\n\t'and',\n\t'any',\n\t'array',\n\t'as',\n\t'asc',\n\t'asymmetric',\n\t'authorization',\n\t'binary',\n\t'both',\n\t'case',\n\t'cast',\n\t'check',\n\t'collate',\n\t'collation',\n\t'column',\n\t'concurrently',\n\t'constraint',\n\t'create',\n\t'cross',\n\t'current_catalog',\n\t'current_date',\n\t'current_role',\n\t'current_schema',\n\t'current_time',\n\t'current_timestamp',\n\t'current_user',\n\t'default',\n\t'deferrable',\n\t'desc',\n\t'distinct',\n\t'do',\n\t'else',\n\t'end',\n\t'except',\n\t'false',\n\t'fetch',\n\t'for',\n\t'foreign',\n\t'freeze',\n\t'from',\n\t'full',\n\t'grant',\n\t'group',\n\t'having',\n\t'ilike',\n\t'in',\n\t'initially',\n\t'inner',\n\t'intersect',\n\t'into',\n\t'is',\n\t'isnull',\n\t'join',\n\t'lateral',\n\t'leading',\n\t'left',\n\t'like',\n\t'limit',\n\t'localtime',\n\t'localtimestamp',\n\t'natural',\n\t'not',\n\t'notnull',\n\t'null',\n\t'offset',\n\t'on',\n\t'only',\n\t'or',\n\t'order',\n\t'outer',\n\t'overlaps',\n\t'placing',\n\t'primary',\n\t'references',\n\t'returning',\n\t'right',\n\t'select',\n\t'session_user',\n\t'similar',\n\t'some',\n\t'symmetric',\n\t'table',\n\t'timestamp',\n\t'tablesample',\n\t'then',\n\t'to',\n\t'trailing',\n\t'true',\n\t'union',\n\t'unique',\n\t'user',\n\t'using',\n\t'variadic',\n\t'verbose',\n\t'when',\n\t'where',\n\t'window',\n\t'with',\n]);\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Error thrown when an identifier fails validation.\n */\nexport class InvalidIdentifierError extends Error {\n\tconstructor(\n\t\tpublic readonly identifier: string,\n\t\tpublic readonly identifierType: string,\n\t\tpublic readonly reason: string,\n\t) {\n\t\tsuper(`Invalid ${identifierType} identifier \"${identifier}\": ${reason}`);\n\t\tthis.name = 'InvalidIdentifierError';\n\t}\n}\n\n/**\n * Assert that a SQL-spliced value is a primitive string before validation or\n * escaping. This blocks forged objects whose string-like methods can return\n * different values between validation and rendering.\n */\nexport function assertString(\n\tvalue: unknown,\n\tcontext: string,\n): asserts value is string {\n\tif (typeof value !== 'string') {\n\t\tthrow new Error(`${context}: expected a string, received ${typeof value}`);\n\t}\n}\n\nconst SAFE_DECIMAL_LITERAL = /^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)$/;\nconst SAFE_STORAGE_BOOLEAN_LITERAL = /^(?:true|false|on|off)$/i;\nconst SAFE_SIMPLE_IDENTIFIER_VALUE = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nexport function assertNumericLiteral(value: unknown, context: string): string {\n\tif (typeof value !== 'number' && typeof value !== 'string') {\n\t\tthrow new Error(\n\t\t\t`${context}: expected a finite number or numeric string, received ${typeof value}`,\n\t\t);\n\t}\n\n\tconst literal = typeof value === 'number' ? String(value) : value;\n\tif (\n\t\t(typeof value === 'number' && !Number.isFinite(value)) ||\n\t\t!SAFE_DECIMAL_LITERAL.test(literal)\n\t) {\n\t\tthrow new Error(`${context}: unsafe numeric literal \"${literal}\"`);\n\t}\n\n\treturn literal;\n}\n\nexport function formatStorageParameterValue(\n\tvalue: unknown,\n\tcontext: string,\n): string {\n\tif (typeof value !== 'number' && typeof value !== 'string') {\n\t\tthrow new Error(\n\t\t\t`${context}: expected a string or number, received ${typeof value}`,\n\t\t);\n\t}\n\n\tif (typeof value === 'number') {\n\t\treturn assertNumericLiteral(value, context);\n\t}\n\n\tif (value.includes('\\0')) {\n\t\tthrow new Error(`${context}: contains null byte`);\n\t}\n\n\tif (\n\t\tSAFE_DECIMAL_LITERAL.test(value) ||\n\t\tSAFE_STORAGE_BOOLEAN_LITERAL.test(value) ||\n\t\t(SAFE_SIMPLE_IDENTIFIER_VALUE.test(value) &&\n\t\t\t!isReservedKeyword(value) &&\n\t\t\tvalue.toLowerCase() !== 'null')\n\t) {\n\t\treturn value;\n\t}\n\n\treturn `'${value.replace(/'/g, \"''\")}'`;\n}\n\n// ============================================================================\n// Validation Functions\n// ============================================================================\n\n// ────────────────────────────────────────────────────────────────────\n// NAMEDATALEN and character-length bookkeeping\n//\n// PostgreSQL caps identifier/role/collation names at NAMEDATALEN-1 bytes\n// (63 bytes in the default build). Two length-check styles coexist in\n// this file for historical reasons:\n//\n// • `validateIdentifier()` uses `name.length > 63` (UTF-16 code units\n// as JavaScript counts them → effectively character count).\n// • `quoteRoleName()` / `validateCollationName()` use\n// `Buffer.byteLength(name, 'utf8') > 63` (actual byte count).\n//\n// Why the two styles coexist:\n// • `validateIdentifier` and `validateCollationName` sit *after* an\n// ASCII-only allowlist regex that rejects any multi-byte character,\n// so every accepted name has `.length === Buffer.byteLength(...)`\n// and the char-count form is equivalent to a byte-count form.\n// • `quoteRoleName` deliberately does NOT gate on an ASCII allowlist\n// (role names like `\"utilisateur\"` are legitimate); it rejects only\n// `\"`, NUL, and control chars, then counts *bytes* because role\n// names can contain multi-byte UTF-8 and PostgreSQL truncates at\n// the byte level (strlen semantics).\n// The asymmetry is intentional and safe. Do not collapse either style\n// without also widening/narrowing the upstream input-validation rules.\n// ────────────────────────────────────────────────────────────────────\n\n/**\n * Validate that a string is a safe SQL identifier.\n *\n * Rules:\n * 1. Must not be empty\n * 2. Must not exceed 63 characters (PostgreSQL limit)\n * 3. Must start with letter or underscore\n * 4. Must contain only alphanumeric, underscore, or dollar sign\n * 5. Must not contain null bytes or control characters\n * 6. Reserved keywords are allowed (will be quoted)\n *\n * @param value The identifier to validate\n * @param type Type of identifier (for error messages): 'table', 'column', 'schema', 'alias', 'function'\n * @throws InvalidIdentifierError if validation fails\n */\nexport function validateIdentifier(\n\tvalue: string,\n\ttype: 'table' | 'column' | 'schema' | 'alias' | 'function',\n): void {\n\tif (typeof value !== 'string') {\n\t\tthrow new Error(\n\t\t\t`Invalid ${type} identifier: expected a string, received ${typeof value}`,\n\t\t);\n\t}\n\n\t// Rule 1: Not empty\n\tif (!value || value.length === 0) {\n\t\tthrow new InvalidIdentifierError(value, type, 'cannot be empty');\n\t}\n\n\t// Rule 2: Length limit\n\tif (value.length > 63) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tvalue,\n\t\t\ttype,\n\t\t\t`exceeds maximum length of 63 characters (got ${value.length})`,\n\t\t);\n\t}\n\n\t// Rule 3 & 4: Character validation\n\t// PostgreSQL identifiers: start with letter/underscore, contain letter/digit/underscore/$\n\tconst validIdentifierPattern = /^[a-zA-Z_][a-zA-Z0-9_$]*$/;\n\tif (!validIdentifierPattern.test(value)) {\n\t\t// Check for specific issues\n\t\tif (/[\\x00-\\x1f\\x7f]/.test(value)) {\n\t\t\tthrow new InvalidIdentifierError(\n\t\t\t\tvalue,\n\t\t\t\ttype,\n\t\t\t\t'contains control characters',\n\t\t\t);\n\t\t}\n\t\tif (/^[0-9]/.test(value)) {\n\t\t\tthrow new InvalidIdentifierError(\n\t\t\t\tvalue,\n\t\t\t\ttype,\n\t\t\t\t'cannot start with a digit',\n\t\t\t);\n\t\t}\n\t\tif (/[^\\w$]/.test(value)) {\n\t\t\tthrow new InvalidIdentifierError(\n\t\t\t\tvalue,\n\t\t\t\ttype,\n\t\t\t\t'contains invalid characters (only letters, digits, underscore, and $ allowed)',\n\t\t\t);\n\t\t}\n\t\tthrow new InvalidIdentifierError(\n\t\t\tvalue,\n\t\t\ttype,\n\t\t\t'does not match valid identifier pattern',\n\t\t);\n\t}\n\n\t// Rule 5: No null bytes (extra safety)\n\tif (value.includes('\\0')) {\n\t\tthrow new InvalidIdentifierError(value, type, 'contains null byte');\n\t}\n\n\t// Note: Reserved keywords are allowed - they will be quoted by the AST helpers\n}\n\n/**\n * Check if an identifier is a SQL reserved keyword.\n */\nexport function isReservedKeyword(value: string): boolean {\n\treturn SQL_RESERVED_KEYWORDS.has(value.toLowerCase());\n}\n\n/**\n * Validate a schema-qualified identifier (schema.table).\n *\n * @param schemaTable String in format \"schema.table\" or just \"table\"\n * @returns Object with validated schema and table names\n * @throws InvalidIdentifierError if validation fails\n */\nexport function validateQualifiedIdentifier(schemaTable: string): {\n\tschema?: string;\n\ttable: string;\n} {\n\tconst parts = schemaTable.split('.');\n\n\tif (parts.length === 1) {\n\t\tvalidateIdentifier(parts[0]!, 'table');\n\t\treturn { table: parts[0]! };\n\t}\n\n\tif (parts.length === 2) {\n\t\tconst schema = parts[0]!;\n\t\tconst table = parts[1]!;\n\t\tvalidateIdentifier(schema, 'schema');\n\t\tvalidateIdentifier(table, 'table');\n\t\treturn { schema, table };\n\t}\n\n\tthrow new InvalidIdentifierError(\n\t\tschemaTable,\n\t\t'table',\n\t\t'too many dots in qualified name (expected schema.table or table)',\n\t);\n}\n\n/**\n * Batch validate multiple identifiers.\n *\n * @param identifiers Map of identifier values to their types\n * @throws InvalidIdentifierError on first validation failure\n */\nexport function validateIdentifiers(\n\tidentifiers: Record<string, 'table' | 'column' | 'schema' | 'alias'>,\n): void {\n\tfor (const [value, type] of Object.entries(identifiers)) {\n\t\tif (value) {\n\t\t\tvalidateIdentifier(value, type);\n\t\t}\n\t}\n}\n\n// ============================================================================\n// Sanitization (for display/logging/comment text only - NOT for SQL tokens)\n// ============================================================================\n\n/**\n * Sanitize an identifier for safe logging/display.\n * NOT for use in SQL - use validateIdentifier + AST helpers for that.\n */\nexport function sanitizeForDisplay(value: string): string {\n\t// Replace control characters with placeholders\n\treturn value.replace(/[\\x00-\\x1f\\x7f]/g, '?').slice(0, 100); // Truncate for display\n}\n\n/**\n * Preserve hostile diagnostic text as one printable line without losing which\n * control character was supplied. This is for diagnostics only, never SQL.\n */\nexport function escapeDiagnosticText(value: string): string {\n\treturn value.replace(/[\\\\\\p{Cc}\\p{Cf}\\p{Zl}\\p{Zp}]/gu, (character) => {\n\t\tswitch (character) {\n\t\t\tcase '\\\\':\n\t\t\t\treturn '\\\\\\\\';\n\t\t\tcase '\\n':\n\t\t\t\treturn '\\\\n';\n\t\t\tcase '\\r':\n\t\t\t\treturn '\\\\r';\n\t\t\tcase '\\t':\n\t\t\t\treturn '\\\\t';\n\t\t\tdefault:\n\t\t\t\treturn `\\\\u${character.codePointAt(0)?.toString(16).padStart(4, '0')}`;\n\t\t}\n\t});\n}\n\n/**\n * Sanitize display text before interpolating it into a single-line SQL comment.\n *\n * PostgreSQL `--` comments end at a line break, so any control character could\n * let display-only text escape onto an executable SQL line.\n */\nexport function sanitizeCommentText(value: unknown): string {\n\tassertString(value, 'SQL comment text');\n\treturn value.replace(/[\\x00-\\x1f\\x7f]/g, '');\n}\n\n/**\n * Validate a PostgreSQL extension name for safe use in DDL statements.\n *\n * Extension names differ from regular SQL identifiers: they can contain\n * hyphens and dots (e.g. `uuid-ossp`, `postgis-raster`, `pg_trgm`).\n * However they must not contain injection vectors.\n *\n * Allowed: letters, digits, underscore, hyphen, dot (`[a-zA-Z0-9_\\-.]+`)\n * Forbidden: double-quote, single-quote, semicolon, --, /*, *\\/, dollar-quoted strings ($$), whitespace, NUL, backslash\n *\n * @param name The extension name to validate (e.g. `uuid-ossp`)\n * @param context Human-readable context label for the error message\n * @throws InvalidIdentifierError if the name fails validation\n */\nexport function validateExtensionName(\n\tname: string,\n\tcontext = 'extension',\n): void {\n\tassertString(name, `Invalid ${context} identifier`);\n\n\tif (!name || name.length === 0) {\n\t\tthrow new InvalidIdentifierError(name, context, 'cannot be empty');\n\t}\n\n\t// PostgreSQL NAMEDATALEN - 1 = 63 character limit\n\tif (name.length > 63) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t`exceeds maximum length of 63 characters (got ${name.length})`,\n\t\t);\n\t}\n\n\t// Reject injection vectors before the character allowlist check\n\tif (/[\\x00-\\x1f\\x7f]/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains control characters',\n\t\t);\n\t}\n\tif (/[\\\\]/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains backslash (forbidden in extension names)',\n\t\t);\n\t}\n\tif (/\"/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains double-quote (identifier injection risk)',\n\t\t);\n\t}\n\tif (/'/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains single-quote (string injection risk)',\n\t\t);\n\t}\n\tif (/;/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains semicolon (statement injection risk)',\n\t\t);\n\t}\n\tif (/--/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains line-comment marker (--)',\n\t\t);\n\t}\n\tif (/\\/\\*/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains block-comment opener (/*)',\n\t\t);\n\t}\n\tif (/\\*\\//.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains block-comment closer (*/)',\n\t\t);\n\t}\n\tif (/\\$\\$/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains dollar-quoting ($$)',\n\t\t);\n\t}\n\tif (/\\s/.test(name)) {\n\t\tthrow new InvalidIdentifierError(name, context, 'contains whitespace');\n\t}\n\n\t// Final allowlist: letters, digits, underscore, hyphen, dot\n\tif (!/^[a-zA-Z0-9_\\-.]+$/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains characters not allowed in extension names (only letters, digits, underscore, hyphen, and dot allowed)',\n\t\t);\n\t}\n}\n\n/**\n * Validate a PostgreSQL collation name for safe use in DDL statements.\n *\n * Collation names differ from regular SQL identifiers: they can contain\n * hyphens and dots to represent locale strings (e.g. `en_US.utf8`,\n * `en-US-x-icu`, `C.UTF-8`, `C`). They must not contain injection vectors.\n *\n * Allowed: letter or underscore start, then letters, digits, underscore,\n * hyphen, dot, and an optional trailing `@modifier` (1-10 characters\n * from `[A-Za-z0-9-]`, e.g. `@euro`, `@latin9`, `@iso8859-15`).\n * Modifier hyphens are allowed to cover codepage suffixes like\n * `iso8859-15`. Pattern: `[a-zA-Z_][a-zA-Z0-9_.-]*(?:@[A-Za-z0-9-]{1,10})?`\n * Forbidden: any character outside [A-Za-z0-9_.-] and the optional\n * @modifier (including single-quote, double-quote, semicolon, --,\n * block-comment markers, dollar-quoting, whitespace, NUL byte,\n * backslash, bare @, or @modifier longer than 10 characters)\n *\n * @param name The collation name to validate (e.g. en_US.utf8, de_DE.utf8@euro)\n * @param context Human-readable context label for the error message\n * @throws InvalidIdentifierError if the name fails validation\n */\nexport function validateCollationName(\n\tname: string,\n\tcontext = 'collation',\n): void {\n\tassertString(name, `Invalid ${context} identifier`);\n\n\tif (!name || name.length === 0) {\n\t\tthrow new InvalidIdentifierError(name, context, 'cannot be empty');\n\t}\n\n\t// PostgreSQL NAMEDATALEN - 1 = 63 byte limit. For collation names the\n\t// equivalence of .length and Buffer.byteLength() still holds because the\n\t// accepted charset ([A-Za-z0-9_.-] plus the @modifier [A-Za-z0-9-]) is\n\t// entirely ASCII — every character is a single byte in UTF-8.\n\tif (Buffer.byteLength(name, 'utf8') > 63) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t`exceeds maximum length of 63 bytes (got ${Buffer.byteLength(name, 'utf8')})`,\n\t\t);\n\t}\n\n\t// Reject NUL bytes — PostgreSQL silently truncates at the first NUL\n\tif (/\\x00/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains NUL byte (\\\\x00) which would be silently truncated by PostgreSQL',\n\t\t);\n\t}\n\n\t// Reject other control characters (0x01-0x1F, 0x7F)\n\tif (/[\\x01-\\x1f\\x7f]/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains control characters (only printable characters allowed)',\n\t\t);\n\t}\n\n\t// Reject backslash\n\tif (/[\\\\]/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains backslash (forbidden in collation names)',\n\t\t);\n\t}\n\n\t// Reject embedded double-quotes — not valid inside a collation name\n\tif (/\"/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains double-quote (identifier injection risk)',\n\t\t);\n\t}\n\n\t// Reject single-quotes\n\tif (/'/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains single-quote (string injection risk)',\n\t\t);\n\t}\n\n\t// Reject semicolons\n\tif (/;/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains semicolon (statement injection risk)',\n\t\t);\n\t}\n\n\t// Reject line-comment marker\n\tif (/--/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains line-comment marker (--)',\n\t\t);\n\t}\n\n\t// Reject block-comment opener\n\tif (/\\/\\*/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains block-comment opener (/*)',\n\t\t);\n\t}\n\n\t// Reject block-comment closer\n\tif (/\\*\\//.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains block-comment closer (*/)',\n\t\t);\n\t}\n\n\t// Reject dollar-quoting\n\tif (/\\$\\$/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains dollar-quoting ($$)',\n\t\t);\n\t}\n\n\t// Reject whitespace\n\tif (/\\s/.test(name)) {\n\t\tthrow new InvalidIdentifierError(name, context, 'contains whitespace');\n\t}\n\n\t// Final allowlist: must start with letter or underscore, then allow\n\t// letters, digits, underscore, hyphen, dot (covers en_US.utf8, en-US-x-icu, C.UTF-8).\n\t// An optional trailing @modifier (1-10 alphanumeric or hyphen chars) is also\n\t// accepted, e.g. de_DE.utf8@euro, en_US.utf8@latin9, en_US@iso8859-15. Bare @,\n\t// overlong modifiers, and non-[A-Za-z0-9-] characters inside the modifier are\n\t// rejected. Must match: [a-zA-Z_][a-zA-Z0-9_.-]*(?:@[A-Za-z0-9-]{1,10})?\n\tif (!/^[a-zA-Z_][a-zA-Z0-9_.-]*(?:@[A-Za-z0-9-]{1,10})?$/.test(name)) {\n\t\tthrow new InvalidIdentifierError(\n\t\t\tname,\n\t\t\tcontext,\n\t\t\t'contains characters not allowed in collation names (only letters, digits, underscore, hyphen, and dot allowed; optional @modifier must be 1-10 alphanumeric/hyphen characters, e.g. @euro, @latin9, @iso8859-15)',\n\t\t);\n\t}\n}\n\n/**\n * Validate a raw SQL expression used in DDL contexts (defaults, policy USING/CHECK).\n * Rejects injection vectors: semicolons, line-comment markers, block-comment markers.\n *\n * @security Called before any ModelIR-sourced string is interpolated into DDL.\n * @param sql The raw SQL expression string to validate.\n * @param context Human-readable context label for the error message.\n * @throws Error if the expression contains forbidden characters.\n */\nexport function validateSqlExpression(sql: string, context: string): void {\n\tassertString(sql, `Unsafe SQL expression in ${context}`);\n\n\t// Forbidden: semicolons (statement injection), line comments (--),\n\t// block comment openers (/*), block comment closers (*/) — defense-in-depth\n\t// so a partial payload cannot close an enclosing comment to inject SQL —\n\t// dollar-quoted strings ($$), backslashes.\n\tif (/[;]|--|\\/\\*|\\*\\/|\\$\\$|\\\\/.test(sql)) {\n\t\tthrow new Error(\n\t\t\t`Unsafe SQL expression in ${context}: contains forbidden characters (;, --, /*, */, \"$$\" (dollar-quoted strings), \\\\). Value: \"${sql}\"`,\n\t\t);\n\t}\n}\n\n/**\n * Validate a raw CHECK constraint expression, allowing forbidden-looking tokens\n * inside PostgreSQL string literals while still rejecting them outside literals.\n *\n * This intentionally does not parse CHECK semantics. It only tracks enough\n * PostgreSQL literal context to catch accidental or malformed unsafe tokens in\n * machine-produced strings without false positives for inert quoted text.\n * It tracks standard, escape, and Unicode-escape single-quoted strings, plus\n * dollar-quoted strings. A backslash in an ordinary quoted string is rejected\n * because its meaning depends on\n * `standard_conforming_strings` in the session that eventually applies DDL.\n * Escape strings (`E'...'`) are setting-independent. Unicode-escape strings\n * (`U&'...'`) are still scanned as literals so inert text inside them cannot\n * be mistaken for SQL, but are refused because PostgreSQL only accepts that\n * spelling when `standard_conforming_strings` is enabled.\n *\n * @security This is not a trust boundary against an author who controls the\n * schema definition. A comma is legal inside an expression, so that boundary\n * cannot be established lexically; #425 tracks this remaining authored-CHECK\n * surface.\n * @param sql The raw CHECK expression string to validate.\n * @param context Human-readable context label for the error message.\n * @throws Error if the expression contains unsafe tokens outside literals or an\n * unterminated literal.\n */\nexport function validateCheckExpression(sql: string, context: string): void {\n\tif (typeof sql !== 'string') {\n\t\tthrow new Error(\n\t\t\t`Unsafe SQL expression in ${context}: expected a string, received ${typeof sql}`,\n\t\t);\n\t}\n\n\tlet i = 0;\n\tlet singleQuoted = false;\n\tlet escapeSingleQuoted = false;\n\tlet settingIndependentSingleQuoted = false;\n\tlet unicodeEscapeSingleQuoted = false;\n\tlet doubleQuotedIdentifier = false;\n\tlet dollarQuoteDelimiter: string | undefined;\n\n\twhile (i < sql.length) {\n\t\tif (singleQuoted) {\n\t\t\tif (escapeSingleQuoted && sql[i] === '\\\\') {\n\t\t\t\ti += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!settingIndependentSingleQuoted && sql[i] === '\\\\') {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Unsafe SQL expression in ${context}: contains a backslash in an ordinary single-quoted string literal, whose meaning depends on PostgreSQL standard_conforming_strings; use E'...' for a setting-independent string literal. Value: \"${sql}\"`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (sql[i] === \"'\") {\n\t\t\t\tif (sql[i + 1] === \"'\") {\n\t\t\t\t\ti += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tsingleQuoted = false;\n\t\t\t\tescapeSingleQuoted = false;\n\t\t\t\tsettingIndependentSingleQuoted = false;\n\t\t\t\tif (unicodeEscapeSingleQuoted) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unsafe SQL expression in ${context}: contains a Unicode-escape string literal (U&'...'), which PostgreSQL accepts only when standard_conforming_strings is enabled; use an ordinary single-quoted literal or E'...' instead. Value: \"${sql}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tunicodeEscapeSingleQuoted = false;\n\t\t\t}\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (dollarQuoteDelimiter) {\n\t\t\tif (sql.startsWith(dollarQuoteDelimiter, i)) {\n\t\t\t\ti += dollarQuoteDelimiter.length;\n\t\t\t\tdollarQuoteDelimiter = undefined;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (doubleQuotedIdentifier) {\n\t\t\tif (sql[i] === '\"') {\n\t\t\t\tif (sql[i + 1] === '\"') {\n\t\t\t\t\ti += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tdoubleQuotedIdentifier = false;\n\t\t\t}\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isEscapeStringStart(sql, i)) {\n\t\t\tsingleQuoted = true;\n\t\t\tescapeSingleQuoted = true;\n\t\t\tsettingIndependentSingleQuoted = true;\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isUnicodeEscapeStringStart(sql, i)) {\n\t\t\tsingleQuoted = true;\n\t\t\tsettingIndependentSingleQuoted = true;\n\t\t\tunicodeEscapeSingleQuoted = true;\n\t\t\ti += 3;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (sql[i] === \"'\") {\n\t\t\tsingleQuoted = true;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (sql[i] === '\"') {\n\t\t\tdoubleQuotedIdentifier = true;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst dollarDelimiter = readDollarQuoteDelimiter(sql, i);\n\t\tif (dollarDelimiter) {\n\t\t\tdollarQuoteDelimiter = dollarDelimiter;\n\t\t\ti += dollarDelimiter.length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst forbiddenToken = forbiddenCheckTokenAt(sql, i);\n\t\tif (forbiddenToken) {\n\t\t\tthrow new Error(\n\t\t\t\t`Unsafe SQL expression in ${context}: contains forbidden token \"${forbiddenToken}\" outside string literal. Value: \"${sql}\"`,\n\t\t\t);\n\t\t}\n\n\t\ti++;\n\t}\n\n\tif (singleQuoted) {\n\t\tthrow new Error(\n\t\t\t`Unsafe SQL expression in ${context}: unterminated single-quoted string literal. Value: \"${sql}\"`,\n\t\t);\n\t}\n\n\tif (dollarQuoteDelimiter) {\n\t\tthrow new Error(\n\t\t\t`Unsafe SQL expression in ${context}: unterminated dollar-quoted string literal ${dollarQuoteDelimiter}. Value: \"${sql}\"`,\n\t\t);\n\t}\n\n\tif (doubleQuotedIdentifier) {\n\t\tthrow new Error(\n\t\t\t`Unsafe SQL expression in ${context}: unterminated double-quoted identifier. Value: \"${sql}\"`,\n\t\t);\n\t}\n}\n\nfunction isEscapeStringStart(sql: string, index: number): boolean {\n\tif (sql[index] !== 'E' && sql[index] !== 'e') return false;\n\tif (sql[index + 1] !== \"'\") return false;\n\n\tconst previous = index > 0 ? sql[index - 1] : undefined;\n\treturn !(\n\t\tprevious && isIdentifierContinuationBeforeStringLiteralPrefix(previous)\n\t);\n}\n\nfunction isUnicodeEscapeStringStart(sql: string, index: number): boolean {\n\tif (sql[index] !== 'U' && sql[index] !== 'u') return false;\n\tif (sql[index + 1] !== '&' || sql[index + 2] !== \"'\") return false;\n\n\tconst previous = index > 0 ? sql[index - 1] : undefined;\n\treturn !(\n\t\tprevious && isIdentifierContinuationBeforeStringLiteralPrefix(previous)\n\t);\n}\n\nfunction forbiddenCheckTokenAt(sql: string, index: number): string | undefined {\n\tconst ch = sql[index];\n\tif (ch === ';') return ch;\n\n\tconst pair = sql.slice(index, index + 2);\n\tif (pair === '--' || pair === '/*' || pair === '*/') return pair;\n\n\treturn undefined;\n}\n\nfunction readDollarQuoteDelimiter(\n\tsql: string,\n\tindex: number,\n): string | undefined {\n\tif (sql[index] !== '$') return undefined;\n\tconst previous = index > 0 ? sql[index - 1] : undefined;\n\tif (previous && isIdentifierContinuationBeforeStringLiteralPrefix(previous)) {\n\t\treturn undefined;\n\t}\n\n\tif (sql[index + 1] === '$') return '$$';\n\tif (!isDollarQuoteTagStart(sql[index + 1])) return undefined;\n\n\tlet cursor = index + 2;\n\twhile (isDollarQuoteTagContinuation(sql[cursor])) {\n\t\tcursor++;\n\t}\n\n\tif (sql[cursor] !== '$') return undefined;\n\treturn sql.slice(index, cursor + 1);\n}\n\nfunction isIdentifierContinuationBeforeStringLiteralPrefix(\n\tch: string,\n): boolean {\n\t// PostgreSQL also permits \"$\" after the first identifier character; blocking\n\t// a literal prefix immediately after \"$\" prevents opening inside identifiers\n\t// such as a$$tag$.\n\treturn /[A-Za-z0-9_$]/.test(ch) || (ch.codePointAt(0) ?? 0) > 127;\n}\n\nfunction isDollarQuoteTagStart(ch: string | undefined): boolean {\n\treturn ch !== undefined && /[A-Za-z_]/.test(ch);\n}\n\nfunction isDollarQuoteTagContinuation(ch: string | undefined): boolean {\n\treturn ch !== undefined && /[A-Za-z0-9_]/.test(ch);\n}\n\n/**\n * Validate a PostgreSQL type name coming from `originalDbType` (populated by introspection).\n * Rejects strings that do not match the PostgreSQL type-name grammar to prevent injection.\n *\n * @security Called before any originalDbType value is interpolated into DDL column types.\n * @param type The type name string to validate.\n * @returns The original string (unchanged) when valid.\n * @throws Error if the type name does not match the safe pattern.\n */\nexport function validateDbTypeName(type: string): string {\n\tassertString(type, 'Unsafe database type name');\n\treturn validateDbType(type);\n}\n","import type {\n\tAdvisoryObservationId,\n\tAssumptionId,\n\tEvidenceId,\n\tSemanticArtifactId,\n} from '@dbsp/types';\n\nexport function semanticArtifactId(value: string): SemanticArtifactId {\n\treturn value as SemanticArtifactId;\n}\n\nexport function assumptionId(value: string): AssumptionId {\n\treturn value as AssumptionId;\n}\n\nexport function evidenceId(value: string): EvidenceId {\n\treturn value as EvidenceId;\n}\n\nexport function advisoryObservationId(value: string): AdvisoryObservationId {\n\treturn value as AdvisoryObservationId;\n}\n","import type { OperationKindRef, SemanticArtifactRef } from '@dbsp/types';\nimport { semanticArtifactId } from './ids.js';\n\nexport const PG_OPERATION_PACK_ARTIFACT: SemanticArtifactRef = {\n\tid: semanticArtifactId('dbsp.postgresql.operations.pg18'),\n\tversion: '0.1.0',\n};\n\nexport const PG_RULE_PACK_ARTIFACT: SemanticArtifactRef = {\n\tid: semanticArtifactId('dbsp.postgresql.rules.pg18'),\n\tversion: '0.1.0',\n};\n\nexport const PG_EQUIVALENCE_ARTIFACT: SemanticArtifactRef = {\n\tid: semanticArtifactId('dbsp.postgresql.equivalence.pg18'),\n\tversion: '0.1.0',\n};\n\nexport const PG_DEPARSE_ARTIFACT: SemanticArtifactRef = {\n\tid: semanticArtifactId('dbsp.postgresql.deparser.pg18'),\n\tversion: '0.1.0',\n};\n\nexport const PG_INTROSPECTION_ARTIFACT: SemanticArtifactRef = {\n\tid: semanticArtifactId('dbsp.postgresql.introspection.pg18'),\n\tversion: '0.1.0',\n};\n\nexport const ALTER_COLUMN_SET_NOT_NULL_OPERATION_KIND: OperationKindRef = {\n\tartifact: PG_OPERATION_PACK_ARTIFACT,\n\tname: 'AlterColumnSetNotNull',\n};\n\nexport const ALTER_TABLE_ADD_CHECK_OPERATION_KIND: OperationKindRef = {\n\tartifact: PG_OPERATION_PACK_ARTIFACT,\n\tname: 'AlterTableAddCheck',\n};\n\nexport const ALTER_TYPE_ADD_VALUE_OPERATION_KIND: OperationKindRef = {\n\tartifact: PG_OPERATION_PACK_ARTIFACT,\n\tname: 'AlterTypeAddValue',\n};\n\nexport const CREATE_UNIQUE_INDEX_CONCURRENTLY_OPERATION_KIND: OperationKindRef =\n\t{\n\t\tartifact: PG_OPERATION_PACK_ARTIFACT,\n\t\tname: 'CreateUniqueIndexConcurrently',\n\t};\n\nexport const ATTACH_LOGICAL_IDENTITY_OPERATION_KIND: OperationKindRef = {\n\tartifact: PG_OPERATION_PACK_ARTIFACT,\n\tname: 'AttachLogicalIdentity',\n};\n\nexport const MANUAL_SQL_OPERATION_KIND: OperationKindRef = {\n\tartifact: PG_OPERATION_PACK_ARTIFACT,\n\tname: 'ManualSql',\n};\n\nexport const SET_NOT_NULL_RULE_ID = 'postgresql.column.set-not-null';\nexport const ADD_CHECK_RULE_ID = 'postgresql.table.add-check';\nexport const ENUM_ADD_VALUE_RULE_ID = 'postgresql.enum.add-value';\nexport const CREATE_UNIQUE_INDEX_CONCURRENTLY_RULE_ID =\n\t'postgresql.index.create-unique-concurrently';\nexport const LOGICAL_IDENTITY_ADOPTION_RULE_ID =\n\t'postgresql.logical-identity.adopt';\nexport const ALTER_COLUMN_SET_NOT_NULL_CAPABILITY = 'alter-column-set-not-null';\nexport const ALTER_COLUMN_SET_NOT_NULL_MIN_SERVER_VERSION_NUM = 180000;\nexport const ALTER_TABLE_ADD_CHECK_CAPABILITY = 'alter-table-add-check';\nexport const ALTER_TABLE_ADD_CHECK_MIN_SERVER_VERSION_NUM = 180000;\nexport const ALTER_TYPE_ADD_VALUE_CAPABILITY = 'alter-type-add-value';\nexport const ALTER_TYPE_ADD_VALUE_MIN_SERVER_VERSION_NUM = 120000;\nexport const CREATE_UNIQUE_INDEX_CONCURRENTLY_CAPABILITY =\n\t'create-unique-index-concurrently';\nexport const CREATE_UNIQUE_INDEX_CONCURRENTLY_MIN_SERVER_VERSION_NUM = 120000;\nexport const PG_SCHEMA_USAGE_PRIVILEGE = 'postgresql.schema.usage';\nexport const PG_TABLE_ALTER_AUTHORITY_PRIVILEGE =\n\t'postgresql.table.alter-authority';\nexport const PG_TYPE_ALTER_AUTHORITY_PRIVILEGE =\n\t'postgresql.type.alter-authority';\nexport const PG_SET_NOT_NULL_AUTHORITY_PRIVILEGE =\n\t'postgresql.column.set-not-null.authority';\n\nexport const DBSP_META_SCHEMA = 'dbsp_meta';\nexport const DBSP_TRANSITION_RUN_TABLE = 'dbsp_transition_run';\nexport const DBSP_TRANSITION_RUN_PLAN_TABLE = 'dbsp_transition_run_plan';\nexport const DBSP_TRANSITION_JOURNAL_TABLE = 'dbsp_transition_journal';\nexport const DBSP_TRANSITION_AUTHORIZATION_TABLE =\n\t'dbsp_transition_authorization';\nexport const DBSP_LEDGER_EVENT_TABLE = 'dbsp_ledger_event';\nexport const DBSP_LEDGER_RESERVATION_TABLE = 'dbsp_ledger_reservation';\nexport const DBSP_LEDGER_IDENTITY_TABLE = 'dbsp_ledger_identity';\nexport const DBSP_LEDGER_MARKER_TABLE = 'dbsp_ledger_marker';\n/**\n * The ledger may live in a managed schema, but it is never part of that\n * schema's user model. Keep the family in one exported definition so every\n * model-vs-live surface makes the same exclusion.\n */\nexport const DBSP_LEDGER_TABLES = [\n\tDBSP_LEDGER_EVENT_TABLE,\n\tDBSP_LEDGER_RESERVATION_TABLE,\n\tDBSP_LEDGER_IDENTITY_TABLE,\n\tDBSP_LEDGER_MARKER_TABLE,\n] as const;\n\n/** True exactly for dbsp's schema-local ledger infrastructure. */\nexport function isDbspLedgerInfrastructureTable(\n\ttableName: string,\n): tableName is (typeof DBSP_LEDGER_TABLES)[number] {\n\treturn (DBSP_LEDGER_TABLES as readonly string[]).includes(tableName);\n}\nexport const DBSP_LOGICAL_IDENTITY_TABLE = 'dbsp_logical_identity';\nexport const DBSP_LOGICAL_IDENTITY_MARKER_COLUMN = 'dbsp_managed_by';\nexport const DBSP_LOGICAL_IDENTITY_MARKER_VALUE = `${PG_OPERATION_PACK_ARTIFACT.id}@${PG_OPERATION_PACK_ARTIFACT.version}`;\n\nexport const COLUMN_EXISTS_OBSERVATION = 'postgresql.column.exists';\nexport const TABLE_CHECK_CONSTRAINTS_OBSERVATION =\n\t'postgresql.table.check-constraints';\nexport const CHECK_CONSTRAINT_ABSENT_OBSERVATION =\n\t'postgresql.table.check-constraint.absent';\nexport const TABLE_INDEXES_OBSERVATION = 'postgresql.table.indexes';\nexport const INDEX_ABSENT_OBSERVATION = 'postgresql.index.absent';\nexport const ENUM_TYPE_EXISTS_OBSERVATION = 'postgresql.enum-type.exists';\nexport const ENUM_LABEL_VISIBLE_OBSERVATION = 'postgresql.enum-label.visible';\nexport const SET_NOT_NULL_RELATION_KIND_SUPPORTED_OBSERVATION =\n\t'postgresql.column.set-not-null.relation-kind-supported';\nexport const SET_NOT_NULL_PARTITIONED_TABLE_UNSUPPORTED_DETAIL =\n\t'partitioned tables are not yet supported by the SET NOT NULL transition';\nexport const ALTER_AUTHORITY_OBSERVATION = 'postgresql.table.alter-authority';\nexport const ALTER_TYPE_AUTHORITY_OBSERVATION =\n\t'postgresql.type.alter-authority';\nexport const ENGINE_VERSION_OBSERVATION = 'postgresql.engine.version-supported';\nexport const EXPRESSION_DEPARSE_OBSERVATION = 'postgresql.expression.deparse';\nexport const LOGICAL_IDENTITY_CARRIER_OBSERVATION =\n\t'postgresql.logical-identity.carrier-state';\n\nexport const NO_NULLS_GUARD = 'NO_NULLS';\nexport const CHECK_ROWS_SATISFY_GUARD = 'CHECK_ROWS_SATISFY';\nexport const NO_DUPLICATES_FOR_UNIQUE_INDEX_BUILD_GUARD =\n\t'NO_DUPLICATES_FOR_UNIQUE_INDEX_BUILD';\n","import { POSTGRESQL_CAPABILITIES, serverVersionNum } from '@dbsp/core';\nimport type { DialectCapabilities } from '@dbsp/types';\nimport {\n\tINDEX_INCLUDE_CAPABILITY,\n\tINDEX_NULLS_NOT_DISTINCT_CAPABILITY,\n} from './transition/index-feature-capabilities.js';\n\nconst POSTGRESQL_CAPABILITY_FLOOR = serverVersionNum('10')!;\nconst STRICT_POSTGRESQL_VERSION_RE = /^\\d+(\\.\\d+){0,2}$/;\nconst POSTGRESQL_CAPABILITY_TARGET_VERSIONS = new WeakMap<\n\tDialectCapabilities,\n\tstring\n>();\ntype MutableDialectCapabilities = {\n\t-readonly [K in keyof DialectCapabilities]: DialectCapabilities[K];\n};\n\nconst INDEX_FEATURE_CAPABILITY_PROJECTIONS = [\n\t{\n\t\tdescriptor: INDEX_INCLUDE_CAPABILITY,\n\t\tflag: 'supportsDDLIndexInclude',\n\t},\n\t{\n\t\tdescriptor: INDEX_NULLS_NOT_DISTINCT_CAPABILITY,\n\t\tflag: 'supportsDDLIndexNullsNotDistinct',\n\t},\n] as const satisfies readonly {\n\treadonly descriptor:\n\t\t| typeof INDEX_INCLUDE_CAPABILITY\n\t\t| typeof INDEX_NULLS_NOT_DISTINCT_CAPABILITY;\n\treadonly flag: keyof DialectCapabilities;\n}[];\n\nexport function derivePostgresqlCapabilitiesForVersion(\n\tversion: string,\n): DialectCapabilities {\n\tconst trimmed = version.trim();\n\tif (!STRICT_POSTGRESQL_VERSION_RE.test(trimmed)) {\n\t\tthrow new Error(`Invalid PostgreSQL version \"${version}\"`);\n\t}\n\tif (/^\\d{5,}$/.test(trimmed)) {\n\t\tthrow new Error(\n\t\t\t`PostgreSQL version \"${version}\" must be a dotted or major version string, not server_version_num form`,\n\t\t);\n\t}\n\t// serverVersionNum packs non-major segments as (minor*100 + patch); a minor or\n\t// patch >= 100 overflows into the next major (e.g. \"14.100\" -> 150000 = PG15),\n\t// which would falsely enable a version-gated feature. A real PostgreSQL version\n\t// never has a minor/patch segment >= 100, so reject it rather than mis-gate.\n\tif (\n\t\ttrimmed\n\t\t\t.split('.')\n\t\t\t.slice(1)\n\t\t\t.some((segment) => Number(segment) >= 100)\n\t) {\n\t\tthrow new Error(\n\t\t\t`Invalid PostgreSQL version \"${version}\": minor/patch segments must be below 100`,\n\t\t);\n\t}\n\n\tconst actual = serverVersionNum(trimmed);\n\tif (actual === undefined) {\n\t\tthrow new Error(`Invalid PostgreSQL version \"${version}\"`);\n\t}\n\tif (actual < POSTGRESQL_CAPABILITY_FLOOR) {\n\t\tthrow new Error(\n\t\t\t`Unsupported PostgreSQL version \"${version}\"; minimum supported major version is 10`,\n\t\t);\n\t}\n\n\tconst caps: MutableDialectCapabilities = { ...POSTGRESQL_CAPABILITIES };\n\tfor (const projection of INDEX_FEATURE_CAPABILITY_PROJECTIONS) {\n\t\tif (actual < projection.descriptor.predicate.minServerVersionNum) {\n\t\t\tcaps[projection.flag] = false;\n\t\t}\n\t}\n\tPOSTGRESQL_CAPABILITY_TARGET_VERSIONS.set(caps, trimmed);\n\treturn caps;\n}\n\nexport function getPostgresqlCapabilitiesTargetVersion(\n\tcaps: DialectCapabilities,\n): string | undefined {\n\treturn POSTGRESQL_CAPABILITY_TARGET_VERSIONS.get(caps);\n}\n","import type { CapabilityDescriptor } from '@dbsp/types';\n\nexport const INDEX_INCLUDE_CAPABILITY = {\n\tid: 'index-include',\n\tpredicate: {\n\t\tkind: 'minServerVersionNum',\n\t\tminServerVersionNum: 110000,\n\t},\n} as const satisfies CapabilityDescriptor;\n\nexport const INDEX_NULLS_NOT_DISTINCT_CAPABILITY = {\n\tid: 'index-nulls-not-distinct',\n\tpredicate: {\n\t\tkind: 'minServerVersionNum',\n\t\tminServerVersionNum: 150000,\n\t},\n} as const satisfies CapabilityDescriptor;\n","import type { CapabilityDescriptor } from '@dbsp/types';\n\nexport {\n\tINDEX_INCLUDE_CAPABILITY,\n\tINDEX_NULLS_NOT_DISTINCT_CAPABILITY,\n} from '../ddl/index-feature-capabilities.js';\n\nimport {\n\tCREATE_UNIQUE_INDEX_CONCURRENTLY_CAPABILITY,\n\tCREATE_UNIQUE_INDEX_CONCURRENTLY_MIN_SERVER_VERSION_NUM,\n} from './constants.js';\n\nexport const CREATE_UNIQUE_INDEX_CONCURRENTLY_CAPABILITY_DESCRIPTOR = {\n\tid: CREATE_UNIQUE_INDEX_CONCURRENTLY_CAPABILITY,\n\tpredicate: {\n\t\tkind: 'minServerVersionNum',\n\t\tminServerVersionNum:\n\t\t\tCREATE_UNIQUE_INDEX_CONCURRENTLY_MIN_SERVER_VERSION_NUM,\n\t},\n} as const satisfies CapabilityDescriptor;\n","import { POSTGRESQL_CAPABILITIES } from '@dbsp/core';\nimport type { DialectCapabilities, IndexIR } from '@dbsp/types';\nimport { isEngineCanonicalIndex } from '../expression-provenance.js';\nimport {\n\tformatStorageParameterValue,\n\tvalidateCheckExpression,\n\tvalidateIdentifier,\n\tvalidateSqlExpression,\n} from '../validate.js';\nimport {\n\tINDEX_INCLUDE_CAPABILITY,\n\tINDEX_NULLS_NOT_DISTINCT_CAPABILITY,\n} from './index-feature-capabilities.js';\nimport { quoteIdent, validateIndexMethod } from './phases/utils.js';\nimport { escapeCanonicalSqlLiterals } from './rendered-sql.js';\n\nexport type IndexRenderKey = {\n\treadonly column?: string | undefined;\n\treadonly expression?: string | undefined;\n\treadonly opclass?: string | undefined;\n};\n\nexport type IndexRenderSpec = {\n\treadonly name: string;\n\treadonly table: string;\n\treadonly schema?: string | undefined;\n\treadonly unique: boolean;\n\treadonly method?: string | undefined;\n\treadonly keys: readonly IndexRenderKey[];\n\treadonly include?: readonly string[] | undefined;\n\treadonly nullsNotDistinct?: boolean | undefined;\n\treadonly with?: Readonly<Record<string, unknown>> | undefined;\n\treadonly where?: string | undefined;\n\t/** The in-process index value that owns a deparsed `where` predicate. */\n\treadonly whereSource?: IndexIR | undefined;\n\treadonly concurrently?: boolean | undefined;\n\treadonly ifNotExists?: boolean | undefined;\n};\n\nexport type IndexCapabilityContext = {\n\treadonly caps: DialectCapabilities;\n\treadonly targetVersion?: string | undefined;\n};\n\ntype IndexFeature =\n\t| 'INCLUDE'\n\t| 'PARTIAL INDEX'\n\t| 'EXPRESSION INDEX'\n\t| 'INDEX METHOD'\n\t| 'OPCLASS'\n\t| 'NULLS NOT DISTINCT';\n\ntype FeatureDeclaration = {\n\treadonly feature: IndexFeature;\n\treadonly capability: keyof DialectCapabilities;\n\treadonly present: (spec: IndexRenderSpec) => boolean;\n\treadonly minServerVersionNum?: number;\n};\n\nconst INDEX_FEATURE_DECLARATIONS: readonly FeatureDeclaration[] = [\n\t{\n\t\tfeature: 'INCLUDE',\n\t\tcapability: 'supportsDDLIndexInclude',\n\t\tpresent: (spec) => (spec.include?.length ?? 0) > 0,\n\t\tminServerVersionNum: INDEX_INCLUDE_CAPABILITY.predicate.minServerVersionNum,\n\t},\n\t{\n\t\tfeature: 'PARTIAL INDEX',\n\t\tcapability: 'supportsDDLPartialIndexes',\n\t\tpresent: (spec) => spec.where !== undefined,\n\t},\n\t{\n\t\tfeature: 'EXPRESSION INDEX',\n\t\tcapability: 'supportsDDLExpressionIndexes',\n\t\tpresent: (spec) => spec.keys.some((key) => key.expression !== undefined),\n\t},\n\t{\n\t\tfeature: 'INDEX METHOD',\n\t\tcapability: 'supportsDDLIndexMethods',\n\t\tpresent: (spec) => spec.method !== undefined && spec.method.length > 0,\n\t},\n\t{\n\t\tfeature: 'OPCLASS',\n\t\tcapability: 'supportsDDLIndexOpclass',\n\t\tpresent: (spec) => spec.keys.some((key) => key.opclass !== undefined),\n\t},\n\t{\n\t\tfeature: 'NULLS NOT DISTINCT',\n\t\tcapability: 'supportsDDLIndexNullsNotDistinct',\n\t\tpresent: (spec) => spec.nullsNotDistinct === true,\n\t\tminServerVersionNum:\n\t\t\tINDEX_NULLS_NOT_DISTINCT_CAPABILITY.predicate.minServerVersionNum,\n\t},\n];\n\nexport class IndexFeatureUnsupportedError extends Error {\n\treadonly indexName: string;\n\treadonly unsupportedFeatures: readonly IndexFeature[];\n\n\tconstructor(\n\t\tindexName: string,\n\t\tunsupportedFeatures: readonly IndexFeature[],\n\t\tmessage: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'IndexFeatureUnsupportedError';\n\t\tthis.indexName = indexName;\n\t\tthis.unsupportedFeatures = unsupportedFeatures;\n\t}\n}\n\nfunction formatServerVersion(versionNum: number): string {\n\tconst major = Math.trunc(versionNum / 10_000);\n\tconst minor = Math.trunc((versionNum % 10_000) / 100);\n\treturn minor === 0 ? String(major) : `${major}.${minor}`;\n}\n\nfunction unsupportedMessage(\n\tspec: IndexRenderSpec,\n\tfeature: FeatureDeclaration,\n\tctx: IndexCapabilityContext,\n): string {\n\tif (ctx.targetVersion && feature.minServerVersionNum !== undefined) {\n\t\treturn `index \\`${spec.name}\\`: ${feature.feature} requires PostgreSQL >= ${formatServerVersion(feature.minServerVersionNum)} (target ${ctx.targetVersion})`;\n\t}\n\treturn `index \\`${spec.name}\\`: ${feature.feature} is not enabled in the supplied dialect capabilities`;\n}\n\nfunction hasNonEmptyColumn(key: IndexRenderKey): boolean {\n\treturn key.column !== undefined && key.column.trim().length > 0;\n}\n\nfunction hasNonEmptyExpression(key: IndexRenderKey): boolean {\n\treturn key.expression !== undefined && key.expression.trim().length > 0;\n}\n\nexport function assertCreateIndexSupported(\n\tspec: IndexRenderSpec,\n\tctx: IndexCapabilityContext = { caps: POSTGRESQL_CAPABILITIES },\n): void {\n\tif (spec.keys.length === 0) {\n\t\tthrow new Error(\n\t\t\t`index \\`${spec.name}\\`: CREATE INDEX requires at least one key`,\n\t\t);\n\t}\n\tfor (const [index, key] of spec.keys.entries()) {\n\t\tconst hasColumn = hasNonEmptyColumn(key);\n\t\tconst hasExpression = hasNonEmptyExpression(key);\n\t\tif (!hasColumn && !hasExpression) {\n\t\t\tthrow new Error(\n\t\t\t\t`index \\`${spec.name}\\`: CREATE INDEX key #${index + 1} must declare a non-empty column or expression`,\n\t\t\t);\n\t\t}\n\t\tif (hasColumn && hasExpression) {\n\t\t\tthrow new Error(\n\t\t\t\t`index \\`${spec.name}\\`: CREATE INDEX key #${index + 1} must not declare both column and expression`,\n\t\t\t);\n\t\t}\n\t}\n\tif (spec.nullsNotDistinct === true && !spec.unique) {\n\t\tthrow new Error(\n\t\t\t`index \\`${spec.name}\\`: NULLS NOT DISTINCT is only valid for UNIQUE indexes`,\n\t\t);\n\t}\n\n\tconst unsupported = INDEX_FEATURE_DECLARATIONS.filter(\n\t\t(feature) => feature.present(spec) && ctx.caps[feature.capability] !== true,\n\t);\n\tif (unsupported.length === 0) {\n\t\treturn;\n\t}\n\n\tthrow new IndexFeatureUnsupportedError(\n\t\tspec.name,\n\t\tunsupported.map((feature) => feature.feature),\n\t\tunsupported\n\t\t\t.map((feature) => unsupportedMessage(spec, feature, ctx))\n\t\t\t.join('; '),\n\t);\n}\n\nexport function assertCreateIndexesSupported(\n\tspecs: readonly IndexRenderSpec[],\n\tctx: IndexCapabilityContext = { caps: POSTGRESQL_CAPABILITIES },\n): void {\n\tconst unsupportedErrors: IndexFeatureUnsupportedError[] = [];\n\tfor (const spec of specs) {\n\t\ttry {\n\t\t\tassertCreateIndexSupported(spec, ctx);\n\t\t} catch (error) {\n\t\t\tif (error instanceof IndexFeatureUnsupportedError) {\n\t\t\t\tunsupportedErrors.push(error);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\tif (unsupportedErrors.length === 0) {\n\t\treturn;\n\t}\n\n\tthrow new IndexFeatureUnsupportedError(\n\t\tunsupportedErrors[0]!.indexName,\n\t\tunsupportedErrors.flatMap((error) => error.unsupportedFeatures),\n\t\tunsupportedErrors.map((error) => error.message).join('; '),\n\t);\n}\n\nfunction qualifyTable(table: string, schema?: string): string {\n\treturn schema\n\t\t? `${quoteIdent(schema, 'schema')}.${quoteIdent(table, 'table')}`\n\t\t: quoteIdent(table, 'table');\n}\n\nfunction renderKey(key: IndexRenderKey): string {\n\tif (hasNonEmptyColumn(key)) {\n\t\tconst columnName = key.column!;\n\t\tconst column = quoteIdent(columnName, 'alias');\n\t\tif (key.opclass !== undefined) {\n\t\t\tvalidateIdentifier(key.opclass, 'alias');\n\t\t}\n\t\treturn key.opclass ? `${column} ${key.opclass}` : column;\n\t}\n\tif (!hasNonEmptyExpression(key)) {\n\t\tthrow new Error(\n\t\t\t'Index render key must declare a non-empty column or expression',\n\t\t);\n\t}\n\tconst expression = key.expression!;\n\tvalidateSqlExpression(expression, 'index expression');\n\tif (key.opclass !== undefined) {\n\t\tvalidateIdentifier(key.opclass, 'alias');\n\t}\n\treturn key.opclass ? `${expression} ${key.opclass}` : expression;\n}\n\nexport function renderCreateIndex(\n\tspec: IndexRenderSpec,\n\tctx: IndexCapabilityContext = { caps: POSTGRESQL_CAPABILITIES },\n): string {\n\tassertCreateIndexSupported(spec, ctx);\n\n\tif (spec.method !== undefined) {\n\t\tvalidateIndexMethod(spec.method, 'index method');\n\t}\n\n\tconst parts: string[] = ['CREATE'];\n\tif (spec.unique) parts.push('UNIQUE');\n\tparts.push('INDEX');\n\tif (spec.concurrently) parts.push('CONCURRENTLY');\n\tif (spec.ifNotExists) parts.push('IF NOT EXISTS');\n\tparts.push(quoteIdent(spec.name, 'alias'));\n\tparts.push(`ON ${qualifyTable(spec.table, spec.schema)}`);\n\tif (spec.method) parts.push(`USING ${spec.method}`);\n\n\tparts.push(`(${spec.keys.map(renderKey).join(', ')})`);\n\n\tif (spec.include && spec.include.length > 0) {\n\t\tparts.push(\n\t\t\t`INCLUDE (${spec.include.map((col) => quoteIdent(col, 'alias')).join(', ')})`,\n\t\t);\n\t}\n\tif (spec.nullsNotDistinct === true) {\n\t\tparts.push('NULLS NOT DISTINCT');\n\t}\n\tif (spec.with && Object.keys(spec.with).length > 0) {\n\t\tconst withParams = Object.entries(spec.with)\n\t\t\t.map(([key, value]) => {\n\t\t\t\tvalidateIdentifier(key, 'alias');\n\t\t\t\treturn `${key} = ${formatStorageParameterValue(value, `index WITH parameter \"${key}\"`)}`;\n\t\t\t})\n\t\t\t.join(', ');\n\t\tparts.push(`WITH (${withParams})`);\n\t}\n\tconst where = spec.where;\n\tif (where !== undefined) {\n\t\t// Provenance lives on the frozen index object, not on a caller-controlled\n\t\t// boolean. A branded index can only bypass authored-input validation for\n\t\t// its exact deparsed predicate.\n\t\tconst canonicalPredicate =\n\t\t\tisEngineCanonicalIndex(spec.whereSource) &&\n\t\t\tspec.whereSource.where === where;\n\t\tif (!canonicalPredicate) {\n\t\t\tvalidateCheckExpression(where, 'index WHERE predicate');\n\t\t}\n\t\tparts.push(\n\t\t\t`WHERE ${canonicalPredicate ? escapeCanonicalSqlLiterals(where) : where}`,\n\t\t);\n\t}\n\n\treturn parts.join(' ');\n}\n","/** Provenance for expressions PostgreSQL deparsed from its own parse tree. */\nimport type { CheckConstraintIR, IndexIR } from '@dbsp/types';\n\nconst ENGINE_CANONICAL_EXPRESSION: unique symbol = Symbol(\n\t'dbsp.pgsql.engine-canonical-expression',\n);\n\n// Provenance is identity-based. A symbol property can be forged by a Proxy\n// which returns the symbol key from every symbol-valued `get`; private WeakSet\n// membership cannot be observed or reproduced outside this module.\nconst engineCanonicalSqlDefaults = new WeakSet<object>();\nconst engineCanonicalChecks = new WeakSet<object>();\nconst engineCanonicalIndexes = new WeakSet<object>();\n\n/** A string minted only after PostgreSQL deparsed one expression. */\nexport type EngineCanonicalExpression = string & {\n\treadonly [ENGINE_CANONICAL_EXPRESSION]: typeof ENGINE_CANONICAL_EXPRESSION;\n};\n\n/** A raw default wrapper whose SQL was produced by PostgreSQL's deparser. */\nexport type EngineCanonicalSqlDefault = {\n\treadonly sql: EngineCanonicalExpression;\n\treadonly [ENGINE_CANONICAL_EXPRESSION]: typeof ENGINE_CANONICAL_EXPRESSION;\n};\n\ntype EngineCanonicalCheck = CheckConstraintIR & {\n\treadonly [ENGINE_CANONICAL_EXPRESSION]: typeof ENGINE_CANONICAL_EXPRESSION;\n};\n\n/** An index whose predicate was read from PostgreSQL's deparser. */\ntype EngineCanonicalIndex = Omit<IndexIR, 'where'> & {\n\treadonly where: EngineCanonicalExpression;\n\treadonly [ENGINE_CANONICAL_EXPRESSION]: typeof ENGINE_CANONICAL_EXPRESSION;\n};\n\nexport function engineCanonicalSqlDefault(\n\texpression: EngineCanonicalExpression,\n): EngineCanonicalSqlDefault {\n\tconst value = { sql: expression } as EngineCanonicalSqlDefault;\n\tengineCanonicalSqlDefaults.add(value);\n\treturn Object.freeze(value);\n}\n\nexport function markEngineCanonicalCheck(\n\tcheck: CheckConstraintIR,\n): EngineCanonicalCheck {\n\tengineCanonicalChecks.add(check);\n\treturn Object.freeze(check) as EngineCanonicalCheck;\n}\n\nexport function isEngineCanonicalCheck(\n\tcheck: CheckConstraintIR,\n): check is EngineCanonicalCheck {\n\treturn engineCanonicalChecks.has(check);\n}\n\n/**\n * Attach non-serializable deparser provenance to the cloned index which owns\n * this predicate. Call this only with text read from PostgreSQL's deparser.\n */\nexport function markEngineCanonicalIndex(\n\tindex: Omit<IndexIR, 'where'> & { readonly where: EngineCanonicalExpression },\n): EngineCanonicalIndex {\n\tengineCanonicalIndexes.add(index);\n\treturn Object.freeze(index) as EngineCanonicalIndex;\n}\n\nexport function isEngineCanonicalIndex(\n\tindex: IndexIR | undefined,\n): index is EngineCanonicalIndex {\n\treturn index !== undefined && engineCanonicalIndexes.has(index);\n}\n\nexport function isEngineCanonicalSqlDefault(\n\tvalue: unknown,\n): value is EngineCanonicalSqlDefault {\n\treturn (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\tengineCanonicalSqlDefaults.has(value)\n\t);\n}\n","/**\n * Shared DDL phase utilities.\n *\n * Centralises identifier quoting with mandatory validation so every phase\n * funnels through `validateIdentifier()` before emitting DDL.\n *\n * @module ddl/phases/utils\n */\n\nimport { isEngineCanonicalSqlDefault } from '../../expression-provenance.js';\nimport {\n\tassertString,\n\tvalidateCollationName,\n\tvalidateExtensionName,\n\tvalidateIdentifier,\n\tvalidateSqlExpression,\n} from '../../validate.js';\nimport { escapeCanonicalSqlLiterals } from '../rendered-sql.js';\nimport type { PhaseContext } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Index method validation\n// ---------------------------------------------------------------------------\n\n/**\n * Valid PostgreSQL index access methods.\n * Used by validateIndexMethod() to reject unknown / injection-bearing strings.\n */\nconst VALID_INDEX_METHODS = new Set([\n\t'btree',\n\t'hash',\n\t'gist',\n\t'gin',\n\t'brin',\n\t'spgist',\n\t'hnsw',\n\t'ivfflat',\n\t'bm25',\n\t'bloom',\n]);\n\n/**\n * Validate a PostgreSQL index access method (USING clause).\n *\n * Method names are emitted unquoted into DDL (`USING btree`, `USING hnsw`),\n * so an allowlist is the only safe approach — regex-based checks cannot\n * guard all injection vectors for unquoted keywords.\n *\n * @security Allowlist — rejects anything not in VALID_INDEX_METHODS.\n * @param method Raw method name from IndexIR (e.g. `'btree'`, `'hnsw'`)\n * @param context Human-readable context for error messages\n * @throws Error when the method is not in the allowlist\n */\nexport function validateIndexMethod(\n\tmethod: string,\n\tcontext = 'index method',\n): void {\n\tassertString(method, `Invalid ${context}`);\n\n\tif (!VALID_INDEX_METHODS.has(method)) {\n\t\tthrow new Error(\n\t\t\t`Invalid ${context}: \"${method}\". Must be one of: ${[...VALID_INDEX_METHODS].join(', ')}`,\n\t\t);\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Enum label validation (shared by migration-sql.ts and enum-types.ts)\n// ---------------------------------------------------------------------------\n\n/**\n * Validate an enum label (single-quoted string value in CREATE TYPE ... AS ENUM,\n * ADD VALUE, or AFTER clause).\n *\n * Enum labels may be any printable string but must not contain NUL bytes or\n * control characters, which PostgreSQL silently truncates or rejects at the\n * protocol level.\n *\n * @param value The enum label to validate\n * @param context Human-readable context label for error messages\n * @throws Error if the label contains forbidden characters\n */\nexport function validateEnumLabel(value: string, context = 'enum label'): void {\n\tassertString(value, `Invalid ${context}`);\n\n\t// Reject NUL bytes — PostgreSQL truncates strings at the first NUL silently\n\tif (/\\x00/.test(value)) {\n\t\tthrow new Error(\n\t\t\t`Invalid ${context}: contains NUL byte (\\\\x00) which would be silently truncated by PostgreSQL`,\n\t\t);\n\t}\n\t// Reject control characters that have no valid use in enum labels\n\tif (/[\\x01-\\x1f\\x7f]/.test(value)) {\n\t\tthrow new Error(\n\t\t\t`Invalid ${context}: contains control characters (only printable characters allowed)`,\n\t\t);\n\t}\n}\n\n/**\n * Quote a PostgreSQL identifier for use in DDL statements.\n *\n * @security Always calls `validateIdentifier()` before quoting.\n * Escapes embedded double-quotes by doubling them as defense-in-depth.\n * Throws `InvalidIdentifierError` for identifiers that contain control\n * characters, injection vectors, or other forbidden patterns.\n *\n * @param name Raw identifier (table name, schema name, column name, …)\n * @param type Identifier type used for error context; one of\n * `'table' | 'column' | 'schema' | 'alias'` — defaults to `'alias'`\n * @returns Double-quoted identifier safe for DDL emission\n */\nexport function quoteIdent(\n\tname: string,\n\ttype: 'table' | 'column' | 'schema' | 'alias' = 'alias',\n): string {\n\tvalidateIdentifier(name, type);\n\treturn `\"${name.replace(/\"/g, '\"\"')}\"`;\n}\n\n/**\n * Quote a PostgreSQL extension name for use in CREATE EXTENSION DDL statements.\n *\n * Extension names allow hyphens and dots (e.g. `uuid-ossp`, `postgis-raster`)\n * which standard identifiers do not. This function calls `validateExtensionName()`\n * for injection-safety, then wraps the name in double-quotes so PostgreSQL\n * accepts hyphenated names without error.\n *\n * @security Always calls `validateExtensionName()` before quoting.\n * @param name Raw extension name (e.g. `uuid-ossp`)\n * @returns Double-quoted name safe for DDL emission (e.g. `\"uuid-ossp\"`)\n */\nexport function quoteExtensionName(name: string): string {\n\tvalidateExtensionName(name, 'extension');\n\t// No need to escape double-quotes inside — validateExtensionName rejects them.\n\treturn `\"${name}\"`;\n}\n\n/**\n * Quote a PostgreSQL collation name for use in DDL statements\n * (e.g. `COLLATE \"en_US.utf8\"`, `COLLATE \"en-US-x-icu\"`).\n *\n * Collation names differ from standard identifiers: they can contain dots\n * and hyphens to represent OS locale strings and ICU locale identifiers.\n * This function calls `validateCollationName()` for injection-safety, then\n * wraps the name in double-quotes for safe DDL emission.\n *\n * @security Always calls `validateCollationName()` before quoting.\n * @param name Raw collation name (e.g. `en_US.utf8`, `C.UTF-8`)\n * @returns Double-quoted collation name safe for DDL emission (e.g. `\"en_US.utf8\"`)\n */\nexport function quoteCollation(name: string): string {\n\tvalidateCollationName(name, 'collation');\n\t// No need to escape double-quotes inside — validateCollationName rejects them.\n\treturn `\"${name}\"`;\n}\n\n/**\n * Quote a PostgreSQL role name for use in DDL statements (e.g. CREATE POLICY ... TO).\n *\n * Role names may contain spaces and other characters not allowed in standard\n * identifiers (e.g. `\"app admin\"`, `\"read-only\"`), but must not contain\n * injection vectors such as semicolons, comment markers, or backslashes.\n *\n * @security Validates via validateSqlExpression() (blocks `;`, `--`, `/*`, `$$`, `\\`)\n * and rejects embedded double-quotes, NUL bytes, control characters, and names\n * exceeding PostgreSQL's NAMEDATALEN limit (63 bytes). Wraps the name in\n * double-quotes for safe DDL emission.\n *\n * @param name Raw role name (e.g. `app admin`)\n * @returns Double-quoted role name safe for DDL emission (e.g. `\"app admin\"`)\n */\nexport function quoteRoleName(name: string): string {\n\tassertString(name, 'quoteRoleName: role name');\n\n\tif (!name) {\n\t\tthrow new Error('quoteRoleName: role name must not be empty');\n\t}\n\t// Reject embedded double-quotes — no legitimate role name needs them inside\n\tif (name.includes('\"')) {\n\t\tthrow new Error(\n\t\t\t`quoteRoleName: role name \"${name}\" must not contain double-quote characters`,\n\t\t);\n\t}\n\t// Reject NUL bytes — PostgreSQL silently truncates at the first NUL\n\tif (/\\x00/.test(name)) {\n\t\tthrow new Error(\n\t\t\t`quoteRoleName: role name contains NUL byte (\\\\x00) which would be silently truncated by PostgreSQL`,\n\t\t);\n\t}\n\t// Reject other control characters (0x01-0x1F, 0x7F)\n\tif (/[\\x01-\\x1f\\x7f]/.test(name)) {\n\t\tthrow new Error(\n\t\t\t`quoteRoleName: role name contains control characters (only printable characters allowed)`,\n\t\t);\n\t}\n\t// Enforce PostgreSQL NAMEDATALEN: identifiers are truncated at 63 bytes.\n\t// We count bytes (not JS chars) because PostgreSQL uses strlen() semantics.\n\tconst byteLength = Buffer.byteLength(name, 'utf8');\n\tif (byteLength > 63) {\n\t\tthrow new Error(\n\t\t\t`quoteRoleName: role name exceeds PostgreSQL NAMEDATALEN limit of 63 bytes (got ${byteLength} bytes): \"${name}\"`,\n\t\t);\n\t}\n\t// Block injection vectors (semicolons, comments, dollar-quotes, backslash)\n\tvalidateSqlExpression(name, 'role name');\n\treturn `\"${name}\"`;\n}\n\n/**\n * Qualify a table name with an optional schema prefix.\n * Both the schema and table names are validated + quoted via `quoteIdent`.\n * The schema name is already a database identifier and must not be transformed\n * by the naming plugin.\n *\n * @param tableName Unqualified table name (pre-naming-plugin)\n * @param schemaName Optional database schema identifier\n * @param naming NamingPlugin from PhaseContext\n * @returns `\"schema\".\"table\"` or `\"table\"` if no schema\n */\nexport function qualifyTableIdent(\n\ttableName: string,\n\tschemaName: string | undefined,\n\tnaming: PhaseContext['naming'],\n): string {\n\tconst table = quoteIdent(naming.toDatabase(tableName), 'table');\n\tif (schemaName) {\n\t\treturn `${quoteIdent(schemaName, 'schema')}.${table}`;\n\t}\n\treturn table;\n}\n\n/**\n * Format a default value for safe SQL emission.\n *\n * Handles the following value types:\n * - `null` → `NULL`\n * - `{ sql: string }` → raw SQL expression (validated via validateCheckExpression)\n * - `string` ending with `()` → emitted unquoted as a bare function call (e.g. `now()`)\n * - `string` (other) → single-quoted literal with `'` escaped as `''` (e.g. `'hello''world'`)\n * - `number` → numeric literal\n * - `boolean` → `true` / `false`\n * - other → single-quoted string representation\n *\n * @security The `{ sql }` escape hatch is validated via validateCheckExpression()\n * before interpolation to prevent injection of multi-statement or comment-bearing strings.\n *\n * @param value The default value from ModelIR\n * @param context Human-readable label for error messages\n * @returns SQL-safe default clause fragment (without `DEFAULT` keyword)\n */\nexport function formatSqlDefault(\n\tvalue: unknown,\n\tcontext = 'column default',\n): string {\n\tif (value === null || value === undefined) return 'NULL';\n\n\t// { sql: string } escape hatch — emit verbatim after validation\n\tif (typeof value === 'object' && 'sql' in (value as object)) {\n\t\tif (isEngineCanonicalSqlDefault(value)) {\n\t\t\treturn escapeCanonicalSqlLiterals(value.sql);\n\t\t}\n\t\tconst rawSql = (value as Record<string, unknown>).sql;\n\t\tif (typeof rawSql !== 'string') {\n\t\t\tthrow new Error(\n\t\t\t\t`formatSqlDefault({ sql }): expected string, got ${typeof rawSql}`,\n\t\t\t);\n\t\t}\n\t\tvalidateSqlExpression(rawSql, context);\n\t\treturn rawSql;\n\t}\n\n\t// Function-like expressions (e.g. 'now()') — validate then emit unquoted\n\tif (typeof value === 'string') {\n\t\tif (value.endsWith('()')) {\n\t\t\tvalidateSqlExpression(value, context);\n\t\t\treturn value;\n\t\t}\n\t\treturn formatSqlStringLiteral(value);\n\t}\n\n\tif (typeof value === 'number') return String(value);\n\tif (typeof value === 'boolean') return value ? 'true' : 'false';\n\n\t// Fallback: single-quoted string representation\n\treturn formatSqlStringLiteral(String(value));\n}\n\n/** A scalar backslash must not inherit standard_conforming_strings semantics. */\nfunction formatSqlStringLiteral(value: string): string {\n\tconst escaped = value.replace(/'/g, \"''\");\n\treturn value.includes('\\\\')\n\t\t? `E'${escaped.replace(/\\\\/g, '\\\\\\\\')}'`\n\t\t: `'${escaped}'`;\n}\n","/**\n * Re-spell ordinary quoted literals with backslashes as PostgreSQL escape\n * strings. Call this only for SQL PostgreSQL itself deparsed: authored\n * expressions retain their normal validation path.\n *\n * An ordinary literal's backslashes are literal when\n * `standard_conforming_strings` is on. In an `E'…'` literal they are escape\n * characters, so double each one while adding the `E` prefix. The resulting\n * literal has the same value independently of that session setting.\n */\nexport function escapeCanonicalSqlLiterals(sql: string): string {\n\tlet i = 0;\n\tlet rewritten = '';\n\tlet copiedThrough = 0;\n\n\twhile (i < sql.length) {\n\t\tif (sql.startsWith('--', i)) {\n\t\t\tconst newline = sql.indexOf('\\n', i + 2);\n\t\t\ti = newline === -1 ? sql.length : newline + 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (sql.startsWith('/*', i)) {\n\t\t\tconst end = sql.indexOf('*/', i + 2);\n\t\t\ti = end === -1 ? sql.length : end + 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (sql[i] === '\"') {\n\t\t\ti = skipQuotedIdentifier(sql, i);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (sql[i] === \"'\") {\n\t\t\tconst ordinary =\n\t\t\t\t!isEscapeStringPrefix(sql, i) && !isUnicodeEscapeStringPrefix(sql, i);\n\t\t\tconst literal = scanSingleQuotedLiteral(sql, i);\n\t\t\tif (ordinary && literal.hasBackslash) {\n\t\t\t\trewritten +=\n\t\t\t\t\tsql.slice(copiedThrough, i) +\n\t\t\t\t\t\"E'\" +\n\t\t\t\t\tsql.slice(i + 1, literal.end - 1).replaceAll('\\\\', '\\\\\\\\') +\n\t\t\t\t\t\"'\";\n\t\t\t\tcopiedThrough = literal.end;\n\t\t\t}\n\t\t\ti = literal.end;\n\t\t\tcontinue;\n\t\t}\n\n\t\ti++;\n\t}\n\n\treturn rewritten === '' ? sql : rewritten + sql.slice(copiedThrough);\n}\n\nfunction skipQuotedIdentifier(sql: string, start: number): number {\n\tlet i = start + 1;\n\twhile (i < sql.length) {\n\t\tif (sql[i] === '\"') {\n\t\t\tif (sql[i + 1] === '\"') {\n\t\t\t\ti += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn i + 1;\n\t\t}\n\t\ti++;\n\t}\n\treturn i;\n}\n\nfunction isEscapeStringPrefix(sql: string, quote: number): boolean {\n\tconst prefix = sql[quote - 1];\n\tif (prefix !== 'E' && prefix !== 'e') return false;\n\tconst beforePrefix = sql[quote - 2];\n\treturn beforePrefix === undefined || !/[A-Za-z0-9_$]/u.test(beforePrefix);\n}\n\nfunction isUnicodeEscapeStringPrefix(sql: string, quote: number): boolean {\n\treturn (\n\t\tsql[quote - 1] === '&' &&\n\t\t(sql[quote - 2] === 'U' || sql[quote - 2] === 'u') &&\n\t\t(quote < 3 || !/[A-Za-z0-9_$]/u.test(sql[quote - 3]!))\n\t);\n}\n\nfunction scanSingleQuotedLiteral(\n\tsql: string,\n\tstart: number,\n): { readonly end: number; readonly hasBackslash: boolean } {\n\tlet hasBackslash = false;\n\tlet i = start + 1;\n\twhile (i < sql.length) {\n\t\tif (sql[i] === '\\\\') hasBackslash = true;\n\t\tif (sql[i] === \"'\") {\n\t\t\tif (sql[i + 1] === \"'\") {\n\t\t\t\ti += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn { end: i + 1, hasBackslash };\n\t\t}\n\t\ti++;\n\t}\n\treturn { end: i, hasBackslash };\n}\n","/**\n * Schema Comparison Engine (DDL-PROV Block 1)\n *\n * Compares two ModelIRs (schema definition vs database state)\n * and produces a structured diff of changes needed.\n *\n * @module schema-diff\n */\n\nimport { validateSchemaIndexOptions } from '@dbsp/core';\nimport type {\n\tCheckConstraintIR,\n\tColumnIR,\n\tDbCasing,\n\tDialectCapabilities,\n\tEnumIR,\n\tForeignKeyIR,\n\tIndexIR,\n\tModelIR,\n\tPartitionIR,\n\tPolicyIR,\n\tSequenceIR,\n\tTableIR,\n} from '@dbsp/types';\nimport {\n\tassertNoCheckConstraintNameCollisions,\n\tgetCheckConstraintDatabaseName,\n} from '../check-constraint-name.js';\nimport { splitCheckConstraintState } from '../check-expression.js';\nimport {\n\tcolumnDbTypeSchemaIdentity,\n\tdbTypesEqual,\n\tenumReferenceKind,\n\trenderColumnDbType,\n\tstripDbTypeSchema,\n} from '../db-type.js';\nimport {\n\tisEngineCanonicalCheck,\n\tisEngineCanonicalIndex,\n\tmarkEngineCanonicalCheck,\n\tmarkEngineCanonicalIndex,\n} from '../expression-provenance.js';\nimport {\n\tgetNamingPluginForDbCasing,\n\tidentityNaming,\n\ttype NamingPlugin,\n} from '../naming-plugin.js';\nimport { canGenerateCreateIndex } from './ddl-generator.js';\nimport { normalizeSequenceInteger } from './generated-source-normalizers.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ChangeKind =\n\t// Tables\n\t| 'create_table'\n\t| 'drop_table'\n\t| 'readdress_table'\n\t// Columns\n\t| 'add_column'\n\t| 'drop_column'\n\t| 'alter_column_type'\n\t| 'alter_column_nullable'\n\t| 'alter_column_default'\n\t| 'alter_column_unique'\n\t// Constraints\n\t| 'add_primary_key'\n\t| 'drop_primary_key'\n\t| 'add_foreign_key'\n\t| 'drop_foreign_key'\n\t| 'alter_foreign_key'\n\t| 'validate_constraint'\n\t// Indexes\n\t| 'create_index'\n\t| 'drop_index'\n\t// CHECK constraints\n\t| 'add_check_constraint'\n\t| 'drop_check_constraint'\n\t// ENUM types\n\t| 'create_enum'\n\t| 'alter_enum_add_value'\n\t| 'drop_enum'\n\t// Column enhancements\n\t| 'alter_column_collation'\n\t| 'alter_column_identity'\n\t// Comments\n\t| 'add_comment'\n\t| 'drop_comment'\n\t// Extensions\n\t| 'create_extension'\n\t| 'drop_extension'\n\t// Sequences\n\t| 'create_sequence'\n\t| 'alter_sequence'\n\t| 'drop_sequence'\n\t// Row-Level Security\n\t| 'enable_rls'\n\t| 'disable_rls'\n\t| 'create_policy'\n\t| 'drop_policy';\n\nexport interface SchemaChange {\n\treadonly kind: ChangeKind;\n\treadonly table: string;\n\treadonly column?: string;\n\treadonly destructive: boolean;\n\treadonly details: string;\n\t/** Additional metadata for SQL generation */\n\treadonly meta?: Readonly<Record<string, unknown>>;\n}\n\nexport interface DiffSummary {\n\treadonly tables: { readonly added: number; readonly dropped: number };\n\treadonly columns: {\n\t\treadonly added: number;\n\t\treadonly dropped: number;\n\t\treadonly altered: number;\n\t};\n\treadonly indexes: { readonly added: number; readonly dropped: number };\n\treadonly constraints: {\n\t\treadonly added: number;\n\t\treadonly dropped: number;\n\t\treadonly altered: number;\n\t};\n}\n\nexport interface SchemaDiff {\n\treadonly changes: readonly SchemaChange[];\n\treadonly hasDestructive: boolean;\n\treadonly summary: DiffSummary;\n}\n\n// ============================================================================\n// Options\n// ============================================================================\n\nexport interface CompareSchemataOptions {\n\t/**\n\t * Database naming convention.\n\t * When set, schema model names (camelCase) are converted to DB format\n\t * (e.g. snake_case) before comparison with the introspected model.\n\t */\n\tdbCasing?: DbCasing;\n\t/** Dialect capabilities — comparisons for unsupported features will be skipped */\n\treadonly dialectCapabilities?: DialectCapabilities;\n\t/**\n\t * When `true`, extensions present in the live DB but absent from the model\n\t * schema are silently ignored — no `drop_extension` change is emitted for them.\n\t * Only extensions explicitly declared in the model are managed (created if missing).\n\t *\n\t * Use this when the database image pre-installs extensions that the application\n\t * schema does not own (e.g. pgvector, pg_search bundled in a custom Postgres image).\n\t * Default: `false` (full-sync behaviour — unmanaged DB extensions produce a\n\t * `drop_extension` entry).\n\t */\n\treadonly ignoreUnmanagedExtensions?: boolean;\n\t/**\n\t * Strict compile-only mode for callers that require convergence guarantees.\n\t *\n\t * `compareSchemata()` is intentionally pure and cannot ask PostgreSQL to\n\t * canonicalise raw-SQL expression surfaces. By default it keeps the historic\n\t * best-effort verbatim comparison for column defaults, CHECK expressions,\n\t * partial-index predicates, and index expressions. Set this flag to throw when either model\n\t * contains one of those surfaces so a caller cannot accidentally rely on a\n\t * compile-only diff for a convergence-sensitive check.\n\t *\n\t * Live PostgreSQL callers should use `comparePgsqlDatabaseSchema()`, which\n\t * canonicalises CHECK constraint expressions, column defaults, and partial-index predicates before calling this function.\n\t * Under that live mode, each side is canonicalised independently; rejected\n\t * predicates refuse the migration and infrastructure fallback uses both raw\n\t * models. This does not prove\n\t * that the resulting migration is executable.\n\t * Index expressions are not canonicalised by the live helper and are rejected\n\t * there when this strict flag is set.\n\t */\n\treadonly requireExpressionCanonicalization?: boolean;\n}\n\nexport class ExpressionCanonicalizationUnavailableError extends Error {\n\tconstructor(public readonly surfaces: readonly string[]) {\n\t\tsuper(\n\t\t\t`Strict expression canonicalization was requested, but ${surfaces.length} raw SQL ` +\n\t\t\t\t'expression surfaces could not all be canonicalized. compareSchemata() is ' +\n\t\t\t\t'compile-only and cannot ask PostgreSQL to canonicalise CHECK constraints or ' +\n\t\t\t\t'column defaults, and partial-index predicates. comparePgsqlDatabaseSchema() canonicalises those surfaces ' +\n\t\t\t\t'live; under a live diff, this error means PostgreSQL could not canonicalise at least one ' +\n\t\t\t\t'listed surface. Index expressions are not covered by the ' +\n\t\t\t\t'live canonicalizer. Omit ' +\n\t\t\t\t'requireExpressionCanonicalization for best-effort raw string comparison. ' +\n\t\t\t\t'Inspect the surfaces field for their identities.',\n\t\t);\n\t\tthis.name = 'ExpressionCanonicalizationUnavailableError';\n\t}\n}\n\n// ============================================================================\n// Comparison Engine\n// ============================================================================\n\n/**\n * Compare two ModelIRs and produce a structured diff.\n *\n * @param schema - The desired schema (from definition)\n * @param db - The current database state (from introspection)\n * @param options - Optional comparison settings (e.g. dbCasing)\n * @returns SchemaDiff with all changes needed to bring DB in sync with schema\n */\nexport function compareSchemata(\n\tschema: ModelIR,\n\tdb: ModelIR,\n\toptions?: CompareSchemataOptions,\n): SchemaDiff {\n\tconst caps = options?.dialectCapabilities;\n\t// Helper: feature is supported if no caps provided (backward compat) OR flag is true\n\t/**\n\t * Check whether a DDL feature is supported.\n\t *\n\t * - `undefined`: capability flag not set → feature is on by default (no caps = all features).\n\t * - `false`: capability explicitly disabled → feature is skipped.\n\t * - `true`: capability explicitly enabled → feature is included.\n\t */\n\tconst sup = (flag: boolean | undefined) => !caps || flag === true;\n\tconst supportsCheckConstraints = sup(caps?.supportsDDLCheckConstraints);\n\n\tif (options?.requireExpressionCanonicalization) {\n\t\tassertNoExpressionSurfaces(schema, db, {\n\t\t\tincludeCheckConstraints: supportsCheckConstraints,\n\t\t});\n\t}\n\n\tconst changes: SchemaChange[] = [];\n\n\tconst schemaNaming =\n\t\toptions?.dbCasing !== undefined\n\t\t\t? getNamingPluginForDbCasing(options.dbCasing)\n\t\t\t: identityNaming;\n\tif (supportsCheckConstraints) {\n\t\tfor (const table of schema.tables.values()) {\n\t\t\tassertNoCheckConstraintNameCollisions(table, schemaNaming);\n\t\t}\n\t}\n\tconst plugin = options?.dbCasing !== undefined ? schemaNaming : undefined;\n\tconst schemaTables = plugin\n\t\t? normalizeTableMap(schema.tables, plugin)\n\t\t: new Map(schema.tables);\n\tconst dbTables = new Map(db.tables);\n\tconst declaredReaddresses = new Map(\n\t\t[...schema.tables]\n\t\t\t.filter(([, table]) => table.readdress !== undefined)\n\t\t\t.map(\n\t\t\t\t([, table]) =>\n\t\t\t\t\t[\n\t\t\t\t\t\tschemaNaming.toDatabase(table.name),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfrom: {\n\t\t\t\t\t\t\t\t...table.readdress!.from,\n\t\t\t\t\t\t\t\tname: schemaNaming.toDatabase(table.readdress!.from.name),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tto: {\n\t\t\t\t\t\t\t\t...table.readdress!.to,\n\t\t\t\t\t\t\t\tname: schemaNaming.toDatabase(table.readdress!.to.name),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t] as const,\n\t\t\t),\n\t);\n\tconst readdressSources = new Set(\n\t\t[...declaredReaddresses.values()].map(\n\t\t\t(declaration) => declaration.from.name,\n\t\t),\n\t);\n\tconst externalTables = new Set(\n\t\t[...(schema.externalTables ?? [])].map((name) =>\n\t\t\tplugin ? plugin.toDatabase(name) : name,\n\t\t),\n\t);\n\t// 0. Compare ENUM types (schema-level, before tables)\n\tif (sup(caps?.supportsDDLEnumTypes)) {\n\t\tcompareEnums(schema, db, changes);\n\t}\n\n\t// 0a. Compare extensions (schema-level)\n\tif (sup(caps?.supportsDDLExtensions)) {\n\t\tcompareExtensions(schema, db, changes, {\n\t\t\tignoreUnmanaged: options?.ignoreUnmanagedExtensions ?? false,\n\t\t});\n\t}\n\n\t// 0b. Compare sequences (schema-level, before tables)\n\tif (sup(caps?.supportsDDLSequences)) {\n\t\tcompareSequences(schema, db, changes);\n\t}\n\n\t// 1. Tables that exist in schema but not in DB → create_table\n\tfor (const [name, schemaTable] of schemaTables) {\n\t\tconst readdress = declaredReaddresses.get(name);\n\t\tconst sourcePresent = readdress && dbTables.has(readdress.from.name);\n\t\tconst targetPresent = dbTables.has(name);\n\t\tif (readdress) {\n\t\t\tif (sourcePresent && !targetPresent) {\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'readdress_table',\n\t\t\t\t\ttable: name,\n\t\t\t\t\tdestructive: false,\n\t\t\t\t\tdetails: `Re-address table \"${readdress.from.name}\" to \"${name}\"`,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\treaddress,\n\t\t\t\t\t\ttable: schemaTable,\n\t\t\t\t\t\treaddressAssessment: 'source-only',\n\t\t\t\t\t\tsourcePresent: true,\n\t\t\t\t\t\ttargetPresent: false,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (sourcePresent && targetPresent) {\n\t\t\t\t// Do not declare success or silently suppress the source deletion when\n\t\t\t\t// both names are occupied. This remains a planning refusal, not a ledger\n\t\t\t\t// event: no executable readdress material exists for it.\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'readdress_table',\n\t\t\t\t\ttable: name,\n\t\t\t\t\tdestructive: false,\n\t\t\t\t\tdetails: `Refuse re-address table \"${readdress.from.name}\" to \"${name}\": target is occupied`,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\treaddress,\n\t\t\t\t\t\ttable: schemaTable,\n\t\t\t\t\t\treaddressAssessment: 'target-occupied',\n\t\t\t\t\t\tsourcePresent: true,\n\t\t\t\t\t\ttargetPresent: true,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!sourcePresent && targetPresent) {\n\t\t\t\t// The physical target may be the completed side of a prior paired\n\t\t\t\t// readdress. Keep the declaration visible so the pair ledger is\n\t\t\t\t// validated by the readdress executor; never degrade to comparison.\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'readdress_table',\n\t\t\t\t\ttable: name,\n\t\t\t\t\tdestructive: false,\n\t\t\t\t\tdetails: `Validate completed re-address table \"${readdress.from.name}\" to \"${name}\"`,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\treaddress,\n\t\t\t\t\t\ttable: schemaTable,\n\t\t\t\t\t\treaddressAssessment: 'target-only',\n\t\t\t\t\t\tsourcePresent: false,\n\t\t\t\t\t\ttargetPresent: true,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// A declaration is not permission to turn a missing source into a\n\t\t\t// fresh table. Keep the diagnostic visible to planning, which refuses\n\t\t\t// it before any manifest can be built.\n\t\t\tchanges.push({\n\t\t\t\tkind: 'readdress_table',\n\t\t\t\ttable: name,\n\t\t\t\tdestructive: false,\n\t\t\t\tdetails: `Refuse re-address table \"${readdress.from.name}\" to \"${name}\": source is absent`,\n\t\t\t\tmeta: {\n\t\t\t\t\treaddress,\n\t\t\t\t\ttable: schemaTable,\n\t\t\t\t\treaddressAssessment: 'source-missing',\n\t\t\t\t\tsourcePresent: false,\n\t\t\t\t\ttargetPresent: false,\n\t\t\t\t},\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (!dbTables.has(name)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'create_table',\n\t\t\t\ttable: name,\n\t\t\t\tdestructive: false,\n\t\t\t\tdetails: `Create table \"${name}\" with ${schemaTable.columns.length} columns`,\n\t\t\t\tmeta: { table: schemaTable },\n\t\t\t});\n\t\t\t// Emit FK constraints for new table (phase 9, after CREATE TABLE phase 5)\n\t\t\tfor (const fk of schemaTable.foreignKeys) {\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'add_foreign_key',\n\t\t\t\t\ttable: name,\n\t\t\t\t\tdestructive: false,\n\t\t\t\t\tdetails: `Add FK (${fk.columns.join(', ')}) → ${fk.references.table}(${fk.references.columns.join(', ')})`,\n\t\t\t\t\tmeta: { fk },\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Emit indexes for new table (phase 11, after FK phase 9)\n\t\t\tfor (const idx of schemaTable.indexes) {\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'create_index',\n\t\t\t\t\ttable: name,\n\t\t\t\t\tdestructive: false,\n\t\t\t\t\tdetails: `Create ${idx.unique ? 'unique ' : ''}index on (${idx.columns.join(', ')})`,\n\t\t\t\t\tmeta: { index: idx },\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Emit CHECK constraints for new table (phase 12, after indexes)\n\t\t\tif (supportsCheckConstraints) {\n\t\t\t\tfor (const check of schemaTable.checkConstraints ?? []) {\n\t\t\t\t\tchanges.push({\n\t\t\t\t\t\tkind: 'add_check_constraint',\n\t\t\t\t\t\ttable: name,\n\t\t\t\t\t\tdestructive: false,\n\t\t\t\t\t\tdetails: `Add CHECK constraint \"${check.name}\" ${check.expression}`,\n\t\t\t\t\t\tmeta: { check },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Emit RLS enable + policies for new table (after table creation)\n\t\t\tif (sup(caps?.supportsDDLRowLevelSecurity)) {\n\t\t\t\tif (schemaTable.rlsEnabled) {\n\t\t\t\t\tchanges.push({\n\t\t\t\t\t\tkind: 'enable_rls',\n\t\t\t\t\t\ttable: name,\n\t\t\t\t\t\tdestructive: false,\n\t\t\t\t\t\tdetails: `Enable RLS on table \"${name}\"`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tfor (const policy of schemaTable.policies ?? []) {\n\t\t\t\t\tchanges.push({\n\t\t\t\t\t\tkind: 'create_policy',\n\t\t\t\t\t\ttable: name,\n\t\t\t\t\t\tdestructive: false,\n\t\t\t\t\t\tdetails: `Create policy \"${policy.name}\" on \"${name}\"`,\n\t\t\t\t\t\tmeta: { policy },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Reuse the ordinary comment diff against a comment-free version of the\n\t\t\t// newly-created table. Keep only the comments that CREATE TABLE would\n\t\t\t// emit: a new table has no existing comment for a falsy value to drop.\n\t\t\t// Retaining its columns lets compareComments emit COMMENT ON COLUMN\n\t\t\t// changes as well as the table-level comment.\n\t\t\tif (sup(caps?.supportsDDLComments)) {\n\t\t\t\tconst tableWithCreatableComments = withoutFalsyComments(schemaTable);\n\t\t\t\tcompareComments(\n\t\t\t\t\ttableWithCreatableComments,\n\t\t\t\t\twithoutComments(tableWithCreatableComments),\n\t\t\t\t\tchanges,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Table exists in both → compare columns, constraints, indexes\n\t\tconst dbTable = dbTables.get(name)!;\n\t\tcompareColumns(schemaTable, dbTable, changes);\n\t\tcomparePrimaryKeys(schemaTable, dbTable, changes);\n\t\tcompareForeignKeys(schemaTable, dbTable, changes);\n\t\tcompareIndexes(schemaTable, dbTable, changes);\n\t\tif (supportsCheckConstraints) {\n\t\t\tcompareCheckConstraints(schemaTable, dbTable, changes);\n\t\t}\n\t\tif (sup(caps?.supportsDDLComments)) {\n\t\t\tcompareComments(schemaTable, dbTable, changes);\n\t\t}\n\t\tcomparePartitions(schemaTable, dbTable, changes);\n\t\tif (sup(caps?.supportsDDLRowLevelSecurity)) {\n\t\t\tcomparePolicies(schemaTable, dbTable, changes);\n\t\t}\n\t}\n\n\t// 2. Tables that exist in DB but not in schema → drop_table\n\tfor (const [name] of dbTables) {\n\t\tif (\n\t\t\t!schemaTables.has(name) &&\n\t\t\t!externalTables.has(name) &&\n\t\t\t!readdressSources.has(name)\n\t\t) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'drop_table',\n\t\t\t\ttable: name,\n\t\t\t\tdestructive: true,\n\t\t\t\tdetails: `Drop table \"${name}\"`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// `destructive` is a compatibility projection for legacy renderers. It is\n\t// deliberately not an authority input: generator orchestration classifies\n\t// every mutation independently through its total classifier.\n\tconst classifiedChanges = changes.map((change) => ({\n\t\t...change,\n\t\tdestructive: change.destructive,\n\t}));\n\treturn {\n\t\tchanges: classifiedChanges,\n\t\thasDestructive: classifiedChanges.some((c) => c.destructive),\n\t\tsummary: buildSummary(classifiedChanges),\n\t};\n}\n\n// ============================================================================\n// Name Normalization (camelCase → DB format)\n// ============================================================================\n\nfunction assertNoExpressionSurfaces(\n\tschema: ModelIR,\n\tdb: ModelIR,\n\toptions?: CollectExpressionSurfaceOptions,\n): void {\n\tconst surfaces = [\n\t\t...collectExpressionSurfaces('schema', schema, options),\n\t\t...collectExpressionSurfaces('database', db, options),\n\t];\n\tif (surfaces.length > 0) {\n\t\tthrow new ExpressionCanonicalizationUnavailableError(surfaces);\n\t}\n}\n\nexport interface CollectExpressionSurfaceOptions {\n\treadonly includeColumnDefaults?: boolean;\n\treadonly includeCheckConstraints?: boolean;\n\treadonly includeIndexPredicates?: boolean;\n\treadonly includeIndexExpressions?: boolean;\n}\n\nexport function collectExpressionSurfaces(\n\tlabel: string,\n\tmodel: ModelIR,\n\toptions?: CollectExpressionSurfaceOptions,\n): string[] {\n\tconst includeColumnDefaults = options?.includeColumnDefaults ?? true;\n\tconst includeCheckConstraints = options?.includeCheckConstraints ?? true;\n\tconst includeIndexPredicates = options?.includeIndexPredicates ?? true;\n\tconst includeIndexExpressions = options?.includeIndexExpressions ?? true;\n\tconst surfaces: string[] = [];\n\tfor (const table of model.tables.values()) {\n\t\tif (includeColumnDefaults) {\n\t\t\tfor (const column of table.columns) {\n\t\t\t\tif (column.default !== undefined && column.default !== null) {\n\t\t\t\t\tsurfaces.push(`${label}.${table.name}.${column.name}.DEFAULT`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (includeCheckConstraints) {\n\t\t\tfor (const check of table.checkConstraints ?? []) {\n\t\t\t\tsurfaces.push(\n\t\t\t\t\t`${label}.${table.name}.CHECK(${formatConstraintName(check)})`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tfor (const index of table.indexes) {\n\t\t\tconst indexName = index.name ?? `<unnamed:${index.columns.join(',')}>`;\n\t\t\tif (includeIndexPredicates && index.where !== undefined) {\n\t\t\t\tsurfaces.push(`${label}.${table.name}.INDEX(${indexName}).WHERE`);\n\t\t\t}\n\t\t\tif (includeIndexExpressions) {\n\t\t\t\tfor (let i = 0; i < (index.expressions?.length ?? 0); i++) {\n\t\t\t\t\tsurfaces.push(\n\t\t\t\t\t\t`${label}.${table.name}.INDEX(${indexName}).EXPRESSION[${i}]`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn surfaces;\n}\n\nfunction formatConstraintName(check: CheckConstraintIR): string {\n\treturn check.name || '<unnamed>';\n}\n\n/**\n * Convert all identifiers in a table map from model format to database format.\n * This allows comparing a schema definition (camelCase) against an introspected\n * database (snake_case) without false positives.\n */\nfunction normalizeTableMap(\n\ttables: ReadonlyMap<string, TableIR>,\n\tplugin: NamingPlugin,\n): Map<string, TableIR> {\n\tconst result = new Map<string, TableIR>();\n\tfor (const [_key, table] of tables) {\n\t\tconst dbName = plugin.toDatabase(table.name);\n\t\tresult.set(dbName, normalizeTable(table, plugin));\n\t}\n\treturn result;\n}\n\nfunction normalizeTable(table: TableIR, plugin: NamingPlugin): TableIR {\n\tconst dbName = plugin.toDatabase(table.name);\n\tconst toDb = (name: string) => plugin.toDatabase(name);\n\n\treturn {\n\t\tname: dbName,\n\t\tcolumns: table.columns.map((col) => ({\n\t\t\t...col,\n\t\t\tname: toDb(col.name),\n\t\t})),\n\t\t...(table.primaryKey !== undefined && {\n\t\t\tprimaryKey:\n\t\t\t\ttypeof table.primaryKey === 'string'\n\t\t\t\t\t? toDb(table.primaryKey)\n\t\t\t\t\t: table.primaryKey.map(toDb),\n\t\t}),\n\t\tforeignKeys: table.foreignKeys.map((fk) => ({\n\t\t\t...fk,\n\t\t\tcolumns: fk.columns.map(toDb),\n\t\t\treferences: {\n\t\t\t\ttable: toDb(fk.references.table),\n\t\t\t\tcolumns: fk.references.columns.map(toDb),\n\t\t\t\t...(fk.references.schema !== undefined\n\t\t\t\t\t? { schema: fk.references.schema }\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t})),\n\t\tindexes: table.indexes.map((idx) => {\n\t\t\tconst normalized = {\n\t\t\t\t...idx,\n\t\t\t\t...(idx.name !== undefined ? { name: toDb(idx.name) } : {}),\n\t\t\t\tcolumns: idx.columns.map(toDb),\n\t\t\t\t...(idx.include !== undefined\n\t\t\t\t\t? { include: idx.include.map(toDb) }\n\t\t\t\t\t: {}),\n\t\t\t\t...(idx.opclass !== undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\t\topclass: Object.fromEntries(\n\t\t\t\t\t\t\t\tObject.entries(idx.opclass).map(([key, value]) => [\n\t\t\t\t\t\t\t\t\ttoDb(key),\n\t\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t\treturn isEngineCanonicalIndex(idx)\n\t\t\t\t? markEngineCanonicalIndex({ ...normalized, where: idx.where })\n\t\t\t\t: normalized;\n\t\t}),\n\t\t...(table.checkConstraints !== undefined\n\t\t\t? {\n\t\t\t\t\tcheckConstraints: table.checkConstraints.map((check) => {\n\t\t\t\t\t\tconst normalized = {\n\t\t\t\t\t\t\t...check,\n\t\t\t\t\t\t\tname: getCheckConstraintDatabaseName(check, plugin),\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn isEngineCanonicalCheck(check)\n\t\t\t\t\t\t\t? markEngineCanonicalCheck(normalized)\n\t\t\t\t\t\t\t: normalized;\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(table.partition\n\t\t\t? {\n\t\t\t\t\tpartition: {\n\t\t\t\t\t\tstrategy: table.partition.strategy,\n\t\t\t\t\t\tcolumns: table.partition.columns.map(toDb),\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\n// ============================================================================\n// Column Comparison\n// ============================================================================\n\nfunction compareColumns(\n\tschema: TableIR,\n\tdb: TableIR,\n\tchanges: SchemaChange[],\n): void {\n\tconst schemaColMap = new Map(schema.columns.map((c) => [c.name, c]));\n\tconst dbColMap = new Map(db.columns.map((c) => [c.name, c]));\n\n\t// Columns in schema but not in DB → add_column\n\tfor (const [name, schemaCol] of schemaColMap) {\n\t\tif (!dbColMap.has(name)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'add_column',\n\t\t\t\ttable: schema.name,\n\t\t\t\tcolumn: name,\n\t\t\t\tdestructive: false,\n\t\t\t\tdetails: `Add column \"${name}\" (${schemaCol.type}${schemaCol.nullable ? '' : ' NOT NULL'})`,\n\t\t\t\tmeta: { column: schemaCol },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Column exists in both → compare type, nullable, default\n\t\tconst dbCol = dbColMap.get(name)!;\n\t\tcompareColumnDetails(schema.name, schemaCol, dbCol, changes);\n\t}\n\n\t// Columns in DB but not in schema → drop_column\n\tfor (const [name] of dbColMap) {\n\t\tif (!schemaColMap.has(name)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'drop_column',\n\t\t\t\ttable: schema.name,\n\t\t\t\tcolumn: name,\n\t\t\t\tdestructive: true,\n\t\t\t\tdetails: `Drop column \"${name}\"`,\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction compareColumnDetails(\n\ttableName: string,\n\tschema: ColumnIR,\n\tdb: ColumnIR,\n\tchanges: SchemaChange[],\n): void {\n\t// Type change — prefer originalDbType when both sides carry it (e.g. vector(768) → vector(1024)).\n\t// Compare via dbTypesEqual so equivalent spellings (varchar ≡ character varying,\n\t// timestamptz ≡ timestamp with time zone, int4 ≡ integer) do NOT false-diff, while\n\t// real modifier changes (timestamptz(3) → timestamptz(6)) still do.\n\tconst schemaTypeIdentity = columnDbTypeSchemaIdentity(schema);\n\tconst dbTypeIdentity = columnDbTypeSchemaIdentity(db);\n\tconst compareSchemaIdentity =\n\t\tschemaTypeIdentity !== undefined && dbTypeIdentity !== undefined;\n\t// Compare the BARE type spelling for equality (so `public.status` ≡ a bare\n\t// `status` carrying an equal schema identity) and let the schema IDENTITY carry\n\t// any schema difference — avoids double-counting the schema and false-diffing a\n\t// qualified string against an equivalent bare+field column.\n\tif (\n\t\tschema.originalDbType &&\n\t\tdb.originalDbType &&\n\t\t(!dbTypesEqual(\n\t\t\tstripDbTypeSchema(schema.originalDbType),\n\t\t\tstripDbTypeSchema(db.originalDbType),\n\t\t) ||\n\t\t\t(compareSchemaIdentity && schemaTypeIdentity !== dbTypeIdentity))\n\t) {\n\t\t// Both have originalDbType and they differ → precision/type change\n\t\tchanges.push({\n\t\t\tkind: 'alter_column_type',\n\t\t\ttable: tableName,\n\t\t\tcolumn: schema.name,\n\t\t\tdestructive: true,\n\t\t\t// Render with the schema so a schema-only change reads e.g.\n\t\t\t// `\"tenant_1\".status` to `\"public\".status`, not `status` to `status`.\n\t\t\tdetails: `Change type of \"${schema.name}\" from ${renderColumnDbType(db)} to ${renderColumnDbType(schema)}`,\n\t\t\tmeta: {\n\t\t\t\tfromType: db.originalDbType,\n\t\t\t\ttoType: schema.originalDbType,\n\t\t\t\tcolumn: schema,\n\t\t\t\tfromColumn: db,\n\t\t\t},\n\t\t});\n\t} else if (!areTypesEquivalent(schema.type, db.type)) {\n\t\t// Fall back to base type comparison (original behavior)\n\t\tchanges.push({\n\t\t\tkind: 'alter_column_type',\n\t\t\ttable: tableName,\n\t\t\tcolumn: schema.name,\n\t\t\tdestructive: true,\n\t\t\tdetails: `Change type of \"${schema.name}\" from ${db.type} to ${schema.type}`,\n\t\t\tmeta: { fromType: db.type, toType: schema.type, column: schema },\n\t\t});\n\t}\n\n\t// Nullable change\n\tif (schema.nullable !== db.nullable) {\n\t\tchanges.push({\n\t\t\tkind: 'alter_column_nullable',\n\t\t\ttable: tableName,\n\t\t\tcolumn: schema.name,\n\t\t\tdestructive: false,\n\t\t\tdetails: `Change nullable of \"${schema.name}\" from ${db.nullable} to ${schema.nullable}`,\n\t\t\tmeta: { nullable: schema.nullable, oldNullable: db.nullable },\n\t\t});\n\t}\n\n\t// Default change — compare normalized string representations\n\tconst schemaDefault = normalizeDefault(schema.default);\n\tconst dbDefault = normalizeDefault(db.default);\n\tif (schemaDefault !== dbDefault) {\n\t\tchanges.push({\n\t\t\tkind: 'alter_column_default',\n\t\t\ttable: tableName,\n\t\t\tcolumn: schema.name,\n\t\t\tdestructive: false,\n\t\t\tdetails: `Change default of \"${schema.name}\" from ${dbDefault ?? 'none'} to ${schemaDefault ?? 'none'}`,\n\t\t\tmeta: { default: schema.default, oldDefault: db.default },\n\t\t});\n\t}\n\n\t// Unique change — missing unique is equivalent to false\n\tconst schemaUnique = schema.unique === true;\n\tconst dbUnique = db.unique === true;\n\tif (schemaUnique !== dbUnique) {\n\t\tchanges.push({\n\t\t\tkind: 'alter_column_unique',\n\t\t\ttable: tableName,\n\t\t\tcolumn: schema.name,\n\t\t\tdestructive: schemaUnique === false,\n\t\t\tdetails: `Change unique of \"${schema.name}\" from ${dbUnique} to ${schemaUnique}`,\n\t\t\tmeta: {\n\t\t\t\tunique: schemaUnique,\n\t\t\t\t...(db.uniqueConstraintName !== undefined\n\t\t\t\t\t? { constraintName: db.uniqueConstraintName }\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t});\n\t}\n\n\t// Collation change\n\tif ((schema.collation ?? null) !== (db.collation ?? null)) {\n\t\tchanges.push({\n\t\t\tkind: 'alter_column_collation',\n\t\t\ttable: tableName,\n\t\t\tcolumn: schema.name,\n\t\t\tdestructive: false,\n\t\t\tdetails: `Change collation of \"${schema.name}\" to ${schema.collation ?? 'default'}`,\n\t\t\tmeta: { column: schema },\n\t\t});\n\t}\n\n\t// Identity change\n\tif ((schema.identity ?? null) !== (db.identity ?? null)) {\n\t\tchanges.push({\n\t\t\tkind: 'alter_column_identity',\n\t\t\ttable: tableName,\n\t\t\tcolumn: schema.name,\n\t\t\tdestructive: false,\n\t\t\tdetails: `Change identity of \"${schema.name}\" to ${schema.identity ?? 'none'}`,\n\t\t\tmeta: { column: schema, previousIdentity: db.identity },\n\t\t});\n\t}\n}\n\n// ============================================================================\n// Type Equivalence\n// ============================================================================\n\n/**\n * Type equivalence classes — groups of ColumnTypes that map to the same\n * PostgreSQL data type and should not trigger alter_column_type.\n *\n * - timestamp/datetime → both are TIMESTAMPTZ\n *\n * Note: number/integer are NOT equivalent because `number` can represent\n * NUMERIC(precision,scale) via originalDbType, which differs from INTEGER.\n */\nconst TYPE_EQUIVALENCE: ReadonlyMap<string, string> = new Map([\n\t['timestamp', 'timestamptz'],\n\t['datetime', 'timestamptz'],\n]);\n\nfunction areTypesEquivalent(a: string, b: string): boolean {\n\tif (a === b) return true;\n\tconst canonA = TYPE_EQUIVALENCE.get(a);\n\tconst canonB = TYPE_EQUIVALENCE.get(b);\n\treturn canonA !== undefined && canonA === canonB;\n}\n\n// ============================================================================\n// Default Normalization\n// ============================================================================\n\n/**\n * Return a default's comparable representation without interpreting SQL.\n *\n * The pure comparator unwraps `{ sql }` and stringifies scalar values, then\n * compares the resulting strings verbatim. It no longer strips PostgreSQL\n * casts or attempts to recognise PostgreSQL's deparser output: live PostgreSQL\n * diffs canonicalise both sides through PostgreSQL first. A developer-authored\n * `{ sql }` default has the same meaning as an introspected `{ sql }` default\n * on this pure path.\n */\nfunction normalizeDefault(value: unknown): string | undefined {\n\tif (value === undefined || value === null) return undefined;\n\n\tif (typeof value === 'object' && value !== null && 'sql' in value) {\n\t\tconst rawSql = (value as Record<string, unknown>).sql;\n\t\tif (typeof rawSql !== 'string') {\n\t\t\tthrow new Error(\n\t\t\t\t`normalizeDefault({ sql }): expected string, got ${typeof rawSql}`,\n\t\t\t);\n\t\t}\n\t\treturn rawSql;\n\t}\n\n\treturn String(value);\n}\n\n// ============================================================================\n// Primary Key Comparison\n// ============================================================================\n\nfunction comparePrimaryKeys(\n\tschema: TableIR,\n\tdb: TableIR,\n\tchanges: SchemaChange[],\n): void {\n\tconst schemaPK = normalizePK(schema.primaryKey);\n\tconst dbPK = normalizePK(db.primaryKey);\n\n\tconst sameKeys =\n\t\tschemaPK.length === dbPK.length &&\n\t\tschemaPK.every((col, i) => col === dbPK[i]);\n\n\tif (sameKeys) return;\n\n\t// PK in schema but not in DB → add\n\tif (schemaPK.length > 0 && dbPK.length === 0) {\n\t\tchanges.push({\n\t\t\tkind: 'add_primary_key',\n\t\t\ttable: schema.name,\n\t\t\tdestructive: false,\n\t\t\tdetails: `Add primary key (${schemaPK.join(', ')})`,\n\t\t\tmeta: { columns: schemaPK },\n\t\t});\n\t\treturn;\n\t}\n\n\t// PK in DB but not in schema → drop\n\tif (schemaPK.length === 0 && dbPK.length > 0) {\n\t\tchanges.push({\n\t\t\tkind: 'drop_primary_key',\n\t\t\ttable: schema.name,\n\t\t\tdestructive: true,\n\t\t\tdetails: `Drop primary key (${dbPK.join(', ')})`,\n\t\t\tmeta: { columns: dbPK },\n\t\t});\n\t\treturn;\n\t}\n\n\t// PK differs → drop + add\n\tchanges.push({\n\t\tkind: 'drop_primary_key',\n\t\ttable: schema.name,\n\t\tdestructive: true,\n\t\tdetails: `Drop primary key (${dbPK.join(', ')})`,\n\t\tmeta: { columns: dbPK },\n\t});\n\tchanges.push({\n\t\tkind: 'add_primary_key',\n\t\ttable: schema.name,\n\t\tdestructive: false,\n\t\tdetails: `Add primary key (${schemaPK.join(', ')})`,\n\t\tmeta: { columns: schemaPK },\n\t});\n}\n\nfunction normalizePK(pk: string | readonly string[] | undefined): string[] {\n\tif (!pk) return [];\n\tif (typeof pk === 'string') return [pk];\n\treturn Array.from(pk);\n}\n\n// ============================================================================\n// Foreign Key Comparison\n// ============================================================================\n\nfunction compareForeignKeys(\n\tschema: TableIR,\n\tdb: TableIR,\n\tchanges: SchemaChange[],\n): void {\n\tconst schemaFKs = schema.foreignKeys;\n\tconst dbFKs = db.foreignKeys;\n\n\t// Build a key for each FK: \"localCols→targetTable(targetCols)\"\n\tconst schemaFKMap = new Map(schemaFKs.map((fk) => [fkKey(fk), fk]));\n\tconst dbFKMap = new Map(dbFKs.map((fk) => [fkKey(fk), fk]));\n\n\t// FKs in schema but not in DB → add\n\tfor (const [key, fk] of schemaFKMap) {\n\t\tif (!dbFKMap.has(key)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'add_foreign_key',\n\t\t\t\ttable: schema.name,\n\t\t\t\tdestructive: false,\n\t\t\t\tdetails: `Add FK (${fk.columns.join(', ')}) → ${fk.references.table}(${fk.references.columns.join(', ')})`,\n\t\t\t\tmeta: { fk },\n\t\t\t});\n\t\t} else {\n\t\t\t// FK exists in both — check onDelete, onUpdate, deferred, and notValid\n\t\t\tconst dbFK = dbFKMap.get(key)!;\n\t\t\tconst schemaOnDelete = fk.onDelete ?? 'NO ACTION';\n\t\t\tconst dbOnDelete = dbFK.onDelete ?? 'NO ACTION';\n\t\t\tconst schemaOnUpdate = fk.onUpdate ?? 'NO ACTION';\n\t\t\tconst dbOnUpdate = dbFK.onUpdate ?? 'NO ACTION';\n\t\t\tconst schemaDeferred = fk.deferred ?? false;\n\t\t\tconst dbDeferred = dbFK.deferred ?? false;\n\t\t\tif (\n\t\t\t\tschemaOnDelete !== dbOnDelete ||\n\t\t\t\tschemaOnUpdate !== dbOnUpdate ||\n\t\t\t\tschemaDeferred !== dbDeferred\n\t\t\t) {\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'alter_foreign_key',\n\t\t\t\t\ttable: schema.name,\n\t\t\t\t\tdestructive: false,\n\t\t\t\t\tdetails: `Alter FK (${fk.columns.join(', ')}) — onDelete/onUpdate/deferred changed`,\n\t\t\t\t\tmeta: { fk, previousOnDelete: dbOnDelete, oldFk: dbFK },\n\t\t\t\t});\n\t\t\t}\n\t\t\t// notValid: true in DB but false/undefined in schema → emit validate_constraint\n\t\t\tconst dbNotValid = dbFK.notValid ?? false;\n\t\t\tconst schemaNotValid = fk.notValid ?? false;\n\t\t\tif (dbNotValid && !schemaNotValid) {\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'validate_constraint',\n\t\t\t\t\ttable: schema.name,\n\t\t\t\t\tdestructive: false,\n\t\t\t\t\tdetails: `Validate FK constraint on (${fk.columns.join(', ')})`,\n\t\t\t\t\tmeta: { fk },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// FKs in DB but not in schema → drop\n\tfor (const [key, fk] of dbFKMap) {\n\t\tif (!schemaFKMap.has(key)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'drop_foreign_key',\n\t\t\t\ttable: schema.name,\n\t\t\t\tdestructive: true,\n\t\t\t\tdetails: `Drop FK (${fk.columns.join(', ')}) → ${fk.references.table}(${fk.references.columns.join(', ')})`,\n\t\t\t\tmeta: { fk },\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction fkKey(fk: ForeignKeyIR): string {\n\treturn `${fk.columns.join(',')}→${fk.references.schema ?? ''}.${fk.references.table}(${fk.references.columns.join(',')})`;\n}\n\n// ============================================================================\n// Index Comparison\n// ============================================================================\n\nfunction compareIndexes(\n\tschema: TableIR,\n\tdb: TableIR,\n\tchanges: SchemaChange[],\n): void {\n\t// Build the set of FK auto-index keys.\n\t// generateDDL (fkAutoIndex=true default) creates an index for every single-column FK that\n\t// does not already have an explicit index. These indexes are managed automatically — they\n\t// should never trigger create_index or drop_index diffs.\n\tconst explicitIndexCols = new Set(\n\t\tschema.indexes.flatMap((idx) =>\n\t\t\tidx.columns.length === 1 ? idx.columns : [],\n\t\t),\n\t);\n\t// These declared indexes still stay in schemaIdxMap below. This set only keeps an\n\t// existing FK auto-index from being dropped before the requested index reaches\n\t// the emitter and fails loudly.\n\tconst declaredUnemittableFkIndexCols = new Set(\n\t\tschema.indexes.flatMap((idx) =>\n\t\t\tidx.columns.length === 1 && !isManagedIndex(schema.name, idx)\n\t\t\t\t? idx.columns\n\t\t\t\t: [],\n\t\t),\n\t);\n\tconst autoFkIndexKeys = new Set(\n\t\tschema.foreignKeys\n\t\t\t.filter(\n\t\t\t\t(fk) =>\n\t\t\t\t\tfk.columns.length === 1 &&\n\t\t\t\t\tfk.columns[0] !== undefined &&\n\t\t\t\t\t!explicitIndexCols.has(fk.columns[0]),\n\t\t\t)\n\t\t\t.map((fk) =>\n\t\t\t\tindexComparisonKey({\n\t\t\t\t\tcolumns: fk.columns,\n\t\t\t\t\tunique: false,\n\t\t\t\t}),\n\t\t\t),\n\t);\n\tconst declaredUnemittableFkAutoIndexKeys = new Set(\n\t\tschema.foreignKeys\n\t\t\t.filter((fk) => {\n\t\t\t\tconst fkCol = fk.columns[0];\n\t\t\t\treturn (\n\t\t\t\t\tfk.columns.length === 1 &&\n\t\t\t\t\tfkCol !== undefined &&\n\t\t\t\t\tdeclaredUnemittableFkIndexCols.has(fkCol)\n\t\t\t\t);\n\t\t\t})\n\t\t\t.map((fk) =>\n\t\t\t\tindexComparisonKey({\n\t\t\t\t\tcolumns: fk.columns,\n\t\t\t\t\tunique: false,\n\t\t\t\t}),\n\t\t\t),\n\t);\n\n\t// Index identity: structural definition (name is cosmetic)\n\tconst schemaIdxMap = new Map(\n\t\tschema.indexes.map((idx) => [indexComparisonKey(idx), idx]),\n\t);\n\tconst dbIdxMap = new Map(\n\t\tdb.indexes\n\t\t\t.filter((idx) => isManagedIndex(schema.name, idx))\n\t\t\t.map((idx) => [indexComparisonKey(idx), idx]),\n\t);\n\tconst pendingCreates: PendingIndexCreate[] = [];\n\n\t// Explicit indexes in schema but not in DB → create\n\tfor (const [key, idx] of schemaIdxMap) {\n\t\tif (!dbIdxMap.has(key)) {\n\t\t\tpendingCreates.push({\n\t\t\t\tindex: idx,\n\t\t\t\treplacementKey: indexReplacementKey(schema.name, idx),\n\t\t\t\tdetails: `Create ${idx.unique ? 'unique ' : ''}index on (${idx.columns.join(', ')})`,\n\t\t\t\tdestructive: false,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Auto-unique index keys: col.unique=true generates an implicit UNIQUE index in the DB,\n\t// but this does not appear in ModelIR's indexes[] array. These are auto-managed and must\n\t// never trigger a drop_index diff. Include either side when the column exists on both\n\t// sides, because compareColumnDetails owns the col.unique toggle.\n\tconst dbColMap = new Map(db.columns.map((col) => [col.name, col]));\n\tconst autoUniqueIndexColumns = new Set(\n\t\tschema.columns\n\t\t\t.filter((schemaCol) => {\n\t\t\t\tconst dbCol = dbColMap.get(schemaCol.name);\n\t\t\t\treturn (\n\t\t\t\t\tdbCol !== undefined &&\n\t\t\t\t\t(schemaCol.unique === true || dbCol.unique === true)\n\t\t\t\t);\n\t\t\t})\n\t\t\t.map((col) => col.name),\n\t);\n\n\t// Indexes in DB but not in schema → drop (skip auto-FK and auto-unique indexes — they are auto-managed)\n\tconst pendingDrops: PendingIndexDrop[] = [];\n\tfor (const [key, idx] of dbIdxMap) {\n\t\tif (\n\t\t\t!schemaIdxMap.has(key) &&\n\t\t\t!autoFkIndexKeys.has(key) &&\n\t\t\t!declaredUnemittableFkAutoIndexKeys.has(key) &&\n\t\t\t!isAutoUniqueIndex(schema.name, idx, autoUniqueIndexColumns)\n\t\t) {\n\t\t\tpendingDrops.push({\n\t\t\t\tindex: idx,\n\t\t\t\treplacementKey: indexReplacementKey(schema.name, idx),\n\t\t\t\tdestructive: idx.unique === true,\n\t\t\t\tdetails: `Drop index ${idx.name ?? `on (${formatIndexTargets(idx)})`}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Same-name replacements must be all-or-nothing: with destructive changes\n\t// skipped, leaving the old index in place and attempting its replacement\n\t// would fail instead of honoring the requested non-destructive migration.\n\tmarkDestructiveReplacementCreates(pendingCreates, pendingDrops);\n\n\tfor (const create of pendingCreates) {\n\t\tchanges.push({\n\t\t\tkind: 'create_index',\n\t\t\ttable: schema.name,\n\t\t\tdestructive: create.destructive,\n\t\t\tdetails: create.details,\n\t\t\tmeta: { index: create.index },\n\t\t});\n\t}\n\tfor (const drop of pendingDrops) {\n\t\tchanges.push({\n\t\t\tkind: 'drop_index',\n\t\t\ttable: schema.name,\n\t\t\tdestructive: drop.destructive,\n\t\t\tdetails: drop.details,\n\t\t\tmeta: { index: drop.index },\n\t\t});\n\t}\n}\n\ninterface PendingIndexCreate {\n\treadonly index: IndexIR;\n\treadonly replacementKey: string;\n\treadonly details: string;\n\tdestructive: boolean;\n}\n\ninterface PendingIndexDrop {\n\treadonly index: IndexIR;\n\treadonly replacementKey: string;\n\treadonly destructive: boolean;\n\treadonly details: string;\n}\n\nfunction markDestructiveReplacementCreates(\n\tcreates: PendingIndexCreate[],\n\tdrops: readonly PendingIndexDrop[],\n): void {\n\tconst createsByReplacementKey = new Map<string, PendingIndexCreate[]>();\n\tfor (const create of creates) {\n\t\tconst group = createsByReplacementKey.get(create.replacementKey);\n\t\tif (group === undefined) {\n\t\t\tcreatesByReplacementKey.set(create.replacementKey, [create]);\n\t\t} else {\n\t\t\tgroup.push(create);\n\t\t}\n\t}\n\n\tfor (const drop of drops) {\n\t\tif (!drop.destructive) continue;\n\t\tconst candidates = createsByReplacementKey.get(drop.replacementKey);\n\t\tconst replacementCreate = candidates?.find((create) => !create.destructive);\n\t\tif (replacementCreate !== undefined) {\n\t\t\treplacementCreate.destructive = true;\n\t\t}\n\t}\n}\n\nfunction isManagedIndex(tableName: string, idx: IndexIR): boolean {\n\treturn (\n\t\t(idx.expressions === undefined || idx.expressions.length === 0) &&\n\t\tcanGenerateCreateIndex(tableName, idx) &&\n\t\tcanValidateSchemaIndex(tableName, idx)\n\t);\n}\n\nfunction canValidateSchemaIndex(tableName: string, idx: IndexIR): boolean {\n\ttry {\n\t\tvalidateSchemaIndexOptions(tableName, idx);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function getAutoFkIndexName(\n\ttableName: string,\n\tcolumnName: string,\n): string {\n\treturn `idx_${tableName}_${columnName}`;\n}\n\nfunction isAutoUniqueIndex(\n\ttableName: string,\n\tidx: IndexIR,\n\tautoUniqueIndexColumns: ReadonlySet<string>,\n): boolean {\n\tif (idx.columns.length !== 1) return false;\n\tconst column = idx.columns[0];\n\tif (column === undefined || !autoUniqueIndexColumns.has(column)) return false;\n\tif (idx.unique !== true) return false;\n\tif (idx.name !== undefined && idx.name !== `${tableName}_${column}_key`) {\n\t\treturn false;\n\t}\n\treturn (\n\t\tidx.nullsNotDistinct !== true &&\n\t\t(idx.method === undefined || idx.method === 'btree') &&\n\t\tidx.where === undefined &&\n\t\t(idx.expressions === undefined || idx.expressions.length === 0) &&\n\t\t(idx.include === undefined || idx.include.length === 0) &&\n\t\t(idx.opclass === undefined || Object.keys(idx.opclass).length === 0) &&\n\t\t(idx.with === undefined || Object.keys(idx.with).length === 0)\n\t);\n}\n\nfunction indexReplacementKey(tableName: string, idx: IndexIR): string {\n\treturn idx.name ?? `idx_${tableName}_${idx.columns.join('_')}`;\n}\n\nfunction formatIndexTargets(idx: IndexIR): string {\n\treturn [...(idx.expressions ?? []), ...idx.columns].join(', ');\n}\n\nfunction withoutComments(table: TableIR): TableIR {\n\tconst { comment: _tableComment, ...tableWithoutComment } = table;\n\treturn {\n\t\t...tableWithoutComment,\n\t\tcolumns: table.columns.map(\n\t\t\t({ comment: _columnComment, ...column }) => column,\n\t\t),\n\t};\n}\n\n/**\n * New-table comment changes only create truthy comments. An empty PostgreSQL\n * comment has the same effect as no comment, so it must not become a synthetic\n * drop_comment while bootstrapping a table.\n */\nfunction withoutFalsyComments(table: TableIR): TableIR {\n\tconst { comment, ...tableWithoutComment } = table;\n\treturn {\n\t\t...tableWithoutComment,\n\t\t...(comment ? { comment } : {}),\n\t\tcolumns: table.columns.map(({ comment: columnComment, ...column }) => ({\n\t\t\t...column,\n\t\t\t...(columnComment ? { comment: columnComment } : {}),\n\t\t})),\n\t};\n}\n\n// ============================================================================\n// Summary Builder\n// ============================================================================\n\n// ============================================================================\n// compareCheckConstraints\n// ============================================================================\n// ============================================================================\n// Comments\n// ============================================================================\n\nfunction compareComments(\n\tschema: TableIR,\n\tdb: TableIR,\n\tchanges: SchemaChange[],\n): void {\n\t// Table-level comment\n\tif ((schema.comment ?? null) !== (db.comment ?? null)) {\n\t\tif (schema.comment) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'add_comment',\n\t\t\t\ttable: schema.name,\n\t\t\t\tdestructive: false,\n\t\t\t\tdetails: `Set comment on table \"${schema.name}\"`,\n\t\t\t\tmeta: {\n\t\t\t\t\tcomment: schema.comment,\n\t\t\t\t\tpreviousComment: db.comment,\n\t\t\t\t\ttarget: 'table',\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'drop_comment',\n\t\t\t\ttable: schema.name,\n\t\t\t\tdestructive: false,\n\t\t\t\tdetails: `Remove comment from table \"${schema.name}\"`,\n\t\t\t\tmeta: { comment: db.comment, target: 'table' },\n\t\t\t});\n\t\t}\n\t}\n\n\t// Column-level comments\n\tfor (const schemaCol of schema.columns) {\n\t\tconst dbCol = db.columns.find((c) => c.name === schemaCol.name);\n\t\tif (!dbCol) continue;\n\t\tif ((schemaCol.comment ?? null) !== (dbCol.comment ?? null)) {\n\t\t\tif (schemaCol.comment) {\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'add_comment',\n\t\t\t\t\ttable: schema.name,\n\t\t\t\t\tcolumn: schemaCol.name,\n\t\t\t\t\tdestructive: false,\n\t\t\t\t\tdetails: `Set comment on \"${schema.name}\".\"${schemaCol.name}\"`,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tcomment: schemaCol.comment,\n\t\t\t\t\t\tpreviousComment: dbCol.comment,\n\t\t\t\t\t\ttarget: 'column',\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'drop_comment',\n\t\t\t\t\ttable: schema.name,\n\t\t\t\t\tcolumn: schemaCol.name,\n\t\t\t\t\tdestructive: false,\n\t\t\t\t\tdetails: `Remove comment from \"${schema.name}\".\"${schemaCol.name}\"`,\n\t\t\t\t\tmeta: { comment: dbCol.comment, target: 'column' },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\n// ============================================================================\n// Partition Diff\n// ============================================================================\n\n/**\n * Compare partition configs between schema and DB.\n * PostgreSQL does not support ALTER TABLE ... SET PARTITION STRATEGY.\n * Any mismatch (add, remove, or change) requires DROP + CREATE.\n * We emit a destructive drop_table change with isPartitionChange=true as a marker.\n */\nfunction comparePartitions(\n\tschema: TableIR,\n\tdb: TableIR,\n\tchanges: SchemaChange[],\n): void {\n\tconst sp = schema.partition as PartitionIR | undefined;\n\tconst dp = db.partition as PartitionIR | undefined;\n\n\tif (!sp && !dp) return; // Neither has partition — nothing to do\n\n\tif (sp && dp) {\n\t\t// Both have partition — check if config matches\n\t\tconst sameStrategy = sp.strategy === dp.strategy;\n\t\tconst sameCols = sp.columns.join(',') === dp.columns.join(',');\n\t\tif (!sameStrategy || !sameCols) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'drop_table',\n\t\t\t\ttable: schema.name,\n\t\t\t\tdestructive: true,\n\t\t\t\tdetails: `Cannot alter partition strategy of \"${schema.name}\" (${dp.strategy} → ${sp.strategy}). Requires DROP + CREATE (data migration needed).`,\n\t\t\t\tmeta: { isPartitionChange: true },\n\t\t\t});\n\t\t}\n\t\t// Same config → no change needed\n\t} else if (sp && !dp) {\n\t\t// Adding partition to non-partitioned table\n\t\tchanges.push({\n\t\t\tkind: 'drop_table',\n\t\t\ttable: schema.name,\n\t\t\tdestructive: true,\n\t\t\tdetails: `Cannot add partition to existing table \"${schema.name}\". Requires DROP + CREATE (data migration needed).`,\n\t\t\tmeta: { isPartitionChange: true },\n\t\t});\n\t} else {\n\t\t// Removing partition from partitioned table\n\t\tchanges.push({\n\t\t\tkind: 'drop_table',\n\t\t\ttable: schema.name,\n\t\t\tdestructive: true,\n\t\t\tdetails: `Cannot remove partition from existing table \"${schema.name}\". Requires DROP + CREATE (data migration needed).`,\n\t\t\tmeta: { isPartitionChange: true },\n\t\t});\n\t}\n}\n\nfunction compareCheckConstraints(\n\tschema: TableIR,\n\tdb: TableIR,\n\tchanges: SchemaChange[],\n): void {\n\tconst schemaChecks = schema.checkConstraints ?? [];\n\tconst dbChecks = db.checkConstraints ?? [];\n\n\t// Build map by constraint name\n\tconst schemaMap = new Map(\n\t\tschemaChecks.map((check) => [check.name, normalizeCheckForDiff(check)]),\n\t);\n\tconst dbMap = new Map(\n\t\tdbChecks.map((check) => [check.name, normalizeCheckForDiff(check)]),\n\t);\n\n\t// In schema but not in DB → add\n\tfor (const [name, checkEntry] of schemaMap) {\n\t\tconst { check } = checkEntry;\n\t\tif (!dbMap.has(name)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'add_check_constraint',\n\t\t\t\ttable: schema.name,\n\t\t\t\tdestructive: false,\n\t\t\t\tdetails: `Add CHECK constraint \"${name}\" ${check.expression}`,\n\t\t\t\tmeta: { check },\n\t\t\t});\n\t\t} else {\n\t\t\t// Both have it — compare expression and notValid\n\t\t\tconst dbCheckEntry = dbMap.get(name)!;\n\t\t\tif (checkEntry.expression !== dbCheckEntry.expression) {\n\t\t\t\t// Expression changed → drop + re-add\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'drop_check_constraint',\n\t\t\t\t\ttable: schema.name,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t\tdetails: `Drop CHECK constraint \"${name}\" (expression changed)`,\n\t\t\t\t\tmeta: { check: dbCheckEntry.check },\n\t\t\t\t});\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'add_check_constraint',\n\t\t\t\t\ttable: schema.name,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t\tdetails: `Add CHECK constraint \"${name}\" ${check.expression}`,\n\t\t\t\t\tmeta: { check },\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// notValid: true in DB but false/undefined in schema → emit validate_constraint\n\t\t\t\tconst dbNotValid = dbCheckEntry.notValid;\n\t\t\t\tconst schemaNotValid = checkEntry.notValid;\n\t\t\t\tif (dbNotValid && !schemaNotValid) {\n\t\t\t\t\tchanges.push({\n\t\t\t\t\t\tkind: 'validate_constraint',\n\t\t\t\t\t\ttable: schema.name,\n\t\t\t\t\t\tdestructive: false,\n\t\t\t\t\t\tdetails: `Validate CHECK constraint \"${name}\"`,\n\t\t\t\t\t\tmeta: { check },\n\t\t\t\t\t});\n\t\t\t\t} else if (!dbNotValid && schemaNotValid) {\n\t\t\t\t\tchanges.push({\n\t\t\t\t\t\tkind: 'drop_check_constraint',\n\t\t\t\t\t\ttable: schema.name,\n\t\t\t\t\t\tdestructive: true,\n\t\t\t\t\t\tdetails: `Drop CHECK constraint \"${name}\" to re-add NOT VALID`,\n\t\t\t\t\t\tmeta: { check: dbCheckEntry.check },\n\t\t\t\t\t});\n\t\t\t\t\tchanges.push({\n\t\t\t\t\t\tkind: 'add_check_constraint',\n\t\t\t\t\t\ttable: schema.name,\n\t\t\t\t\t\tdestructive: true,\n\t\t\t\t\t\tdetails: `Re-add CHECK constraint \"${name}\" ${check.expression} NOT VALID`,\n\t\t\t\t\t\tmeta: { check },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// In DB but not in schema → drop\n\tfor (const [name, checkEntry] of dbMap) {\n\t\tif (!schemaMap.has(name)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'drop_check_constraint',\n\t\t\t\ttable: schema.name,\n\t\t\t\tdestructive: true,\n\t\t\t\tdetails: `Drop CHECK constraint \"${name}\"`,\n\t\t\t\tmeta: { check: checkEntry.check },\n\t\t\t});\n\t\t}\n\t}\n}\n\ninterface NormalizedCheckForDiff {\n\treadonly check: CheckConstraintIR;\n\treadonly expression: string;\n\treadonly notValid: boolean;\n}\n\nfunction normalizeCheckForDiff(\n\tcheck: CheckConstraintIR,\n): NormalizedCheckForDiff {\n\tconst state = splitCheckConstraintState(check);\n\treturn {\n\t\tcheck,\n\t\texpression: state.expression,\n\t\tnotValid: state.notValid,\n\t};\n}\n\n// ============================================================================\n// ENUM comparison (schema-level, not table-level)\n// ============================================================================\n\nfunction compareEnums(\n\tschema: ModelIR,\n\tdb: ModelIR,\n\tchanges: SchemaChange[],\n): void {\n\tconst schemaEnums = schema.enums ?? new Map<string, EnumIR>();\n\tconst dbEnums = db.enums ?? new Map<string, EnumIR>();\n\n\t// Enum maps are keyed by bare typname for today's single-schema model\n\t// introspection. Authored enums are schema-unspecified, so strict\n\t// (schema,name) keying would turn authored-vs-introspected comparisons into\n\t// spurious drop+create changes. Revisit when multi-schema introspection can\n\t// produce multiple enum schemas in one ModelIR — see #303.\n\n\t// Enums in schema but not in DB → create\n\tfor (const [name, enumDef] of schemaEnums) {\n\t\tif (!dbEnums.has(name)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'create_enum',\n\t\t\t\ttable: '',\n\t\t\t\tdestructive: false,\n\t\t\t\tdetails: `Create enum \"${name}\" with values (${enumDef.values.join(', ')})`,\n\t\t\t\tmeta: { enum: enumDef },\n\t\t\t});\n\t\t} else {\n\t\t\t// Exists in both → check for new values\n\t\t\tconst dbEnum = dbEnums.get(name)!;\n\t\t\t// Find values in schema that are not in DB → add\n\t\t\tfor (let i = 0; i < enumDef.values.length; i++) {\n\t\t\t\tconst val = enumDef.values[i]!;\n\t\t\t\tif (!dbEnum.values.includes(val)) {\n\t\t\t\t\tconst prevVal = i > 0 ? enumDef.values[i - 1] : undefined;\n\t\t\t\t\tchanges.push({\n\t\t\t\t\t\tkind: 'alter_enum_add_value',\n\t\t\t\t\t\ttable: '',\n\t\t\t\t\t\tdestructive: false,\n\t\t\t\t\t\tdetails: `Add value '${val}' to enum \"${name}\"${prevVal ? ` after '${prevVal}'` : ''}`,\n\t\t\t\t\t\tmeta: { enum: enumDef, value: val, after: prevVal },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Values in DB but not in schema → PG limitation, flag as error\n\t\t\tfor (const val of dbEnum.values) {\n\t\t\t\tif (!enumDef.values.includes(val)) {\n\t\t\t\t\tchanges.push({\n\t\t\t\t\t\tkind: 'drop_enum',\n\t\t\t\t\t\ttable: '',\n\t\t\t\t\t\tdestructive: true,\n\t\t\t\t\t\tdetails: `Cannot remove value '${val}' from enum \"${name}\" — PostgreSQL limitation. Requires DROP TYPE + CREATE TYPE (data migration needed).`,\n\t\t\t\t\t\tmeta: { enum: dbEnum, removedValue: val, isValueRemoval: true },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Enums in DB but not in schema → drop\n\tfor (const [name, enumDef] of dbEnums) {\n\t\tif (!schemaEnums.has(name)) {\n\t\t\t// Scan DB tables for columns still referencing this enum type.\n\t\t\t// These must be cast to text before the DROP TYPE can succeed.\n\t\t\tconst referencingColumns: Array<{\n\t\t\t\ttable: string;\n\t\t\t\tcolumn: string;\n\t\t\t\tisArray?: boolean;\n\t\t\t}> = [];\n\t\t\tfor (const [tableName, tableIR] of db.tables) {\n\t\t\t\tfor (const col of tableIR.columns) {\n\t\t\t\t\t// originalDbType may be quoted (`\"Status\"`) while `name` is a bare\n\t\t\t\t\t// catalog typname; a scalar reference is rewritten to text and an\n\t\t\t\t\t// array reference to text[] before the DROP, so we track the kind.\n\t\t\t\t\tconst kind =\n\t\t\t\t\t\tcol.originalDbType !== undefined\n\t\t\t\t\t\t\t? enumReferenceKind(\n\t\t\t\t\t\t\t\t\tcol.originalDbType,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tenumDef.schema,\n\t\t\t\t\t\t\t\t\tcol.originalDbTypeSchema,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\tif (kind !== null) {\n\t\t\t\t\t\treferencingColumns.push({\n\t\t\t\t\t\t\ttable: tableName,\n\t\t\t\t\t\t\tcolumn: col.name,\n\t\t\t\t\t\t\t...(kind === 'array' ? { isArray: true } : {}),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tchanges.push({\n\t\t\t\tkind: 'drop_enum',\n\t\t\t\ttable: '',\n\t\t\t\tdestructive: true,\n\t\t\t\tdetails: `Drop enum \"${name}\"`,\n\t\t\t\tmeta: { enum: enumDef, referencingColumns },\n\t\t\t});\n\t\t}\n\t}\n}\n\n// ============================================================================\n// Extension Diff\n// ============================================================================\n\nfunction compareExtensions(\n\tschema: ModelIR,\n\tdb: ModelIR,\n\tchanges: SchemaChange[],\n\topts: { ignoreUnmanaged: boolean } = { ignoreUnmanaged: false },\n): void {\n\tconst schemaExts = new Set(schema.extensions ?? []);\n\tconst dbExts = new Set(db.extensions ?? []);\n\n\tfor (const ext of schemaExts) {\n\t\tif (!dbExts.has(ext)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'create_extension',\n\t\t\t\ttable: '',\n\t\t\t\tdestructive: false,\n\t\t\t\tdetails: `Create extension \"${ext}\"`,\n\t\t\t\tmeta: { extension: ext },\n\t\t\t});\n\t\t}\n\t}\n\n\tif (!opts.ignoreUnmanaged) {\n\t\tfor (const ext of dbExts) {\n\t\t\tif (!schemaExts.has(ext)) {\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'drop_extension',\n\t\t\t\t\ttable: '',\n\t\t\t\t\tdestructive: true,\n\t\t\t\t\tdetails: `Drop extension \"${ext}\"`,\n\t\t\t\t\tmeta: { extension: ext },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\n// ============================================================================\n// Sequence Diff\n// ============================================================================\n\nfunction compareSequences(\n\tschema: ModelIR,\n\tdb: ModelIR,\n\tchanges: SchemaChange[],\n): void {\n\tconst schemaSeqs = schema.sequences ?? new Map<string, SequenceIR>();\n\tconst dbSeqs = db.sequences ?? new Map<string, SequenceIR>();\n\n\t// Sequences in schema but not in DB → create\n\tfor (const [name, seq] of schemaSeqs) {\n\t\tif (!dbSeqs.has(name)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'create_sequence',\n\t\t\t\ttable: '',\n\t\t\t\tdestructive: false,\n\t\t\t\tdetails: `Create sequence \"${name}\"`,\n\t\t\t\tmeta: { sequence: seq },\n\t\t\t});\n\t\t} else {\n\t\t\tconst dbSeq = dbSeqs.get(name)!;\n\t\t\t// Compare relevant properties\n\t\t\tif (\n\t\t\t\tnormalizeSequenceInteger(seq.startWith, 'sequence START WITH') !==\n\t\t\t\t\tnormalizeSequenceInteger(dbSeq.startWith, 'sequence START WITH') ||\n\t\t\t\tnormalizeSequenceInteger(seq.incrementBy, 'sequence INCREMENT BY') !==\n\t\t\t\t\tnormalizeSequenceInteger(\n\t\t\t\t\t\tdbSeq.incrementBy,\n\t\t\t\t\t\t'sequence INCREMENT BY',\n\t\t\t\t\t) ||\n\t\t\t\tnormalizeSequenceInteger(seq.minValue, 'sequence MINVALUE') !==\n\t\t\t\t\tnormalizeSequenceInteger(dbSeq.minValue, 'sequence MINVALUE') ||\n\t\t\t\tnormalizeSequenceInteger(seq.maxValue, 'sequence MAXVALUE') !==\n\t\t\t\t\tnormalizeSequenceInteger(dbSeq.maxValue, 'sequence MAXVALUE') ||\n\t\t\t\tseq.cycle !== dbSeq.cycle\n\t\t\t) {\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'alter_sequence',\n\t\t\t\t\ttable: '',\n\t\t\t\t\tdestructive: false,\n\t\t\t\t\tdetails: `Alter sequence \"${name}\"`,\n\t\t\t\t\tmeta: { sequence: seq, previousSequence: dbSeq },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Sequences in DB but not in schema → drop\n\tfor (const [name, seq] of dbSeqs) {\n\t\tif (!schemaSeqs.has(name)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'drop_sequence',\n\t\t\t\ttable: '',\n\t\t\t\tdestructive: true,\n\t\t\t\tdetails: `Drop sequence \"${name}\"`,\n\t\t\t\tmeta: { sequence: seq },\n\t\t\t});\n\t\t}\n\t}\n}\n\n// ============================================================================\n// RLS Policy Comparison\n// ============================================================================\n\nfunction comparePolicies(\n\tschema: TableIR,\n\tdb: TableIR,\n\tchanges: SchemaChange[],\n): void {\n\t// RLS and policies have no declarable managed representation. An omitted\n\t// property is therefore *not* a request to remove live access controls.\n\t// Keep the two aspects independently opt-in so a future producer that can\n\t// declare one of them does not accidentally start managing the other.\n\tconst managesRls = schema.rlsEnabled !== undefined;\n\tconst managesPolicies = schema.policies !== undefined;\n\tif (!managesRls && !managesPolicies) return;\n\tconst schemaRlsEnabled = schema.rlsEnabled;\n\tconst dbRlsEnabled = db.rlsEnabled ?? false;\n\n\t// RLS enabled state changed\n\tif (managesRls && schemaRlsEnabled && !dbRlsEnabled) {\n\t\tchanges.push({\n\t\t\tkind: 'enable_rls',\n\t\t\ttable: schema.name,\n\t\t\tdestructive: false,\n\t\t\tdetails: `Enable RLS on table \"${schema.name}\"`,\n\t\t});\n\t} else if (managesRls && !schemaRlsEnabled && dbRlsEnabled) {\n\t\tchanges.push({\n\t\t\tkind: 'disable_rls',\n\t\t\ttable: schema.name,\n\t\t\tdestructive: false,\n\t\t\tdetails: `Disable RLS on table \"${schema.name}\"`,\n\t\t});\n\t}\n\n\tif (!managesPolicies) return;\n\tconst schemaPolicies = schema.policies!;\n\tconst dbPolicies = db.policies ?? [];\n\n\tconst schemaMap = new Map<string, PolicyIR>(\n\t\tschemaPolicies.map((p) => [p.name, p]),\n\t);\n\tconst dbMap = new Map<string, PolicyIR>(dbPolicies.map((p) => [p.name, p]));\n\n\t// In schema but not in DB → create\n\tfor (const [name, policy] of schemaMap) {\n\t\tif (!dbMap.has(name)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'create_policy',\n\t\t\t\ttable: schema.name,\n\t\t\t\tdestructive: false,\n\t\t\t\tdetails: `Create policy \"${name}\" on \"${schema.name}\"`,\n\t\t\t\tmeta: { policy },\n\t\t\t});\n\t\t} else {\n\t\t\t// Policy exists in both — compare all fields; if changed → drop + recreate\n\t\t\tconst dbPolicy = dbMap.get(name)!;\n\t\t\tconst changed =\n\t\t\t\tpolicy.command !== dbPolicy.command ||\n\t\t\t\tpolicy.using !== dbPolicy.using ||\n\t\t\t\tpolicy.withCheck !== dbPolicy.withCheck ||\n\t\t\t\tpolicy.permissive !== dbPolicy.permissive ||\n\t\t\t\tJSON.stringify(policy.roles ?? []) !==\n\t\t\t\t\tJSON.stringify(dbPolicy.roles ?? []);\n\t\t\tif (changed) {\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'drop_policy',\n\t\t\t\t\ttable: schema.name,\n\t\t\t\t\tdestructive: false,\n\t\t\t\t\tdetails: `Drop policy \"${name}\" on \"${schema.name}\" (changed)`,\n\t\t\t\t\tmeta: { policy: dbPolicy },\n\t\t\t\t});\n\t\t\t\tchanges.push({\n\t\t\t\t\tkind: 'create_policy',\n\t\t\t\t\ttable: schema.name,\n\t\t\t\t\tdestructive: false,\n\t\t\t\t\tdetails: `Create policy \"${name}\" on \"${schema.name}\"`,\n\t\t\t\t\tmeta: { policy },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// In DB but not in schema → drop\n\tfor (const [name, policy] of dbMap) {\n\t\tif (!schemaMap.has(name)) {\n\t\t\tchanges.push({\n\t\t\t\tkind: 'drop_policy',\n\t\t\t\ttable: schema.name,\n\t\t\t\tdestructive: false,\n\t\t\t\tdetails: `Drop policy \"${name}\" on \"${schema.name}\"`,\n\t\t\t\tmeta: { policy },\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction buildSummary(changes: readonly SchemaChange[]): DiffSummary {\n\tconst tables = { added: 0, dropped: 0 };\n\tconst columns = { added: 0, dropped: 0, altered: 0 };\n\tconst indexes = { added: 0, dropped: 0 };\n\tconst constraints = { added: 0, dropped: 0, altered: 0 };\n\n\tfor (const c of changes) {\n\t\tswitch (c.kind) {\n\t\t\tcase 'create_table':\n\t\t\t\ttables.added++;\n\t\t\t\tbreak;\n\t\t\tcase 'drop_table':\n\t\t\t\ttables.dropped++;\n\t\t\t\tbreak;\n\t\t\tcase 'add_column':\n\t\t\t\tcolumns.added++;\n\t\t\t\tbreak;\n\t\t\tcase 'drop_column':\n\t\t\t\tcolumns.dropped++;\n\t\t\t\tbreak;\n\t\t\tcase 'alter_column_type':\n\t\t\tcase 'alter_column_nullable':\n\t\t\tcase 'alter_column_default':\n\t\t\tcase 'alter_column_unique':\n\t\t\t\tcolumns.altered++;\n\t\t\t\tbreak;\n\t\t\tcase 'add_primary_key':\n\t\t\tcase 'add_foreign_key':\n\t\t\tcase 'add_check_constraint':\n\t\t\t\tconstraints.added++;\n\t\t\t\tbreak;\n\t\t\tcase 'drop_primary_key':\n\t\t\tcase 'drop_foreign_key':\n\t\t\tcase 'drop_check_constraint':\n\t\t\t\tconstraints.dropped++;\n\t\t\t\tbreak;\n\t\t\tcase 'alter_foreign_key':\n\t\t\tcase 'validate_constraint':\n\t\t\t\tconstraints.altered++;\n\t\t\t\tbreak;\n\t\t\tcase 'create_index':\n\t\t\t\tindexes.added++;\n\t\t\t\tbreak;\n\t\t\tcase 'drop_index':\n\t\t\t\tindexes.dropped++;\n\t\t\t\tbreak;\n\t\t\tcase 'create_enum':\n\t\t\tcase 'alter_enum_add_value':\n\t\t\tcase 'drop_enum':\n\t\t\t\t// ENUM changes are schema-level; not counted in table/column/index summaries\n\t\t\t\tbreak;\n\t\t\tcase 'alter_column_collation':\n\t\t\tcase 'alter_column_identity':\n\t\t\t\tcolumns.altered++;\n\t\t\t\tbreak;\n\t\t\tcase 'add_comment':\n\t\t\tcase 'drop_comment':\n\t\t\tcase 'create_extension':\n\t\t\tcase 'drop_extension':\n\t\t\tcase 'create_sequence':\n\t\t\tcase 'alter_sequence':\n\t\t\tcase 'drop_sequence':\n\t\t\tcase 'enable_rls':\n\t\t\tcase 'disable_rls':\n\t\t\tcase 'create_policy':\n\t\t\tcase 'drop_policy':\n\t\t\t\t// Schema-level or metadata changes; not counted in table/column/index/constraint summaries\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn { tables, columns, indexes, constraints };\n}\n\n/** Stable structural index comparison; index names are cosmetic. */\nexport function indexComparisonKey(index: IndexIR): string {\n\treturn JSON.stringify({\n\t\tcolumns: index.columns,\n\t\tunique: index.unique === true,\n\t\tnullsNotDistinct: index.unique === true && index.nullsNotDistinct === true,\n\t\tmethod: index.method ?? 'btree',\n\t\t// `undefined` is the only absence value. Keep it distinct from a present\n\t\t// empty predicate so a caller cannot silently turn a partial unique index\n\t\t// into a global unique index.\n\t\twhere: index.where,\n\t\texpressions: index.expressions ?? [],\n\t\tinclude: index.include ?? [],\n\t\topclass: sortedIndexOptionRecord(index.opclass),\n\t\twith: sortedIndexOptionRecord(index.with),\n\t});\n}\n\nfunction sortedIndexOptionRecord(\n\trecord: Readonly<Record<string, string>> | undefined,\n): Readonly<Record<string, string>> {\n\treturn Object.fromEntries(\n\t\tObject.entries(record ?? {}).sort(([left], [right]) =>\n\t\t\tleft < right ? -1 : left > right ? 1 : 0,\n\t\t),\n\t);\n}\n","import type { CheckConstraintIR } from '@dbsp/types';\nimport type { NamingPlugin } from './naming-plugin.js';\n\nexport class CheckConstraintNameCollisionError extends Error {\n\tconstructor(\n\t\tpublic readonly table: string,\n\t\tpublic readonly firstAuthoredName: string,\n\t\tpublic readonly secondAuthoredName: string,\n\t\tpublic readonly databaseName: string,\n\t) {\n\t\tsuper(\n\t\t\t`CHECK constraint name collision on table \"${table}\": authored constraints ` +\n\t\t\t\t`\"${firstAuthoredName}\" and \"${secondAuthoredName}\" both resolve to ` +\n\t\t\t\t`physical name \"${databaseName}\". Rename one of the constraints.`,\n\t\t);\n\t\tthis.name = 'CheckConstraintNameCollisionError';\n\t}\n}\n\nexport function getCheckConstraintDatabaseName(\n\tcheck: Pick<CheckConstraintIR, 'name'>,\n\tnaming: NamingPlugin,\n): string {\n\treturn naming.toDatabase(check.name);\n}\n\nexport function assertNoCheckConstraintNameCollisions(\n\ttable: {\n\t\treadonly name: string;\n\t\treadonly checkConstraints?: readonly Pick<CheckConstraintIR, 'name'>[];\n\t},\n\tnaming: NamingPlugin,\n): void {\n\tconst seen = new Map<string, string>();\n\tfor (const check of table.checkConstraints ?? []) {\n\t\tconst databaseName = getCheckConstraintDatabaseName(check, naming);\n\t\tconst previous = seen.get(databaseName);\n\t\tif (previous !== undefined) {\n\t\t\tthrow new CheckConstraintNameCollisionError(\n\t\t\t\ttable.name,\n\t\t\t\tprevious,\n\t\t\t\tcheck.name,\n\t\t\t\tdatabaseName,\n\t\t\t);\n\t\t}\n\t\tseen.set(databaseName, check.name);\n\t}\n}\n","import type { CheckConstraintIR } from '@dbsp/types';\n\nconst CHECK_NOT_VALID_SUFFIX =\n\t/^(?<clause>\\s*CHECK\\s*\\(.*\\)(?:\\s+NO\\s+INHERIT)?)\\s+NOT\\s+VALID\\s*$/isu;\n\nfunction toCheckConstraintClause(expression: string): string {\n\tconst trimmed = stripNotValidSuffix(expression.trim()).trim();\n\tif (/^CHECK\\s*\\(/iu.test(trimmed)) {\n\t\treturn trimmed;\n\t}\n\treturn `CHECK (${trimmed})`;\n}\n\nexport interface SplitCheckConstraintState {\n\treadonly expression: string;\n\treadonly notValid: boolean;\n}\n\nexport function splitCheckConstraintState(\n\tcheck: Pick<CheckConstraintIR, 'expression' | 'notValid'>,\n): SplitCheckConstraintState {\n\treturn {\n\t\texpression: toCheckConstraintClause(check.expression),\n\t\tnotValid:\n\t\t\tcheck.notValid !== undefined\n\t\t\t\t? check.notValid\n\t\t\t\t: hasNotValidSuffix(check.expression),\n\t};\n}\n\nexport function renderCheckConstraintClause(\n\tcheck: Pick<CheckConstraintIR, 'expression' | 'notValid'>,\n): string {\n\tconst state = splitCheckConstraintState(check);\n\treturn state.notValid ? `${state.expression} NOT VALID` : state.expression;\n}\n\nexport function isCheckConstraintNotValid(\n\tcheck: Pick<CheckConstraintIR, 'expression' | 'notValid'>,\n): boolean {\n\treturn splitCheckConstraintState(check).notValid;\n}\n\nexport function stripNotValidSuffix(expression: string): string {\n\treturn expression.replace(CHECK_NOT_VALID_SUFFIX, '$<clause>');\n}\n\nfunction hasNotValidSuffix(expression: string): boolean {\n\treturn CHECK_NOT_VALID_SUFFIX.test(expression);\n}\n","/**\n * DDL Generator - Generates PostgreSQL DDL statements from ModelIR\n *\n * Generates SQL strings directly for better compatibility and control.\n * Two-pass strategy handles circular FK dependencies.\n *\n * @module ddl/ddl-generator\n */\n\nimport type {\n\tColumnIR,\n\tDialectCapabilities,\n\tForeignKeyIR,\n\tIndexIR,\n\tModelIR,\n\tPolicyIR,\n\tTableIR,\n} from '@dbsp/types';\nimport { identityNaming, type NamingPlugin } from '../naming-plugin.js';\nimport { getPostgresqlCapabilitiesTargetVersion } from '../postgresql-capabilities.js';\nimport { validateIdentifier, validateSqlExpression } from '../validate.js';\nimport { normalizeOptionalBoolean } from './generated-source-normalizers.js';\nimport {\n\tassertCreateIndexesSupported,\n\ttype IndexCapabilityContext,\n\ttype IndexRenderSpec,\n\trenderCreateIndex,\n} from './index-render.js';\nimport { generateCommentsPhase } from './phases/comments.js';\nimport { generateConstraintsPhase } from './phases/constraints.js';\nimport { generateDropStatementsPhase } from './phases/drop-statements.js';\nimport { generateEnumTypesPhase } from './phases/enum-types.js';\nimport { generateExtensionsPhase } from './phases/extensions.js';\nimport { generateIndexesPhase } from './phases/indexes.js';\nimport { generateRlsPhase } from './phases/rls.js';\nimport { generateSequencesPhase } from './phases/sequences.js';\nimport { generateTablesPhase } from './phases/tables.js';\nimport { type PhaseContext, sup } from './phases/types.js';\nimport {\n\tformatSqlDefault,\n\tquoteCollation,\n\tquoteRoleName,\n} from './phases/utils.js';\nimport {\n\tassertSchemaName,\n\tcollectModelScopeEvidence,\n\tMODEL_SCHEMA_SCOPE_SUBJECT,\n} from './schema-scope.js';\nimport { mapColumnType, mapOnDeleteAction } from './type-mapping.js';\n\n// ============================================================================\n// Options\n// ============================================================================\n\nexport interface GenerateDDLOptions {\n\t/** Include DROP TABLE IF EXISTS statements before CREATE TABLE */\n\treadonly includeDropStatements?: boolean;\n\t/**\n\t * Database schema name (e.g., 'public', 'tenant_123').\n\t * Required when emitted DDL would otherwise mix non-default target-scoped\n\t * custom types/enums with unqualified table SQL.\n\t */\n\treadonly schemaName?: string;\n\t/**\n\t * Automatically create indexes on foreign key columns.\n\t * FK columns are frequently used in JOINs, so indexing is a best practice.\n\t * @default true\n\t */\n\treadonly fkAutoIndex?: boolean;\n\t/** Naming plugin for identifier transformation */\n\treadonly naming?: NamingPlugin;\n\t/** Dialect capabilities — unsupported index features throw during DDL generation */\n\treadonly dialectCapabilities?: DialectCapabilities;\n}\n\n// ============================================================================\n// Shared Validation Helpers\n// ============================================================================\n\n/**\n * Valid PostgreSQL table partitioning strategies.\n * Used in PARTITION BY <strategy> clauses.\n */\nconst ALLOWED_PARTITION_STRATEGIES = ['RANGE', 'LIST', 'HASH'] as const;\ntype PartitionStrategy = (typeof ALLOWED_PARTITION_STRATEGIES)[number];\n\n/**\n * Assert that a partition strategy string is one of the allowed values.\n * Normalises to uppercase. Throws on invalid input.\n *\n * Exported so that migration-sql.ts can reuse the same guard without\n * duplicating the allowlist.\n *\n * @security Defense-in-depth: prevents raw strategy strings from being\n * interpolated into SQL without allowlist validation.\n */\nexport function assertPartitionStrategy(value: string): PartitionStrategy {\n\tconst upper = value.toUpperCase() as PartitionStrategy;\n\tif (!ALLOWED_PARTITION_STRATEGIES.includes(upper)) {\n\t\tthrow new Error(\n\t\t\t`Invalid partition strategy \"${value}\". ` +\n\t\t\t\t`Must be one of: ${ALLOWED_PARTITION_STRATEGIES.join(', ')}.`,\n\t\t);\n\t}\n\treturn upper;\n}\n\n// ============================================================================\n// Main DDL Generation\n// ============================================================================\n\n/**\n * Generate DDL statements from a ModelIR schema.\n *\n * Uses a two-pass approach to handle circular FK dependencies:\n * 1. CREATE TABLE (without FK constraints)\n * 2. ALTER TABLE ADD CONSTRAINT for foreign keys\n * 3. CREATE INDEX (explicit + auto-generated for FKs)\n *\n * @param schema - The ModelIR schema to generate DDL from\n * @param options - Optional configuration\n * @returns Array of DDL statements in dependency order\n */\nexport function generateDDL(\n\tschema: ModelIR,\n\toptions: GenerateDDLOptions = {},\n): string[] {\n\tconst {\n\t\tincludeDropStatements = false,\n\t\tschemaName,\n\t\tfkAutoIndex = true,\n\t\tnaming = identityNaming,\n\t\tdialectCapabilities: caps,\n\t} = options;\n\n\tconst tables = Array.from(schema.tables.values());\n\tconst scope = collectModelScopeEvidence(schema, {\n\t\tincludeEnums: sup(caps, caps?.supportsDDLEnumTypes),\n\t});\n\tassertSchemaName(scope, schemaName, MODEL_SCHEMA_SCOPE_SUBJECT);\n\n\tconst ctx: PhaseContext = {\n\t\tschema,\n\t\ttables,\n\t\tschemaName,\n\t\tnaming,\n\t\tcaps,\n\t\tfkAutoIndex,\n\t\tincludeDropStatements,\n\t};\n\tassertCreateIndexesSupported(\n\t\tcollectGeneratedCreateIndexSpecs(tables, schemaName, naming, fkAutoIndex),\n\t\tindexContextFromCaps(caps),\n\t);\n\n\tconst statements = [\n\t\t...generateExtensionsPhase(ctx), // PASS -1: CREATE EXTENSION\n\t\t...generateSequencesPhase(ctx), // PASS -0.5: CREATE SEQUENCE\n\t\t...generateDropStatementsPhase(ctx), // PASS 0: DROP TABLE (optional)\n\t\t...generateEnumTypesPhase(ctx), // PASS 0.5: CREATE TYPE ... AS ENUM\n\t\t...generateTablesPhase(ctx), // PASS 1: CREATE TABLE\n\t\t...generateConstraintsPhase(ctx), // PASS 2 + 2.5: FK + CHECK constraints\n\t\t...generateIndexesPhase(ctx), // PASS 3: CREATE INDEX\n\t\t...generateRlsPhase(ctx), // PASS 3.5: RLS + policies\n\t\t...generateCommentsPhase(ctx), // PASS 4: COMMENT ON\n\t];\n\n\treturn statements;\n}\n\nfunction buildIndexRenderSpec(\n\ttableName: string,\n\tidx: IndexIR,\n\tschemaName: string | undefined,\n\tnaming: NamingPlugin,\n): IndexRenderSpec {\n\treturn {\n\t\tname: idx.name ?? `idx_${tableName}_${idx.columns.join('_')}`,\n\t\ttable: naming.toDatabase(tableName),\n\t\tschema: schemaName,\n\t\tunique: idx.unique === true,\n\t\tmethod: idx.method,\n\t\tkeys: [\n\t\t\t...(idx.expressions ?? []).map((expression) => ({ expression })),\n\t\t\t...idx.columns.map((col) => ({\n\t\t\t\tcolumn: naming.toDatabase(col),\n\t\t\t\topclass: idx.opclass?.[col],\n\t\t\t})),\n\t\t],\n\t\tinclude: idx.include?.map((col) => naming.toDatabase(col)),\n\t\tnullsNotDistinct: idx.nullsNotDistinct,\n\t\twith: idx.with,\n\t\twhere: idx.where,\n\t\twhereSource: idx,\n\t};\n}\n\nfunction collectGeneratedCreateIndexSpecs(\n\ttables: readonly TableIR[],\n\tschemaName: string | undefined,\n\tnaming: NamingPlugin,\n\tfkAutoIndex: boolean,\n): IndexRenderSpec[] {\n\tconst specs: IndexRenderSpec[] = [];\n\tfor (const table of tables) {\n\t\tconst explicitIndexColumns = new Set(\n\t\t\ttable.indexes.flatMap((idx) =>\n\t\t\t\tidx.columns.length === 1 ? idx.columns : [],\n\t\t\t),\n\t\t);\n\t\tfor (const idx of table.indexes) {\n\t\t\tspecs.push(buildIndexRenderSpec(table.name, idx, schemaName, naming));\n\t\t}\n\t\tif (!fkAutoIndex) continue;\n\t\tfor (const fk of table.foreignKeys) {\n\t\t\tconst fkCol = fk.columns[0];\n\t\t\tif (\n\t\t\t\tfk.columns.length === 1 &&\n\t\t\t\tfkCol &&\n\t\t\t\t!explicitIndexColumns.has(fkCol)\n\t\t\t) {\n\t\t\t\tconst dbTableName = naming.toDatabase(table.name);\n\t\t\t\tconst dbFkCol = naming.toDatabase(fkCol);\n\t\t\t\tspecs.push(\n\t\t\t\t\tbuildIndexRenderSpec(\n\t\t\t\t\t\ttable.name,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: `idx_${dbTableName}_${dbFkCol}`,\n\t\t\t\t\t\t\tcolumns: [fkCol],\n\t\t\t\t\t\t\tunique: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tschemaName,\n\t\t\t\t\t\tnaming,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\treturn specs;\n}\n\nfunction indexContextFromCaps(\n\tcaps: DialectCapabilities | undefined,\n): IndexCapabilityContext | undefined {\n\treturn caps\n\t\t? { caps, targetVersion: getPostgresqlCapabilitiesTargetVersion(caps) }\n\t\t: undefined;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Quote an identifier (table name, column name, etc.)\n */\n/**\n * Quote an identifier (table name, column name, etc.) for use in DDL.\n *\n * @security Validates the identifier via validateIdentifier() before quoting.\n * Escapes embedded double-quotes by doubling them as defense-in-depth.\n * Only call this with identifiers that have been validated upstream (table names,\n * column names, policy names). Do NOT call with raw user input without validation.\n */\nfunction quoteIdentifier(name: string): string {\n\tvalidateIdentifier(name, 'alias');\n\t// Defense-in-depth: escape any embedded double-quotes by doubling them.\n\treturn `\"${name.replace(/\"/g, '\"\"')}\"`;\n}\n\n/**\n * Qualify a table name with optional schema.\n */\nfunction qualifyTable(\n\ttableName: string,\n\tschemaName: string | undefined,\n\tnaming: NamingPlugin,\n): string {\n\tconst table = quoteIdentifier(naming.toDatabase(tableName));\n\tif (schemaName) {\n\t\treturn `${quoteIdentifier(schemaName)}.${table}`;\n\t}\n\treturn table;\n}\n\n// ============================================================================\n// DROP TABLE\n// ============================================================================\n\nexport function generateDropTable(\n\ttableName: string,\n\tschemaName: string | undefined,\n\tnaming: NamingPlugin,\n): string {\n\tconst qualifiedTable = qualifyTable(tableName, schemaName, naming);\n\treturn `DROP TABLE IF EXISTS ${qualifiedTable} CASCADE;`;\n}\n\n// ============================================================================\n// CREATE TABLE\n// ============================================================================\n\nexport function generateCreateTable(\n\ttable: TableIR,\n\tschemaName: string | undefined,\n\tnaming: NamingPlugin,\n): string {\n\tconst qualifiedTable = qualifyTable(table.name, schemaName, naming);\n\tconst elements: string[] = [];\n\n\t// Add columns\n\tfor (const col of table.columns) {\n\t\telements.push(generateColumnDef(col, naming, schemaName));\n\t}\n\n\t// Add primary key constraint (omit if no PK defined)\n\tif (table.primaryKey !== undefined) {\n\t\t// Normalize primaryKey: typed as string | readonly string[], but\n\t\t// introspected models may pass { columns: string[] } — extract columns defensively.\n\t\tconst rawPk = table.primaryKey as unknown;\n\t\tlet pkColumns: readonly string[];\n\t\tif (\n\t\t\trawPk !== null &&\n\t\t\ttypeof rawPk === 'object' &&\n\t\t\t'columns' in rawPk &&\n\t\t\tArray.isArray((rawPk as { columns: unknown }).columns)\n\t\t) {\n\t\t\tpkColumns = (rawPk as { columns: string[] }).columns;\n\t\t} else if (Array.isArray(rawPk)) {\n\t\t\tpkColumns = rawPk as readonly string[];\n\t\t} else {\n\t\t\tpkColumns = [rawPk as string];\n\t\t}\n\t\tconst pkCols = pkColumns\n\t\t\t.map((col) => quoteIdentifier(naming.toDatabase(col)))\n\t\t\t.join(', ');\n\t\tconst pkName = quoteIdentifier(`pk_${table.name}`);\n\t\telements.push(`CONSTRAINT ${pkName} PRIMARY KEY (${pkCols})`);\n\t}\n\n\tconst elementsStr = elements.map((el) => ` ${el}`).join(',\\n');\n\tlet sql = `CREATE TABLE ${qualifiedTable} (\\n${elementsStr}\\n)`;\n\tif (table.partition) {\n\t\tconst strategy = assertPartitionStrategy(table.partition.strategy);\n\t\tconst partCols = table.partition.columns\n\t\t\t.map((col) => quoteIdentifier(naming.toDatabase(col)))\n\t\t\t.join(', ');\n\t\tsql += ` PARTITION BY ${strategy} (${partCols})`;\n\t}\n\tsql += ';';\n\treturn sql;\n}\n\n/**\n * Generate a column definition string.\n */\nexport function generateColumnDef(\n\tcol: ColumnIR,\n\tnaming: NamingPlugin,\n\ttargetSchema?: string,\n): string {\n\tconst parts: string[] = [];\n\n\t// Column name and type\n\tparts.push(quoteIdentifier(naming.toDatabase(col.name)));\n\tconst type = mapColumnType(col, targetSchema);\n\tparts.push(type);\n\n\t// NOT NULL constraint (SERIAL/BIGSERIAL imply NOT NULL)\n\tif (!col.nullable && type !== 'SERIAL' && type !== 'BIGSERIAL') {\n\t\tparts.push('NOT NULL');\n\t}\n\n\t// DEFAULT constraint\n\tif (col.default !== undefined) {\n\t\tparts.push(`DEFAULT ${formatDefaultValue(col.default)}`);\n\t}\n\n\t// UNIQUE constraint\n\tif (col.unique) {\n\t\tparts.push('UNIQUE');\n\t}\n\n\t// COLLATE (must come after type)\n\t// S-2: validate collation name before quoting — uses quoteCollation which\n\t// accepts locale strings like `en_US.utf8`, `en-US-x-icu`, `C.UTF-8`\n\t// that contain dots/hyphens rejected by the standard identifier validator.\n\tif (col.collation) {\n\t\tparts.push(`COLLATE ${quoteCollation(col.collation)}`);\n\t}\n\n\t// GENERATED AS IDENTITY\n\tif (col.identity) {\n\t\tconst gen = col.identity === 'always' ? 'ALWAYS' : 'BY DEFAULT';\n\t\tparts.push(`GENERATED ${gen} AS IDENTITY`);\n\t}\n\n\treturn parts.join(' ');\n}\n\n/**\n * Format a default value for SQL.\n */\n/**\n * Format a default value for SQL.\n *\n * @security The `{ sql: string }` escape hatch is validated via validateSqlExpression()\n * before interpolation to prevent injection of multi-statement or comment-bearing strings.\n */\n// M-6: formatDefaultValue is now a thin alias for the shared formatSqlDefault from phases/utils.\n// The duplicate implementations have been consolidated.\n// The doc-comment security note is on formatSqlDefault in packages/adapter-pgsql/src/ddl/phases/utils.ts.\nfunction formatDefaultValue(value: unknown): string {\n\treturn formatSqlDefault(value, 'ddl-generator default');\n}\n\n// ============================================================================\n// ALTER TABLE (Foreign Keys)\n// ============================================================================\n\nexport function generateAlterTableAddFK(\n\ttableName: string,\n\tfk: ForeignKeyIR,\n\tschemaName: string | undefined,\n\tnaming: NamingPlugin,\n): string {\n\tconst qualifiedTable = qualifyTable(tableName, schemaName, naming);\n\tconst constraintName = quoteIdentifier(\n\t\t`fk_${tableName}_${fk.columns.join('_')}`,\n\t);\n\n\t// Local columns\n\tconst fkCols = fk.columns\n\t\t.map((col) => quoteIdentifier(naming.toDatabase(col)))\n\t\t.join(', ');\n\n\t// Referenced table and columns resolve to a declared schema, or the DDL schema when absent.\n\tconst refTable =\n\t\tfk.references.schema !== undefined\n\t\t\t? qualifyTable(fk.references.table, fk.references.schema, naming)\n\t\t\t: qualifyTable(fk.references.table, schemaName, naming);\n\tconst refCols = fk.references.columns\n\t\t.map((col) => quoteIdentifier(naming.toDatabase(col)))\n\t\t.join(', ');\n\n\t// ON DELETE / ON UPDATE / DEFERRABLE actions\n\tconst onDelete = fk.onDelete\n\t\t? ` ON DELETE ${mapOnDeleteAction(fk.onDelete)}`\n\t\t: '';\n\tconst onUpdate = fk.onUpdate\n\t\t? ` ON UPDATE ${mapOnDeleteAction(fk.onUpdate)}`\n\t\t: '';\n\tconst deferred =\n\t\tnormalizeOptionalBoolean(fk.deferred, 'foreign key deferred') === true\n\t\t\t? ' DEFERRABLE INITIALLY DEFERRED'\n\t\t\t: '';\n\tconst notValid =\n\t\tnormalizeOptionalBoolean(fk.notValid, 'foreign key notValid') === true\n\t\t\t? ' NOT VALID'\n\t\t\t: '';\n\n\treturn `ALTER TABLE ${qualifiedTable} ADD CONSTRAINT ${constraintName} FOREIGN KEY (${fkCols}) REFERENCES ${refTable} (${refCols})${onDelete}${onUpdate}${deferred}${notValid};`;\n}\n\n// ============================================================================\n// CREATE INDEX\n// ============================================================================\n\nexport function generateCreateIndex(\n\ttableName: string,\n\tidx: IndexIR,\n\tschemaName: string | undefined,\n\tnaming: NamingPlugin,\n\tcontext?: IndexCapabilityContext,\n\tifNotExists?: boolean,\n): string {\n\tconst spec = buildIndexRenderSpec(tableName, idx, schemaName, naming);\n\treturn `${renderCreateIndex(\n\t\tifNotExists === undefined ? spec : { ...spec, ifNotExists },\n\t\tcontext,\n\t)};`;\n}\n\n/**\n * Returns whether the PostgreSQL DDL generator can emit this IndexIR.\n *\n * Keep this as the single representability predicate for generated schema\n * omission and destructive-drop classification: both sides must agree on the\n * exact validation surface used by generateCreateIndex().\n */\nexport function canGenerateCreateIndex(\n\ttableName: string,\n\tidx: IndexIR,\n\tschemaName: string | undefined = undefined,\n\tnaming: NamingPlugin = identityNaming,\n): boolean {\n\ttry {\n\t\tgenerateCreateIndex(tableName, idx, schemaName, naming);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n// ============================================================================\n// generateCreatePolicy\n// ============================================================================\n\n/**\n * Generate a CREATE POLICY statement.\n */\nexport function generateCreatePolicy(\n\ttableName: string,\n\tpolicy: PolicyIR,\n\tschemaName: string | undefined,\n\tnaming: NamingPlugin,\n): string {\n\tconst qualifiedTable = qualifyTable(tableName, schemaName, naming);\n\tconst policyName = quoteIdentifier(policy.name);\n\tconst ALLOWED_RLS_COMMANDS = [\n\t\t'ALL',\n\t\t'SELECT',\n\t\t'INSERT',\n\t\t'UPDATE',\n\t\t'DELETE',\n\t] as const;\n\t// Snapshot-once: read command ONCE before typeof guard + toUpperCase so a\n\t// getter-backed forged value cannot switch between the guard and the render.\n\tconst rawCommand = policy.command;\n\tif (\n\t\trawCommand !== undefined &&\n\t\trawCommand !== null &&\n\t\ttypeof rawCommand !== 'string'\n\t) {\n\t\tthrow new Error(\n\t\t\t`RLS policy command must be a string, got ${typeof rawCommand}.`,\n\t\t);\n\t}\n\tconst rlsCommand = rawCommand ? rawCommand.toUpperCase() : 'ALL';\n\tif (\n\t\t!ALLOWED_RLS_COMMANDS.includes(\n\t\t\trlsCommand as (typeof ALLOWED_RLS_COMMANDS)[number],\n\t\t)\n\t) {\n\t\tthrow new Error(\n\t\t\t`Invalid RLS policy command \"${rawCommand}\". ` +\n\t\t\t\t`Must be one of: ${ALLOWED_RLS_COMMANDS.join(', ')}.`,\n\t\t);\n\t}\n\tconst forClause = rlsCommand !== 'ALL' ? ` FOR ${rlsCommand}` : ' FOR ALL';\n\tconst asClause =\n\t\tpolicy.permissive === false ? ' AS RESTRICTIVE' : ' AS PERMISSIVE';\n\t// M-4: role names use quoteRoleName() (allows spaces/hyphens, blocks injection vectors)\n\t// rather than quoteIdentifier() (which only allows \\w$ characters).\n\tconst toClause =\n\t\tpolicy.roles && policy.roles.length > 0\n\t\t\t? ` TO ${policy.roles.map((r) => quoteRoleName(r)).join(', ')}`\n\t\t\t: '';\n\t// Snapshot-once: read each field EXACTLY ONCE into a local const, validate and render\n\t// only that local. A getter-backed forged object could return a safe value on the\n\t// first read (validation) and a malicious value on the second read (render).\n\tconst usingExpr = policy.using;\n\tif (usingExpr !== undefined && usingExpr !== null && usingExpr !== '') {\n\t\tif (typeof usingExpr !== 'string') {\n\t\t\tthrow new Error(\n\t\t\t\t`RLS policy USING: expression must be a plain string, got ${typeof usingExpr}.`,\n\t\t\t);\n\t\t}\n\t\tvalidateSqlExpression(usingExpr, 'policy USING expression');\n\t}\n\tconst withCheckExpr = policy.withCheck;\n\tif (\n\t\twithCheckExpr !== undefined &&\n\t\twithCheckExpr !== null &&\n\t\twithCheckExpr !== ''\n\t) {\n\t\tif (typeof withCheckExpr !== 'string') {\n\t\t\tthrow new Error(\n\t\t\t\t`RLS policy WITH CHECK: expression must be a plain string, got ${typeof withCheckExpr}.`,\n\t\t\t);\n\t\t}\n\t\tvalidateSqlExpression(withCheckExpr, 'policy WITH CHECK expression');\n\t}\n\tconst usingClause = usingExpr ? ` USING (${usingExpr})` : '';\n\tconst withCheckClause = withCheckExpr ? ` WITH CHECK (${withCheckExpr})` : '';\n\treturn `CREATE POLICY ${policyName} ON ${qualifiedTable}${forClause}${asClause}${toClause}${usingClause}${withCheckClause};`;\n}\n","/** Normalize source facts shared by SQL emission and managed-step declarations. */\nconst STRICT_INTEGER = /^[+-]?\\d+$/;\nconst POSTGRES_SEQUENCE_MIN = -9223372036854775808n;\nconst POSTGRES_SEQUENCE_MAX = 9223372036854775807n;\nconst POSTGRES_SEQUENCE_MAX_DIGITS = '9223372036854775807';\nconst POSTGRES_SEQUENCE_MIN_DIGITS = '9223372036854775808';\n\n/** Refuse the one PostgreSQL sequence integer which is syntactically valid but unusable. */\nexport function assertNonZeroSequenceIncrement(\n\tvalue: string | undefined,\n\tcontext: string,\n): void {\n\tif (value === '0')\n\t\tthrow new Error(`${context}: sequence increment must be non-zero`);\n}\n\n/** Return one canonical base-10 spelling for an optional sequence integer. */\nexport function normalizeSequenceInteger(\n\tvalue: unknown,\n\tcontext: string,\n): string | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value === 'number') {\n\t\tif (!Number.isSafeInteger(value))\n\t\t\tthrow new Error(\n\t\t\t\t`${context}: expected a safe integer; use a strict decimal string for larger exact values`,\n\t\t\t);\n\t\tvalue = Object.is(value, -0) ? '0' : String(value);\n\t}\n\tif (typeof value !== 'string')\n\t\tthrow new Error(\n\t\t\t`${context}: expected a finite number or numeric string, received ${typeof value}`,\n\t\t);\n\tif (!STRICT_INTEGER.test(value))\n\t\tthrow new Error(`${context}: expected an integer or strict integer string`);\n\tconst negative = value.startsWith('-');\n\tconst digits = value.replace(/^[+-]?0*/, '') || '0';\n\tconst normalized = digits === '0' ? '0' : negative ? `-${digits}` : digits;\n\t// Bound the lexical domain before parsing: hostile decimal strings must not\n\t// allocate an arbitrarily large BigInt merely to be refused.\n\tif (\n\t\tdigits.length > POSTGRES_SEQUENCE_MAX_DIGITS.length ||\n\t\t(digits.length === POSTGRES_SEQUENCE_MAX_DIGITS.length &&\n\t\t\t((negative && digits > POSTGRES_SEQUENCE_MIN_DIGITS) ||\n\t\t\t\t(!negative && digits > POSTGRES_SEQUENCE_MAX_DIGITS)))\n\t)\n\t\tthrow new Error(`${context}: outside PostgreSQL sequence bounds`);\n\tconst integer = BigInt(normalized);\n\tif (integer < POSTGRES_SEQUENCE_MIN || integer > POSTGRES_SEQUENCE_MAX)\n\t\tthrow new Error(`${context}: outside PostgreSQL sequence bounds`);\n\treturn normalized;\n}\n\n/** Validate an optional source boolean before a DDL truthiness decision. */\nexport function normalizeOptionalBoolean(\n\tvalue: unknown,\n\tcontext: string,\n): boolean | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== 'boolean')\n\t\tthrow new Error(`${context}: expected a boolean`);\n\treturn value;\n}\n","/**\n * DDL Phase: Comments\n *\n * Generates COMMENT ON TABLE and COMMENT ON COLUMN statements.\n * Guarded by the supportsDDLComments capability flag.\n *\n * @module ddl/phases/comments\n */\n\nimport { assertString } from '../../validate.js';\nimport { type PhaseContext, sup } from './types.js';\nimport {\n\tqualifyTableIdent as qualifyTable,\n\tquoteIdent as quoteId,\n} from './utils.js';\n\n/**\n * Generate COMMENT ON TABLE and COMMENT ON COLUMN statements.\n *\n * @param ctx - Phase context\n * @returns Array of DDL statements (empty if comments are unsupported by the dialect)\n */\nexport function generateCommentsPhase(ctx: PhaseContext): string[] {\n\tconst { tables, schemaName, naming, caps } = ctx;\n\tif (!sup(caps, caps?.supportsDDLComments)) {\n\t\treturn [];\n\t}\n\tconst statements: string[] = [];\n\tfor (const table of tables) {\n\t\tconst tableComment = table.comment;\n\t\tif (tableComment) {\n\t\t\tassertString(tableComment, 'table comment');\n\t\t\tconst qualifiedTable = qualifyTable(table.name, schemaName, naming);\n\t\t\tstatements.push(\n\t\t\t\t`COMMENT ON TABLE ${qualifiedTable} IS '${tableComment.replace(/'/g, \"''\")}';`,\n\t\t\t);\n\t\t}\n\t\tfor (const col of table.columns) {\n\t\t\tconst columnComment = col.comment;\n\t\t\tif (columnComment) {\n\t\t\t\tassertString(columnComment, 'column comment');\n\t\t\t\tconst qualifiedTable = qualifyTable(table.name, schemaName, naming);\n\t\t\t\tstatements.push(\n\t\t\t\t\t`COMMENT ON COLUMN ${qualifiedTable}.${quoteId(naming.toDatabase(col.name))} IS '${columnComment.replace(/'/g, \"''\")}';`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\treturn statements;\n}\n","/**\n * Shared types for DDL generation phases.\n *\n * Each phase receives a PhaseContext containing the full set of\n * generation options resolved from GenerateDDLOptions.\n *\n * @module ddl/phases/types\n */\n\nimport type { DialectCapabilities, ModelIR, TableIR } from '@dbsp/types';\nimport type { NamingPlugin } from '../../naming-plugin.js';\n\n/**\n * Resolved context passed to every DDL generation phase.\n * Contains all options from GenerateDDLOptions plus the resolved tables array.\n */\nexport type PhaseContext = {\n\treadonly schema: ModelIR;\n\treadonly tables: TableIR[];\n\t/** Database schema identifier resolved from GenerateDDLOptions; never pass through naming plugins. */\n\treadonly schemaName: string | undefined;\n\treadonly naming: NamingPlugin;\n\treadonly caps: DialectCapabilities | undefined;\n\treadonly fkAutoIndex: boolean;\n\treadonly includeDropStatements: boolean;\n};\n\n/**\n * Check whether a DDL feature is supported given DialectCapabilities.\n *\n * - `undefined` caps: no capability restriction → feature is on by default.\n * - `false`: capability explicitly disabled → feature is skipped.\n * - `true`: capability explicitly enabled → feature is included.\n */\nexport function sup(\n\tcaps: DialectCapabilities | undefined,\n\tflag: boolean | undefined,\n): boolean {\n\treturn !caps || flag === true;\n}\n","/**\n * DDL Phase: Constraints\n *\n * Generates ALTER TABLE ADD CONSTRAINT statements for:\n * 1. Foreign keys (always included — no capability flag, FKs are core SQL)\n * 2. Check constraints (guarded by supportsDDLCheckConstraints)\n *\n * Runs after CREATE TABLE to handle circular FK dependencies.\n *\n * @module ddl/phases/constraints\n */\n\nimport {\n\tassertNoCheckConstraintNameCollisions,\n\tgetCheckConstraintDatabaseName,\n} from '../../check-constraint-name.js';\nimport { renderCheckConstraintClause } from '../../check-expression.js';\nimport { isEngineCanonicalCheck } from '../../expression-provenance.js';\nimport { validateCheckExpression } from '../../validate.js';\nimport { generateAlterTableAddFK } from '../ddl-generator.js';\nimport { escapeCanonicalSqlLiterals } from '../rendered-sql.js';\nimport { type PhaseContext, sup } from './types.js';\nimport {\n\tqualifyTableIdent as qualifyTable,\n\tquoteIdent as quoteId,\n} from './utils.js';\n\n/**\n * Generate ALTER TABLE ADD CONSTRAINT statements for foreign keys and check constraints.\n *\n * @param ctx - Phase context\n * @returns Array of DDL statements\n */\nexport function generateConstraintsPhase(ctx: PhaseContext): string[] {\n\tconst { tables, schemaName, naming, caps } = ctx;\n\tconst statements: string[] = [];\n\n\t// FK constraints (two-pass approach: tables first, then FKs to handle circularity)\n\tfor (const table of tables) {\n\t\tfor (const fk of table.foreignKeys) {\n\t\t\tstatements.push(\n\t\t\t\tgenerateAlterTableAddFK(table.name, fk, schemaName, naming),\n\t\t\t);\n\t\t}\n\t}\n\n\t// Check constraints\n\tif (sup(caps, caps?.supportsDDLCheckConstraints)) {\n\t\tfor (const table of tables) {\n\t\t\tassertNoCheckConstraintNameCollisions(table, naming);\n\t\t\tfor (const check of table.checkConstraints ?? []) {\n\t\t\t\tconst qualifiedTable = qualifyTable(table.name, schemaName, naming);\n\t\t\t\tconst constraintName = quoteId(\n\t\t\t\t\tgetCheckConstraintDatabaseName(check, naming),\n\t\t\t\t);\n\t\t\t\tconst canonicalCheck = isEngineCanonicalCheck(check);\n\t\t\t\tconst expression = renderCheckConstraintClause(check);\n\t\t\t\tif (!canonicalCheck) {\n\t\t\t\t\tvalidateCheckExpression(expression, 'check constraint expression');\n\t\t\t\t}\n\t\t\t\tstatements.push(\n\t\t\t\t\t`ALTER TABLE ${qualifiedTable} ADD CONSTRAINT ${constraintName} ${canonicalCheck ? escapeCanonicalSqlLiterals(expression) : expression};`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn statements;\n}\n","/**\n * DDL Phase: Drop Statements\n *\n * Generates DROP TABLE IF EXISTS ... CASCADE statements.\n * Only emitted when includeDropStatements=true.\n * Tables are dropped in reverse order to handle FK dependencies.\n *\n * @module ddl/phases/drop-statements\n */\n\nimport { generateDropTable } from '../ddl-generator.js';\nimport type { PhaseContext } from './types.js';\n\n/**\n * Generate DROP TABLE statements for all tables in reverse dependency order.\n *\n * @param ctx - Phase context\n * @returns Array of DDL statements (empty if includeDropStatements is false)\n */\nexport function generateDropStatementsPhase(ctx: PhaseContext): string[] {\n\tconst { tables, schemaName, naming, includeDropStatements } = ctx;\n\tif (!includeDropStatements) {\n\t\treturn [];\n\t}\n\tconst statements: string[] = [];\n\tfor (const table of [...tables].reverse()) {\n\t\tstatements.push(generateDropTable(table.name, schemaName, naming));\n\t}\n\tstatements.push(''); // Empty line separator\n\treturn statements;\n}\n","/**\n * DDL Phase: Enum Types\n *\n * Generates CREATE TYPE ... AS ENUM statements.\n * Must run before CREATE TABLE (enum types are referenced by column definitions).\n *\n * @module ddl/phases/enum-types\n */\n\nimport { type PhaseContext, sup } from './types.js';\nimport { quoteIdent as quoteId, validateEnumLabel } from './utils.js';\n\n/**\n * Generate CREATE TYPE ... AS ENUM statements for all enum types in the schema.\n *\n * @param ctx - Phase context with schema, schemaName, naming, and capabilities\n * @returns Array of DDL statements, or empty if enum types are unsupported / absent\n */\nexport function generateEnumTypesPhase(ctx: PhaseContext): string[] {\n\tconst { schema, schemaName, caps } = ctx;\n\tif (!schema.enums || !sup(caps, caps?.supportsDDLEnumTypes)) {\n\t\treturn [];\n\t}\n\tconst statements: string[] = [];\n\tfor (const [, enumDef] of schema.enums) {\n\t\tconst effectiveSchema =\n\t\t\tschemaName !== undefined ? schemaName : enumDef.schema;\n\t\tconst enumName =\n\t\t\teffectiveSchema &&\n\t\t\teffectiveSchema !== 'public' &&\n\t\t\teffectiveSchema !== 'pg_catalog'\n\t\t\t\t? `${quoteId(effectiveSchema, 'schema')}.${quoteId(enumDef.name, 'table')}`\n\t\t\t\t: quoteId(enumDef.name, 'table');\n\t\t// Validate each enum value against NUL/control-char injection before emission\n\t\tconst values = enumDef.values\n\t\t\t.map((v) => {\n\t\t\t\tvalidateEnumLabel(v, 'enum value');\n\t\t\t\treturn `'${v.replace(/'/g, \"''\")}'`;\n\t\t\t})\n\t\t\t.join(', ');\n\t\tstatements.push(`CREATE TYPE ${enumName} AS ENUM (${values});`);\n\t}\n\treturn statements;\n}\n","/**\n * DDL Phase: Extensions\n *\n * Generates CREATE EXTENSION IF NOT EXISTS statements.\n * Must run first (before tables and sequences).\n *\n * @module ddl/phases/extensions\n */\n\nimport { type PhaseContext, sup } from './types.js';\nimport { quoteExtensionName } from './utils.js';\n\n/**\n * Generate CREATE EXTENSION statements for all extensions in the schema.\n *\n * @param ctx - Phase context with schema and capabilities\n * @returns Array of DDL statements, or empty if extensions are unsupported / absent\n */\nexport function generateExtensionsPhase(ctx: PhaseContext): string[] {\n\tconst { schema, caps } = ctx;\n\tif (!schema.extensions || !sup(caps, caps?.supportsDDLExtensions)) {\n\t\treturn [];\n\t}\n\treturn schema.extensions.map(\n\t\t(ext) => `CREATE EXTENSION IF NOT EXISTS ${quoteExtensionName(ext)};`,\n\t);\n}\n","/**\n * DDL Phase: Indexes\n *\n * Generates CREATE INDEX statements for:\n * 1. Explicit indexes defined on each table\n * 2. Auto-generated indexes for FK columns (when fkAutoIndex=true)\n *\n * Auto-indexes are only generated for single-column FKs that do not already\n * have an explicit index, following PostgreSQL best practices for JOIN performance.\n *\n * @module ddl/phases/indexes\n */\n\nimport type { IndexIR } from '@dbsp/types';\nimport { generateCreateIndex } from '../ddl-generator.js';\nimport { getAutoFkIndexName } from '../schema-diff.js';\nimport type { PhaseContext } from './types.js';\n\n/**\n * Generate CREATE INDEX statements for all tables.\n *\n * @param ctx - Phase context\n * @returns Array of DDL statements\n */\nexport function generateIndexesPhase(ctx: PhaseContext): string[] {\n\tconst { tables, schemaName, naming, fkAutoIndex, caps } = ctx;\n\tconst indexContext = caps ? { caps } : undefined;\n\tconst statements: string[] = [];\n\n\tfor (const table of tables) {\n\t\t// Collect explicit index column names to avoid duplicating FK auto-indexes\n\t\tconst explicitIndexColumns = new Set(\n\t\t\ttable.indexes.flatMap((idx) =>\n\t\t\t\tidx.columns.length === 1 ? idx.columns : [],\n\t\t\t),\n\t\t);\n\n\t\t// Explicit indexes\n\t\tfor (const idx of table.indexes) {\n\t\t\tstatements.push(\n\t\t\t\tgenerateCreateIndex(table.name, idx, schemaName, naming, indexContext),\n\t\t\t);\n\t\t}\n\n\t\t// Auto-generate indexes for single-column FK columns without an explicit index\n\t\tif (fkAutoIndex) {\n\t\t\tfor (const fk of table.foreignKeys) {\n\t\t\t\tconst fkCol = fk.columns[0];\n\t\t\t\tif (\n\t\t\t\t\tfk.columns.length === 1 &&\n\t\t\t\t\tfkCol &&\n\t\t\t\t\t!explicitIndexColumns.has(fkCol)\n\t\t\t\t) {\n\t\t\t\t\tconst dbTableName = naming.toDatabase(table.name);\n\t\t\t\t\tconst dbFkCol = naming.toDatabase(fkCol);\n\t\t\t\t\tconst autoIdx: IndexIR = {\n\t\t\t\t\t\t// Auto-index names are derived from emitted DB identifiers. Existing\n\t\t\t\t\t\t// old-style names do not churn because compareIndexes tracks auto-FK\n\t\t\t\t\t\t// identity structurally (columns + unique), not by index name.\n\t\t\t\t\t\tname: getAutoFkIndexName(dbTableName, dbFkCol),\n\t\t\t\t\t\tcolumns: [fkCol],\n\t\t\t\t\t\tunique: false,\n\t\t\t\t\t};\n\t\t\t\t\tstatements.push(\n\t\t\t\t\t\tgenerateCreateIndex(\n\t\t\t\t\t\t\ttable.name,\n\t\t\t\t\t\t\tautoIdx,\n\t\t\t\t\t\t\tschemaName,\n\t\t\t\t\t\t\tnaming,\n\t\t\t\t\t\t\tindexContext,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn statements;\n}\n","/**\n * DDL Phase: Row Level Security (RLS)\n *\n * Generates:\n * 1. ALTER TABLE ... ENABLE ROW LEVEL SECURITY (when rlsEnabled=true on table)\n * 2. CREATE POLICY statements for each policy on the table\n *\n * Guarded by the supportsDDLRowLevelSecurity capability flag.\n *\n * @module ddl/phases/rls\n */\n\nimport { generateCreatePolicy } from '../ddl-generator.js';\nimport { type PhaseContext, sup } from './types.js';\nimport { qualifyTableIdent as qualifyTable } from './utils.js';\n\n/**\n * Generate ENABLE ROW LEVEL SECURITY and CREATE POLICY statements.\n *\n * @param ctx - Phase context\n * @returns Array of DDL statements (empty if RLS is unsupported by the dialect)\n */\nexport function generateRlsPhase(ctx: PhaseContext): string[] {\n\tconst { tables, schemaName, naming, caps } = ctx;\n\tif (!sup(caps, caps?.supportsDDLRowLevelSecurity)) {\n\t\treturn [];\n\t}\n\tconst statements: string[] = [];\n\tfor (const table of tables) {\n\t\tif (table.rlsEnabled) {\n\t\t\tconst qualifiedTable = qualifyTable(table.name, schemaName, naming);\n\t\t\tstatements.push(\n\t\t\t\t`ALTER TABLE ${qualifiedTable} ENABLE ROW LEVEL SECURITY;`,\n\t\t\t);\n\t\t}\n\t\tfor (const policy of table.policies ?? []) {\n\t\t\tstatements.push(\n\t\t\t\tgenerateCreatePolicy(table.name, policy, schemaName, naming),\n\t\t\t);\n\t\t}\n\t}\n\treturn statements;\n}\n","/**\n * Migration SQL Generator (DDL-PROV Block 1)\n *\n * Generates ordered SQL statements from a SchemaDiff.\n * Statements are topologically sorted: DROP constraints → DROP objects → CREATE objects → ADD constraints.\n *\n * @module migration-sql\n */\n\nimport type {\n\tCheckConstraintIR,\n\tColumnIR,\n\tDialectCapabilities,\n\tEnumIR,\n\tForeignKeyIR,\n\tIndexIR,\n\tPolicyIR,\n\tSequenceIR,\n\tTableIR,\n} from '@dbsp/types';\nimport { renderCheckConstraintClause } from '../check-expression.js';\nimport { isEngineCanonicalCheck } from '../expression-provenance.js';\nimport { identityNaming } from '../naming-plugin.js';\nimport { getPostgresqlCapabilitiesTargetVersion } from '../postgresql-capabilities.js';\nimport {\n\tassertString,\n\tsanitizeCommentText,\n\tvalidateCheckExpression,\n\tvalidateDbTypeName,\n\tvalidateIdentifier,\n\tvalidateSqlExpression,\n} from '../validate.js';\nimport {\n\tassertPartitionStrategy,\n\tgenerateCreateIndex,\n} from './ddl-generator.js';\nimport {\n\tassertNonZeroSequenceIncrement,\n\tnormalizeOptionalBoolean,\n\tnormalizeSequenceInteger,\n} from './generated-source-normalizers.js';\nimport {\n\tassertCreateIndexesSupported,\n\ttype IndexCapabilityContext,\n\ttype IndexRenderSpec,\n} from './index-render.js';\nimport {\n\tformatSqlDefault,\n\tquoteCollation,\n\tquoteExtensionName,\n\tquoteIdent,\n\tquoteRoleName,\n\tvalidateEnumLabel,\n} from './phases/utils.js';\nimport { escapeCanonicalSqlLiterals } from './rendered-sql.js';\nimport {\n\tgetAutoFkIndexName,\n\ttype SchemaChange,\n\ttype SchemaDiff,\n} from './schema-diff.js';\nimport {\n\tassertSchemaName,\n\tcollectChangeScopeEvidence,\n\tcreateSchemaScopeAccumulator,\n\tMIGRATION_SCHEMA_SCOPE_SUBJECT,\n} from './schema-scope.js';\nimport { mapColumnType, mapOnDeleteAction } from './type-mapping.js';\n\n// ── Helpers ─────────────────────────────────────────────────────\n\n// NOTE: quoteIdent (imported from phases/utils) validates + double-quotes identifiers.\n// The former local q() had no validation (bare `\"${name}\"`). All callers now use quoteIdent.\n\n// =============================================================================\n// retro-audit M-5 (SchemaChange.meta discriminated union) — DEFERRED\n//\n// The ~56 `change.meta?.x as ForeignKeyIR / as IndexIR / as ColumnIR` casts\n// below remain untyped by design. A full discriminated union covering all ~25\n// ChangeKind values is too large in scope for this PR and was explicitly listed\n// as deferrable in the audit brief.\n//\n// Tracked in TODO.md: \"[adapter-pgsql] M-5 SchemaChangeMeta discriminated union\".\n//\n// Until that follow-up lands, every NEW SchemaChange producer MUST verify the\n// meta shape at the call site rather than relying on downstream casts.\n// =============================================================================\n\n/** Schema-qualify a table name: \"schema\".\"table\" or just \"table\". */\nfunction qualifyTable(table: string, schemaName?: string): string {\n\treturn schemaName\n\t\t? `${quoteIdent(schemaName, 'schema')}.${quoteIdent(table, 'table')}`\n\t\t: quoteIdent(table, 'table');\n}\n\nfunction qualifyEnumType(enumDef: EnumIR, schemaName?: string): string {\n\tconst effectiveSchema = schemaName ?? enumDef.schema;\n\tif (\n\t\teffectiveSchema &&\n\t\teffectiveSchema !== 'public' &&\n\t\teffectiveSchema !== 'pg_catalog'\n\t) {\n\t\treturn `${quoteIdent(effectiveSchema, 'alias')}.${quoteIdent(enumDef.name, 'alias')}`;\n\t}\n\treturn quoteIdent(enumDef.name, 'alias');\n}\n\nfunction buildDoBlock(body: string): string {\n\tconst delimiter = chooseDoBlockDelimiter(body);\n\treturn `DO ${delimiter} ${body} ${delimiter};`;\n}\n\nfunction chooseDoBlockDelimiter(body: string): string {\n\tif (!body.includes('$$')) return '$$';\n\n\tlet suffix = 0;\n\tlet delimiter = '$dbsp_check$';\n\twhile (body.includes(delimiter)) {\n\t\tsuffix++;\n\t\tdelimiter = `$dbsp_check_${suffix}$`;\n\t}\n\treturn delimiter;\n}\n\n// validateEnumLabel is imported from './phases/utils.js' (shared with enum-types.ts)\n\n/** PK constraint name convention. */\nfunction pkName(table: string): string {\n\treturn `pk_${table}`;\n}\n\n/** FK constraint name convention. */\nfunction fkName(table: string, columns: readonly string[]): string {\n\treturn `fk_${table}_${columns.join('_')}`;\n}\n\n/** Column UNIQUE constraint name convention. */\nfunction uniqueName(table: string, column: string): string {\n\treturn `${table}_${column}_key`;\n}\n\n/** Index name convention (custom name takes priority). */\nfunction idxName(\n\ttable: string,\n\tcolumns: readonly string[],\n\tcustomName?: string,\n): string {\n\treturn customName ?? `idx_${table}_${columns.join('_')}`;\n}\n\n/** Build a CREATE POLICY SQL statement from a PolicyIR. */\nfunction buildPolicySQL(\n\ttableName: string,\n\tpolicy: PolicyIR,\n\tschemaName?: string,\n): string {\n\tconst policyName = quoteIdent(policy.name, 'alias');\n\tconst qt = qualifyTable(tableName, schemaName);\n\tconst ALLOWED_RLS_COMMANDS = [\n\t\t'ALL',\n\t\t'SELECT',\n\t\t'INSERT',\n\t\t'UPDATE',\n\t\t'DELETE',\n\t] as const;\n\t// Snapshot-once: read command ONCE before typeof guard + toUpperCase so a\n\t// getter-backed forged value cannot switch between the guard and the render.\n\tconst rawCommand = policy.command;\n\tif (\n\t\trawCommand !== undefined &&\n\t\trawCommand !== null &&\n\t\ttypeof rawCommand !== 'string'\n\t) {\n\t\tthrow new Error(\n\t\t\t`RLS policy command must be a string, got ${typeof rawCommand}.`,\n\t\t);\n\t}\n\tconst rlsCommand = rawCommand ? rawCommand.toUpperCase() : 'ALL';\n\tif (\n\t\t!ALLOWED_RLS_COMMANDS.includes(\n\t\t\trlsCommand as (typeof ALLOWED_RLS_COMMANDS)[number],\n\t\t)\n\t) {\n\t\tthrow new Error(\n\t\t\t`Invalid RLS policy command \"${rawCommand}\". ` +\n\t\t\t\t`Must be one of: ${ALLOWED_RLS_COMMANDS.join(', ')}.`,\n\t\t);\n\t}\n\tconst forClause = rlsCommand !== 'ALL' ? ` FOR ${rlsCommand}` : ' FOR ALL';\n\tconst asClause =\n\t\tpolicy.permissive === false ? ' AS RESTRICTIVE' : ' AS PERMISSIVE';\n\t// M-4: role names use quoteRoleName() (allows spaces, blocks injection vectors)\n\t// rather than quoteIdent() (which only allows \\w$ characters).\n\tconst toClause =\n\t\tpolicy.roles && policy.roles.length > 0\n\t\t\t? ` TO ${policy.roles.map((r) => quoteRoleName(r)).join(', ')}`\n\t\t\t: '';\n\t// Snapshot-once: read each field EXACTLY ONCE into a local const, validate and render\n\t// only that local. A getter-backed forged object could return a safe value on the\n\t// first read (validation) and a malicious value on the second read (render).\n\tconst usingExpr = policy.using;\n\tif (usingExpr !== undefined && usingExpr !== null && usingExpr !== '') {\n\t\tif (typeof usingExpr !== 'string') {\n\t\t\tthrow new Error(\n\t\t\t\t`RLS policy USING: expression must be a plain string, got ${typeof usingExpr}.`,\n\t\t\t);\n\t\t}\n\t\tvalidateSqlExpression(usingExpr, 'USING expression');\n\t}\n\tconst withCheckExpr = policy.withCheck;\n\tif (\n\t\twithCheckExpr !== undefined &&\n\t\twithCheckExpr !== null &&\n\t\twithCheckExpr !== ''\n\t) {\n\t\tif (typeof withCheckExpr !== 'string') {\n\t\t\tthrow new Error(\n\t\t\t\t`RLS policy WITH CHECK: expression must be a plain string, got ${typeof withCheckExpr}.`,\n\t\t\t);\n\t\t}\n\t\tvalidateSqlExpression(withCheckExpr, 'WITH CHECK expression');\n\t}\n\tconst usingClause = usingExpr ? ` USING (${usingExpr})` : '';\n\tconst withCheckClause = withCheckExpr ? ` WITH CHECK (${withCheckExpr})` : '';\n\treturn `CREATE POLICY ${policyName} ON ${qt}${forClause}${asClause}${toClause}${usingClause}${withCheckClause};`;\n}\n\n/**\n * Build a sequence options clause (shared by CREATE SEQUENCE, ALTER SEQUENCE, and their reverses).\n *\n * @param verb - SQL verb: `'CREATE SEQUENCE'` or `'ALTER SEQUENCE'`\n * @param seqName - Already-quoted and schema-qualified sequence name\n * @param seq - Sequence properties to emit\n * @param includeCycleNoCycle - When true, emits `NO CYCLE` for `seq.cycle === false`\n * (needed by ALTER SEQUENCE; CREATE SEQUENCE omits the clause when cycle is false)\n * @returns Full SQL statement ending with `;`\n */\n/**\n * Build a sequence options clause shared by CREATE SEQUENCE, ALTER SEQUENCE, and their reverses.\n *\n * @param verb - SQL verb: `'CREATE SEQUENCE'` or `'ALTER SEQUENCE'`\n * @param seqName - Already-quoted and schema-qualified sequence name\n * @param seq - Sequence properties to emit\n * @param includeCycleNoCycle - When true (ALTER SEQUENCE), emits `NO CYCLE` for `seq.cycle === false`.\n * When false (CREATE SEQUENCE), only emits `CYCLE` when truthy; no `NO CYCLE` clause.\n * @returns Full SQL statement ending with `;`\n */\nexport function buildSequenceClause(\n\tverb: 'CREATE SEQUENCE' | 'ALTER SEQUENCE',\n\tseqName: string,\n\tseq: Pick<\n\t\tSequenceIR,\n\t\t'startWith' | 'incrementBy' | 'minValue' | 'maxValue' | 'cycle'\n\t>,\n\tincludeCycleNoCycle = false,\n): string {\n\tconst parts: string[] = [`${verb} ${seqName}`];\n\tconst startWith = normalizeSequenceInteger(\n\t\tseq.startWith,\n\t\t'sequence START WITH',\n\t);\n\tconst incrementBy = normalizeSequenceInteger(\n\t\tseq.incrementBy,\n\t\t'sequence INCREMENT BY',\n\t);\n\tassertNonZeroSequenceIncrement(incrementBy, 'sequence INCREMENT BY');\n\tconst minValue = normalizeSequenceInteger(seq.minValue, 'sequence MINVALUE');\n\tconst maxValue = normalizeSequenceInteger(seq.maxValue, 'sequence MAXVALUE');\n\tconst cycle = normalizeOptionalBoolean(seq.cycle, 'sequence CYCLE');\n\tif (startWith !== undefined) parts.push(`START WITH ${startWith}`);\n\tif (incrementBy !== undefined) parts.push(`INCREMENT BY ${incrementBy}`);\n\tif (minValue !== undefined) parts.push(`MINVALUE ${minValue}`);\n\tif (maxValue !== undefined) parts.push(`MAXVALUE ${maxValue}`);\n\tif (includeCycleNoCycle) {\n\t\t// ALTER SEQUENCE: emit CYCLE or NO CYCLE when the flag is defined\n\t\tif (cycle !== undefined) parts.push(cycle ? 'CYCLE' : 'NO CYCLE');\n\t} else {\n\t\t// CREATE SEQUENCE: only emit CYCLE when truthy; silence NO CYCLE\n\t\tif (cycle === true) parts.push('CYCLE');\n\t}\n\treturn `${parts.join(' ')};`;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MigrationSQLOptions {\n\t/**\n\t * Schema namespace (default: none — unqualified).\n\t * Required when emitted migration SQL would otherwise mix non-default\n\t * target-scoped custom types/enums with unqualified table SQL.\n\t */\n\treadonly schemaName?: string;\n\t/** Whether to include destructive changes (drops) */\n\treadonly includeDestructive?: boolean;\n\t/** Automatically create indexes on FK columns for new tables (default: true) */\n\treadonly fkAutoIndex?: boolean;\n\t/** Dialect capabilities — unsupported index features throw during migration SQL generation */\n\treadonly dialectCapabilities?: DialectCapabilities;\n}\n\nexport interface DownMigrationSQL {\n\treadonly statements: readonly string[];\n\treadonly destructive: boolean;\n}\n\ninterface DownChangeSQL {\n\treadonly sql: string | undefined;\n\treadonly destructive: boolean;\n}\n\nfunction failSafeUnknownDownChange(kind: never): DownChangeSQL {\n\treturn {\n\t\tsql: `-- WARNING: Cannot reverse unsupported SchemaChange kind \"${sanitizeCommentText(kind)}\"`,\n\t\tdestructive: true,\n\t};\n}\n\n// ============================================================================\n// Capability Helpers\n// ============================================================================\n\n/** Check if a change kind is supported by the dialect capabilities */\ntype DialectCapabilitiesWithForeignKeys = DialectCapabilities & {\n\treadonly supportsDDLForeignKeys?: boolean;\n};\n\nfunction isChangeSupported(\n\tchange: SchemaChange,\n\tcaps: DialectCapabilities,\n): boolean {\n\tswitch (change.kind) {\n\t\tcase 'create_enum':\n\t\tcase 'drop_enum':\n\t\tcase 'alter_enum_add_value':\n\t\t\treturn caps.supportsDDLEnumTypes === true;\n\t\tcase 'create_extension':\n\t\tcase 'drop_extension':\n\t\t\treturn caps.supportsDDLExtensions === true;\n\t\tcase 'create_sequence':\n\t\tcase 'drop_sequence':\n\t\tcase 'alter_sequence':\n\t\t\treturn caps.supportsDDLSequences === true;\n\t\tcase 'add_check_constraint':\n\t\tcase 'drop_check_constraint':\n\t\t\treturn caps.supportsDDLCheckConstraints === true;\n\t\tcase 'validate_constraint':\n\t\t\treturn isValidateConstraintSupported(change, caps);\n\t\tcase 'add_comment':\n\t\tcase 'drop_comment':\n\t\t\treturn caps.supportsDDLComments === true;\n\t\tcase 'alter_column_collation':\n\t\t\treturn caps.supportsDDLCollation === true;\n\t\tcase 'alter_column_identity':\n\t\t\treturn caps.supportsDDLIdentityColumns === true;\n\t\tcase 'enable_rls':\n\t\tcase 'disable_rls':\n\t\tcase 'create_policy':\n\t\tcase 'drop_policy':\n\t\t\treturn caps.supportsDDLRowLevelSecurity === true;\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\nfunction isValidateConstraintSupported(\n\tchange: SchemaChange,\n\tcaps: DialectCapabilities,\n): boolean {\n\tif (change.meta?.check !== undefined) {\n\t\treturn caps.supportsDDLCheckConstraints === true;\n\t}\n\tif (change.meta?.fk !== undefined) {\n\t\treturn (\n\t\t\t(caps as DialectCapabilitiesWithForeignKeys).supportsDDLForeignKeys !==\n\t\t\tfalse\n\t\t);\n\t}\n\treturn true;\n}\n\nfunction changesAppliedByUp(\n\tdiff: SchemaDiff,\n\toptions?: MigrationSQLOptions,\n): readonly SchemaChange[] {\n\tconst includeDestructive = options?.includeDestructive ?? true;\n\tconst filteredChanges = includeDestructive\n\t\t? diff.changes\n\t\t: diff.changes.filter((c) => !c.destructive);\n\n\tconst caps = options?.dialectCapabilities;\n\treturn caps\n\t\t? filteredChanges.filter((c) => isChangeSupported(c, caps))\n\t\t: filteredChanges;\n}\n\nfunction indexContextFromOptions(\n\toptions: MigrationSQLOptions | undefined,\n): IndexCapabilityContext | undefined {\n\treturn options?.dialectCapabilities\n\t\t? {\n\t\t\t\tcaps: options.dialectCapabilities,\n\t\t\t\ttargetVersion: getPostgresqlCapabilitiesTargetVersion(\n\t\t\t\t\toptions.dialectCapabilities,\n\t\t\t\t),\n\t\t\t}\n\t\t: undefined;\n}\n\nfunction buildCreateIndexSpec(\n\tchange: SchemaChange,\n\tschemaName: string | undefined,\n): IndexRenderSpec | undefined {\n\tconst idx = change.meta?.index as IndexIR | undefined;\n\tif (!idx) return undefined;\n\treturn {\n\t\tname: idxName(change.table, idx.columns, idx.name),\n\t\ttable: change.table,\n\t\tschema: schemaName,\n\t\tunique: idx.unique === true,\n\t\tmethod: idx.method,\n\t\tkeys: [\n\t\t\t...(idx.expressions ?? []).map((expression) => ({ expression })),\n\t\t\t...idx.columns.map((col) => ({\n\t\t\t\tcolumn: col,\n\t\t\t\topclass: idx.opclass?.[col],\n\t\t\t})),\n\t\t],\n\t\tinclude: idx.include,\n\t\tnullsNotDistinct: idx.nullsNotDistinct,\n\t\twith: idx.with,\n\t\twhere: idx.where,\n\t\twhereSource: idx,\n\t\t// A migration must surface an existing conflicting index instead of\n\t\t// silently accepting drift between the model and database.\n\t\tifNotExists: false,\n\t};\n}\n\nfunction buildFkAutoIndexSpec(\n\ttable: TableIR,\n\tfkCol: string,\n\tschemaName: string | undefined,\n): IndexRenderSpec {\n\treturn {\n\t\tname: getAutoFkIndexName(table.name, fkCol),\n\t\ttable: table.name,\n\t\tschema: schemaName,\n\t\tunique: false,\n\t\tkeys: [{ column: fkCol }],\n\t\t// A migration must surface an existing conflicting index instead of\n\t\t// silently accepting drift between the model and database.\n\t\tifNotExists: false,\n\t};\n}\n\nfunction buildFkAutoIndex(table: TableIR, fkCol: string): IndexIR {\n\treturn {\n\t\tname: getAutoFkIndexName(table.name, fkCol),\n\t\tcolumns: [fkCol],\n\t\tunique: false,\n\t};\n}\n\nfunction collectFkAutoIndexSpecs(\n\tchanges: readonly SchemaChange[],\n\tschemaName: string | undefined,\n): IndexRenderSpec[] {\n\tconst specs: IndexRenderSpec[] = [];\n\tfor (const change of changes) {\n\t\tif (change.kind !== 'create_table') continue;\n\t\tconst table = change.meta?.table as TableIR | undefined;\n\t\tif (!table) continue;\n\t\tconst explicitIndexColumns = new Set(\n\t\t\ttable.indexes.flatMap((idx) =>\n\t\t\t\tidx.columns.length === 1 ? idx.columns : [],\n\t\t\t),\n\t\t);\n\t\tfor (const fk of table.foreignKeys) {\n\t\t\tconst fkCol = fk.columns[0];\n\t\t\tif (\n\t\t\t\tfk.columns.length === 1 &&\n\t\t\t\tfkCol &&\n\t\t\t\t!explicitIndexColumns.has(fkCol)\n\t\t\t) {\n\t\t\t\tspecs.push(buildFkAutoIndexSpec(table, fkCol, schemaName));\n\t\t\t}\n\t\t}\n\t}\n\treturn specs;\n}\n\nfunction collectUpCreateIndexSpecs(\n\tchanges: readonly SchemaChange[],\n\tschemaName: string | undefined,\n\tfkAutoIndex: boolean,\n): IndexRenderSpec[] {\n\tconst specs = changes.flatMap((change) =>\n\t\tchange.kind === 'create_index'\n\t\t\t? (buildCreateIndexSpec(change, schemaName) ?? [])\n\t\t\t: [],\n\t);\n\tif (fkAutoIndex) {\n\t\tspecs.push(...collectFkAutoIndexSpecs(changes, schemaName));\n\t}\n\treturn specs;\n}\n\nfunction collectDownCreateIndexSpecs(\n\tchanges: readonly SchemaChange[],\n\tschemaName: string | undefined,\n): IndexRenderSpec[] {\n\treturn changes.flatMap((change) =>\n\t\tchange.kind === 'drop_index'\n\t\t\t? (buildCreateIndexSpec(change, schemaName) ?? [])\n\t\t\t: [],\n\t);\n}\n\n// ============================================================================\n// SQL Generation\n// ============================================================================\n\n/**\n * Generate ordered SQL statements from a SchemaDiff.\n *\n * Topological order:\n * 0. DROP FK/CHECK constraints (must drop before referenced tables)\n * 1. DROP indexes\n * 2. DROP columns\n * 3. DROP primary keys\n * 4. DROP tables, DROP ENUMs\n * 5. CREATE ENUMs (must exist before tables that use them)\n * 6. CREATE tables\n * 7. ADD columns\n * 8. ALTER columns (type, nullable, default)\n * 9. ADD primary keys / column UNIQUE constraints\n * 10. ADD FK constraints (must add after referenced tables exist)\n * 11. ALTER FK (drop + re-add)\n * 12. CREATE indexes\n * 13. ADD CHECK constraints\n * 14. ALTER ENUM ADD VALUE (must be last — has transaction visibility caveats in PG)\n * 15. COMMENT ON TABLE / COLUMN (very last)\n */\nexport function generateMigrationSQL(\n\tdiff: SchemaDiff,\n\toptions?: MigrationSQLOptions,\n): readonly string[] {\n\tconst schemaName = options?.schemaName;\n\tconst changes = changesAppliedByUp(diff, options);\n\tconst indexContext = indexContextFromOptions(options);\n\tconst createIndexSpecs = collectUpCreateIndexSpecs(\n\t\tchanges,\n\t\tschemaName,\n\t\toptions?.fkAutoIndex !== false,\n\t);\n\tassertCreateIndexesSupported(createIndexSpecs, indexContext);\n\n\t// Group changes by phase for topological ordering\n\tconst phases: SchemaChange[][] = [\n\t\t[], // 0: drop FK, drop CHECK\n\t\t[], // 1: drop index\n\t\t[], // 2: drop column\n\t\t[], // 3: drop PK\n\t\t[], // 4: drop table, drop ENUM\n\t\t[], // 5: create ENUM\n\t\t[], // 6: create table\n\t\t[], // 7: add column\n\t\t[], // 8: alter column\n\t\t[], // 9: add PK / column UNIQUE constraint\n\t\t[], // 10: add FK\n\t\t[], // 11: alter FK (drop + re-add)\n\t\t[], // 12: create index\n\t\t[], // 13: add CHECK constraint\n\t\t[], // 14: alter ENUM add value (must be after CREATE TABLE, outside transaction)\n\t\t[], // 15: COMMENT ON TABLE / COLUMN\n\t\t[], // 16: VALIDATE CONSTRAINT (after FK/CHECK added with NOT VALID)\n\t\t[], // 17: ENABLE/DISABLE ROW LEVEL SECURITY\n\t\t[], // 18: CREATE/DROP POLICY\n\t];\n\n\tfor (const change of changes) {\n\t\tconst phase = getPhase(change.kind);\n\t\tphases[phase]!.push(change);\n\t}\n\n\t// Generate SQL in phase order\n\tconst statements: string[] = [];\n\tconst scope = createSchemaScopeAccumulator();\n\tfor (const phase of phases) {\n\t\tfor (const change of phase) {\n\t\t\tconst sql = changeToUpSQL(change, schemaName, indexContext);\n\t\t\tif (sql) {\n\t\t\t\tstatements.push(sql);\n\t\t\t\tcollectChangeScopeEvidence(change, scope);\n\t\t\t}\n\t\t}\n\t}\n\tassertSchemaName(scope, schemaName, MIGRATION_SCHEMA_SCOPE_SUBJECT);\n\n\t// FK auto-indexes for new tables (single-column FKs without explicit index)\n\tif (options?.fkAutoIndex !== false) {\n\t\tfor (const change of changes) {\n\t\t\tif (change.kind === 'create_table') {\n\t\t\t\tconst table = change.meta?.table as TableIR | undefined;\n\t\t\t\tif (!table) continue;\n\t\t\t\tconst explicitIndexColumns = new Set(\n\t\t\t\t\ttable.indexes.flatMap((idx) =>\n\t\t\t\t\t\tidx.columns.length === 1 ? idx.columns : [],\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tfor (const fk of table.foreignKeys) {\n\t\t\t\t\tconst fkCol = fk.columns[0];\n\t\t\t\t\tif (\n\t\t\t\t\t\tfk.columns.length === 1 &&\n\t\t\t\t\t\tfkCol &&\n\t\t\t\t\t\t!explicitIndexColumns.has(fkCol)\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst spec = buildFkAutoIndexSpec(table, fkCol, schemaName);\n\t\t\t\t\t\tstatements.push(\n\t\t\t\t\t\t\tgenerateCreateIndex(\n\t\t\t\t\t\t\t\ttable.name,\n\t\t\t\t\t\t\t\tbuildFkAutoIndex(table, fkCol),\n\t\t\t\t\t\t\t\tschemaName,\n\t\t\t\t\t\t\t\tidentityNaming,\n\t\t\t\t\t\t\t\tindexContext,\n\t\t\t\t\t\t\t\tspec.ifNotExists,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn statements;\n}\n\n// ============================================================================\n// Phase Mapping (Topological Order)\n// ============================================================================\n\nfunction getPhase(kind: SchemaChange['kind']): number {\n\tswitch (kind) {\n\t\tcase 'drop_foreign_key':\n\t\tcase 'drop_check_constraint':\n\t\t\treturn 0;\n\t\tcase 'drop_index':\n\t\t\treturn 1;\n\t\tcase 'drop_column':\n\t\t\treturn 2;\n\t\tcase 'drop_primary_key':\n\t\t\treturn 3;\n\t\tcase 'drop_table':\n\t\tcase 'drop_enum':\n\t\tcase 'drop_extension':\n\t\tcase 'drop_sequence':\n\t\t\treturn 4;\n\t\tcase 'create_enum':\n\t\tcase 'create_extension':\n\t\tcase 'create_sequence':\n\t\t\treturn 5;\n\t\tcase 'alter_sequence':\n\t\t\treturn 8;\n\t\tcase 'create_table':\n\t\tcase 'readdress_table':\n\t\t\treturn 6;\n\t\tcase 'add_column':\n\t\t\treturn 7;\n\t\tcase 'alter_column_type':\n\t\tcase 'alter_column_nullable':\n\t\tcase 'alter_column_default':\n\t\tcase 'alter_column_collation':\n\t\tcase 'alter_column_identity':\n\t\t\treturn 8;\n\t\tcase 'alter_column_unique':\n\t\tcase 'add_primary_key':\n\t\t\treturn 9;\n\t\tcase 'add_foreign_key':\n\t\t\treturn 10;\n\t\tcase 'alter_foreign_key':\n\t\t\treturn 11;\n\t\tcase 'create_index':\n\t\t\treturn 12;\n\t\tcase 'add_check_constraint':\n\t\t\treturn 13;\n\t\tcase 'alter_enum_add_value':\n\t\t\treturn 14;\n\t\tcase 'add_comment':\n\t\tcase 'drop_comment':\n\t\t\treturn 15;\n\t\tcase 'validate_constraint':\n\t\t\t// Runs after add_foreign_key / add_check_constraint so the constraint exists\n\t\t\treturn 16;\n\t\tcase 'enable_rls':\n\t\tcase 'disable_rls':\n\t\t\t// After table is created / indexes set up\n\t\t\treturn 17;\n\t\tcase 'create_policy':\n\t\tcase 'drop_policy':\n\t\t\t// After RLS is enabled\n\t\t\treturn 18;\n\t}\n}\n\n// ============================================================================\n// SQL Generators per ChangeKind\n// ============================================================================\n\n// ============================================================================\n// UP SQL Handlers (one function per change kind)\n// ============================================================================\n\nfunction upAddColumn(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string | undefined {\n\tconst col = change.meta?.column as ColumnIR | undefined;\n\tif (!col) return undefined;\n\tconst typeName = mapColumnType(col, schemaName);\n\tconst notNull =\n\t\t!col.nullable && typeName !== 'SERIAL' && typeName !== 'BIGSERIAL'\n\t\t\t? ' NOT NULL'\n\t\t\t: '';\n\tconst def =\n\t\tcol.default !== undefined ? ` DEFAULT ${formatDefault(col.default)}` : '';\n\tconst unique = col.unique ? ' UNIQUE' : '';\n\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} ADD COLUMN ${quoteIdent(col.name, 'alias')} ${typeName}${notNull}${def}${unique};`;\n}\n\nfunction upAlterColumnType(change: SchemaChange, schemaName?: string): string {\n\tconst col = change.meta?.column as ColumnIR | undefined;\n\tconst toType = col\n\t\t? mapColumnType(col, schemaName)\n\t\t: validateDbTypeName(change.meta?.toType as string);\n\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} ALTER COLUMN ${quoteIdent(change.column!, 'alias')} TYPE ${toType};`;\n}\n\nfunction upAlterColumnNullable(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string {\n\tconst nullable = change.meta?.nullable as boolean;\n\tconst action = nullable ? 'DROP NOT NULL' : 'SET NOT NULL';\n\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} ALTER COLUMN ${quoteIdent(change.column!, 'alias')} ${action};`;\n}\n\nfunction upAlterColumnDefault(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string {\n\tconst def = change.meta?.default;\n\tif (def === undefined || def === null) {\n\t\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} ALTER COLUMN ${quoteIdent(change.column!, 'alias')} DROP DEFAULT;`;\n\t}\n\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} ALTER COLUMN ${quoteIdent(change.column!, 'alias')} SET DEFAULT ${formatDefault(def)};`;\n}\n\nfunction addColumnUniqueSQL(\n\ttable: string,\n\tcolumn: string,\n\tschemaName?: string,\n\tconstraintName?: string,\n): string {\n\tconst name = constraintName ?? uniqueName(table, column);\n\tif (constraintName !== undefined) validateIdentifier(constraintName, 'alias');\n\tconst quotedConstraintName = quoteIdent(name, 'alias');\n\treturn `ALTER TABLE ${qualifyTable(table, schemaName)} ADD CONSTRAINT ${quotedConstraintName} UNIQUE (${quoteIdent(column, 'alias')});`;\n}\n\nfunction dropColumnUniqueSQL(\n\ttable: string,\n\tcolumn: string,\n\tschemaName?: string,\n\tconstraintName?: string,\n): string {\n\tconst name = constraintName ?? uniqueName(table, column);\n\tif (constraintName !== undefined) validateIdentifier(constraintName, 'alias');\n\tconst quotedConstraintName = quoteIdent(name, 'alias');\n\treturn `ALTER TABLE ${qualifyTable(table, schemaName)} DROP CONSTRAINT IF EXISTS ${quotedConstraintName};`;\n}\n\nfunction upAlterColumnUnique(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string | undefined {\n\tconst unique = change.meta?.unique as boolean | undefined;\n\tif (unique === undefined || !change.column) return undefined;\n\tconst constraintName = change.meta?.constraintName as string | undefined;\n\treturn unique\n\t\t? addColumnUniqueSQL(\n\t\t\t\tchange.table,\n\t\t\t\tchange.column,\n\t\t\t\tschemaName,\n\t\t\t\tconstraintName,\n\t\t\t)\n\t\t: dropColumnUniqueSQL(\n\t\t\t\tchange.table,\n\t\t\t\tchange.column,\n\t\t\t\tschemaName,\n\t\t\t\tconstraintName,\n\t\t\t);\n}\n\nfunction upAddPrimaryKey(change: SchemaChange, schemaName?: string): string {\n\tconst columns = change.meta?.columns as string[];\n\tconst pkCols = columns.map((n) => quoteIdent(n, 'alias')).join(', ');\n\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} ADD CONSTRAINT ${quoteIdent(pkName(change.table), 'alias')} PRIMARY KEY (${pkCols});`;\n}\n\nfunction upDropForeignKey(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string | undefined {\n\tconst fk = change.meta?.fk as ForeignKeyIR;\n\tif (!fk) return undefined;\n\tconst constraintName = quoteIdent(fkName(change.table, fk.columns), 'alias');\n\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} DROP CONSTRAINT IF EXISTS ${constraintName};`;\n}\n\nfunction upAlterForeignKey(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string | undefined {\n\t// Drop + re-add with new onDelete\n\tconst fk = change.meta?.fk as ForeignKeyIR;\n\tif (!fk) return undefined;\n\tconst constraintName = quoteIdent(fkName(change.table, fk.columns), 'alias');\n\tconst drop = `ALTER TABLE ${qualifyTable(change.table, schemaName)} DROP CONSTRAINT IF EXISTS ${constraintName};`;\n\tconst add = generateAddFKSQL(change.table, fk, schemaName);\n\treturn `${drop}\\n${add}`;\n}\n\nfunction upCreateIndex(\n\tchange: SchemaChange,\n\tschemaName?: string,\n\tcontext?: IndexCapabilityContext,\n): string | undefined {\n\tconst idx = change.meta?.index as IndexIR | undefined;\n\tconst spec = buildCreateIndexSpec(change, schemaName);\n\treturn idx && spec\n\t\t? generateCreateIndex(\n\t\t\t\tchange.table,\n\t\t\t\tidx,\n\t\t\t\tschemaName,\n\t\t\t\tidentityNaming,\n\t\t\t\tcontext,\n\t\t\t\tspec.ifNotExists,\n\t\t\t)\n\t\t: undefined;\n}\n\nfunction upDropIndex(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string | undefined {\n\tconst idx = change.meta?.index as IndexIR;\n\tif (!idx) return undefined;\n\tconst indexName = quoteIdent(\n\t\tidxName(change.table, idx.columns, idx.name),\n\t\t'alias',\n\t);\n\tconst schemaPrefix = schemaName ? `${quoteIdent(schemaName, 'alias')}.` : '';\n\treturn `DROP INDEX IF EXISTS ${schemaPrefix}${indexName};`;\n}\n\nfunction upAddCheckConstraint(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string | undefined {\n\tconst check = change.meta?.check as CheckConstraintIR;\n\tif (!check) return undefined;\n\tconst canonicalCheck = isEngineCanonicalCheck(check);\n\tconst expression = renderCheckConstraintClause(check);\n\tif (!canonicalCheck) {\n\t\tvalidateCheckExpression(\n\t\t\texpression,\n\t\t\t'migration check constraint expression',\n\t\t);\n\t}\n\treturn buildDoBlock(\n\t\t'BEGIN ALTER TABLE ' +\n\t\t\tqualifyTable(change.table, schemaName) +\n\t\t\t' ADD CONSTRAINT ' +\n\t\t\tquoteIdent(check.name, 'alias') +\n\t\t\t' ' +\n\t\t\t(canonicalCheck ? escapeCanonicalSqlLiterals(expression) : expression) +\n\t\t\t'; EXCEPTION WHEN duplicate_object THEN NULL; END',\n\t);\n}\n\nfunction upValidateConstraint(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string | undefined {\n\tconst fk = change.meta?.fk as ForeignKeyIR | undefined;\n\tconst check = change.meta?.check as CheckConstraintIR | undefined;\n\tconst constraintName = fk\n\t\t? quoteIdent(fkName(change.table, fk.columns), 'alias')\n\t\t: check\n\t\t\t? quoteIdent(check.name, 'alias')\n\t\t\t: undefined;\n\tif (!constraintName) return undefined;\n\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} VALIDATE CONSTRAINT ${constraintName};`;\n}\n\nfunction upCreateEnum(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string | undefined {\n\tconst enumDef = change.meta?.enum as EnumIR;\n\tif (!enumDef) return undefined;\n\tconst enumName = qualifyEnumType(enumDef, schemaName);\n\t// Validate each enum value against NUL/control-char injection before emission\n\tconst values = enumDef.values\n\t\t.map((v) => {\n\t\t\tvalidateEnumLabel(v, 'enum value');\n\t\t\treturn `'${v.replace(/'/g, \"''\")}'`;\n\t\t})\n\t\t.join(', ');\n\treturn `CREATE TYPE ${enumName} AS ENUM (${values});`;\n}\n\nfunction upAlterEnumAddValue(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string | undefined {\n\tconst enumDef = change.meta?.enum as EnumIR;\n\tconst value = change.meta?.value as string;\n\tconst after = change.meta?.after as string | undefined;\n\tif (!enumDef || !value) return undefined;\n\t// Enum identifiers are safely quoted; enum labels are validated against control-char injection\n\tconst enumName = qualifyEnumType(enumDef, schemaName);\n\tvalidateEnumLabel(value, 'enum value');\n\tif (after !== undefined) validateEnumLabel(after, 'enum AFTER position');\n\tconst escaped = value.replace(/'/g, \"''\");\n\tconst position = after ? ` AFTER '${after.replace(/'/g, \"''\")}'` : '';\n\treturn `ALTER TYPE ${enumName} ADD VALUE IF NOT EXISTS '${escaped}'${position};`;\n}\n\nfunction upDropEnum(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string | undefined {\n\tconst enumDef = change.meta?.enum as EnumIR;\n\tif (!enumDef) return undefined;\n\tconst enumName = qualifyEnumType(enumDef, schemaName);\n\t// Before dropping the type, cast any referencing columns off the enum to\n\t// prevent \"cannot drop type: still referenced\" errors AND to avoid the\n\t// trailing CASCADE silently dropping them: a scalar column becomes text, an\n\t// array column becomes text[] (with an explicit USING cast, which array type\n\t// changes require).\n\tconst refs = change.meta?.referencingColumns as\n\t\t| Array<{ table: string; column: string; isArray?: boolean }>\n\t\t| undefined;\n\tconst alterStatements =\n\t\trefs && refs.length > 0\n\t\t\t? refs.map((ref) => {\n\t\t\t\t\tconst column = quoteIdent(ref.column, 'alias');\n\t\t\t\t\tconst targetType = ref.isArray ? 'text[]' : 'text';\n\t\t\t\t\tconst using = ref.isArray ? ` USING ${column}::text[]` : '';\n\t\t\t\t\treturn `ALTER TABLE ${qualifyTable(ref.table, schemaName)} ALTER COLUMN ${column} TYPE ${targetType}${using};`;\n\t\t\t\t})\n\t\t\t: [];\n\treturn [...alterStatements, `DROP TYPE IF EXISTS ${enumName} CASCADE;`].join(\n\t\t'\\n',\n\t);\n}\n\nfunction upAlterColumnCollation(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string | undefined {\n\tconst col = change.meta?.column as ColumnIR;\n\tif (!col) return undefined;\n\t// S-2: validate collation name before quoting — uses quoteCollation which\n\t// accepts locale strings like `en_US.utf8`, `en-US-x-icu`, `C.UTF-8`\n\t// that contain dots/hyphens rejected by the standard identifier validator.\n\tconst collation = col.collation\n\t\t? ` COLLATE ${quoteCollation(col.collation)}`\n\t\t: '';\n\tconst typeName = mapColumnType(col, schemaName);\n\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} ALTER COLUMN ${quoteIdent(change.column!, 'alias')} TYPE ${typeName}${collation};`;\n}\n\nfunction upAlterColumnIdentity(\n\tchange: SchemaChange,\n\tschemaName?: string,\n): string | undefined {\n\tconst col = change.meta?.column as ColumnIR;\n\tconst prevIdentity = change.meta?.previousIdentity as string | undefined;\n\tif (!col) return undefined;\n\tconst table = qualifyTable(change.table, schemaName);\n\tconst column = quoteIdent(change.column!, 'alias');\n\tif (!col.identity && prevIdentity) {\n\t\treturn `ALTER TABLE ${table} ALTER COLUMN ${column} DROP IDENTITY IF EXISTS;`;\n\t}\n\tif (col.identity && !prevIdentity) {\n\t\tconst gen = col.identity === 'always' ? 'ALWAYS' : 'BY DEFAULT';\n\t\treturn `ALTER TABLE ${table} ALTER COLUMN ${column} ADD GENERATED ${gen} AS IDENTITY;`;\n\t}\n\t// Change from one identity type to another\n\tconst gen = col.identity === 'always' ? 'ALWAYS' : 'BY DEFAULT';\n\treturn `ALTER TABLE ${table} ALTER COLUMN ${column} SET GENERATED ${gen};`;\n}\n\nfunction upAddComment(change: SchemaChange, schemaName?: string): string {\n\tconst comment = change.meta?.comment as string;\n\tconst target = change.meta?.target as string;\n\tassertString(comment, 'migration comment');\n\tconst escaped = comment.replace(/'/g, \"''\");\n\tif (target === 'table') {\n\t\treturn `COMMENT ON TABLE ${qualifyTable(change.table, schemaName)} IS '${escaped}';`;\n\t}\n\treturn `COMMENT ON COLUMN ${qualifyTable(change.table, schemaName)}.${quoteIdent(change.column!, 'alias')} IS '${escaped}';`;\n}\n\nfunction upSequenceName(\n\tschemaName: string | undefined,\n\tseq: SequenceIR,\n): string {\n\treturn schemaName\n\t\t? `${quoteIdent(schemaName, 'alias')}.${quoteIdent(seq.name, 'alias')}`\n\t\t: quoteIdent(seq.name, 'alias');\n}\n\n// ============================================================================\n// SQL Generators per ChangeKind\n// ============================================================================\n\nfunction changeToUpSQL(\n\tchange: SchemaChange,\n\tschemaName?: string,\n\tindexContext?: IndexCapabilityContext,\n): string | undefined {\n\tswitch (change.kind) {\n\t\tcase 'create_table': {\n\t\t\tconst table = change.meta?.table as TableIR | undefined;\n\t\t\treturn table ? generateCreateTableSQL(table, schemaName) : undefined;\n\t\t}\n\t\tcase 'readdress_table':\n\t\t\t// The generator executor owns the paired-ledger protocol and emits the\n\t\t\t// transactional ALTER TABLE itself. This renderer must not offer a raw\n\t\t\t// statement that could bypass that protocol.\n\t\t\treturn undefined;\n\t\tcase 'drop_table':\n\t\t\treturn `DROP TABLE IF EXISTS ${qualifyTable(change.table, schemaName)} CASCADE;`;\n\t\tcase 'add_column':\n\t\t\treturn upAddColumn(change, schemaName);\n\t\tcase 'drop_column':\n\t\t\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} DROP COLUMN ${quoteIdent(change.column!, 'alias')} CASCADE;`;\n\t\tcase 'alter_column_type':\n\t\t\treturn upAlterColumnType(change, schemaName);\n\t\tcase 'alter_column_nullable':\n\t\t\treturn upAlterColumnNullable(change, schemaName);\n\t\tcase 'alter_column_default':\n\t\t\treturn upAlterColumnDefault(change, schemaName);\n\t\tcase 'alter_column_unique':\n\t\t\treturn upAlterColumnUnique(change, schemaName);\n\t\tcase 'add_primary_key':\n\t\t\treturn upAddPrimaryKey(change, schemaName);\n\t\tcase 'drop_primary_key':\n\t\t\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} DROP CONSTRAINT IF EXISTS ${quoteIdent(pkName(change.table), 'alias')} CASCADE;`;\n\t\tcase 'add_foreign_key': {\n\t\t\tconst fk = change.meta?.fk as ForeignKeyIR;\n\t\t\treturn fk ? generateAddFKSQL(change.table, fk, schemaName) : undefined;\n\t\t}\n\t\tcase 'drop_foreign_key':\n\t\t\treturn upDropForeignKey(change, schemaName);\n\t\tcase 'alter_foreign_key':\n\t\t\treturn upAlterForeignKey(change, schemaName);\n\t\tcase 'create_index':\n\t\t\treturn upCreateIndex(change, schemaName, indexContext);\n\t\tcase 'drop_index':\n\t\t\treturn upDropIndex(change, schemaName);\n\t\tcase 'add_check_constraint':\n\t\t\treturn upAddCheckConstraint(change, schemaName);\n\t\tcase 'validate_constraint':\n\t\t\treturn upValidateConstraint(change, schemaName);\n\t\tcase 'drop_check_constraint': {\n\t\t\tconst check = change.meta?.check as CheckConstraintIR;\n\t\t\treturn check\n\t\t\t\t? `ALTER TABLE ${qualifyTable(change.table, schemaName)} DROP CONSTRAINT IF EXISTS ${quoteIdent(check.name, 'alias')};`\n\t\t\t\t: undefined;\n\t\t}\n\t\tcase 'create_enum':\n\t\t\treturn upCreateEnum(change, schemaName);\n\t\tcase 'alter_enum_add_value':\n\t\t\treturn upAlterEnumAddValue(change, schemaName);\n\t\tcase 'drop_enum':\n\t\t\treturn upDropEnum(change, schemaName);\n\t\tcase 'alter_column_collation':\n\t\t\treturn upAlterColumnCollation(change, schemaName);\n\t\tcase 'alter_column_identity':\n\t\t\treturn upAlterColumnIdentity(change, schemaName);\n\t\tcase 'add_comment':\n\t\t\treturn upAddComment(change, schemaName);\n\t\tcase 'drop_comment': {\n\t\t\tconst target = change.meta?.target as string;\n\t\t\tif (target === 'table') {\n\t\t\t\treturn `COMMENT ON TABLE ${qualifyTable(change.table, schemaName)} IS NULL;`;\n\t\t\t}\n\t\t\treturn `COMMENT ON COLUMN ${qualifyTable(change.table, schemaName)}.${quoteIdent(change.column!, 'alias')} IS NULL;`;\n\t\t}\n\t\tcase 'create_extension': {\n\t\t\tconst ext = change.meta?.extension as string;\n\t\t\tif (ext == null) return undefined;\n\t\t\treturn `CREATE EXTENSION IF NOT EXISTS ${quoteExtensionName(ext)};`;\n\t\t}\n\t\tcase 'drop_extension': {\n\t\t\tconst ext = change.meta?.extension as string;\n\t\t\tif (ext == null) return undefined;\n\t\t\treturn `DROP EXTENSION IF EXISTS ${quoteExtensionName(ext)} CASCADE;`;\n\t\t}\n\t\tcase 'create_sequence': {\n\t\t\tconst seq = change.meta?.sequence as SequenceIR;\n\t\t\treturn seq\n\t\t\t\t? buildSequenceClause(\n\t\t\t\t\t\t'CREATE SEQUENCE',\n\t\t\t\t\t\tupSequenceName(schemaName, seq),\n\t\t\t\t\t\tseq,\n\t\t\t\t\t)\n\t\t\t\t: undefined;\n\t\t}\n\t\tcase 'alter_sequence': {\n\t\t\tconst seq = change.meta?.sequence as SequenceIR;\n\t\t\treturn seq\n\t\t\t\t? buildSequenceClause(\n\t\t\t\t\t\t'ALTER SEQUENCE',\n\t\t\t\t\t\tupSequenceName(schemaName, seq),\n\t\t\t\t\t\tseq,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t)\n\t\t\t\t: undefined;\n\t\t}\n\t\tcase 'drop_sequence': {\n\t\t\tconst seq = change.meta?.sequence as SequenceIR;\n\t\t\treturn seq\n\t\t\t\t? `DROP SEQUENCE IF EXISTS ${upSequenceName(schemaName, seq)} CASCADE;`\n\t\t\t\t: undefined;\n\t\t}\n\t\tcase 'enable_rls':\n\t\t\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} ENABLE ROW LEVEL SECURITY;`;\n\t\tcase 'disable_rls':\n\t\t\treturn `ALTER TABLE ${qualifyTable(change.table, schemaName)} DISABLE ROW LEVEL SECURITY;`;\n\t\tcase 'create_policy': {\n\t\t\tconst policy = change.meta?.policy as PolicyIR;\n\t\t\treturn policy\n\t\t\t\t? buildPolicySQL(change.table, policy, schemaName)\n\t\t\t\t: undefined;\n\t\t}\n\t\tcase 'drop_policy': {\n\t\t\tconst policy = change.meta?.policy as PolicyIR;\n\t\t\treturn policy\n\t\t\t\t? `DROP POLICY IF EXISTS ${quoteIdent(policy.name, 'alias')} ON ${qualifyTable(change.table, schemaName)};`\n\t\t\t\t: undefined;\n\t\t}\n\t}\n}\n\n// ============================================================================\n// DOWN SQL Generators per ChangeKind\n// ============================================================================\n\nfunction changeToDownSQL(\n\tchange: SchemaChange,\n\tschemaName?: string,\n\tindexContext?: IndexCapabilityContext,\n): DownChangeSQL {\n\t// Fail-safe allowlist: DOWN is destructive unless this switch explicitly\n\t// proves it only re-adds/restores recorded prior state. Any DROP, DISABLE,\n\t// removal, warning, missing metadata, or uncertain reversal stays destructive.\n\tswitch (change.kind) {\n\t\tcase 'create_table':\n\t\t\treturn {\n\t\t\t\tsql: `DROP TABLE IF EXISTS ${qualifyTable(change.table, schemaName)} CASCADE;`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\n\t\tcase 'readdress_table':\n\t\t\treturn {\n\t\t\t\tsql: `-- WARNING: Cannot reverse readdress_table \"${sanitizeCommentText(change.table)}\" without a new declared re-addressing`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\n\t\tcase 'drop_table':\n\t\t\treturn {\n\t\t\t\tsql: `-- WARNING: Cannot reverse drop_table \"${sanitizeCommentText(change.table)}\" -- table data was lost`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\n\t\tcase 'add_column':\n\t\t\treturn {\n\t\t\t\tsql: `ALTER TABLE ${qualifyTable(change.table, schemaName)} DROP COLUMN ${quoteIdent(change.column!, 'alias')} CASCADE;`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\n\t\tcase 'drop_column':\n\t\t\treturn {\n\t\t\t\tsql: `-- WARNING: Cannot reverse drop_column \"${sanitizeCommentText(change.table)}\".\"${sanitizeCommentText(change.column)}\" -- column data was lost`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\n\t\tcase 'alter_column_type': {\n\t\t\tconst fromColumn = change.meta?.fromColumn as ColumnIR | undefined;\n\t\t\tif (fromColumn !== undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: `ALTER TABLE ${qualifyTable(change.table, schemaName)} ALTER COLUMN ${quoteIdent(change.column!, 'alias')} TYPE ${mapColumnType(fromColumn, schemaName)};`,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst fromType = change.meta?.fromType;\n\t\t\tif (fromType == null) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: `-- WARNING: Cannot reverse alter_column_type \"${sanitizeCommentText(change.table)}\".\"${sanitizeCommentText(change.column)}\" -- missing migration metadata`,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst safeFromType = validateDbTypeName(fromType as string);\n\t\t\treturn {\n\t\t\t\tsql: `ALTER TABLE ${qualifyTable(change.table, schemaName)} ALTER COLUMN ${quoteIdent(change.column!, 'alias')} TYPE ${safeFromType};`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'alter_column_nullable': {\n\t\t\tconst oldNullable = change.meta?.oldNullable as boolean | undefined;\n\t\t\tif (oldNullable === undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: `-- WARNING: Cannot reverse alter_column_nullable \"${sanitizeCommentText(change.table)}\".\"${sanitizeCommentText(change.column)}\" -- missing migration metadata`,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Reverse: restore old nullable state\n\t\t\tconst action = oldNullable ? 'DROP NOT NULL' : 'SET NOT NULL';\n\t\t\treturn {\n\t\t\t\tsql: `ALTER TABLE ${qualifyTable(change.table, schemaName)} ALTER COLUMN ${quoteIdent(change.column!, 'alias')} ${action};`,\n\t\t\t\t// Allowlisted: restores the recorded prior nullability metadata.\n\t\t\t\tdestructive: false,\n\t\t\t};\n\t\t}\n\n\t\tcase 'alter_column_default': {\n\t\t\tconst oldDefault = change.meta?.oldDefault;\n\t\t\tif (oldDefault === undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: `-- WARNING: Cannot reverse alter_column_default \"${sanitizeCommentText(change.table)}\".\"${sanitizeCommentText(change.column)}\" -- missing migration metadata`,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (oldDefault === null) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: `ALTER TABLE ${qualifyTable(change.table, schemaName)} ALTER COLUMN ${quoteIdent(change.column!, 'alias')} DROP DEFAULT;`,\n\t\t\t\t\t// Allowlisted: restores the recorded prior state of \"no default\".\n\t\t\t\t\tdestructive: false,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsql: `ALTER TABLE ${qualifyTable(change.table, schemaName)} ALTER COLUMN ${quoteIdent(change.column!, 'alias')} SET DEFAULT ${formatDefault(oldDefault)};`,\n\t\t\t\t// Allowlisted: restores the recorded prior default value.\n\t\t\t\tdestructive: false,\n\t\t\t};\n\t\t}\n\n\t\tcase 'alter_column_unique': {\n\t\t\tconst unique = change.meta?.unique as boolean | undefined;\n\t\t\tif (unique === undefined || !change.column) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: `-- WARNING: Cannot reverse alter_column_unique \"${sanitizeCommentText(change.table)}\".\"${sanitizeCommentText(change.column)}\" -- missing migration metadata`,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst constraintName = change.meta?.constraintName as string | undefined;\n\t\t\treturn {\n\t\t\t\tsql: unique\n\t\t\t\t\t? dropColumnUniqueSQL(\n\t\t\t\t\t\t\tchange.table,\n\t\t\t\t\t\t\tchange.column,\n\t\t\t\t\t\t\tschemaName,\n\t\t\t\t\t\t\tconstraintName,\n\t\t\t\t\t\t)\n\t\t\t\t\t: addColumnUniqueSQL(\n\t\t\t\t\t\t\tchange.table,\n\t\t\t\t\t\t\tchange.column,\n\t\t\t\t\t\t\tschemaName,\n\t\t\t\t\t\t\tconstraintName,\n\t\t\t\t\t\t),\n\t\t\t\tdestructive: unique === true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'add_primary_key': {\n\t\t\treturn {\n\t\t\t\tsql: `ALTER TABLE ${qualifyTable(change.table, schemaName)} DROP CONSTRAINT IF EXISTS ${quoteIdent(pkName(change.table), 'alias')} CASCADE;`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'drop_primary_key': {\n\t\t\tconst columns = change.meta?.columns as readonly string[] | undefined;\n\t\t\tif (Array.isArray(columns) && columns.length > 0) {\n\t\t\t\tconst pkCols = columns.map((n) => quoteIdent(n, 'alias')).join(', ');\n\t\t\t\treturn {\n\t\t\t\t\tsql: `ALTER TABLE ${qualifyTable(change.table, schemaName)} ADD CONSTRAINT ${quoteIdent(pkName(change.table), 'alias')} PRIMARY KEY (${pkCols});`,\n\t\t\t\t\t// Allowlisted: re-adds the dropped primary-key constraint from metadata.\n\t\t\t\t\tdestructive: false,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsql: `-- WARNING: Cannot reverse drop_primary_key \"${sanitizeCommentText(change.table)}\" -- columns unknown`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'add_foreign_key': {\n\t\t\tconst fk = change.meta?.fk as ForeignKeyIR | undefined;\n\t\t\tif (!fk) return { sql: undefined, destructive: true };\n\t\t\tconst constraintName = quoteIdent(\n\t\t\t\tfkName(change.table, fk.columns),\n\t\t\t\t'alias',\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tsql: `ALTER TABLE ${qualifyTable(change.table, schemaName)} DROP CONSTRAINT IF EXISTS ${constraintName} CASCADE;`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'drop_foreign_key': {\n\t\t\tconst fk = change.meta?.fk as ForeignKeyIR | undefined;\n\t\t\tif (!fk) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: `-- WARNING: Cannot reverse drop_foreign_key \"${sanitizeCommentText(change.table)}\" -- FK definition was lost`,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsql: generateAddFKSQL(change.table, fk, schemaName),\n\t\t\t\t// Allowlisted: re-adds the dropped foreign-key constraint from metadata.\n\t\t\t\tdestructive: false,\n\t\t\t};\n\t\t}\n\n\t\tcase 'alter_foreign_key': {\n\t\t\tconst oldFk = change.meta?.oldFk as ForeignKeyIR | undefined;\n\t\t\tconst fk = change.meta?.fk as ForeignKeyIR | undefined;\n\t\t\tif (!oldFk || !fk) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: `-- WARNING: Cannot reverse alter_foreign_key \"${sanitizeCommentText(change.table)}\" -- missing migration metadata`,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst constraintName = quoteIdent(\n\t\t\t\tfkName(change.table, fk.columns),\n\t\t\t\t'alias',\n\t\t\t);\n\t\t\tconst drop = `ALTER TABLE ${qualifyTable(change.table, schemaName)} DROP CONSTRAINT IF EXISTS ${constraintName};`;\n\t\t\tconst add = generateAddFKSQL(change.table, oldFk, schemaName);\n\t\t\t// Allowlisted: swaps the current FK back to the recorded prior FK.\n\t\t\treturn { sql: `${drop}\\n${add}`, destructive: false };\n\t\t}\n\n\t\tcase 'create_index': {\n\t\t\tconst idx = change.meta?.index as IndexIR | undefined;\n\t\t\tif (!idx) return { sql: undefined, destructive: true };\n\t\t\tconst indexName = quoteIdent(\n\t\t\t\tidxName(change.table, idx.columns, idx.name),\n\t\t\t\t'alias',\n\t\t\t);\n\t\t\tconst schemaPrefix = schemaName\n\t\t\t\t? `${quoteIdent(schemaName, 'alias')}.`\n\t\t\t\t: '';\n\t\t\treturn {\n\t\t\t\tsql: `DROP INDEX IF EXISTS ${schemaPrefix}${indexName};`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'drop_index': {\n\t\t\tconst idx = change.meta?.index as IndexIR | undefined;\n\t\t\tif (!idx) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: `-- WARNING: Cannot reverse drop_index \"${sanitizeCommentText(change.table)}\" -- index definition was lost`,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsql: upCreateIndex(change, schemaName, indexContext),\n\t\t\t\t// Allowlisted: re-creates the dropped index from metadata.\n\t\t\t\tdestructive: false,\n\t\t\t};\n\t\t}\n\n\t\tcase 'add_check_constraint': {\n\t\t\tconst check = change.meta?.check as CheckConstraintIR | undefined;\n\t\t\tif (!check) return { sql: undefined, destructive: true };\n\t\t\treturn {\n\t\t\t\tsql: `ALTER TABLE ${qualifyTable(change.table, schemaName)} DROP CONSTRAINT IF EXISTS ${quoteIdent(check.name, 'alias')};`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'drop_check_constraint': {\n\t\t\tconst check = change.meta?.check as CheckConstraintIR | undefined;\n\t\t\tif (!check) return { sql: undefined, destructive: true };\n\t\t\tconst canonicalCheck = isEngineCanonicalCheck(check);\n\t\t\tconst expression = renderCheckConstraintClause(check);\n\t\t\tif (!canonicalCheck) {\n\t\t\t\tvalidateCheckExpression(\n\t\t\t\t\texpression,\n\t\t\t\t\t'migration check constraint (down)',\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsql: buildDoBlock(\n\t\t\t\t\t'BEGIN ALTER TABLE ' +\n\t\t\t\t\t\tqualifyTable(change.table, schemaName) +\n\t\t\t\t\t\t' ADD CONSTRAINT ' +\n\t\t\t\t\t\tquoteIdent(check.name, 'alias') +\n\t\t\t\t\t\t' ' +\n\t\t\t\t\t\t(canonicalCheck\n\t\t\t\t\t\t\t? escapeCanonicalSqlLiterals(expression)\n\t\t\t\t\t\t\t: expression) +\n\t\t\t\t\t\t'; EXCEPTION WHEN duplicate_object THEN NULL; END',\n\t\t\t\t),\n\t\t\t\t// Allowlisted: re-adds the dropped CHECK constraint from metadata.\n\t\t\t\tdestructive: false,\n\t\t\t};\n\t\t}\n\n\t\tcase 'create_enum': {\n\t\t\t// DOWN: drop the type that was created\n\t\t\tconst enumDef = change.meta?.enum as EnumIR | undefined;\n\t\t\tif (!enumDef) return { sql: undefined, destructive: true };\n\t\t\tconst enumName = qualifyEnumType(enumDef, schemaName);\n\t\t\treturn {\n\t\t\t\tsql: `DROP TYPE IF EXISTS ${enumName} CASCADE;`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'drop_enum': {\n\t\t\t// DOWN: recreate the type that was dropped\n\t\t\tconst enumDef = change.meta?.enum as EnumIR | undefined;\n\t\t\tif (!enumDef) return { sql: undefined, destructive: true };\n\t\t\tconst enumName = qualifyEnumType(enumDef, schemaName);\n\t\t\tconst values = enumDef.values\n\t\t\t\t.map((v) => {\n\t\t\t\t\tvalidateEnumLabel(v, 'enum value');\n\t\t\t\t\treturn `'${v.replace(/'/g, \"''\")}'`;\n\t\t\t\t})\n\t\t\t\t.join(', ');\n\t\t\treturn {\n\t\t\t\tsql: `CREATE TYPE ${enumName} AS ENUM (${values});`,\n\t\t\t\t// Allowlisted: re-creates the dropped enum type from metadata.\n\t\t\t\tdestructive: false,\n\t\t\t};\n\t\t}\n\n\t\tcase 'alter_enum_add_value':\n\t\t\t// DOWN: ALTER TYPE ADD VALUE cannot be reversed in PostgreSQL\n\t\t\treturn {\n\t\t\t\tsql: `-- ALTER TYPE ADD VALUE cannot be reversed in PostgreSQL`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\n\t\tcase 'alter_column_collation': {\n\t\t\t// DOWN: restore previous collation — stored in db state, not in meta; emit warning\n\t\t\treturn {\n\t\t\t\tsql: `-- WARNING: Cannot reverse alter_column_collation \"${sanitizeCommentText(change.table)}\".\"${sanitizeCommentText(change.column)}\" -- previous collation unknown`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'alter_column_identity': {\n\t\t\tconst col = change.meta?.column as ColumnIR | undefined;\n\t\t\tconst prevIdentity = change.meta?.previousIdentity as string | undefined;\n\t\t\tif (!col) return { sql: undefined, destructive: true };\n\t\t\tconst table = qualifyTable(change.table, schemaName);\n\t\t\tconst column = quoteIdent(change.column!, 'alias');\n\t\t\t// Reverse: restore previous identity state\n\t\t\tif (prevIdentity && !col.identity) {\n\t\t\t\t// Was identity, now not → re-add identity\n\t\t\t\tconst gen = prevIdentity === 'always' ? 'ALWAYS' : 'BY DEFAULT';\n\t\t\t\treturn {\n\t\t\t\t\tsql: `ALTER TABLE ${table} ALTER COLUMN ${column} ADD GENERATED ${gen} AS IDENTITY;`,\n\t\t\t\t\t// Allowlisted: re-adds the previously recorded identity metadata.\n\t\t\t\t\tdestructive: false,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (!prevIdentity && col.identity) {\n\t\t\t\t// Was not identity, now is → drop identity\n\t\t\t\treturn {\n\t\t\t\t\tsql: `ALTER TABLE ${table} ALTER COLUMN ${column} DROP IDENTITY IF EXISTS;`,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (!prevIdentity && !col.identity) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: `-- WARNING: Cannot reverse alter_column_identity \"${sanitizeCommentText(change.table)}\".\"${sanitizeCommentText(change.column)}\" -- missing previous identity metadata`,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Change between types → restore previous\n\t\t\tconst gen = prevIdentity === 'always' ? 'ALWAYS' : 'BY DEFAULT';\n\t\t\treturn {\n\t\t\t\tsql: `ALTER TABLE ${table} ALTER COLUMN ${column} SET GENERATED ${gen};`,\n\t\t\t\t// Allowlisted: restores the recorded prior identity generation mode.\n\t\t\t\tdestructive: false,\n\t\t\t};\n\t\t}\n\n\t\tcase 'add_comment': {\n\t\t\t// DOWN: restore the previous comment if this was a change; otherwise\n\t\t\t// remove the fresh comment that was added.\n\t\t\tconst target = change.meta?.target as string;\n\t\t\tconst previousComment = change.meta?.previousComment;\n\t\t\t// Restore a non-empty prior comment (this was a change, not a fresh add).\n\t\t\t// An empty string, null, or undefined all roll back to IS NULL: PostgreSQL\n\t\t\t// stores COMMENT ... IS '' identically to IS NULL (obj_description returns\n\t\t\t// NULL) and introspection never yields '', so \"empty comment\" and \"no\n\t\t\t// comment\" are the same state — consistent with compareComments treating\n\t\t\t// an empty desired comment as no comment.\n\t\t\tif (previousComment !== undefined && previousComment !== null) {\n\t\t\t\tassertString(previousComment, 'previous migration comment');\n\t\t\t\tif (previousComment.length > 0) {\n\t\t\t\t\tconst escaped = previousComment.replace(/'/g, \"''\");\n\t\t\t\t\tif (target === 'table') {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tsql: `COMMENT ON TABLE ${qualifyTable(change.table, schemaName)} IS '${escaped}';`,\n\t\t\t\t\t\t\t// Allowlisted: restores the recorded prior table comment.\n\t\t\t\t\t\t\tdestructive: false,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsql: `COMMENT ON COLUMN ${qualifyTable(change.table, schemaName)}.${quoteIdent(change.column!, 'alias')} IS '${escaped}';`,\n\t\t\t\t\t\t// Allowlisted: restores the recorded prior column comment.\n\t\t\t\t\t\tdestructive: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (target === 'table') {\n\t\t\t\treturn {\n\t\t\t\t\tsql: `COMMENT ON TABLE ${qualifyTable(change.table, schemaName)} IS NULL;`,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsql: `COMMENT ON COLUMN ${qualifyTable(change.table, schemaName)}.${quoteIdent(change.column!, 'alias')} IS NULL;`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'drop_comment': {\n\t\t\tconst target = change.meta?.target as string | undefined;\n\t\t\tconst comment = change.meta?.comment;\n\t\t\t// Treat undefined AND null as \"no recorded prior comment\": the comparator\n\t\t\t// stores db.comment, which may be null, and a null must fall through to the\n\t\t\t// warning path rather than throwing in assertString.\n\t\t\tif (comment !== undefined && comment !== null) {\n\t\t\t\tassertString(comment, 'migration comment');\n\t\t\t\tconst escaped = comment.replace(/'/g, \"''\");\n\t\t\t\tif (target === 'table') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsql: `COMMENT ON TABLE ${qualifyTable(change.table, schemaName)} IS '${escaped}';`,\n\t\t\t\t\t\t// Allowlisted: re-adds the dropped table comment from metadata.\n\t\t\t\t\t\tdestructive: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (target === 'column') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsql: `COMMENT ON COLUMN ${qualifyTable(change.table, schemaName)}.${quoteIdent(change.column!, 'alias')} IS '${escaped}';`,\n\t\t\t\t\t\t// Allowlisted: re-adds the dropped column comment from metadata.\n\t\t\t\t\t\tdestructive: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst columnTarget =\n\t\t\t\tchange.column === undefined\n\t\t\t\t\t? ''\n\t\t\t\t\t: `.\"${sanitizeCommentText(change.column)}\"`;\n\t\t\treturn {\n\t\t\t\tsql:\n\t\t\t\t\t'-- WARNING: Cannot reverse drop_comment \"' +\n\t\t\t\t\tsanitizeCommentText(change.table) +\n\t\t\t\t\t'\"' +\n\t\t\t\t\tcolumnTarget +\n\t\t\t\t\t' -- comment text was lost',\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'create_extension': {\n\t\t\t// DOWN: drop the extension that was created\n\t\t\tconst ext = change.meta?.extension as string;\n\t\t\tif (ext == null) return { sql: undefined, destructive: true };\n\t\t\treturn {\n\t\t\t\tsql: `DROP EXTENSION IF EXISTS ${quoteExtensionName(ext)} CASCADE;`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'drop_extension': {\n\t\t\t// DOWN: recreate the extension that was dropped\n\t\t\tconst ext = change.meta?.extension as string;\n\t\t\tif (ext == null) return { sql: undefined, destructive: true };\n\t\t\treturn {\n\t\t\t\tsql: `CREATE EXTENSION IF NOT EXISTS ${quoteExtensionName(ext)};`,\n\t\t\t\t// Allowlisted: re-creates the dropped extension from metadata.\n\t\t\t\tdestructive: false,\n\t\t\t};\n\t\t}\n\n\t\tcase 'create_sequence': {\n\t\t\t// DOWN: drop the sequence that was created\n\t\t\tconst seq = change.meta?.sequence as SequenceIR;\n\t\t\tif (!seq) return { sql: undefined, destructive: true };\n\t\t\tconst seqName = schemaName\n\t\t\t\t? `${quoteIdent(schemaName, 'alias')}.${quoteIdent(seq.name, 'alias')}`\n\t\t\t\t: quoteIdent(seq.name, 'alias');\n\t\t\treturn {\n\t\t\t\tsql: `DROP SEQUENCE IF EXISTS ${seqName} CASCADE;`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'alter_sequence': {\n\t\t\t// DOWN: restore previous sequence state\n\t\t\tconst prevSeq = change.meta?.previousSequence as SequenceIR | undefined;\n\t\t\tif (!prevSeq) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: `-- WARNING: Cannot reverse alter_sequence \"${sanitizeCommentText(change.table)}\" -- missing migration metadata`,\n\t\t\t\t\tdestructive: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst seqName = schemaName\n\t\t\t\t? `${quoteIdent(schemaName, 'alias')}.${quoteIdent(prevSeq.name, 'alias')}`\n\t\t\t\t: quoteIdent(prevSeq.name, 'alias');\n\t\t\treturn {\n\t\t\t\tsql: buildSequenceClause('ALTER SEQUENCE', seqName, prevSeq, true),\n\t\t\t\t// Allowlisted: restores the recorded prior sequence metadata.\n\t\t\t\tdestructive: false,\n\t\t\t};\n\t\t}\n\n\t\tcase 'drop_sequence': {\n\t\t\t// DOWN: recreate the sequence that was dropped\n\t\t\tconst seq = change.meta?.sequence as SequenceIR;\n\t\t\tif (!seq) return { sql: undefined, destructive: true };\n\t\t\tconst seqName = schemaName\n\t\t\t\t? `${quoteIdent(schemaName, 'alias')}.${quoteIdent(seq.name, 'alias')}`\n\t\t\t\t: quoteIdent(seq.name, 'alias');\n\t\t\treturn {\n\t\t\t\tsql: buildSequenceClause('CREATE SEQUENCE', seqName, seq),\n\t\t\t\t// Allowlisted: re-creates the dropped sequence from metadata.\n\t\t\t\tdestructive: false,\n\t\t\t};\n\t\t}\n\n\t\tcase 'validate_constraint':\n\t\t\t// DOWN: VALIDATE CONSTRAINT cannot be reversed in PostgreSQL\n\t\t\treturn {\n\t\t\t\tsql: `-- VALIDATE CONSTRAINT cannot be reversed in PostgreSQL (table: \"${sanitizeCommentText(change.table)}\")`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\n\t\tcase 'enable_rls':\n\t\t\t// DOWN: reverse enable → disable\n\t\t\treturn {\n\t\t\t\tsql: `ALTER TABLE ${qualifyTable(change.table, schemaName)} DISABLE ROW LEVEL SECURITY;`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\n\t\tcase 'disable_rls':\n\t\t\t// DOWN: reverse disable → enable\n\t\t\treturn {\n\t\t\t\tsql: `ALTER TABLE ${qualifyTable(change.table, schemaName)} ENABLE ROW LEVEL SECURITY;`,\n\t\t\t\t// Allowlisted: re-enables the previously present RLS security control.\n\t\t\t\tdestructive: false,\n\t\t\t};\n\n\t\tcase 'create_policy': {\n\t\t\t// DOWN: drop the policy that was created\n\t\t\tconst policy = change.meta?.policy as PolicyIR;\n\t\t\tif (!policy) return { sql: undefined, destructive: true };\n\t\t\treturn {\n\t\t\t\tsql: `DROP POLICY IF EXISTS ${quoteIdent(policy.name, 'alias')} ON ${qualifyTable(change.table, schemaName)};`,\n\t\t\t\tdestructive: true,\n\t\t\t};\n\t\t}\n\n\t\tcase 'drop_policy': {\n\t\t\t// DOWN: recreate the policy that was dropped\n\t\t\tconst policy = change.meta?.policy as PolicyIR;\n\t\t\tif (!policy) return { sql: undefined, destructive: true };\n\t\t\treturn {\n\t\t\t\tsql: buildPolicySQL(change.table, policy, schemaName),\n\t\t\t\t// Allowlisted: re-creates the dropped RLS policy from metadata.\n\t\t\t\tdestructive: false,\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\treturn failSafeUnknownDownChange(change.kind);\n\t}\n}\n\n// ============================================================================\n// Down Migration SQL Generation\n// ============================================================================\n\n/**\n * Generate ordered DOWN SQL statements from a SchemaDiff.\n *\n * Reverses the topological order used in UP migrations:\n * phases run in descending order (11, 10, 9, ..., 0).\n *\n * Irreversible changes (drops that lose data) produce SQL WARNING comments.\n */\nexport function generateDownSQL(\n\tdiff: SchemaDiff,\n\toptions?: MigrationSQLOptions,\n): readonly string[] {\n\treturn generateDownMigrationSQL(diff, options).statements;\n}\n\n/**\n * Generate ordered DOWN SQL statements with structural rollback destructiveness.\n *\n * The destructive flag is emitted by changeToDownSQL alongside each DOWN\n * statement, not by regex-scanning SQL text or by a second SchemaChange switch.\n */\nexport function generateDownMigrationSQL(\n\tdiff: SchemaDiff,\n\toptions?: MigrationSQLOptions,\n): DownMigrationSQL {\n\tconst schemaName = options?.schemaName;\n\tconst includeDestructive = options?.includeDestructive ?? true;\n\n\t// Group changes by phase for topological ordering\n\tconst phases: SchemaChange[][] = [\n\t\t[], // 0: drop FK, drop CHECK\n\t\t[], // 1: drop index\n\t\t[], // 2: drop column\n\t\t[], // 3: drop PK\n\t\t[], // 4: drop table, drop ENUM\n\t\t[], // 5: create ENUM\n\t\t[], // 6: create table\n\t\t[], // 7: add column\n\t\t[], // 8: alter column\n\t\t[], // 9: add PK / column UNIQUE constraint\n\t\t[], // 10: add FK\n\t\t[], // 11: alter FK (drop + re-add)\n\t\t[], // 12: create index\n\t\t[], // 13: add CHECK constraint\n\t\t[], // 14: alter ENUM add value\n\t\t[], // 15: comments\n\t\t[], // 16: VALIDATE CONSTRAINT\n\t\t[], // 17: ENABLE/DISABLE ROW LEVEL SECURITY\n\t\t[], // 18: CREATE/DROP POLICY\n\t];\n\n\t// DOWN mirrors UP's filter first: rollback may only reverse changes the\n\t// forward migration actually applied. It still applies its own rollback-side\n\t// destructiveness filter below.\n\tconst changes = changesAppliedByUp(diff, options);\n\tconst indexContext = indexContextFromOptions(options);\n\tconst createIndexSpecs = collectDownCreateIndexSpecs(changes, schemaName);\n\tassertCreateIndexesSupported(createIndexSpecs, indexContext);\n\n\tfor (const change of changes) {\n\t\tconst phase = getPhase(change.kind);\n\t\tphases[phase]!.push(change);\n\t}\n\n\t// Generate SQL in reverse phase order. Within a phase, keep FORWARD change order\n\t// so dependent restores run in sequence — e.g. a column's type must be restored\n\t// before its default (a default is validated against the current column type),\n\t// and compareColumnDetails emits type before default, so forward is correct on\n\t// the way down too. The policy phase is the exception: a same-name policy change\n\t// is emitted UP as drop-then-create, so its DOWN must DROP the new policy before\n\t// re-CREATE-ing the old one — reverse only that phase so DROP precedes CREATE.\n\tconst policyPhase = getPhase('create_policy');\n\tconst statements: string[] = [];\n\tconst scope = createSchemaScopeAccumulator();\n\tlet destructive = false;\n\tfor (let i = phases.length - 1; i >= 0; i--) {\n\t\tconst phaseChanges =\n\t\t\ti === policyPhase ? [...phases[i]!].reverse() : phases[i]!;\n\t\tfor (const change of phaseChanges) {\n\t\t\tconst down = changeToDownSQL(change, schemaName, indexContext);\n\t\t\tif (!includeDestructive && down.destructive) continue;\n\t\t\tdestructive = down.destructive || destructive;\n\t\t\tif (down.sql) {\n\t\t\t\tstatements.push(down.sql);\n\t\t\t\tcollectChangeScopeEvidence(change, scope);\n\t\t\t}\n\t\t}\n\t}\n\tassertSchemaName(scope, schemaName, MIGRATION_SCHEMA_SCOPE_SUBJECT);\n\treturn { statements, destructive };\n}\n\nfunction generateCreateTableSQL(table: TableIR, schemaName?: string): string {\n\tconst qualTable = qualifyTable(table.name, schemaName);\n\n\tconst elements: string[] = [];\n\n\t// Columns\n\tfor (const col of table.columns) {\n\t\tconst typeName = mapColumnType(col, schemaName);\n\t\tconst parts: string[] = [quoteIdent(col.name, 'alias'), typeName];\n\t\tif (!col.nullable && typeName !== 'SERIAL' && typeName !== 'BIGSERIAL')\n\t\t\tparts.push('NOT NULL');\n\t\tif (col.default !== undefined)\n\t\t\tparts.push(`DEFAULT ${formatDefault(col.default)}`);\n\t\tif (col.unique) parts.push('UNIQUE');\n\t\t// S-2: validate collation name before quoting — uses quoteCollation which\n\t\t// accepts locale strings like `en_US.utf8`, `en-US-x-icu`, `C.UTF-8`\n\t\t// that contain dots/hyphens rejected by the standard identifier validator.\n\t\tif (col.collation) parts.push(`COLLATE ${quoteCollation(col.collation)}`);\n\t\tif (col.identity) {\n\t\t\tconst gen = col.identity === 'always' ? 'ALWAYS' : 'BY DEFAULT';\n\t\t\tparts.push(`GENERATED ${gen} AS IDENTITY`);\n\t\t}\n\t\telements.push(parts.join(' '));\n\t}\n\n\t// Primary key\n\tif (table.primaryKey !== undefined) {\n\t\tconst pkCols = (\n\t\t\tArray.isArray(table.primaryKey) ? table.primaryKey : [table.primaryKey]\n\t\t)\n\t\t\t.map((n) => quoteIdent(n, 'alias'))\n\t\t\t.join(', ');\n\t\telements.push(\n\t\t\t`CONSTRAINT ${quoteIdent(pkName(table.name), 'alias')} PRIMARY KEY (${pkCols})`,\n\t\t);\n\t}\n\n\tconst body = elements.map((el) => ` ${el}`).join(',\\n');\n\tlet sql = `CREATE TABLE ${qualTable} (\\n${body}\\n)`;\n\tif (table.partition) {\n\t\tconst strategy = assertPartitionStrategy(table.partition.strategy);\n\t\tconst partCols = table.partition.columns\n\t\t\t.map((n) => quoteIdent(n, 'alias'))\n\t\t\t.join(', ');\n\t\tsql += ` PARTITION BY ${strategy} (${partCols})`;\n\t}\n\tsql += ';';\n\treturn sql;\n}\n\nfunction generateAddFKSQL(\n\ttableName: string,\n\tfk: ForeignKeyIR,\n\tschemaName?: string,\n): string {\n\tconst qualTable = qualifyTable(tableName, schemaName);\n\tconst constraintName = quoteIdent(fkName(tableName, fk.columns), 'alias');\n\tconst fkCols = fk.columns.map((n) => quoteIdent(n, 'alias')).join(', ');\n\t// Referenced table resolves to its declared schema, or the migration schema when absent.\n\tconst refTable = qualifyTable(\n\t\tfk.references.table,\n\t\tfk.references.schema ?? schemaName,\n\t);\n\tconst refCols = fk.references.columns\n\t\t.map((n) => quoteIdent(n, 'alias'))\n\t\t.join(', ');\n\tconst onDelete = fk.onDelete\n\t\t? ` ON DELETE ${mapOnDeleteAction(fk.onDelete)}`\n\t\t: '';\n\tconst onUpdate = fk.onUpdate\n\t\t? ` ON UPDATE ${mapOnDeleteAction(fk.onUpdate)}`\n\t\t: '';\n\tconst deferred =\n\t\tnormalizeOptionalBoolean(fk.deferred, 'foreign key deferred') === true\n\t\t\t? ' DEFERRABLE INITIALLY DEFERRED'\n\t\t\t: '';\n\tconst notValid =\n\t\tnormalizeOptionalBoolean(fk.notValid, 'foreign key notValid') === true\n\t\t\t? ' NOT VALID'\n\t\t\t: '';\n\treturn `ALTER TABLE ${qualTable} ADD CONSTRAINT ${constraintName} FOREIGN KEY (${fkCols}) REFERENCES ${refTable} (${refCols})${onDelete}${onUpdate}${deferred}${notValid};`;\n}\n\n// M-6: formatDefault is now a thin alias for the shared formatSqlDefault from phases/utils.\n// The duplicate implementations in migration-sql.ts, table-operations.ts, and ddl-generator.ts\n// have been consolidated. See formatSqlDefault in packages/adapter-pgsql/src/ddl/phases/utils.ts.\nfunction formatDefault(value: unknown): string {\n\treturn formatSqlDefault(value, 'migration-sql default');\n}\n","/**\n * Schema-scope guard.\n *\n * `generateDDL` / `generateMigrationSQL` / `generateDownSQL` throw iff the SQL\n * they are about to return would be internally schema-inconsistent: custom\n * types or managed enums would be qualified with a non-default schema while\n * table SQL stays unqualified. Omitting `schemaName` has always meant \"target\n * the session's current_schema\"; the guard only closes the case where generated\n * type SQL points somewhere else.\n *\n * That inconsistency can only be proven from target-scoped column types\n * (`ColumnIR.originalDbTypeSchemaScope === 'target'`) and managed enums\n * (`EnumIR.schema`), so those are exactly the fields collected here.\n *\n * Type and enum statements are self-qualifying: they carry their own schema in\n * the type name. A migration or model that emits only CREATE/ALTER/DROP TYPE\n * is therefore coherent without `schemaName`. Schema scope becomes hazardous\n * only when the same emitted set also contains table SQL, because table names\n * are the objects left to PostgreSQL's `current_schema`.\n *\n * Declared bounds:\n * - DOWN generation still guards on emitted changes' metadata, not only on the\n * exact SQL text that DOWN re-emits. A rollback that emits unqualified\n * DROP/ALTER TABLE for schema-scoped metadata has the same wrong-schema\n * hazard as UP.\n * - Type/enum-only changes (`create_enum`, `alter_enum_add_value`, and\n * `drop_enum` without dependent-column casts) do not require `schemaName`.\n * `drop_enum` can emit ALTER TABLE casts when `referencingColumns` is present;\n * that is table SQL and remains guarded.\n * - Legacy qualified `originalDbType` strings, such as `'\"tenant_1\".status'`,\n * deliberately do not trigger this guard. The structural schema fields have\n * not shipped yet, and treating legacy strings as model-scope proof would\n * make previously working released models start throwing.\n * - Changes with no target type provenance remain undetectable: `drop_table`,\n * `drop_column`, nullable/default/PK/FK/index/comment/RLS changes, and other\n * table-only metadata cannot prove schema scope. `SchemaChange` and `TableIR`\n * do not record which schema a TABLE belongs to (`TableIR` has no `schema`\n * field), so detecting that requires IR-level table schema provenance and\n * managed-vs-external ownership, tracked separately in #303.\n *\n * @module ddl/schema-scope\n */\n\nimport type { ColumnIR, EnumIR, ModelIR, TableIR } from '@dbsp/types';\nimport type { SchemaChange } from './schema-diff.js';\n\ntype ColumnScopeFields = {\n\treadonly originalDbTypeSchema?: unknown;\n\treadonly originalDbTypeSchemaScope?: unknown;\n};\n\ntype EnumScopeFields = {\n\treadonly schema?: unknown;\n};\n\ntype ModelScopeCollectionOptions = {\n\treadonly includeEnums?: boolean;\n};\n\n/** Names the entry point and the emitted artifact, so the error points at the right call. */\nexport type SchemaScopeSubject = {\n\treadonly entryPoint: string;\n\treadonly noun: string;\n\treadonly artifact: string;\n};\n\nexport type SchemaScopeAccumulator = {\n\treadonly schemas: Set<string>;\n\thasTableSql: boolean;\n};\n\nexport const MODEL_SCHEMA_SCOPE_SUBJECT: SchemaScopeSubject = {\n\tentryPoint: 'generateDDL',\n\tnoun: 'model',\n\tartifact: 'DDL',\n};\n\nexport const MIGRATION_SCHEMA_SCOPE_SUBJECT: SchemaScopeSubject = {\n\tentryPoint: 'Migration SQL generation',\n\tnoun: 'diff',\n\tartifact: 'migration',\n};\n\n/** Default-visible namespaces — objects there need no qualification. */\nfunction isScopedSchema(schema: unknown): schema is string {\n\treturn (\n\t\ttypeof schema === 'string' &&\n\t\tschema !== '' &&\n\t\tschema !== 'public' &&\n\t\tschema !== 'pg_catalog'\n\t);\n}\n\n/**\n * A column proves the model is schema-scoped ONLY when its type is TARGET-scoped\n * (it moves with the model) AND lives in a non-default schema. `absolute` types\n * are external dependencies — they say nothing about where the model's own\n * objects belong.\n */\nfunction columnScopeSchema(\n\tcolumn: ColumnIR | ColumnScopeFields,\n): string | undefined {\n\treturn column.originalDbTypeSchemaScope === 'target' &&\n\t\tisScopedSchema(column.originalDbTypeSchema)\n\t\t? column.originalDbTypeSchema\n\t\t: undefined;\n}\n\n/** Enums in ModelIR.enums / change.meta.enum are MANAGED objects — their schema is the model's. */\nfunction enumScopeSchema(\n\tenumDef: EnumIR | EnumScopeFields,\n): string | undefined {\n\treturn isScopedSchema(enumDef.schema) ? enumDef.schema : undefined;\n}\n\nexport function collectModelScopeEvidence(\n\tmodel: ModelIR,\n\toptions: ModelScopeCollectionOptions = {},\n): SchemaScopeAccumulator {\n\tconst accumulator = createSchemaScopeAccumulator();\n\taccumulator.hasTableSql = model.tables.size > 0;\n\tfor (const table of model.tables.values()) {\n\t\tcollectTableScopeSchemas(table, accumulator.schemas);\n\t}\n\tif (options.includeEnums !== false && model.enums) {\n\t\tfor (const enumDef of model.enums.values()) {\n\t\t\taddScopeSchema(accumulator.schemas, enumScopeSchema(enumDef));\n\t\t}\n\t}\n\treturn accumulator;\n}\n\nexport function createSchemaScopeAccumulator(): SchemaScopeAccumulator {\n\treturn {\n\t\tschemas: new Set<string>(),\n\t\thasTableSql: false,\n\t};\n}\n\nexport function collectChangeScopeEvidence(\n\tchange: SchemaChange,\n\taccumulator: SchemaScopeAccumulator,\n): void {\n\tif (changeEmitsTableSql(change)) {\n\t\taccumulator.hasTableSql = true;\n\t}\n\n\tconst meta = change.meta;\n\tif (!isRecord(meta)) return;\n\n\tcollectColumnScopeSchema(meta.column, accumulator.schemas);\n\tcollectColumnScopeSchema(meta.fromColumn, accumulator.schemas);\n\tcollectUnknownTableScopeSchemas(meta.table, accumulator.schemas);\n\tcollectEnumScopeSchema(meta.enum, accumulator.schemas);\n}\n\nfunction collectTableScopeSchemas(table: TableIR, schemas: Set<string>): void {\n\tfor (const column of table.columns) {\n\t\taddScopeSchema(schemas, columnScopeSchema(column));\n\t}\n}\n\nfunction collectUnknownTableScopeSchemas(\n\tvalue: unknown,\n\tschemas: Set<string>,\n): void {\n\tif (!isRecord(value) || !Array.isArray(value.columns)) return;\n\n\tfor (const column of value.columns) {\n\t\tcollectColumnScopeSchema(column, schemas);\n\t}\n}\n\nfunction collectColumnScopeSchema(value: unknown, schemas: Set<string>): void {\n\tif (!isRecord(value)) return;\n\n\taddScopeSchema(schemas, columnScopeSchema(value));\n}\n\nfunction collectEnumScopeSchema(value: unknown, schemas: Set<string>): void {\n\tif (!isRecord(value)) return;\n\n\taddScopeSchema(schemas, enumScopeSchema(value));\n}\n\nfunction addScopeSchema(\n\tschemas: Set<string>,\n\tschema: string | undefined,\n): void {\n\tif (schema !== undefined) {\n\t\tschemas.add(schema);\n\t}\n}\n\nexport function assertSchemaName(\n\taccumulator: SchemaScopeAccumulator,\n\tschemaName: string | undefined,\n\tsubject: SchemaScopeSubject,\n): void {\n\tif (\n\t\t!accumulator.hasTableSql ||\n\t\thasExplicitSchemaName(schemaName) ||\n\t\taccumulator.schemas.size === 0\n\t) {\n\t\treturn;\n\t}\n\n\tthrow new Error(\n\t\tbuildSchemaNameRequiredMessage([...accumulator.schemas].sort(), subject),\n\t);\n}\n\nfunction hasExplicitSchemaName(schemaName: string | undefined): boolean {\n\treturn schemaName !== undefined && schemaName !== '';\n}\n\nfunction buildSchemaNameRequiredMessage(\n\tschemas: readonly string[],\n\tsubject: SchemaScopeSubject,\n): string {\n\tconst list = schemas.map((schema) => JSON.stringify(schema)).join(', ');\n\treturn (\n\t\t`${subject.entryPoint} requires an explicit schemaName: this ${subject.noun} is schema-scoped — ` +\n\t\t`its custom types/enums live in ${list}. ` +\n\t\t`Pass options.schemaName with the schema this ${subject.artifact} targets ` +\n\t\t'(the source schema to re-emit it as-is, or another schema to retarget it).'\n\t);\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n\treturn typeof value === 'object' && value !== null;\n}\n\nfunction changeEmitsTableSql(change: SchemaChange): boolean {\n\treturn change.table !== '' || hasReferencingColumns(change.meta);\n}\n\nfunction hasReferencingColumns(meta: unknown): boolean {\n\tif (!isRecord(meta)) return false;\n\n\tconst refs = meta.referencingColumns;\n\treturn Array.isArray(refs) && refs.length > 0;\n}\n","/**\n * Type Mapping - Maps ModelIR ColumnType to PostgreSQL data types\n *\n * Supports both manual schemas and introspected schemas (preserving originalDbType).\n * Handles auto-increment via SERIAL/BIGSERIAL types.\n *\n * @module ddl/type-mapping\n */\n\nimport type { ColumnIR } from '@dbsp/types';\nimport { isPgBuiltInTypeName, renderColumnDbType } from '../db-type.js';\nimport { validateDbTypeName } from '../validate.js';\nimport { decideColumnEmission } from './column-emission-decision.js';\n\n/**\n * Map ColumnType to PostgreSQL data type string.\n *\n * Uses originalDbType if available (from introspection), otherwise\n * falls back to reasonable PostgreSQL defaults.\n *\n * @param col - Column definition from ModelIR\n * @returns PostgreSQL type string (e.g., 'VARCHAR(255)', 'SERIAL', 'JSONB')\n */\nexport function mapColumnType(col: ColumnIR, targetSchema?: string): string {\n\tconst decision = decideColumnEmission(col, targetSchema);\n\tif (decision.type === 'serial') return 'SERIAL';\n\tif (decision.type === 'bigserial') return 'BIGSERIAL';\n\n\tconst dbType = validateDbTypeName(renderColumnDbType(col, targetSchema));\n\treturn isPgBuiltInTypeName(dbType)\n\t\t? uppercaseOutsideQuotedIdentifiers(dbType)\n\t\t: dbType;\n}\n\nfunction uppercaseOutsideQuotedIdentifiers(type: string): string {\n\tlet result = '';\n\tlet inQuotedIdentifier = false;\n\n\tfor (let i = 0; i < type.length; i++) {\n\t\tconst char = type[i]!;\n\n\t\tif (char === '\"') {\n\t\t\tresult += char;\n\n\t\t\tif (inQuotedIdentifier && type[i + 1] === '\"') {\n\t\t\t\tresult += type[i + 1];\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tinQuotedIdentifier = !inQuotedIdentifier;\n\t\t\tcontinue;\n\t\t}\n\n\t\tresult += inQuotedIdentifier ? char : char.toUpperCase();\n\t}\n\n\treturn result;\n}\n\n/**\n * Map OnDeleteAction to PostgreSQL syntax.\n */\nexport function mapOnDeleteAction(action?: string): string {\n\tswitch (action) {\n\t\tcase 'CASCADE':\n\t\t\treturn 'CASCADE';\n\t\tcase 'SET NULL':\n\t\t\treturn 'SET NULL';\n\t\tcase 'SET DEFAULT':\n\t\t\treturn 'SET DEFAULT';\n\t\tcase 'RESTRICT':\n\t\t\treturn 'RESTRICT';\n\t\tdefault:\n\t\t\treturn 'NO ACTION';\n\t}\n}\n","import type { ColumnIR } from '@dbsp/types';\nimport { pgBuiltInTypeFamily, renderColumnDbType } from '../db-type.js';\n\nexport type ColumnEmissionDecision =\n\t| {\n\t\t\treadonly type: 'plain';\n\t\t\treadonly defaultKind?: 'authored';\n\t }\n\t| {\n\t\t\treadonly type: 'serial' | 'bigserial';\n\t\t\treadonly defaultKind: 'generated-sequence';\n\t };\n\n/** An auto-increment marker cannot create a sequence for this physical type. */\nexport class AutoIncrementColumnTypeError extends Error {\n\tconstructor(type: string) {\n\t\tsuper(\n\t\t\t`generator planning refuses autoIncrement: ${type} is not an integer or bigint column type`,\n\t\t);\n\t\tthis.name = 'AutoIncrementColumnTypeError';\n\t}\n}\n\n/** SERIAL/BIGSERIAL would silently strengthen an explicitly nullable column. */\nexport class AutoIncrementNullableColumnError extends Error {\n\tconstructor(type: string) {\n\t\tsuper(\n\t\t\t`generator planning refuses autoIncrement: ${type} emits SERIAL/BIGSERIAL, which PostgreSQL makes NOT NULL while the column is nullable`,\n\t\t);\n\t\tthis.name = 'AutoIncrementNullableColumnError';\n\t}\n}\n\n/**\n * The single source of truth for a column's emitted type/default relationship.\n * An authored default deliberately wins over autoIncrement: SERIAL/BIGSERIAL\n * creates its own default and cannot also preserve an authored one.\n */\nexport function decideColumnEmission(\n\tcolumn: ColumnIR,\n\ttargetSchema?: string,\n): ColumnEmissionDecision {\n\tif (column.default !== undefined)\n\t\treturn { type: 'plain', defaultKind: 'authored' };\n\tif (!column.autoIncrement) return { type: 'plain' };\n\n\tconst databaseType = renderColumnDbType(column, targetSchema);\n\tconst family = pgBuiltInTypeFamily(databaseType);\n\tif (family !== undefined && column.nullable)\n\t\tthrow new AutoIncrementNullableColumnError(databaseType);\n\tif (family === 'integer')\n\t\treturn { type: 'serial', defaultKind: 'generated-sequence' };\n\tif (family === 'bigint')\n\t\treturn { type: 'bigserial', defaultKind: 'generated-sequence' };\n\tthrow new AutoIncrementColumnTypeError(databaseType);\n}\n","/**\n * DDL Phase: Sequences\n *\n * Generates CREATE SEQUENCE statements.\n * Must run before CREATE TABLE (tables may reference sequences).\n *\n * @module ddl/phases/sequences\n */\n\nimport { buildSequenceClause } from '../migration-sql.js';\nimport { type PhaseContext, sup } from './types.js';\nimport { quoteIdent as quoteId } from './utils.js';\n\n/**\n * Generate CREATE SEQUENCE statements for all sequences in the schema.\n *\n * @param ctx - Phase context with schema, schemaName, naming, and capabilities\n * @returns Array of DDL statements, or empty if sequences are unsupported / absent\n */\nexport function generateSequencesPhase(ctx: PhaseContext): string[] {\n\tconst { schema, schemaName, caps } = ctx;\n\tif (!schema.sequences || !sup(caps, caps?.supportsDDLSequences)) {\n\t\treturn [];\n\t}\n\tconst statements: string[] = [];\n\tfor (const [, seq] of schema.sequences) {\n\t\tconst seqName = schemaName\n\t\t\t? `${quoteId(schemaName, 'schema')}.${quoteId(seq.name, 'table')}`\n\t\t\t: quoteId(seq.name, 'table');\n\t\tstatements.push(buildSequenceClause('CREATE SEQUENCE', seqName, seq));\n\t}\n\treturn statements;\n}\n","/**\n * DDL Phase: Tables\n *\n * Generates CREATE TABLE statements (without FK constraints).\n * FKs are handled separately in the constraints phase to allow circular references.\n *\n * @module ddl/phases/tables\n */\n\nimport { generateCreateTable } from '../ddl-generator.js';\nimport type { PhaseContext } from './types.js';\n\n/**\n * Generate CREATE TABLE statements for all tables in the schema.\n * Column definitions are included inline; foreign key constraints are excluded\n * (added later by the constraints phase).\n *\n * @param ctx - Phase context\n * @returns Array of DDL statements, one per table\n */\nexport function generateTablesPhase(ctx: PhaseContext): string[] {\n\tconst { tables, schemaName, naming } = ctx;\n\treturn tables.map((table) => generateCreateTable(table, schemaName, naming));\n}\n","import type { ChangeKind } from './schema-diff.js';\n\n/** EFF-04's closed generated-mutation result domain. */\nexport type GeneratedMutationClassification =\n\t| 'non-destructive'\n\t| 'removal'\n\t| 'data-destructive'\n\t/** A table rename is executed only by the paired re-address protocol. */\n\t| 'paired-readdress';\n\nconst NON_DESTRUCTIVE_KINDS: ReadonlySet<ChangeKind> = new Set([\n\t'create_table',\n\t'add_column',\n\t'alter_column_nullable',\n\t'alter_column_default',\n\t'alter_column_unique',\n\t'add_primary_key',\n\t'add_foreign_key',\n\t'validate_constraint',\n\t'create_index',\n\t'add_check_constraint',\n\t'create_enum',\n\t'alter_enum_add_value',\n\t'alter_column_collation',\n\t'alter_column_identity',\n\t'create_extension',\n\t'create_sequence',\n\t'alter_sequence',\n]);\n\nconst REMOVAL_KINDS: ReadonlySet<ChangeKind> = new Set([\n\t'drop_table',\n\t'drop_column',\n\t'drop_primary_key',\n\t'drop_foreign_key',\n\t'alter_foreign_key',\n\t'drop_index',\n\t'drop_check_constraint',\n\t'drop_enum',\n\t'drop_extension',\n\t'drop_sequence',\n]);\n\n/**\n * Total, fail-closed classifier for generator mutations. `string` is deliberate:\n * a newly-added ChangeKind cannot silently become safe before this table names it.\n */\nexport function classifyGeneratedMutation(\n\tkind: ChangeKind | string,\n\tchange?: { readonly destructive?: boolean },\n): GeneratedMutationClassification {\n\t// A re-address has two ledger chains, two identities and a paired terminal.\n\t// It is neither a generic safe mutation nor a destructive fallback.\n\tif (kind === 'readdress_table') return 'paired-readdress';\n\tif (\n\t\tkind === 'enable_rls' ||\n\t\tkind === 'disable_rls' ||\n\t\tkind === 'create_policy' ||\n\t\tkind === 'drop_policy' ||\n\t\tkind === 'add_comment' ||\n\t\tkind === 'drop_comment'\n\t)\n\t\tthrow new Error(\n\t\t\t`generator planning refuses ${kind}: non-declarable changes have no execution classification`,\n\t\t);\n\t// The ChangeKind names both directions of a unique alteration. Its\n\t// producer carries the direction, so removing the backing constraint is a\n\t// removal rather than the formerly unsafe non-destructive default.\n\tif (kind === 'alter_column_unique' && change?.destructive === true)\n\t\treturn 'removal';\n\tif (REMOVAL_KINDS.has(kind as ChangeKind)) return 'removal';\n\tif (NON_DESTRUCTIVE_KINDS.has(kind as ChangeKind)) return 'non-destructive';\n\t// alter_column_type is deliberately here: it must be proven non-lossy by a\n\t// later authority reader; otherwise a type rewrite destroys stored values.\n\treturn 'data-destructive';\n}\n\nexport function isGeneratedMutationDestructive(\n\tkind: ChangeKind | string,\n\tchange?: { readonly destructive?: boolean },\n): boolean {\n\tconst classification = classifyGeneratedMutation(kind, change);\n\treturn (\n\t\tclassification !== 'non-destructive' &&\n\t\tclassification !== 'paired-readdress'\n\t);\n}\n\n/** All removal statements remain generator-only; no transition operation maps one. */\nexport function refusesRecordedPlanRemoval(\n\tkind: ChangeKind | string,\n\tchange?: { readonly destructive?: boolean },\n): boolean {\n\treturn classifyGeneratedMutation(kind, change) === 'removal';\n}\n","import type { ResourceAddress } from '@dbsp/types';\n\nexport interface PgCatalogueIdentityQueryable {\n\tquery(\n\t\tsql: string,\n\t\tparams?: readonly unknown[],\n\t): Promise<{ readonly rows: readonly Record<string, unknown>[] }>;\n}\n\nfunction oid(row: Record<string, unknown>, field: string): string | undefined {\n\tconst value = row[field];\n\treturn typeof value === 'string' || typeof value === 'number'\n\t\t? String(value)\n\t\t: undefined;\n}\n\nfunction schemaOf(address: ResourceAddress): string {\n\tif (!address.schema)\n\t\tthrow new Error(\n\t\t\t`catalogue identity for ${address.kind} ${address.name} requires a schema`,\n\t\t);\n\treturn address.schema;\n}\n\nfunction parentOf(address: ResourceAddress): ResourceAddress {\n\tif (!address.parent)\n\t\tthrow new Error(\n\t\t\t`catalogue identity for ${address.kind} ${address.name} requires a parent address`,\n\t\t);\n\treturn address.parent;\n}\n\n/**\n * Re-read the PostgreSQL catalogue identity for one managed address. The\n * adapter deliberately returns absence as undefined; callers decide whether an\n * absent object is legal for the lifecycle state they are admitting.\n */\nexport async function readPgCatalogueIdentity(\n\texecutor: PgCatalogueIdentityQueryable,\n\taddress: ResourceAddress,\n): Promise<ResourceAddress | undefined> {\n\tlet row: Record<string, unknown> | undefined;\n\tswitch (address.kind) {\n\t\tcase 'table':\n\t\t\trow = (\n\t\t\t\tawait executor.query(\n\t\t\t\t\t`SELECT relation.oid::text AS oid FROM pg_catalog.pg_class relation JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace WHERE namespace.nspname = $1 AND relation.relname = $2 AND relation.relkind IN ('r', 'p', 'f')`,\n\t\t\t\t\t[schemaOf(address), address.name],\n\t\t\t\t)\n\t\t\t).rows[0];\n\t\t\tbreak;\n\t\tcase 'index':\n\t\t\t{\n\t\t\t\tconst parent = parentOf(address);\n\t\t\t\trow = (\n\t\t\t\t\tawait executor.query(\n\t\t\t\t\t\t`SELECT index_relation.oid::text AS oid FROM pg_catalog.pg_class index_relation JOIN pg_catalog.pg_namespace namespace ON namespace.oid = index_relation.relnamespace JOIN pg_catalog.pg_index index_definition ON index_definition.indexrelid = index_relation.oid JOIN pg_catalog.pg_class parent_relation ON parent_relation.oid = index_definition.indrelid WHERE namespace.nspname = $1 AND index_relation.relname = $2 AND index_relation.relkind IN ('i', 'I') AND parent_relation.relname = $3`,\n\t\t\t\t\t\t[schemaOf(address), address.name, parent.name],\n\t\t\t\t\t)\n\t\t\t\t).rows[0];\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'sequence':\n\t\t\trow = (\n\t\t\t\tawait executor.query(\n\t\t\t\t\t`SELECT relation.oid::text AS oid FROM pg_catalog.pg_class relation JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace WHERE namespace.nspname = $1 AND relation.relname = $2 AND relation.relkind = 'S'`,\n\t\t\t\t\t[schemaOf(address), address.name],\n\t\t\t\t)\n\t\t\t).rows[0];\n\t\t\tbreak;\n\t\tcase 'enum':\n\t\t\trow = (\n\t\t\t\tawait executor.query(\n\t\t\t\t\t`SELECT type.oid::text AS oid FROM pg_catalog.pg_type type JOIN pg_catalog.pg_namespace namespace ON namespace.oid = type.typnamespace WHERE namespace.nspname = $1 AND type.typname = $2 AND type.typtype = 'e'`,\n\t\t\t\t\t[schemaOf(address), address.name],\n\t\t\t\t)\n\t\t\t).rows[0];\n\t\t\tbreak;\n\t\tcase 'extension':\n\t\t\trow = (\n\t\t\t\tawait executor.query(\n\t\t\t\t\t`SELECT extension.oid::text AS oid FROM pg_catalog.pg_extension extension WHERE extension.extname = $1`,\n\t\t\t\t\t[address.name],\n\t\t\t\t)\n\t\t\t).rows[0];\n\t\t\tbreak;\n\t\tcase 'constraint':\n\t\t\t{\n\t\t\t\tconst parent = parentOf(address);\n\t\t\t\trow = (\n\t\t\t\t\tawait executor.query(\n\t\t\t\t\t\t`SELECT constraint_row.oid::text AS oid FROM pg_catalog.pg_constraint constraint_row JOIN pg_catalog.pg_class parent_relation ON parent_relation.oid = constraint_row.conrelid JOIN pg_catalog.pg_namespace namespace ON namespace.oid = parent_relation.relnamespace WHERE namespace.nspname = $1 AND constraint_row.conname = $2 AND parent_relation.relname = $3`,\n\t\t\t\t\t\t[schemaOf(address), address.name, parent.name],\n\t\t\t\t\t)\n\t\t\t\t).rows[0];\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'policy':\n\t\t\t{\n\t\t\t\tconst parent = parentOf(address);\n\t\t\t\trow = (\n\t\t\t\t\tawait executor.query(\n\t\t\t\t\t\t`SELECT policy.oid::text AS oid FROM pg_catalog.pg_policy policy JOIN pg_catalog.pg_class parent_relation ON parent_relation.oid = policy.polrelid JOIN pg_catalog.pg_namespace namespace ON namespace.oid = parent_relation.relnamespace WHERE namespace.nspname = $1 AND policy.polname = $2 AND parent_relation.relname = $3`,\n\t\t\t\t\t\t[schemaOf(address), address.name, parent.name],\n\t\t\t\t\t)\n\t\t\t\t).rows[0];\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'column': {\n\t\t\tconst parent = parentOf(address);\n\t\t\trow = (\n\t\t\t\tawait executor.query(\n\t\t\t\t\t`SELECT parent_relation.oid::text AS parent_oid FROM pg_catalog.pg_attribute attribute JOIN pg_catalog.pg_class parent_relation ON parent_relation.oid = attribute.attrelid JOIN pg_catalog.pg_namespace namespace ON namespace.oid = parent_relation.relnamespace WHERE namespace.nspname = $1 AND parent_relation.relname = $2 AND attribute.attname = $3 AND attribute.attnum > 0 AND NOT attribute.attisdropped`,\n\t\t\t\t\t[schemaOf(address), parent.name, address.name],\n\t\t\t\t)\n\t\t\t).rows[0];\n\t\t\tif (!row) return undefined;\n\t\t\tconst parentOid = oid(row, 'parent_oid');\n\t\t\tif (!parentOid)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`PostgreSQL returned an invalid parent OID for column ${address.name}`,\n\t\t\t\t);\n\t\t\treturn {\n\t\t\t\t...address,\n\t\t\t\tparent: {\n\t\t\t\t\t...parent,\n\t\t\t\t\tcatalogueIdentity: {\n\t\t\t\t\t\tengine: 'postgresql',\n\t\t\t\t\t\tformat: 1,\n\t\t\t\t\t\tvalue: { oid: parentOid },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcatalogueIdentity: {\n\t\t\t\t\tengine: 'postgresql',\n\t\t\t\t\tformat: 1,\n\t\t\t\t\tvalue: { parentOid, name: address.name },\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(\n\t\t\t\t`catalogue identity is unsupported for resource kind ${address.kind}`,\n\t\t\t);\n\t}\n\tif (!row) return undefined;\n\tconst value = oid(row, 'oid');\n\tif (!value)\n\t\tthrow new Error(\n\t\t\t`PostgreSQL returned an invalid OID for ${address.kind} ${address.name}`,\n\t\t);\n\treturn {\n\t\t...address,\n\t\tcatalogueIdentity: {\n\t\t\tengine: 'postgresql',\n\t\t\tformat: 1,\n\t\t\tvalue: { oid: value },\n\t\t},\n\t};\n}\n","import { createHash } from 'node:crypto';\nimport type {\n\tDeclarableResourceAddress,\n\tLedgerClaimKind,\n\tNormalizedManagedStep,\n} from '@dbsp/types';\nimport { canonicalResourceParent } from '@dbsp/types';\nimport { splitCheckConstraintState } from '../check-expression.js';\nimport { renderColumnDbType } from '../db-type.js';\nimport { decideColumnEmission } from './column-emission-decision.js';\nimport {\n\tclassifyGeneratedMutation,\n\ttype GeneratedMutationClassification,\n} from './destructive-classification.js';\nimport {\n\tparseGeneratedPostconditionV3Declaration,\n\tsnapshotGeneratedPostconditionJson,\n} from './generated-postcondition-v3-validator.js';\nimport {\n\tnormalizeOptionalBoolean,\n\tnormalizeSequenceInteger,\n} from './generated-source-normalizers.js';\nimport { formatSqlDefault } from './phases/utils.js';\nimport type { ChangeKind, SchemaChange } from './schema-diff.js';\n\ntype Address = DeclarableResourceAddress & {\n\treadonly scope: 'schema' | 'database';\n};\n\ntype Meta = Readonly<Record<string, unknown>>;\n\nexport type GeneratedColumnPostcondition = {\n\treadonly name: string;\n\treadonly type?: string;\n\treadonly nullable?: boolean;\n\treadonly hasDefault?: boolean;\n\t/** Whether a required default was authored or generated by SERIAL/BIGSERIAL. */\n\treadonly defaultKind?: 'authored' | 'generated-sequence';\n\treadonly default?: string;\n\treadonly collation?: string | null;\n\treadonly identity?: 'always' | 'byDefault' | null;\n};\n\nexport type GeneratedConstraintPostcondition =\n\t| {\n\t\t\treadonly type: 'p' | 'u';\n\t\t\treadonly columns: readonly string[];\n\t\t\treadonly deferrable: boolean;\n\t\t\treadonly initiallyDeferred: boolean;\n\t\t\treadonly enforced: boolean;\n\t }\n\t| {\n\t\t\treadonly type: 'f';\n\t\t\treadonly columns: readonly string[];\n\t\t\treadonly references: {\n\t\t\t\treadonly schema: string;\n\t\t\t\treadonly table: string;\n\t\t\t\treadonly columns: readonly string[];\n\t\t\t};\n\t\t\treadonly onDelete: GeneratedForeignKeyAction;\n\t\t\treadonly onUpdate: GeneratedForeignKeyAction;\n\t\t\treadonly deferrable: boolean;\n\t\t\treadonly initiallyDeferred: boolean;\n\t\t\treadonly enforced: boolean;\n\t\t\treadonly notValid: boolean;\n\t }\n\t| {\n\t\t\treadonly type: 'c';\n\t\t\t/** The ModelIR CHECK expression, never a rendered constraint definition. */\n\t\t\treadonly expression: string;\n\t\t\treadonly notValid: boolean;\n\t };\n\n/** The semantic FK actions PostgreSQL can represent in pg_constraint. */\nexport type GeneratedForeignKeyAction =\n\t| 'NO ACTION'\n\t| 'RESTRICT'\n\t| 'CASCADE'\n\t| 'SET NULL'\n\t| 'SET DEFAULT';\n\nexport type GeneratedIndexPostcondition = {\n\t/** The identity is persisted separately from the rendered CREATE INDEX SQL. */\n\treadonly schema: string;\n\treadonly table: string;\n\treadonly name: string;\n\t/** PostgreSQL exposes an omitted method as btree; make that expectation explicit. */\n\treadonly method: string;\n\treadonly unique: boolean;\n\treadonly valid: true;\n\treadonly ready: true;\n\treadonly live: true;\n\treadonly columns: readonly string[];\n\treadonly expressions?: readonly string[];\n\treadonly include?: readonly string[];\n\treadonly nullsNotDistinct: boolean;\n\treadonly opclass?: Readonly<Record<string, string>>;\n\treadonly with?: Readonly<Record<string, string>>;\n\treadonly where?: string;\n};\n\n/** A canonical SQL fact, never an unversioned deparse string. */\nexport type CanonicalSqlFact = {\n\treadonly canonicalFormVersion: 1;\n\treadonly sql: string;\n};\n\n/**\n * The default, identity, and expression facts are one discriminated state.\n * In particular, an identity cannot also claim an authored/default sequence\n * expression, and a missing default cannot carry an expression.\n */\nexport type GeneratedColumnDefaultState =\n\t| {\n\t\t\treadonly defaultKind: 'none';\n\t\t\treadonly hasDefault: false;\n\t\t\treadonly identity: null;\n\t\t\treadonly defaultExpression?: never;\n\t }\n\t| {\n\t\t\treadonly defaultKind: 'authored';\n\t\t\treadonly hasDefault: true;\n\t\t\treadonly identity: null;\n\t\t\treadonly defaultExpression: CanonicalSqlFact;\n\t }\n\t| {\n\t\t\treadonly defaultKind: 'generated-sequence';\n\t\t\treadonly hasDefault: true;\n\t\t\treadonly identity: null;\n\t\t\treadonly defaultExpression?: never;\n\t }\n\t| {\n\t\t\treadonly defaultKind: 'identity';\n\t\t\treadonly hasDefault: false;\n\t\t\treadonly identity: 'always' | 'byDefault';\n\t\t\treadonly defaultExpression?: never;\n\t };\n\ntype GeneratedColumnDeclaration = {\n\treadonly type?: string;\n\treadonly nullable?: boolean;\n\t/** null means no COLLATE clause was authored; it is not an effective default. */\n\treadonly authoredCollation?: string | null;\n\treadonly default?: GeneratedColumnDefaultState;\n};\n\ntype GeneratedTableColumnDeclaration = GeneratedColumnDeclaration & {\n\t/** A table-shape member name, not the table target binding. */\n\treadonly name: string;\n};\n\ntype GeneratedIndexDeclaration = Omit<\n\tGeneratedIndexPostcondition,\n\t'schema' | 'table' | 'name' | 'expressions' | 'where'\n> & {\n\treadonly expressions?: readonly CanonicalSqlFact[];\n\treadonly where?: CanonicalSqlFact;\n};\n\ntype GeneratedConstraintDeclaration =\n\t| Extract<GeneratedConstraintPostcondition, { readonly type: 'p' | 'u' }>\n\t| Extract<GeneratedConstraintPostcondition, { readonly type: 'f' }>;\n\n/** Table names live only in TargetBinding; columns describe table structure. */\ntype V3TableDeclaration = {\n\treadonly kind: 'table';\n\treadonly columns: readonly GeneratedTableColumnDeclaration[];\n};\n/** Column names live only in TargetBinding; this is the column's shape. */\ntype V3ColumnDeclaration = {\n\treadonly kind: 'column';\n\treadonly column: GeneratedColumnDeclaration;\n};\n/** Constraint names live only in TargetBinding; this is a non-CHECK constraint fact. */\ntype V3ConstraintDeclaration = {\n\treadonly kind: 'constraint';\n\treadonly constraint: GeneratedConstraintDeclaration;\n};\n/** CHECK names live only in TargetBinding; expression is canonical and versioned. */\ntype V3CheckDeclaration = {\n\treadonly kind: 'check';\n\treadonly check: {\n\t\treadonly expression: CanonicalSqlFact;\n\t\treadonly notValid: boolean;\n\t};\n};\n/** Index schema, table, and name live only in TargetBinding; options are structured facts. */\ntype V3IndexDeclaration = {\n\treadonly kind: 'index';\n\treadonly index: GeneratedIndexDeclaration;\n};\n/** Enum names live only in TargetBinding; labels are the declaration. */\ntype V3EnumDeclaration = {\n\treadonly kind: 'enum';\n\treadonly labels: readonly string[];\n};\n/** Sequence names live only in TargetBinding; options are the declaration. */\ntype V3SequenceDeclaration = {\n\treadonly kind: 'sequence';\n\treadonly startValue?: string;\n\treadonly incrementBy?: string;\n\treadonly minValue?: string;\n\treadonly maxValue?: string;\n\treadonly cycle?: boolean;\n};\n/** Extension names live only in TargetBinding; requested version is the declaration. */\ntype V3ExtensionDeclaration = {\n\treadonly kind: 'extension';\n\treadonly version?: string;\n};\n\n/** Address-free v3 declaration variants. */\nexport type GeneratedPostconditionDeclarationV3 = {\n\treadonly canonicalFormVersion: 1;\n} & (\n\t| V3TableDeclaration\n\t| V3ColumnDeclaration\n\t| V3ConstraintDeclaration\n\t| V3CheckDeclaration\n\t| V3IndexDeclaration\n\t| V3EnumDeclaration\n\t| V3SequenceDeclaration\n\t| V3ExtensionDeclaration\n\t| { readonly kind: 'absent' }\n);\n\n/**\n * The separate binding selects the surrounding managed step's canonical\n * address. It is versioned independently so later verifiers can resolve it\n * without teaching any declaration variant about physical addresses.\n */\nexport type TargetBinding = {\n\treadonly bindingVersion: 1;\n\treadonly bindingKind: 'managed-step-address';\n};\n\n/** Version 3 carries an address-free declaration and a separately decoded binding. */\nexport type GeneratedPostconditionV3 = {\n\treadonly postconditionVersion: 3;\n\t/** v3 kind lives only in the address-free declaration, never beside the binding. */\n\treadonly kind?: never;\n\treadonly declaration: GeneratedPostconditionDeclarationV3;\n\treadonly targetBinding: TargetBinding;\n};\n\n/** Only v3 is a decodable generated postcondition. Older values replan. */\nexport type GeneratedPostcondition = GeneratedPostconditionV3;\n\n/**\n * JSON-compatible serialization whose object-member order survives PostgreSQL\n * jsonb normalization. Arrays intentionally retain their supplied order.\n */\nfunction canonicalGeneratedPostconditionJson(\n\tvalue: unknown,\n\tpath = '$',\n): string {\n\tif (value === null) return 'null';\n\tif (value === undefined)\n\t\tthrow new TypeError(\n\t\t\t`generated postcondition digest cannot serialize undefined values at ${path}`,\n\t\t);\n\tif (Array.isArray(value)) {\n\t\tconst entries: string[] = [];\n\t\tfor (let index = 0; index < value.length; index += 1) {\n\t\t\tif (!Object.hasOwn(value, index))\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`generated postcondition digest cannot serialize undefined array members at ${path}[${index}]`,\n\t\t\t\t);\n\t\t\tentries.push(\n\t\t\t\tcanonicalGeneratedPostconditionJson(value[index], `${path}[${index}]`),\n\t\t\t);\n\t\t}\n\t\treturn `[${entries.join(',')}]`;\n\t}\n\tif (typeof value === 'object') {\n\t\tconst record = value as Record<string, unknown>;\n\t\treturn `{${Object.keys(record)\n\t\t\t.sort((left, right) => (left < right ? -1 : left > right ? 1 : 0))\n\t\t\t.map((key) => {\n\t\t\t\tconst member = record[key];\n\t\t\t\tif (member === undefined)\n\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t`generated postcondition digest cannot serialize undefined object members at ${path}.${key}`,\n\t\t\t\t\t);\n\t\t\t\treturn `${JSON.stringify(key)}:${canonicalGeneratedPostconditionJson(member, `${path}.${key}`)}`;\n\t\t\t})\n\t\t\t.join(',')}}`;\n\t}\n\tif (typeof value === 'number' && !Number.isFinite(value))\n\t\tthrow new TypeError(\n\t\t\t`generated postcondition digest can only serialize finite numbers at ${path}`,\n\t\t);\n\tif (\n\t\ttypeof value !== 'string' &&\n\t\ttypeof value !== 'boolean' &&\n\t\ttypeof value !== 'number'\n\t)\n\t\tthrow new TypeError(\n\t\t\t`generated postcondition digest can only serialize JSON values at ${path}`,\n\t\t);\n\treturn JSON.stringify(value);\n}\n\n/** The version tag is part of the digest domain, never an implicit convention. */\nexport function generatedPostconditionDigest(value: {\n\treadonly postconditionVersion: number;\n}): string {\n\tconst snapshot = snapshotGeneratedPostconditionJson(value) as {\n\t\treadonly postconditionVersion: number;\n\t};\n\treturn createHash('sha256')\n\t\t.update(`generated-postcondition:v${snapshot.postconditionVersion}\\u0000`)\n\t\t.update(canonicalGeneratedPostconditionJson(snapshot))\n\t\t.digest('hex');\n}\n\nfunction postconditionPayload(\n\tvalue: GeneratedPostcondition,\n): import('@dbsp/types').LedgerPayload {\n\tconst snapshot = snapshotGeneratedPostconditionJson(\n\t\tvalue,\n\t) as GeneratedPostcondition;\n\treturn {\n\t\tvalue: snapshot as unknown as import('@dbsp/types').JsonValue,\n\t\tdigest: generatedPostconditionDigest(snapshot),\n\t};\n}\n\nfunction canonicalSqlFact(sql: string): CanonicalSqlFact {\n\treturn { canonicalFormVersion: 1, sql };\n}\n\nfunction targetBinding(): TargetBinding {\n\treturn { bindingVersion: 1, bindingKind: 'managed-step-address' };\n}\n\nfunction requiredColumn(\n\tvalue: unknown,\n\tlabel: string,\n): import('@dbsp/types').ColumnIR {\n\tif (!value || typeof value !== 'object' || Array.isArray(value))\n\t\tthrow new Error(\n\t\t\t`generator planning refuses ${label}: missing typed column`,\n\t\t);\n\tconst column = value as import('@dbsp/types').ColumnIR;\n\tif (typeof column.name !== 'string' || typeof column.nullable !== 'boolean')\n\t\tthrow new Error(\n\t\t\t`generator planning refuses ${label}: missing typed column`,\n\t\t);\n\treturn column;\n}\n\nfunction columnDefaultState(\n\tcolumn: import('@dbsp/types').ColumnIR,\n\tschema: string,\n): GeneratedColumnDefaultState {\n\tconst { defaultKind } = decideColumnEmission(column, schema);\n\tconst identity = column.identity ?? null;\n\tif (identity !== null) {\n\t\tif (defaultKind !== undefined)\n\t\t\tthrow new Error(\n\t\t\t\t`generator planning refuses ${column.name}: identity and default are contradictory`,\n\t\t\t);\n\t\treturn { defaultKind: 'identity', hasDefault: false, identity };\n\t}\n\tif (defaultKind === undefined)\n\t\treturn { defaultKind: 'none', hasDefault: false, identity: null };\n\tif (defaultKind === 'generated-sequence')\n\t\treturn {\n\t\t\tdefaultKind: 'generated-sequence',\n\t\t\thasDefault: true,\n\t\t\tidentity: null,\n\t\t};\n\treturn {\n\t\tdefaultKind: 'authored',\n\t\thasDefault: true,\n\t\tidentity: null,\n\t\tdefaultExpression: canonicalSqlFact(\n\t\t\tformatSqlDefault(column.default, 'generator postcondition'),\n\t\t),\n\t};\n}\n\nfunction columnDeclaration(\n\tcolumn: import('@dbsp/types').ColumnIR,\n\tschema: string,\n\tprimaryKey = false,\n): GeneratedColumnDeclaration {\n\treturn {\n\t\ttype: renderColumnDbType(column, schema),\n\t\tnullable: primaryKey ? false : column.nullable,\n\t\tauthoredCollation: column.collation ?? null,\n\t\tdefault: columnDefaultState(column, schema),\n\t};\n}\n\nfunction v3Payload(\n\tdeclaration: GeneratedPostconditionDeclarationV3,\n): import('@dbsp/types').LedgerPayload {\n\tconst snapshot = parseGeneratedPostconditionV3Declaration(declaration);\n\treturn postconditionPayload({\n\t\tpostconditionVersion: 3,\n\t\tdeclaration: snapshot,\n\t\ttargetBinding: targetBinding(),\n\t});\n}\n\nfunction requiredRecord(\n\tvalue: unknown,\n\tlabel: string,\n): Readonly<Record<string, unknown>> {\n\tif (!value || typeof value !== 'object' || Array.isArray(value))\n\t\tthrow new Error(\n\t\t\t`generator planning refuses ${label}: missing typed declaration`,\n\t\t);\n\treturn value as Readonly<Record<string, unknown>>;\n}\n\nfunction requiredList(value: unknown, label: string): readonly string[] {\n\tif (!Array.isArray(value) || value.some((item) => typeof item !== 'string'))\n\t\tthrow new Error(\n\t\t\t`generator planning refuses ${label}: missing typed columns`,\n\t\t);\n\treturn value as readonly string[];\n}\n\nfunction requiredColumnList(value: unknown, label: string): readonly string[] {\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.length === 0 ||\n\t\tvalue.some((item) => typeof item !== 'string' || item.trim().length === 0)\n\t)\n\t\tthrow new Error(\n\t\t\t`generator planning refuses ${label}: missing typed columns`,\n\t\t);\n\treturn value as readonly string[];\n}\n\ntype ValidateConstraintTarget =\n\t| {\n\t\t\treadonly kind: 'check';\n\t\t\treadonly check: Readonly<Record<string, unknown>>;\n\t }\n\t| {\n\t\t\treadonly kind: 'foreign-key';\n\t\t\treadonly fk: Readonly<Record<string, unknown>>;\n\t\t\treadonly references: Readonly<Record<string, unknown>>;\n\t };\n\n/**\n * `validate_constraint` has exactly one branch discriminator. A defined\n * `check` is always a check declaration (and must therefore be a record);\n * only an absent `check` selects the foreign-key declaration and its keys.\n */\nfunction validateConstraintTarget(\n\tchange: SchemaChange,\n): ValidateConstraintTarget {\n\tconst meta = change.meta;\n\tif (meta?.check !== undefined)\n\t\treturn {\n\t\t\tkind: 'check',\n\t\t\tcheck: requiredRecord(meta.check, change.kind),\n\t\t};\n\tconst fk = requiredRecord(meta?.fk, change.kind);\n\tconst references = requiredRecord(fk.references, change.kind);\n\trequiredColumnList(fk.columns, `${change.kind} columns`);\n\trequiredColumnList(references.columns, `${change.kind} references.columns`);\n\treturn { kind: 'foreign-key', fk, references };\n}\n\n/**\n * Reject malformed key-column lists before any change-specific consumer can\n * derive an address, name, or postcondition from them.\n */\nfunction validateChangeKeyLists(change: SchemaChange): void {\n\tconst meta = change.meta;\n\tconst foreignKey = () => {\n\t\tconst fk = requiredRecord(meta?.fk, change.kind);\n\t\tconst references = requiredRecord(fk.references, change.kind);\n\t\trequiredColumnList(fk.columns, `${change.kind} columns`);\n\t\trequiredColumnList(references.columns, `${change.kind} references.columns`);\n\t};\n\tswitch (change.kind) {\n\t\tcase 'create_table':\n\t\tcase 'readdress_table': {\n\t\t\tconst table = meta?.table;\n\t\t\tif (!table || typeof table !== 'object' || Array.isArray(table)) return;\n\t\t\tconst primaryKey = (table as Record<string, unknown>).primaryKey;\n\t\t\tif (primaryKey === undefined) return;\n\t\t\trequiredColumnList(\n\t\t\t\ttypeof primaryKey === 'string' ? [primaryKey] : primaryKey,\n\t\t\t\t`${change.kind} table.primaryKey`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tcase 'add_primary_key':\n\t\tcase 'drop_primary_key':\n\t\t\trequiredColumnList(meta?.columns, `${change.kind} columns`);\n\t\t\treturn;\n\t\tcase 'add_foreign_key':\n\t\tcase 'drop_foreign_key':\n\t\tcase 'alter_foreign_key':\n\t\t\tforeignKey();\n\t\t\treturn;\n\t\tcase 'validate_constraint':\n\t\t\tvalidateConstraintTarget(change);\n\t\t\treturn;\n\t\tdefault:\n\t\t\treturn;\n\t}\n}\n\nfunction constraintPostcondition(\n\tchange: SchemaChange,\n\tschema: string,\n): GeneratedConstraintPostcondition {\n\tconst meta = change.meta;\n\tif (change.kind === 'add_primary_key')\n\t\treturn {\n\t\t\ttype: 'p',\n\t\t\tcolumns: requiredColumnList(meta?.columns, `${change.kind} columns`),\n\t\t\tdeferrable: false,\n\t\t\tinitiallyDeferred: false,\n\t\t\tenforced: true,\n\t\t};\n\tif (change.kind === 'alter_column_unique')\n\t\treturn {\n\t\t\ttype: 'u',\n\t\t\tcolumns: [text(change.column, change.kind)],\n\t\t\tdeferrable: false,\n\t\t\tinitiallyDeferred: false,\n\t\t\tenforced: true,\n\t\t};\n\tconst target =\n\t\tchange.kind === 'validate_constraint'\n\t\t\t? validateConstraintTarget(change)\n\t\t\t: undefined;\n\tconst check = target?.kind === 'check' ? target.check : meta?.check;\n\tif (check !== undefined) {\n\t\tconst value = requiredRecord(check, change.kind);\n\t\tconst expression = text(value.expression, change.kind);\n\t\tif (value.notValid !== undefined && typeof value.notValid !== 'boolean')\n\t\t\tthrow new Error(\n\t\t\t\t`generator planning refuses ${change.kind}: invalid typed CHECK notValid state`,\n\t\t\t);\n\t\tconst state = splitCheckConstraintState({\n\t\t\texpression,\n\t\t\t...(value.notValid === undefined ? {} : { notValid: value.notValid }),\n\t\t});\n\t\treturn {\n\t\t\ttype: 'c',\n\t\t\texpression: state.expression,\n\t\t\tnotValid: state.notValid,\n\t\t};\n\t}\n\tconst fk =\n\t\ttarget?.kind === 'foreign-key'\n\t\t\t? target.fk\n\t\t\t: requiredRecord(meta?.fk, change.kind);\n\tconst references =\n\t\ttarget?.kind === 'foreign-key'\n\t\t\t? target.references\n\t\t\t: requiredRecord(fk.references, change.kind);\n\tconst foreignKeyAction = (value: unknown): GeneratedForeignKeyAction => {\n\t\tconst action = typeof value === 'string' ? value : 'NO ACTION';\n\t\tif (\n\t\t\taction !== 'NO ACTION' &&\n\t\t\taction !== 'RESTRICT' &&\n\t\t\taction !== 'CASCADE' &&\n\t\t\taction !== 'SET NULL' &&\n\t\t\taction !== 'SET DEFAULT'\n\t\t)\n\t\t\tthrow new Error(\n\t\t\t\t`generator planning refuses ${change.kind}: unsupported foreign-key action ${JSON.stringify(action)}`,\n\t\t\t);\n\t\treturn action;\n\t};\n\treturn {\n\t\ttype: 'f',\n\t\tcolumns: requiredColumnList(fk.columns, `${change.kind} columns`),\n\t\treferences: {\n\t\t\tschema:\n\t\t\t\ttypeof references.schema === 'string' ? references.schema : schema,\n\t\t\ttable: text(references.table, change.kind),\n\t\t\tcolumns: requiredColumnList(\n\t\t\t\treferences.columns,\n\t\t\t\t`${change.kind} references.columns`,\n\t\t\t),\n\t\t},\n\t\tonDelete: foreignKeyAction(fk.onDelete),\n\t\tonUpdate: foreignKeyAction(fk.onUpdate),\n\t\tdeferrable: fk.deferred === true,\n\t\tinitiallyDeferred: fk.deferred === true,\n\t\tenforced: true,\n\t\tnotValid: fk.notValid === true,\n\t};\n}\n\n/**\n * Capture the ModelIR/SchemaChange shape that the executor must read back.\n * This is deliberately assembled before SQL rendering becomes the only durable\n * source, and is therefore covered by the normalized managed-step digest.\n * An untyped alter_column_type deliberately returns undefined: destructive\n * execution owns that case through its digest-bound acceptance and read-back.\n */\nfunction generatedPostconditionForChangeUnchecked(input: {\n\treadonly change: SchemaChange;\n\treadonly schema: string;\n}): import('@dbsp/types').LedgerPayload | undefined {\n\tconst { change, schema } = input;\n\tvalidateChangeKeyLists(change);\n\tif (change.kind === 'create_table' || change.kind === 'readdress_table') {\n\t\tconst table = change.meta?.table;\n\t\tif (!table || typeof table !== 'object' || Array.isArray(table))\n\t\t\tthrow new Error(\n\t\t\t\t`generator planning refuses ${change.kind}: missing typed table postcondition`,\n\t\t\t);\n\t\tconst shape = table as import('@dbsp/types').TableIR;\n\t\tconst primaryKey = new Set(\n\t\t\tshape.primaryKey === undefined\n\t\t\t\t? []\n\t\t\t\t: typeof shape.primaryKey === 'string'\n\t\t\t\t\t? [shape.primaryKey]\n\t\t\t\t\t: shape.primaryKey,\n\t\t);\n\t\treturn v3Payload({\n\t\t\tcanonicalFormVersion: 1,\n\t\t\tkind: 'table',\n\t\t\tcolumns: shape.columns.map((column) => ({\n\t\t\t\tname: column.name,\n\t\t\t\t...columnDeclaration(column, schema, primaryKey.has(column.name)),\n\t\t\t})),\n\t\t});\n\t}\n\tconst column =\n\t\tchange.kind === 'add_column'\n\t\t\t? requiredColumn(change.meta?.column, change.kind)\n\t\t\t: change.kind === 'alter_column_type' && change.meta?.column !== undefined\n\t\t\t\t? requiredColumn(change.meta.column, change.kind)\n\t\t\t\t: (change.kind === 'alter_column_collation' ||\n\t\t\t\t\t\t\tchange.kind === 'alter_column_identity') &&\n\t\t\t\t\t\tchange.meta?.column !== undefined\n\t\t\t\t\t? requiredColumn(change.meta.column, change.kind)\n\t\t\t\t\t: undefined;\n\tif (column) {\n\t\treturn v3Payload({\n\t\t\tcanonicalFormVersion: 1,\n\t\t\tkind: 'column',\n\t\t\tcolumn: columnDeclaration(column, schema),\n\t\t});\n\t}\n\tif (change.kind === 'alter_column_nullable') {\n\t\tconst name = text(change.column, change.kind);\n\t\tconst nullable = change.meta?.nullable;\n\t\tif (typeof nullable !== 'boolean')\n\t\t\tthrow new Error(\n\t\t\t\t'generator planning refuses alter_column_nullable: missing typed nullable postcondition',\n\t\t\t);\n\t\tvoid name;\n\t\treturn v3Payload({\n\t\t\tcanonicalFormVersion: 1,\n\t\t\tkind: 'column',\n\t\t\tcolumn: { nullable },\n\t\t});\n\t}\n\tif (change.kind === 'alter_column_default') {\n\t\tconst name = text(change.column, change.kind);\n\t\tconst hasDefault = change.meta?.default !== undefined;\n\t\tvoid name;\n\t\treturn v3Payload({\n\t\t\tcanonicalFormVersion: 1,\n\t\t\tkind: 'column',\n\t\t\tcolumn: {\n\t\t\t\tdefault: hasDefault\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tdefaultKind: 'authored',\n\t\t\t\t\t\t\thasDefault: true,\n\t\t\t\t\t\t\tidentity: null,\n\t\t\t\t\t\t\tdefaultExpression: canonicalSqlFact(\n\t\t\t\t\t\t\t\tformatSqlDefault(\n\t\t\t\t\t\t\t\t\tchange.meta?.default,\n\t\t\t\t\t\t\t\t\t'generator postcondition',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t: { defaultKind: 'none', hasDefault: false, identity: null },\n\t\t\t},\n\t\t});\n\t}\n\tif (\n\t\tchange.kind === 'add_primary_key' ||\n\t\tchange.kind === 'add_foreign_key' ||\n\t\tchange.kind === 'alter_foreign_key' ||\n\t\tchange.kind === 'validate_constraint' ||\n\t\tchange.kind === 'add_check_constraint' ||\n\t\t(change.kind === 'alter_column_unique' && change.destructive !== true)\n\t) {\n\t\tconst constraint = constraintPostcondition(change, schema);\n\t\treturn constraint.type === 'c'\n\t\t\t? v3Payload({\n\t\t\t\t\tcanonicalFormVersion: 1,\n\t\t\t\t\tkind: 'check',\n\t\t\t\t\tcheck: {\n\t\t\t\t\t\texpression: canonicalSqlFact(constraint.expression),\n\t\t\t\t\t\tnotValid: constraint.notValid,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t: v3Payload({\n\t\t\t\t\tcanonicalFormVersion: 1,\n\t\t\t\t\tkind: 'constraint',\n\t\t\t\t\tconstraint,\n\t\t\t\t});\n\t}\n\tif (change.kind === 'create_index') {\n\t\tconst index = change.meta?.index as\n\t\t\t| import('@dbsp/types').IndexIR\n\t\t\t| undefined;\n\t\tif (!index)\n\t\t\tthrow new Error(\n\t\t\t\t'generator planning refuses create_index: missing typed index postcondition',\n\t\t\t);\n\t\tif (\n\t\t\tindex.opclass !== undefined &&\n\t\t\tObject.keys(index.opclass).some(\n\t\t\t\t(column) => !index.columns.includes(column),\n\t\t\t)\n\t\t)\n\t\t\tthrow new Error(\n\t\t\t\t'generator planning refuses create_index: opclass keys must name emitted columns',\n\t\t\t);\n\t\treturn v3Payload({\n\t\t\tcanonicalFormVersion: 1,\n\t\t\tkind: 'index',\n\t\t\tindex: {\n\t\t\t\tmethod: index.method ?? 'btree',\n\t\t\t\tunique: index.unique === true,\n\t\t\t\tvalid: true,\n\t\t\t\tready: true,\n\t\t\t\tlive: true,\n\t\t\t\tcolumns: index.columns,\n\t\t\t\t...(index.expressions === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\texpressions: index.expressions.map(canonicalSqlFact),\n\t\t\t\t\t\t}),\n\t\t\t\t...(index.include === undefined ? {} : { include: index.include }),\n\t\t\t\tnullsNotDistinct: index.nullsNotDistinct === true,\n\t\t\t\t...(index.opclass === undefined ? {} : { opclass: index.opclass }),\n\t\t\t\t...(index.with === undefined ? {} : { with: index.with }),\n\t\t\t\t...(index.where === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { where: canonicalSqlFact(index.where) }),\n\t\t\t},\n\t\t});\n\t}\n\tif (change.kind === 'create_enum' || change.kind === 'alter_enum_add_value') {\n\t\tconst enumDef = requiredRecord(change.meta?.enum, change.kind);\n\t\treturn v3Payload({\n\t\t\tcanonicalFormVersion: 1,\n\t\t\tkind: 'enum',\n\t\t\tlabels: requiredList(enumDef.values, change.kind),\n\t\t});\n\t}\n\tif (change.kind === 'create_sequence' || change.kind === 'alter_sequence') {\n\t\tconst sequence = requiredRecord(change.meta?.sequence, change.kind);\n\t\tconst startValue = normalizeSequenceInteger(\n\t\t\tsequence.startWith,\n\t\t\t`${change.kind} sequence startWith`,\n\t\t);\n\t\tconst incrementBy = normalizeSequenceInteger(\n\t\t\tsequence.incrementBy,\n\t\t\t`${change.kind} sequence incrementBy`,\n\t\t);\n\t\tconst minValue = normalizeSequenceInteger(\n\t\t\tsequence.minValue,\n\t\t\t`${change.kind} sequence minValue`,\n\t\t);\n\t\tconst maxValue = normalizeSequenceInteger(\n\t\t\tsequence.maxValue,\n\t\t\t`${change.kind} sequence maxValue`,\n\t\t);\n\t\tconst cycle = normalizeOptionalBoolean(\n\t\t\tsequence.cycle,\n\t\t\t`${change.kind} sequence cycle`,\n\t\t);\n\t\treturn v3Payload({\n\t\t\tcanonicalFormVersion: 1,\n\t\t\tkind: 'sequence',\n\t\t\t...(startValue === undefined ? {} : { startValue }),\n\t\t\t...(incrementBy === undefined ? {} : { incrementBy }),\n\t\t\t...(minValue === undefined ? {} : { minValue }),\n\t\t\t...(maxValue === undefined ? {} : { maxValue }),\n\t\t\t...(cycle === undefined ? {} : { cycle }),\n\t\t});\n\t}\n\tif (change.kind === 'create_extension') {\n\t\tconst version = change.meta?.extensionVersion;\n\t\tif (version !== undefined && typeof version !== 'string')\n\t\t\tthrow new Error(\n\t\t\t\t'generator planning refuses create_extension: invalid typed extension version',\n\t\t\t);\n\t\treturn v3Payload({\n\t\t\tcanonicalFormVersion: 1,\n\t\t\tkind: 'extension',\n\t\t\t...(typeof version === 'string' ? { version } : {}),\n\t\t});\n\t}\n\tif (change.kind === 'alter_column_type')\n\t\treturn v3Payload({\n\t\t\tcanonicalFormVersion: 1,\n\t\t\tkind: 'column',\n\t\t\tcolumn: {},\n\t\t});\n\tif (\n\t\tchange.kind === 'drop_table' ||\n\t\tchange.kind === 'drop_column' ||\n\t\tchange.kind === 'drop_primary_key' ||\n\t\tchange.kind === 'drop_foreign_key' ||\n\t\tchange.kind === 'drop_index' ||\n\t\tchange.kind === 'drop_check_constraint' ||\n\t\tchange.kind === 'drop_enum' ||\n\t\tchange.kind === 'drop_extension' ||\n\t\tchange.kind === 'drop_sequence' ||\n\t\t(change.kind === 'alter_column_unique' && change.destructive === true)\n\t)\n\t\treturn v3Payload({ canonicalFormVersion: 1, kind: 'absent' });\n\tthrow new Error(\n\t\t`generator planning refuses ${change.kind}: no typed postcondition is available`,\n\t);\n}\n\nexport function generatedPostconditionForChange(input: {\n\treadonly change: SchemaChange;\n\treadonly schema: string;\n}): import('@dbsp/types').LedgerPayload | undefined {\n\ttry {\n\t\treturn generatedPostconditionForChangeUnchecked(input);\n\t} catch (error) {\n\t\tconst identity = `${input.change.kind}:${input.change.table}${\n\t\t\tinput.change.column === undefined ? '' : `:${input.change.column}`\n\t\t}`;\n\t\tif (\n\t\t\terror instanceof Error &&\n\t\t\t(error.name === 'GeneratedPostconditionV3DeclarationError' ||\n\t\t\t\terror.message.startsWith('generated postcondition digest '))\n\t\t)\n\t\t\tthrow new Error(\n\t\t\t\t`generator planning refuses ${input.change.kind} at ${identity}: ${error.message}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\tthrow error;\n\t}\n}\n\n/**\n * The only change-kind boundary between diagnostic schema diffing and managed\n * execution. Keep it at manifest construction: diagnostic-only controls must\n * never acquire an address, claim, reservation, or DDL bundle.\n */\nexport function assertDeclarableChangeKind(\n\tkind: ChangeKind,\n): asserts kind is Exclude<\n\tChangeKind,\n\t| 'enable_rls'\n\t| 'disable_rls'\n\t| 'create_policy'\n\t| 'drop_policy'\n\t| 'add_comment'\n\t| 'drop_comment'\n> {\n\tswitch (kind) {\n\t\tcase 'enable_rls':\n\t\tcase 'disable_rls':\n\t\tcase 'create_policy':\n\t\tcase 'drop_policy':\n\t\tcase 'add_comment':\n\t\tcase 'drop_comment':\n\t\t\tthrow new Error(\n\t\t\t\t`generator planning refuses ${kind}: it is diagnostic-only and non-declarable`,\n\t\t\t);\n\t\tcase 'create_table':\n\t\tcase 'drop_table':\n\t\tcase 'readdress_table':\n\t\tcase 'add_column':\n\t\tcase 'drop_column':\n\t\tcase 'alter_column_type':\n\t\tcase 'alter_column_nullable':\n\t\tcase 'alter_column_default':\n\t\tcase 'alter_column_unique':\n\t\tcase 'add_primary_key':\n\t\tcase 'drop_primary_key':\n\t\tcase 'add_foreign_key':\n\t\tcase 'drop_foreign_key':\n\t\tcase 'alter_foreign_key':\n\t\tcase 'validate_constraint':\n\t\tcase 'create_index':\n\t\tcase 'drop_index':\n\t\tcase 'add_check_constraint':\n\t\tcase 'drop_check_constraint':\n\t\tcase 'create_enum':\n\t\tcase 'alter_enum_add_value':\n\t\tcase 'drop_enum':\n\t\tcase 'alter_column_collation':\n\t\tcase 'alter_column_identity':\n\t\tcase 'create_extension':\n\t\tcase 'drop_extension':\n\t\tcase 'create_sequence':\n\t\tcase 'alter_sequence':\n\t\tcase 'drop_sequence':\n\t\t\treturn;\n\t}\n}\n\nfunction text(value: unknown, label: string): string {\n\tif (typeof value !== 'string' || value.length === 0)\n\t\tthrow new Error(`generator planning refuses ${label}: missing typed name`);\n\treturn value;\n}\n\nfunction stringList(value: unknown, label: string): readonly string[] {\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.length === 0 ||\n\t\tvalue.some((item) => typeof item !== 'string' || item.trim().length === 0)\n\t)\n\t\tthrow new Error(\n\t\t\t`generator planning refuses ${label}: missing typed columns`,\n\t\t);\n\treturn value as readonly string[];\n}\n\nfunction named(meta: Meta | undefined, key: string, label: string): string {\n\treturn text(meta?.[key], label);\n}\n\nfunction nestedName(\n\tmeta: Meta | undefined,\n\tkey: string,\n\tlabel: string,\n): string {\n\tconst item = meta?.[key];\n\tif (!item || typeof item !== 'object' || Array.isArray(item))\n\t\tthrow new Error(\n\t\t\t`generator planning refuses ${label}: missing typed ${key}`,\n\t\t);\n\treturn text((item as Record<string, unknown>).name, label);\n}\n\nfunction tableAddress(\n\tdatabase: string,\n\tschema: string,\n\ttable: string,\n): Address {\n\treturn {\n\t\tscope: 'schema',\n\t\tengine: 'postgresql',\n\t\tdatabase,\n\t\tschema,\n\t\tkind: 'table',\n\t\tname: table,\n\t};\n}\n\nfunction childAddress(\n\tdatabase: string,\n\tschema: string,\n\tkind: Extract<Address['kind'], 'column' | 'index' | 'constraint'>,\n\tname: string,\n\ttable: string,\n): Address {\n\treturn {\n\t\tscope: 'schema',\n\t\tengine: 'postgresql',\n\t\tdatabase,\n\t\tschema,\n\t\tkind,\n\t\tname,\n\t\tparent: canonicalResourceParent(tableAddress(database, schema, table)),\n\t};\n}\n\nexport function addressForChange(input: {\n\treadonly change: SchemaChange;\n\treadonly database: string;\n\treadonly schema: string;\n}): Address {\n\tconst { change, database, schema } = input;\n\tconst meta = change.meta;\n\tconst column = () =>\n\t\tchildAddress(\n\t\t\tdatabase,\n\t\t\tschema,\n\t\t\t'column',\n\t\t\ttext(change.column, change.kind),\n\t\t\tchange.table,\n\t\t);\n\tconst constraint = (name: string) =>\n\t\tchildAddress(database, schema, 'constraint', name, change.table);\n\tconst fkName = (fk: Readonly<Record<string, unknown>>) => {\n\t\treturn `fk_${change.table}_${stringList(fk.columns, `${change.kind} columns`).join('_')}`;\n\t};\n\tswitch (change.kind) {\n\t\tcase 'create_table':\n\t\tcase 'drop_table':\n\t\tcase 'readdress_table':\n\t\tcase 'enable_rls':\n\t\tcase 'disable_rls':\n\t\t\treturn tableAddress(database, schema, change.table);\n\t\tcase 'add_column':\n\t\tcase 'drop_column':\n\t\tcase 'alter_column_type':\n\t\tcase 'alter_column_nullable':\n\t\tcase 'alter_column_default':\n\t\tcase 'alter_column_collation':\n\t\tcase 'alter_column_identity':\n\t\t\treturn column();\n\t\tcase 'alter_column_unique':\n\t\t\treturn constraint(\n\t\t\t\ttext(\n\t\t\t\t\tmeta?.constraintName ??\n\t\t\t\t\t\t`${change.table}_${text(change.column, change.kind)}_key`,\n\t\t\t\t\tchange.kind,\n\t\t\t\t),\n\t\t\t);\n\t\tcase 'add_primary_key':\n\t\tcase 'drop_primary_key':\n\t\t\treturn constraint(`pk_${change.table}`);\n\t\tcase 'add_foreign_key':\n\t\tcase 'drop_foreign_key':\n\t\tcase 'alter_foreign_key':\n\t\t\treturn constraint(fkName(requiredRecord(meta?.fk, change.kind)));\n\t\tcase 'validate_constraint': {\n\t\t\tconst target = validateConstraintTarget(change);\n\t\t\treturn constraint(\n\t\t\t\ttarget.kind === 'check'\n\t\t\t\t\t? text(target.check.name, change.kind)\n\t\t\t\t\t: fkName(target.fk),\n\t\t\t);\n\t\t}\n\t\tcase 'create_index':\n\t\tcase 'drop_index': {\n\t\t\tconst index = meta?.index;\n\t\t\tif (!index || typeof index !== 'object' || Array.isArray(index))\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`generator planning refuses ${change.kind}: missing typed index`,\n\t\t\t\t);\n\t\t\tconst record = index as Record<string, unknown>;\n\t\t\tconst name =\n\t\t\t\ttypeof record.name === 'string' && record.name.length > 0\n\t\t\t\t\t? record.name\n\t\t\t\t\t: `idx_${change.table}_${stringList(record.columns, change.kind).join('_')}`;\n\t\t\treturn childAddress(database, schema, 'index', name, change.table);\n\t\t}\n\t\tcase 'add_check_constraint':\n\t\tcase 'drop_check_constraint':\n\t\t\treturn constraint(nestedName(meta, 'check', change.kind));\n\t\tcase 'create_enum':\n\t\tcase 'alter_enum_add_value':\n\t\tcase 'drop_enum':\n\t\t\treturn {\n\t\t\t\tscope: 'schema',\n\t\t\t\tengine: 'postgresql',\n\t\t\t\tdatabase,\n\t\t\t\tschema,\n\t\t\t\tkind: 'enum',\n\t\t\t\tname: nestedName(meta, 'enum', change.kind),\n\t\t\t};\n\t\tcase 'create_extension':\n\t\tcase 'drop_extension':\n\t\t\treturn {\n\t\t\t\tscope: 'database',\n\t\t\t\tengine: 'postgresql',\n\t\t\t\tdatabase,\n\t\t\t\tkind: 'extension',\n\t\t\t\tname: named(meta, 'extension', change.kind),\n\t\t\t};\n\t\tcase 'create_sequence':\n\t\tcase 'alter_sequence':\n\t\tcase 'drop_sequence':\n\t\t\treturn {\n\t\t\t\tscope: 'schema',\n\t\t\t\tengine: 'postgresql',\n\t\t\t\tdatabase,\n\t\t\t\tschema,\n\t\t\t\tkind: 'sequence',\n\t\t\t\tname: nestedName(meta, 'sequence', change.kind),\n\t\t\t};\n\t\tcase 'add_comment':\n\t\tcase 'drop_comment':\n\t\tcase 'create_policy':\n\t\tcase 'drop_policy':\n\t\t\tthrow new Error(\n\t\t\t\t`generator planning refuses ${change.kind}: it is diagnostic-only and non-declarable`,\n\t\t\t);\n\t\tdefault: {\n\t\t\tconst exhaustive: never = change.kind;\n\t\t\tthrow new Error(\n\t\t\t\t`generator planning refuses unsupported change kind ${exhaustive}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction createsAddress(change: SchemaChange): boolean {\n\tif (change.kind === 'alter_column_unique') return change.destructive !== true;\n\treturn new Set<ChangeKind>([\n\t\t'create_table',\n\t\t'add_column',\n\t\t'add_primary_key',\n\t\t'add_foreign_key',\n\t\t'create_index',\n\t\t'add_check_constraint',\n\t\t'create_enum',\n\t\t'create_extension',\n\t\t'create_sequence',\n\t]).has(change.kind);\n}\n\n/**\n * PostgreSQL's total ChangeKind-to-address producer. The mapping is run at\n * plan time, so no executable generator step can later fall through to a\n * permissive \"no managed address\" branch.\n */\nexport function createPgsqlGeneratedManagedStep(input: {\n\treadonly change: SchemaChange;\n\treadonly database: string;\n\treadonly schema: string;\n\treadonly stepKey: string;\n\treadonly order: number;\n\treadonly dependencyOrder?: readonly string[];\n\treadonly statements: readonly string[];\n}): NormalizedManagedStep {\n\tvalidateChangeKeyLists(input.change);\n\tassertDeclarableChangeKind(input.change.kind);\n\tconst address = addressForChange(input);\n\tif (input.statements.length === 0 && input.change.kind !== 'readdress_table')\n\t\tthrow new Error(\n\t\t\t`generator planning refuses ${input.change.kind}: adapter produced an empty statement bundle`,\n\t\t);\n\tconst classification: GeneratedMutationClassification =\n\t\tclassifyGeneratedMutation(input.change.kind, input.change);\n\tconst claimKind: LedgerClaimKind =\n\t\tclassification === 'removal'\n\t\t\t? 'retire-intent'\n\t\t\t: classification === 'paired-readdress'\n\t\t\t\t? 'readdress-intent'\n\t\t\t\t: 'intent';\n\tconst expectedDeclaration = generatedPostconditionForChange({\n\t\tchange: input.change,\n\t\tschema: input.schema,\n\t});\n\treturn {\n\t\tstepKey: input.stepKey,\n\t\torder: input.order,\n\t\tsegmentId: `generator-segment-${input.order}`,\n\t\tdependencyOrder: input.dependencyOrder ?? [],\n\t\taddress,\n\t\tclaimKind,\n\t\tplannedClaimKeys: [`${input.stepKey}:root`],\n\t\tstatementBundle: {\n\t\t\tstatements: input.statements.map((sql, ordinal) => ({ ordinal, sql })),\n\t\t},\n\t\tclassification,\n\t\trequiresVacancy: createsAddress(input.change),\n\t\t...(expectedDeclaration === undefined ? {} : { expectedDeclaration }),\n\t\treplayPolicy: classification === 'removal' ? 'fresh-live-only' : 'recorded',\n\t};\n}\n","import { identityNaming } from '../naming-plugin.js';\nimport { validateCheckExpression, validateIdentifier } from '../validate.js';\nimport { generateCreateIndex } from './ddl-generator.js';\nimport { normalizeSequenceInteger } from './generated-source-normalizers.js';\nimport type { GeneratedPostconditionDeclarationV3 } from './managed-step-manifest.js';\n\nconst generatedPostconditionV3DeclarationErrors = new WeakSet<object>();\nconst generatedPostconditionV3DeclarationPaths = new WeakMap<object, string>();\nconst generatedPostconditionSnapshotPaths = new WeakMap<object, string>();\nconst STRUCTURAL_PATH = /^\\$(?:\\.[A-Za-z0-9_$-]+|\\[[0-9]+\\])*$/u;\nconst MAX_STRUCTURAL_PATH_LENGTH = 512;\n\nexport function generatedPostconditionStructuralPath(\n\tpath: unknown,\n): string | undefined {\n\treturn typeof path === 'string' &&\n\t\tpath.length <= MAX_STRUCTURAL_PATH_LENGTH &&\n\t\tSTRUCTURAL_PATH.test(path)\n\t\t? path\n\t\t: undefined;\n}\n\n/**\n * A dependency-free v3 declaration domain check. It intentionally knows no\n * catalogue addresses or PostgreSQL sessions, so producers and readers accept\n * exactly the same address-free declaration domain. Snapshot-graph refusals\n * can carry a sanitized structural path; semantic refusals identify only their\n * rule name and carry no path.\n */\nexport class GeneratedPostconditionV3DeclarationError extends Error {\n\tconstructor(readonly rule: string) {\n\t\tsuper(`generated postcondition v3 declaration violates ${rule}`);\n\t\tthis.name = 'GeneratedPostconditionV3DeclarationError';\n\t\tgeneratedPostconditionV3DeclarationErrors.add(this);\n\t}\n}\n\nexport function isGeneratedPostconditionV3DeclarationError(\n\terror: unknown,\n): error is GeneratedPostconditionV3DeclarationError {\n\treturn (\n\t\terror !== null &&\n\t\t(typeof error === 'object' || typeof error === 'function') &&\n\t\tgeneratedPostconditionV3DeclarationErrors.has(error)\n\t);\n}\n\nfunction refuse(rule: string, structuralPath?: string): never {\n\tconst error = new GeneratedPostconditionV3DeclarationError(rule);\n\tconst sanitizedPath = generatedPostconditionStructuralPath(structuralPath);\n\tif (sanitizedPath !== undefined)\n\t\tgeneratedPostconditionV3DeclarationPaths.set(error, sanitizedPath);\n\tthrow error;\n}\n\n/** Structural paths are private parser evidence, not public error input. */\nexport function generatedPostconditionV3DeclarationStructuralPath(\n\terror: unknown,\n): string | undefined {\n\tif (!isGeneratedPostconditionV3DeclarationError(error)) return;\n\treturn generatedPostconditionV3DeclarationPaths.get(error);\n}\n\nexport function generatedPostconditionSnapshotStructuralPath(\n\terror: unknown,\n): string | undefined {\n\tif (\n\t\terror === null ||\n\t\t(typeof error !== 'object' && typeof error !== 'function')\n\t)\n\t\treturn;\n\treturn generatedPostconditionSnapshotPaths.get(error);\n}\n\nfunction identifier(value: string, rule: string): void {\n\tif (\n\t\tvalue.length === 0 ||\n\t\tvalue.length > 63 ||\n\t\t!/^[a-zA-Z_][a-zA-Z0-9_$]*$/u.test(value)\n\t)\n\t\trefuse(rule);\n}\n\nfunction unique(values: readonly string[], rule: string): void {\n\tif (new Set(values).size !== values.length) refuse(rule);\n}\n\nfunction identifiers(values: readonly string[], rule: string): void {\n\tfor (const value of values) {\n\t\tif (typeof value !== 'string') refuse(rule);\n\t\tidentifier(value, rule);\n\t}\n}\n\nfunction columnDefault(value: unknown): void {\n\tif (!value || typeof value !== 'object' || Array.isArray(value))\n\t\trefuse('column default shape');\n\tconst state = value as Record<string, unknown>;\n\tif (\n\t\tstate.defaultKind === 'none' ||\n\t\tstate.defaultKind === 'generated-sequence'\n\t) {\n\t\tif (\n\t\t\tstate.hasDefault !== (state.defaultKind === 'generated-sequence') ||\n\t\t\tstate.identity !== null\n\t\t)\n\t\t\trefuse('column default state');\n\t\treturn;\n\t}\n\tif (state.defaultKind === 'identity') {\n\t\tif (\n\t\t\tstate.hasDefault !== false ||\n\t\t\t(state.identity !== 'always' && state.identity !== 'byDefault')\n\t\t)\n\t\t\trefuse('column default state');\n\t\treturn;\n\t}\n\tif (\n\t\tstate.defaultKind !== 'authored' ||\n\t\tstate.hasDefault !== true ||\n\t\tstate.identity !== null\n\t)\n\t\trefuse('column default state');\n\tcanonicalSql(state.defaultExpression, 'safe canonical SQL');\n}\n\nconst indexMethods = new Set([\n\t'btree',\n\t'hash',\n\t'gist',\n\t'gin',\n\t'brin',\n\t'spgist',\n\t'hnsw',\n\t'ivfflat',\n\t'bm25',\n\t'bloom',\n]);\n\nfunction canonicalSql(value: unknown, rule: string): void {\n\tif (\n\t\t!value ||\n\t\ttypeof value !== 'object' ||\n\t\tArray.isArray(value) ||\n\t\t(value as Record<string, unknown>).canonicalFormVersion !== 1 ||\n\t\ttypeof (value as Record<string, unknown>).sql !== 'string'\n\t)\n\t\trefuse(rule);\n\ttry {\n\t\tvalidateCheckExpression(\n\t\t\t(value as { readonly sql: string }).sql,\n\t\t\t'generated canonical SQL fact',\n\t\t);\n\t} catch {\n\t\trefuse(rule);\n\t}\n}\n\nfunction sequenceInteger(\n\tvalue: string | undefined,\n\trule: string,\n): bigint | undefined {\n\tif (value === undefined) return;\n\ttry {\n\t\tconst normalized = normalizeSequenceInteger(value, rule);\n\t\tif (normalized === undefined || normalized !== value) refuse(rule);\n\t\treturn BigInt(normalized);\n\t} catch {\n\t\trefuse(rule);\n\t}\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n\treturn value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction exactKeys(\n\tvalue: Record<string, unknown>,\n\tkeys: readonly string[],\n): void {\n\tconst allowed = new Set(keys);\n\tif (!Object.keys(value).every((key) => allowed.has(key)))\n\t\trefuse('declaration shape');\n}\n\nfunction string(value: unknown): asserts value is string {\n\tif (typeof value !== 'string') refuse('declaration shape');\n}\n\nfunction boolean(value: unknown): asserts value is boolean {\n\tif (typeof value !== 'boolean') refuse('declaration shape');\n}\n\nfunction identifierField(\n\tvalue: unknown,\n\ttype: 'table' | 'column' | 'schema' | 'alias',\n): void {\n\tstring(value);\n\ttry {\n\t\tvalidateIdentifier(value, type);\n\t} catch {\n\t\trefuse('declaration shape');\n\t}\n}\n\nfunction strings(\n\tvalue: unknown,\n\tidentifierType?: 'table' | 'column' | 'schema' | 'alias',\n): void {\n\tif (!Array.isArray(value)) refuse('declaration shape');\n\tfor (const item of value) {\n\t\tstring(item);\n\t\tif (identifierType) identifierField(item, identifierType);\n\t}\n}\n\nfunction stringMap(value: unknown, keysMustBeIdentifiers = false): void {\n\tif (!record(value)) refuse('declaration shape');\n\tfor (const [key, item] of Object.entries(value)) {\n\t\tif (keysMustBeIdentifiers) identifierField(key, 'alias');\n\t\tstring(item);\n\t}\n}\n\nfunction exactCanonicalSqlFact(value: unknown): void {\n\tif (!record(value)) refuse('declaration shape');\n\texactKeys(value, ['canonicalFormVersion', 'sql']);\n\tif (value.canonicalFormVersion !== 1) refuse('declaration shape');\n\tstring(value.sql);\n}\n\nfunction exactDefault(value: unknown): void {\n\tif (!record(value)) refuse('declaration shape');\n\tif (value.defaultKind === 'authored') {\n\t\texactKeys(value, [\n\t\t\t'defaultKind',\n\t\t\t'hasDefault',\n\t\t\t'identity',\n\t\t\t'defaultExpression',\n\t\t]);\n\t\tboolean(value.hasDefault);\n\t\texactCanonicalSqlFact(value.defaultExpression);\n\t\treturn;\n\t}\n\texactKeys(value, ['defaultKind', 'hasDefault', 'identity']);\n\tboolean(value.hasDefault);\n}\n\nfunction exactColumn(value: unknown, named: boolean): void {\n\tif (!record(value)) refuse('declaration shape');\n\texactKeys(value, [\n\t\t...(named ? ['name'] : []),\n\t\t'type',\n\t\t'nullable',\n\t\t'authoredCollation',\n\t\t'default',\n\t]);\n\tif (named) string(value.name);\n\tif (value.type !== undefined) string(value.type);\n\tif (value.nullable !== undefined) boolean(value.nullable);\n\tif (value.authoredCollation !== undefined && value.authoredCollation !== null)\n\t\tstring(value.authoredCollation);\n\tif (value.default !== undefined) exactDefault(value.default);\n}\n\n/** Exact wire decoding belongs to the declaration parser, never a reader-only arm. */\nfunction exactDeclaration(value: Record<string, unknown>): void {\n\tif (value.canonicalFormVersion !== 1 || typeof value.kind !== 'string')\n\t\trefuse('declaration shape');\n\tswitch (value.kind) {\n\t\tcase 'table':\n\t\t\texactKeys(value, ['canonicalFormVersion', 'kind', 'columns']);\n\t\t\tif (!Array.isArray(value.columns)) refuse('declaration shape');\n\t\t\tfor (const column of value.columns) exactColumn(column, true);\n\t\t\treturn;\n\t\tcase 'column':\n\t\t\texactKeys(value, ['canonicalFormVersion', 'kind', 'column']);\n\t\t\texactColumn(value.column, false);\n\t\t\treturn;\n\t\tcase 'check':\n\t\t\texactKeys(value, ['canonicalFormVersion', 'kind', 'check']);\n\t\t\tif (!record(value.check)) refuse('declaration shape');\n\t\t\texactKeys(value.check, ['expression', 'notValid']);\n\t\t\texactCanonicalSqlFact(value.check.expression);\n\t\t\tboolean(value.check.notValid);\n\t\t\treturn;\n\t\tcase 'constraint': {\n\t\t\texactKeys(value, ['canonicalFormVersion', 'kind', 'constraint']);\n\t\t\tif (!record(value.constraint)) refuse('declaration shape');\n\t\t\tconst constraint = value.constraint;\n\t\t\tif (constraint.type === 'p' || constraint.type === 'u') {\n\t\t\t\texactKeys(constraint, [\n\t\t\t\t\t'type',\n\t\t\t\t\t'columns',\n\t\t\t\t\t'deferrable',\n\t\t\t\t\t'initiallyDeferred',\n\t\t\t\t\t'enforced',\n\t\t\t\t]);\n\t\t\t\tstrings(constraint.columns);\n\t\t\t\tboolean(constraint.deferrable);\n\t\t\t\tboolean(constraint.initiallyDeferred);\n\t\t\t\tboolean(constraint.enforced);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\texactKeys(constraint, [\n\t\t\t\t'type',\n\t\t\t\t'columns',\n\t\t\t\t'references',\n\t\t\t\t'onDelete',\n\t\t\t\t'onUpdate',\n\t\t\t\t'deferrable',\n\t\t\t\t'initiallyDeferred',\n\t\t\t\t'enforced',\n\t\t\t\t'notValid',\n\t\t\t]);\n\t\t\tstrings(constraint.columns);\n\t\t\tif (!record(constraint.references)) refuse('declaration shape');\n\t\t\texactKeys(constraint.references, ['schema', 'table', 'columns']);\n\t\t\tstring(constraint.references.schema);\n\t\t\tstring(constraint.references.table);\n\t\t\tstrings(constraint.references.columns);\n\t\t\tstring(constraint.onDelete);\n\t\t\tstring(constraint.onUpdate);\n\t\t\tboolean(constraint.deferrable);\n\t\t\tboolean(constraint.initiallyDeferred);\n\t\t\tboolean(constraint.enforced);\n\t\t\tboolean(constraint.notValid);\n\t\t\treturn;\n\t\t}\n\t\tcase 'index': {\n\t\t\texactKeys(value, ['canonicalFormVersion', 'kind', 'index']);\n\t\t\tif (!record(value.index)) refuse('declaration shape');\n\t\t\tconst index = value.index;\n\t\t\texactKeys(index, [\n\t\t\t\t'method',\n\t\t\t\t'unique',\n\t\t\t\t'valid',\n\t\t\t\t'ready',\n\t\t\t\t'live',\n\t\t\t\t'columns',\n\t\t\t\t'expressions',\n\t\t\t\t'include',\n\t\t\t\t'nullsNotDistinct',\n\t\t\t\t'opclass',\n\t\t\t\t'with',\n\t\t\t\t'where',\n\t\t\t]);\n\t\t\tstring(index.method);\n\t\t\tboolean(index.unique);\n\t\t\tif (index.valid !== true || index.ready !== true || index.live !== true)\n\t\t\t\trefuse('declaration shape');\n\t\t\tstrings(index.columns);\n\t\t\tboolean(index.nullsNotDistinct);\n\t\t\tif (index.expressions !== undefined) {\n\t\t\t\tif (!Array.isArray(index.expressions)) refuse('declaration shape');\n\t\t\t\tfor (const expression of index.expressions)\n\t\t\t\t\texactCanonicalSqlFact(expression);\n\t\t\t}\n\t\t\tif (index.include !== undefined) strings(index.include);\n\t\t\tif (index.opclass !== undefined) stringMap(index.opclass, true);\n\t\t\tif (index.with !== undefined) stringMap(index.with, true);\n\t\t\tif (index.where !== undefined) exactCanonicalSqlFact(index.where);\n\t\t\treturn;\n\t\t}\n\t\tcase 'enum':\n\t\t\texactKeys(value, ['canonicalFormVersion', 'kind', 'labels']);\n\t\t\tstrings(value.labels);\n\t\t\treturn;\n\t\tcase 'sequence':\n\t\t\texactKeys(value, [\n\t\t\t\t'canonicalFormVersion',\n\t\t\t\t'kind',\n\t\t\t\t'startValue',\n\t\t\t\t'incrementBy',\n\t\t\t\t'minValue',\n\t\t\t\t'maxValue',\n\t\t\t\t'cycle',\n\t\t\t]);\n\t\t\tfor (const key of [\n\t\t\t\t'startValue',\n\t\t\t\t'incrementBy',\n\t\t\t\t'minValue',\n\t\t\t\t'maxValue',\n\t\t\t] as const)\n\t\t\t\tif (value[key] !== undefined) string(value[key]);\n\t\t\tif (value.cycle !== undefined) boolean(value.cycle);\n\t\t\treturn;\n\t\tcase 'extension':\n\t\t\texactKeys(value, ['canonicalFormVersion', 'kind', 'version']);\n\t\t\tif (value.version !== undefined) string(value.version);\n\t\t\treturn;\n\t\tcase 'absent':\n\t\t\texactKeys(value, ['canonicalFormVersion', 'kind']);\n\t\t\treturn;\n\t\tdefault:\n\t\t\trefuse('declaration shape');\n\t}\n}\n\n/**\n * The single v3 declaration parser. It is intentionally catalogue/session\n * neutral: both the producer and persisted-reader use this exact domain gate.\n */\nexport function validateGeneratedPostconditionV3Declaration(\n\tdeclaration: GeneratedPostconditionDeclarationV3,\n): void {\n\tswitch (declaration.kind) {\n\t\tcase 'table': {\n\t\t\tif (!Array.isArray(declaration.columns)) refuse('table columns shape');\n\t\t\tconst names = declaration.columns.map((column) => column.name);\n\t\t\tidentifiers(names, 'table column identifiers');\n\t\t\tunique(names, 'unique table column names');\n\t\t\tfor (const column of declaration.columns) {\n\t\t\t\tif (column.default !== undefined) columnDefault(column.default);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase 'column':\n\t\t\tif (declaration.column.default !== undefined)\n\t\t\t\tcolumnDefault(declaration.column.default);\n\t\t\treturn;\n\t\tcase 'check':\n\t\t\tcanonicalSql(declaration.check.expression, 'safe canonical SQL');\n\t\t\treturn;\n\t\tcase 'constraint': {\n\t\t\tconst constraint = declaration.constraint;\n\t\t\tif (\n\t\t\t\tconstraint.type !== 'p' &&\n\t\t\t\tconstraint.type !== 'u' &&\n\t\t\t\tconstraint.type !== 'f'\n\t\t\t)\n\t\t\t\trefuse('constraint type');\n\t\t\tidentifiers(constraint.columns, 'constraint column identifiers');\n\t\t\tif (constraint.columns.length === 0)\n\t\t\t\trefuse('non-empty constraint columns');\n\t\t\tunique(constraint.columns, 'unique constraint columns');\n\t\t\tif (constraint.initiallyDeferred && !constraint.deferrable)\n\t\t\t\trefuse('initially deferred constraint must be deferrable');\n\t\t\tif (constraint.type !== 'f') return;\n\t\t\tfor (const action of [constraint.onDelete, constraint.onUpdate])\n\t\t\t\tif (\n\t\t\t\t\t![\n\t\t\t\t\t\t'NO ACTION',\n\t\t\t\t\t\t'RESTRICT',\n\t\t\t\t\t\t'CASCADE',\n\t\t\t\t\t\t'SET NULL',\n\t\t\t\t\t\t'SET DEFAULT',\n\t\t\t\t\t].includes(action)\n\t\t\t\t)\n\t\t\t\t\trefuse('foreign-key action allowlist');\n\t\t\tidentifier(constraint.references.schema, 'foreign-key reference schema');\n\t\t\tidentifier(constraint.references.table, 'foreign-key reference table');\n\t\t\tidentifiers(\n\t\t\t\tconstraint.references.columns,\n\t\t\t\t'foreign-key reference column identifiers',\n\t\t\t);\n\t\t\tif (constraint.references.columns.length === 0)\n\t\t\t\trefuse('non-empty foreign-key reference columns');\n\t\t\tunique(\n\t\t\t\tconstraint.references.columns,\n\t\t\t\t'unique foreign-key reference columns',\n\t\t\t);\n\t\t\tif (constraint.columns.length !== constraint.references.columns.length)\n\t\t\t\trefuse('equal foreign-key column list lengths');\n\t\t\treturn;\n\t\t}\n\t\tcase 'index': {\n\t\t\tconst index = declaration.index;\n\t\t\tif (!indexMethods.has(index.method)) refuse('index method allowlist');\n\t\t\tidentifiers(index.columns, 'index column identifiers');\n\t\t\tunique(index.columns, 'unique index columns');\n\t\t\tif (\n\t\t\t\tindex.columns.length === 0 &&\n\t\t\t\t(index.expressions === undefined || index.expressions.length === 0)\n\t\t\t)\n\t\t\t\trefuse('non-empty index keys');\n\t\t\tidentifiers(index.include ?? [], 'index include column identifiers');\n\t\t\tunique(index.include ?? [], 'unique index include columns');\n\t\t\tif (index.nullsNotDistinct && !index.unique)\n\t\t\t\trefuse('NULLS NOT DISTINCT requires a unique index');\n\t\t\tfor (const [column, opclass] of Object.entries(index.opclass ?? {})) {\n\t\t\t\tidentifier(column, 'index opclass column identifiers');\n\t\t\t\tidentifier(opclass, 'index opclass identifiers');\n\t\t\t\tif (!index.columns.includes(column))\n\t\t\t\t\trefuse('index opclass keys name index columns');\n\t\t\t}\n\t\t\tfor (const key of Object.keys(index.with ?? {}))\n\t\t\t\tidentifier(key, 'index storage parameter identifiers');\n\t\t\tfor (const expression of index.expressions ?? [])\n\t\t\t\tcanonicalSql(expression, 'safe canonical SQL');\n\t\t\tif (\n\t\t\t\tnew Set((index.expressions ?? []).map((expression) => expression.sql))\n\t\t\t\t\t.size !== (index.expressions ?? []).length\n\t\t\t)\n\t\t\t\trefuse('unique index expressions');\n\t\t\tif (index.where !== undefined)\n\t\t\t\tcanonicalSql(index.where, 'safe canonical SQL');\n\t\t\ttry {\n\t\t\t\tgenerateCreateIndex(\n\t\t\t\t\t'dbsp_postcondition_parser',\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'dbsp_postcondition_parser_index',\n\t\t\t\t\t\tcolumns: index.columns,\n\t\t\t\t\t\tmethod: index.method,\n\t\t\t\t\t\tunique: index.unique,\n\t\t\t\t\t\tnullsNotDistinct: index.nullsNotDistinct,\n\t\t\t\t\t\t...(index.expressions === undefined\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: { expressions: index.expressions.map((fact) => fact.sql) }),\n\t\t\t\t\t\t...(index.include === undefined ? {} : { include: index.include }),\n\t\t\t\t\t\t...(index.opclass === undefined ? {} : { opclass: index.opclass }),\n\t\t\t\t\t\t...(index.with === undefined ? {} : { with: index.with }),\n\t\t\t\t\t\t...(index.where === undefined ? {} : { where: index.where.sql }),\n\t\t\t\t\t},\n\t\t\t\t\tundefined,\n\t\t\t\t\tidentityNaming,\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\trefuse('index renderer representability');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase 'enum':\n\t\t\tif (declaration.labels.some((label) => typeof label !== 'string'))\n\t\t\t\trefuse('enum labels');\n\t\t\tunique(declaration.labels, 'unique enum labels');\n\t\t\treturn;\n\t\tcase 'sequence':\n\t\t\tsequenceInteger(declaration.startValue, 'sequence start value');\n\t\t\tif (\n\t\t\t\tsequenceInteger(declaration.incrementBy, 'sequence increment value') ===\n\t\t\t\t0n\n\t\t\t)\n\t\t\t\trefuse('non-zero sequence increment');\n\t\t\tsequenceInteger(declaration.minValue, 'sequence minimum value');\n\t\t\tsequenceInteger(declaration.maxValue, 'sequence maximum value');\n\t\t\treturn;\n\t}\n}\n\n/**\n * Copy an input into a plain own-data JSON graph before either hashing or\n * decoding it. Accessors, holes, symbols, extra array properties, and exotic\n * prototypes are refused instead of being interpreted differently by either\n * side of the persisted digest boundary.\n */\n/** The fixed v3 wire envelope and declaration grammar reach at most five container edges. */\nexport const GENERATED_POSTCONDITION_MAX_JSON_DEPTH = 5;\n/**\n * Durable declarations are capped at 64 KiB of serialized UTF-8 JSON. This\n * caps both the persisted payload and the amount of graph we can copy before\n * exact-key decoding rejects a hostile wide declaration.\n */\nexport const GENERATED_POSTCONDITION_MAX_JSON_BYTES = 64 * 1024;\nconst GENERATED_POSTCONDITION_MAX_CONTAINER_MEMBERS = 4_096;\n\nfunction serializedJsonStringUtf8Bytes(value: string): number {\n\tlet bytes = 2;\n\tfor (let index = 0; index < value.length; index += 1) {\n\t\tconst code = value.charCodeAt(index);\n\t\tif (code === 0x22 || code === 0x5c || code <= 0x1f) {\n\t\t\tbytes +=\n\t\t\t\tcode === 0x08 ||\n\t\t\t\tcode === 0x09 ||\n\t\t\t\tcode === 0x0a ||\n\t\t\t\tcode === 0x0c ||\n\t\t\t\tcode === 0x0d\n\t\t\t\t\t? 2\n\t\t\t\t\t: 6;\n\t\t\tcontinue;\n\t\t}\n\t\tif (code >= 0xd800 && code <= 0xdbff) {\n\t\t\tconst next = value.charCodeAt(index + 1);\n\t\t\tif (next >= 0xdc00 && next <= 0xdfff) {\n\t\t\t\tbytes += 4;\n\t\t\t\tindex += 1;\n\t\t\t} else bytes += 6;\n\t\t\tcontinue;\n\t\t}\n\t\tif (code >= 0xdc00 && code <= 0xdfff) {\n\t\t\tbytes += 6;\n\t\t\tcontinue;\n\t\t}\n\t\tbytes += code <= 0x7f ? 1 : code <= 0x7ff ? 2 : 3;\n\t}\n\treturn bytes;\n}\n\n/** Only snapshot refusals minted here may contribute a diagnostic path. */\nfunction snapshotRefusal(path: string, detail: string): never {\n\tconst error = new TypeError(`${path}: ${detail}`);\n\tconst sanitizedPath = generatedPostconditionStructuralPath(path);\n\tif (sanitizedPath !== undefined)\n\t\tgeneratedPostconditionSnapshotPaths.set(error, sanitizedPath);\n\tthrow error;\n}\n\nexport function snapshotGeneratedPostconditionJson(value: unknown): unknown {\n\tif (\n\t\tvalue !== null &&\n\t\ttypeof value === 'object' &&\n\t\timmutableGeneratedPostconditionSnapshots.has(value)\n\t)\n\t\treturn value;\n\tlet bytes = 0;\n\tconst nonPrimitive = Symbol('nonPrimitive');\n\tconst seen = new WeakSet<object>();\n\tconst addBytes = (amount: number, path: string): void => {\n\t\tbytes += amount;\n\t\tif (bytes > GENERATED_POSTCONDITION_MAX_JSON_BYTES)\n\t\t\tsnapshotRefusal(\n\t\t\t\tpath,\n\t\t\t\t`serialized JSON exceeds ${GENERATED_POSTCONDITION_MAX_JSON_BYTES} UTF-8 bytes`,\n\t\t\t);\n\t};\n\tconst primitive = (\n\t\titem: unknown,\n\t\tpath: string,\n\t): unknown | typeof nonPrimitive => {\n\t\tif (item === null) {\n\t\t\taddBytes(4, path);\n\t\t\treturn null;\n\t\t}\n\t\tif (typeof item === 'string') {\n\t\t\taddBytes(serializedJsonStringUtf8Bytes(item), path);\n\t\t\treturn item;\n\t\t}\n\t\tif (typeof item === 'boolean') {\n\t\t\taddBytes(item ? 4 : 5, path);\n\t\t\treturn item;\n\t\t}\n\t\tif (typeof item === 'number') {\n\t\t\tif (!Number.isFinite(item))\n\t\t\t\tsnapshotRefusal(path, 'expected a finite JSON number');\n\t\t\taddBytes(String(Object.is(item, -0) ? 0 : item).length, path);\n\t\t\treturn item;\n\t\t}\n\t\treturn nonPrimitive;\n\t};\n\ttype SnapshotMember = {\n\t\treadonly key: string;\n\t\treadonly value: unknown | SnapshotNode;\n\t};\n\ttype SnapshotNode = {\n\t\treadonly array: boolean;\n\t\treadonly path: string;\n\t\treadonly members: SnapshotMember[];\n\t\ttarget?: object;\n\t};\n\tconst root = primitive(value, '$');\n\tif (root !== nonPrimitive) return root;\n\tif (value === null || value === undefined || typeof value !== 'object')\n\t\tsnapshotRefusal('$', 'expected an own JSON value');\n\tconst validationStack: Array<{\n\t\treadonly source: object;\n\t\treadonly node: SnapshotNode;\n\t\treadonly path: string;\n\t\treadonly depth: number;\n\t}> = [];\n\tconst captureContainer = (\n\t\tsource: object,\n\t\tpath: string,\n\t\tdepth: number,\n\t): SnapshotNode => {\n\t\tif (depth > GENERATED_POSTCONDITION_MAX_JSON_DEPTH)\n\t\t\tsnapshotRefusal(\n\t\t\t\tpath,\n\t\t\t\t`declaration exceeds JSON depth ${GENERATED_POSTCONDITION_MAX_JSON_DEPTH}`,\n\t\t\t);\n\t\tif (seen.has(source))\n\t\t\tsnapshotRefusal(path, 'declaration graph must be a tree');\n\t\tseen.add(source);\n\t\tconst array = Array.isArray(source);\n\t\tconst members: SnapshotMember[] = [];\n\t\tconst node: SnapshotNode = { array, path, members };\n\t\tif (array) {\n\t\t\tif (Object.getPrototypeOf(source) !== Array.prototype)\n\t\t\t\tsnapshotRefusal(path, 'array has an exotic prototype');\n\t\t\tif (source.length > GENERATED_POSTCONDITION_MAX_CONTAINER_MEMBERS)\n\t\t\t\tsnapshotRefusal(\n\t\t\t\t\tpath,\n\t\t\t\t\t`array exceeds ${GENERATED_POSTCONDITION_MAX_CONTAINER_MEMBERS} members`,\n\t\t\t\t);\n\t\t\tif (Object.getOwnPropertySymbols(source).length > 0)\n\t\t\t\tsnapshotRefusal(path, 'array has symbol members');\n\t\t\tfor (const key of Object.getOwnPropertyNames(source)) {\n\t\t\t\tif (key === 'length') continue;\n\t\t\t\tif (!/^(?:0|[1-9][0-9]*)$/u.test(key))\n\t\t\t\t\tsnapshotRefusal(path, 'array has a non-index member');\n\t\t\t\tif (BigInt(key) > 4294967294n)\n\t\t\t\t\tsnapshotRefusal(path, 'array has an out-of-range index member');\n\t\t\t}\n\t\t\taddBytes(2 + Math.max(0, source.length - 1), path);\n\t\t\tvalidationStack.push({ source, node, path, depth });\n\t\t\treturn node;\n\t\t}\n\t\tif (Object.getPrototypeOf(source) !== Object.prototype)\n\t\t\tsnapshotRefusal(path, 'object has an exotic prototype');\n\t\tif (Object.getOwnPropertySymbols(source).length > 0)\n\t\t\tsnapshotRefusal(path, 'object has symbol members');\n\t\tif (\n\t\t\tObject.getOwnPropertyNames(source).length >\n\t\t\tGENERATED_POSTCONDITION_MAX_CONTAINER_MEMBERS\n\t\t)\n\t\t\tsnapshotRefusal(\n\t\t\t\tpath,\n\t\t\t\t`object exceeds ${GENERATED_POSTCONDITION_MAX_CONTAINER_MEMBERS} members`,\n\t\t\t);\n\t\tvalidationStack.push({ source, node, path, depth });\n\t\treturn node;\n\t};\n\tconst rootNode = captureContainer(value, '$', 0);\n\twhile (validationStack.length > 0) {\n\t\tconst frame = validationStack.pop();\n\t\tif (!frame) break;\n\t\tif (Array.isArray(frame.source)) {\n\t\t\tfor (let index = 0; index < frame.source.length; index += 1) {\n\t\t\t\tif (!Object.hasOwn(frame.source, index))\n\t\t\t\t\tsnapshotRefusal(\n\t\t\t\t\t\t`${frame.path}[${index}]`,\n\t\t\t\t\t\t'array holes are unsupported',\n\t\t\t\t\t);\n\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(\n\t\t\t\t\tframe.source,\n\t\t\t\t\tString(index),\n\t\t\t\t);\n\t\t\t\tif (!descriptor || !('value' in descriptor))\n\t\t\t\t\tsnapshotRefusal(\n\t\t\t\t\t\t`${frame.path}[${index}]`,\n\t\t\t\t\t\t'accessor members are unsupported',\n\t\t\t\t\t);\n\t\t\t\tif (descriptor.value === undefined)\n\t\t\t\t\tsnapshotRefusal(\n\t\t\t\t\t\t`${frame.path}[${index}]`,\n\t\t\t\t\t\t'expected an own JSON value',\n\t\t\t\t\t);\n\t\t\t\tif (descriptor.enumerable !== true)\n\t\t\t\t\tsnapshotRefusal(\n\t\t\t\t\t\t`${frame.path}[${index}]`,\n\t\t\t\t\t\t'own data members are required',\n\t\t\t\t\t);\n\t\t\t\tconst itemPath = `${frame.path}[${index}]`;\n\t\t\t\tconst copied = primitive(descriptor.value, itemPath);\n\t\t\t\tframe.node.members.push({\n\t\t\t\t\tkey: String(index),\n\t\t\t\t\tvalue:\n\t\t\t\t\t\tcopied === nonPrimitive\n\t\t\t\t\t\t\t? captureContainer(\n\t\t\t\t\t\t\t\t\tdescriptor.value as object,\n\t\t\t\t\t\t\t\t\titemPath,\n\t\t\t\t\t\t\t\t\tframe.depth + 1,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: copied,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst keys = Object.getOwnPropertyNames(frame.source);\n\t\taddBytes(2 + Math.max(0, keys.length - 1), frame.path);\n\t\tfor (let index = 0; index < keys.length; index += 1) {\n\t\t\tconst key = keys[index];\n\t\t\tif (key === undefined) continue;\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(frame.source, key);\n\t\t\tif (\n\t\t\t\t!descriptor ||\n\t\t\t\t!('value' in descriptor) ||\n\t\t\t\tdescriptor.enumerable !== true\n\t\t\t)\n\t\t\t\tsnapshotRefusal(\n\t\t\t\t\t`${frame.path}.${key}`,\n\t\t\t\t\t'own data members are required',\n\t\t\t\t);\n\t\t\tif (descriptor.value === undefined)\n\t\t\t\tsnapshotRefusal(`${frame.path}.${key}`, 'expected an own JSON value');\n\t\t\taddBytes(serializedJsonStringUtf8Bytes(key) + 1, frame.path);\n\t\t\tconst copied = primitive(descriptor.value, `${frame.path}.${key}`);\n\t\t\tframe.node.members.push({\n\t\t\t\tkey,\n\t\t\t\tvalue:\n\t\t\t\t\tcopied === nonPrimitive\n\t\t\t\t\t\t? captureContainer(\n\t\t\t\t\t\t\t\tdescriptor.value as object,\n\t\t\t\t\t\t\t\t`${frame.path}.${key}`,\n\t\t\t\t\t\t\t\tframe.depth + 1,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: copied,\n\t\t\t});\n\t\t}\n\t}\n\t// The first pass above has charged the complete encoded payload and captured\n\t// every own data descriptor. Allocate target containers only now.\n\tconst copiedContainers: object[] = [];\n\tconst allocate = (node: SnapshotNode): object => {\n\t\tconst target = node.array ? new Array(node.members.length) : {};\n\t\tnode.target = target;\n\t\tcopiedContainers.push(target);\n\t\treturn target;\n\t};\n\tconst snapshot = allocate(rootNode);\n\tconst copyStack = [rootNode];\n\twhile (copyStack.length > 0) {\n\t\tconst node = copyStack.pop();\n\t\tif (!node?.target) continue;\n\t\tfor (const [index, member] of node.members.entries()) {\n\t\t\tconst copied =\n\t\t\t\tmember.value !== null && typeof member.value === 'object'\n\t\t\t\t\t? allocate(member.value as SnapshotNode)\n\t\t\t\t\t: member.value;\n\t\t\tif (node.array) (node.target as unknown[])[index] = copied;\n\t\t\telse\n\t\t\t\tObject.defineProperty(node.target, member.key, {\n\t\t\t\t\tvalue: copied,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t});\n\t\t\tif (member.value !== null && typeof member.value === 'object')\n\t\t\t\tcopyStack.push(member.value as SnapshotNode);\n\t\t}\n\t}\n\tfor (const item of copiedContainers.reverse()) {\n\t\tObject.freeze(item);\n\t\timmutableGeneratedPostconditionSnapshots.add(item);\n\t}\n\treturn snapshot;\n}\n\n/** Branded by identity, not a forgeable property, once it crossed the JSON gate. */\nconst immutableGeneratedPostconditionSnapshots = new WeakSet<object>();\n\n/**\n * Normalizes the producer's typed declaration through the same immutable JSON\n * boundary used by the persisted reader. Decoder shape validation feeds this\n * parser too, so semantic and renderer rules cannot drift by direction.\n */\nexport function parseGeneratedPostconditionV3Declaration(\n\tvalue: unknown,\n): GeneratedPostconditionDeclarationV3 {\n\tlet snapshot: GeneratedPostconditionDeclarationV3;\n\ttry {\n\t\tsnapshot = snapshotGeneratedPostconditionJson(\n\t\t\tvalue,\n\t\t) as GeneratedPostconditionDeclarationV3;\n\t} catch (error) {\n\t\treturn refuse(\n\t\t\t'own JSON declaration graph',\n\t\t\tgeneratedPostconditionSnapshotStructuralPath(error),\n\t\t);\n\t}\n\tif (!record(snapshot)) refuse('declaration shape');\n\ttry {\n\t\texactDeclaration(snapshot);\n\t\tvalidateGeneratedPostconditionV3Declaration(snapshot);\n\t} catch (error) {\n\t\tif (isGeneratedPostconditionV3DeclarationError(error)) throw error;\n\t\trefuse('declaration shape');\n\t}\n\treturn snapshot;\n}\n","import type { LedgerAddress, ResourceAddress } from '@dbsp/types';\nimport { renderCheckConstraintClause } from '../check-expression.js';\nimport { dbTypesEqual } from '../db-type.js';\nimport { identityNaming } from '../naming-plugin.js';\nimport {\n\tlockPgRelation,\n\tPgResolvableRelationLockError,\n} from '../transition/lock-relation.js';\nimport { validateCheckExpression } from '../validate.js';\nimport { generateCreateIndex } from './ddl-generator.js';\nimport {\n\tgeneratedPostconditionSnapshotStructuralPath,\n\tgeneratedPostconditionStructuralPath,\n\tgeneratedPostconditionV3DeclarationStructuralPath,\n\tisGeneratedPostconditionV3DeclarationError,\n\tparseGeneratedPostconditionV3Declaration,\n\tsnapshotGeneratedPostconditionJson,\n} from './generated-postcondition-v3-validator.js';\nimport { DEFAULT_DDL_LOCK_TIMEOUT_MS } from './lock-timeout.js';\nimport type {\n\tGeneratedColumnPostcondition,\n\tGeneratedConstraintPostcondition,\n\tGeneratedIndexPostcondition,\n\tGeneratedPostcondition,\n\tGeneratedPostconditionDeclarationV3,\n\tGeneratedPostconditionV3,\n\tTargetBinding,\n} from './managed-step-manifest.js';\nimport { generatedPostconditionDigest } from './managed-step-manifest.js';\nimport { quoteIdent } from './phases/utils.js';\n\ntype GeneratedPostconditionQuery = {\n\tquery(\n\t\tsql: string,\n\t\tparams?: readonly unknown[],\n\t): Promise<{ readonly rows: readonly Record<string, unknown>[] }>;\n};\n\nconst generatedPostconditionSessionBrand = Symbol(\n\t'generatedPostconditionSessionBrand',\n);\nconst generatedPostconditionReplanErrors = new WeakSet<object>();\ntype GeneratedPostconditionSessionState = {\n\tactive: boolean;\n\tproofInFlight: boolean;\n\tqueriesInFlight: number;\n\tqueriesOutsideProof: number;\n};\n\ntype GeneratedPostconditionSafeFailure = {\n\treadonly capability: object;\n\treadonly queryCountAtMark: number;\n};\n\nconst generatedPostconditionSessionStates = new WeakMap<\n\tobject,\n\tGeneratedPostconditionSessionState\n>();\nconst generatedPostconditionQueryCounts = new WeakMap<object, number>();\nconst preQueryFailures = new WeakMap<\n\tobject,\n\tGeneratedPostconditionSafeFailure\n>();\nconst cleanScratchFailures = new WeakMap<\n\tobject,\n\tGeneratedPostconditionSafeFailure\n>();\nconst structuralMismatchFailures = new WeakSet<object>();\nconst scratchRollbackSafeFailures = new WeakSet<object>();\nconst generatedPostconditionSessionLockTimeouts = new WeakMap<object, number>();\n\n/** An adapter-minted, exclusive PostgreSQL session for rollback-only proof. */\nexport type GeneratedPostconditionSession = GeneratedPostconditionQuery & {\n\treadonly [generatedPostconditionSessionBrand]: true;\n};\n\n/** A retained session capability was used after its owning bracket ended. */\nexport class GeneratedPostconditionSessionDeactivatedError extends Error {\n\tconstructor() {\n\t\tsuper('generated postcondition session capability is no longer active');\n\t\tthis.name = 'GeneratedPostconditionSessionDeactivatedError';\n\t}\n}\n\n/** A caller attempted to overlap rollback-only proofs on one capability. */\nexport class GeneratedPostconditionProofInFlightError extends Error {\n\tconstructor() {\n\t\tsuper('generated postcondition session already has a proof in flight');\n\t\tthis.name = 'GeneratedPostconditionProofInFlightError';\n\t}\n}\n\n/** A session bracket completed while rollback-only proof work was still running. */\nexport class GeneratedPostconditionWorkInFlightError extends Error {\n\tconstructor() {\n\t\tsuper(\n\t\t\t'generated postcondition session bracket completed with work in flight',\n\t\t);\n\t\tthis.name = 'GeneratedPostconditionWorkInFlightError';\n\t}\n}\n\n/**\n * This mint is intentionally not re-exported from the adapter public surface.\n * Transition admission uses it for its already-pinned client; external callers\n * use withGeneratedPostconditionSession(), which checks out and releases one.\n */\nexport function mintGeneratedPostconditionSession(\n\tsession: GeneratedPostconditionQuery,\n): GeneratedPostconditionSession {\n\tconst state: GeneratedPostconditionSessionState = {\n\t\tactive: true,\n\t\tproofInFlight: false,\n\t\tqueriesInFlight: 0,\n\t\tqueriesOutsideProof: 0,\n\t};\n\tconst capability = Object.freeze({\n\t\tasync query(sql: string, params?: readonly unknown[]) {\n\t\t\tif (!state.active)\n\t\t\t\tthrow new GeneratedPostconditionSessionDeactivatedError();\n\t\t\tif (!state.proofInFlight) state.queriesOutsideProof += 1;\n\t\t\tgeneratedPostconditionQueryCounts.set(\n\t\t\t\tcapability,\n\t\t\t\t(generatedPostconditionQueryCounts.get(capability) ?? 0) + 1,\n\t\t\t);\n\t\t\tstate.queriesInFlight += 1;\n\t\t\ttry {\n\t\t\t\treturn await session.query(sql, params);\n\t\t\t} finally {\n\t\t\t\tstate.queriesInFlight -= 1;\n\t\t\t}\n\t\t},\n\t\t[generatedPostconditionSessionBrand]: true as const,\n\t});\n\tgeneratedPostconditionSessionStates.set(capability, state);\n\treturn capability;\n}\n\nfunction boundedGeneratedPostconditionLockTimeout(value: number | undefined) {\n\tif (!Number.isFinite(value)) return DEFAULT_DDL_LOCK_TIMEOUT_MS;\n\treturn Math.max(\n\t\t1,\n\t\tMath.min(86_400_000, Math.trunc(value ?? DEFAULT_DDL_LOCK_TIMEOUT_MS)),\n\t);\n}\n\n/**\n * Internal capability bracket for callers that already own an exclusive\n * PostgreSQL session. The wrapper cannot outlive the work that borrowed it.\n */\nexport async function withPinnedGeneratedPostconditionSession<T>(\n\tsession: GeneratedPostconditionQuery,\n\twork: (session: GeneratedPostconditionSession) => Promise<T>,\n\tlockTimeoutMs?: number,\n): Promise<T> {\n\tconst capability = mintGeneratedPostconditionSession(session);\n\tif (lockTimeoutMs !== undefined)\n\t\tgeneratedPostconditionSessionLockTimeouts.set(\n\t\t\tcapability,\n\t\t\tboundedGeneratedPostconditionLockTimeout(lockTimeoutMs),\n\t\t);\n\ttry {\n\t\tconst result = await work(capability);\n\t\tconst state = generatedPostconditionSessionStates.get(capability);\n\t\tif (state?.proofInFlight || state?.queriesInFlight)\n\t\t\tthrow new GeneratedPostconditionWorkInFlightError();\n\t\treturn result;\n\t} finally {\n\t\tconst state = generatedPostconditionSessionStates.get(capability);\n\t\tif (state) state.active = false;\n\t}\n}\n\n/**\n * Public verifier checkout bracket. Scratch-backed proofs require the active\n * role to hold database TEMP privilege; callers must preflight that capability\n * before applying managed DDL whose postcondition needs scratch staging.\n */\nexport async function withGeneratedPostconditionSession<T>(\n\texecutor: {\n\t\tconnect(): Promise<\n\t\t\tGeneratedPostconditionQuery & {\n\t\t\t\trelease(error?: unknown): void | Promise<void>;\n\t\t\t}\n\t\t>;\n\t},\n\twork: (session: GeneratedPostconditionSession) => Promise<T>,\n\tlockTimeoutMs?: number,\n): Promise<T> {\n\tconst client = await executor.connect();\n\tlet result!: T;\n\tlet failed = false;\n\tlet failure: unknown;\n\tlet capability: GeneratedPostconditionSession | undefined;\n\ttry {\n\t\tresult = await withPinnedGeneratedPostconditionSession(\n\t\t\tclient,\n\t\t\tasync (session) => {\n\t\t\t\tcapability = session;\n\t\t\t\treturn work(session);\n\t\t\t},\n\t\t\tboundedGeneratedPostconditionLockTimeout(lockTimeoutMs),\n\t\t);\n\t} catch (error) {\n\t\tfailed = true;\n\t\tfailure = error;\n\t}\n\tconst shouldEvict =\n\t\tfailed && !isSafeGeneratedPostconditionFailure(failure, capability);\n\ttry {\n\t\tif (shouldEvict)\n\t\t\tawait client.release(\n\t\t\t\tfailure instanceof Error\n\t\t\t\t\t? failure\n\t\t\t\t\t: new Error('generated postcondition verification failed', {\n\t\t\t\t\t\t\tcause: failure,\n\t\t\t\t\t\t}),\n\t\t\t);\n\t\telse await client.release();\n\t} catch (releaseError) {\n\t\tif (failed)\n\t\t\tthrow new AggregateError(\n\t\t\t\t[failure, releaseError],\n\t\t\t\t'generated postcondition verification failed and session release failed',\n\t\t\t\t{ cause: failure },\n\t\t\t);\n\t\tthrow releaseError;\n\t}\n\tif (failed) throw failure;\n\treturn result;\n}\n\ntype GeneratedPostconditionTarget = {\n\treadonly schema: string;\n\treadonly table: string;\n\treadonly name: string;\n\t/** The catalogue object selected by the binding query, never a name relookup. */\n\treadonly relationOid?: string;\n\treadonly objectOid?: string;\n\treadonly attributeNumber?: number;\n};\n\ntype ResolvableGeneratedPostconditionKind = 'table' | 'column' | 'constraint';\n\ntype GeneratedPostconditionBindingKind =\n\t| ResolvableGeneratedPostconditionKind\n\t| 'index'\n\t| 'enum'\n\t| 'sequence'\n\t| 'extension';\n\ntype GeneratedPostconditionSchemaBindingKind = Exclude<\n\tGeneratedPostconditionBindingKind,\n\t'extension'\n>;\ntype GeneratedPostconditionTableChildKind = 'column' | 'index' | 'constraint';\n\n/** The canonical schema-scoped table parent of a managed table child. */\ntype GeneratedPostconditionTableParent = {\n\treadonly scope: 'schema';\n\treadonly engine: string;\n\treadonly database: string;\n\treadonly schema: string;\n\treadonly kind: 'table';\n\treadonly name: string;\n\treadonly parent?: never;\n\treadonly catalogueIdentity?: never;\n\treadonly qualifiedBy?: never;\n};\n\ntype GeneratedPostconditionSchemaRootAddress<\n\tK extends Exclude<\n\t\tGeneratedPostconditionSchemaBindingKind,\n\t\tGeneratedPostconditionTableChildKind\n\t>,\n> = Omit<ResourceAddress, 'engine' | 'schema' | 'parent' | 'kind'> & {\n\treadonly engine: string;\n\treadonly scope: 'schema';\n\treadonly schema: string;\n\treadonly parent?: never;\n\treadonly kind: K;\n};\n\ntype GeneratedPostconditionTableChildAddress<\n\tK extends GeneratedPostconditionTableChildKind,\n> = Omit<ResourceAddress, 'engine' | 'schema' | 'parent' | 'kind'> & {\n\treadonly engine: string;\n\treadonly scope: 'schema';\n\treadonly schema: string;\n\treadonly parent: GeneratedPostconditionTableParent;\n\treadonly kind: K;\n};\n\ntype GeneratedPostconditionExtensionAddress = Omit<\n\tResourceAddress,\n\t'engine' | 'schema' | 'parent' | 'kind'\n> & {\n\treadonly engine: string;\n\treadonly scope: 'database';\n\treadonly schema?: never;\n\treadonly parent?: never;\n\treadonly kind: 'extension';\n};\n\n/** The complete topology selected by a v3 managed-step binding. */\nexport type GeneratedPostconditionBindingAddress =\n\t| GeneratedPostconditionSchemaRootAddress<'table' | 'enum' | 'sequence'>\n\t| GeneratedPostconditionTableChildAddress<GeneratedPostconditionTableChildKind>\n\t| GeneratedPostconditionExtensionAddress;\n\n/** A v3 binding selected no live object, or selected a slot other than the one declared. */\nconst bindingResolutionFailures = new WeakSet<object>();\nconst bindingAddressReflectionFailures = new WeakMap<object, unknown>();\n\nexport class GeneratedPostconditionBindingResolutionError extends Error {\n\treadonly sought: string;\n\treadonly found: string;\n\n\tconstructor(\n\t\tinput: { readonly sought: string; readonly found: string },\n\t\toptions?: ErrorOptions,\n\t) {\n\t\tsuper(\n\t\t\t`generated postcondition binding did not resolve: sought ${input.sought}; found ${input.found}`,\n\t\t\toptions,\n\t\t);\n\t\tthis.name = 'GeneratedPostconditionBindingResolutionError';\n\t\tthis.sought = input.sought;\n\t\tthis.found = input.found;\n\t}\n}\n\nfunction bindingResolutionFailure(input: {\n\treadonly sought: string;\n\treadonly found: string;\n\treadonly cause?: unknown;\n}): GeneratedPostconditionBindingResolutionError {\n\tconst error = new GeneratedPostconditionBindingResolutionError(input, {\n\t\t...(input.cause === undefined ? {} : { cause: input.cause }),\n\t});\n\tbindingResolutionFailures.add(error);\n\treturn error;\n}\n\nfunction bindingAddressDescription(address: LedgerAddress): string {\n\ttry {\n\t\tconst captured = ownDataFields(address, ADDRESS_FIELDS);\n\t\tif (captured === undefined) return 'malformed address';\n\t\tconst parent = ownDataFields(captured.parent, ADDRESS_FIELDS)?.name;\n\t\treturn `${captured.scope} ${captured.engine}/${captured.database} ${captured.kind} ${captured.schema ?? '<database>'}.${parent ?? captured.name}`;\n\t} catch (error) {\n\t\tif (address !== null && typeof address === 'object')\n\t\t\tbindingAddressReflectionFailures.set(address, error);\n\t\treturn 'malformed address';\n\t}\n}\n\nfunction bindingAddressTopologyFailure(\n\taddress: LedgerAddress,\n): GeneratedPostconditionBindingResolutionError {\n\treturn bindingResolutionFailure({\n\t\tsought:\n\t\t\t'a resolvable generated postcondition address with canonical topology',\n\t\tfound: bindingAddressDescription(address),\n\t\t...(address !== null && typeof address === 'object'\n\t\t\t? { cause: bindingAddressReflectionFailures.get(address) }\n\t\t\t: {}),\n\t});\n}\n\nconst POSTGRESQL_ENGINE = 'postgresql';\nconst ADDRESS_FIELDS = [\n\t'scope',\n\t'engine',\n\t'database',\n\t'schema',\n\t'parent',\n\t'kind',\n\t'name',\n] as const;\n\n/** Capture a plain address once; no inherited value or accessor may cross this boundary. */\nfunction ownDataFields(\n\tvalue: unknown,\n\tfields: readonly string[],\n): Record<string, unknown> | undefined {\n\ttry {\n\t\tif (\n\t\t\tvalue === null ||\n\t\t\ttypeof value !== 'object' ||\n\t\t\tObject.getPrototypeOf(value) !== Object.prototype\n\t\t)\n\t\t\treturn;\n\t\tconst allowed = new Set(fields);\n\t\tconst names = Object.getOwnPropertyNames(value);\n\t\tif (\n\t\t\tObject.getOwnPropertySymbols(value).length > 0 ||\n\t\t\t!names.every((field) => allowed.has(field))\n\t\t)\n\t\t\treturn;\n\t\tconst captured: Record<string, unknown> = Object.create(null) as Record<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>;\n\t\tfor (const field of names) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, field);\n\t\t\tif (!descriptor?.enumerable || !('value' in descriptor)) return;\n\t\t\tcaptured[field] = descriptor.value;\n\t\t}\n\t\treturn captured;\n\t} catch (error) {\n\t\tif (value !== null && typeof value === 'object')\n\t\t\tbindingAddressReflectionFailures.set(value, error);\n\t\treturn;\n\t}\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n\treturn typeof value === 'string' && value.length > 0;\n}\n\nfunction canonicalGeneratedPostconditionTableParent(\n\taddress: LedgerAddress,\n): GeneratedPostconditionTableParent | undefined {\n\tconst captured = ownDataFields(address, ADDRESS_FIELDS);\n\tif (captured === undefined) return;\n\tconst parent = ownDataFields(captured.parent, ADDRESS_FIELDS);\n\tif (parent === undefined) {\n\t\tif (captured.parent !== null && typeof captured.parent === 'object') {\n\t\t\tconst cause = bindingAddressReflectionFailures.get(captured.parent);\n\t\t\tif (cause !== undefined)\n\t\t\t\tbindingAddressReflectionFailures.set(address, cause);\n\t\t}\n\t\treturn;\n\t}\n\tif (\n\t\t(parent.scope !== undefined && parent.scope !== 'schema') ||\n\t\tparent.engine !== POSTGRESQL_ENGINE ||\n\t\tparent.engine !== captured.engine ||\n\t\t!nonEmptyString(parent.database) ||\n\t\tparent.database !== captured.database ||\n\t\t!nonEmptyString(parent.schema) ||\n\t\tparent.schema !== captured.schema ||\n\t\tparent.kind !== 'table' ||\n\t\t!nonEmptyString(parent.name) ||\n\t\tparent.parent !== undefined\n\t)\n\t\treturn undefined;\n\treturn {\n\t\tscope: 'schema',\n\t\tengine: parent.engine,\n\t\tdatabase: parent.database,\n\t\tschema: parent.schema,\n\t\tkind: 'table',\n\t\tname: parent.name,\n\t};\n}\n\n/**\n * Narrows a ledger address into the complete topology that a v3 verifier can\n * bind. Ledger addresses are intentionally broader, so this boundary must\n * reject malformed persisted input before it reaches any verifier dispatch.\n */\nexport function toGeneratedPostconditionBindingAddress(\n\taddress: LedgerAddress,\n): GeneratedPostconditionBindingAddress {\n\tconst captured = ownDataFields(address, ADDRESS_FIELDS);\n\tif (captured === undefined) throw bindingAddressTopologyFailure(address);\n\tif (\n\t\t!nonEmptyString(captured.engine) ||\n\t\tcaptured.engine !== POSTGRESQL_ENGINE ||\n\t\t!nonEmptyString(captured.database) ||\n\t\t!nonEmptyString(captured.name)\n\t)\n\t\tthrow bindingAddressTopologyFailure(address);\n\tswitch (captured.kind) {\n\t\tcase 'table':\n\t\tcase 'enum':\n\t\tcase 'sequence':\n\t\t\tif (\n\t\t\t\tcaptured.scope !== 'schema' ||\n\t\t\t\t!nonEmptyString(captured.schema) ||\n\t\t\t\tcaptured.schema.length === 0 ||\n\t\t\t\tcaptured.parent !== undefined\n\t\t\t)\n\t\t\t\tthrow bindingAddressTopologyFailure(address);\n\t\t\treturn {\n\t\t\t\tengine: POSTGRESQL_ENGINE,\n\t\t\t\tdatabase: captured.database,\n\t\t\t\tscope: 'schema',\n\t\t\t\tschema: captured.schema,\n\t\t\t\tkind: captured.kind,\n\t\t\t\tname: captured.name,\n\t\t\t} satisfies GeneratedPostconditionBindingAddress;\n\t\tcase 'column':\n\t\tcase 'index':\n\t\tcase 'constraint': {\n\t\t\tif (captured.scope !== 'schema' || !nonEmptyString(captured.schema))\n\t\t\t\tthrow bindingAddressTopologyFailure(address);\n\t\t\tconst parent = canonicalGeneratedPostconditionTableParent(address);\n\t\t\tif (parent === undefined) throw bindingAddressTopologyFailure(address);\n\t\t\treturn {\n\t\t\t\tengine: POSTGRESQL_ENGINE,\n\t\t\t\tdatabase: captured.database,\n\t\t\t\tscope: 'schema',\n\t\t\t\tschema: captured.schema,\n\t\t\t\tparent,\n\t\t\t\tkind: captured.kind,\n\t\t\t\tname: captured.name,\n\t\t\t} satisfies GeneratedPostconditionBindingAddress;\n\t\t}\n\t\tcase 'extension':\n\t\t\tif (\n\t\t\t\tcaptured.scope !== 'database' ||\n\t\t\t\tcaptured.schema !== undefined ||\n\t\t\t\tcaptured.parent !== undefined\n\t\t\t)\n\t\t\t\tthrow bindingAddressTopologyFailure(address);\n\t\t\treturn {\n\t\t\t\tengine: POSTGRESQL_ENGINE,\n\t\t\t\tdatabase: captured.database,\n\t\t\t\tscope: 'database',\n\t\t\t\tkind: 'extension',\n\t\t\t\tname: captured.name,\n\t\t\t} satisfies GeneratedPostconditionBindingAddress;\n\t\tdefault:\n\t\t\tthrow bindingAddressTopologyFailure(address);\n\t}\n}\n\nfunction isBindingResolutionFailure(error: unknown): boolean {\n\treturn (\n\t\terror !== null &&\n\t\t(typeof error === 'object' || typeof error === 'function') &&\n\t\tbindingResolutionFailures.has(error)\n\t);\n}\n\ntype IndexProjection = {\n\treadonly schema: string;\n\treadonly table: string;\n\treadonly name: string;\n\treadonly method: string;\n\treadonly unique: boolean;\n\treadonly valid: boolean;\n\treadonly ready: boolean;\n\treadonly live: boolean;\n\treadonly nullsNotDistinct: boolean;\n\treadonly primary: boolean;\n\treadonly exclusion: boolean;\n\treadonly immediate: boolean;\n\treadonly constraintOwned: boolean;\n\treadonly keyColumns: readonly (string | null)[];\n\treadonly keyDefinitions: readonly string[];\n\treadonly includeColumns: readonly string[];\n\treadonly opclasses: readonly string[];\n\treadonly keyOptions: readonly string[];\n\treadonly reloptions: readonly string[];\n\treadonly predicate: string | null;\n};\n\ntype CheckProjection = {\n\treadonly expression: string;\n\treadonly validated: boolean;\n\treadonly noInherit: boolean;\n\treadonly enforced: boolean;\n\treadonly isLocal: boolean;\n\treadonly inheritanceCount: number;\n\treadonly parentId: number;\n};\n\ntype TableColumnProjection = {\n\treadonly name: string;\n\treadonly type: string;\n\treadonly nullable: boolean;\n\treadonly default: string | undefined;\n\t/** Ownership and canonical nextval shape read in the same catalogue snapshot. */\n\treadonly generatedSequenceDefault: boolean;\n\treadonly collation: string | null;\n\treadonly identity: 'always' | 'byDefault' | null;\n};\n\ntype TableProjection = {\n\treadonly columns: readonly TableColumnProjection[];\n};\n\ntype GeneratedColumnProjection = Omit<TableColumnProjection, 'name'>;\n\nlet scratchSequence = 0;\n\nfunction nextScratchName(kind: string): string {\n\tscratchSequence += 1;\n\treturn `dbsp_postcondition_${kind}_${Date.now()}_${scratchSequence}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport class GeneratedPostconditionReplanRequiredError extends Error {\n\treadonly code = 'REPLAN_REQUIRED';\n\treadonly diagnostic: Readonly<{\n\t\tversionSeen: unknown;\n\t\tstepIdentity: string | undefined;\n\t\tstructuralPath: string | undefined;\n\t}>;\n\treadonly structuralPath: string | undefined;\n\n\tconstructor(\n\t\tmessage: string,\n\t\tversionSeen: unknown = undefined,\n\t\tstepIdentity: string | undefined = undefined,\n\t\toptions?: ErrorOptions,\n\t\tstructuralPath: string | undefined = undefined,\n\t) {\n\t\tsuper(\n\t\t\t`${message}${structuralPath === undefined ? '' : ` at ${structuralPath}`}; REPLAN_REQUIRED (replan required): produce a version 3 postcondition`,\n\t\t\toptions,\n\t\t);\n\t\tthis.name = 'GeneratedPostconditionReplanRequiredError';\n\t\tgeneratedPostconditionReplanErrors.add(this);\n\t\tthis.structuralPath = structuralPath;\n\t\tthis.diagnostic = { versionSeen, stepIdentity, structuralPath };\n\t}\n}\n\nfunction structuralPathFrom(error: unknown): string | undefined {\n\tif (isGeneratedPostconditionV3DeclarationError(error))\n\t\treturn generatedPostconditionV3DeclarationStructuralPath(error);\n\tif (\n\t\terror !== null &&\n\t\t(typeof error === 'object' || typeof error === 'function') &&\n\t\tgeneratedPostconditionReplanErrors.has(error)\n\t)\n\t\treturn generatedPostconditionStructuralPath(\n\t\t\t(error as GeneratedPostconditionReplanRequiredError).structuralPath,\n\t\t);\n\treturn generatedPostconditionSnapshotStructuralPath(error);\n}\n\nfunction replan(\n\tmessage: string,\n\tversionSeen: unknown = undefined,\n\tstepIdentity: string | undefined = undefined,\n\tcause: unknown = undefined,\n): GeneratedPostconditionReplanRequiredError {\n\treturn new GeneratedPostconditionReplanRequiredError(\n\t\tmessage,\n\t\tversionSeen,\n\t\tstepIdentity,\n\t\tcause === undefined ? undefined : { cause },\n\t\tstructuralPathFrom(cause),\n\t);\n}\n\nfunction exactKeys(\n\tvalue: Record<string, unknown>,\n\tfields: readonly string[],\n): boolean {\n\tconst allowed = new Set(fields);\n\treturn Object.keys(value).every((field) => allowed.has(field));\n}\n\nfunction decodeTargetBinding(value: unknown, message: string): TargetBinding {\n\tif (!isRecord(value) || !exactKeys(value, ['bindingVersion', 'bindingKind']))\n\t\tthrow replan(message);\n\tif (\n\t\tvalue.bindingVersion !== 1 ||\n\t\tvalue.bindingKind !== 'managed-step-address'\n\t)\n\t\tthrow replan(message);\n\treturn { bindingVersion: 1, bindingKind: 'managed-step-address' };\n}\n\nfunction decodeV3GeneratedPostcondition(\n\tvalue: Record<string, unknown>,\n\t_versionSeen: unknown,\n\t_stepIdentity: string | undefined,\n): GeneratedPostconditionV3 {\n\tconst unsupported = 'generated v3 postcondition is unsupported';\n\tif (\n\t\t!exactKeys(value, [\n\t\t\t'postconditionVersion',\n\t\t\t'declaration',\n\t\t\t'targetBinding',\n\t\t]) ||\n\t\tvalue.postconditionVersion !== 3\n\t)\n\t\tthrow replan(unsupported);\n\tconst targetBinding = decodeTargetBinding(value.targetBinding, unsupported);\n\ttry {\n\t\treturn {\n\t\t\tpostconditionVersion: 3,\n\t\t\tdeclaration: parseGeneratedPostconditionV3Declaration(value.declaration),\n\t\t\ttargetBinding,\n\t\t};\n\t} catch (error) {\n\t\tthrow replan(unsupported, undefined, undefined, error);\n\t}\n}\n\n/**\n * Decode exactly one postcondition interpretation per version: only v3 is\n * accepted. v1/v2 and every other value are named REPLAN_REQUIRED outcomes.\n */\nexport function decodeGeneratedPostcondition(\n\tvalue: unknown,\n\tstepIdentity?: string,\n): GeneratedPostcondition {\n\tlet snapshot: unknown;\n\ttry {\n\t\tsnapshot = snapshotGeneratedPostconditionJson(value);\n\t} catch (error) {\n\t\tthrow replan(\n\t\t\t'generated postcondition format is unsupported',\n\t\t\tundefined,\n\t\t\tstepIdentity,\n\t\t\terror,\n\t\t);\n\t}\n\treturn decodeGeneratedPostconditionSnapshot(snapshot, stepIdentity);\n}\n\nfunction decodeGeneratedPostconditionSnapshot(\n\tvalue: unknown,\n\tstepIdentity?: string,\n): GeneratedPostcondition {\n\tif (!isRecord(value))\n\t\tthrow replan(\n\t\t\t'generated postcondition format is unsupported',\n\t\t\tundefined,\n\t\t\tstepIdentity,\n\t\t);\n\tconst postconditionVersion = value.postconditionVersion;\n\tif (postconditionVersion === 3) {\n\t\ttry {\n\t\t\tconst decoded = decodeV3GeneratedPostcondition(\n\t\t\t\tvalue,\n\t\t\t\tpostconditionVersion,\n\t\t\t\tstepIdentity,\n\t\t\t);\n\t\t\treturn decoded;\n\t\t} catch (error) {\n\t\t\tif (error instanceof GeneratedPostconditionReplanRequiredError)\n\t\t\t\tthrow new GeneratedPostconditionReplanRequiredError(\n\t\t\t\t\terror.message.replace(/; REPLAN_REQUIRED[\\s\\S]*$/, ''),\n\t\t\t\t\tpostconditionVersion,\n\t\t\t\t\tstepIdentity,\n\t\t\t\t\t{ cause: error },\n\t\t\t\t\terror.structuralPath,\n\t\t\t\t);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tthrow replan(\n\t\t'generated postcondition version is no longer interpretable',\n\t\tpostconditionVersion,\n\t\tstepIdentity,\n\t);\n}\n\n/**\n * The persisted digest is bound to the versioned wire value before decoding.\n * A digest minted for one version cannot authenticate another version body.\n */\nexport function decodeGeneratedPostconditionPayload(\n\tpayload: { readonly value: unknown; readonly digest: string },\n\tstepIdentity?: string,\n): GeneratedPostcondition {\n\tlet value: unknown;\n\ttry {\n\t\tvalue = snapshotGeneratedPostconditionJson(payload.value);\n\t} catch (error) {\n\t\tthrow new GeneratedPostconditionReplanRequiredError(\n\t\t\t'generated postcondition digest cannot be decoded',\n\t\t\tundefined,\n\t\t\tstepIdentity,\n\t\t\t{ cause: error },\n\t\t\tstructuralPathFrom(error),\n\t\t);\n\t}\n\tif (!isRecord(value) || typeof value.postconditionVersion !== 'number')\n\t\treturn decodeGeneratedPostconditionSnapshot(value, stepIdentity);\n\tlet expectedDigest: string;\n\ttry {\n\t\texpectedDigest = generatedPostconditionDigest(\n\t\t\tvalue as { readonly postconditionVersion: number },\n\t\t);\n\t} catch (error) {\n\t\tthrow new GeneratedPostconditionReplanRequiredError(\n\t\t\t'generated postcondition digest cannot be decoded',\n\t\t\tvalue.postconditionVersion,\n\t\t\tstepIdentity,\n\t\t\t{ cause: error },\n\t\t\tstructuralPathFrom(error),\n\t\t);\n\t}\n\tif (payload.digest !== expectedDigest)\n\t\tthrow replan(\n\t\t\t'generated postcondition digest is not paired with its versioned value',\n\t\t\tvalue.postconditionVersion,\n\t\t\tstepIdentity,\n\t\t);\n\treturn decodeGeneratedPostconditionSnapshot(value, stepIdentity);\n}\n\nfunction nullableStringList(value: unknown): readonly (string | null)[] {\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.some((item) => typeof item !== 'string' && item !== null)\n\t)\n\t\tthrow new Error(\n\t\t\t'generated index verifier could not read a complete projection',\n\t\t);\n\treturn value;\n}\n\nfunction projectionStringList(value: unknown): readonly string[] {\n\tif (!Array.isArray(value) || value.some((item) => typeof item !== 'string'))\n\t\tthrow new Error(\n\t\t\t'generated index verifier could not read a complete projection',\n\t\t);\n\treturn value;\n}\n\nfunction indexProjection(row: Record<string, unknown>): IndexProjection {\n\tif (\n\t\ttypeof row.schema_name !== 'string' ||\n\t\ttypeof row.table_name !== 'string' ||\n\t\ttypeof row.index_name !== 'string' ||\n\t\ttypeof row.method_name !== 'string' ||\n\t\ttypeof row.is_unique !== 'boolean' ||\n\t\ttypeof row.is_valid !== 'boolean' ||\n\t\ttypeof row.is_ready !== 'boolean' ||\n\t\ttypeof row.is_live !== 'boolean' ||\n\t\ttypeof row.nulls_not_distinct !== 'boolean' ||\n\t\ttypeof row.is_primary !== 'boolean' ||\n\t\ttypeof row.is_exclusion !== 'boolean' ||\n\t\ttypeof row.is_immediate !== 'boolean' ||\n\t\ttypeof row.is_constraint_owned !== 'boolean' ||\n\t\t!Number.isInteger(row.key_count) ||\n\t\t(typeof row.predicate_expression !== 'string' &&\n\t\t\trow.predicate_expression !== null)\n\t)\n\t\tthrow new Error(\n\t\t\t'generated index verifier could not read a complete projection',\n\t\t);\n\treturn {\n\t\tschema: row.schema_name,\n\t\ttable: row.table_name,\n\t\tname: row.index_name,\n\t\tmethod: row.method_name,\n\t\tunique: row.is_unique,\n\t\tvalid: row.is_valid,\n\t\tready: row.is_ready,\n\t\tlive: row.is_live,\n\t\tnullsNotDistinct: row.nulls_not_distinct,\n\t\tprimary: row.is_primary,\n\t\texclusion: row.is_exclusion,\n\t\timmediate: row.is_immediate,\n\t\tconstraintOwned: row.is_constraint_owned,\n\t\tkeyColumns: nullableStringList(row.key_columns),\n\t\tkeyDefinitions: projectionStringList(row.key_definitions),\n\t\tincludeColumns: projectionStringList(row.include_columns),\n\t\topclasses: projectionStringList(row.opclasses),\n\t\tkeyOptions: projectionStringList(row.key_options),\n\t\treloptions: [...projectionStringList(row.reloptions)].sort(),\n\t\tpredicate: row.predicate_expression,\n\t};\n}\n\nconst INDEX_PROJECTION_SELECT =\n\t\"SELECT pg_catalog.current_database() AS database_name, relation.relkind AS parent_relation_kind, index_relation.relkind AS relation_kind, relation.oid::text AS relation_oid, index_relation.oid::text AS object_oid, namespace.nspname AS schema_name, relation.relname AS table_name, index_relation.relname AS index_name, access_method.amname AS method_name, index_meta.indisunique AS is_unique, index_meta.indisvalid AS is_valid, index_meta.indisready AS is_ready, index_meta.indislive AS is_live, index_meta.indisprimary AS is_primary, index_meta.indisexclusion AS is_exclusion, index_meta.indimmediate AS is_immediate, constraint_item.oid IS NOT NULL AS is_constraint_owned, CASE WHEN index_meta_json.value ? 'indnullsnotdistinct' THEN (index_meta_json.value ->> 'indnullsnotdistinct')::boolean ELSE false END AS nulls_not_distinct, CASE WHEN index_meta_json.value ? 'indnkeyatts' THEN (index_meta_json.value ->> 'indnkeyatts')::integer ELSE index_meta.indnatts END AS key_count, ARRAY(SELECT attribute.attname::text FROM unnest(index_meta.indkey) WITH ORDINALITY AS key_column(attnum, position) LEFT JOIN pg_catalog.pg_attribute attribute ON attribute.attrelid = index_meta.indrelid AND attribute.attnum = key_column.attnum WHERE key_column.position <= CASE WHEN index_meta_json.value ? 'indnkeyatts' THEN (index_meta_json.value ->> 'indnkeyatts')::integer ELSE index_meta.indnatts END ORDER BY key_column.position) AS key_columns, ARRAY(SELECT pg_catalog.pg_get_indexdef(index_meta.indexrelid, key_position, false) FROM pg_catalog.generate_series(1, CASE WHEN index_meta_json.value ? 'indnkeyatts' THEN (index_meta_json.value ->> 'indnkeyatts')::integer ELSE index_meta.indnatts END) AS key_position ORDER BY key_position) AS key_definitions, ARRAY(SELECT attribute.attname::text FROM unnest(index_meta.indkey) WITH ORDINALITY AS include_column(attnum, position) JOIN pg_catalog.pg_attribute attribute ON attribute.attrelid = index_meta.indrelid AND attribute.attnum = include_column.attnum WHERE include_column.position > CASE WHEN index_meta_json.value ? 'indnkeyatts' THEN (index_meta_json.value ->> 'indnkeyatts')::integer ELSE index_meta.indnatts END ORDER BY include_column.position) AS include_columns, ARRAY(SELECT opclass.opcname::text FROM unnest(index_meta.indclass) WITH ORDINALITY AS index_opclass(opclass_oid, position) JOIN pg_catalog.pg_opclass opclass ON opclass.oid = index_opclass.opclass_oid WHERE index_opclass.position <= CASE WHEN index_meta_json.value ? 'indnkeyatts' THEN (index_meta_json.value ->> 'indnkeyatts')::integer ELSE index_meta.indnatts END ORDER BY index_opclass.position) AS opclasses, ARRAY(SELECT index_option.option::text FROM unnest(index_meta.indoption) WITH ORDINALITY AS index_option(option, position) WHERE index_option.position <= CASE WHEN index_meta_json.value ? 'indnkeyatts' THEN (index_meta_json.value ->> 'indnkeyatts')::integer ELSE index_meta.indnatts END ORDER BY index_option.position) AS key_options, COALESCE(index_relation.reloptions, ARRAY[]::text[]) AS reloptions, pg_catalog.pg_get_expr(index_meta.indpred, index_meta.indrelid, false) AS predicate_expression FROM pg_catalog.pg_index index_meta CROSS JOIN LATERAL (SELECT pg_catalog.to_jsonb(index_meta) AS value) index_meta_json JOIN pg_catalog.pg_class relation ON relation.oid = index_meta.indrelid JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace JOIN pg_catalog.pg_class index_relation ON index_relation.oid = index_meta.indexrelid JOIN pg_catalog.pg_am access_method ON access_method.oid = index_relation.relam LEFT JOIN pg_catalog.pg_constraint constraint_item ON constraint_item.conindid = index_meta.indexrelid\";\n\n/**\n * The parent table lock protects the table while the index proof runs, but it\n * cannot lock an index relation. Bind the index and project its structure in\n * this one catalogue statement so a rename cannot split those observations.\n */\nasync function stabilizeGeneratedIndexBindingAndProjection(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly targetBinding: TargetBinding;\n\treadonly address: GeneratedPostconditionBindingAddress;\n}): Promise<{\n\treadonly target: GeneratedPostconditionTarget;\n\treadonly projection: IndexProjection;\n}> {\n\tif (\n\t\tinput.targetBinding.bindingVersion !== 1 ||\n\t\tinput.targetBinding.bindingKind !== 'managed-step-address'\n\t)\n\t\tthrow replan('generated postcondition target binding is unsupported');\n\tconst slot = bindingSlot(input.address, 'index');\n\tif (slot.found !== undefined)\n\t\tthrow bindingResolutionFailure({\n\t\t\tsought: slot.sought,\n\t\t\tfound: slot.found,\n\t\t});\n\tif (slot.stabilizationRelation)\n\t\ttry {\n\t\t\tawait lockPgRelation(input.session, slot.stabilizationRelation);\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror instanceof PgResolvableRelationLockError &&\n\t\t\t\tisRecord(error.cause) &&\n\t\t\t\terror.cause.code === '42P01'\n\t\t\t)\n\t\t\t\tthrow bindingResolutionFailure({\n\t\t\t\t\tsought: slot.sought,\n\t\t\t\t\tfound: 'absent',\n\t\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\tconst row = (\n\t\tawait input.session.query(\n\t\t\t`${INDEX_PROJECTION_SELECT} WHERE namespace.nspname = $1 AND index_relation.relname = $2`,\n\t\t\t[slot.target.schema, slot.target.name],\n\t\t)\n\t).rows[0];\n\tif (!row || row.database_name !== input.address.database)\n\t\tthrow bindingResolutionFailure({\n\t\t\tsought: slot.sought,\n\t\t\tfound: !row ? 'absent' : `database ${String(row.database_name)}`,\n\t\t});\n\tconst found = relationBindingFound('index', slot.target, row);\n\tif (found !== undefined)\n\t\tthrow bindingResolutionFailure({\n\t\t\tsought: slot.sought,\n\t\t\tfound,\n\t\t});\n\treturn {\n\t\ttarget: bindingIdentity('index', slot.target, row),\n\t\tprojection: indexProjection(row),\n\t};\n}\n\nasync function readScratchIndexProjection(\n\tsession: GeneratedPostconditionSession,\n\ttable: string,\n\tindex: string,\n): Promise<IndexProjection> {\n\tconst row = (\n\t\tawait session.query(\n\t\t\t`${INDEX_PROJECTION_SELECT} WHERE relation.oid = $1::pg_catalog.regclass AND index_relation.relname = $2`,\n\t\t\t[table, index],\n\t\t)\n\t).rows[0];\n\tif (!row)\n\t\tthrow new Error('generated index verifier could not read staged index');\n\treturn indexProjection(row);\n}\n\nasync function scratchScope<T>(\n\tsession: GeneratedPostconditionSession,\n\twork: () => Promise<T>,\n): Promise<T> {\n\tconst savepoint = nextScratchName('scope');\n\tlet savepointActive = false;\n\tlet transactionStarted = false;\n\tlet result!: T;\n\tlet workError: unknown;\n\tlet workFailed = false;\n\ttry {\n\t\ttry {\n\t\t\tawait session.query(`SAVEPOINT ${quoteIdent(savepoint, 'table')}`);\n\t\t\tsavepointActive = true;\n\t\t} catch (error) {\n\t\t\tif (!isRecord(error) || error.code !== '25P01') throw error;\n\t\t\tawait session.query('BEGIN');\n\t\t\ttransactionStarted = true;\n\t\t\tawait session.query(`SAVEPOINT ${quoteIdent(savepoint, 'table')}`);\n\t\t\tsavepointActive = true;\n\t\t}\n\t\tconst lockTimeoutMs =\n\t\t\tgeneratedPostconditionSessionLockTimeouts.get(session);\n\t\tif (lockTimeoutMs !== undefined || transactionStarted)\n\t\t\tawait session.query(\n\t\t\t\t`SET LOCAL lock_timeout = '${lockTimeoutMs ?? DEFAULT_DDL_LOCK_TIMEOUT_MS}ms'`,\n\t\t\t);\n\t\tresult = await work();\n\t} catch (error) {\n\t\tworkFailed = true;\n\t\tworkError = error;\n\t}\n\tconst cleanupErrors: unknown[] = [];\n\tconst cleanup = async (sql: string) => {\n\t\ttry {\n\t\t\tawait session.query(sql);\n\t\t} catch (error) {\n\t\t\tcleanupErrors.push(error);\n\t\t}\n\t};\n\tif (savepointActive) {\n\t\tawait cleanup(`ROLLBACK TO SAVEPOINT ${quoteIdent(savepoint, 'table')}`);\n\t\tawait cleanup(`RELEASE SAVEPOINT ${quoteIdent(savepoint, 'table')}`);\n\t}\n\tif (transactionStarted) await cleanup('ROLLBACK');\n\tif (workFailed && cleanupErrors.length > 0)\n\t\tthrow new AggregateError(\n\t\t\t[workError, ...cleanupErrors],\n\t\t\t'generated postcondition verification failed and scratch cleanup failed',\n\t\t);\n\tif (workFailed) {\n\t\tif (\n\t\t\tisStructuralMismatchFailure(workError) ||\n\t\t\tisScratchRollbackSafeFailure(workError) ||\n\t\t\tisBindingResolutionFailure(workError)\n\t\t)\n\t\t\tmarkCleanScratchFailure(workError, session);\n\t\tthrow workError;\n\t}\n\tif (cleanupErrors.length > 0)\n\t\tthrow new AggregateError(\n\t\t\tcleanupErrors,\n\t\t\t'generated postcondition scratch cleanup failed',\n\t\t);\n\treturn result;\n}\n\nfunction sameIndexStructure(\n\tleft: IndexProjection,\n\tright: IndexProjection,\n): boolean {\n\treturn (\n\t\tleft.method === right.method &&\n\t\tleft.unique === right.unique &&\n\t\tleft.valid === right.valid &&\n\t\tleft.ready === right.ready &&\n\t\tleft.live === right.live &&\n\t\tleft.nullsNotDistinct === right.nullsNotDistinct &&\n\t\tleft.primary === right.primary &&\n\t\tleft.exclusion === right.exclusion &&\n\t\tleft.immediate === right.immediate &&\n\t\tleft.constraintOwned === right.constraintOwned &&\n\t\tJSON.stringify(left.keyColumns) === JSON.stringify(right.keyColumns) &&\n\t\tJSON.stringify(left.keyDefinitions) ===\n\t\t\tJSON.stringify(right.keyDefinitions) &&\n\t\tJSON.stringify(left.includeColumns) ===\n\t\t\tJSON.stringify(right.includeColumns) &&\n\t\tJSON.stringify(left.opclasses) === JSON.stringify(right.opclasses) &&\n\t\tJSON.stringify(left.keyOptions) === JSON.stringify(right.keyOptions) &&\n\t\tJSON.stringify([...left.reloptions].sort()) ===\n\t\t\tJSON.stringify([...right.reloptions].sort()) &&\n\t\tleft.predicate === right.predicate\n\t);\n}\n\nfunction indexSource(expected: GeneratedIndexPostcondition, name: string) {\n\treturn {\n\t\tname,\n\t\tcolumns: expected.columns,\n\t\tunique: expected.unique,\n\t\tmethod: expected.method,\n\t\t...(expected.expressions === undefined\n\t\t\t? {}\n\t\t\t: { expressions: expected.expressions }),\n\t\t...(expected.include === undefined ? {} : { include: expected.include }),\n\t\tnullsNotDistinct: expected.nullsNotDistinct,\n\t\t...(expected.opclass === undefined ? {} : { opclass: expected.opclass }),\n\t\t...(expected.with === undefined ? {} : { with: expected.with }),\n\t\t...(expected.where === undefined ? {} : { where: expected.where }),\n\t};\n}\n\nfunction requireGeneratedPostconditionSession(\n\tvalue: unknown,\n): GeneratedPostconditionSession {\n\tif (!value || typeof value !== 'object')\n\t\tthrow new Error(\n\t\t\t'generated postcondition verifier requires an adapter-minted exclusive session capability',\n\t\t);\n\tconst state = generatedPostconditionSessionStates.get(value);\n\tif (!state)\n\t\tthrow new Error(\n\t\t\t'generated postcondition verifier requires an adapter-minted exclusive session capability',\n\t\t);\n\tif (!state.active) throw new GeneratedPostconditionSessionDeactivatedError();\n\treturn value as GeneratedPostconditionSession;\n}\n\nfunction markCleanScratchFailure(\n\terror: unknown,\n\tcapability: GeneratedPostconditionSession,\n): void {\n\tif (\n\t\terror !== null &&\n\t\t(typeof error === 'object' || typeof error === 'function')\n\t)\n\t\tcleanScratchFailures.set(error, safeFailure(capability));\n}\n\nfunction safeFailure(\n\tcapability: GeneratedPostconditionSession,\n): GeneratedPostconditionSafeFailure {\n\treturn {\n\t\tcapability,\n\t\tqueryCountAtMark: generatedPostconditionQueryCounts.get(capability) ?? 0,\n\t};\n}\n\nfunction isSafeGeneratedPostconditionFailure(\n\terror: unknown,\n\tcapability: GeneratedPostconditionSession | undefined,\n): boolean {\n\tif (\n\t\terror === null ||\n\t\t(typeof error !== 'object' && typeof error !== 'function')\n\t)\n\t\treturn false;\n\tconst watermark =\n\t\tcleanScratchFailures.get(error) ?? preQueryFailures.get(error);\n\tif (!watermark || watermark.capability !== capability) return false;\n\tconst state = generatedPostconditionSessionStates.get(watermark.capability);\n\treturn (\n\t\t!state?.proofInFlight &&\n\t\tstate?.queriesInFlight === 0 &&\n\t\tstate.queriesOutsideProof === 0 &&\n\t\t(generatedPostconditionQueryCounts.get(watermark.capability) ?? 0) ===\n\t\t\twatermark.queryCountAtMark\n\t);\n}\n\nfunction structuralMismatch(message: string): Error {\n\tconst error = new Error(message);\n\tstructuralMismatchFailures.add(error);\n\treturn error;\n}\n\n/**\n * Refusal text is an operator diagnostic, not a SQL/deparse transport. Keep\n * expected and live facts out of it: authored defaults can contain secrets.\n */\nfunction structuralMismatchField(\n\ttarget: string,\n\tfield: string,\n\tsummary: 'count' | 'value' = 'value',\n): Error {\n\treturn structuralMismatch(\n\t\t`generated ${target} structural postcondition differs at ${field}: ${summary} mismatch (values redacted)`,\n\t);\n}\n\nfunction isStructuralMismatchFailure(error: unknown): boolean {\n\treturn (\n\t\terror !== null &&\n\t\t(typeof error === 'object' || typeof error === 'function') &&\n\t\tstructuralMismatchFailures.has(error)\n\t);\n}\n\nfunction isScratchRollbackSafeFailure(error: unknown): boolean {\n\treturn (\n\t\terror !== null &&\n\t\t(typeof error === 'object' || typeof error === 'function') &&\n\t\tscratchRollbackSafeFailures.has(error)\n\t);\n}\n\nasync function withGeneratedPostconditionProof<T>(\n\tinput: GeneratedPostconditionSession,\n\twork: (session: GeneratedPostconditionSession) => Promise<T>,\n): Promise<T> {\n\tconst session = requireGeneratedPostconditionSession(input);\n\tconst state = generatedPostconditionSessionStates.get(session);\n\tif (!state)\n\t\tthrow new Error('generated postcondition session state is absent');\n\t// Public v3 entrypoints own one scope containing decoding, binding, locks,\n\t// and structure. Internal proof helpers may be reused without opening a\n\t// second scope on that same capability.\n\tif (state.proofInFlight) throw new GeneratedPostconditionProofInFlightError();\n\tstate.proofInFlight = true;\n\tconst queryCount = generatedPostconditionQueryCounts.get(session) ?? 0;\n\tlet proofQueryCount = queryCount;\n\tlet workError: unknown;\n\tlet workErrorQueryCount = queryCount;\n\ttry {\n\t\t// scratchScope owns a rollback-only transaction only when this exclusive\n\t\t// session is otherwise transactionless. It therefore also holds relation\n\t\t// locks through binding and structural proof, without taking ownership of\n\t\t// an enclosing DDL transaction.\n\t\treturn await scratchScope(session, () => {\n\t\t\tproofQueryCount = generatedPostconditionQueryCounts.get(session) ?? 0;\n\t\t\treturn work(session).catch((error: unknown) => {\n\t\t\t\tworkError = error;\n\t\t\t\tworkErrorQueryCount =\n\t\t\t\t\tgeneratedPostconditionQueryCounts.get(session) ?? 0;\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t});\n\t} catch (error) {\n\t\tif (\n\t\t\tisStructuralMismatchFailure(error) ||\n\t\t\t(error === workError && workErrorQueryCount === proofQueryCount)\n\t\t)\n\t\t\tmarkSafePreQueryFailure(error, session);\n\t\tthrow error;\n\t} finally {\n\t\tstate.proofInFlight = false;\n\t}\n}\n\nfunction markSafePreQueryFailure(\n\terror: unknown,\n\tcapability: GeneratedPostconditionSession,\n): void {\n\tif (\n\t\terror !== null &&\n\t\t(typeof error === 'object' || typeof error === 'function')\n\t)\n\t\tpreQueryFailures.set(error, safeFailure(capability));\n}\n\n/** Refuse structural lookalikes before any proof or catalogue read. */\nexport function assertGeneratedPostconditionSession(\n\tvalue: unknown,\n): GeneratedPostconditionSession {\n\treturn requireGeneratedPostconditionSession(value);\n}\n\nfunction bindingSlot(\n\taddress: GeneratedPostconditionBindingAddress,\n\texpectedKind: GeneratedPostconditionBindingKind,\n): {\n\treadonly target: GeneratedPostconditionTarget;\n\treadonly sought: string;\n\treadonly found: string | undefined;\n\treadonly stabilizationRelation?: {\n\t\treadonly schema: string;\n\t\treadonly table: string;\n\t};\n} {\n\tconst schema = address.schema;\n\tconst parent = address.parent;\n\tconst parentSchema = parent?.schema;\n\tconst parentName = parent?.name;\n\tconst parentScope = parent\n\t\t? (parent as ResourceAddress & { readonly scope?: unknown }).scope\n\t\t: undefined;\n\tconst name = address.name;\n\tconst scope = address.scope;\n\tconst expected = `${expectedKind} ${schema ?? '<database>'}.${parentName ?? name}${expectedKind === 'table' || expectedKind === 'enum' || expectedKind === 'sequence' || expectedKind === 'extension' ? '' : `.${name}`}`;\n\tconst requiresTableParent =\n\t\texpectedKind === 'column' ||\n\t\texpectedKind === 'index' ||\n\t\texpectedKind === 'constraint';\n\tconst schemaScoped = expectedKind !== 'extension';\n\tconst parentMatches =\n\t\tparent !== undefined &&\n\t\tparent.engine === address.engine &&\n\t\tparent.database === address.database &&\n\t\t(parentScope === undefined || parentScope === scope) &&\n\t\tparentSchema === schema &&\n\t\tparent.kind === 'table' &&\n\t\tparent.parent === undefined;\n\tif (\n\t\taddress.engine !== 'postgresql' ||\n\t\taddress.kind !== expectedKind ||\n\t\t(schemaScoped && (scope !== 'schema' || !schema)) ||\n\t\t(!schemaScoped && (scope !== 'database' || schema !== undefined)) ||\n\t\t(requiresTableParent && !parentMatches) ||\n\t\t(!requiresTableParent && parent !== undefined)\n\t)\n\t\treturn {\n\t\t\ttarget: {\n\t\t\t\tschema: schema ?? '',\n\t\t\t\ttable: parentName ?? '',\n\t\t\t\tname,\n\t\t\t},\n\t\t\tsought: expected,\n\t\t\tfound: `${address.engine}/${address.database} ${address.kind} ${schema ?? '<missing-schema>'}.${parentName ?? name}`,\n\t\t};\n\treturn {\n\t\ttarget: {\n\t\t\tschema: schema ?? '',\n\t\t\ttable:\n\t\t\t\texpectedKind === 'table' ||\n\t\t\t\texpectedKind === 'enum' ||\n\t\t\t\texpectedKind === 'sequence' ||\n\t\t\t\texpectedKind === 'extension'\n\t\t\t\t\t? name\n\t\t\t\t\t: (parentName ?? ''),\n\t\t\tname,\n\t\t},\n\t\tsought: expected,\n\t\tfound: undefined,\n\t\t...(expectedKind === 'enum' ||\n\t\texpectedKind === 'sequence' ||\n\t\texpectedKind === 'extension'\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tstabilizationRelation: {\n\t\t\t\t\t\tschema: schema!,\n\t\t\t\t\t\ttable: requiresTableParent ? parentName! : name,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t};\n}\n\nfunction relationBindingFound(\n\tkind: GeneratedPostconditionBindingKind,\n\ttarget: GeneratedPostconditionTarget,\n\trow: Record<string, unknown> | undefined,\n): string | undefined {\n\tif (!row) return 'absent';\n\tconst relationKind = row.relation_kind;\n\tif (kind === 'table')\n\t\treturn relationKind === 'r' || relationKind === 'p'\n\t\t\t? undefined\n\t\t\t: `relation ${target.schema}.${target.table} (relkind ${String(relationKind)})`;\n\tif (kind === 'column') {\n\t\tif (relationKind !== 'r' && relationKind !== 'p')\n\t\t\treturn `relation ${target.schema}.${target.table} (relkind ${String(relationKind)})`;\n\t\tif (row.column_name === null || row.column_name === undefined)\n\t\t\treturn 'absent';\n\t\treturn row.column_name === target.name\n\t\t\t? undefined\n\t\t\t: `column ${target.schema}.${target.table}.${String(row.column_name)}`;\n\t}\n\tif (kind === 'index') {\n\t\tif (relationKind !== 'i' && relationKind !== 'I')\n\t\t\treturn `relation ${target.schema}.${target.name} (relkind ${String(relationKind)})`;\n\t\tif (row.parent_relation_kind !== 'r' && row.parent_relation_kind !== 'p')\n\t\t\treturn `relation ${target.schema}.${target.table} (relkind ${String(row.parent_relation_kind)})`;\n\t\treturn row.table_name === target.table\n\t\t\t? undefined\n\t\t\t: `index ${target.schema}.${String(row.table_name)}.${target.name}`;\n\t}\n\tif (relationKind !== 'r' && relationKind !== 'p')\n\t\treturn `relation ${target.schema}.${target.table} (relkind ${String(relationKind)})`;\n\treturn row.constraint_name === target.name\n\t\t? undefined\n\t\t: `constraint ${target.schema}.${target.table}.${String(row.constraint_name)}`;\n}\n\nfunction bindingIdentity(\n\tkind: GeneratedPostconditionBindingKind,\n\ttarget: GeneratedPostconditionTarget,\n\trow: Record<string, unknown>,\n): GeneratedPostconditionTarget {\n\tconst relationOid = row.relation_oid;\n\tconst objectOid = row.object_oid;\n\tif (typeof relationOid !== 'string' && typeof relationOid !== 'number')\n\t\tthrow new Error(\n\t\t\t'generated postcondition binding did not return a relation identity',\n\t\t);\n\tif (\n\t\t(kind === 'index' ||\n\t\t\tkind === 'constraint' ||\n\t\t\tkind === 'enum' ||\n\t\t\tkind === 'extension') &&\n\t\ttypeof objectOid !== 'string' &&\n\t\ttypeof objectOid !== 'number'\n\t)\n\t\tthrow new Error(\n\t\t\t'generated postcondition binding did not return an object identity',\n\t\t);\n\tif (kind === 'column' && !Number.isInteger(row.attribute_number))\n\t\tthrow new Error(\n\t\t\t'generated postcondition binding did not return an attribute identity',\n\t\t);\n\treturn {\n\t\t...target,\n\t\trelationOid: String(relationOid),\n\t\t...(objectOid === undefined ? {} : { objectOid: String(objectOid) }),\n\t\t...(typeof row.attribute_number === 'number'\n\t\t\t? { attributeNumber: row.attribute_number }\n\t\t\t: {}),\n\t};\n}\n\n/**\n * Resolves the complete managed-step address after its user-relation lock is\n * held. This helper is deliberately unscoped: only public verifier entries may\n * open a proof bracket.\n */\nasync function resolveGeneratedPostconditionBinding(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly targetBinding: TargetBinding;\n\treadonly address: GeneratedPostconditionBindingAddress;\n\treadonly expectedKind: ResolvableGeneratedPostconditionKind;\n}): Promise<GeneratedPostconditionTarget> {\n\tconst session = input.session;\n\tif (\n\t\tinput.targetBinding.bindingVersion !== 1 ||\n\t\tinput.targetBinding.bindingKind !== 'managed-step-address'\n\t)\n\t\tthrow replan('generated postcondition target binding is unsupported');\n\tconst slot = bindingSlot(input.address, input.expectedKind);\n\tif (slot.found !== undefined)\n\t\tthrow bindingResolutionFailure({\n\t\t\tsought: slot.sought,\n\t\t\tfound: slot.found,\n\t\t});\n\tconst { target } = slot;\n\tlet row: Record<string, unknown> | undefined;\n\tif (input.expectedKind === 'table')\n\t\trow = (\n\t\t\tawait session.query(\n\t\t\t\t`SELECT pg_catalog.current_database() AS database_name, relation.relkind AS relation_kind, relation.oid::text AS relation_oid FROM pg_catalog.pg_class relation JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace WHERE namespace.nspname = $1 AND relation.relname = $2`,\n\t\t\t\t[target.schema, target.table],\n\t\t\t)\n\t\t).rows[0];\n\telse if (input.expectedKind === 'column')\n\t\trow = (\n\t\t\tawait session.query(\n\t\t\t\t`SELECT pg_catalog.current_database() AS database_name, relation.relkind AS relation_kind, relation.oid::text AS relation_oid, attribute.attname AS column_name, attribute.attnum AS attribute_number FROM pg_catalog.pg_namespace namespace JOIN pg_catalog.pg_class relation ON relation.relnamespace = namespace.oid LEFT JOIN pg_catalog.pg_attribute attribute ON attribute.attrelid = relation.oid AND attribute.attname = $3 AND attribute.attnum > 0 AND NOT attribute.attisdropped WHERE namespace.nspname = $1 AND relation.relname = $2`,\n\t\t\t\t[target.schema, target.table, target.name],\n\t\t\t)\n\t\t).rows[0];\n\telse if (input.expectedKind === 'constraint')\n\t\trow = (\n\t\t\tawait session.query(\n\t\t\t\t`SELECT pg_catalog.current_database() AS database_name, relation.relkind AS relation_kind, relation.oid::text AS relation_oid, constraint_item.oid::text AS object_oid, constraint_item.conname AS constraint_name FROM pg_catalog.pg_constraint constraint_item JOIN pg_catalog.pg_class relation ON relation.oid = constraint_item.conrelid JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace WHERE namespace.nspname = $1 AND relation.relname = $2 AND constraint_item.conname = $3`,\n\t\t\t\t[target.schema, target.table, target.name],\n\t\t\t)\n\t\t).rows[0];\n\tif (!row || row.database_name !== input.address.database) {\n\t\tconst failure = bindingResolutionFailure({\n\t\t\tsought: slot.sought,\n\t\t\tfound: !row ? 'absent' : `database ${String(row.database_name)}`,\n\t\t});\n\t\tthrow failure;\n\t}\n\tconst found = relationBindingFound(input.expectedKind, target, row);\n\tif (found !== undefined) {\n\t\tconst failure = bindingResolutionFailure({\n\t\t\tsought: slot.sought,\n\t\t\tfound,\n\t\t});\n\t\tthrow failure;\n\t}\n\treturn bindingIdentity(input.expectedKind, target, row);\n}\n\n/**\n * These identity-only kinds cannot be stabilized by a user relation lock.\n * Select their name, subtype, and identity in one catalogue statement instead\n * of resolving a name and then re-reading it in a separate snapshot.\n */\nasync function resolveGeneratedPostconditionIdentityBinding(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly targetBinding: TargetBinding;\n\treadonly address: GeneratedPostconditionBindingAddress;\n\treadonly expectedKind: 'enum' | 'sequence' | 'extension';\n}): Promise<GeneratedPostconditionTarget> {\n\tif (\n\t\tinput.targetBinding.bindingVersion !== 1 ||\n\t\tinput.targetBinding.bindingKind !== 'managed-step-address'\n\t)\n\t\tthrow replan('generated postcondition target binding is unsupported');\n\tconst slot = bindingSlot(input.address, input.expectedKind);\n\tif (slot.found !== undefined)\n\t\tthrow bindingResolutionFailure({ sought: slot.sought, found: slot.found });\n\tconst row = (\n\t\tawait input.session.query(\n\t\t\tinput.expectedKind === 'enum'\n\t\t\t\t? `SELECT pg_catalog.current_database() AS database_name, type_item.oid::text AS relation_oid, type_item.oid::text AS object_oid, 'e'::text AS relation_kind FROM pg_catalog.pg_type type_item JOIN pg_catalog.pg_namespace namespace ON namespace.oid = type_item.typnamespace WHERE namespace.nspname = $1 AND type_item.typname = $2 AND type_item.typtype = 'e'`\n\t\t\t\t: input.expectedKind === 'sequence'\n\t\t\t\t\t? `SELECT pg_catalog.current_database() AS database_name, relation.oid::text AS relation_oid, relation.oid::text AS object_oid, relation.relkind AS relation_kind FROM pg_catalog.pg_class relation JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace WHERE namespace.nspname = $1 AND relation.relname = $2`\n\t\t\t\t\t: `SELECT pg_catalog.current_database() AS database_name, extension.oid::text AS relation_oid, extension.oid::text AS object_oid, 'x'::text AS relation_kind FROM pg_catalog.pg_extension extension WHERE extension.extname = $1`,\n\t\t\tinput.expectedKind === 'extension'\n\t\t\t\t? [slot.target.name]\n\t\t\t\t: [slot.target.schema, slot.target.name],\n\t\t)\n\t).rows[0];\n\tif (!row || row.database_name !== input.address.database)\n\t\tthrow bindingResolutionFailure({\n\t\t\tsought: slot.sought,\n\t\t\tfound: !row ? 'absent' : `database ${String(row.database_name)}`,\n\t\t});\n\tconst expectedRelationKind =\n\t\tinput.expectedKind === 'enum'\n\t\t\t? 'e'\n\t\t\t: input.expectedKind === 'sequence'\n\t\t\t\t? 'S'\n\t\t\t\t: 'x';\n\tif (row.relation_kind !== expectedRelationKind)\n\t\tthrow bindingResolutionFailure({ sought: slot.sought, found: 'absent' });\n\treturn bindingIdentity(input.expectedKind, slot.target, row);\n}\n\n/** One lock acquisition, then one complete identity resolution under that lock. */\nasync function stabilizeGeneratedPostconditionBinding(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly targetBinding: TargetBinding;\n\treadonly address: GeneratedPostconditionBindingAddress;\n\treadonly expectedKind: ResolvableGeneratedPostconditionKind;\n}): Promise<GeneratedPostconditionTarget> {\n\tif (\n\t\tinput.targetBinding.bindingVersion !== 1 ||\n\t\tinput.targetBinding.bindingKind !== 'managed-step-address'\n\t)\n\t\tthrow replan('generated postcondition target binding is unsupported');\n\tconst slot = bindingSlot(input.address, input.expectedKind);\n\tif (slot.found !== undefined)\n\t\tthrow bindingResolutionFailure({\n\t\t\tsought: slot.sought,\n\t\t\tfound: slot.found,\n\t\t});\n\tif (slot.stabilizationRelation)\n\t\ttry {\n\t\t\tawait lockPgRelation(input.session, slot.stabilizationRelation);\n\t\t} catch (error) {\n\t\t\t// A relation that vanished between address validation and LOCK is ordinary\n\t\t\t// stale-plan drift, not a poisoned client. Preserve every other lock error.\n\t\t\tif (\n\t\t\t\terror instanceof PgResolvableRelationLockError &&\n\t\t\t\tisRecord(error.cause) &&\n\t\t\t\terror.cause.code === '42P01'\n\t\t\t)\n\t\t\t\tthrow bindingResolutionFailure({\n\t\t\t\t\tsought: slot.sought,\n\t\t\t\t\tfound: 'absent',\n\t\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\treturn resolveGeneratedPostconditionBinding(input);\n}\n\n/**\n * Enum and extension proof cannot hold a user-relation lock. Their binding and\n * structure must therefore be selected by one catalogue statement so READ\n * COMMITTED observes one snapshot rather than two independently-resolved names.\n */\nfunction tableColumnProjection(\n\trow: Record<string, unknown>,\n): TableColumnProjection {\n\tif (\n\t\ttypeof row.column_name !== 'string' ||\n\t\ttypeof row.column_type !== 'string' ||\n\t\ttypeof row.is_not_null !== 'boolean' ||\n\t\t(typeof row.column_default !== 'string' && row.column_default !== null) ||\n\t\t(typeof row.collation_name !== 'string' && row.collation_name !== null) ||\n\t\t(row.identity_kind !== '' &&\n\t\t\trow.identity_kind !== 'a' &&\n\t\t\trow.identity_kind !== 'd')\n\t)\n\t\tthrow new Error(\n\t\t\t'generated table verifier could not read a complete projection',\n\t\t);\n\treturn {\n\t\tname: row.column_name,\n\t\ttype: row.column_type,\n\t\tnullable: !row.is_not_null,\n\t\tdefault: row.column_default === null ? undefined : row.column_default,\n\t\tgeneratedSequenceDefault: row.generated_sequence_default === true,\n\t\t// PostgreSQL names the built-in collation `default`; DBSP represents no\n\t\t// explicit collation as null.\n\t\tcollation: row.collation_name === 'default' ? null : row.collation_name,\n\t\tidentity:\n\t\t\trow.identity_kind === 'a'\n\t\t\t\t? 'always'\n\t\t\t\t: row.identity_kind === 'd'\n\t\t\t\t\t? 'byDefault'\n\t\t\t\t\t: null,\n\t};\n}\n\nfunction generatedColumnProjection(\n\trow: Record<string, unknown>,\n\tname: string,\n): GeneratedColumnProjection {\n\tconst projection = tableColumnProjection({ ...row, column_name: name });\n\treturn {\n\t\ttype: projection.type,\n\t\tnullable: projection.nullable,\n\t\tdefault: projection.default,\n\t\tgeneratedSequenceDefault: projection.generatedSequenceDefault,\n\t\tcollation: projection.collation,\n\t\tidentity: projection.identity,\n\t};\n}\n\n// The deparse is PostgreSQL's canonical form. The sequence name is deliberately\n// not compared, but the entire expression must be the top-level SERIAL nextval\n// shape and the referenced sequence must be owned by this exact column.\nconst GENERATED_SEQUENCE_EVIDENCE_SQL =\n\t\"(pg_catalog.pg_get_expr(default_value.adbin, default_value.adrelid, false) ~ $dbsp_serial$^nextval\\\\('([^']|'')*'::regclass\\\\)$dbsp_serial$ AND EXISTS (SELECT 1 FROM pg_catalog.pg_depend default_sequence JOIN pg_catalog.pg_class sequence_relation ON sequence_relation.oid = default_sequence.refobjid WHERE default_sequence.classid = 'pg_catalog.pg_attrdef'::pg_catalog.regclass AND default_sequence.objid = default_value.oid AND default_sequence.refclassid = 'pg_catalog.pg_class'::pg_catalog.regclass AND default_sequence.deptype = 'n' AND sequence_relation.relkind = 'S' AND EXISTS (SELECT 1 FROM pg_catalog.pg_depend ownership WHERE ownership.classid = 'pg_catalog.pg_class'::pg_catalog.regclass AND ownership.objid = sequence_relation.oid AND ownership.refclassid = 'pg_catalog.pg_class'::pg_catalog.regclass AND ownership.refobjid = relation.oid AND ownership.refobjsubid = attribute.attnum AND ownership.deptype = 'a'))) AS generated_sequence_default\";\n\nconst TABLE_COLUMN_PROJECTION_SELECT = `SELECT relation.relkind AS relation_kind, attribute.attname AS column_name, pg_catalog.format_type(attribute.atttypid, attribute.atttypmod) AS column_type, attribute.attnotnull AS is_not_null, pg_catalog.pg_get_expr(default_value.adbin, default_value.adrelid) AS column_default, ${GENERATED_SEQUENCE_EVIDENCE_SQL}, column_collation.collname AS collation_name, attribute.attidentity AS identity_kind FROM pg_catalog.pg_namespace namespace JOIN pg_catalog.pg_class relation ON relation.relnamespace = namespace.oid LEFT JOIN pg_catalog.pg_attribute attribute ON attribute.attrelid = relation.oid AND attribute.attnum > 0 AND NOT attribute.attisdropped LEFT JOIN pg_catalog.pg_attrdef default_value ON default_value.adrelid = attribute.attrelid AND default_value.adnum = attribute.attnum LEFT JOIN pg_catalog.pg_collation column_collation ON column_collation.oid = attribute.attcollation`;\n\nfunction isGeneratedSequenceDefault(\n\tspecification: GeneratedColumnPostcondition,\n): boolean {\n\treturn specification.defaultKind === 'generated-sequence';\n}\n\nfunction requiresStagedDefault(\n\tspecification: GeneratedColumnPostcondition,\n): boolean {\n\treturn (\n\t\tspecification.hasDefault === true &&\n\t\t!isGeneratedSequenceDefault(specification)\n\t);\n}\n\nfunction scratchRollbackSafe(error: Error): Error {\n\tscratchRollbackSafeFailures.add(error);\n\treturn error;\n}\n\nasync function assertTemporaryTablePrivilege(\n\tsession: GeneratedPostconditionSession,\n): Promise<void> {\n\tconst row = (\n\t\tawait session.query(\n\t\t\t\"SELECT pg_catalog.has_database_privilege(pg_catalog.current_database(), 'TEMP') AS has_temp_privilege\",\n\t\t)\n\t).rows[0];\n\tif (row?.has_temp_privilege === false)\n\t\tthrow scratchRollbackSafe(\n\t\t\tnew Error(\n\t\t\t\t'generated postcondition verification requires database TEMP privilege before scratch-table DDL; grant TEMP and re-plan before applying managed DDL',\n\t\t\t),\n\t\t);\n}\n\nasync function stageAuthoredDefaults(\n\tsession: GeneratedPostconditionSession,\n\ttarget: GeneratedPostconditionTarget,\n\tcolumns: readonly GeneratedColumnPostcondition[],\n): Promise<ReadonlyMap<string, string>> {\n\tconst expected = columns.filter(requiresStagedDefault);\n\tif (expected.length === 0) return new Map();\n\tconst scratchTable = nextScratchName('table');\n\tawait assertTemporaryTablePrivilege(session);\n\tawait session.query(\n\t\t`CREATE TEMP TABLE ${quoteIdent(scratchTable, 'table')} (LIKE ${quoteIdent(target.schema, 'schema')}.${quoteIdent(target.table, 'table')} INCLUDING DEFAULTS INCLUDING IDENTITY)`,\n\t);\n\tconst staged = new Map<string, string>();\n\tfor (const column of expected) {\n\t\tif (column.default === undefined)\n\t\t\tthrow replan('generated column postcondition is unsupported');\n\t\tvalidateCheckExpression(column.default, 'generated column default');\n\t}\n\tawait session.query(\n\t\t`ALTER TABLE ${quoteIdent(scratchTable, 'table')} ${expected\n\t\t\t.map(\n\t\t\t\t(column) =>\n\t\t\t\t\t`ALTER COLUMN ${quoteIdent(column.name, 'column')} SET DEFAULT ${column.default}`,\n\t\t\t)\n\t\t\t.join(', ')}`,\n\t);\n\tconst stagedRows = (\n\t\tawait session.query(\n\t\t\t'SELECT attribute.attname AS column_name, pg_catalog.pg_get_expr(default_value.adbin, default_value.adrelid) AS column_default FROM pg_catalog.pg_attrdef default_value JOIN pg_catalog.pg_attribute attribute ON attribute.attrelid = default_value.adrelid AND attribute.attnum = default_value.adnum WHERE default_value.adrelid = $1::pg_catalog.regclass AND attribute.attname = ANY($2::text[])',\n\t\t\t[scratchTable, expected.map((column) => column.name)],\n\t\t)\n\t).rows;\n\tfor (const row of stagedRows) {\n\t\tif (\n\t\t\ttypeof row.column_name !== 'string' ||\n\t\t\ttypeof row.column_default !== 'string'\n\t\t)\n\t\t\tthrow new Error(\n\t\t\t\t'generated column verifier could not read staged default',\n\t\t\t);\n\t\tstaged.set(row.column_name, row.column_default);\n\t}\n\tif (staged.size !== expected.length)\n\t\tthrow new Error('generated column verifier could not read staged default');\n\treturn staged;\n}\n\ntype ColumnPostconditionMismatch =\n\t| 'type'\n\t| 'nullability'\n\t| 'default'\n\t| 'collation'\n\t| 'identity';\n\nasync function defaultPostconditionMatches(\n\tactual: GeneratedColumnProjection,\n\tspecification: GeneratedColumnPostcondition,\n\tstagedDefaults: ReadonlyMap<string, string>,\n): Promise<boolean> {\n\tif (specification.hasDefault === false) return actual.default === undefined;\n\tif (specification.hasDefault !== true) return true;\n\tif (actual.default === undefined) return false;\n\tif (isGeneratedSequenceDefault(specification))\n\t\treturn actual.generatedSequenceDefault;\n\treturn stagedDefaults.get(specification.name) === actual.default;\n}\n\nasync function columnPostconditionMatches(\n\tactual: GeneratedColumnProjection,\n\tspecification: GeneratedColumnPostcondition,\n\tstagedDefaults: ReadonlyMap<string, string>,\n): Promise<ColumnPostconditionMismatch | undefined> {\n\tif (\n\t\tspecification.type !== undefined &&\n\t\t!dbTypesEqual(actual.type, specification.type)\n\t)\n\t\treturn 'type';\n\tif (\n\t\tspecification.nullable !== undefined &&\n\t\tactual.nullable !== specification.nullable\n\t)\n\t\treturn 'nullability';\n\tif (\n\t\t!(await defaultPostconditionMatches(actual, specification, stagedDefaults))\n\t)\n\t\treturn 'default';\n\tif (\n\t\tspecification.collation !== undefined &&\n\t\tactual.collation !== specification.collation\n\t)\n\t\treturn 'collation';\n\tif (\n\t\tspecification.identity !== undefined &&\n\t\tactual.identity !== specification.identity\n\t)\n\t\treturn 'identity';\n\treturn undefined;\n}\n\n/**\n * Proves the supported COLUMN projection of a table, not every table property.\n * Inline primary keys, indexes, and constraints are proved by their own\n * postconditions and are never implied by this proof.\n */\nasync function verifyTableStructure(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly columns: readonly GeneratedColumnPostcondition[];\n\treadonly target: GeneratedPostconditionTarget;\n}): Promise<{ readonly kind: 'table'; readonly projection: TableProjection }> {\n\treturn (async (session) => {\n\t\tconst verify = async () => {\n\t\t\tconst rows = (\n\t\t\t\tawait session.query(\n\t\t\t\t\t`${TABLE_COLUMN_PROJECTION_SELECT} WHERE relation.oid = $1::pg_catalog.oid ORDER BY attribute.attnum`,\n\t\t\t\t\t[input.target.relationOid],\n\t\t\t\t)\n\t\t\t).rows;\n\t\t\tconst expected = input.columns;\n\t\t\tif (rows.length === 0)\n\t\t\t\tthrow structuralMismatch(\n\t\t\t\t\t`generated table ${input.target.name} is absent`,\n\t\t\t\t);\n\t\t\tconst relationKind = rows[0]?.relation_kind;\n\t\t\tif (typeof relationKind !== 'string')\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'generated table verifier could not read a complete projection',\n\t\t\t\t);\n\t\t\tif (relationKind !== 'r' && relationKind !== 'p')\n\t\t\t\tthrow new Error(`generated table ${input.target.name} is not a table`);\n\t\t\tif (rows.some((row) => row.relation_kind !== relationKind))\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'generated table verifier could not read a complete projection',\n\t\t\t\t);\n\t\t\tconst columnRows = rows.filter((row) => row.column_name !== null);\n\t\t\tif (columnRows.length !== expected.length)\n\t\t\t\tthrow structuralMismatchField(\n\t\t\t\t\t`table ${input.target.name}`,\n\t\t\t\t\t'columns.count',\n\t\t\t\t\t'count',\n\t\t\t\t);\n\t\t\tconst live = columnRows.map(tableColumnProjection);\n\t\t\tconst stagedDefaults = await stageAuthoredDefaults(\n\t\t\t\tsession,\n\t\t\t\tinput.target,\n\t\t\t\texpected,\n\t\t\t);\n\t\t\tfor (const [ordinal, specification] of expected.entries()) {\n\t\t\t\tconst actual = live[ordinal];\n\t\t\t\tconst mismatch = actual\n\t\t\t\t\t? await columnPostconditionMatches(\n\t\t\t\t\t\t\tactual,\n\t\t\t\t\t\t\tspecification,\n\t\t\t\t\t\t\tstagedDefaults,\n\t\t\t\t\t\t)\n\t\t\t\t\t: 'presence';\n\t\t\t\tif (\n\t\t\t\t\t!actual ||\n\t\t\t\t\tactual.name !== specification.name ||\n\t\t\t\t\tmismatch !== undefined\n\t\t\t\t)\n\t\t\t\t\tthrow structuralMismatchField(\n\t\t\t\t\t\t`table ${input.target.name}`,\n\t\t\t\t\t\t!actual\n\t\t\t\t\t\t\t? `columns[${ordinal}].presence`\n\t\t\t\t\t\t\t: actual.name !== specification.name\n\t\t\t\t\t\t\t\t? `columns[${ordinal}].name`\n\t\t\t\t\t\t\t\t: `columns[${ordinal}].${mismatch}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t\treturn { kind: 'table' as const, projection: { columns: live } };\n\t\t};\n\t\treturn verify();\n\t})(input.session);\n}\n\nasync function verifyColumnStructure(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly column: GeneratedColumnPostcondition;\n\treadonly target: GeneratedPostconditionTarget;\n}): Promise<{\n\treadonly kind: 'column';\n\treadonly projection: GeneratedColumnProjection;\n}> {\n\treturn (async (session) => {\n\t\tconst expected = input.column;\n\t\tif (expected.name !== input.target.name)\n\t\t\tthrow new Error(\n\t\t\t\t`generated column ${input.target.name} structural postcondition names another column`,\n\t\t\t);\n\t\tconst verify = async () => {\n\t\t\tconst row = (\n\t\t\t\tawait session.query(\n\t\t\t\t\t`${TABLE_COLUMN_PROJECTION_SELECT} WHERE relation.oid = $1::pg_catalog.oid AND attribute.attnum = $2`,\n\t\t\t\t\t[input.target.relationOid, input.target.attributeNumber],\n\t\t\t\t)\n\t\t\t).rows[0];\n\t\t\tif (!row)\n\t\t\t\tthrow structuralMismatch(\n\t\t\t\t\t`generated column ${input.target.name} is absent`,\n\t\t\t\t);\n\t\t\tif (row.relation_kind !== 'r' && row.relation_kind !== 'p')\n\t\t\t\tthrow structuralMismatch(\n\t\t\t\t\t`generated column ${input.target.name} parent is not a table`,\n\t\t\t\t);\n\t\t\tif (row.column_name !== input.target.name)\n\t\t\t\tthrow structuralMismatch(\n\t\t\t\t\t`generated column ${input.target.name} projection names another column`,\n\t\t\t\t);\n\t\t\tlet projection: GeneratedColumnProjection;\n\t\t\ttry {\n\t\t\t\tprojection = generatedColumnProjection(row, input.target.name);\n\t\t\t} catch {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`generated column ${input.target.name} has an incomplete projection`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst stagedDefaults = await stageAuthoredDefaults(\n\t\t\t\tsession,\n\t\t\t\tinput.target,\n\t\t\t\t[expected],\n\t\t\t);\n\t\t\tconst mismatch = await columnPostconditionMatches(\n\t\t\t\tprojection,\n\t\t\t\texpected,\n\t\t\t\tstagedDefaults,\n\t\t\t);\n\t\t\tif (mismatch !== undefined)\n\t\t\t\tthrow structuralMismatch(\n\t\t\t\t\t`generated column ${input.target.name} ${mismatch} postcondition differs`,\n\t\t\t\t);\n\t\t\treturn { kind: 'column' as const, projection };\n\t\t};\n\t\treturn verify();\n\t})(input.session);\n}\n\nasync function verifyIndexStructure(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly index: GeneratedIndexPostcondition;\n\treadonly target: GeneratedPostconditionTarget;\n\treadonly live: IndexProjection;\n}): Promise<{ readonly kind: 'index'; readonly projection: IndexProjection }> {\n\treturn (async (session) => {\n\t\tconst expected = input.index;\n\t\tconst scratchTable = nextScratchName('table');\n\t\tconst scratchIndex = nextScratchName('index');\n\t\t// Render before acquiring/using the capability: malformed index material must\n\t\t// refuse before any live catalogue query.\n\t\tconst scratchSql = generateCreateIndex(\n\t\t\tscratchTable,\n\t\t\tindexSource(expected, scratchIndex),\n\t\t\tundefined,\n\t\t\tidentityNaming,\n\t\t);\n\t\treturn (async () => {\n\t\t\tconst live = input.live;\n\t\t\tif (\n\t\t\t\tlive.schema !== expected.schema ||\n\t\t\t\tlive.table !== expected.table ||\n\t\t\t\tlive.name !== expected.name ||\n\t\t\t\tlive.valid !== expected.valid ||\n\t\t\t\tlive.ready !== expected.ready ||\n\t\t\t\tlive.live !== expected.live\n\t\t\t)\n\t\t\t\tthrow structuralMismatch(\n\t\t\t\t\t`generated index ${input.target.name} postcondition differs`,\n\t\t\t\t);\n\t\t\tconst staged = await (async () => {\n\t\t\t\tawait assertTemporaryTablePrivilege(session);\n\t\t\t\tawait session.query(\n\t\t\t\t\t`CREATE TEMP TABLE ${quoteIdent(scratchTable, 'table')} (LIKE ${quoteIdent(expected.schema, 'schema')}.${quoteIdent(expected.table, 'table')} INCLUDING DEFAULTS INCLUDING IDENTITY)`,\n\t\t\t\t);\n\t\t\t\tawait session.query(scratchSql);\n\t\t\t\treturn readScratchIndexProjection(session, scratchTable, scratchIndex);\n\t\t\t})();\n\t\t\tif (!sameIndexStructure(live, staged))\n\t\t\t\tthrow structuralMismatch(\n\t\t\t\t\t`generated index ${input.target.name} postcondition differs`,\n\t\t\t\t);\n\t\t\treturn { kind: 'index', projection: live };\n\t\t})();\n\t})(input.session);\n}\n\nconst CHECK_PROJECTION_SELECT =\n\t\"SELECT constraint_item.contype AS constraint_type, pg_catalog.pg_get_expr(constraint_item.conbin, constraint_item.conrelid, false) AS expression, constraint_item.convalidated AS validated, constraint_item.connoinherit AS no_inherit, constraint_item.conislocal AS is_local, constraint_item.coninhcount AS inheritance_count, CASE WHEN constraint_item_json.value ? 'conparentid' THEN (constraint_item_json.value ->> 'conparentid')::oid ELSE 0::oid END AS parent_id, CASE WHEN constraint_item_json.value ? 'conenforced' THEN (constraint_item_json.value ->> 'conenforced')::boolean ELSE true END AS enforced FROM pg_catalog.pg_constraint constraint_item CROSS JOIN LATERAL (SELECT pg_catalog.to_jsonb(constraint_item) AS value) constraint_item_json\";\n\nfunction checkProjection(\n\trow: Record<string, unknown>,\n\tabsent: string,\n): CheckProjection {\n\tif (typeof row.expression !== 'string') throw new Error(absent);\n\tif (\n\t\ttypeof row.validated !== 'boolean' ||\n\t\ttypeof row.no_inherit !== 'boolean' ||\n\t\ttypeof row.enforced !== 'boolean' ||\n\t\ttypeof row.is_local !== 'boolean' ||\n\t\ttypeof row.inheritance_count !== 'number' ||\n\t\t!Number.isInteger(row.inheritance_count) ||\n\t\ttypeof row.parent_id !== 'number' ||\n\t\t!Number.isInteger(row.parent_id)\n\t)\n\t\tthrow new Error(\n\t\t\t'generated CHECK verifier could not read a complete projection',\n\t\t);\n\treturn {\n\t\texpression: row.expression,\n\t\tvalidated: row.validated,\n\t\tnoInherit: row.no_inherit,\n\t\tenforced: row.enforced,\n\t\tisLocal: row.is_local,\n\t\tinheritanceCount: row.inheritance_count,\n\t\tparentId: row.parent_id,\n\t};\n}\n\nasync function readLiveCheckProjection(\n\tsession: GeneratedPostconditionSession,\n\ttarget: GeneratedPostconditionTarget,\n): Promise<CheckProjection> {\n\tconst row = (\n\t\tawait session.query(\n\t\t\t`${CHECK_PROJECTION_SELECT} WHERE constraint_item.conrelid = $1::pg_catalog.oid AND constraint_item.oid = $2::pg_catalog.oid`,\n\t\t\t[target.relationOid, target.objectOid],\n\t\t)\n\t).rows[0];\n\tif (!row) throw new Error(`generated constraint ${target.name} is absent`);\n\tif (row.constraint_type !== 'c')\n\t\tthrow bindingResolutionFailure({\n\t\t\tsought: `CHECK constraint ${target.schema}.${target.table}.${target.name}`,\n\t\t\tfound: `constraint ${target.schema}.${target.table}.${target.name} (contype ${String(row.constraint_type)})`,\n\t\t});\n\treturn checkProjection(row, `generated constraint ${target.name} is absent`);\n}\n\nasync function readScratchCheckProjection(\n\tsession: GeneratedPostconditionSession,\n\ttable: string,\n\tconstraint: string,\n): Promise<CheckProjection> {\n\tconst row = (\n\t\tawait session.query(\n\t\t\t`${CHECK_PROJECTION_SELECT} WHERE constraint_item.conrelid = $1::pg_catalog.regclass AND constraint_item.conname = $2 AND constraint_item.contype = 'c'`,\n\t\t\t[table, constraint],\n\t\t)\n\t).rows[0];\n\tif (!row)\n\t\tthrow new Error(\n\t\t\t'generated CHECK verifier could not read staged constraint',\n\t\t);\n\treturn checkProjection(\n\t\trow,\n\t\t'generated CHECK verifier could not read staged constraint',\n\t);\n}\n\nasync function verifyCheckStructure(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly check: Extract<\n\t\tGeneratedConstraintPostcondition,\n\t\t{ readonly type: 'c' }\n\t>;\n\treadonly target: GeneratedPostconditionTarget;\n}): Promise<{\n\treadonly kind: 'constraint';\n\treadonly projection: CheckProjection;\n}> {\n\treturn (async (session) => {\n\t\tconst expected = input.check;\n\t\tconst clause = renderCheckConstraintClause({\n\t\t\texpression: expected.expression,\n\t\t\tnotValid: expected.notValid,\n\t\t});\n\t\tvalidateCheckExpression(clause, 'generated CHECK postcondition');\n\t\treturn (async () => {\n\t\t\tconst live = await readLiveCheckProjection(session, input.target);\n\t\t\tif (live.validated !== !expected.notValid)\n\t\t\t\tthrow structuralMismatch(\n\t\t\t\t\t`generated constraint ${input.target.name} postcondition differs`,\n\t\t\t\t);\n\t\t\tconst scratchTable = nextScratchName('table');\n\t\t\tconst scratchConstraint = nextScratchName('constraint');\n\t\t\tconst staged = await (async () => {\n\t\t\t\tawait assertTemporaryTablePrivilege(session);\n\t\t\t\tawait session.query(\n\t\t\t\t\t`CREATE TEMP TABLE ${quoteIdent(scratchTable, 'table')} (LIKE ${quoteIdent(input.target.schema, 'schema')}.${quoteIdent(input.target.table, 'table')} INCLUDING DEFAULTS INCLUDING IDENTITY)`,\n\t\t\t\t);\n\t\t\t\tawait session.query(\n\t\t\t\t\t`ALTER TABLE ${quoteIdent(scratchTable, 'table')} ADD CONSTRAINT ${quoteIdent(scratchConstraint, 'alias')} ${clause}`,\n\t\t\t\t);\n\t\t\t\treturn readScratchCheckProjection(\n\t\t\t\t\tsession,\n\t\t\t\t\tscratchTable,\n\t\t\t\t\tscratchConstraint,\n\t\t\t\t);\n\t\t\t})();\n\t\t\tif (\n\t\t\t\tlive.expression !== staged.expression ||\n\t\t\t\tlive.validated !== staged.validated ||\n\t\t\t\tlive.noInherit !== staged.noInherit ||\n\t\t\t\tlive.enforced !== staged.enforced ||\n\t\t\t\tlive.isLocal !== staged.isLocal ||\n\t\t\t\tlive.inheritanceCount !== staged.inheritanceCount ||\n\t\t\t\tlive.parentId !== staged.parentId\n\t\t\t)\n\t\t\t\tthrow structuralMismatch(\n\t\t\t\t\t`generated constraint ${input.target.name} postcondition differs`,\n\t\t\t\t);\n\t\t\treturn { kind: 'constraint', projection: live };\n\t\t})();\n\t})(input.session);\n}\n\nfunction v3ColumnPostcondition(\n\tdeclaration: Extract<\n\t\tGeneratedPostconditionDeclarationV3,\n\t\t{ readonly kind: 'column' }\n\t>['column'],\n\tname: string,\n): GeneratedColumnPostcondition {\n\tconst defaultState = declaration.default;\n\treturn {\n\t\tname,\n\t\t...(declaration.type === undefined ? {} : { type: declaration.type }),\n\t\t...(declaration.nullable === undefined\n\t\t\t? {}\n\t\t\t: { nullable: declaration.nullable }),\n\t\t// A null authored collation means no COLLATE clause, not the catalogue's\n\t\t// effective default; only an authored name participates in the old proof.\n\t\t...(typeof declaration.authoredCollation === 'string'\n\t\t\t? { collation: declaration.authoredCollation }\n\t\t\t: {}),\n\t\t...(defaultState === undefined\n\t\t\t? {}\n\t\t\t: defaultState.defaultKind === 'none'\n\t\t\t\t? { hasDefault: false, identity: null }\n\t\t\t\t: defaultState.defaultKind === 'identity'\n\t\t\t\t\t? {\n\t\t\t\t\t\t\thasDefault: false,\n\t\t\t\t\t\t\tidentity: defaultState.identity,\n\t\t\t\t\t\t}\n\t\t\t\t\t: defaultState.defaultKind === 'generated-sequence'\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\thasDefault: true,\n\t\t\t\t\t\t\t\tdefaultKind: 'generated-sequence' as const,\n\t\t\t\t\t\t\t\tidentity: null,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\thasDefault: true,\n\t\t\t\t\t\t\t\tdefaultKind: 'authored' as const,\n\t\t\t\t\t\t\t\tdefault: defaultState.defaultExpression.sql,\n\t\t\t\t\t\t\t\tidentity: null,\n\t\t\t\t\t\t\t}),\n\t};\n}\n\nfunction decodeV3PostconditionKind<\n\tK extends GeneratedPostconditionDeclarationV3['kind'],\n>(\n\tvalue: unknown,\n\tkind: K,\n): GeneratedPostconditionV3 & {\n\treadonly declaration: Extract<\n\t\tGeneratedPostconditionDeclarationV3,\n\t\t{ readonly kind: K }\n\t>;\n} {\n\tconst postcondition = decodeGeneratedPostcondition(value);\n\tif (\n\t\tpostcondition.postconditionVersion !== 3 ||\n\t\tpostcondition.declaration.kind !== kind\n\t)\n\t\tthrow replan(`generated v3 ${kind} postcondition is unsupported`);\n\treturn postcondition as GeneratedPostconditionV3 & {\n\t\treadonly declaration: Extract<\n\t\t\tGeneratedPostconditionDeclarationV3,\n\t\t\t{ readonly kind: K }\n\t\t>;\n\t};\n}\n\ntype GeneratedPostconditionCatalogueIdentity = NonNullable<\n\tResourceAddress['catalogueIdentity']\n>;\n\nfunction catalogueIdentityForGeneratedPostconditionTarget(\n\tkind: GeneratedPostconditionBindingKind,\n\ttarget: GeneratedPostconditionTarget,\n): GeneratedPostconditionCatalogueIdentity {\n\tif (target.relationOid === undefined)\n\t\tthrow new Error(\n\t\t\t'generated postcondition binding did not return a relation identity',\n\t\t);\n\tif (kind === 'column')\n\t\treturn {\n\t\t\tengine: 'postgresql',\n\t\t\tformat: 1,\n\t\t\tvalue: { parentOid: target.relationOid, name: target.name },\n\t\t};\n\tconst oid = kind === 'table' ? target.relationOid : target.objectOid;\n\tif (oid === undefined)\n\t\tthrow new Error(\n\t\t\t'generated postcondition binding did not return an object identity',\n\t\t);\n\treturn { engine: 'postgresql', format: 1, value: { oid } };\n}\n\n/**\n * Decode and freeze the declaration plus the complete binding topology before\n * scratchScope can begin a transaction. In particular, stale v1/v2 values\n * refuse without touching a broken or read-only PostgreSQL session.\n */\nfunction prepareV3GeneratedPostcondition<\n\tK extends GeneratedPostconditionDeclarationV3['kind'],\n>(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly postcondition: unknown;\n\treadonly address: GeneratedPostconditionBindingAddress;\n\treadonly declarationKind: K;\n\treadonly expectedKind: GeneratedPostconditionBindingKind;\n}): {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly postcondition: GeneratedPostconditionV3 & {\n\t\treadonly declaration: Extract<\n\t\t\tGeneratedPostconditionDeclarationV3,\n\t\t\t{ readonly kind: K }\n\t\t>;\n\t};\n\treadonly address: GeneratedPostconditionBindingAddress;\n} {\n\tconst session = requireGeneratedPostconditionSession(input.session);\n\ttry {\n\t\tconst postcondition = decodeV3PostconditionKind(\n\t\t\tinput.postcondition,\n\t\t\tinput.declarationKind,\n\t\t);\n\t\tconst address = toGeneratedPostconditionBindingAddress(input.address);\n\t\tif (\n\t\t\tpostcondition.targetBinding.bindingVersion !== 1 ||\n\t\t\tpostcondition.targetBinding.bindingKind !== 'managed-step-address'\n\t\t)\n\t\t\tthrow replan('generated postcondition target binding is unsupported');\n\t\tconst slot = bindingSlot(address, input.expectedKind);\n\t\tif (slot.found !== undefined)\n\t\t\tthrow bindingResolutionFailure({\n\t\t\t\tsought: slot.sought,\n\t\t\t\tfound: slot.found,\n\t\t\t});\n\t\treturn { session, postcondition, address };\n\t} catch (error) {\n\t\tmarkSafePreQueryFailure(error, session);\n\t\tthrow error;\n\t}\n}\n\n/** Resolves the v3 table binding, then delegates its shared structural proof. */\nexport async function verifyGeneratedTablePostcondition(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly postcondition: unknown;\n\treadonly address: GeneratedPostconditionBindingAddress;\n}): Promise<{\n\treadonly kind: 'table';\n\treadonly projection: TableProjection;\n\treadonly catalogueIdentity: GeneratedPostconditionCatalogueIdentity;\n}> {\n\tconst prepared = prepareV3GeneratedPostcondition({\n\t\t...input,\n\t\tdeclarationKind: 'table',\n\t\texpectedKind: 'table',\n\t});\n\treturn withGeneratedPostconditionProof(prepared.session, async (session) => {\n\t\tconst { postcondition } = prepared;\n\t\tconst target = await stabilizeGeneratedPostconditionBinding({\n\t\t\tsession,\n\t\t\ttargetBinding: postcondition.targetBinding,\n\t\t\taddress: prepared.address,\n\t\t\texpectedKind: 'table',\n\t\t});\n\t\tconst verified = await verifyTableStructure({\n\t\t\tsession,\n\t\t\tcolumns: postcondition.declaration.columns.map((column) =>\n\t\t\t\tv3ColumnPostcondition(column, column.name),\n\t\t\t),\n\t\t\ttarget,\n\t\t});\n\t\treturn {\n\t\t\t...verified,\n\t\t\tcatalogueIdentity: catalogueIdentityForGeneratedPostconditionTarget(\n\t\t\t\t'table',\n\t\t\t\ttarget,\n\t\t\t),\n\t\t};\n\t});\n}\n\n/** Resolves the v3 column binding, then delegates its shared structural proof. */\nexport async function verifyGeneratedColumnPostcondition(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly postcondition: unknown;\n\treadonly address: GeneratedPostconditionBindingAddress;\n}): Promise<{\n\treadonly kind: 'column';\n\treadonly projection: GeneratedColumnProjection;\n\treadonly catalogueIdentity: GeneratedPostconditionCatalogueIdentity;\n}> {\n\tconst prepared = prepareV3GeneratedPostcondition({\n\t\t...input,\n\t\tdeclarationKind: 'column',\n\t\texpectedKind: 'column',\n\t});\n\treturn withGeneratedPostconditionProof(prepared.session, async (session) => {\n\t\tconst { postcondition } = prepared;\n\t\tconst target = await stabilizeGeneratedPostconditionBinding({\n\t\t\tsession,\n\t\t\ttargetBinding: postcondition.targetBinding,\n\t\t\taddress: prepared.address,\n\t\t\texpectedKind: 'column',\n\t\t});\n\t\tconst verified = await verifyColumnStructure({\n\t\t\tsession,\n\t\t\tcolumn: v3ColumnPostcondition(\n\t\t\t\tpostcondition.declaration.column,\n\t\t\t\ttarget.name,\n\t\t\t),\n\t\t\ttarget,\n\t\t});\n\t\treturn {\n\t\t\t...verified,\n\t\t\tcatalogueIdentity: catalogueIdentityForGeneratedPostconditionTarget(\n\t\t\t\t'column',\n\t\t\t\ttarget,\n\t\t\t),\n\t\t};\n\t});\n}\n\n/** Resolves the v3 index binding, then delegates its shared structural proof. */\nexport async function verifyGeneratedIndexPostcondition(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly postcondition: unknown;\n\treadonly address: GeneratedPostconditionBindingAddress;\n}): Promise<{\n\treadonly kind: 'index';\n\treadonly projection: IndexProjection;\n\treadonly catalogueIdentity: GeneratedPostconditionCatalogueIdentity;\n}> {\n\tconst prepared = prepareV3GeneratedPostcondition({\n\t\t...input,\n\t\tdeclarationKind: 'index',\n\t\texpectedKind: 'index',\n\t});\n\treturn withGeneratedPostconditionProof(prepared.session, async (session) => {\n\t\tconst { postcondition } = prepared;\n\t\tconst bound = await stabilizeGeneratedIndexBindingAndProjection({\n\t\t\tsession,\n\t\t\ttargetBinding: postcondition.targetBinding,\n\t\t\taddress: prepared.address,\n\t\t});\n\t\tconst { target } = bound;\n\t\tconst index = postcondition.declaration.index;\n\t\tconst { expressions, where, ...indexFacts } = index;\n\t\tconst verified = await verifyIndexStructure({\n\t\t\tsession,\n\t\t\tindex: {\n\t\t\t\tschema: target.schema,\n\t\t\t\ttable: target.table,\n\t\t\t\tname: target.name,\n\t\t\t\t...indexFacts,\n\t\t\t\t...(expressions === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\texpressions: expressions.map((expression) => expression.sql),\n\t\t\t\t\t\t}),\n\t\t\t\t...(where === undefined ? {} : { where: where.sql }),\n\t\t\t},\n\t\t\ttarget,\n\t\t\tlive: bound.projection,\n\t\t});\n\t\treturn {\n\t\t\t...verified,\n\t\t\tcatalogueIdentity: catalogueIdentityForGeneratedPostconditionTarget(\n\t\t\t\t'index',\n\t\t\t\ttarget,\n\t\t\t),\n\t\t};\n\t});\n}\n\n/** Resolves the v3 CHECK binding, then delegates its shared structural proof. */\nexport async function verifyGeneratedCheckPostcondition(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly postcondition: unknown;\n\treadonly address: GeneratedPostconditionBindingAddress;\n}): Promise<{\n\treadonly kind: 'constraint';\n\treadonly projection: CheckProjection;\n\treadonly catalogueIdentity: GeneratedPostconditionCatalogueIdentity;\n}> {\n\tconst prepared = prepareV3GeneratedPostcondition({\n\t\t...input,\n\t\tdeclarationKind: 'check',\n\t\texpectedKind: 'constraint',\n\t});\n\treturn withGeneratedPostconditionProof(prepared.session, async (session) => {\n\t\tconst { postcondition } = prepared;\n\t\tconst target = await stabilizeGeneratedPostconditionBinding({\n\t\t\tsession,\n\t\t\ttargetBinding: postcondition.targetBinding,\n\t\t\taddress: prepared.address,\n\t\t\texpectedKind: 'constraint',\n\t\t});\n\t\tconst verified = await verifyCheckStructure({\n\t\t\tsession,\n\t\t\tcheck: {\n\t\t\t\ttype: 'c',\n\t\t\t\texpression: postcondition.declaration.check.expression.sql,\n\t\t\t\tnotValid: postcondition.declaration.check.notValid,\n\t\t\t},\n\t\t\ttarget,\n\t\t});\n\t\treturn {\n\t\t\t...verified,\n\t\t\tcatalogueIdentity: catalogueIdentityForGeneratedPostconditionTarget(\n\t\t\t\t'constraint',\n\t\t\t\ttarget,\n\t\t\t),\n\t\t};\n\t});\n}\n\n/**\n * Binds the deliberately non-structural v3 kinds under the same rollback-only\n * proof bracket as structural verifiers. The declaration kind is the binding\n * expectation, so a sequence slot can never observe an enum declaration (or\n * vice versa) merely because the address happens to resolve.\n */\nexport async function verifyGeneratedIdentityPostcondition(input: {\n\treadonly session: GeneratedPostconditionSession;\n\treadonly postcondition: unknown;\n\treadonly address: GeneratedPostconditionBindingAddress;\n\treadonly kind: 'constraint' | 'enum' | 'sequence' | 'extension';\n}): Promise<{\n\treadonly kind: 'constraint' | 'enum' | 'sequence' | 'extension';\n\treadonly identity: Readonly<{\n\t\treadonly relationOid: string;\n\t\treadonly objectOid?: string;\n\t}>;\n\treadonly catalogueIdentity: GeneratedPostconditionCatalogueIdentity;\n}> {\n\tconst prepared = prepareV3GeneratedPostcondition({\n\t\t...input,\n\t\tdeclarationKind: input.kind,\n\t\texpectedKind: input.kind,\n\t});\n\treturn withGeneratedPostconditionProof(prepared.session, async (session) => {\n\t\tconst { postcondition } = prepared;\n\t\tconst target =\n\t\t\tinput.kind === 'constraint'\n\t\t\t\t? await stabilizeGeneratedPostconditionBinding({\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\ttargetBinding: postcondition.targetBinding,\n\t\t\t\t\t\taddress: prepared.address,\n\t\t\t\t\t\texpectedKind: input.kind,\n\t\t\t\t\t})\n\t\t\t\t: await resolveGeneratedPostconditionIdentityBinding({\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\ttargetBinding: postcondition.targetBinding,\n\t\t\t\t\t\taddress: prepared.address,\n\t\t\t\t\t\texpectedKind: input.kind,\n\t\t\t\t\t});\n\t\tif (target.relationOid === undefined)\n\t\t\tthrow new Error(\n\t\t\t\t'generated postcondition binding did not return a relation identity',\n\t\t\t);\n\t\treturn {\n\t\t\tkind: input.kind,\n\t\t\tidentity: {\n\t\t\t\trelationOid: target.relationOid,\n\t\t\t\t...(target.objectOid === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { objectOid: target.objectOid }),\n\t\t\t},\n\t\t\tcatalogueIdentity: catalogueIdentityForGeneratedPostconditionTarget(\n\t\t\t\tinput.kind,\n\t\t\t\ttarget,\n\t\t\t),\n\t\t};\n\t});\n}\n","/**\n * Renders identifiers obtained from catalogue-backed ledger addresses for\n * relation locks. Unlike generated DDL identifiers, adopted names may contain\n * any PostgreSQL-legal character except NUL.\n */\nexport function renderPgLockIdentifier(value: unknown): string {\n\tif (typeof value !== 'string')\n\t\tthrow new Error('PostgreSQL lock identifier must be a string');\n\tif (value.includes('\\0'))\n\t\tthrow new Error('PostgreSQL lock identifier must not contain NUL');\n\treturn `\"${value.replaceAll('\"', '\"\"')}\"`;\n}\n","import type { LedgerAddress } from '@dbsp/types';\nimport { readPgCatalogueIdentity } from './catalogue-identity.js';\nimport type { TransitionJournalQueryable } from './journal.js';\nimport { renderPgLockIdentifier } from './lock-identifier.js';\n\nexport interface PgLockRelation {\n\treadonly schema: string;\n\treadonly table: string;\n}\n\n/** A catalogue read failed while establishing or proving a relation lock. */\nexport class PgResolvableRelationIdentityReadError extends Error {\n\tconstructor(cause: unknown) {\n\t\tsuper('catalogue identity read failed while establishing a relation lock', {\n\t\t\tcause,\n\t\t});\n\t\tthis.name = 'PgResolvableRelationIdentityReadError';\n\t}\n}\n\n/** A relation lock failed while establishing the catalogue identity boundary. */\nexport class PgResolvableRelationLockError extends Error {\n\tconstructor(cause: unknown) {\n\t\tsuper('relation lock failed while establishing a relation lock', { cause });\n\t\tthis.name = 'PgResolvableRelationLockError';\n\t}\n}\n\n/** Formats arbitrary thrown values without letting hostile objects throw again. */\nexport function formatPgTransitionUnknownError(error: unknown): string {\n\tif (error instanceof Error) return error.message;\n\ttry {\n\t\treturn String(error);\n\t} catch {\n\t\treturn 'unprintable thrown value';\n\t}\n}\n\nasync function readCatalogueIdentity(\n\texecutor: TransitionJournalQueryable,\n\taddress: LedgerAddress,\n): Promise<Awaited<ReturnType<typeof readPgCatalogueIdentity>>> {\n\ttry {\n\t\treturn await readPgCatalogueIdentity(executor, address);\n\t} catch (error) {\n\t\tthrow new PgResolvableRelationIdentityReadError(error);\n\t}\n}\n\n/**\n * Returns the relation whose lock protects a mapped address through its\n * terminal append. Columns, constraints, and policies share their containing\n * table's DDL lock. Indexes are deliberately excluded: ALTER INDEX RENAME\n * locks the index relation itself, and SQL LOCK TABLE cannot lock an index.\n */\nexport function pgLockRelationForAddress(\n\taddress: LedgerAddress,\n\tlabel = 'relation',\n): PgLockRelation | undefined {\n\tif (address.kind === 'table' && address.schema)\n\t\treturn { schema: address.schema, table: address.name };\n\tif (\n\t\t(address.kind === 'constraint' ||\n\t\t\taddress.kind === 'column' ||\n\t\t\taddress.kind === 'policy') &&\n\t\taddress.parent?.kind === 'table' &&\n\t\taddress.schema\n\t) {\n\t\tif (\n\t\t\taddress.parent.schema !== undefined &&\n\t\t\taddress.parent.schema !== address.schema\n\t\t)\n\t\t\tconsole.warn(\n\t\t\t\t`${label} lock ignores mismatched parent schema ${address.parent.schema} for ${address.kind} ${address.name}; catalogue identity resolves ${address.schema}`,\n\t\t\t);\n\t\treturn { schema: address.schema, table: address.parent.name };\n\t}\n\treturn undefined;\n}\n\n/** Acquires the relation lock that blocks concurrent DROP and ALTER, but not DML. */\nexport async function lockPgRelation(\n\texecutor: TransitionJournalQueryable,\n\trelation: PgLockRelation,\n): Promise<void> {\n\tconst statement = `LOCK TABLE ONLY ${renderPgLockIdentifier(relation.schema)}.${renderPgLockIdentifier(relation.table)} IN SHARE UPDATE EXCLUSIVE MODE`;\n\ttry {\n\t\tawait executor.query(statement);\n\t} catch (error) {\n\t\tthrow new PgResolvableRelationLockError(error);\n\t}\n}\n\n/**\n * Read catalogue identity while holding the mapped relation lock whenever the\n * addressed object exists. A present pre-read only establishes that locking is\n * possible; callers use the post-lock re-read as their proof and retain the\n * lock through their terminal append. Absence and unmapped kinds have only a\n * final-read window; recovery terminal callers re-read immediately before\n * appending. Two-session adversaries are tracked in #595.\n */\nexport async function readPgCatalogueIdentityWithResolvableRelationLock(\n\texecutor: TransitionJournalQueryable,\n\taddress: LedgerAddress,\n\tlabel = 'relation',\n): Promise<Awaited<ReturnType<typeof readPgCatalogueIdentity>>> {\n\tconst relation = pgLockRelationForAddress(address, label);\n\tif (!relation) return readCatalogueIdentity(executor, address);\n\tconst preLock = await readCatalogueIdentity(executor, address);\n\tif (!preLock?.catalogueIdentity) return preLock;\n\tawait lockPgRelation(executor, relation);\n\treturn readCatalogueIdentity(executor, address);\n}\n","/** The default finite lock wait for adapter-owned DDL transactions. */\nexport const DEFAULT_DDL_LOCK_TIMEOUT_MS = 5000;\n","import type {\n\tLedgerAddress,\n\tLedgerChainMember,\n\tLedgerHome,\n\tLedgerPayload,\n\tRefusalCode,\n} from '@dbsp/types';\nimport { ledgerAddressParentJson, REFUSAL_VOCABULARY } from '@dbsp/types';\nimport { validateIdentifier } from '../validate.js';\nimport { DBSP_LEDGER_EVENT_TABLE, DBSP_META_SCHEMA } from './constants.js';\nimport type { TransitionJournalQueryable } from './journal.js';\n\nexport interface PgLedgerAddressChain {\n\treadonly ledger: LedgerHome;\n\treadonly address: LedgerAddress;\n\t/** Every member is returned so the core projector can diagnose malformed chains. */\n\treadonly events: readonly LedgerChainMember[];\n\t/** Undefined means there is no unique terminal member; it is never inferred by row order. */\n\treadonly terminalMember?: LedgerChainMember;\n}\n\ninterface PgLedgerEventRow {\n\treadonly event_id: unknown;\n\treadonly address_engine: unknown;\n\treadonly address_database: unknown;\n\treadonly address_schema: unknown;\n\treadonly address_parent: unknown;\n\treadonly address_kind: unknown;\n\treadonly address_name: unknown;\n\treadonly execution_id: unknown;\n\treadonly planned_claim_key: unknown;\n\treadonly claim_group_id: unknown;\n\treadonly root_claim_id: unknown;\n\treadonly catalogue_identity: unknown;\n\treadonly event_kind: unknown;\n\treadonly predecessor: unknown;\n\treadonly pair_id: unknown;\n\treadonly declared: unknown;\n\treadonly declared_digest: unknown;\n\treadonly observed: unknown;\n\treadonly observed_digest: unknown;\n\treadonly refusal_code: unknown;\n\treadonly refusal_cause: unknown;\n\treadonly refusal_state: unknown;\n\treadonly refusal_withheld_authority: unknown;\n\treadonly refusal_resolving_command: unknown;\n\treadonly controller: unknown;\n\treadonly controller_oid: unknown;\n\treadonly recorded_at: unknown;\n}\n\nfunction quoteIdent(value: string, type: 'schema' | 'table'): string {\n\tvalidateIdentifier(value, type);\n\treturn `\"${value.replaceAll('\"', '\"\"')}\"`;\n}\n\nfunction ledgerSchema(ledger: LedgerHome): string {\n\tif (ledger.scope === 'database') return DBSP_META_SCHEMA;\n\tif (!ledger.schema)\n\t\tthrow new Error('schema ledger target is missing its schema');\n\treturn ledger.schema;\n}\n\nfunction eventTable(ledger: LedgerHome): string {\n\treturn `${quoteIdent(ledgerSchema(ledger), 'schema')}.${quoteIdent(DBSP_LEDGER_EVENT_TABLE, 'table')}`;\n}\n\nfunction addressParameters(address: LedgerAddress): readonly unknown[] {\n\treturn [\n\t\taddress.engine,\n\t\taddress.database,\n\t\taddress.schema ?? '',\n\t\tledgerAddressParentJson(address),\n\t\taddress.kind,\n\t\taddress.name,\n\t];\n}\n\nconst EVENT_COLUMNS =\n\t'event_id, address_engine, address_database, address_schema, address_parent, address_kind, address_name, execution_id, planned_claim_key, claim_group_id, root_claim_id, catalogue_identity, event_kind, predecessor, pair_id, declared, declared_digest, observed, observed_digest, refusal_code, refusal_cause, refusal_state, refusal_withheld_authority, refusal_resolving_command, controller::text AS controller, controller_oid::text AS controller_oid, recorded_at::text AS recorded_at';\n\nfunction asString(value: unknown, column: string): string {\n\tif (typeof value !== 'string')\n\t\tthrow new Error(`ledger event ${column} is unreadable`);\n\treturn value;\n}\n\nfunction nullableString(value: unknown, column: string): string | undefined {\n\tif (value === null || value === undefined) return undefined;\n\treturn asString(value, column);\n}\n\nfunction isRefusalCode(value: string): value is RefusalCode {\n\treturn Object.hasOwn(REFUSAL_VOCABULARY, value);\n}\n\nfunction jsonValue(value: unknown, column: string): unknown {\n\tif (typeof value !== 'string') return value;\n\ttry {\n\t\treturn JSON.parse(value);\n\t} catch {\n\t\tthrow new Error(`ledger event ${column} is unreadable`);\n\t}\n}\n\nfunction payload(\n\tvalue: unknown,\n\tdigest: unknown,\n\tcolumn: 'declared' | 'observed',\n): LedgerChainMember['declared'] | undefined {\n\tif (value === null || value === undefined) {\n\t\tif (digest !== null && digest !== undefined)\n\t\t\tthrow new Error(`ledger event ${column} digest is unreadable`);\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tvalue: jsonValue(value, column) as LedgerPayload['value'],\n\t\tdigest: asString(digest, `${column}_digest`),\n\t};\n}\n\nfunction memberFromRow(\n\trow: PgLedgerEventRow,\n\tscope: LedgerAddress['scope'],\n): LedgerChainMember {\n\tconst parent = jsonValue(row.address_parent, 'address_parent');\n\tconst declared = payload(row.declared, row.declared_digest, 'declared');\n\tconst observed = payload(row.observed, row.observed_digest, 'observed');\n\tconst predecessor = nullableString(row.predecessor, 'predecessor');\n\tconst executionId = nullableString(row.execution_id, 'execution_id');\n\tconst plannedClaimKey = nullableString(\n\t\trow.planned_claim_key,\n\t\t'planned_claim_key',\n\t);\n\tconst claimGroupId = nullableString(row.claim_group_id, 'claim_group_id');\n\tconst rootClaimId = nullableString(row.root_claim_id, 'root_claim_id');\n\tconst pairId = nullableString(row.pair_id, 'pair_id');\n\tconst controllerOid = nullableString(row.controller_oid, 'controller_oid');\n\tconst recordedAt = nullableString(row.recorded_at, 'recorded_at');\n\tconst refusalCode = nullableString(row.refusal_code, 'refusal_code');\n\tconst refusalCause = nullableString(row.refusal_cause, 'refusal_cause');\n\tconst refusalState = nullableString(row.refusal_state, 'refusal_state');\n\tconst refusalWithheldAuthority = nullableString(\n\t\trow.refusal_withheld_authority,\n\t\t'refusal_withheld_authority',\n\t);\n\tconst refusalResolvingCommand = nullableString(\n\t\trow.refusal_resolving_command,\n\t\t'refusal_resolving_command',\n\t);\n\tconst refusalValues = [\n\t\trefusalCode,\n\t\trefusalCause,\n\t\trefusalState,\n\t\trefusalWithheldAuthority,\n\t\trefusalResolvingCommand,\n\t];\n\tif (\n\t\trefusalValues.some((value) => value === undefined) &&\n\t\trefusalValues.some((value) => value !== undefined)\n\t)\n\t\tthrow new Error('ledger refusal protocol is unreadable');\n\tif (refusalCode !== undefined && !isRefusalCode(refusalCode))\n\t\tthrow new Error('ledger refusal protocol has an unknown code');\n\treturn {\n\t\teventId: asString(row.event_id, 'event_id'),\n\t\t...(executionId === undefined ? {} : { executionId }),\n\t\t...(plannedClaimKey === undefined ? {} : { plannedClaimKey }),\n\t\t...(claimGroupId === undefined ? {} : { claimGroupId }),\n\t\t...(rootClaimId === undefined ? {} : { rootClaimId }),\n\t\taddress: {\n\t\t\tscope,\n\t\t\tengine: asString(row.address_engine, 'address_engine'),\n\t\t\tdatabase: asString(row.address_database, 'address_database'),\n\t\t\t...(row.address_schema === ''\n\t\t\t\t? {}\n\t\t\t\t: { schema: asString(row.address_schema, 'address_schema') }),\n\t\t\t...(parent === null\n\t\t\t\t? {}\n\t\t\t\t: { parent: parent as Exclude<LedgerAddress['parent'], undefined> }),\n\t\t\tkind: asString(row.address_kind, 'address_kind'),\n\t\t\tname: asString(row.address_name, 'address_name'),\n\t\t},\n\t\t...(row.catalogue_identity === null || row.catalogue_identity === undefined\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tcatalogueIdentity: jsonValue(\n\t\t\t\t\t\trow.catalogue_identity,\n\t\t\t\t\t\t'catalogue_identity',\n\t\t\t\t\t) as Exclude<LedgerChainMember['catalogueIdentity'], undefined>,\n\t\t\t\t}),\n\t\t// Deliberately preserve an unknown database spelling for the pure projector.\n\t\teventKind: asString(\n\t\t\trow.event_kind,\n\t\t\t'event_kind',\n\t\t) as LedgerChainMember['eventKind'],\n\t\t...(predecessor === undefined ? {} : { predecessor }),\n\t\t...(pairId === undefined ? {} : { pairId }),\n\t\t...(declared === undefined ? {} : { declared }),\n\t\t...(observed === undefined ? {} : { observed }),\n\t\t...(refusalCode === undefined\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\trefusal: {\n\t\t\t\t\t\tcode: refusalCode,\n\t\t\t\t\t\tcause: refusalCause!,\n\t\t\t\t\t\tstate: refusalState as 'unknown' | 'managed' | 'absent',\n\t\t\t\t\t\twithheldAuthority: refusalWithheldAuthority!,\n\t\t\t\t\t\tresolvingCommand: refusalResolvingCommand!,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\tcontroller: asString(row.controller, 'controller'),\n\t\t...(controllerOid === undefined ? {} : { controllerOid }),\n\t\t...(recordedAt === undefined ? {} : { recordedAt }),\n\t};\n}\n\n/** Finds a terminal by predecessor topology only; callers must not use row position. */\nexport function findPgLedgerTerminalMember(\n\tevents: readonly LedgerChainMember[],\n): LedgerChainMember | undefined {\n\tconst predecessors = new Set<string>();\n\tfor (const event of events) {\n\t\tif (event.predecessor !== undefined) predecessors.add(event.predecessor);\n\t}\n\tlet terminal: LedgerChainMember | undefined;\n\tfor (const event of events) {\n\t\tif (predecessors.has(event.eventId)) continue;\n\t\tif (terminal !== undefined) return undefined;\n\t\tterminal = event;\n\t}\n\treturn terminal;\n}\n\n/**\n * Reads one address without imposing an insertion order. The resulting full\n * chain feeds the core projection, which owns all lifecycle interpretation.\n */\nexport async function readPgLedgerAddressChain(\n\texecutor: TransitionJournalQueryable,\n\tledger: LedgerHome,\n\taddress: LedgerAddress,\n): Promise<PgLedgerAddressChain> {\n\tif (address.scope !== ledger.scope)\n\t\tthrow new Error(\n\t\t\t`ledger ${ledger.scope} does not match ${address.scope}-scoped address ${address.name}`,\n\t\t);\n\tif (ledger.scope === 'schema' && ledger.schema !== address.schema)\n\t\tthrow new Error(\n\t\t\t`ledger schema ${String(ledger.schema)} does not match address schema ${String(address.schema)} for ${address.name}`,\n\t\t);\n\tconst result = await executor.query(\n\t\t`SELECT ${EVENT_COLUMNS} FROM ${eventTable(ledger)} WHERE address_engine = $1 AND address_database = $2 AND address_schema = $3 AND address_parent = $4::jsonb AND address_kind = $5 AND address_name = $6`,\n\t\taddressParameters(address),\n\t);\n\tconst events = result.rows.map((row) =>\n\t\tmemberFromRow(row as unknown as PgLedgerEventRow, address.scope),\n\t);\n\tconst terminalMember = findPgLedgerTerminalMember(events);\n\treturn {\n\t\tledger,\n\t\taddress,\n\t\tevents,\n\t\t...(terminalMember === undefined ? {} : { terminalMember }),\n\t};\n}\n\n/** Read the durable PostgreSQL role identity for the selected terminal event. */\nexport async function readPgLedgerControllerOid(\n\texecutor: TransitionJournalQueryable,\n\tledger: LedgerHome,\n\taddress: LedgerAddress,\n\teventId: string,\n): Promise<string> {\n\tconst result = await executor.query(\n\t\t`SELECT controller_oid::text AS controller_oid FROM ${eventTable(ledger)} WHERE event_id = $1 AND address_engine = $2 AND address_database = $3 AND address_schema = $4 AND address_parent = $5::jsonb AND address_kind = $6 AND address_name = $7`,\n\t\t[eventId, ...addressParameters(address)],\n\t);\n\tconst value = result.rows[0]?.controller_oid;\n\tif (typeof value !== 'string')\n\t\tthrow new Error('ledger controller role identity is unreadable');\n\treturn value;\n}\n","import type { TransitionJournalQueryable } from './journal.js';\n\n/** The stable command outcome for a PostgreSQL target that cannot accept writes. */\nexport const DATABASE_READ_ONLY_OUTCOME = 'database-read-only' as const;\n\nexport class PgDatabaseReadOnlyError extends Error {\n\treadonly code = DATABASE_READ_ONLY_OUTCOME;\n\n\tconstructor(detail: string) {\n\t\tsuper(`${DATABASE_READ_ONLY_OUTCOME}: ${detail}`);\n\t\tthis.name = 'PgDatabaseReadOnlyError';\n\t}\n}\n\nexport function isPgDatabaseReadOnlyError(\n\terror: unknown,\n): error is PgDatabaseReadOnlyError {\n\treturn (\n\t\terror !== null &&\n\t\ttypeof error === 'object' &&\n\t\t'code' in error &&\n\t\t(error as { readonly code?: unknown }).code === DATABASE_READ_ONLY_OUTCOME\n\t);\n}\n\nexport type PgDatabaseWritability =\n\t| { readonly kind: 'writable' }\n\t| {\n\t\t\treadonly kind: typeof DATABASE_READ_ONLY_OUTCOME;\n\t\t\treadonly detail: string;\n\t }\n\t| { readonly kind: 'unavailable'; readonly detail: string };\n\nfunction onOff(value: unknown): boolean | undefined {\n\tif (value === 'on') return true;\n\tif (value === 'off') return false;\n\treturn undefined;\n}\n\n/**\n * One PostgreSQL writability classification for every managed mutation. Both\n * a physical standby and a session made read-only by default reach the same\n * outcome; an unreadable response is deliberately not treated as writable.\n */\nexport async function classifyPgDatabaseWritability(\n\texecutor: TransitionJournalQueryable,\n): Promise<PgDatabaseWritability> {\n\tconst row = (\n\t\tawait executor.query(\n\t\t\t\"SELECT pg_catalog.pg_is_in_recovery() AS in_recovery, current_setting('default_transaction_read_only') AS default_transaction_read_only, current_setting('transaction_read_only') AS transaction_read_only\",\n\t\t)\n\t).rows[0];\n\tif (!row || typeof row.in_recovery !== 'boolean') {\n\t\treturn {\n\t\t\tkind: 'unavailable',\n\t\t\tdetail: 'PostgreSQL writability could not be read',\n\t\t};\n\t}\n\tconst defaultReadOnly = onOff(row.default_transaction_read_only);\n\tconst transactionReadOnly = onOff(row.transaction_read_only);\n\tif (defaultReadOnly === undefined || transactionReadOnly === undefined) {\n\t\treturn {\n\t\t\tkind: 'unavailable',\n\t\t\tdetail: 'PostgreSQL writability settings could not be read',\n\t\t};\n\t}\n\tif (row.in_recovery)\n\t\treturn { kind: DATABASE_READ_ONLY_OUTCOME, detail: 'target is a standby' };\n\tif (defaultReadOnly || transactionReadOnly) {\n\t\treturn {\n\t\t\tkind: DATABASE_READ_ONLY_OUTCOME,\n\t\t\tdetail: 'target session is read-only',\n\t\t};\n\t}\n\treturn { kind: 'writable' };\n}\n\n/** Fail closed without replacing a PostgreSQL query failure's own words. */\nexport async function assertPgDatabaseWritable(\n\texecutor: TransitionJournalQueryable,\n): Promise<void> {\n\tconst classification = await classifyPgDatabaseWritability(executor);\n\tif (classification.kind === 'writable') return;\n\tif (classification.kind === DATABASE_READ_ONLY_OUTCOME)\n\t\tthrow new PgDatabaseReadOnlyError(classification.detail);\n\tthrow new Error(classification.detail);\n}\n\n/** Preserve PostgreSQL's own failure words while normalizing SQLSTATE 25006. */\nexport async function classifyPgWrite<T>(write: () => Promise<T>): Promise<T> {\n\ttry {\n\t\treturn await write();\n\t} catch (error) {\n\t\tif (\n\t\t\terror !== null &&\n\t\t\ttypeof error === 'object' &&\n\t\t\t'code' in error &&\n\t\t\t(error as { readonly code?: unknown }).code === '25006'\n\t\t) {\n\t\t\tconst detail = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new PgDatabaseReadOnlyError(detail);\n\t\t}\n\t\tthrow error;\n\t}\n}\n","import { createHash } from 'node:crypto';\nimport {\n\tcreateExclusiveTransitionTarget,\n\tcreateTransitionLessor,\n} from '@dbsp/core';\nimport { transitionPhysicalSessionIsCompromised } from '@dbsp/core/internal';\nimport type {\n\tExclusiveTransitionTarget,\n\tTransitionLessor,\n\tTransitionQueryClient,\n} from '@dbsp/types';\nimport type { Pool, PoolClient } from 'pg';\nimport { classifyPgWrite } from './database-writability.js';\n\nexport type PgTransitionRunLockResult<T> =\n\t| { readonly kind: 'acquired'; readonly value: T }\n\t| { readonly kind: 'busy' };\n\nexport type PgTransitionClientLease = {\n\treadonly client: PoolClient;\n\tquery(\n\t\tsql: string,\n\t\tparams?: unknown,\n\t): Promise<{\n\t\treadonly rows: readonly Record<string, unknown>[];\n\t}>;\n\trelease(error?: unknown): void;\n};\n\n/**\n * The whole state set which a plan operation is never allowed to change.\n *\n * Keep this closed and named here. These settings are the complete PostgreSQL\n * execution-contract vocabulary, including the provenance-only clauses: plan\n * SQL must not be able to turn either its rendering prerequisites or its\n * reviewed session provenance into a different execution environment.\n */\nconst DURABLE_PLAN_OPERATION_INVARIANT_SETTINGS = [\n\t{\n\t\tsetting: 'standard_conforming_strings',\n\t\tcolumn: 'standard_conforming_strings',\n\t},\n\t{ setting: 'search_path', column: 'search_path' },\n\t{ setting: 'client_encoding', column: 'client_encoding' },\n\t{ setting: 'TimeZone', column: 'time_zone' },\n] as const;\n\ntype DurablePlanOperationInvariantSnapshot = {\n\treadonly sessionUser: string;\n\treadonly currentUser: string;\n\treadonly settings: Readonly<\n\t\tRecord<\n\t\t\t(typeof DURABLE_PLAN_OPERATION_INVARIANT_SETTINGS)[number]['column'],\n\t\t\tstring\n\t\t>\n\t>;\n};\n\n/**\n * Declare a pg Pool as a source of transition leases.\n *\n * The typed Pool argument and this explicit factory call are the declaration.\n * Neither check below infers ownership; each rejects a declaration that\n * contradicts itself.\n *\n * A pg Pool and a pg Client are structurally identical — both expose connect(),\n * query() and end(), and neither exposes release() — so the argument cannot be\n * classified on sight. What connect() returns can be: a Pool leases a\n * PoolClient, which carries release(); a Client resolves to itself, which does\n * not. The lease is therefore checked at the first acquisition, which costs one\n * connection to learn and is why the constructor cannot report it.\n *\n * This deliberately avoids `instanceof Client`, which would be sound but\n * requires importing pg at runtime. Nothing else in this package does, so the\n * compiler and the SQL renderer work without a driver, and one guard is not\n * worth spending that.\n */\nexport function createPgTransitionLessor(pool: Pool): TransitionLessor {\n\tif (\n\t\tpool != null &&\n\t\t(typeof pool === 'object' || typeof pool === 'function') &&\n\t\ttypeof (pool as { readonly release?: unknown }).release === 'function'\n\t) {\n\t\tthrow new Error(\n\t\t\t'createPgTransitionLessor received a checked-out pg PoolClient. ' +\n\t\t\t\t'A transition owns its lease from acquisition to release, so it needs a ' +\n\t\t\t\t'pool to lease from; there is no borrowed-client mode here. Pass the pg ' +\n\t\t\t\t'Pool the client was checked out of.',\n\t\t);\n\t}\n\treturn createTransitionLessor(async () => {\n\t\tconst lease = await acquirePgTransitionClient(pool);\n\t\treturn Object.freeze({\n\t\t\tquery: lease.query,\n\t\t\trelease: lease.release,\n\t\t});\n\t});\n}\n\n/**\n * Acquire a configured PostgreSQL transition client.\n *\n * Callers that use the native adapter must pass this checked-out client with\n * `borrowedClient: true` and return it through `release()` when finished.\n */\nexport async function acquirePgTransitionClient(\n\tpool: Pool,\n): Promise<PgTransitionClientLease> {\n\tconst client = await pool.connect();\n\t// Capture the way to close this connection before reading the member that\n\t// decides whether it must be closed, so a getter cannot remove the only\n\t// cleanup left on the very path that needs it.\n\tconst end = readMember(client, 'end');\n\tconst release = readMember(client, 'release');\n\tconst query = readMember(client, 'query');\n\tif (typeof release !== 'function' || typeof query !== 'function') {\n\t\tif (typeof release === 'function') {\n\t\t\tconst rejection = new Error(\n\t\t\t\t'createPgTransitionLessor acquired a malformed pg lease without query(); ' +\n\t\t\t\t\t'it was returned through its captured release().',\n\t\t\t);\n\t\t\ttry {\n\t\t\t\t// Contained rather than awaited: pg's release() returns nothing, and\n\t\t\t\t// a promise handed back against that contract only needs a handler\n\t\t\t\t// in this turn so it cannot surface unhandled. The last-resort\n\t\t\t\t// close below follows the same policy, for the same reason.\n\t\t\t\tvoid Promise.resolve(release.call(client, rejection)).catch(\n\t\t\t\t\t() => undefined,\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\t// Reporting the malformed acquisition matters more than this cleanup.\n\t\t\t}\n\t\t\tthrow rejection;\n\t\t}\n\t\t// connect() opened a value with no callable release path, so end() is the\n\t\t// remaining cleanup route. Leaving it open leaks a socket on every repeat.\n\t\tendLeakedConnection(client, end);\n\t\tthrow new Error(\n\t\t\t'createPgTransitionLessor was given a pg Client rather than a pg Pool: ' +\n\t\t\t\t'connect() returned the connection itself without release(), so no ' +\n\t\t\t\t'acquired lease could be returned. Pass a pg Pool.',\n\t\t);\n\t}\n\ttry {\n\t\tawait configurePgUtf8({\n\t\t\tquery: (sql, params) => query.call(client, sql, params),\n\t\t});\n\t} catch (error) {\n\t\ttry {\n\t\t\trelease.call(\n\t\t\t\tclient,\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t);\n\t\t} catch {\n\t\t\t// The UTF-8 acquisition failure remains the useful result.\n\t\t}\n\t\tthrow error;\n\t}\n\treturn Object.freeze({\n\t\tclient,\n\t\tquery: (sql: string, params?: unknown) => query.call(client, sql, params),\n\t\trelease: (error?: unknown) => release.call(client, error),\n\t});\n}\n\n/**\n * Hold a session advisory lock on the same checked-out session used for every\n * transition segment. `pg_try_advisory_lock` makes contention an explicit\n * `busy` result rather than a hidden queue; releasing the client also releases\n * the lock if an unlock attempt itself fails.\n */\nexport async function withPgTransitionRunLock<T>(\n\tpool: Pool,\n\trunId: string,\n\tcallback: (target: ExclusiveTransitionTarget) => Promise<T>,\n): Promise<PgTransitionRunLockResult<T>> {\n\tconst client = await pool.connect();\n\tconst key = advisoryKey(runId);\n\tlet locked = false;\n\tlet bodyFailed = false;\n\tlet cleanupFailure: Error | undefined;\n\tlet deadConnectionFailure: Error | undefined;\n\tlet value: T | undefined;\n\tlet callbackLive = false;\n\tlet planOperationViolatedInvariant = false;\n\tlet leaseReleaseFailure: Error | undefined;\n\tlet runLease: TransitionQueryClient | undefined;\n\tconst refuseAfterLeaseReleaseFailure = () => {\n\t\tif (!leaseReleaseFailure) return;\n\t\tthrow new Error(\n\t\t\t'PostgreSQL transition session is compromised after a lease release failure',\n\t\t\t{ cause: leaseReleaseFailure },\n\t\t);\n\t};\n\tconst query = async (sql: string, params?: unknown) => {\n\t\trefuseAfterLeaseReleaseFailure();\n\t\ttry {\n\t\t\treturn (await client.query(sql, params as never)) as {\n\t\t\t\treadonly rows: readonly Record<string, unknown>[];\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (isDeadPgConnectionError(error))\n\t\t\t\tdeadConnectionFailure = asError(error);\n\t\t\tthrow error;\n\t\t}\n\t};\n\ttry {\n\t\tawait configurePgUtf8({ query });\n\t\tconst result = await query(\n\t\t\t'SELECT pg_catalog.pg_try_advisory_lock($1::bigint) AS locked',\n\t\t\t[key.toString()],\n\t\t);\n\t\tif (result.rows[0]?.locked !== true) return { kind: 'busy' };\n\t\tlocked = true;\n\t\tconst invariants = await captureDurablePlanOperationInvariants(query, key);\n\t\tconst lessor = createTransitionLessor(async () => {\n\t\t\trefuseAfterLeaseReleaseFailure();\n\t\t\tif (runLease) return runLease;\n\t\t\trunLease = Object.freeze({\n\t\t\t\t// This channel is adapter-owned infrastructure: execution-contract\n\t\t\t\t// setup, authorization, journals, and lock cleanup are not plan SQL.\n\t\t\t\tquery: (sql: string, params?: unknown) => query(sql, params),\n\t\t\t\t// Core only selects this channel for executeOperation(). Guarding\n\t\t\t\t// the origin rather than parsing SQL means every spelling reaches the\n\t\t\t\t// same invariant check, while our own SET/SHOW contract clauses do not.\n\t\t\t\tqueryPlanOperation: async (sql: string, params?: unknown) => {\n\t\t\t\t\trefuseAfterLeaseReleaseFailure();\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait assertDurablePlanOperationInvariants(query, key, invariants);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// A failed check at either boundary makes this session unsafe to\n\t\t\t\t\t\t// pool, even if the final unlock happens to succeed.\n\t\t\t\t\t\tplanOperationViolatedInvariant = true;\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\tlet result:\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\treadonly rows: readonly Record<string, unknown>[];\n\t\t\t\t\t\t }\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tlet queryFailure: unknown;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresult = await classifyPgWrite(() => query(sql, params));\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tqueryFailure = error;\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait assertDurablePlanOperationInvariants(query, key, invariants);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tplanOperationViolatedInvariant = true;\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\tif (queryFailure) throw queryFailure;\n\t\t\t\t\treturn result as {\n\t\t\t\t\t\treadonly rows: readonly Record<string, unknown>[];\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\t// Segment cleanup must not give back the session that owns the run lock.\n\t\t\t\trelease: (error?: unknown) => {\n\t\t\t\t\tif (error && !leaseReleaseFailure) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tleaseReleaseFailure =\n\t\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t\t? error\n\t\t\t\t\t\t\t\t\t: new Error('transition lease reported a non-Error failure', {\n\t\t\t\t\t\t\t\t\t\t\tcause: error,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tleaseReleaseFailure = new Error(\n\t\t\t\t\t\t\t\t'transition lease reported a non-Error failure',\n\t\t\t\t\t\t\t\t{ cause: error },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t} as TransitionQueryClient);\n\t\t\treturn runLease;\n\t\t});\n\t\tcallbackLive = true;\n\t\tconst target = createExclusiveTransitionTarget(lessor, () => callbackLive);\n\t\tvalue = await callback(target);\n\t} catch (error) {\n\t\tbodyFailed = true;\n\t\tthrow error;\n\t} finally {\n\t\tcallbackLive = false;\n\t\tconst physicalSessionCompromisedBeforeCleanup =\n\t\t\trunLease != null && transitionPhysicalSessionIsCompromised(runLease);\n\t\t// A dead backend has already released its session advisory locks, and a\n\t\t// compromised lease receives no more queries. Asking either client to unlock\n\t\t// would only mask the callback's primary outcome.\n\t\tif (\n\t\t\tlocked &&\n\t\t\t!deadConnectionFailure &&\n\t\t\t!leaseReleaseFailure &&\n\t\t\t!physicalSessionCompromisedBeforeCleanup\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst unlock = await query(\n\t\t\t\t\t'SELECT pg_catalog.pg_advisory_unlock($1::bigint) AS unlocked',\n\t\t\t\t\t[key.toString()],\n\t\t\t\t);\n\t\t\t\tif (unlock.rows[0]?.unlocked !== true)\n\t\t\t\t\tcleanupFailure = new Error(\n\t\t\t\t\t\t'PostgreSQL transition run lock cleanup failed: pg_advisory_unlock did not confirm ownership',\n\t\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (!isDeadPgConnectionError(error))\n\t\t\t\t\tcleanupFailure = new Error(\n\t\t\t\t\t\t`PostgreSQL transition run lock cleanup failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// A wrapper may be marked while the awaited unlock is pending, so this must\n\t\t// be read after the final cleanup await and immediately before release.\n\t\t// An unconfirmed unlock may leave a session advisory lock behind. pg-pool\n\t\t// destroys a client when release receives a truthy error, which is the only\n\t\t// safe cleanup because PostgreSQL releases session locks on disconnect.\n\t\ttry {\n\t\t\tconst returned = client.release(\n\t\t\t\tleaseReleaseFailure ??\n\t\t\t\t\tcleanupFailure ??\n\t\t\t\t\tdeadConnectionFailure ??\n\t\t\t\t\t(runLease != null && transitionPhysicalSessionIsCompromised(runLease)\n\t\t\t\t\t\t? new Error(\n\t\t\t\t\t\t\t\t'transition execution marked its leased client compromised',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: undefined) ??\n\t\t\t\t\t(planOperationViolatedInvariant\n\t\t\t\t\t\t? new Error(\n\t\t\t\t\t\t\t\t'PostgreSQL transition plan operation violated the exclusive session invariants',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: undefined),\n\t\t\t);\n\t\t\tvoid Promise.resolve(returned).catch(() => undefined);\n\t\t} catch {\n\t\t\t// A pool cleanup failure must not mask the callback's primary result.\n\t\t}\n\t}\n\tif (cleanupFailure && !bodyFailed) throw cleanupFailure;\n\treturn { kind: 'acquired', value: value as T };\n}\n\n/** pg-pool only evicts a checked-out client when release receives a truthy error. */\nexport function isDeadPgConnectionError(error: unknown): boolean {\n\tif (\n\t\terror == null ||\n\t\t(typeof error !== 'object' && typeof error !== 'function')\n\t)\n\t\treturn false;\n\tconst candidate = error as {\n\t\treadonly code?: unknown;\n\t\treadonly message?: unknown;\n\t};\n\tif (\n\t\tcandidate.code === '57P01' ||\n\t\tcandidate.code === '57P02' ||\n\t\tcandidate.code === '57P03' ||\n\t\tcandidate.code === 'ECONNRESET' ||\n\t\tcandidate.code === 'EPIPE' ||\n\t\tcandidate.code === 'ETIMEDOUT'\n\t)\n\t\treturn true;\n\treturn (\n\t\ttypeof candidate.message === 'string' &&\n\t\t/connection (?:terminated|ended|closed|lost)|client has encountered a connection error/iu.test(\n\t\t\tcandidate.message,\n\t\t)\n\t);\n}\n\nfunction asError(error: unknown): Error {\n\treturn error instanceof Error ? error : new Error(String(error));\n}\n\n/**\n * Establish the text encoding before any caller receives a session. The SHOW\n * is deliberately part of acquisition: SET succeeding is not proof that this\n * backend will encode future database text as UTF-8.\n */\nasync function configurePgUtf8(client: {\n\tquery(\n\t\tsql: string,\n\t\tparams?: readonly unknown[],\n\t): Promise<{\n\t\treadonly rows: readonly Record<string, unknown>[];\n\t}>;\n}): Promise<void> {\n\tawait client.query(\"SET client_encoding TO 'UTF8'\");\n\tconst value = String(\n\t\t(await client.query('SHOW client_encoding')).rows[0]?.client_encoding ?? '',\n\t);\n\tif (value !== 'UTF8')\n\t\tthrow new Error(\n\t\t\t`PostgreSQL client_encoding expected \"UTF8\", observed ${JSON.stringify(value || 'no value')}`,\n\t\t);\n}\n\n/**\n * Assert the properties owned by the exclusive durable session. This is a\n * state check, not a SQL recognizer: alternative spelling, comments, compound\n * statements, and future PostgreSQL syntax all get the same answer.\n */\nasync function captureDurablePlanOperationInvariants(\n\tclient: PgQueryable,\n\tkey: bigint,\n): Promise<DurablePlanOperationInvariantSnapshot> {\n\tconst row = await readDurablePlanOperationInvariants(client, key);\n\tif (row.runLockHeld !== true) {\n\t\tthrow new Error(\n\t\t\t'PostgreSQL transition run lock was not held while capturing durable plan operation invariants',\n\t\t);\n\t}\n\treturn {\n\t\tsessionUser: row.sessionUser,\n\t\tcurrentUser: row.currentUser,\n\t\tsettings: row.settings,\n\t};\n}\n\nasync function assertDurablePlanOperationInvariants(\n\tclient: PgQueryable,\n\tkey: bigint,\n\texpected: DurablePlanOperationInvariantSnapshot,\n): Promise<void> {\n\tconst row = await readDurablePlanOperationInvariants(client, key);\n\tif (\n\t\trow.runLockHeld !== true ||\n\t\trow.sessionUser !== expected.sessionUser ||\n\t\trow.currentUser !== expected.currentUser ||\n\t\tDURABLE_PLAN_OPERATION_INVARIANT_SETTINGS.some(\n\t\t\t({ column }) => row.settings[column] !== expected.settings[column],\n\t\t)\n\t) {\n\t\tthrow new Error(\n\t\t\t'durable plan operation may not release the run lock, change effective authority, or change execution-contract session settings',\n\t\t);\n\t}\n}\n\nasync function readDurablePlanOperationInvariants(\n\tclient: PgQueryable,\n\tkey: bigint,\n): Promise<{\n\treadonly runLockHeld: boolean;\n\treadonly sessionUser: string;\n\treadonly currentUser: string;\n\treadonly settings: DurablePlanOperationInvariantSnapshot['settings'];\n}> {\n\tconst { classId, objectId } = advisoryLockIds(key);\n\tconst settingColumns = DURABLE_PLAN_OPERATION_INVARIANT_SETTINGS.map(\n\t\t({ setting, column }) => `current_setting('${setting}') AS ${column}`,\n\t).join(',\\n\\t\\t\\t\\t');\n\tconst row = (\n\t\tawait client(\n\t\t\t`SELECT\n\t\t\t\tEXISTS (\n\t\t\t\t\tSELECT 1\n\t\t\t\t\tFROM pg_catalog.pg_locks\n\t\t\t\t\tWHERE locktype = 'advisory'\n\t\t\t\t\t\tAND pid = pg_backend_pid()\n\t\t\t\t\t\tAND classid = $1::oid\n\t\t\t\t\t\tAND objid = $2::oid\n\t\t\t\t\t\tAND objsubid = 1\n\t\t\t\t\t\tAND granted\n\t\t\t\t) AS run_lock_held,\n\t\t\t\tsession_user::text AS session_user,\n\t\t\t\tcurrent_user::text AS current_user,\n\t\t\t\t${settingColumns}`,\n\t\t\t[classId, objectId],\n\t\t)\n\t).rows[0];\n\tconst settings = Object.fromEntries(\n\t\tDURABLE_PLAN_OPERATION_INVARIANT_SETTINGS.map(({ column }) => [\n\t\t\tcolumn,\n\t\t\treadDurablePlanOperationInvariantString(row, column),\n\t\t]),\n\t) as DurablePlanOperationInvariantSnapshot['settings'];\n\treturn {\n\t\trunLockHeld: row?.run_lock_held === true,\n\t\tsessionUser: readDurablePlanOperationInvariantString(row, 'session_user'),\n\t\tcurrentUser: readDurablePlanOperationInvariantString(row, 'current_user'),\n\t\tsettings,\n\t};\n}\n\ntype PgQueryable = (\n\tsql: string,\n\tparams?: unknown,\n) => Promise<{ readonly rows: readonly Record<string, unknown>[] }>;\n\nfunction readDurablePlanOperationInvariantString(\n\trow: Record<string, unknown> | undefined,\n\tcolumn: string,\n): string {\n\tconst value = row?.[column];\n\tif (typeof value !== 'string')\n\t\tthrow new Error(\n\t\t\t`PostgreSQL transition run invariant probe returned no string ${column}`,\n\t\t);\n\treturn value;\n}\n\nfunction advisoryLockIds(key: bigint): {\n\treadonly classId: number;\n\treadonly objectId: number;\n} {\n\tconst unsigned = BigInt.asUintN(64, key);\n\treturn {\n\t\tclassId: Number((unsigned >> 32n) & 0xffff_ffffn),\n\t\tobjectId: Number(unsigned & 0xffff_ffffn),\n\t};\n}\n\nfunction advisoryKey(runId: string): bigint {\n\tconst bytes = createHash('sha256')\n\t\t.update('dbsp.transition.run.v1:\\0')\n\t\t.update(runId)\n\t\t.digest();\n\treturn bytes.readBigInt64BE(0);\n}\n\n/**\n * Close a connection opened by a failed acquisition, best effort. The failure\n * being reported is the caller's mistake; a cleanup failure on top of it must\n * not replace that message with a less useful one.\n *\n * Started, not awaited, on the same policy as every other cleanup here. Waiting\n * would hand an unbounded delay to the thing that already misbehaved: a broken\n * socket, or an `end()` that simply never settles, would hold `acquire()` open\n * forever instead of reporting the caller's mistake. Nothing reads the outcome\n * either way, so waiting for it buys nothing it could act on.\n */\nfunction endLeakedConnection(client: unknown, end: unknown): void {\n\tif (typeof end !== 'function') {\n\t\treturn;\n\t}\n\ttry {\n\t\tvoid Promise.resolve(end.call(client)).catch(() => undefined);\n\t} catch {\n\t\t// Reporting the caller's mistake matters more than this cleanup.\n\t}\n}\n\n/**\n * Read one member, treating a member that throws on read as absent.\n *\n * Inspecting a connection this factory just opened must not throw past the only\n * code that can close it — the leak this guard exists to prevent would then\n * happen on the guard's own path.\n */\nfunction readMember(\n\tvalue: unknown,\n\tmember: 'release' | 'end' | 'query',\n): unknown {\n\tif (\n\t\tvalue == null ||\n\t\t(typeof value !== 'object' && typeof value !== 'function')\n\t) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\treturn (value as Record<string, unknown>)[member];\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n","import { randomBytes } from 'node:crypto';\nimport type {\n\tDeclarationSet,\n\tLedgerAddress,\n\tLedgerHome,\n\tLedgerIdentity,\n\tLedgerMarkerState,\n\tReinitializePreflightAdoptionCandidate,\n\tReinitializePreflightFailureStep,\n\tReinitializePreflightRefusalCode,\n\tReinitializePreflightReport,\n\tReinitializePreflightScopeReport,\n} from '@dbsp/types';\nimport { validateIdentifier } from '../validate.js';\nimport {\n\tDBSP_LEDGER_EVENT_TABLE,\n\tDBSP_LEDGER_IDENTITY_TABLE,\n\tDBSP_LEDGER_MARKER_TABLE,\n\tDBSP_LEDGER_TABLES,\n\tDBSP_META_SCHEMA,\n\tisDbspLedgerInfrastructureTable,\n} from './constants.js';\nimport {\n\tassertPgDatabaseWritable,\n\tisPgDatabaseReadOnlyError,\n} from './database-writability.js';\nimport type { TransitionJournalQueryable } from './journal.js';\nimport {\n\tacquirePgLedgerLocks,\n\tensureDbspMetaLedger,\n\tensurePgLedger,\n\tPG_LEDGER_SHAPE_VERSION,\n\treadPgLedgerReservationsForPairInHomes,\n\trecordPgLedgerIdentity,\n\tvalidatePgLedgerPhysicalShape,\n\twritePgLedgerShapeMarker,\n} from './ledger.js';\nimport { isDeadPgConnectionError } from './lessor.js';\n\nexport type ReinitializePreflightCheckpoint =\n\t| 'archive'\n\t| 'create'\n\t| 'grants'\n\t| 'marker'\n\t| 'output';\n\n/** Test-only callers can observe real engine progress without changing production flow. */\nexport type ReinitializePreflightObserver = (\n\tcheckpoint: ReinitializePreflightCheckpoint,\n\tledger?: LedgerHome,\n) => Promise<void>;\n\nexport interface PgReinitializePreflightClient\n\textends TransitionJournalQueryable {\n\trelease?(error?: unknown): void;\n}\n\nexport interface PgReinitializePreflightPool {\n\tconnect(): Promise<PgReinitializePreflightClient>;\n}\n\nfunction isConfirmedPgServerError(error: unknown): boolean {\n\tif (\n\t\terror == null ||\n\t\t(typeof error !== 'object' && typeof error !== 'function')\n\t)\n\t\treturn false;\n\tconst code = (error as { readonly code?: unknown }).code;\n\treturn (\n\t\ttypeof code === 'string' &&\n\t\t/^[0-9A-Z]{5}$/u.test(code) &&\n\t\t!isDeadPgConnectionError(error)\n\t);\n}\n\nfunction releasePreflightClient(\n\tclient: PgReinitializePreflightClient,\n\tfailed: boolean,\n\tfailure: unknown,\n\trollbackFailed: boolean,\n): void {\n\tclient.release?.(\n\t\t!failed ||\n\t\t\t(!rollbackFailed &&\n\t\t\t\t(isConfirmedPgServerError(failure) ||\n\t\t\t\t\tisPgDatabaseReadOnlyError(failure)))\n\t\t\t? undefined\n\t\t\t: failure instanceof Error\n\t\t\t\t? failure\n\t\t\t\t: new Error(String(failure)),\n\t);\n}\n\nexport interface PgReinitializePreflightOptions {\n\treadonly pool: PgReinitializePreflightPool;\n\t/** Schema names only. `dbsp_meta` is always added as the database ledger. */\n\treadonly schemas: readonly string[];\n\treadonly declarations: DeclarationSet;\n\treadonly writeAdoptionFile: (\n\t\treport: ReinitializePreflightReport,\n\t) => Promise<void>;\n\treadonly observer?: ReinitializePreflightObserver;\n}\n\nconst LEDGER_TABLES = DBSP_LEDGER_TABLES;\n\n/** Bound every PostgreSQL object-lock wait made by one preflight scope. */\nexport const REINITIALIZE_PREFLIGHT_LOCK_TIMEOUT_SQL =\n\t\"SET LOCAL lock_timeout = '5s'\";\n\nfunction quoteIdent(value: string, type: 'schema' | 'table'): string {\n\tvalidateIdentifier(value, type);\n\treturn `\"${value.replaceAll('\"', '\"\"')}\"`;\n}\n\nfunction schemaFor(home: LedgerHome): string {\n\tif (home.scope === 'database') return DBSP_META_SCHEMA;\n\tif (!home.schema)\n\t\tthrow new Error('schema ledger target is missing its schema');\n\treturn home.schema;\n}\n\nfunction qualified(home: LedgerHome, table: string): string {\n\treturn `${quoteIdent(schemaFor(home), 'schema')}.${quoteIdent(table, 'table')}`;\n}\n\n/**\n * Creation-time ownership and ACLs. Existing current ledgers are only\n * validated, never silently repaired, so a widened grant remains a refusal.\n */\nexport function renderReinitializePreflightCreationGrantSql(\n\thome: LedgerHome,\n): readonly string[] {\n\treturn [\n\t\t...(home.scope === 'database'\n\t\t\t? [\n\t\t\t\t\t`ALTER SCHEMA ${quoteIdent(DBSP_META_SCHEMA, 'schema')} OWNER TO CURRENT_USER`,\n\t\t\t\t\t`REVOKE ALL ON SCHEMA ${quoteIdent(DBSP_META_SCHEMA, 'schema')} FROM PUBLIC`,\n\t\t\t\t]\n\t\t\t: []),\n\t\t...LEDGER_TABLES.flatMap((table) => [\n\t\t\t`ALTER TABLE ${qualified(home, table)} OWNER TO CURRENT_USER`,\n\t\t\t`REVOKE ALL ON TABLE ${qualified(home, table)} FROM PUBLIC`,\n\t\t]),\n\t];\n}\n\nfunction homesFor(schemas: readonly string[]): readonly LedgerHome[] {\n\tconst names = [...new Set(schemas)].sort();\n\tfor (const name of names) validateIdentifier(name, 'schema');\n\treturn [\n\t\t{ scope: 'database' },\n\t\t...names.map((schema) => ({ scope: 'schema' as const, schema })),\n\t];\n}\n\nfunction errorDetail(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\n/**\n * These SQLSTATEs mean that this deployment role cannot inspect the requested\n * scope. They are not evidence that an existing marker is malformed.\n */\nconst SCOPE_ACCESS_DENIED_SQLSTATES = new Set([\n\t'42501', // insufficient_privilege\n\t'3F000', // invalid_schema_name\n]);\n\nfunction pgErrorCode(error: unknown): string | undefined {\n\tif (typeof error !== 'object' || error === null || !('code' in error))\n\t\treturn undefined;\n\tconst code = error.code;\n\treturn typeof code === 'string' ? code : undefined;\n}\n\n/** Classifies server errors only by SQLSTATE, never by their message text. */\nexport function isPgReinitializeScopeAccessDenied(error: unknown): boolean {\n\treturn SCOPE_ACCESS_DENIED_SQLSTATES.has(pgErrorCode(error) ?? '');\n}\n\nfunction markerRefusal(marker: LedgerMarkerState): string {\n\tswitch (marker.kind) {\n\t\tcase 'older':\n\t\t\treturn `reinitialize-preflight refuses older marker version ${marker.version}`;\n\t\tcase 'future':\n\t\t\treturn `reinitialize-preflight refuses future marker version ${marker.version}`;\n\t\tcase 'mixed':\n\t\t\treturn `reinitialize-preflight refuses mixed marker versions ${marker.versions.join(', ')}`;\n\t\tcase 'unreadable':\n\t\t\treturn `reinitialize-preflight refuses unreadable marker: ${marker.reason}`;\n\t\tdefault:\n\t\t\treturn 'reinitialize-preflight marker refusal';\n\t}\n}\n\nexport function classifyPgLedgerMarker(\n\tversions: readonly number[] | undefined,\n\treadError?: unknown,\n): LedgerMarkerState {\n\tif (readError !== undefined)\n\t\treturn { kind: 'unreadable', reason: errorDetail(readError) };\n\tif (versions === undefined) return { kind: 'absent' };\n\tconst distinct = [...new Set(versions)].sort((left, right) => left - right);\n\tif (distinct.length !== 1) return { kind: 'mixed', versions: distinct };\n\tconst version = distinct[0];\n\tif (version === undefined) return { kind: 'mixed', versions: distinct };\n\tif (version === PG_LEDGER_SHAPE_VERSION) return { kind: 'current' };\n\treturn version < PG_LEDGER_SHAPE_VERSION\n\t\t? { kind: 'older', version }\n\t\t: { kind: 'future', version };\n}\n\n/**\n * Read exactly one ledger shape marker without creating or repairing anything.\n * Ordinary command surfaces use this to refuse a non-current mutating scope;\n * inspect deliberately reports the returned value instead.\n */\nexport async function readPgLedgerMarker(\n\texecutor: TransitionJournalQueryable,\n\thome: LedgerHome,\n): Promise<LedgerMarkerState> {\n\tconst marker = await executor.query('SELECT to_regclass($1) AS relation', [\n\t\tqualified(home, DBSP_LEDGER_MARKER_TABLE),\n\t]);\n\tif (\n\t\tmarker.rows[0]?.relation !== null &&\n\t\tmarker.rows[0]?.relation !== undefined\n\t) {\n\t\tconst rows = await executor.query(\n\t\t\t`SELECT version FROM ${qualified(home, DBSP_LEDGER_MARKER_TABLE)} ORDER BY version`,\n\t\t);\n\t\tconst versions = rows.rows.map((row) => Number(row.version));\n\t\tif (versions.some((version) => !Number.isInteger(version))) {\n\t\t\treturn {\n\t\t\t\tkind: 'unreadable',\n\t\t\t\treason: 'marker version is not an integer',\n\t\t\t};\n\t\t}\n\t\treturn classifyPgLedgerMarker(versions);\n\t}\n\treturn classifyPgLedgerMarker(undefined);\n}\n\nexport interface ReinitializePreflightScopeInspection {\n\treadonly home: LedgerHome;\n\treadonly marker: LedgerMarkerState;\n\treadonly identity?: LedgerIdentity;\n\t/** An inspection-time SQLSTATE access denial for this scope only. */\n\treadonly accessFailure?: string;\n}\n\n/**\n * Ordinary mutating commands consume this read-only admission result. It\n * intentionally delegates equality to the preflight's recorded-vs-live\n * comparison, keeping that pair as the only ledger lineage comparison.\n */\nexport type PgLedgerScopeCurrency =\n\t| { readonly kind: 'absent'; readonly marker: LedgerMarkerState }\n\t| { readonly kind: 'current'; readonly marker: LedgerMarkerState }\n\t| {\n\t\t\treadonly kind: 'not-current';\n\t\t\treadonly marker: LedgerMarkerState;\n\t\t\treadonly reason: 'marker' | 'lineage';\n\t };\n\nasync function readIdentity(\n\texecutor: TransitionJournalQueryable,\n\thome: LedgerHome,\n): Promise<LedgerIdentity> {\n\tconst result = await executor.query(\n\t\t`SELECT cluster_system_identifier, database_oid, namespace_oid FROM ${qualified(home, DBSP_LEDGER_IDENTITY_TABLE)} WHERE id = true`,\n\t);\n\tif (result.rows.length !== 1)\n\t\tthrow new Error('ledger identity is missing or ambiguous');\n\tconst row = result.rows[0] ?? {};\n\tif (\n\t\ttypeof row.cluster_system_identifier !== 'string' ||\n\t\ttypeof row.database_oid !== 'string' ||\n\t\t(row.namespace_oid !== null && typeof row.namespace_oid !== 'string')\n\t)\n\t\tthrow new Error('ledger identity is unreadable');\n\treturn {\n\t\tclusterSystemIdentifier: row.cluster_system_identifier,\n\t\tdatabaseOid: row.database_oid,\n\t\t...(row.namespace_oid === null ? {} : { namespaceOid: row.namespace_oid }),\n\t};\n}\n\nasync function readLiveIdentity(\n\texecutor: TransitionJournalQueryable,\n\thome: LedgerHome,\n): Promise<LedgerIdentity> {\n\tconst result = await executor.query(\n\t\t`SELECT (pg_catalog.pg_control_system()).system_identifier::text AS cluster_system_identifier, d.oid::text AS database_oid, n.oid::text AS namespace_oid FROM pg_catalog.pg_database d CROSS JOIN pg_catalog.pg_namespace n WHERE d.datname = pg_catalog.current_database() AND n.nspname = $1`,\n\t\t[schemaFor(home)],\n\t);\n\tconst row = result.rows[0] ?? {};\n\tif (\n\t\ttypeof row.cluster_system_identifier !== 'string' ||\n\t\ttypeof row.database_oid !== 'string' ||\n\t\ttypeof row.namespace_oid !== 'string'\n\t)\n\t\tthrow new Error(\n\t\t\t`live identity for scope ${schemaFor(home)} could not be read`,\n\t\t);\n\treturn {\n\t\tclusterSystemIdentifier: row.cluster_system_identifier,\n\t\tdatabaseOid: row.database_oid,\n\t\tnamespaceOid: row.namespace_oid,\n\t};\n}\n\nfunction sameIdentity(left: LedgerIdentity, right: LedgerIdentity): boolean {\n\treturn (\n\t\tleft.clusterSystemIdentifier === right.clusterSystemIdentifier &&\n\t\tleft.databaseOid === right.databaseOid &&\n\t\tleft.namespaceOid === right.namespaceOid\n\t);\n}\n\nexport async function readPgLedgerScopeCurrency(\n\texecutor: TransitionJournalQueryable,\n\thome: LedgerHome,\n): Promise<PgLedgerScopeCurrency> {\n\tconst marker = await readPgLedgerMarker(executor, home);\n\tif (marker.kind === 'absent') return { kind: 'absent', marker };\n\tif (marker.kind !== 'current')\n\t\treturn { kind: 'not-current', marker, reason: 'marker' };\n\tconst recorded = await readIdentity(executor, home);\n\tconst live = await readLiveIdentity(executor, home);\n\treturn sameIdentity(recorded, live)\n\t\t? { kind: 'current', marker }\n\t\t: { kind: 'not-current', marker, reason: 'lineage' };\n}\n\n/**\n * Pair recovery reads only homes already selected by the durable run. A\n * same-named user table in another schema is never discovery evidence for a\n * pair; callers must first establish the finite candidate homes from reviewed\n * material and then each home is admitted here.\n */\nexport async function readVerifiedPgLedgerReservationsForPair(\n\texecutor: TransitionJournalQueryable,\n\tpairId: string,\n\thomes: readonly LedgerHome[],\n) {\n\tfor (const home of homes) {\n\t\tconst currency = await readPgLedgerScopeCurrency(executor, home);\n\t\tif (currency.kind !== 'current')\n\t\t\tthrow new Error(\n\t\t\t\t`reservation table in ${schemaFor(home)} is not a current ledger`,\n\t\t\t);\n\t\tawait validatePgLedgerPhysicalShape(executor, home);\n\t}\n\treturn readPgLedgerReservationsForPairInHomes(executor, pairId, homes);\n}\n\nasync function inspectScope(\n\texecutor: TransitionJournalQueryable,\n\thome: LedgerHome,\n): Promise<ReinitializePreflightScopeInspection> {\n\ttry {\n\t\tconst marker = await readPgLedgerMarker(executor, home);\n\t\tif (marker.kind !== 'current') return { home, marker };\n\t\treturn { home, marker, identity: await readIdentity(executor, home) };\n\t} catch (error) {\n\t\tif (isPgReinitializeScopeAccessDenied(error)) {\n\t\t\treturn {\n\t\t\t\thome,\n\t\t\t\t// No marker fact was observed. `absent` is the non-refusal marker\n\t\t\t\t// state; accessFailure retains the actual inspection result.\n\t\t\t\tmarker: { kind: 'absent' },\n\t\t\t\taccessFailure: errorDetail(error),\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\thome,\n\t\t\tmarker: { kind: 'unreadable', reason: errorDetail(error) },\n\t\t};\n\t}\n}\n\n/**\n * A relation bearing a ledger table name is not proof of a ledger. Capture\n * that fact before CREATE ... IF NOT EXISTS so a pre-existing foreign or\n * partial ledger cannot be silently completed and admitted as ours.\n */\nasync function hasPreexistingLedgerRelations(\n\texecutor: TransitionJournalQueryable,\n\thome: LedgerHome,\n): Promise<boolean> {\n\tconst result = await executor.query(\n\t\t`SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class relation JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace WHERE namespace.nspname = $1 AND relation.relname = ANY($2::text[])) AS present`,\n\t\t[schemaFor(home), DBSP_LEDGER_TABLES],\n\t);\n\treturn result.rows[0]?.present === true;\n}\n\nfunction inspectionAccessFailure(\n\tinspection: ReinitializePreflightScopeInspection,\n): ReinitializePreflightScopeReport | undefined {\n\tif (inspection.accessFailure === undefined) return undefined;\n\treturn refusal(\n\t\tinspection.home,\n\t\tinspection.marker,\n\t\t'reinitialize-preflight-failed',\n\t\tinspection.accessFailure,\n\t\t'marker',\n\t);\n}\n\nasync function validateOwnershipAndGrants(\n\texecutor: TransitionJournalQueryable,\n\thome: LedgerHome,\n): Promise<void> {\n\tconst currentUser = await executor.query('SELECT current_user AS role');\n\tconst role = currentUser.rows[0]?.role;\n\tif (typeof role !== 'string')\n\t\tthrow new Error('current_user could not be read');\n\tconst objects = await executor.query(\n\t\t`SELECT c.relname, pg_catalog.pg_get_userbyid(c.relowner) AS owner, EXISTS (SELECT 1 FROM pg_catalog.aclexplode(COALESCE(c.relacl, pg_catalog.acldefault('r', c.relowner))) acl WHERE acl.grantee = 0 OR acl.grantee <> c.relowner) AS widened FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = $1 AND c.relname = ANY($2::text[]) AND c.relkind IN ('r', 'p') ORDER BY c.relname`,\n\t\t[schemaFor(home), LEDGER_TABLES],\n\t);\n\tif (objects.rows.length !== LEDGER_TABLES.length)\n\t\tthrow new Error(\n\t\t\t'ledger ownership could not be validated because a ledger table is missing',\n\t\t);\n\tfor (const object of objects.rows) {\n\t\tif (object.owner !== role)\n\t\t\tthrow new Error(\n\t\t\t\t`ledger ${String(object.relname)} is owned by ${String(object.owner)}, not deployment role ${role}`,\n\t\t\t);\n\t\tif (object.widened === true)\n\t\t\tthrow new Error(`ledger ${String(object.relname)} has widened grants`);\n\t}\n\tif (home.scope === 'database') {\n\t\tconst meta = await executor.query(\n\t\t\t`SELECT pg_catalog.pg_get_userbyid(n.nspowner) AS owner, EXISTS (SELECT 1 FROM pg_catalog.aclexplode(COALESCE(n.nspacl, pg_catalog.acldefault('n', n.nspowner))) acl WHERE acl.grantee = 0 OR acl.grantee <> n.nspowner) AS widened FROM pg_catalog.pg_namespace n WHERE n.nspname = $1`,\n\t\t\t[DBSP_META_SCHEMA],\n\t\t);\n\t\tconst row = meta.rows[0];\n\t\tif (!row || row.owner !== role)\n\t\t\tthrow new Error(`dbsp_meta is not owned by deployment role ${role}`);\n\t\tif (row.widened === true) throw new Error('dbsp_meta has widened grants');\n\t}\n}\n\nasync function establishCreationOwnershipAndGrants(\n\texecutor: TransitionJournalQueryable,\n\thome: LedgerHome,\n): Promise<void> {\n\tfor (const sql of renderReinitializePreflightCreationGrantSql(home))\n\t\tawait executor.query(sql);\n}\n\nfunction archivedObjectName(name: string, suffix: string): string {\n\tconst postfix = `_archive_${suffix}`;\n\treturn `${name.slice(0, 63 - postfix.length)}${postfix}`;\n}\n\nasync function archiveTableIndexes(\n\texecutor: TransitionJournalQueryable,\n\thome: LedgerHome,\n\ttable: string,\n\tsuffix: string,\n): Promise<void> {\n\tconst indexes = await executor.query(\n\t\t`SELECT index_class.relname AS name FROM pg_catalog.pg_index index_definition JOIN pg_catalog.pg_class table_class ON table_class.oid = index_definition.indrelid JOIN pg_catalog.pg_class index_class ON index_class.oid = index_definition.indexrelid WHERE table_class.oid = pg_catalog.to_regclass($1) ORDER BY index_class.relname`,\n\t\t[qualified(home, table)],\n\t);\n\tfor (const row of indexes.rows) {\n\t\tif (typeof row.name !== 'string')\n\t\t\tthrow new Error(`archived ledger index name is unreadable for ${table}`);\n\t\tawait executor.query(\n\t\t\t`ALTER INDEX ${qualified(home, row.name)} RENAME TO ${quoteIdent(archivedObjectName(row.name, suffix), 'table')}`,\n\t\t);\n\t}\n}\n\nasync function archiveMismatchedLedger(\n\texecutor: TransitionJournalQueryable,\n\thome: LedgerHome,\n): Promise<void> {\n\tconst suffix = randomBytes(6).toString('hex');\n\tconst archived: string[] = [];\n\tfor (const table of LEDGER_TABLES) {\n\t\tconst archive = `${table}_archive_${suffix}`;\n\t\tawait executor.query(\n\t\t\t`ALTER TABLE ${qualified(home, table)} RENAME TO ${quoteIdent(archive, 'table')}`,\n\t\t);\n\t\t// PostgreSQL preserves an index name when its table is renamed. The fresh\n\t\t// ledger uses deterministic primary/unique/index names, so keep every\n\t\t// archived backing index as provenance under a distinct name as well.\n\t\tawait archiveTableIndexes(executor, home, archive, suffix);\n\t\tarchived.push(archive);\n\t}\n\tconst schema = quoteIdent(schemaFor(home), 'schema');\n\tawait executor.query(\n\t\t`CREATE OR REPLACE FUNCTION ${schema}.\"dbsp_ledger_reject_archive_mutation\"() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN RAISE EXCEPTION 'dbsp archived ledger is read-only'; END; $$`,\n\t);\n\tfor (const table of archived) {\n\t\tawait revokeArchivedTablePrivileges(executor, home, table);\n\t\tawait executor.query(\n\t\t\t`CREATE TRIGGER \"dbsp_ledger_archive_immutable_rows\" BEFORE INSERT OR UPDATE OR DELETE ON ${qualified(home, table)} FOR EACH ROW EXECUTE FUNCTION ${schema}.\"dbsp_ledger_reject_archive_mutation\"()`,\n\t\t);\n\t\tawait executor.query(\n\t\t\t`CREATE TRIGGER \"dbsp_ledger_archive_immutable_truncate\" BEFORE TRUNCATE ON ${qualified(home, table)} FOR EACH STATEMENT EXECUTE FUNCTION ${schema}.\"dbsp_ledger_reject_archive_mutation\"()`,\n\t\t);\n\t}\n}\n\nfunction quoteRole(role: string): string {\n\treturn `\"${role.replaceAll('\"', '\"\"')}\"`;\n}\n\n/** Remove PUBLIC and every explicit grantee before archived provenance remains. */\nasync function revokeArchivedTablePrivileges(\n\texecutor: TransitionJournalQueryable,\n\thome: LedgerHome,\n\ttable: string,\n): Promise<void> {\n\tconst grantees = await executor.query(\n\t\t`SELECT DISTINCT role.rolname AS role FROM pg_catalog.pg_class relation CROSS JOIN LATERAL pg_catalog.aclexplode(relation.relacl) acl JOIN pg_catalog.pg_roles role ON role.oid = acl.grantee WHERE relation.oid = pg_catalog.to_regclass($1) AND acl.grantee <> 0 ORDER BY role`,\n\t\t[qualified(home, table)],\n\t);\n\tawait executor.query(\n\t\t`REVOKE ALL ON TABLE ${qualified(home, table)} FROM PUBLIC`,\n\t);\n\tfor (const grant of grantees.rows) {\n\t\tif (typeof grant.role !== 'string')\n\t\t\tthrow new Error(`archived ledger grantee is unreadable for ${table}`);\n\t\tawait executor.query(\n\t\t\t`REVOKE ALL ON TABLE ${qualified(home, table)} FROM ${quoteRole(grant.role)}`,\n\t\t);\n\t}\n}\n\nfunction refusal(\n\thome: LedgerHome,\n\tmarker: LedgerMarkerState,\n\tcode: ReinitializePreflightRefusalCode,\n\tdetail: string,\n\tstep: ReinitializePreflightFailureStep,\n): ReinitializePreflightScopeReport {\n\treturn {\n\t\tledger: home,\n\t\toutcome: 'failed',\n\t\tmarker,\n\t\trefusal: { code, detail },\n\t\treason: { step, message: detail },\n\t};\n}\n\nfunction failureCode(detail: string): ReinitializePreflightRefusalCode {\n\tif (detail.includes('widened grants')) return 'reinitialize-preflight-grants';\n\tif (detail.includes('owned by') || detail.includes('ownership'))\n\t\treturn 'reinitialize-preflight-ownership';\n\treturn 'reinitialize-preflight-failed';\n}\n\nasync function checkpoint(\n\tobserver: ReinitializePreflightObserver | undefined,\n\tpoint: ReinitializePreflightCheckpoint,\n\thome?: LedgerHome,\n): Promise<void> {\n\tif (observer) await observer(point, home);\n}\n\nasync function processScope(\n\tpool: PgReinitializePreflightPool,\n\tinspection: ReinitializePreflightScopeInspection,\n\tobserver: ReinitializePreflightObserver | undefined,\n): Promise<ReinitializePreflightScopeReport> {\n\tconst client = await pool.connect();\n\tlet begun = false;\n\tlet failed = false;\n\tlet releaseFailure: unknown;\n\tlet rollbackFailed = false;\n\tlet failureStep: ReinitializePreflightFailureStep = 'advisory-lock';\n\ttry {\n\t\tawait client.query('BEGIN');\n\t\tbegun = true;\n\t\tawait assertPgDatabaseWritable(client);\n\t\tawait client.query(REINITIALIZE_PREFLIGHT_LOCK_TIMEOUT_SQL);\n\t\tconst lock = await acquirePgLedgerLocks(client, [inspection.home]);\n\t\tif (lock.kind !== 'acquired') {\n\t\t\tawait client.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn refusal(\n\t\t\t\tinspection.home,\n\t\t\t\tinspection.marker,\n\t\t\t\t'reinitialize-preflight-advisory-lock',\n\t\t\t\tlock.kind === 'busy'\n\t\t\t\t\t? `reinitialize-preflight could not acquire advisory lock for ${schemaFor(lock.ledger)}`\n\t\t\t\t\t: `reinitialize-preflight advisory lock error for ${schemaFor(lock.ledger)}: ${errorDetail(lock.error)}`,\n\t\t\t\t'advisory-lock',\n\t\t\t);\n\t\t}\n\t\tfailureStep = 'identity';\n\t\tconst current = await inspectScope(client, inspection.home);\n\t\tif (\n\t\t\tcurrent.marker.kind === 'older' ||\n\t\t\tcurrent.marker.kind === 'future' ||\n\t\t\tcurrent.marker.kind === 'mixed' ||\n\t\t\tcurrent.marker.kind === 'unreadable'\n\t\t) {\n\t\t\tawait client.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn refusal(\n\t\t\t\tcurrent.home,\n\t\t\t\tcurrent.marker,\n\t\t\t\t'reinitialize-preflight-marker-not-current',\n\t\t\t\tmarkerRefusal(current.marker),\n\t\t\t\t'marker',\n\t\t\t);\n\t\t}\n\t\tconst preexistingLedger =\n\t\t\tcurrent.marker.kind !== 'current' &&\n\t\t\t(await hasPreexistingLedgerRelations(client, current.home));\n\t\t// A fresh database ledger has no dbsp_meta namespace yet, so bootstrap it\n\t\t// before reading that namespace's live OID. The marker remains deferred.\n\t\tlet initializedDatabaseLedger = false;\n\t\tif (\n\t\t\tcurrent.home.scope === 'database' &&\n\t\t\tcurrent.marker.kind !== 'current' &&\n\t\t\t!preexistingLedger\n\t\t) {\n\t\t\tfailureStep = 'create';\n\t\t\tawait ensureDbspMetaLedger(client, { writeMarker: false });\n\t\t\tinitializedDatabaseLedger = true;\n\t\t}\n\t\tconst live = await readLiveIdentity(client, current.home);\n\t\tif (current.marker.kind === 'current') {\n\t\t\tif (current.identity && sameIdentity(current.identity, live)) {\n\t\t\t\tfailureStep = 'create';\n\t\t\t\tawait validatePgLedgerPhysicalShape(client, current.home);\n\t\t\t\tfailureStep = 'ownership-grants';\n\t\t\t\tawait validateOwnershipAndGrants(client, current.home);\n\t\t\t\tawait client.query('COMMIT');\n\t\t\t\tbegun = false;\n\t\t\t\treturn {\n\t\t\t\t\tledger: current.home,\n\t\t\t\t\toutcome: 'unchanged',\n\t\t\t\t\tmarker: current.marker,\n\t\t\t\t};\n\t\t\t}\n\t\t\t// A lineage mismatch remains a current ledger only after the same\n\t\t\t// physical-shape and ownership admission checks as the unchanged path.\n\t\t\t// Otherwise a counterfeit would be renamed into the archive.\n\t\t\tfailureStep = 'create';\n\t\t\tawait validatePgLedgerPhysicalShape(client, current.home);\n\t\t\tfailureStep = 'ownership-grants';\n\t\t\tawait validateOwnershipAndGrants(client, current.home);\n\t\t\tfailureStep = 'archive';\n\t\t\tawait archiveMismatchedLedger(client, current.home);\n\t\t\tawait checkpoint(observer, 'archive', current.home);\n\t\t}\n\t\tif (preexistingLedger) {\n\t\t\t// The tables existed before this preflight. Their catalog shape and\n\t\t\t// lineage must be proved before CREATE ... IF NOT EXISTS can touch\n\t\t\t// them. A ledger created above in this transaction is intentionally\n\t\t\t// not subject to this admission path: this preflight writes its\n\t\t\t// identity as part of initialization below.\n\t\t\tfailureStep = 'create';\n\t\t\tawait validatePgLedgerPhysicalShape(client, current.home);\n\t\t\tfailureStep = 'identity';\n\t\t\tconst recorded = await readIdentity(client, current.home);\n\t\t\tif (!sameIdentity(recorded, live))\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`pre-existing ledger identity does not match ${schemaFor(current.home)}`,\n\t\t\t\t);\n\t\t}\n\t\tfailureStep = 'create';\n\t\tif (!initializedDatabaseLedger && current.home.scope === 'database')\n\t\t\tawait ensureDbspMetaLedger(client, { writeMarker: false });\n\t\telse if (!initializedDatabaseLedger)\n\t\t\tawait ensurePgLedger(client, current.home, { writeMarker: false });\n\t\tfailureStep = 'record-identity';\n\t\tawait recordPgLedgerIdentity(client, current.home, live);\n\t\tawait checkpoint(observer, 'create', current.home);\n\t\tfailureStep = 'creation-grants';\n\t\tawait establishCreationOwnershipAndGrants(client, current.home);\n\t\tfailureStep = 'ownership-grants';\n\t\tawait validateOwnershipAndGrants(client, current.home);\n\t\tawait checkpoint(observer, 'grants', current.home);\n\t\tfailureStep = 'write-marker';\n\t\tawait writePgLedgerShapeMarker(client, current.home);\n\t\tawait checkpoint(observer, 'marker', current.home);\n\t\tawait client.query('COMMIT');\n\t\tbegun = false;\n\t\treturn { ledger: current.home, outcome: 'current', marker: current.marker };\n\t} catch (error) {\n\t\tfailed = true;\n\t\treleaseFailure = error;\n\t\tif (begun) {\n\t\t\ttry {\n\t\t\t\tawait client.query('ROLLBACK');\n\t\t\t} catch (rollbackError) {\n\t\t\t\trollbackFailed = true;\n\t\t\t\treleaseFailure = rollbackError;\n\t\t\t\t// The original PostgreSQL denial remains the useful report detail.\n\t\t\t}\n\t\t}\n\t\treturn refusal(\n\t\t\tinspection.home,\n\t\t\tinspection.marker,\n\t\t\tisPgDatabaseReadOnlyError(error)\n\t\t\t\t? 'database-read-only'\n\t\t\t\t: failureCode(errorDetail(error)),\n\t\t\terrorDetail(error),\n\t\t\tfailureStep,\n\t\t);\n\t} finally {\n\t\treleasePreflightClient(client, failed, releaseFailure, rollbackFailed);\n\t}\n}\n\n/**\n * Processes every already-admitted scope independently. A scope report is a\n * normal result, including `failed`; it must never prevent a later scope from\n * starting its own transaction. The catch also makes an unexpected per-scope\n * processing rejection reportable without widening it into a run refusal.\n */\nexport async function processReinitializePreflightScopes(\n\tinspections: readonly ReinitializePreflightScopeInspection[],\n\tprocess: (\n\t\tinspection: ReinitializePreflightScopeInspection,\n\t) => Promise<ReinitializePreflightScopeReport>,\n): Promise<readonly ReinitializePreflightScopeReport[]> {\n\tconst scopes: ReinitializePreflightScopeReport[] = [];\n\tfor (const inspection of inspections) {\n\t\tconst accessFailure = inspectionAccessFailure(inspection);\n\t\tif (accessFailure) {\n\t\t\tscopes.push(accessFailure);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tscopes.push(await process(inspection));\n\t\t} catch (error) {\n\t\t\tscopes.push(\n\t\t\t\trefusal(\n\t\t\t\t\tinspection.home,\n\t\t\t\t\tinspection.marker,\n\t\t\t\t\tfailureCode(errorDetail(error)),\n\t\t\t\t\terrorDetail(error),\n\t\t\t\t\t'advisory-lock',\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\treturn scopes;\n}\n\nfunction addressKey(address: LedgerAddress): string {\n\treturn JSON.stringify([\n\t\taddress.engine,\n\t\taddress.database,\n\t\taddress.schema ?? null,\n\t\taddress.parent ?? null,\n\t\taddress.kind,\n\t\taddress.name,\n\t]);\n}\n\n/** Select exactly declarations whose home has no existing chain address. */\nexport function selectReinitializeAdoptionCandidates(\n\tdeclarations: DeclarationSet,\n\tchainAddresses: ReadonlySet<string>,\n): readonly ReinitializePreflightAdoptionCandidate[] {\n\treturn declarations.declarations\n\t\t.map((declaration) => ({\n\t\t\taddress: {\n\t\t\t\t...declaration.address,\n\t\t\t\tscope: declaration.address.kind === 'extension' ? 'database' : 'schema',\n\t\t\t} as LedgerAddress,\n\t\t\tdeclaration: { value: declaration.fragment, digest: declaration.digest },\n\t\t}))\n\t\t.filter(\n\t\t\t(candidate) =>\n\t\t\t\t(candidate.address.kind !== 'table' ||\n\t\t\t\t\t!isDbspLedgerInfrastructureTable(candidate.address.name)) &&\n\t\t\t\t!chainAddresses.has(addressKey(candidate.address)),\n\t\t);\n}\n\n/** Completes a report without inventing an outcome outside the closed set. */\nexport function assembleReinitializePreflightScopeReports(\n\thomes: readonly LedgerHome[],\n\tcompleted: ReadonlyMap<string, ReinitializePreflightScopeReport>,\n\tmarkers: ReadonlyMap<string, LedgerMarkerState>,\n): readonly ReinitializePreflightScopeReport[] {\n\treturn homes.map((ledger) => {\n\t\tconst key =\n\t\t\tledger.scope === 'database' ? 'database' : `schema:${ledger.schema}`;\n\t\treturn (\n\t\t\tcompleted.get(key) ?? {\n\t\t\t\tledger,\n\t\t\t\toutcome: 'not-attempted' as const,\n\t\t\t\tmarker: markers.get(key) ?? {\n\t\t\t\t\tkind: 'unreadable' as const,\n\t\t\t\t\treason: 'scope was not inspected',\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\t});\n}\n\nasync function readChainAddresses(\n\tpool: PgReinitializePreflightPool,\n\thomes: readonly LedgerHome[],\n): Promise<ReadonlySet<string>> {\n\tconst client = await pool.connect();\n\tlet begun = false;\n\tlet failed = false;\n\tlet releaseFailure: unknown;\n\tlet rollbackFailed = false;\n\ttry {\n\t\tawait client.query('BEGIN');\n\t\tbegun = true;\n\t\tawait client.query(REINITIALIZE_PREFLIGHT_LOCK_TIMEOUT_SQL);\n\t\tconst addresses = new Set<string>();\n\t\tfor (const home of homes) {\n\t\t\tconst marker = await readPgLedgerMarker(client, home);\n\t\t\tif (marker.kind !== 'current') continue;\n\t\t\tconst rows = await client.query(\n\t\t\t\t`SELECT DISTINCT address_engine, address_database, address_schema, address_parent, address_kind, address_name FROM ${qualified(home, DBSP_LEDGER_EVENT_TABLE)}`,\n\t\t\t);\n\t\t\tfor (const row of rows.rows) {\n\t\t\t\tif (\n\t\t\t\t\ttypeof row.address_engine !== 'string' ||\n\t\t\t\t\ttypeof row.address_database !== 'string' ||\n\t\t\t\t\ttypeof row.address_schema !== 'string' ||\n\t\t\t\t\ttypeof row.address_kind !== 'string' ||\n\t\t\t\t\ttypeof row.address_name !== 'string'\n\t\t\t\t)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`ledger chain address is unreadable in ${schemaFor(home)}`,\n\t\t\t\t\t);\n\t\t\t\taddresses.add(\n\t\t\t\t\taddressKey({\n\t\t\t\t\t\tscope: home.scope,\n\t\t\t\t\t\tengine: row.address_engine,\n\t\t\t\t\t\tdatabase: row.address_database,\n\t\t\t\t\t\t...(row.address_schema === ''\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: { schema: row.address_schema }),\n\t\t\t\t\t\t...(row.address_parent === null\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: { parent: row.address_parent as LedgerAddress }),\n\t\t\t\t\t\tkind: row.address_kind as LedgerAddress['kind'],\n\t\t\t\t\t\tname: row.address_name,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tawait client.query('COMMIT');\n\t\tbegun = false;\n\t\treturn addresses;\n\t} catch (error) {\n\t\tfailed = true;\n\t\treleaseFailure = error;\n\t\tif (begun) {\n\t\t\ttry {\n\t\t\t\tawait client.query('ROLLBACK');\n\t\t\t} catch (rollbackError) {\n\t\t\t\trollbackFailed = true;\n\t\t\t\treleaseFailure = rollbackError;\n\t\t\t\t// Preserve the original PostgreSQL timeout or denial.\n\t\t\t}\n\t\t}\n\t\tthrow error;\n\t} finally {\n\t\treleasePreflightClient(client, failed, releaseFailure, rollbackFailed);\n\t}\n}\n\n/**\n * Runs the separately privileged reinitialize-preflight. It never invokes a\n * ledger append primitive: the only durable writes are additive structure,\n * archived structure, identity, grants, marker, and the caller-owned output.\n */\nexport async function runPgReinitializePreflight(\n\toptions: PgReinitializePreflightOptions,\n): Promise<ReinitializePreflightReport> {\n\tconst homes = homesFor(options.schemas);\n\tconst inspectionClient = await options.pool.connect();\n\tlet inspections: readonly ReinitializePreflightScopeInspection[];\n\tlet inspectionBegun = false;\n\tlet failed = false;\n\tlet releaseFailure: unknown;\n\tlet rollbackFailed = false;\n\ttry {\n\t\tawait inspectionClient.query('BEGIN');\n\t\tinspectionBegun = true;\n\t\tawait inspectionClient.query(REINITIALIZE_PREFLIGHT_LOCK_TIMEOUT_SQL);\n\t\tinspections = [];\n\t\tfor (const home of homes) {\n\t\t\tawait inspectionClient.query(\n\t\t\t\t'SAVEPOINT reinitialize_preflight_inspection',\n\t\t\t);\n\t\t\tinspections = [\n\t\t\t\t...inspections,\n\t\t\t\tawait inspectScope(inspectionClient, home),\n\t\t\t];\n\t\t\t// An inspection-time PostgreSQL error aborts this transaction until a\n\t\t\t// savepoint rollback. Always roll back the read-only scope work so a\n\t\t\t// denied schema cannot prevent inspecting its later siblings.\n\t\t\tawait inspectionClient.query(\n\t\t\t\t'ROLLBACK TO SAVEPOINT reinitialize_preflight_inspection',\n\t\t\t);\n\t\t\tawait inspectionClient.query(\n\t\t\t\t'RELEASE SAVEPOINT reinitialize_preflight_inspection',\n\t\t\t);\n\t\t}\n\t\tawait inspectionClient.query('COMMIT');\n\t\tinspectionBegun = false;\n\t} catch (error) {\n\t\tfailed = true;\n\t\treleaseFailure = error;\n\t\tif (inspectionBegun) {\n\t\t\ttry {\n\t\t\t\tawait inspectionClient.query('ROLLBACK');\n\t\t\t} catch (rollbackError) {\n\t\t\t\trollbackFailed = true;\n\t\t\t\treleaseFailure = rollbackError;\n\t\t\t\t// The original PostgreSQL error remains the useful failure.\n\t\t\t}\n\t\t}\n\t\tthrow error;\n\t} finally {\n\t\treleasePreflightClient(\n\t\t\tinspectionClient,\n\t\t\tfailed,\n\t\t\treleaseFailure,\n\t\t\trollbackFailed,\n\t\t);\n\t}\n\tconst markerFailure = inspections.find(\n\t\t({ marker }) =>\n\t\t\tmarker.kind === 'older' ||\n\t\t\tmarker.kind === 'future' ||\n\t\t\tmarker.kind === 'mixed' ||\n\t\t\tmarker.kind === 'unreadable',\n\t);\n\tif (markerFailure) {\n\t\treturn {\n\t\t\tscopes: inspections.map((inspection) =>\n\t\t\t\tinspection === markerFailure\n\t\t\t\t\t? refusal(\n\t\t\t\t\t\t\tinspection.home,\n\t\t\t\t\t\t\tinspection.marker,\n\t\t\t\t\t\t\t'reinitialize-preflight-marker-not-current',\n\t\t\t\t\t\t\tmarkerRefusal(inspection.marker),\n\t\t\t\t\t\t\t'marker',\n\t\t\t\t\t\t)\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tledger: inspection.home,\n\t\t\t\t\t\t\toutcome: 'not-attempted',\n\t\t\t\t\t\t\tmarker: inspection.marker,\n\t\t\t\t\t\t},\n\t\t\t),\n\t\t\tadoptionCandidates: [],\n\t\t};\n\t}\n\tconst scopes = await processReinitializePreflightScopes(\n\t\tinspections,\n\t\t(inspection) => processScope(options.pool, inspection, options.observer),\n\t);\n\tif (scopes.some((scope) => scope.outcome === 'failed'))\n\t\treturn { scopes, adoptionCandidates: [] };\n\ttry {\n\t\tconst chains = await readChainAddresses(options.pool, homes);\n\t\tconst adoptionCandidates = selectReinitializeAdoptionCandidates(\n\t\t\toptions.declarations,\n\t\t\tchains,\n\t\t);\n\t\tconst report = { scopes, adoptionCandidates };\n\t\tawait checkpoint(options.observer, 'output');\n\t\tawait options.writeAdoptionFile(report);\n\t\treturn report;\n\t} catch (error) {\n\t\treturn {\n\t\t\tscopes: scopes.map((scope) =>\n\t\t\t\tscope.outcome === 'current' || scope.outcome === 'unchanged'\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...scope,\n\t\t\t\t\t\t\toutcome: 'failed' as const,\n\t\t\t\t\t\t\trefusal: {\n\t\t\t\t\t\t\t\tcode: 'reinitialize-preflight-failed' as const,\n\t\t\t\t\t\t\t\tdetail: errorDetail(error),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\treason: {\n\t\t\t\t\t\t\t\tstep: 'output' as const,\n\t\t\t\t\t\t\t\tmessage: errorDetail(error),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: scope,\n\t\t\t),\n\t\t\tadoptionCandidates: [],\n\t\t};\n\t}\n}\n","import { createHash } from 'node:crypto';\nimport {\n\ttype LedgerChainMember,\n\ttype LedgerClaimKind,\n\ttype LedgerEventKind,\n\ttype LedgerHome,\n\ttype LedgerIdentity,\n\ttype LedgerReservationRow,\n\tledgerAddressKey,\n\tledgerAddressParentJson,\n} from '@dbsp/types';\nimport { validateIdentifier } from '../validate.js';\nimport {\n\tDBSP_LEDGER_EVENT_TABLE,\n\tDBSP_LEDGER_IDENTITY_TABLE,\n\tDBSP_LEDGER_MARKER_TABLE,\n\tDBSP_LEDGER_RESERVATION_TABLE,\n\tDBSP_LEDGER_TABLES,\n\tDBSP_META_SCHEMA,\n} from './constants.js';\nimport { classifyPgWrite } from './database-writability.js';\nimport type { TransitionJournalQueryable } from './journal.js';\nimport pg15DeparseFixture from './ledger-deparse-fixtures/pg-15.json' with {\n\ttype: 'json',\n};\nimport pg16DeparseFixture from './ledger-deparse-fixtures/pg-16.json' with {\n\ttype: 'json',\n};\nimport pg17DeparseFixture from './ledger-deparse-fixtures/pg-17.json' with {\n\ttype: 'json',\n};\nimport pg18DeparseFixture from './ledger-deparse-fixtures/pg-18.json' with {\n\ttype: 'json',\n};\nimport {\n\tgeneratePgLedgerExpectedManifest,\n\tPG_LEDGER_SPEC,\n\trenderCreateLedgerImmutabilityFunctionFromSpec,\n\trenderCreateLedgerImmutabilityTriggerFromSpec,\n\trenderCreateLedgerIndexFromSpec,\n\trenderCreateLedgerTableFromSpec,\n} from './ledger-spec.js';\nimport { isDeadPgConnectionError } from './lessor.js';\nimport { readPgLedgerMarker } from './reinitialize-preflight.js';\n\nconst CLAIM_EVENT_KINDS = new Set<LedgerEventKind>([\n\t'adopt-intent',\n\t'intent',\n\t'retire-intent',\n\t'readdress-intent',\n]);\n\nconst RESOLUTION_EVENT_KINDS = new Set<LedgerEventKind>([\n\t'adopt',\n\t'refused',\n\t'observed',\n\t'absent',\n\t'indeterminate',\n\t'resolved',\n\t'readdressed-to',\n\t'readdressed-from',\n\t'released',\n]);\n\nexport const PG_LEDGER_MIN_SERVER_VERSION_NUM = 150000;\nexport const PG_LEDGER_SHAPE_VERSION = 1;\n\ntype LedgerTableRow = {\n\treadonly table_name: unknown;\n\treadonly relation_kind: unknown;\n};\n\ntype LedgerColumnRow = {\n\treadonly table_name: unknown;\n\treadonly column_name: unknown;\n\treadonly column_type: unknown;\n\treadonly is_not_null: unknown;\n};\n\ntype LedgerDefaultRow = {\n\treadonly table_name: unknown;\n\treadonly column_name: unknown;\n\treadonly default_definition: unknown;\n};\n\ntype LedgerTriggerRow = {\n\treadonly table_schema: unknown;\n\treadonly table_name: unknown;\n\treadonly trigger_name: unknown;\n\treadonly trigger_enabled: unknown;\n\treadonly trigger_type: unknown;\n\treadonly trigger_arguments: unknown;\n\treadonly trigger_deferrable: unknown;\n\treadonly trigger_initially_deferred: unknown;\n\treadonly function_name: unknown;\n\treadonly function_schema: unknown;\n\treadonly function_identity_arguments: unknown;\n\treadonly function_result: unknown;\n\treadonly function_language: unknown;\n\treadonly function_kind: unknown;\n\treadonly function_volatility: unknown;\n\treadonly function_is_strict: unknown;\n\treadonly function_is_security_definer: unknown;\n\treadonly function_is_leakproof: unknown;\n\treadonly function_config_is_null: unknown;\n\treadonly function_source: unknown;\n\treadonly trigger_definition: unknown;\n};\n\ndeclare const ledgerShapeAllowanceBrand: unique symbol;\n\n/**\n * An in-process allowance for one non-ledger trigger observed immediately\n * after trusted harness setup. Its contents are deliberately not structural:\n * only the internal factory can register a value in the WeakSet below.\n */\nexport interface PgLedgerShapeAllowance {\n\treadonly [ledgerShapeAllowanceBrand]: 'dbsp-ledger-shape-allowance';\n}\n\ntype LedgerShapeAllowanceIdentity = Readonly<{\n\ttarget: PgLedgerTarget;\n\ttrigger: LedgerTriggerRow;\n}>;\n\nconst ledgerShapeAllowanceTokens = new WeakSet<object>();\nconst ledgerShapeAllowanceIdentities = new WeakMap<\n\tobject,\n\tLedgerShapeAllowanceIdentity\n>();\n\ntype LedgerConstraintRow = {\n\treadonly table_name: unknown;\n\treadonly constraint_name: unknown;\n\treadonly contype: unknown;\n\treadonly check_expression: unknown;\n\treadonly connullsnotdistinct: unknown;\n\treadonly key_columns: unknown;\n\treadonly referenced_table_schema: unknown;\n\treadonly referenced_table_name: unknown;\n\treadonly referenced_columns: unknown;\n\treadonly confupdtype: unknown;\n\treadonly confdeltype: unknown;\n\treadonly condeferrable: unknown;\n\treadonly condeferred: unknown;\n\treadonly convalidated: unknown;\n};\n\ntype LedgerIndexRow = {\n\treadonly table_name: unknown;\n\treadonly index_name: unknown;\n\treadonly indisprimary: unknown;\n\treadonly indisunique: unknown;\n\treadonly indisvalid: unknown;\n\treadonly indisready: unknown;\n\treadonly index_columns: unknown;\n};\n\nexport type PgLedgerPhysicalShapeOutcome =\n\t| { readonly kind: 'verified' }\n\t| { readonly kind: 'shape-wrong'; readonly artefact: string }\n\t| { readonly kind: 'unverifiable'; readonly cause: string }\n\t| { readonly kind: 'unsupported-major'; readonly major: number | undefined }\n\t| { readonly kind: 'validator-abi-failure'; readonly sqlstate: string };\n\ntype LedgerDeparseFixture = Readonly<{\n\tchecks: Readonly<Record<string, string>>;\n\tdefaults: Readonly<Record<string, string>>;\n}>;\n\nexport const PG_LEDGER_DEPARSE_FIXTURES: Readonly<\n\tRecord<number, LedgerDeparseFixture>\n> = {\n\t15: pg15DeparseFixture,\n\t16: pg16DeparseFixture,\n\t17: pg17DeparseFixture,\n\t18: pg18DeparseFixture,\n};\n\nfunction pgSqlState(error: unknown): string | undefined {\n\tif (!error || typeof error !== 'object') return undefined;\n\tconst code = (error as { code?: unknown }).code;\n\treturn typeof code === 'string' ? code : undefined;\n}\n\nexport function classifyPgLedgerShapeError(\n\terror: unknown,\n): Exclude<PgLedgerPhysicalShapeOutcome, { readonly kind: 'verified' }> {\n\tconst sqlstate = pgSqlState(error);\n\tif (\n\t\tsqlstate === '42501' ||\n\t\tsqlstate === '08000' ||\n\t\tsqlstate === '08003' ||\n\t\tsqlstate === '08006' ||\n\t\tsqlstate === '57014'\n\t)\n\t\treturn { kind: 'unverifiable', cause: sqlstate };\n\tif (sqlstate === '40001' || sqlstate === '40P01' || sqlstate === '55P03')\n\t\treturn { kind: 'unverifiable', cause: sqlstate };\n\tif (sqlstate === '42703' || sqlstate === '42883' || sqlstate === '0A000')\n\t\treturn { kind: 'validator-abi-failure', sqlstate };\n\treturn { kind: 'unverifiable', cause: sqlstate ?? 'unknown' };\n}\n\nasync function readLedgerDeparseFixture(\n\tmajor: number,\n): Promise<LedgerDeparseFixture | undefined> {\n\treturn PG_LEDGER_DEPARSE_FIXTURES[major];\n}\n\nfunction stringArray(value: unknown): readonly string[] | undefined {\n\tif (!Array.isArray(value) || value.some((item) => typeof item !== 'string'))\n\t\treturn undefined;\n\treturn value;\n}\n\nfunction hasColumns(value: unknown, expected: readonly string[]): boolean {\n\tconst columns = stringArray(value);\n\treturn (\n\t\tcolumns !== undefined &&\n\t\tcolumns.length === expected.length &&\n\t\tcolumns.every((column, index) => column === expected[index])\n\t);\n}\n\nfunction ledgerPhysicalShapeError(\n\ttarget: PgLedgerTarget,\n\ttable: string,\n\tinvariant: string,\n): Error {\n\treturn new Error(\n\t\t`ledger physical shape: ${ledgerSchema(target)}.${table} ${invariant}; run dbsp preflight --reinitialize`,\n\t);\n}\n\n/**\n * `pg_constraint.conindid` is zero for constraints without a backing index.\n * The LEFT JOIN therefore exposes NULL for `indnullsnotdistinct`; normalize\n * that catalogue absence to the comparator's explicit false property.\n */\nfunction normalizeLedgerConstraintRow(\n\trow: LedgerConstraintRow,\n): LedgerConstraintRow {\n\treturn {\n\t\t...row,\n\t\tconnullsnotdistinct:\n\t\t\trow.connullsnotdistinct === null ? false : row.connullsnotdistinct,\n\t};\n}\n\nasync function readLedgerConstraints(\n\texecutor: TransitionJournalQueryable,\n\tschema: string,\n): Promise<readonly LedgerConstraintRow[]> {\n\tconst constraints = await executor.query(\n\t\t`SELECT relation.relname AS table_name, constraint_item.conname AS constraint_name, constraint_item.contype, pg_catalog.pg_get_expr(constraint_item.conbin, constraint_item.conrelid) AS check_expression, constraint_index.indnullsnotdistinct AS connullsnotdistinct, ARRAY(SELECT attribute.attname::text FROM unnest(constraint_item.conkey) WITH ORDINALITY AS key_column(attnum, position) JOIN pg_catalog.pg_attribute attribute ON attribute.attrelid = constraint_item.conrelid AND attribute.attnum = key_column.attnum ORDER BY key_column.position) AS key_columns, referenced_namespace.nspname AS referenced_table_schema, referenced_relation.relname AS referenced_table_name, ARRAY(SELECT attribute.attname::text FROM unnest(constraint_item.confkey) WITH ORDINALITY AS referenced_column(attnum, position) JOIN pg_catalog.pg_attribute attribute ON attribute.attrelid = constraint_item.confrelid AND attribute.attnum = referenced_column.attnum ORDER BY referenced_column.position) AS referenced_columns, constraint_item.confupdtype, constraint_item.confdeltype, constraint_item.condeferrable, constraint_item.condeferred, constraint_item.convalidated FROM pg_catalog.pg_constraint constraint_item JOIN pg_catalog.pg_class relation ON relation.oid = constraint_item.conrelid JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace LEFT JOIN pg_catalog.pg_class referenced_relation ON referenced_relation.oid = constraint_item.confrelid LEFT JOIN pg_catalog.pg_namespace referenced_namespace ON referenced_namespace.oid = referenced_relation.relnamespace LEFT JOIN pg_catalog.pg_index constraint_index ON constraint_index.indexrelid = constraint_item.conindid WHERE namespace.nspname = $1 AND relation.relname = ANY($2::text[]) AND constraint_item.contype IN ('p', 'c', 'u', 'f') ORDER BY relation.relname, constraint_item.oid`,\n\t\t[schema, DBSP_LEDGER_TABLES],\n\t);\n\t// PostgreSQL 18 records NOT NULL as pg_constraint rows with contype = 'n'.\n\t// NOT NULL belongs to the column-shape assertion above, never this set.\n\treturn (constraints.rows as readonly LedgerConstraintRow[])\n\t\t.filter(\n\t\t\t(row) =>\n\t\t\t\trow.contype === 'p' ||\n\t\t\t\trow.contype === 'c' ||\n\t\t\t\trow.contype === 'u' ||\n\t\t\t\trow.contype === 'f',\n\t\t)\n\t\t.map(normalizeLedgerConstraintRow);\n}\n\nasync function readLedgerDefaults(\n\texecutor: TransitionJournalQueryable,\n\tschema: string,\n): Promise<readonly LedgerDefaultRow[]> {\n\tconst result = await executor.query(\n\t\t`SELECT relation.relname AS table_name, attribute.attname AS column_name, pg_catalog.pg_get_expr(default_item.adbin, default_item.adrelid, false) AS default_definition FROM pg_catalog.pg_attrdef default_item JOIN pg_catalog.pg_class relation ON relation.oid = default_item.adrelid JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace JOIN pg_catalog.pg_attribute attribute ON attribute.attrelid = relation.oid AND attribute.attnum = default_item.adnum WHERE namespace.nspname = $1 AND relation.relname = ANY($2::text[]) ORDER BY relation.relname, attribute.attname`,\n\t\t[schema, DBSP_LEDGER_TABLES],\n\t);\n\treturn result.rows as readonly LedgerDefaultRow[];\n}\n\n/**\n * Read-only admission of an existing ledger. A fixture is deliberately a\n * prerequisite: deparse text is not portable across PostgreSQL majors.\n */\nexport async function classifyPgLedgerPhysicalShape(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\tallowance?: PgLedgerShapeAllowance,\n): Promise<PgLedgerPhysicalShapeOutcome> {\n\tlet major: number | undefined;\n\ttry {\n\t\tconst value = (\n\t\t\tawait executor.query(\n\t\t\t\t\"SELECT current_setting('server_version_num') AS server_version_num\",\n\t\t\t)\n\t\t).rows[0]?.server_version_num;\n\t\tconst version = Number(value);\n\t\tif (!Number.isSafeInteger(version))\n\t\t\treturn { kind: 'unsupported-major', major: undefined };\n\t\tmajor = Math.floor(version / 10000);\n\t\tconst fixture = await readLedgerDeparseFixture(major);\n\t\tif (!fixture) return { kind: 'unsupported-major', major };\n\t\tawait executor.query('SET LOCAL search_path = pg_catalog');\n\t\tawait executor.query('SET LOCAL quote_all_identifiers = off');\n\t\tawait validatePgLedgerPhysicalShapeFacts(\n\t\t\texecutor,\n\t\t\ttarget,\n\t\t\tfixture,\n\t\t\tallowance,\n\t\t);\n\t\treturn { kind: 'verified' };\n\t} catch (error) {\n\t\tif (\n\t\t\terror instanceof Error &&\n\t\t\terror.message.startsWith('ledger physical shape:')\n\t\t)\n\t\t\treturn { kind: 'shape-wrong', artefact: error.message };\n\t\treturn classifyPgLedgerShapeError(error);\n\t}\n}\n\nexport class PgLedgerPhysicalShapeValidationError extends Error {\n\treadonly outcome: Exclude<PgLedgerPhysicalShapeOutcome, { kind: 'verified' }>;\n\n\tconstructor(\n\t\toutcome: Exclude<PgLedgerPhysicalShapeOutcome, { kind: 'verified' }>,\n\t) {\n\t\tsuper(\n\t\t\t`ledger physical shape is ${outcome.kind}: ${JSON.stringify(outcome)}`,\n\t\t);\n\t\tthis.name = 'PgLedgerPhysicalShapeValidationError';\n\t\tthis.outcome = outcome;\n\t}\n}\n\n/** The legacy admission boundary: only a verified shape returns to its caller. */\nexport function assertPgLedgerPhysicalShapeVerified(\n\toutcome: PgLedgerPhysicalShapeOutcome,\n): asserts outcome is { readonly kind: 'verified' } {\n\tif (outcome.kind !== 'verified')\n\t\tthrow new PgLedgerPhysicalShapeValidationError(outcome);\n}\n\n/**\n * Throwing compatibility façade. Existing mutating callers intentionally keep\n * their historical contract; outcome-aware consumers use `classify…`.\n */\nexport async function validatePgLedgerPhysicalShape(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\tallowance?: PgLedgerShapeAllowance,\n): Promise<void> {\n\tassertPgLedgerPhysicalShapeVerified(\n\t\tawait classifyPgLedgerPhysicalShape(executor, target, allowance),\n\t);\n}\n\nasync function readLedgerTriggers(\n\texecutor: TransitionJournalQueryable,\n\tschema: string,\n\ttableNames: readonly string[],\n): Promise<readonly LedgerTriggerRow[]> {\n\tconst result = await executor.query(\n\t\t`SELECT namespace.nspname AS table_schema, relation.relname AS table_name, trigger_item.tgname AS trigger_name, trigger_item.tgenabled AS trigger_enabled, trigger_item.tgtype::text AS trigger_type, pg_catalog.encode(trigger_item.tgargs, 'hex') AS trigger_arguments, trigger_item.tgdeferrable AS trigger_deferrable, trigger_item.tginitdeferred AS trigger_initially_deferred, procedure_namespace.nspname AS function_schema, procedure.proname AS function_name, pg_catalog.pg_get_function_identity_arguments(procedure.oid) AS function_identity_arguments, pg_catalog.pg_get_function_result(procedure.oid) AS function_result, language.lanname AS function_language, procedure.prokind AS function_kind, procedure.provolatile AS function_volatility, procedure.proisstrict AS function_is_strict, procedure.prosecdef AS function_is_security_definer, procedure.proleakproof AS function_is_leakproof, procedure.proconfig IS NULL AS function_config_is_null, procedure.prosrc AS function_source, pg_catalog.pg_get_triggerdef(trigger_item.oid, false) AS trigger_definition FROM pg_catalog.pg_trigger trigger_item JOIN pg_catalog.pg_class relation ON relation.oid = trigger_item.tgrelid JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace JOIN pg_catalog.pg_proc procedure ON procedure.oid = trigger_item.tgfoid JOIN pg_catalog.pg_namespace procedure_namespace ON procedure_namespace.oid = procedure.pronamespace JOIN pg_catalog.pg_language language ON language.oid = procedure.prolang WHERE namespace.nspname = $1 AND relation.relname = ANY($2::text[]) AND NOT trigger_item.tgisinternal ORDER BY relation.relname, trigger_item.tgname`,\n\t\t[schema, tableNames],\n\t);\n\treturn result.rows as readonly LedgerTriggerRow[];\n}\n\n/**\n * Mint a one-request allowance for one exact live trigger. This is exported\n * only from the adapter's `/internal` surface: consumers cannot forge the\n * WeakMap registration or serialize it into an ordinary recovery request.\n */\nexport async function createPgLedgerShapeAllowance(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\ttriggerName: string,\n): Promise<PgLedgerShapeAllowance> {\n\tconst tableName =\n\t\tgeneratePgLedgerExpectedManifest().immutabilityTrigger.tableName;\n\tconst triggers = await readLedgerTriggers(executor, ledgerSchema(target), [\n\t\ttableName,\n\t]);\n\tconst matching = triggers.filter(\n\t\t(trigger) => trigger.trigger_name === triggerName,\n\t);\n\tif (matching.length !== 1)\n\t\tthrow new Error(\n\t\t\t`ledger shape allowance requires exactly one live trigger named ${triggerName}`,\n\t\t);\n\tconst allowance = Object.freeze({}) as PgLedgerShapeAllowance;\n\tledgerShapeAllowanceTokens.add(allowance);\n\tledgerShapeAllowanceIdentities.set(allowance, {\n\t\ttarget: Object.freeze({ ...target }),\n\t\ttrigger: Object.freeze({ ...matching[0]! }),\n\t});\n\treturn allowance;\n}\n\nfunction matchesLedgerShapeAllowance(\n\tallowance: PgLedgerShapeAllowance | undefined,\n\ttarget: PgLedgerTarget,\n\ttrigger: LedgerTriggerRow,\n): boolean {\n\tif (!allowance || typeof allowance !== 'object') return false;\n\tif (!ledgerShapeAllowanceTokens.has(allowance)) return false;\n\tconst identity = ledgerShapeAllowanceIdentities.get(allowance);\n\tif (\n\t\t!identity ||\n\t\tidentity.target.scope !== target.scope ||\n\t\tidentity.target.schema !== target.schema\n\t)\n\t\treturn false;\n\tconst matched = Object.entries(identity.trigger).every(\n\t\t([key, value]) => trigger[key as keyof LedgerTriggerRow] === value,\n\t);\n\tif (matched) {\n\t\tledgerShapeAllowanceTokens.delete(allowance);\n\t\tledgerShapeAllowanceIdentities.delete(allowance);\n\t}\n\treturn matched;\n}\n\n/**\n * Compare the live ledger to a scratch ledger rendered from this shared\n * definition. Constraint and trigger facts come from catalog rows so the\n * comparison stays valid across schemas; only CHECK expressions are deparsed.\n */\n/**\n * Verify catalog facts before an existing relation is accepted as a ledger.\n * CREATE ... IF NOT EXISTS is deliberately not evidence of this shape.\n */\nasync function validatePgLedgerPhysicalShapeFacts(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\tfixture: LedgerDeparseFixture,\n\tallowance?: PgLedgerShapeAllowance,\n): Promise<void> {\n\tconst manifest = generatePgLedgerExpectedManifest();\n\tconst tables = await executor.query(\n\t\t`SELECT relation.relname AS table_name, relation.relkind AS relation_kind FROM pg_catalog.pg_class relation JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace WHERE namespace.nspname = $1 AND relation.relname = ANY($2::text[]) ORDER BY relation.relname`,\n\t\t[ledgerSchema(target), DBSP_LEDGER_TABLES],\n\t);\n\tconst tableRows = tables.rows as readonly LedgerTableRow[];\n\tfor (const definition of manifest.tables) {\n\t\tconst row = tableRows.find(\n\t\t\t(candidate) => candidate.table_name === definition.name,\n\t\t);\n\t\tif (!row)\n\t\t\tthrow ledgerPhysicalShapeError(target, definition.name, 'is missing');\n\t\tif (row.relation_kind !== manifest.relationKind)\n\t\t\tthrow ledgerPhysicalShapeError(\n\t\t\t\ttarget,\n\t\t\t\tdefinition.name,\n\t\t\t\t'is not an ordinary table',\n\t\t\t);\n\t}\n\n\tconst columns = await executor.query(\n\t\t`SELECT relation.relname AS table_name, attribute.attname AS column_name, pg_catalog.format_type(attribute.atttypid, attribute.atttypmod) AS column_type, attribute.attnotnull AS is_not_null FROM pg_catalog.pg_attribute attribute JOIN pg_catalog.pg_class relation ON relation.oid = attribute.attrelid JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace WHERE namespace.nspname = $1 AND relation.relname = ANY($2::text[]) AND attribute.attnum > 0 AND NOT attribute.attisdropped ORDER BY relation.relname, attribute.attnum`,\n\t\t[ledgerSchema(target), DBSP_LEDGER_TABLES],\n\t);\n\tconst columnRows = columns.rows as readonly LedgerColumnRow[];\n\tfor (const definition of manifest.tables) {\n\t\tconst actual = columnRows.filter(\n\t\t\t(row) => row.table_name === definition.name,\n\t\t);\n\t\tconst hasExpectedColumns =\n\t\t\tactual.length === definition.columns.length &&\n\t\t\tdefinition.columns.every((expected, index) => {\n\t\t\t\tconst row = actual[index];\n\t\t\t\treturn (\n\t\t\t\t\trow?.column_name === expected.name &&\n\t\t\t\t\trow.column_type === expected.type &&\n\t\t\t\t\trow.is_not_null === !expected.nullable\n\t\t\t\t);\n\t\t\t});\n\t\tif (!hasExpectedColumns)\n\t\t\tthrow ledgerPhysicalShapeError(\n\t\t\t\ttarget,\n\t\t\t\tdefinition.name,\n\t\t\t\t'has an unexpected column shape',\n\t\t\t);\n\t}\n\n\t// PostgreSQL 18 records NOT NULL as pg_constraint rows with contype = 'n'.\n\t// NOT NULL belongs to the column-shape assertion above, never this set.\n\tconst constraintRows = await readLedgerConstraints(\n\t\texecutor,\n\t\tledgerSchema(target),\n\t);\n\tfor (const definition of manifest.tables) {\n\t\tconst expected = definition.constraints;\n\t\tconst actual = constraintRows.filter(\n\t\t\t(row) => row.table_name === definition.name,\n\t\t);\n\t\tif (actual.length !== expected.length)\n\t\t\tthrow ledgerPhysicalShapeError(\n\t\t\t\ttarget,\n\t\t\t\tdefinition.name,\n\t\t\t\t'has an unexpected named constraint set',\n\t\t\t);\n\t\tfor (const constraint of expected) {\n\t\t\tconst row = actual.find(\n\t\t\t\t(candidate) => candidate.constraint_name === constraint.name,\n\t\t\t);\n\t\t\tif (\n\t\t\t\t!row ||\n\t\t\t\trow.contype !== constraint.type ||\n\t\t\t\trow.condeferrable !== manifest.constraintProperties.deferrable ||\n\t\t\t\trow.condeferred !== manifest.constraintProperties.initiallyDeferred ||\n\t\t\t\trow.convalidated !== manifest.constraintProperties.validated ||\n\t\t\t\trow.connullsnotdistinct !== (constraint.nullsNotDistinct ?? false) ||\n\t\t\t\t(constraint.columns !== undefined &&\n\t\t\t\t\t!hasColumns(row.key_columns, constraint.columns)) ||\n\t\t\t\t(constraint.referencedTable !== undefined &&\n\t\t\t\t\t(row.referenced_table_name !== constraint.referencedTable ||\n\t\t\t\t\t\trow.referenced_table_schema !== ledgerSchema(target))) ||\n\t\t\t\t(constraint.referencedColumns !== undefined &&\n\t\t\t\t\t!hasColumns(row.referenced_columns, constraint.referencedColumns))\n\t\t\t)\n\t\t\t\tthrow ledgerPhysicalShapeError(\n\t\t\t\t\ttarget,\n\t\t\t\t\tdefinition.name,\n\t\t\t\t\t`has an unexpected constraint ${constraint.name}`,\n\t\t\t\t);\n\t\t\tif (constraint.type === 'c') {\n\t\t\t\tconst expectedExpression =\n\t\t\t\t\tfixture.checks[`${definition.name}.${constraint.name}`];\n\t\t\t\tif (\n\t\t\t\t\ttypeof expectedExpression !== 'string' ||\n\t\t\t\t\trow.check_expression !== expectedExpression\n\t\t\t\t)\n\t\t\t\t\tthrow ledgerPhysicalShapeError(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tdefinition.name,\n\t\t\t\t\t\t`has an unexpected CHECK ${constraint.name}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tconst defaults = await readLedgerDefaults(executor, ledgerSchema(target));\n\tconst expectedDefaultKeys = new Set(\n\t\tmanifest.tables.flatMap((definition) =>\n\t\t\tdefinition.columns\n\t\t\t\t.filter((column) => column.defaultSql !== undefined)\n\t\t\t\t.map((column) => `${definition.name}.${column.name}`),\n\t\t),\n\t);\n\tfor (const defaultRow of defaults) {\n\t\tconst key = `${String(defaultRow.table_name)}.${String(defaultRow.column_name)}`;\n\t\tif (!expectedDefaultKeys.has(key))\n\t\t\tthrow ledgerPhysicalShapeError(\n\t\t\t\ttarget,\n\t\t\t\tString(defaultRow.table_name),\n\t\t\t\t`has an unexpected default for ${String(defaultRow.column_name)}`,\n\t\t\t);\n\t}\n\tfor (const definition of manifest.tables) {\n\t\tfor (const column of definition.columns.filter(\n\t\t\t(candidate) => candidate.defaultSql !== undefined,\n\t\t)) {\n\t\t\tconst expected = fixture.defaults[`${definition.name}.${column.name}`];\n\t\t\tconst actual = defaults.find(\n\t\t\t\t(row) =>\n\t\t\t\t\trow.table_name === definition.name && row.column_name === column.name,\n\t\t\t);\n\t\t\tif (\n\t\t\t\ttypeof expected !== 'string' ||\n\t\t\t\tactual?.default_definition !== expected\n\t\t\t)\n\t\t\t\tthrow ledgerPhysicalShapeError(\n\t\t\t\t\ttarget,\n\t\t\t\t\tdefinition.name,\n\t\t\t\t\t`has an unexpected default for ${column.name}`,\n\t\t\t\t);\n\t\t}\n\t}\n\tconst triggers = await readLedgerTriggers(\n\t\texecutor,\n\t\tledgerSchema(target),\n\t\tDBSP_LEDGER_TABLES,\n\t);\n\tconst trigger = triggers.find(\n\t\t(candidate) =>\n\t\t\tcandidate.table_name === manifest.immutabilityTrigger.tableName &&\n\t\t\tcandidate.trigger_name === manifest.immutabilityTrigger.name,\n\t);\n\tif (!trigger)\n\t\tthrow ledgerPhysicalShapeError(\n\t\t\ttarget,\n\t\t\tmanifest.immutabilityTrigger.tableName,\n\t\t\t'has an unexpected immutability trigger set',\n\t\t);\n\tconst expectedTrigger = manifest.immutabilityTrigger;\n\tif (\n\t\ttrigger.trigger_name !== expectedTrigger.name ||\n\t\ttrigger.trigger_enabled !== expectedTrigger.enabled ||\n\t\ttrigger.trigger_type !== expectedTrigger.type ||\n\t\ttrigger.trigger_arguments !== expectedTrigger.arguments ||\n\t\ttrigger.trigger_deferrable !== expectedTrigger.deferrable ||\n\t\ttrigger.trigger_initially_deferred !== expectedTrigger.initiallyDeferred ||\n\t\ttrigger.function_name !== expectedTrigger.functionName ||\n\t\ttrigger.function_identity_arguments !==\n\t\t\texpectedTrigger.functionIdentityArguments ||\n\t\ttrigger.function_result !== expectedTrigger.functionResult ||\n\t\ttrigger.function_language !== expectedTrigger.functionLanguage ||\n\t\ttrigger.function_kind !== expectedTrigger.functionKind ||\n\t\ttrigger.function_volatility !== expectedTrigger.functionVolatility ||\n\t\ttrigger.function_is_strict !== expectedTrigger.functionIsStrict ||\n\t\ttrigger.function_is_security_definer !==\n\t\t\texpectedTrigger.functionIsSecurityDefiner ||\n\t\ttrigger.function_is_leakproof !== expectedTrigger.functionIsLeakproof ||\n\t\ttrigger.function_config_is_null !== expectedTrigger.functionConfigIsNull ||\n\t\ttrigger.function_source !== expectedTrigger.functionBody\n\t)\n\t\tthrow ledgerPhysicalShapeError(\n\t\t\ttarget,\n\t\t\tmanifest.immutabilityTrigger.tableName,\n\t\t\t'has an unexpected immutability trigger or function definition',\n\t\t);\n\tconst unexpectedTrigger = triggers.find(\n\t\t(candidate) =>\n\t\t\tcandidate !== trigger &&\n\t\t\t!matchesLedgerShapeAllowance(allowance, target, candidate),\n\t);\n\tif (unexpectedTrigger)\n\t\tthrow ledgerPhysicalShapeError(\n\t\t\ttarget,\n\t\t\tString(unexpectedTrigger.table_name),\n\t\t\t'has an unexpected trigger set',\n\t\t);\n\n\tconst indexes = await executor.query(\n\t\t`SELECT relation.relname AS table_name, index_relation.relname AS index_name, index_definition.indisprimary, index_definition.indisunique, index_definition.indisvalid, index_definition.indisready, ARRAY(SELECT attribute.attname::text FROM unnest(index_definition.indkey) WITH ORDINALITY AS index_column(attnum, position) JOIN pg_catalog.pg_attribute attribute ON attribute.attrelid = relation.oid AND attribute.attnum = index_column.attnum ORDER BY index_column.position) AS index_columns FROM pg_catalog.pg_index index_definition JOIN pg_catalog.pg_class relation ON relation.oid = index_definition.indrelid JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace JOIN pg_catalog.pg_class index_relation ON index_relation.oid = index_definition.indexrelid LEFT JOIN pg_catalog.pg_constraint constraint_item ON constraint_item.conindid = index_definition.indexrelid WHERE namespace.nspname = $1 AND relation.relname = ANY($2::text[]) AND constraint_item.oid IS NULL ORDER BY relation.relname, index_definition.indexrelid`,\n\t\t[ledgerSchema(target), DBSP_LEDGER_TABLES],\n\t);\n\tconst indexRows = indexes.rows as readonly LedgerIndexRow[];\n\tconst expectedIndexCount = manifest.tables.reduce(\n\t\t(count, definition) => count + (definition.indexes?.length ?? 0),\n\t\t0,\n\t);\n\tif (indexRows.length !== expectedIndexCount)\n\t\tthrow ledgerPhysicalShapeError(\n\t\t\ttarget,\n\t\t\tString(indexRows[0]?.table_name ?? DBSP_LEDGER_EVENT_TABLE),\n\t\t\t'has an unexpected non-constraint index set',\n\t\t);\n\tfor (const definition of manifest.tables) {\n\t\tfor (const index of definition.indexes ?? []) {\n\t\t\tconst actual = indexRows.find(\n\t\t\t\t(row) =>\n\t\t\t\t\trow.table_name === definition.name && row.index_name === index.name,\n\t\t\t);\n\t\t\tif (\n\t\t\t\tactual?.indisprimary !== false ||\n\t\t\t\tactual?.indisunique !== index.unique ||\n\t\t\t\tactual?.indisvalid !== index.valid ||\n\t\t\t\tactual?.indisready !== index.ready ||\n\t\t\t\t!hasColumns(actual?.index_columns, index.columns)\n\t\t\t)\n\t\t\t\tthrow ledgerPhysicalShapeError(\n\t\t\t\t\ttarget,\n\t\t\t\t\tdefinition.name,\n\t\t\t\t\t`has an unexpected index ${index.name}`,\n\t\t\t\t);\n\t\t}\n\t}\n}\n\nexport class PgLedgerStorageUnsupportedError extends Error {\n\tconstructor(observed: unknown) {\n\t\tsuper(\n\t\t\t`ledger-storage-postgresql-15-required: PostgreSQL >= 15 is required for NULLS NOT DISTINCT (server_version_num ${String(observed)})`,\n\t\t);\n\t\tthis.name = 'PgLedgerStorageUnsupportedError';\n\t}\n}\n\ndeclare const pgOrderedLedgerLocksBrand: unique symbol;\n\n/** Proof returned only after this transaction acquired every home in order. */\nexport interface PgOrderedLedgerLocks {\n\treadonly homes: readonly PgLedgerTarget[];\n\treadonly [pgOrderedLedgerLocksBrand]: 'dbsp-pg-ordered-ledger-locks';\n}\n\nconst orderedLedgerLocks = new WeakSet<object>();\n\nfunction mintPgOrderedLedgerLocks(\n\thomes: readonly LedgerHome[],\n): PgOrderedLedgerLocks {\n\tconst proof = Object.freeze({\n\t\thomes: Object.freeze(\n\t\t\torderedLedgerHomes(homes).map((home) => Object.freeze({ ...home })),\n\t\t),\n\t}) as PgOrderedLedgerLocks;\n\torderedLedgerLocks.add(proof);\n\treturn proof;\n}\n\nexport function isPgOrderedLedgerLocks(\n\tvalue: unknown,\n): value is PgOrderedLedgerLocks {\n\treturn (\n\t\tvalue != null &&\n\t\t(typeof value === 'object' || typeof value === 'function') &&\n\t\torderedLedgerLocks.has(value as object)\n\t);\n}\n\nexport type PgLedgerLockResult =\n\t| { readonly kind: 'acquired'; readonly proof: PgOrderedLedgerLocks }\n\t| { readonly kind: 'busy'; readonly ledger: LedgerHome }\n\t| {\n\t\t\treadonly kind: 'refused';\n\t\t\treadonly ledger: LedgerHome;\n\t\t\treadonly error: unknown;\n\t };\n\nexport type PgLedgerTarget = LedgerHome;\n\n/** Read only reservations explicitly linked to one durable execution/run. */\nexport async function readPgLedgerReservationsForExecution(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\texecutionId: string,\n): Promise<readonly LedgerReservationRow[]> {\n\tconst result = await executor.query(\n\t\t`SELECT address_engine, address_database, address_schema, address_parent, address_kind, address_name, claim_kind, execution_id, pair_id, root_claim_id, home_ledger_scope, home_ledger_schema FROM ${reservationTable(target)} WHERE execution_id = $1 ORDER BY root_claim_id, address_kind, address_name`,\n\t\t[executionId],\n\t);\n\treturn result.rows.map((row) => {\n\t\tconst schema = String(row.address_schema ?? '');\n\t\tconst homeSchema = String(row.home_ledger_schema ?? '');\n\t\tconst parent = row.address_parent;\n\t\treturn {\n\t\t\taddress: {\n\t\t\t\tscope: target.scope,\n\t\t\t\tengine: String(row.address_engine),\n\t\t\t\tdatabase: String(row.address_database),\n\t\t\t\t...(schema ? { schema } : {}),\n\t\t\t\t...(parent == null\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tparent: typeof parent === 'string' ? JSON.parse(parent) : parent,\n\t\t\t\t\t\t}),\n\t\t\t\tkind: String(row.address_kind),\n\t\t\t\tname: String(row.address_name),\n\t\t\t},\n\t\t\tclaimKind: String(row.claim_kind) as LedgerReservationRow['claimKind'],\n\t\t\texecutionId: String(row.execution_id),\n\t\t\t...(row.pair_id == null ? {} : { pairId: String(row.pair_id) }),\n\t\t\trootClaimId: String(row.root_claim_id),\n\t\t\thomeLedger:\n\t\t\t\trow.home_ledger_scope === 'database'\n\t\t\t\t\t? { scope: 'database' }\n\t\t\t\t\t: { scope: 'schema', schema: homeSchema },\n\t\t};\n\t});\n}\n\n/**\n * A re-address pair can cross ledger homes. Discover every existing reservation\n * table before reading the pair so recovery cannot accidentally treat one side\n * of a cross-schema closure as the entire operation.\n */\nexport type PgLedgerReservationCandidateOutcome =\n\t| { readonly target: PgLedgerTarget; readonly kind: 'verified' }\n\t| { readonly target: PgLedgerTarget; readonly kind: 'not-ledger-shape' }\n\t| {\n\t\t\treadonly target: PgLedgerTarget;\n\t\t\treadonly kind: 'unverifiable';\n\t\t\treadonly cause: string;\n\t };\n\nexport type PgLedgerReservationsForPair = readonly LedgerReservationRow[] & {\n\treadonly candidates: readonly PgLedgerReservationCandidateOutcome[];\n};\n\ntype ReleasableTransitionJournalQueryable = TransitionJournalQueryable & {\n\trelease(error?: unknown): void;\n};\n\ntype PoolTransitionJournalQueryable = TransitionJournalQueryable & {\n\tconnect(): Promise<ReleasableTransitionJournalQueryable>;\n};\n\n/** A Pool's query method does not retain a transaction session. */\nfunction isPoolQueryable(\n\texecutor: TransitionJournalQueryable,\n): executor is PoolTransitionJournalQueryable {\n\treturn (\n\t\t'connect' in executor &&\n\t\ttypeof executor.connect === 'function' &&\n\t\t!('release' in executor && typeof executor.release === 'function')\n\t);\n}\n\ntype LedgerDiscoveryRow = {\n\treadonly nspname: unknown;\n\treadonly table_name: unknown;\n\treadonly relation_kind: unknown;\n\treadonly column_names: unknown;\n};\n\n/** The discriminator rejects only definite counterfeits; it never admits one. */\nexport function hasPgLedgerCandidateFingerprint(\n\trows: readonly Pick<\n\t\tLedgerDiscoveryRow,\n\t\t'table_name' | 'relation_kind' | 'column_names'\n\t>[],\n): boolean {\n\tconst manifest = generatePgLedgerExpectedManifest();\n\treturn manifest.tables.every((definition) => {\n\t\tconst row = rows.find(\n\t\t\t(candidate) => candidate.table_name === definition.name,\n\t\t);\n\t\treturn (\n\t\t\trow?.relation_kind === manifest.relationKind &&\n\t\t\thasColumns(\n\t\t\t\trow.column_names,\n\t\t\t\tdefinition.columns.map((column) => column.name),\n\t\t\t)\n\t\t);\n\t});\n}\n\nfunction candidateOutcome(\n\ttarget: PgLedgerTarget,\n\toutcome: PgLedgerPhysicalShapeOutcome,\n): PgLedgerReservationCandidateOutcome {\n\tif (outcome.kind === 'verified') return { target, kind: 'verified' };\n\tif (outcome.kind === 'shape-wrong')\n\t\treturn { target, kind: 'not-ledger-shape' };\n\treturn {\n\t\ttarget,\n\t\tkind: 'unverifiable',\n\t\tcause:\n\t\t\toutcome.kind === 'unverifiable'\n\t\t\t\t? outcome.cause\n\t\t\t\t: outcome.kind === 'unsupported-major'\n\t\t\t\t\t? `unsupported-major:${String(outcome.major)}`\n\t\t\t\t\t: outcome.sqlstate,\n\t};\n}\n\nfunction withCandidateOutcomes(\n\trows: readonly LedgerReservationRow[],\n\tcandidates: readonly PgLedgerReservationCandidateOutcome[],\n): PgLedgerReservationsForPair {\n\tconst result = [...rows] as unknown as PgLedgerReservationsForPair;\n\tObject.defineProperty(result, 'candidates', {\n\t\tvalue: candidates,\n\t\tenumerable: false,\n\t});\n\treturn result;\n}\n\nexport async function readPgLedgerReservationsForPair(\n\texecutor: TransitionJournalQueryable,\n\tpairId: string,\n): Promise<PgLedgerReservationsForPair> {\n\t// The public discovery API owns a repeatable-read transaction. Pin a Pool\n\t// first: BEGIN and SAVEPOINT on Pool.query() can otherwise land on different\n\t// PostgreSQL backends, which is indistinguishable from autocommit here.\n\tif (isPoolQueryable(executor)) {\n\t\tconst session = await executor.connect();\n\t\tlet releaseError: Error | undefined;\n\t\ttry {\n\t\t\treturn await readPgLedgerReservationsForPairOwnTransaction(\n\t\t\t\tsession,\n\t\t\t\tpairId,\n\t\t\t\t(error) => {\n\t\t\t\t\treleaseError = asPairReadReleaseError(error);\n\t\t\t\t},\n\t\t\t);\n\t\t} finally {\n\t\t\tsession.release(releaseError);\n\t\t}\n\t}\n\treturn readPgLedgerReservationsForPairOwnTransaction(executor, pairId);\n}\n\nasync function readPgLedgerReservationsForPairOwnTransaction(\n\texecutor: TransitionJournalQueryable,\n\tpairId: string,\n\tmarkCompromised?: (error: unknown) => void,\n): Promise<PgLedgerReservationsForPair> {\n\tlet begun = false;\n\tlet commitAttempted = false;\n\ttry {\n\t\tawait executor.query(\n\t\t\t'BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY',\n\t\t);\n\t\tbegun = true;\n\t\tconst result = await readPgLedgerReservationsForPairInTransaction(\n\t\t\texecutor,\n\t\t\tpairId,\n\t\t);\n\t\tcommitAttempted = true;\n\t\tawait executor.query('COMMIT');\n\t\tbegun = false;\n\t\treturn result;\n\t} catch (error) {\n\t\tlet rollbackFailed = false;\n\t\tif (begun) {\n\t\t\ttry {\n\t\t\t\tawait executor.query('ROLLBACK');\n\t\t\t} catch {\n\t\t\t\t// Preserve the discovery failure, never a cleanup failure, but do not\n\t\t\t\t// return a session whose transaction state is now unknowable.\n\t\t\t\trollbackFailed = true;\n\t\t\t}\n\t\t}\n\t\tif (commitAttempted || rollbackFailed || isPairReadTransportError(error))\n\t\t\tmarkCompromised?.(error);\n\t\tthrow error;\n\t}\n}\n\nfunction asPairReadReleaseError(error: unknown): Error {\n\treturn error instanceof Error ? error : new Error(String(error));\n}\n\nfunction isPairReadTransportError(error: unknown): boolean {\n\tif (isDeadPgConnectionError(error)) return true;\n\tif (\n\t\terror == null ||\n\t\t(typeof error !== 'object' && typeof error !== 'function')\n\t)\n\t\treturn true;\n\tconst code = (error as { readonly code?: unknown }).code;\n\tif (typeof code !== 'string') return true;\n\treturn !/^[0-9A-Z]{5}$/u.test(code) || code.startsWith('08');\n}\n\n/**\n * Transaction-neutral discovery for a caller that already owns its pinned\n * PostgreSQL transaction. In particular, paired recovery uses this variant\n * after it has begun and before it takes the closure locks.\n */\nexport async function readPgLedgerReservationsForPairInTransaction(\n\texecutor: TransitionJournalQueryable,\n\tpairId: string,\n): Promise<PgLedgerReservationsForPair> {\n\tconst discovered = await executor.query(\n\t\t`SELECT namespace.nspname, relation.relname AS table_name, relation.relkind AS relation_kind, ARRAY(SELECT attribute.attname::text FROM pg_catalog.pg_attribute attribute WHERE attribute.attrelid = relation.oid AND attribute.attnum > 0 AND NOT attribute.attisdropped ORDER BY attribute.attnum) AS column_names FROM pg_catalog.pg_class relation JOIN pg_catalog.pg_namespace namespace ON namespace.oid = relation.relnamespace WHERE relation.relname = ANY($1::text[]) ORDER BY namespace.nspname, relation.relname`,\n\t\t[generatePgLedgerExpectedManifest().tables.map((table) => table.name)],\n\t);\n\tconst grouped = new Map<string, LedgerDiscoveryRow[]>();\n\tfor (const row of discovered.rows as readonly LedgerDiscoveryRow[]) {\n\t\tif (typeof row.nspname !== 'string') continue;\n\t\tconst entries = grouped.get(row.nspname) ?? [];\n\t\tentries.push(row);\n\t\tgrouped.set(row.nspname, entries);\n\t}\n\tconst candidates: PgLedgerReservationCandidateOutcome[] = [];\n\tconst reservations: LedgerReservationRow[] = [];\n\tlet candidateIndex = 0;\n\tfor (const [schema, rows] of grouped) {\n\t\tif (!rows.some((row) => row.table_name === DBSP_LEDGER_RESERVATION_TABLE))\n\t\t\tcontinue;\n\t\tconst target: PgLedgerTarget =\n\t\t\tschema === DBSP_META_SCHEMA\n\t\t\t\t? { scope: 'database' }\n\t\t\t\t: { scope: 'schema', schema };\n\t\tif (!hasPgLedgerCandidateFingerprint(rows)) {\n\t\t\tcandidates.push({ target, kind: 'not-ledger-shape' });\n\t\t\tcontinue;\n\t\t}\n\t\tconst savepoint = `dbsp_ledger_discovery_${candidateIndex}`;\n\t\tcandidateIndex += 1;\n\t\tawait executor.query(`SAVEPOINT ${savepoint}`);\n\t\ttry {\n\t\t\tconst outcome = await classifyPgLedgerPhysicalShape(executor, target);\n\t\t\tconst classified = candidateOutcome(target, outcome);\n\t\t\tif (classified.kind !== 'verified') {\n\t\t\t\tcandidates.push(classified);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst marker = await readPgLedgerMarker(executor, target);\n\t\t\tif (marker.kind !== 'current') {\n\t\t\t\tcandidates.push({ target, kind: 'not-ledger-shape' });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treservations.push(\n\t\t\t\t...(await readPgLedgerReservationsForPairInHomes(executor, pairId, [\n\t\t\t\t\ttarget,\n\t\t\t\t])),\n\t\t\t);\n\t\t\tcandidates.push(classified);\n\t\t} catch (error) {\n\t\t\tconst classified = candidateOutcome(\n\t\t\t\ttarget,\n\t\t\t\tclassifyPgLedgerShapeError(error),\n\t\t\t);\n\t\t\tcandidates.push(classified);\n\t\t} finally {\n\t\t\t// classifyPgLedgerPhysicalShape deliberately returns SQL failures as\n\t\t\t// outcomes. PostgreSQL has nevertheless marked this transaction\n\t\t\t// aborted, so reset every candidate's work before inspecting the next\n\t\t\t// one while retaining the discovery snapshot.\n\t\t\tawait executor.query(`ROLLBACK TO SAVEPOINT ${savepoint}`);\n\t\t\tawait executor.query(`RELEASE SAVEPOINT ${savepoint}`);\n\t\t}\n\t}\n\treturn withCandidateOutcomes(reservations, candidates);\n}\n\n/** Read a re-address pair only from ledger homes already admitted by a caller. */\nexport async function readPgLedgerReservationsForPairInHomes(\n\texecutor: TransitionJournalQueryable,\n\tpairId: string,\n\ttargets: readonly PgLedgerTarget[],\n): Promise<readonly LedgerReservationRow[]> {\n\tconst rows = await Promise.all(\n\t\ttargets.map(async (target) => {\n\t\t\tconst result = await executor.query(\n\t\t\t\t`SELECT address_engine, address_database, address_schema, address_parent, address_kind, address_name, claim_kind, execution_id, pair_id, root_claim_id, home_ledger_scope, home_ledger_schema FROM ${reservationTable(target)} WHERE pair_id = $1 ORDER BY root_claim_id, address_kind, address_name`,\n\t\t\t\t[pairId],\n\t\t\t);\n\t\t\treturn result.rows.map((value) => {\n\t\t\t\tconst schema = String(value.address_schema ?? '');\n\t\t\t\tconst homeSchema = String(value.home_ledger_schema ?? '');\n\t\t\t\treturn {\n\t\t\t\t\taddress: {\n\t\t\t\t\t\tscope: target.scope,\n\t\t\t\t\t\tengine: String(value.address_engine),\n\t\t\t\t\t\tdatabase: String(value.address_database),\n\t\t\t\t\t\t...(schema ? { schema } : {}),\n\t\t\t\t\t\t...(value.address_parent == null\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tparent:\n\t\t\t\t\t\t\t\t\t\ttypeof value.address_parent === 'string'\n\t\t\t\t\t\t\t\t\t\t\t? JSON.parse(value.address_parent)\n\t\t\t\t\t\t\t\t\t\t\t: value.address_parent,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\tkind: String(value.address_kind),\n\t\t\t\t\t\tname: String(value.address_name),\n\t\t\t\t\t},\n\t\t\t\t\tclaimKind: String(\n\t\t\t\t\t\tvalue.claim_kind,\n\t\t\t\t\t) as LedgerReservationRow['claimKind'],\n\t\t\t\t\texecutionId: String(value.execution_id),\n\t\t\t\t\t...(value.pair_id == null ? {} : { pairId: String(value.pair_id) }),\n\t\t\t\t\trootClaimId: String(value.root_claim_id),\n\t\t\t\t\thomeLedger:\n\t\t\t\t\t\tvalue.home_ledger_scope === 'database'\n\t\t\t\t\t\t\t? { scope: 'database' as const }\n\t\t\t\t\t\t\t: { scope: 'schema' as const, schema: homeSchema },\n\t\t\t\t};\n\t\t\t});\n\t\t}),\n\t);\n\treturn rows.flat();\n}\n\ntype LedgerWriteMember = Omit<LedgerChainMember, 'controller' | 'recordedAt'>;\n\nfunction quoteIdent(value: string, type: 'schema' | 'table' | 'alias'): string {\n\tvalidateIdentifier(value, type);\n\treturn `\"${value.replaceAll('\"', '\"\"')}\"`;\n}\n\nfunction qualified(schema: string, table: string): string {\n\treturn `${quoteIdent(schema, 'schema')}.${quoteIdent(table, 'table')}`;\n}\n\nfunction eventTable(target: PgLedgerTarget): string {\n\treturn qualified(ledgerSchema(target), DBSP_LEDGER_EVENT_TABLE);\n}\n\nfunction reservationTable(target: PgLedgerTarget): string {\n\treturn qualified(ledgerSchema(target), DBSP_LEDGER_RESERVATION_TABLE);\n}\n\nfunction ledgerSchema(target: PgLedgerTarget): string {\n\tif (target.scope === 'database') return DBSP_META_SCHEMA;\n\tif (!target.schema)\n\t\tthrow new Error('schema ledger target is missing its schema');\n\treturn target.schema;\n}\n\nfunction addressColumns(prefix = ''): string {\n\treturn [\n\t\t`${prefix}address_engine`,\n\t\t`${prefix}address_database`,\n\t\t`${prefix}address_schema`,\n\t\t`${prefix}address_parent`,\n\t\t`${prefix}address_kind`,\n\t\t`${prefix}address_name`,\n\t].join(', ');\n}\n\nfunction addressValues(member: LedgerWriteMember): readonly unknown[] {\n\treturn [\n\t\tmember.address.engine,\n\t\tmember.address.database,\n\t\t// PostgreSQL MATCH SIMPLE skips a composite foreign key containing NULL.\n\t\t// The empty spelling keeps database-scoped addresses non-null, so the\n\t\t// same-address predecessor constraint is enforced for them too.\n\t\tmember.address.schema ?? '',\n\t\tledgerAddressParentJson(member.address),\n\t\tmember.address.kind,\n\t\tmember.address.name,\n\t];\n}\n\nfunction assertTargetMatchesAddress(\n\ttarget: PgLedgerTarget,\n\tmember: Pick<LedgerWriteMember, 'address'>,\n): void {\n\tif (member.address.scope !== target.scope) {\n\t\tthrow new Error(\n\t\t\t`ledger target ${target.scope} does not match ${member.address.scope}-scoped address ${member.address.name}`,\n\t\t);\n\t}\n\tif (\n\t\ttarget.scope === 'schema' &&\n\t\t(target.schema !== member.address.schema || !target.schema)\n\t) {\n\t\tthrow new Error(\n\t\t\t`ledger target schema ${String(target.schema)} does not match address schema ${String(member.address.schema)} for ${member.address.name}`,\n\t\t);\n\t}\n}\n\nfunction targetForAddress(\n\taddress: LedgerReservationRow['address'],\n): PgLedgerTarget {\n\tif (address.scope === 'database') return { scope: 'database' };\n\tif (!address.schema) {\n\t\tthrow new Error(\n\t\t\t`schema-scoped reservation ${address.name} is missing its schema`,\n\t\t);\n\t}\n\treturn { scope: 'schema', schema: address.schema };\n}\n\nfunction ensureClaimEvent(\n\tkind: LedgerEventKind,\n): asserts kind is LedgerClaimKind {\n\tif (!CLAIM_EVENT_KINDS.has(kind)) {\n\t\tthrow new Error(`ledger event ${kind} is not a claim event`);\n\t}\n}\n\nfunction ensureResolutionEvent(kind: LedgerEventKind): void {\n\tif (!RESOLUTION_EVENT_KINDS.has(kind)) {\n\t\tthrow new Error(`ledger event ${kind} is not a resolution event`);\n\t}\n}\n\nfunction memberValues(member: LedgerWriteMember): readonly unknown[] {\n\treturn [\n\t\tmember.eventId,\n\t\t...addressValues(member),\n\t\tmember.executionId ?? null,\n\t\tmember.plannedClaimKey ?? null,\n\t\tmember.claimGroupId ?? null,\n\t\tmember.rootClaimId ?? null,\n\t\tmember.catalogueIdentity ? JSON.stringify(member.catalogueIdentity) : null,\n\t\tmember.eventKind,\n\t\tmember.predecessor ?? null,\n\t\tmember.pairId ?? null,\n\t\tmember.declared ? JSON.stringify(member.declared.value) : null,\n\t\tmember.declared?.digest ?? null,\n\t\tmember.observed ? JSON.stringify(member.observed.value) : null,\n\t\tmember.observed?.digest ?? null,\n\t\tmember.refusal?.code ?? null,\n\t\tmember.refusal?.cause ?? null,\n\t\tmember.refusal?.state ?? null,\n\t\tmember.refusal?.withheldAuthority ?? null,\n\t\tmember.refusal?.resolvingCommand ?? null,\n\t];\n}\n\nfunction eventInsertSql(target: PgLedgerTarget): string {\n\treturn `INSERT INTO ${eventTable(target)} (event_id, ${addressColumns()}, execution_id, planned_claim_key, claim_group_id, root_claim_id, catalogue_identity, event_kind, predecessor, pair_id, declared, declared_digest, observed, observed_digest, refusal_code, refusal_cause, refusal_state, refusal_withheld_authority, refusal_resolving_command) VALUES ($1, $2, $3, $4, $5::jsonb, $6, $7, $8, $9, $10, $11, $12::jsonb, $13, $14, $15, $16::jsonb, $17, $18::jsonb, $19, $20, $21, $22, $23, $24) RETURNING event_id`;\n}\n\nexport function renderCreateLedgerEventTableSql(\n\ttarget: PgLedgerTarget,\n): string {\n\tconst definition = PG_LEDGER_SPEC.find(\n\t\t(table) => table.name === DBSP_LEDGER_EVENT_TABLE,\n\t);\n\tif (!definition) throw new Error('ledger event definition is missing');\n\treturn renderCreateLedgerTableFromSpec(target, definition);\n}\n\nexport function renderCreateLedgerTerminalMemberIndexSql(\n\ttarget: PgLedgerTarget,\n): string {\n\tconst definition = PG_LEDGER_SPEC.find(\n\t\t(table) => table.name === DBSP_LEDGER_EVENT_TABLE,\n\t);\n\tconst index = definition?.indexes?.[0];\n\tif (!index)\n\t\tthrow new Error('ledger terminal-member index definition is missing');\n\treturn renderCreateLedgerIndexFromSpec(target, definition, index);\n}\n\nexport function renderCreateLedgerReservationTableSql(\n\ttarget: PgLedgerTarget,\n): string {\n\tconst definition = PG_LEDGER_SPEC.find(\n\t\t(table) => table.name === DBSP_LEDGER_RESERVATION_TABLE,\n\t);\n\tif (!definition) throw new Error('ledger reservation definition is missing');\n\treturn renderCreateLedgerTableFromSpec(target, definition);\n}\n\nexport function renderCreateLedgerIdentityTableSql(\n\ttarget: PgLedgerTarget,\n): string {\n\tconst definition = PG_LEDGER_SPEC.find(\n\t\t(table) => table.name === DBSP_LEDGER_IDENTITY_TABLE,\n\t);\n\tif (!definition) throw new Error('ledger identity definition is missing');\n\treturn renderCreateLedgerTableFromSpec(target, definition);\n}\n\nexport function renderCreateLedgerMarkerTableSql(\n\ttarget: PgLedgerTarget,\n): string {\n\tconst definition = PG_LEDGER_SPEC.find(\n\t\t(table) => table.name === DBSP_LEDGER_MARKER_TABLE,\n\t);\n\tif (!definition) throw new Error('ledger marker definition is missing');\n\treturn renderCreateLedgerTableFromSpec(target, definition);\n}\n\nexport function renderCreateLedgerImmutabilityFunctionSql(\n\ttarget: PgLedgerTarget,\n): string {\n\treturn renderCreateLedgerImmutabilityFunctionFromSpec(target);\n}\n\nexport function renderCreateLedgerImmutabilityTriggerSql(\n\ttarget: PgLedgerTarget,\n): string {\n\treturn renderCreateLedgerImmutabilityTriggerFromSpec(target);\n}\n\n/** Proves the PG 15 requirement before emitting a NULLS NOT DISTINCT table. */\nexport async function ensurePgLedgerStorageVersion(\n\texecutor: TransitionJournalQueryable,\n): Promise<void> {\n\tconst raw = (await executor.query('SHOW server_version_num')).rows[0]\n\t\t?.server_version_num;\n\tconst version = Number(raw);\n\tif (\n\t\t!Number.isSafeInteger(version) ||\n\t\tversion < PG_LEDGER_MIN_SERVER_VERSION_NUM\n\t) {\n\t\tthrow new PgLedgerStorageUnsupportedError(raw);\n\t}\n}\n\nexport async function ensurePgLedger(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\toptions: { readonly writeMarker?: boolean } = {},\n): Promise<void> {\n\tawait ensurePgLedgerStorageVersion(executor);\n\tawait executor.query(renderCreateLedgerEventTableSql(target));\n\tawait executor.query(renderCreateLedgerTerminalMemberIndexSql(target));\n\tawait executor.query(renderCreateLedgerReservationTableSql(target));\n\tawait executor.query(renderCreateLedgerIdentityTableSql(target));\n\tawait executor.query(renderCreateLedgerMarkerTableSql(target));\n\tawait executor.query(renderCreateLedgerImmutabilityFunctionSql(target));\n\tawait executor.query(renderCreateLedgerImmutabilityTriggerSql(target));\n\tif (options.writeMarker !== false)\n\t\tawait writePgLedgerShapeMarker(executor, target);\n}\n\nexport async function ensureDbspMetaLedger(\n\texecutor: TransitionJournalQueryable,\n\toptions: { readonly writeMarker?: boolean } = {},\n): Promise<void> {\n\tawait executor.query(\n\t\t`CREATE SCHEMA IF NOT EXISTS ${quoteIdent(DBSP_META_SCHEMA, 'schema')}`,\n\t);\n\tawait ensurePgLedger(executor, { scope: 'database' }, options);\n}\n\n/** Writes the marker separately when a cutover must make it the final step. */\nexport async function writePgLedgerShapeMarker(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n): Promise<void> {\n\tawait executor.query(\n\t\t`INSERT INTO ${qualified(ledgerSchema(target), DBSP_LEDGER_MARKER_TABLE)} (id, version) VALUES (true, $1) ON CONFLICT (id) DO NOTHING`,\n\t\t[PG_LEDGER_SHAPE_VERSION],\n\t);\n}\n\n/** Records lineage once; a mismatching identity is an admission concern of unit 5. */\nexport async function recordPgLedgerIdentity(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\tidentity: LedgerIdentity,\n): Promise<void> {\n\tawait executor.query(\n\t\t`INSERT INTO ${qualified(ledgerSchema(target), DBSP_LEDGER_IDENTITY_TABLE)} (id, cluster_system_identifier, database_oid, namespace_oid) VALUES (true, $1, $2, $3) ON CONFLICT (id) DO NOTHING`,\n\t\t[\n\t\t\tidentity.clusterSystemIdentifier,\n\t\t\tidentity.databaseOid,\n\t\t\tidentity.namespaceOid ?? null,\n\t\t],\n\t);\n}\n\nexport async function appendPgLedgerProgress(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\tmember: LedgerWriteMember,\n): Promise<void> {\n\tassertTargetMatchesAddress(target, member);\n\tif (\n\t\tmember.eventKind !== 'executing' &&\n\t\tmember.eventKind !== 'indeterminate'\n\t) {\n\t\tthrow new Error(\n\t\t\t`ledger event ${member.eventKind} changes reservation state; use the claim or resolution append primitive`,\n\t\t);\n\t}\n\tawait classifyPgWrite(() =>\n\t\texecutor.query(eventInsertSql(target), memberValues(member)),\n\t);\n}\n\n/**\n * Appends the root claim and every reservation in one PostgreSQL statement.\n * Callers can include this statement in a larger DDL transaction, but cannot\n * accidentally split this claim's append from its durable reservation rows.\n */\nexport async function appendPgLedgerClaim(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\tmember: LedgerWriteMember,\n\treservations: readonly LedgerReservationRow[],\n\treservationRootClaimId = member.eventId,\n): Promise<void> {\n\tassertTargetMatchesAddress(target, member);\n\tensureClaimEvent(member.eventKind);\n\tif (reservations.length === 0) {\n\t\tthrow new Error(\n\t\t\t`ledger claim ${member.eventId} has an empty effects closure`,\n\t\t);\n\t}\n\tconst reservationsByLedger = new Map<\n\t\tstring,\n\t\t{\n\t\t\ttarget: PgLedgerTarget;\n\t\t\trows: LedgerReservationRow[];\n\t\t}\n\t>();\n\tfor (const reservation of reservations) {\n\t\tif (reservation.claimKind !== member.eventKind) {\n\t\t\tthrow new Error(\n\t\t\t\t`ledger reservation ${reservation.address.name} claim kind does not match claim ${member.eventId}`,\n\t\t\t);\n\t\t}\n\t\tif (reservation.rootClaimId !== reservationRootClaimId) {\n\t\t\tthrow new Error(\n\t\t\t\t`ledger reservation ${reservation.address.name} is not anchored to claim group ${reservationRootClaimId}`,\n\t\t\t);\n\t\t}\n\t\tif (\n\t\t\treservation.homeLedger.scope !== target.scope ||\n\t\t\treservation.homeLedger.schema !== target.schema\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`ledger reservation ${reservation.address.name} does not name claim ${member.eventId}'s home ledger`,\n\t\t\t);\n\t\t}\n\t\tconst reservationTarget = targetForAddress(reservation.address);\n\t\tconst key = `${reservationTarget.scope}:${reservationTarget.schema ?? ''}`;\n\t\tconst group = reservationsByLedger.get(key) ?? {\n\t\t\ttarget: reservationTarget,\n\t\t\trows: [],\n\t\t};\n\t\tgroup.rows.push(reservation);\n\t\treservationsByLedger.set(key, group);\n\t}\n\tconst values = [...memberValues(member)] as unknown[];\n\tconst reservationInserts = [...reservationsByLedger.values()].map((group) => {\n\t\tconst rows = group.rows.map((reservation) => {\n\t\t\tconst start = values.length + 1;\n\t\t\tvalues.push(\n\t\t\t\t...addressValues({ address: reservation.address } as LedgerWriteMember),\n\t\t\t\treservation.claimKind,\n\t\t\t\treservation.executionId,\n\t\t\t\treservation.pairId ?? null,\n\t\t\t\treservation.rootClaimId,\n\t\t\t\treservation.homeLedger.scope,\n\t\t\t\treservation.homeLedger.schema ?? null,\n\t\t\t);\n\t\t\treturn `($${start}, $${start + 1}, $${start + 2}, $${start + 3}::jsonb, $${start + 4}, $${start + 5}, $${start + 6}, $${start + 7}, $${start + 8}, $${start + 9}, $${start + 10}, $${start + 11})`;\n\t\t});\n\t\treturn `INSERT INTO ${reservationTable(group.target)} (${addressColumns()}, claim_kind, execution_id, pair_id, root_claim_id, home_ledger_scope, home_ledger_schema) VALUES ${rows.join(', ')} RETURNING root_claim_id`;\n\t});\n\tconst [lastReservationInsert] = reservationInserts.slice(-1);\n\tconst leadingReservationInserts = reservationInserts.slice(0, -1);\n\tawait classifyPgWrite(() =>\n\t\texecutor.query(\n\t\t\t`WITH appended AS (${eventInsertSql(target)})${leadingReservationInserts.map((insert, index) => `, reserved_${index} AS (${insert})`).join('')} ${lastReservationInsert}`,\n\t\t\tvalues,\n\t\t),\n\t);\n}\n\n/**\n * Appends an entire destructive closure as one ledger group. The caller owns\n * the surrounding locked transaction; consequently a failed member insert\n * rolls back the root, every member and every reservation together.\n */\nexport async function appendPgLedgerClaimGroup(\n\texecutor: TransitionJournalQueryable,\n\troot: LedgerWriteMember,\n\tmembers: readonly LedgerWriteMember[],\n\treservations: readonly LedgerReservationRow[],\n): Promise<void> {\n\tconst claims = [root, ...members];\n\tif (claims.length < 2)\n\t\tthrow new Error(\n\t\t\t'ledger claim group requires a root and at least one member',\n\t\t);\n\tif (reservations.length !== claims.length)\n\t\tthrow new Error(\n\t\t\t'ledger claim group requires exactly one reservation per claim',\n\t\t);\n\tconst byAddress = new Map<string, LedgerWriteMember>();\n\tconst addressKey = (member: Pick<LedgerWriteMember, 'address'>) =>\n\t\tledgerAddressKey(member.address);\n\tfor (const claim of claims) {\n\t\tensureClaimEvent(claim.eventKind);\n\t\tassertTargetMatchesAddress(targetForAddress(claim.address), claim);\n\t\tconst key = addressKey(claim);\n\t\tif (byAddress.has(key))\n\t\t\tthrow new Error(\n\t\t\t\t`ledger claim group repeats address ${claim.address.name}`,\n\t\t\t);\n\t\tbyAddress.set(key, claim);\n\t}\n\tfor (const reservation of reservations) {\n\t\tconst claim = byAddress.get(addressKey({ address: reservation.address }));\n\t\tif (!claim)\n\t\t\tthrow new Error(\n\t\t\t\t`ledger claim group reservation ${reservation.address.name} has no claim`,\n\t\t\t);\n\t\tif (reservation.rootClaimId !== root.eventId)\n\t\t\tthrow new Error(\n\t\t\t\t`ledger claim group reservation ${reservation.address.name} is not anchored to root ${root.eventId}`,\n\t\t\t);\n\t\tif (reservation.claimKind !== claim.eventKind)\n\t\t\tthrow new Error(\n\t\t\t\t`ledger claim group reservation ${reservation.address.name} claim kind does not match its claim`,\n\t\t\t);\n\t}\n\tfor (const claim of claims) {\n\t\tconst reservation = reservations.find(\n\t\t\t(candidate) =>\n\t\t\t\taddressKey({ address: candidate.address }) === addressKey(claim),\n\t\t);\n\t\tif (!reservation)\n\t\t\tthrow new Error(\n\t\t\t\t`ledger claim group claim ${claim.eventId} has no reservation`,\n\t\t\t);\n\t\tawait appendPgLedgerClaim(\n\t\t\texecutor,\n\t\t\ttargetForAddress(claim.address),\n\t\t\tclaim,\n\t\t\t[reservation],\n\t\t\troot.eventId,\n\t\t);\n\t}\n}\n\n/** Resolves every closure terminal in the caller's one locked transaction. */\nexport async function appendPgLedgerResolutionGroup(\n\texecutor: TransitionJournalQueryable,\n\trootClaimId: string,\n\tmembers: readonly LedgerWriteMember[],\n\treservations: readonly Pick<LedgerReservationRow, 'address'>[],\n): Promise<void> {\n\tif (members.length < 2)\n\t\tthrow new Error(\n\t\t\t'ledger resolution group requires a root and at least one member',\n\t\t);\n\tif (reservations.length !== members.length)\n\t\tthrow new Error(\n\t\t\t'ledger resolution group requires exactly one reservation per terminal',\n\t\t);\n\tconst addressKey = (member: Pick<LedgerWriteMember, 'address'>) =>\n\t\tledgerAddressKey(member.address);\n\tconst memberAddresses = new Set<string>();\n\tfor (const member of members) {\n\t\tensureResolutionEvent(member.eventKind);\n\t\tconst key = addressKey(member);\n\t\tif (memberAddresses.has(key))\n\t\t\tthrow new Error(\n\t\t\t\t`ledger resolution group repeats address ${member.address.name}`,\n\t\t\t);\n\t\tmemberAddresses.add(key);\n\t}\n\tfor (const reservation of reservations) {\n\t\tif (!memberAddresses.has(addressKey(reservation)))\n\t\t\tthrow new Error(\n\t\t\t\t`ledger resolution group reservation ${reservation.address.name} has no terminal`,\n\t\t\t);\n\t}\n\tconst [root, ...containedMembers] = members;\n\tif (!root) throw new Error('ledger resolution group has no root terminal');\n\t// The group owns its whole reservation closure. Its first append releases\n\t// every reservation under the shared transaction; later terminal appends\n\t// therefore deliberately expect an empty deletion effect.\n\tawait appendPgLedgerResolution(\n\t\texecutor,\n\t\ttargetForAddress(root.address),\n\t\troot,\n\t\trootClaimId,\n\t\treservations,\n\t);\n\tfor (const member of containedMembers) {\n\t\tawait appendPgLedgerResolution(\n\t\t\texecutor,\n\t\t\ttargetForAddress(member.address),\n\t\t\tmember,\n\t\t\trootClaimId,\n\t\t\t[],\n\t\t);\n\t}\n}\n\n/**\n * Appends a terminal member and releases the reservations owned by this\n * append atomically. A group-owned contained member has an intentionally\n * empty closure because its group's root append already released it.\n */\nexport async function appendPgLedgerResolution(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\tmember: LedgerWriteMember,\n\trootClaimId: string,\n\treservations: readonly Pick<LedgerReservationRow, 'address'>[],\n): Promise<void> {\n\tassertTargetMatchesAddress(target, member);\n\tensureResolutionEvent(member.eventKind);\n\tif (member.eventKind === 'refused' && member.refusal === undefined)\n\t\tthrow new Error(\n\t\t\t`ledger refusal ${member.eventId} is missing its durable refusal protocol`,\n\t\t);\n\tif (member.eventKind !== 'refused' && member.refusal !== undefined)\n\t\tthrow new Error(\n\t\t\t`ledger event ${member.eventId} carries a refusal protocol but is not refused`,\n\t\t);\n\tconst values = [...memberValues(member)] as unknown[];\n\tconst rootClaimIdParameter = values.length + 1;\n\tif (reservations.length > 0) values.push(rootClaimId);\n\tconst reservationsByLedger = new Map<\n\t\tstring,\n\t\t{\n\t\t\ttarget: PgLedgerTarget;\n\t\t\trows: Pick<LedgerReservationRow, 'address'>[];\n\t\t}\n\t>();\n\tfor (const reservation of reservations) {\n\t\tconst reservationTarget = targetForAddress(reservation.address);\n\t\tconst key = `${reservationTarget.scope}:${reservationTarget.schema ?? ''}`;\n\t\tconst group = reservationsByLedger.get(key) ?? {\n\t\t\ttarget: reservationTarget,\n\t\t\trows: [],\n\t\t};\n\t\tgroup.rows.push(reservation);\n\t\treservationsByLedger.set(key, group);\n\t}\n\tconst reservationDeletes = [...reservationsByLedger.values()].map((group) => {\n\t\tconst addressPredicates = group.rows.map((reservation) => {\n\t\t\tconst start = values.length + 1;\n\t\t\tvalues.push(\n\t\t\t\t...addressValues({ address: reservation.address } as LedgerWriteMember),\n\t\t\t);\n\t\t\treturn `(${addressColumns('r.')}) = ($${start}, $${start + 1}, $${start + 2}, $${start + 3}::jsonb, $${start + 4}, $${start + 5})`;\n\t\t});\n\t\treturn `DELETE FROM ${reservationTable(group.target)} r WHERE r.root_claim_id = $${rootClaimIdParameter} AND (${addressPredicates.join(' OR ')}) RETURNING r.root_claim_id`;\n\t});\n\tconst deletedCtes = reservationDeletes.map(\n\t\t(deletion, index) => `released_${index} AS (${deletion})`,\n\t);\n\tconst deletedCount =\n\t\tdeletedCtes.length === 0\n\t\t\t? '0::int'\n\t\t\t: `(${deletedCtes.map((_, index) => `(SELECT count(*)::int FROM released_${index})`).join(' + ')})`;\n\tconst result = await classifyPgWrite(() =>\n\t\texecutor.query(\n\t\t\t`WITH appended AS (${eventInsertSql(target)})${deletedCtes.length === 0 ? '' : `, ${deletedCtes.join(', ')}`} SELECT (SELECT count(*)::int FROM appended) AS appended_count, ${deletedCount} AS deleted_count`,\n\t\t\tvalues,\n\t\t),\n\t);\n\tconst row = result.rows[0];\n\tconst appended = Number(row?.appended_count);\n\tconst deleted = Number(row?.deleted_count);\n\t// Query-only unit doubles predate the CTE's count projection. They prove SQL\n\t// construction but cannot attest row counts; real PostgreSQL rows are always\n\t// checked fail-closed below.\n\tif (row?.appended_count === undefined && row?.deleted_count === undefined)\n\t\treturn;\n\tif (appended !== 1 || deleted !== reservations.length)\n\t\tthrow new Error(\n\t\t\t`ledger resolution ${member.eventId} refused: appended ${appended} terminal rows but deleted ${deleted}/${reservations.length} reservations`,\n\t\t);\n}\n\n/**\n * `released` has no claim spelling in the closed event grammar. It is the\n * deliberate atomic managed-to-unknown transition, so it must not invent an\n * empty reservation closure merely to reuse ordinary claim resolution.\n */\nexport async function appendPgLedgerRelease(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\tmember: LedgerWriteMember,\n): Promise<void> {\n\tassertTargetMatchesAddress(target, member);\n\tif (member.eventKind !== 'released')\n\t\tthrow new Error('ledger release append requires a released event');\n\tawait classifyPgWrite(() =>\n\t\texecutor.query(eventInsertSql(target), memberValues(member)),\n\t);\n}\n\nfunction orderedLedgerHomes(\n\thomes: readonly LedgerHome[],\n): readonly LedgerHome[] {\n\tconst byKey = new Map<string, LedgerHome>();\n\tfor (const home of homes) {\n\t\tif (home.scope === 'schema' && !home.schema) {\n\t\t\tthrow new Error('schema ledger lock target is missing its schema');\n\t\t}\n\t\tconst key = home.scope === 'database' ? '0' : `1:${home.schema}`;\n\t\tbyKey.set(key, home);\n\t}\n\treturn [...byKey.entries()]\n\t\t.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n\t\t.map(([, home]) => home);\n}\n\nfunction ledgerLockKey(home: LedgerHome): string {\n\treturn createHash('sha256')\n\t\t.update('dbsp.managed-ledger.lock.v1:\\0')\n\t\t.update(home.scope === 'database' ? DBSP_META_SCHEMA : (home.schema ?? ''))\n\t\t.digest()\n\t\t.readBigInt64BE(0)\n\t\t.toString();\n}\n\n/**\n * Transaction-scoped, non-waiting locks for one effects closure. The ordering\n * is dbsp_meta first and then schema name, so opposing closures cannot deadlock.\n */\nexport async function acquirePgLedgerLocks(\n\texecutor: TransitionJournalQueryable,\n\thomes: readonly LedgerHome[],\n): Promise<PgLedgerLockResult> {\n\tfor (const home of orderedLedgerHomes(homes)) {\n\t\ttry {\n\t\t\tconst result = await executor.query(\n\t\t\t\t'SELECT pg_catalog.pg_try_advisory_xact_lock($1::bigint) AS locked',\n\t\t\t\t[ledgerLockKey(home)],\n\t\t\t);\n\t\t\tif (result.rows[0]?.locked !== true)\n\t\t\t\treturn { kind: 'busy', ledger: home };\n\t\t} catch (error) {\n\t\t\treturn { kind: 'refused', ledger: home, error };\n\t\t}\n\t}\n\tconst result = { kind: 'acquired' as const } as PgLedgerLockResult;\n\t// Keep the historical result's enumerable shape: callers branch on `kind`,\n\t// while only the new evidence constructor needs the opaque proof.\n\tObject.defineProperty(result, 'proof', {\n\t\tvalue: mintPgOrderedLedgerLocks(homes),\n\t\tenumerable: false,\n\t});\n\treturn result;\n}\n","{\n\t\"checks\": {\n\t\t\"dbsp_ledger_event.dbsp_ledger_declared_digest_pair\": \"((declared IS NULL) = (declared_digest IS NULL))\",\n\t\t\"dbsp_ledger_event.dbsp_ledger_event_kind_closed\": \"(event_kind = ANY (ARRAY['adopt-intent'::text, 'adopt'::text, 'intent'::text, 'retire-intent'::text, 'readdress-intent'::text, 'refused'::text, 'executing'::text, 'observed'::text, 'absent'::text, 'indeterminate'::text, 'resolved'::text, 'readdressed-to'::text, 'readdressed-from'::text, 'released'::text]))\",\n\t\t\"dbsp_ledger_event.dbsp_ledger_observed_digest_pair\": \"((observed IS NULL) = (observed_digest IS NULL))\",\n\t\t\"dbsp_ledger_event.dbsp_ledger_refusal_payload\": \"((event_kind = 'refused'::text) = ((refusal_code IS NOT NULL) AND (refusal_cause IS NOT NULL) AND (refusal_state IS NOT NULL) AND (refusal_withheld_authority IS NOT NULL) AND (refusal_resolving_command IS NOT NULL)))\",\n\t\t\"dbsp_ledger_identity.dbsp_ledger_identity_id_check\": \"id\",\n\t\t\"dbsp_ledger_marker.dbsp_ledger_marker_id_check\": \"id\",\n\t\t\"dbsp_ledger_marker.dbsp_ledger_marker_version_check\": \"(version >= 1)\",\n\t\t\"dbsp_ledger_reservation.dbsp_ledger_reservation_check\": \"(((home_ledger_scope = 'database'::text) AND (home_ledger_schema IS NULL)) OR ((home_ledger_scope = 'schema'::text) AND (home_ledger_schema IS NOT NULL)))\",\n\t\t\"dbsp_ledger_reservation.dbsp_ledger_reservation_claim_kind_check\": \"(claim_kind = ANY (ARRAY['adopt-intent'::text, 'intent'::text, 'retire-intent'::text, 'readdress-intent'::text]))\",\n\t\t\"dbsp_ledger_reservation.dbsp_ledger_reservation_home_ledger_scope_check\": \"(home_ledger_scope = ANY (ARRAY['schema'::text, 'database'::text]))\"\n\t},\n\t\"defaults\": {\n\t\t\"dbsp_ledger_event.controller\": \"CURRENT_USER\",\n\t\t\"dbsp_ledger_event.controller_oid\": \"((CURRENT_USER)::regrole)::oid\",\n\t\t\"dbsp_ledger_event.recorded_at\": \"now()\",\n\t\t\"dbsp_ledger_identity.id\": \"true\",\n\t\t\"dbsp_ledger_marker.id\": \"true\"\n\t}\n}\n","{\n\t\"checks\": {\n\t\t\"dbsp_ledger_event.dbsp_ledger_declared_digest_pair\": \"((declared IS NULL) = (declared_digest IS NULL))\",\n\t\t\"dbsp_ledger_event.dbsp_ledger_event_kind_closed\": \"(event_kind = ANY (ARRAY['adopt-intent'::text, 'adopt'::text, 'intent'::text, 'retire-intent'::text, 'readdress-intent'::text, 'refused'::text, 'executing'::text, 'observed'::text, 'absent'::text, 'indeterminate'::text, 'resolved'::text, 'readdressed-to'::text, 'readdressed-from'::text, 'released'::text]))\",\n\t\t\"dbsp_ledger_event.dbsp_ledger_observed_digest_pair\": \"((observed IS NULL) = (observed_digest IS NULL))\",\n\t\t\"dbsp_ledger_event.dbsp_ledger_refusal_payload\": \"((event_kind = 'refused'::text) = ((refusal_code IS NOT NULL) AND (refusal_cause IS NOT NULL) AND (refusal_state IS NOT NULL) AND (refusal_withheld_authority IS NOT NULL) AND (refusal_resolving_command IS NOT NULL)))\",\n\t\t\"dbsp_ledger_identity.dbsp_ledger_identity_id_check\": \"id\",\n\t\t\"dbsp_ledger_marker.dbsp_ledger_marker_id_check\": \"id\",\n\t\t\"dbsp_ledger_marker.dbsp_ledger_marker_version_check\": \"(version >= 1)\",\n\t\t\"dbsp_ledger_reservation.dbsp_ledger_reservation_check\": \"(((home_ledger_scope = 'database'::text) AND (home_ledger_schema IS NULL)) OR ((home_ledger_scope = 'schema'::text) AND (home_ledger_schema IS NOT NULL)))\",\n\t\t\"dbsp_ledger_reservation.dbsp_ledger_reservation_claim_kind_check\": \"(claim_kind = ANY (ARRAY['adopt-intent'::text, 'intent'::text, 'retire-intent'::text, 'readdress-intent'::text]))\",\n\t\t\"dbsp_ledger_reservation.dbsp_ledger_reservation_home_ledger_scope_check\": \"(home_ledger_scope = ANY (ARRAY['schema'::text, 'database'::text]))\"\n\t},\n\t\"defaults\": {\n\t\t\"dbsp_ledger_event.controller\": \"CURRENT_USER\",\n\t\t\"dbsp_ledger_event.controller_oid\": \"((CURRENT_USER)::regrole)::oid\",\n\t\t\"dbsp_ledger_event.recorded_at\": \"now()\",\n\t\t\"dbsp_ledger_identity.id\": \"true\",\n\t\t\"dbsp_ledger_marker.id\": \"true\"\n\t}\n}\n","{\n\t\"checks\": {\n\t\t\"dbsp_ledger_event.dbsp_ledger_declared_digest_pair\": \"((declared IS NULL) = (declared_digest IS NULL))\",\n\t\t\"dbsp_ledger_event.dbsp_ledger_event_kind_closed\": \"(event_kind = ANY (ARRAY['adopt-intent'::text, 'adopt'::text, 'intent'::text, 'retire-intent'::text, 'readdress-intent'::text, 'refused'::text, 'executing'::text, 'observed'::text, 'absent'::text, 'indeterminate'::text, 'resolved'::text, 'readdressed-to'::text, 'readdressed-from'::text, 'released'::text]))\",\n\t\t\"dbsp_ledger_event.dbsp_ledger_observed_digest_pair\": \"((observed IS NULL) = (observed_digest IS NULL))\",\n\t\t\"dbsp_ledger_event.dbsp_ledger_refusal_payload\": \"((event_kind = 'refused'::text) = ((refusal_code IS NOT NULL) AND (refusal_cause IS NOT NULL) AND (refusal_state IS NOT NULL) AND (refusal_withheld_authority IS NOT NULL) AND (refusal_resolving_command IS NOT NULL)))\",\n\t\t\"dbsp_ledger_identity.dbsp_ledger_identity_id_check\": \"id\",\n\t\t\"dbsp_ledger_marker.dbsp_ledger_marker_id_check\": \"id\",\n\t\t\"dbsp_ledger_marker.dbsp_ledger_marker_version_check\": \"(version >= 1)\",\n\t\t\"dbsp_ledger_reservation.dbsp_ledger_reservation_check\": \"(((home_ledger_scope = 'database'::text) AND (home_ledger_schema IS NULL)) OR ((home_ledger_scope = 'schema'::text) AND (home_ledger_schema IS NOT NULL)))\",\n\t\t\"dbsp_ledger_reservation.dbsp_ledger_reservation_claim_kind_check\": \"(claim_kind = ANY (ARRAY['adopt-intent'::text, 'intent'::text, 'retire-intent'::text, 'readdress-intent'::text]))\",\n\t\t\"dbsp_ledger_reservation.dbsp_ledger_reservation_home_ledger_scope_check\": \"(home_ledger_scope = ANY (ARRAY['schema'::text, 'database'::text]))\"\n\t},\n\t\"defaults\": {\n\t\t\"dbsp_ledger_event.controller\": \"CURRENT_USER\",\n\t\t\"dbsp_ledger_event.controller_oid\": \"((CURRENT_USER)::regrole)::oid\",\n\t\t\"dbsp_ledger_event.recorded_at\": \"now()\",\n\t\t\"dbsp_ledger_identity.id\": \"true\",\n\t\t\"dbsp_ledger_marker.id\": \"true\"\n\t}\n}\n","{\n\t\"checks\": {\n\t\t\"dbsp_ledger_event.dbsp_ledger_declared_digest_pair\": \"((declared IS NULL) = (declared_digest IS NULL))\",\n\t\t\"dbsp_ledger_event.dbsp_ledger_event_kind_closed\": \"(event_kind = ANY (ARRAY['adopt-intent'::text, 'adopt'::text, 'intent'::text, 'retire-intent'::text, 'readdress-intent'::text, 'refused'::text, 'executing'::text, 'observed'::text, 'absent'::text, 'indeterminate'::text, 'resolved'::text, 'readdressed-to'::text, 'readdressed-from'::text, 'released'::text]))\",\n\t\t\"dbsp_ledger_event.dbsp_ledger_observed_digest_pair\": \"((observed IS NULL) = (observed_digest IS NULL))\",\n\t\t\"dbsp_ledger_event.dbsp_ledger_refusal_payload\": \"((event_kind = 'refused'::text) = ((refusal_code IS NOT NULL) AND (refusal_cause IS NOT NULL) AND (refusal_state IS NOT NULL) AND (refusal_withheld_authority IS NOT NULL) AND (refusal_resolving_command IS NOT NULL)))\",\n\t\t\"dbsp_ledger_identity.dbsp_ledger_identity_id_check\": \"id\",\n\t\t\"dbsp_ledger_marker.dbsp_ledger_marker_id_check\": \"id\",\n\t\t\"dbsp_ledger_marker.dbsp_ledger_marker_version_check\": \"(version >= 1)\",\n\t\t\"dbsp_ledger_reservation.dbsp_ledger_reservation_check\": \"(((home_ledger_scope = 'database'::text) AND (home_ledger_schema IS NULL)) OR ((home_ledger_scope = 'schema'::text) AND (home_ledger_schema IS NOT NULL)))\",\n\t\t\"dbsp_ledger_reservation.dbsp_ledger_reservation_claim_kind_check\": \"(claim_kind = ANY (ARRAY['adopt-intent'::text, 'intent'::text, 'retire-intent'::text, 'readdress-intent'::text]))\",\n\t\t\"dbsp_ledger_reservation.dbsp_ledger_reservation_home_ledger_scope_check\": \"(home_ledger_scope = ANY (ARRAY['schema'::text, 'database'::text]))\"\n\t},\n\t\"defaults\": {\n\t\t\"dbsp_ledger_event.controller\": \"CURRENT_USER\",\n\t\t\"dbsp_ledger_event.controller_oid\": \"((CURRENT_USER)::regrole)::oid\",\n\t\t\"dbsp_ledger_event.recorded_at\": \"now()\",\n\t\t\"dbsp_ledger_identity.id\": \"true\",\n\t\t\"dbsp_ledger_marker.id\": \"true\"\n\t}\n}\n","import { validateIdentifier } from '../validate.js';\nimport {\n\tDBSP_LEDGER_EVENT_TABLE,\n\tDBSP_LEDGER_IDENTITY_TABLE,\n\tDBSP_LEDGER_MARKER_TABLE,\n\tDBSP_LEDGER_RESERVATION_TABLE,\n\ttype DBSP_LEDGER_TABLES,\n\tDBSP_META_SCHEMA,\n} from './constants.js';\n\n/** This is the sole authored description of the durable PostgreSQL ledger. */\nexport type LedgerSpecTarget = Readonly<{\n\tscope: 'database' | 'schema';\n\tschema?: string;\n}>;\n\nexport type LedgerColumnSpec = Readonly<{\n\tname: string;\n\ttype: string;\n\tnullable: boolean;\n\tdefaultSql?: string;\n}>;\nexport type LedgerConstraintSpec = Readonly<{\n\tname: string;\n\ttype: 'c' | 'f' | 'p' | 'u';\n\tsql: (target: LedgerSpecTarget) => string;\n\tcolumns?: readonly string[];\n\treferencedTable?: string;\n\treferencedColumns?: readonly string[];\n\tnullsNotDistinct?: boolean;\n}>;\nexport type LedgerIndexSpec = Readonly<{\n\tname: string;\n\tcolumns: readonly string[];\n\tunique?: boolean;\n\tnullsNotDistinct?: boolean;\n\tvalid: boolean;\n\tready: boolean;\n}>;\nexport type LedgerTableSpec = Readonly<{\n\tname: (typeof DBSP_LEDGER_TABLES)[number];\n\tcolumns: readonly LedgerColumnSpec[];\n\tconstraints: readonly LedgerConstraintSpec[];\n\tindexes?: readonly LedgerIndexSpec[];\n}>;\n\nconst events = [\n\t'adopt-intent',\n\t'adopt',\n\t'intent',\n\t'retire-intent',\n\t'readdress-intent',\n\t'refused',\n\t'executing',\n\t'observed',\n\t'absent',\n\t'indeterminate',\n\t'resolved',\n\t'readdressed-to',\n\t'readdressed-from',\n\t'released',\n] as const;\nconst eventKindsSql = events.map((kind) => `'${kind}'`).join(', ');\nconst address = [\n\t'address_engine',\n\t'address_database',\n\t'address_schema',\n\t'address_parent',\n\t'address_kind',\n\t'address_name',\n] as const;\nexport const PG_LEDGER_ADDRESS_COLUMNS = address;\nexport const PG_LEDGER_RELATION_KIND = 'r' as const;\nexport const PG_LEDGER_CONSTRAINT_PROPERTIES = {\n\tdeferrable: false,\n\tinitiallyDeferred: false,\n\tvalidated: true,\n} as const;\nconst addressSql = () => address.join(', ');\n\nfunction quote(value: string, type: 'schema' | 'table'): string {\n\tvalidateIdentifier(value, type);\n\treturn `\"${value.replaceAll('\"', '\"\"')}\"`;\n}\nexport function ledgerSpecSchema(target: LedgerSpecTarget): string {\n\tif (target.scope === 'database') return DBSP_META_SCHEMA;\n\tif (!target.schema)\n\t\tthrow new Error('schema ledger target is missing its schema');\n\treturn target.schema;\n}\nfunction table(target: LedgerSpecTarget, name: string): string {\n\treturn `${quote(ledgerSpecSchema(target), 'schema')}.${quote(name, 'table')}`;\n}\nconst cols = (\n\titems: readonly [string, string, boolean, string?][],\n): LedgerColumnSpec[] =>\n\titems.map(([name, type, nullable, defaultSql]) => ({\n\t\tname,\n\t\ttype,\n\t\tnullable,\n\t\t...(defaultSql ? { defaultSql } : {}),\n\t}));\n\nexport const PG_LEDGER_SPEC: readonly LedgerTableSpec[] = [\n\t{\n\t\tname: DBSP_LEDGER_EVENT_TABLE,\n\t\tcolumns: cols([\n\t\t\t['event_id', 'text', false],\n\t\t\t['address_engine', 'text', false],\n\t\t\t['address_database', 'text', false],\n\t\t\t['address_schema', 'text', false],\n\t\t\t['address_parent', 'jsonb', false],\n\t\t\t['address_kind', 'text', false],\n\t\t\t['address_name', 'text', false],\n\t\t\t['execution_id', 'text', true],\n\t\t\t['planned_claim_key', 'text', true],\n\t\t\t['claim_group_id', 'text', true],\n\t\t\t['root_claim_id', 'text', true],\n\t\t\t['catalogue_identity', 'jsonb', true],\n\t\t\t['event_kind', 'text', false],\n\t\t\t['predecessor', 'text', true],\n\t\t\t['pair_id', 'text', true],\n\t\t\t['declared', 'jsonb', true],\n\t\t\t['declared_digest', 'text', true],\n\t\t\t['observed', 'jsonb', true],\n\t\t\t['observed_digest', 'text', true],\n\t\t\t['refusal_code', 'text', true],\n\t\t\t['refusal_cause', 'text', true],\n\t\t\t['refusal_state', 'text', true],\n\t\t\t['refusal_withheld_authority', 'text', true],\n\t\t\t['refusal_resolving_command', 'text', true],\n\t\t\t['controller', 'name', false, 'current_user'],\n\t\t\t['controller_oid', 'oid', false, 'current_user::regrole::oid'],\n\t\t\t['recorded_at', 'timestamp with time zone', false, 'now()'],\n\t\t]),\n\t\tconstraints: [\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_event_pkey',\n\t\t\t\ttype: 'p',\n\t\t\t\tcolumns: ['event_id'],\n\t\t\t\tsql: () => 'PRIMARY KEY (event_id)',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_event_kind_closed',\n\t\t\t\ttype: 'c',\n\t\t\t\tsql: () => `CHECK (event_kind IN (${eventKindsSql}))`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_declared_digest_pair',\n\t\t\t\ttype: 'c',\n\t\t\t\tsql: () => 'CHECK ((declared IS NULL) = (declared_digest IS NULL))',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_observed_digest_pair',\n\t\t\t\ttype: 'c',\n\t\t\t\tsql: () => 'CHECK ((observed IS NULL) = (observed_digest IS NULL))',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_refusal_payload',\n\t\t\t\ttype: 'c',\n\t\t\t\tsql: () =>\n\t\t\t\t\t\"CHECK ((event_kind = 'refused') = (refusal_code IS NOT NULL AND refusal_cause IS NOT NULL AND refusal_state IS NOT NULL AND refusal_withheld_authority IS NOT NULL AND refusal_resolving_command IS NOT NULL))\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_event_address_event_unique',\n\t\t\t\ttype: 'u',\n\t\t\t\tcolumns: [...address, 'event_id'],\n\t\t\t\tsql: () => `UNIQUE (${addressSql()}, event_id)`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_event_one_child',\n\t\t\t\ttype: 'u',\n\t\t\t\tcolumns: [...address, 'predecessor'],\n\t\t\t\tnullsNotDistinct: true,\n\t\t\t\tsql: () => `UNIQUE NULLS NOT DISTINCT (${addressSql()}, predecessor)`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_event_same_address_predecessor',\n\t\t\t\ttype: 'f',\n\t\t\t\tcolumns: [...address, 'predecessor'],\n\t\t\t\treferencedTable: DBSP_LEDGER_EVENT_TABLE,\n\t\t\t\treferencedColumns: [...address, 'event_id'],\n\t\t\t\tsql: (target) =>\n\t\t\t\t\t`FOREIGN KEY (${addressSql()}, predecessor) REFERENCES ${table(target, DBSP_LEDGER_EVENT_TABLE)} (${addressSql()}, event_id)`,\n\t\t\t},\n\t\t],\n\t\tindexes: [\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_event_terminal_member',\n\t\t\t\tcolumns: ['predecessor'],\n\t\t\t\tunique: false,\n\t\t\t\tvalid: true,\n\t\t\t\tready: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: DBSP_LEDGER_RESERVATION_TABLE,\n\t\tcolumns: cols([\n\t\t\t['address_engine', 'text', false],\n\t\t\t['address_database', 'text', false],\n\t\t\t['address_schema', 'text', false],\n\t\t\t['address_parent', 'jsonb', false],\n\t\t\t['address_kind', 'text', false],\n\t\t\t['address_name', 'text', false],\n\t\t\t['claim_kind', 'text', false],\n\t\t\t['execution_id', 'text', false],\n\t\t\t['pair_id', 'text', true],\n\t\t\t['root_claim_id', 'text', false],\n\t\t\t['home_ledger_scope', 'text', false],\n\t\t\t['home_ledger_schema', 'text', true],\n\t\t]),\n\t\tconstraints: [\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_reservation_pkey',\n\t\t\t\ttype: 'p',\n\t\t\t\tcolumns: address,\n\t\t\t\tsql: () => `PRIMARY KEY (${addressSql()})`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_reservation_claim_kind_check',\n\t\t\t\ttype: 'c',\n\t\t\t\tsql: () =>\n\t\t\t\t\t\"CHECK (claim_kind IN ('adopt-intent', 'intent', 'retire-intent', 'readdress-intent'))\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_reservation_home_ledger_scope_check',\n\t\t\t\ttype: 'c',\n\t\t\t\tsql: () => \"CHECK (home_ledger_scope IN ('schema', 'database'))\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_reservation_check',\n\t\t\t\ttype: 'c',\n\t\t\t\tsql: () =>\n\t\t\t\t\t\"CHECK ((home_ledger_scope = 'database' AND home_ledger_schema IS NULL) OR (home_ledger_scope = 'schema' AND home_ledger_schema IS NOT NULL))\",\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: DBSP_LEDGER_IDENTITY_TABLE,\n\t\tcolumns: cols([\n\t\t\t['id', 'boolean', false, 'true'],\n\t\t\t['cluster_system_identifier', 'text', false],\n\t\t\t['database_oid', 'text', false],\n\t\t\t['namespace_oid', 'text', true],\n\t\t]),\n\t\tconstraints: [\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_identity_pkey',\n\t\t\t\ttype: 'p',\n\t\t\t\tcolumns: ['id'],\n\t\t\t\tsql: () => 'PRIMARY KEY (id)',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_identity_id_check',\n\t\t\t\ttype: 'c',\n\t\t\t\tsql: () => 'CHECK (id)',\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: DBSP_LEDGER_MARKER_TABLE,\n\t\tcolumns: cols([\n\t\t\t['id', 'boolean', false, 'true'],\n\t\t\t['version', 'integer', false],\n\t\t]),\n\t\tconstraints: [\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_marker_pkey',\n\t\t\t\ttype: 'p',\n\t\t\t\tcolumns: ['id'],\n\t\t\t\tsql: () => 'PRIMARY KEY (id)',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_marker_id_check',\n\t\t\t\ttype: 'c',\n\t\t\t\tsql: () => 'CHECK (id)',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'dbsp_ledger_marker_version_check',\n\t\t\t\ttype: 'c',\n\t\t\t\tsql: () => 'CHECK (version >= 1)',\n\t\t\t},\n\t\t],\n\t},\n];\n\nexport function renderCreateLedgerTableFromSpec(\n\ttarget: LedgerSpecTarget,\n\tdefinition: LedgerTableSpec,\n): string {\n\tconst columns = definition.columns.map(\n\t\t(column) =>\n\t\t\t`${column.name} ${column.type}${column.nullable ? '' : ' NOT NULL'}${column.defaultSql ? ` DEFAULT ${column.defaultSql}` : ''}`,\n\t);\n\tconst constraints = definition.constraints.map(\n\t\t(constraint) =>\n\t\t\t`CONSTRAINT ${quote(constraint.name, 'table')} ${constraint.sql(target)}`,\n\t);\n\treturn `CREATE TABLE IF NOT EXISTS ${table(target, definition.name)} (${[...columns, ...constraints].join(', ')})`;\n}\nexport function renderCreateLedgerIndexFromSpec(\n\ttarget: LedgerSpecTarget,\n\tdefinition: LedgerTableSpec,\n\tindex: LedgerIndexSpec,\n): string {\n\treturn `CREATE INDEX IF NOT EXISTS ${quote(index.name, 'table')} ON ${table(target, definition.name)} (${index.columns.join(', ')})`;\n}\nexport const LEDGER_IMMUTABILITY_FUNCTION_NAME =\n\t'dbsp_ledger_reject_event_mutation';\nexport const LEDGER_IMMUTABILITY_FUNCTION_BODY =\n\t\" BEGIN IF TG_OP = 'INSERT' THEN NEW.controller := current_user; NEW.controller_oid := current_user::regrole::oid; RETURN NEW; END IF; RAISE EXCEPTION 'dbsp ledger events are append-only for address %', OLD.address_name USING ERRCODE = '55000'; END; \";\nexport const PG_LEDGER_IMMUTABILITY_TRIGGER_SPEC = {\n\tname: 'dbsp_ledger_event_immutable',\n\ttableName: DBSP_LEDGER_EVENT_TABLE,\n\tenabled: 'O',\n\ttype: '31',\n\targuments: '',\n\tdeferrable: false,\n\tinitiallyDeferred: false,\n\tfunctionName: LEDGER_IMMUTABILITY_FUNCTION_NAME,\n\tfunctionIdentityArguments: '',\n\tfunctionResult: 'trigger',\n\tfunctionLanguage: 'plpgsql',\n\tfunctionKind: 'f',\n\tfunctionVolatility: 'v',\n\tfunctionIsStrict: false,\n\tfunctionIsSecurityDefiner: false,\n\tfunctionIsLeakproof: false,\n\tfunctionConfigIsNull: true,\n\tfunctionBody: LEDGER_IMMUTABILITY_FUNCTION_BODY,\n} as const;\nexport function renderCreateLedgerImmutabilityFunctionFromSpec(\n\ttarget: LedgerSpecTarget,\n): string {\n\tconst spec = PG_LEDGER_IMMUTABILITY_TRIGGER_SPEC;\n\treturn `CREATE OR REPLACE FUNCTION ${table(target, spec.functionName)}() RETURNS ${spec.functionResult} LANGUAGE ${spec.functionLanguage} AS $$${spec.functionBody}$$`;\n}\nexport function renderCreateLedgerImmutabilityTriggerFromSpec(\n\ttarget: LedgerSpecTarget,\n): string {\n\tconst spec = PG_LEDGER_IMMUTABILITY_TRIGGER_SPEC;\n\tconst schema = ledgerSpecSchema(target).replaceAll(\"'\", \"''\");\n\treturn `DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_trigger t JOIN pg_catalog.pg_class c ON c.oid = t.tgrelid JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE t.tgname = '${spec.name}' AND n.nspname = '${schema}' AND c.relname = '${spec.tableName}') THEN CREATE TRIGGER ${spec.name} BEFORE INSERT OR UPDATE OR DELETE ON ${table(target, spec.tableName)} FOR EACH ROW EXECUTE FUNCTION ${table(target, spec.functionName)}(); END IF; END $$`;\n}\n\nexport type LedgerExpectedManifest = Readonly<{\n\ttables: readonly LedgerTableSpec[];\n\trelationKind: typeof PG_LEDGER_RELATION_KIND;\n\tconstraintProperties: typeof PG_LEDGER_CONSTRAINT_PROPERTIES;\n\timmutabilityTrigger: typeof PG_LEDGER_IMMUTABILITY_TRIGGER_SPEC;\n}>;\nexport function generatePgLedgerExpectedManifest(): LedgerExpectedManifest {\n\treturn {\n\t\ttables: PG_LEDGER_SPEC,\n\t\trelationKind: PG_LEDGER_RELATION_KIND,\n\t\tconstraintProperties: PG_LEDGER_CONSTRAINT_PROPERTIES,\n\t\timmutabilityTrigger: PG_LEDGER_IMMUTABILITY_TRIGGER_SPEC,\n\t};\n}\n","import type { TransitionJournalQueryable } from './journal.js';\nimport {\n\tassertPgLedgerPhysicalShapeVerified,\n\tclassifyPgLedgerPhysicalShape,\n\tisPgOrderedLedgerLocks,\n\ttype PgLedgerPhysicalShapeOutcome,\n\ttype PgLedgerShapeAllowance,\n\ttype PgLedgerTarget,\n\ttype PgOrderedLedgerLocks,\n} from './ledger.js';\nimport { readPgLedgerScopeCurrency } from './reinitialize-preflight.js';\n\ndeclare const postLockAdmissionEvidenceBrand: unique symbol;\n\n/**\n * Evidence that this session held the ordered ledger locks while it observed\n * both the reference shape and marker/lineage currency.\n */\nexport interface PostLockAdmissionEvidence {\n\treadonly homes: readonly PgLedgerTarget[];\n\treadonly backendId: string;\n\treadonly transactionId: string | undefined;\n\treadonly [postLockAdmissionEvidenceBrand]: 'dbsp-post-lock-admission-evidence';\n}\n\nconst postLockAdmissionEvidence = new WeakSet<object>();\n\nexport class PostLockAdmissionEvidenceError extends Error {\n\tconstructor(detail: string) {\n\t\tsuper(`post-lock admission evidence refused: ${detail}`);\n\t\tthis.name = 'PostLockAdmissionEvidenceError';\n\t}\n}\n\ntype PostLockAdmissionEvidenceSeams = {\n\treadonly classifyShape: (\n\t\texecutor: TransitionJournalQueryable,\n\t\thome: PgLedgerTarget,\n\t\tallowance?: PgLedgerShapeAllowance,\n\t) => Promise<PgLedgerPhysicalShapeOutcome>;\n\treadonly readCurrency: typeof readPgLedgerScopeCurrency;\n\treadonly readSessionIdentity: (\n\t\texecutor: TransitionJournalQueryable,\n\t) => Promise<{\n\t\treadonly backendId: string;\n\t\treadonly transactionId: string | undefined;\n\t}>;\n};\n\nconst productionSeams: PostLockAdmissionEvidenceSeams = {\n\tclassifyShape: classifyPgLedgerPhysicalShape,\n\treadCurrency: readPgLedgerScopeCurrency,\n\tasync readSessionIdentity(executor) {\n\t\tconst result = await executor.query(\n\t\t\t'SELECT pg_catalog.pg_backend_pid()::text AS backend_id, pg_catalog.txid_current_if_assigned()::text AS transaction_id',\n\t\t);\n\t\tconst row = result.rows[0];\n\t\tif (!row || typeof row.backend_id !== 'string')\n\t\t\tthrow new PostLockAdmissionEvidenceError(\n\t\t\t\t'backend identity could not be read from the locked session',\n\t\t\t);\n\t\tif (row.transaction_id != null && typeof row.transaction_id !== 'string')\n\t\t\tthrow new PostLockAdmissionEvidenceError(\n\t\t\t\t'transaction identity could not be read from the locked session',\n\t\t\t);\n\t\treturn {\n\t\t\tbackendId: row.backend_id,\n\t\t\t...(typeof row.transaction_id === 'string'\n\t\t\t\t? { transactionId: row.transaction_id }\n\t\t\t\t: { transactionId: undefined }),\n\t\t};\n\t},\n};\n\nfunction currencyDetail(\n\tcurrency: Awaited<ReturnType<typeof readPgLedgerScopeCurrency>>,\n): string {\n\treturn currency.kind === 'not-current' && currency.reason === 'lineage'\n\t\t? 'ledger lineage is not current'\n\t\t: `ledger marker is ${currency.marker.kind}`;\n}\n\n/**\n * The only constructor. It deliberately requires the opaque lock proof rather\n * than a list of homes, so callers cannot claim a post-lock observation from\n * plain JavaScript with a structural lookalike.\n */\nexport async function createPostLockAdmissionEvidence(\n\texecutor: TransitionJournalQueryable,\n\tlocks: PgOrderedLedgerLocks,\n\tseams: PostLockAdmissionEvidenceSeams = productionSeams,\n\tallowance?: PgLedgerShapeAllowance,\n): Promise<PostLockAdmissionEvidence> {\n\tif (!isPgOrderedLedgerLocks(locks))\n\t\tthrow new PostLockAdmissionEvidenceError(\n\t\t\t'ordered ledger locks were not acquired by this adapter',\n\t\t);\n\tfor (const home of locks.homes) {\n\t\tconst shape = await seams.classifyShape(executor, home, allowance);\n\t\tassertPgLedgerPhysicalShapeVerified(shape);\n\t\tconst currency = await seams.readCurrency(executor, home);\n\t\tif (currency.kind !== 'current')\n\t\t\tthrow new PostLockAdmissionEvidenceError(currencyDetail(currency));\n\t}\n\tconst identity = await seams.readSessionIdentity(executor);\n\tconst evidence = Object.freeze({\n\t\thomes: Object.freeze(locks.homes.map((home) => Object.freeze({ ...home }))),\n\t\tbackendId: identity.backendId,\n\t\ttransactionId: identity.transactionId,\n\t}) as PostLockAdmissionEvidence;\n\tpostLockAdmissionEvidence.add(evidence);\n\treturn evidence;\n}\n\nexport function isPostLockAdmissionEvidence(\n\tvalue: unknown,\n): value is PostLockAdmissionEvidence {\n\treturn (\n\t\tvalue != null &&\n\t\t(typeof value === 'object' || typeof value === 'function') &&\n\t\tpostLockAdmissionEvidence.has(value as object)\n\t);\n}\n","import {\n\tcanonicalJson,\n\tclassifyOutcomeRecovery,\n\tprojectLedgerChain,\n\tselectorMatchesResource,\n\ttype ValidatedManagedStepManifest,\n} from '@dbsp/core';\nimport type { AdmittedDestructiveOutcomeClaim } from '@dbsp/core/internal';\nimport {\n\tadmitDestructiveOutcomeClaim,\n\tadmitOutcomeClaim,\n\tclaimIdForToken,\n\tconsumeClaimToken,\n\ttype DurablyLoadedRun,\n\tisDestructiveAuthorityPermit,\n\tisDurablyLoadedRun,\n} from '@dbsp/core/internal';\nimport type {\n\tAdmittedOutcomeClaim,\n\tClaimBundleStatement,\n\tClaimToken,\n\tControllerIdentity,\n\tDestructiveDecision,\n\tLedgerAddress,\n\tLedgerChainMember,\n\tLedgerEventKind,\n\tLedgerPayload,\n\tLedgerReservationRow,\n\tOutcomeClaimAdmission,\n\tOutcomeClaimPlan,\n\tOutcomeIndeterminateRecoveryEvidence,\n\tOutcomeProtocolRefusal,\n\tOutcomeRecoveryClassification,\n\tOutcomeRecoveryEffect,\n\tOutcomeRecoveryReadBack,\n\tOutcomeVacancy,\n\tScopedApprovalSet,\n} from '@dbsp/types';\nimport { refusalFor, sameLedgerAddress } from '@dbsp/types';\nimport {\n\ttype GeneratedPostconditionSession,\n\twithPinnedGeneratedPostconditionSession,\n} from '../ddl/generated-postcondition-verifier.js';\nimport { DEFAULT_DDL_LOCK_TIMEOUT_MS } from '../ddl/lock-timeout.js';\nimport { readPgCatalogueIdentity } from './catalogue-identity.js';\nimport { readPgLedgerAddressChain } from './chain-reader.js';\nimport { classifyPgWrite } from './database-writability.js';\nimport type { TransitionJournalQueryable } from './journal.js';\nimport {\n\tacquirePgLedgerLocks,\n\tappendPgLedgerClaim,\n\tappendPgLedgerClaimGroup,\n\tappendPgLedgerProgress,\n\tappendPgLedgerResolution,\n\tappendPgLedgerResolutionGroup,\n\tPgLedgerPhysicalShapeValidationError,\n\ttype PgLedgerShapeAllowance,\n\ttype PgLedgerTarget,\n\treadPgLedgerReservationsForPairInHomes,\n\treadPgLedgerReservationsForPairInTransaction,\n\tvalidatePgLedgerPhysicalShape,\n} from './ledger.js';\nimport { isDeadPgConnectionError } from './lessor.js';\nimport {\n\tformatPgTransitionUnknownError,\n\tpgLockRelationForAddress,\n\treadPgCatalogueIdentityWithResolvableRelationLock,\n} from './lock-relation.js';\nimport {\n\tcreatePostLockAdmissionEvidence,\n\tisPostLockAdmissionEvidence,\n\ttype PostLockAdmissionEvidence,\n} from './post-lock-admission-evidence.js';\nimport { readPgLedgerScopeCurrency } from './reinitialize-preflight.js';\n\ndeclare const admittedPermitBrand: unique symbol;\ninterface AdmittedPermit {\n\treadonly [admittedPermitBrand]: 'dbsp-admitted-permit';\n}\n\ndeclare const pgLockedRunBrand: unique symbol;\nconst lockedRuns = new WeakSet<object>();\n\n/**\n * A run identity that was loaded while the caller owns its run lock. This is\n * deliberately not a structural `{ runId, planDigest }`: callers cannot bind\n * the digest check to two independently supplied strings.\n */\nexport interface PgLockedRun {\n\treadonly runId: string;\n\treadonly planDigest: string;\n\treadonly [pgLockedRunBrand]: 'dbsp-pg-locked-journal-run';\n}\n\n/**\n * Adapter-only bridge from the journal-load/run-lock boundary. Keep this\n * beside the admitted facade; ordinary callers receive a `PgLockedRun`, never\n * manufacture one from string fields.\n */\nexport function lockPgJournalRun(run: DurablyLoadedRun): PgLockedRun {\n\tif (!isDurablyLoadedRun(run))\n\t\tthrow new Error(\n\t\t\t'locked journal run refuses an unverified durable-run witness',\n\t\t);\n\tconst locked = Object.freeze({\n\t\trunId: run.metadata.runId,\n\t\tplanDigest: run.metadata.planDigest,\n\t}) as PgLockedRun;\n\tlockedRuns.add(locked);\n\treturn locked;\n}\n\ndeclare const digestBindingVerdictBrand: unique symbol;\nexport interface DigestBindingVerdict {\n\treadonly [digestBindingVerdictBrand]: 'dbsp-digest-binding-verdict';\n}\n\ndeclare const validatedManifestVerdictBrand: unique symbol;\nexport interface ValidatedManifestVerdict {\n\treadonly [validatedManifestVerdictBrand]: 'dbsp-validated-manifest-verdict';\n}\n\ndeclare const approvalScopeVerdictBrand: unique symbol;\nexport interface ApprovalScopeVerdict {\n\treadonly [approvalScopeVerdictBrand]: 'dbsp-approval-scope-verdict';\n}\n\ndeclare const liveAdmissionVerdictBrand: unique symbol;\nexport interface LiveAdmissionVerdict {\n\treadonly [liveAdmissionVerdictBrand]: 'dbsp-live-admission-verdict';\n}\n\ntype ReleasableTransitionJournalQueryable = TransitionJournalQueryable & {\n\trelease(error?: unknown): void;\n};\n\ntype PoolTransitionJournalQueryable = TransitionJournalQueryable & {\n\tconnect(): Promise<ReleasableTransitionJournalQueryable>;\n};\n\nfunction isPoolQueryable(\n\texecutor: TransitionJournalQueryable,\n): executor is PoolTransitionJournalQueryable {\n\t// node-postgres exposes `connect()` on both Pool and Client. A checked-out\n\t// Client also has `release()`, and is already the session that the caller\n\t// deliberately selected (including for concurrent and kill scenarios).\n\t// Only a pool may be checked out here.\n\treturn (\n\t\t'connect' in executor &&\n\t\ttypeof executor.connect === 'function' &&\n\t\t!('release' in executor && typeof executor.release === 'function')\n\t);\n}\n\n/**\n * A pool is not a transaction session: each `query()` may use a different\n * PostgreSQL connection. Claim append, token validation, DDL and terminal\n * append must therefore share a checked-out client whenever the caller gives\n * this protocol a pool.\n */\nexport async function withPgOutcomeSession<T>(\n\texecutor: TransitionJournalQueryable,\n\twork: (session: TransitionJournalQueryable) => Promise<T>,\n): Promise<T> {\n\tif (!isPoolQueryable(executor)) return work(executor);\n\tconst session = await executor.connect();\n\tlet failed = false;\n\tlet failure: unknown;\n\ttry {\n\t\treturn await work(session);\n\t} catch (error) {\n\t\tfailed = true;\n\t\tfailure = error;\n\t\tthrow error;\n\t} finally {\n\t\tsession.release(\n\t\t\tcompromisedPgOutcomeSessions.get(session) ??\n\t\t\t\t(!failed || isConfirmedPgServerError(failure)\n\t\t\t\t\t? undefined\n\t\t\t\t\t: asPgSessionReleaseError(failure)),\n\t\t);\n\t}\n}\n\nconst compromisedPgOutcomeSessions = new WeakMap<object, Error>();\n\nfunction asPgSessionReleaseError(error: unknown): Error {\n\treturn error instanceof Error\n\t\t? error\n\t\t: new Error(formatPgTransitionUnknownError(error));\n}\n\nfunction pgSqlState(error: unknown): string | undefined {\n\tif (\n\t\terror == null ||\n\t\t(typeof error !== 'object' && typeof error !== 'function')\n\t)\n\t\treturn undefined;\n\tconst code = (error as { readonly code?: unknown }).code;\n\treturn typeof code === 'string' && /^[0-9A-Z]{5}$/u.test(code)\n\t\t? code\n\t\t: undefined;\n}\n\n/** A SQLSTATE is a server acknowledgement, except for known dead backends. */\nfunction isConfirmedPgServerError(error: unknown): boolean {\n\treturn pgSqlState(error) !== undefined && !isDeadPgConnectionError(error);\n}\n\nfunction markPgOutcomeSessionCompromised(\n\tsession: TransitionJournalQueryable,\n\terror: unknown,\n): void {\n\tif (isConfirmedPgServerError(error)) return;\n\tcompromisedPgOutcomeSessions.set(\n\t\tsession as object,\n\t\tasPgSessionReleaseError(error),\n\t);\n}\n\n/**\n * The sole explicit-transition bracket for managed ledger work. It checks a\n * client out once when given a Pool, never checks out recursively, and keeps\n * BEGIN, all work, COMMIT/ROLLBACK and release on that one session.\n */\nexport async function withPgTransitionTransaction<T>(\n\texecutor: TransitionJournalQueryable,\n\twork: (session: TransitionJournalQueryable) => Promise<T>,\n): Promise<T> {\n\treturn withPgOutcomeSession(executor, async (session) => {\n\t\tlet committed = false;\n\t\tlet commitAttempted = false;\n\t\ttry {\n\t\t\tawait session.query('BEGIN');\n\t\t\tconst result = await work(session);\n\t\t\tcommitAttempted = true;\n\t\t\tawait session.query('COMMIT');\n\t\t\tcommitted = true;\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (!committed && !commitAttempted) await rollback(session);\n\t\t\tif (commitAttempted) {\n\t\t\t\tif (isConfirmedPgServerError(error))\n\t\t\t\t\tthrow new PgCommitDeterministicFailureError(error);\n\t\t\t\tmarkPgOutcomeSessionCompromised(session, error);\n\t\t\t\tthrow new PgCommitAcknowledgementAmbiguousError(error);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t});\n}\n\n/** Apply the admitted-outcome lock bound in an open transition transaction. */\nexport async function setPgTransitionLockTimeout(\n\texecutor: TransitionJournalQueryable,\n\ttimeout?: number,\n): Promise<void> {\n\tawait executor.query(\n\t\t`SET LOCAL lock_timeout = '${boundedLockTimeout(timeout)}ms'`,\n\t);\n}\n\n/** A COMMIT write may have reached PostgreSQL even when its acknowledgement did not. */\nexport class PgCommitAcknowledgementAmbiguousError extends Error {\n\tconstructor(cause: unknown) {\n\t\tsuper(\n\t\t\t`PostgreSQL COMMIT acknowledgement is transport-ambiguous: ${detail(cause)}`,\n\t\t\t{\n\t\t\t\tcause,\n\t\t\t},\n\t\t);\n\t\tthis.name = 'PgCommitAcknowledgementAmbiguousError';\n\t}\n}\n\n/** PostgreSQL acknowledged that COMMIT did not take effect. */\nexport class PgCommitDeterministicFailureError extends Error {\n\tconstructor(cause: unknown) {\n\t\tsuper(`PostgreSQL COMMIT was rejected by the server: ${detail(cause)}`, {\n\t\t\tcause,\n\t\t});\n\t\tthis.name = 'PgCommitDeterministicFailureError';\n\t}\n}\n\n/**\n * Test-only observation points on the admitted path. Production callers do\n * not supply an observer, so the helper is inert: it performs no IPC, I/O, or\n * scheduling work in an ordinary run.\n */\nexport type PgOutcomeCheckpoint =\n\t| 'post-lock-integrity-before-append'\n\t| 'commit-acknowledged'\n\t| 'ddl-completed-before-read-back';\n\nexport type PgOutcomeCheckpointObserver = (\n\tcheckpoint: PgOutcomeCheckpoint,\n) => Promise<void> | void;\n\nasync function checkpoint(\n\tobserver: PgOutcomeCheckpointObserver | undefined,\n\tpoint: PgOutcomeCheckpoint,\n): Promise<void> {\n\tif (observer) await observer(point);\n}\n\nasync function commitPgOutcome(\n\texecutor: TransitionJournalQueryable,\n\tobserver?: PgOutcomeCheckpointObserver,\n): Promise<void> {\n\ttry {\n\t\tawait executor.query('COMMIT');\n\t\tawait checkpoint(observer, 'commit-acknowledged');\n\t} catch (error) {\n\t\tif (isConfirmedPgServerError(error))\n\t\t\tthrow new PgCommitDeterministicFailureError(error);\n\t\tmarkPgOutcomeSessionCompromised(executor, error);\n\t\tthrow new PgCommitAcknowledgementAmbiguousError(error);\n\t}\n}\n\nexport interface PgOutcomeClaimRequest {\n\treadonly plan: OutcomeClaimPlan;\n\treadonly reservations: readonly LedgerReservationRow[];\n\treadonly lockTimeoutMs?: number;\n\t/** Destructive authority is evaluated under these same ledger locks. */\n\treadonly destructiveDecision?: (\n\t\texecutor: TransitionJournalQueryable,\n\t\tplan: OutcomeClaimPlan,\n\t) => Promise<DestructiveDecision>;\n\t/** Optional E2E observer; absent in all production command paths. */\n\treadonly observer?: PgOutcomeCheckpointObserver;\n}\n\n/** One root claim plus its token-free destructive-closure members. */\nexport interface PgOutcomeClaimGroupRequest extends PgOutcomeClaimRequest {\n\treadonly members: readonly Omit<\n\t\tPgOutcomeClaimRequest,\n\t\t'destructiveDecision'\n\t>[];\n}\n\nexport interface PgOutcomeClaimGroupAdmission {\n\treadonly root: OutcomeClaimAdmission;\n\treadonly members: readonly OutcomeClaimAdmission[];\n}\n\nexport interface PgOutcomeClaimGroupResolution {\n\treadonly rootClaimId: string;\n\treadonly members: readonly {\n\t\treadonly target: PgLedgerTarget;\n\t\treadonly member: Omit<LedgerChainMember, 'controller' | 'recordedAt'>;\n\t}[];\n\treadonly reservations: readonly Pick<LedgerReservationRow, 'address'>[];\n\treadonly lockTimeoutMs?: number;\n\t/** Durable run witness carried from destructive admission to its terminal. */\n\treadonly runtimeIntegrityRun?: PgLockedRun;\n\t/** Optional E2E observer for this terminal-appending transaction. */\n\treadonly observer?: PgOutcomeCheckpointObserver;\n}\n\nexport interface PgOutcomeResolution {\n\treadonly eventId: string;\n\treadonly eventKind: Exclude<\n\t\tLedgerEventKind,\n\t\t| 'intent'\n\t\t| 'retire-intent'\n\t\t| 'readdress-intent'\n\t\t| 'adopt-intent'\n\t\t| 'executing'\n\t>;\n\treadonly observed?: LedgerChainMember['observed'];\n\t/** Required by the ledger writer when this resolution is `refused`. */\n\treadonly refusal?: LedgerChainMember['refusal'];\n}\n\nexport interface PgOutcomeExecutionRequest {\n\treadonly token: ClaimToken;\n\treadonly claim: AdmittedOutcomeClaim;\n\treadonly statements: readonly ClaimBundleStatement[];\n}\n\n/**\n * The first admitted-operation shape. Later waves add single and paired\n * operation variants without reopening the facade's authority boundary.\n */\nexport interface PgSingleAdmittedOperation {\n\treadonly kind: 'single-outcome';\n\treadonly request:\n\t\t| PgOutcomeTransactionalRequest\n\t\t| PgOutcomeNonTransactionalRequest;\n}\n\n/**\n * The three generated payload roles are intentionally disjoint at the type\n * boundary. Their runtime serialization remains the ledger's `{ value,\n * digest }` pair; the discriminant prevents a generic identity observation\n * from being wired into a declaration or a structural-proof slot.\n */\nexport type GeneratedDeclarationPayload = LedgerPayload & {\n\treadonly payloadKind: 'generated-declaration';\n};\nexport type GeneratedIdentityObservation = LedgerPayload & {\n\treadonly payloadKind: 'generated-identity-observation';\n};\nexport type GeneratedStructuralObservation = LedgerPayload & {\n\treadonly payloadKind: 'generated-structural-observation';\n};\nexport type GeneratedPostconditionObservation =\n\t| GeneratedIdentityObservation\n\t| GeneratedStructuralObservation;\n\n/**\n * Readdress keeps its catalogue closure discovery in readdress.ts, while this\n * facade owns the only claim/permit/DDL/terminal path for the resulting pair.\n */\nexport interface PgPairedReaddressOperation {\n\treadonly kind: 'paired-readdress';\n\treadonly request: {\n\t\treadonly pairId: string;\n\t\treadonly executionId: string;\n\t\treadonly members: readonly {\n\t\t\treadonly source: LedgerAddress;\n\t\t\treadonly target: LedgerAddress;\n\t\t\treadonly sourceClaimId: string;\n\t\t\treadonly targetClaimId: string;\n\t\t\treadonly sourceDeclared?: LedgerPayload;\n\t\t\treadonly targetDeclared: GeneratedDeclarationPayload;\n\t\t\treadonly targetObserved: GeneratedIdentityObservation;\n\t\t\t/**\n\t\t\t * Optional structural proof for a typed table declaration. The paired\n\t\t\t * protocol invokes it after DDL on its pinned transaction session, so\n\t\t\t * the observed ledger fact is the catalogue projection it just read.\n\t\t\t */\n\t\t\treadonly postDdlReadBack?: (\n\t\t\t\texecutor: GeneratedPostconditionSession,\n\t\t\t) => Promise<GeneratedStructuralObservation>;\n\t\t\t/** Verifies a physical relationship that identity alone cannot prove. */\n\t\t\treadonly postDdlVerify?: (\n\t\t\t\texecutor: TransitionJournalQueryable,\n\t\t\t) => Promise<void>;\n\t\t}[];\n\t\treadonly reservations: readonly LedgerReservationRow[];\n\t\treadonly statements: readonly ClaimBundleStatement[];\n\t\t/** Digest-covered root material for this paired request; it is never empty. */\n\t\treadonly manifestPlan: OutcomeClaimPlan;\n\t\t/** Re-read closure, source controller/identity and target vacancy under lock. */\n\t\treadonly verifyLiveAdmission: (\n\t\t\texecutor: TransitionJournalQueryable,\n\t\t\tcurrentController: ControllerIdentity,\n\t\t) => Promise<\n\t\t\t| OutcomeProtocolRefusal\n\t\t\t| readonly {\n\t\t\t\t\treadonly source: LedgerAddress;\n\t\t\t\t\treadonly target: LedgerAddress;\n\t\t\t\t\treadonly catalogueIdentity: NonNullable<\n\t\t\t\t\t\tNonNullable<\n\t\t\t\t\t\t\tAwaited<ReturnType<typeof readPgCatalogueIdentity>>\n\t\t\t\t\t\t>['catalogueIdentity']\n\t\t\t\t\t>;\n\t\t\t }[]\n\t\t>;\n\t\treadonly lockTimeoutMs?: number;\n\t\t/** Optional E2E observer; absent in normal execution. */\n\t\treadonly observer?: PgOutcomeCheckpointObserver;\n\t};\n}\n\n/** Select the observed evidence only after the paired DDL read-back succeeds. */\nexport async function readPgPairedReaddressObserved(\n\texecutor: GeneratedPostconditionSession,\n\tmember: Pick<\n\t\tPgPairedReaddressOperation['request']['members'][number],\n\t\t'targetObserved' | 'postDdlReadBack'\n\t>,\n): Promise<GeneratedPostconditionObservation> {\n\treturn member.postDdlReadBack\n\t\t? member.postDdlReadBack(executor)\n\t\t: member.targetObserved;\n}\n\n/** Refuse paired terminals unless their final target still is the admitted source. */\nexport function assertPgPairedReaddressTargetWitness(\n\twitnesses: readonly {\n\t\treadonly source: LedgerAddress;\n\t\treadonly target: LedgerAddress;\n\t\treadonly catalogueIdentity: unknown;\n\t}[],\n\tmember: Pick<\n\t\tPgPairedReaddressOperation['request']['members'][number],\n\t\t'source' | 'target'\n\t>,\n\tliveTarget: Pick<LedgerAddress, 'catalogueIdentity' | 'kind' | 'name'>,\n): void {\n\tconst witness = witnesses.find(\n\t\t(candidate) =>\n\t\t\tsameLedgerAddress(candidate.source, member.source) &&\n\t\t\tsameLedgerAddress(candidate.target, member.target),\n\t);\n\tif (\n\t\t!witness ||\n\t\tcanonicalJson(witness.catalogueIdentity) !==\n\t\t\tcanonicalJson(liveTarget.catalogueIdentity)\n\t)\n\t\tthrow new Error(\n\t\t\t`re-address target identity changed for ${member.target.kind} ${member.target.name}`,\n\t\t);\n}\n\nexport interface PgDestructiveAdmittedOperation {\n\treadonly kind: 'destructive-outcome';\n\treadonly request: PgOutcomeClaimGroupRequest;\n\treadonly readBackAndResolve: (\n\t\texecutor: TransitionJournalQueryable,\n\t\tclaim: AdmittedDestructiveOutcomeClaim,\n\t) => Promise<PgOutcomeClaimGroupResolution>;\n}\n\nexport type PgAdmittedOperation =\n\t| PgSingleAdmittedOperation\n\t| PgPairedReaddressOperation\n\t| PgDestructiveAdmittedOperation;\n\nexport type PgAdmittedOperationResult =\n\t| PgOutcomeResult\n\t| PgDestructiveOutcomeResult\n\t| { readonly kind: 'executed-paired-readdress'; readonly pairId: string }\n\t| { readonly kind: 'outcome-transport-ambiguous'; readonly reason: string }\n\t| {\n\t\t\treadonly kind: 'outcome-recovery-required';\n\t\t\treadonly claimId: string;\n\t\t\treadonly reason: string;\n\t };\n\ninterface AdmittedPermitRecord {\n\treadonly claim?: AdmittedOutcomeClaim;\n\treadonly paired?: {\n\t\treadonly pairId: string;\n\t\treadonly statements: readonly ClaimBundleStatement[];\n\t};\n}\nconst admittedPermitRecords = new WeakMap<object, AdmittedPermitRecord>();\n\ntype AdmissionOperationClassification = PgAdmittedOperation['kind'];\n\ninterface ApprovalScopeRecord {\n\treadonly address: LedgerAddress;\n\treadonly classification: AdmissionOperationClassification;\n}\n\nconst digestBindingVerdicts = new WeakSet<object>();\nconst validatedManifestVerdicts = new WeakSet<object>();\nconst approvalScopeVerdicts = new WeakMap<object, ApprovalScopeRecord>();\nconst liveAdmissionVerdicts = new WeakMap<object, PostLockAdmissionEvidence>();\n\nfunction mintDigestBindingVerdict(): DigestBindingVerdict {\n\tconst verdict = Object.freeze({}) as DigestBindingVerdict;\n\tdigestBindingVerdicts.add(verdict);\n\treturn verdict;\n}\n\nfunction mintValidatedManifestVerdict(): ValidatedManifestVerdict {\n\tconst verdict = Object.freeze({}) as ValidatedManifestVerdict;\n\tvalidatedManifestVerdicts.add(verdict);\n\treturn verdict;\n}\n\nfunction mintApprovalScopeVerdict(\n\taddress: LedgerAddress,\n\tclassification: AdmissionOperationClassification,\n): ApprovalScopeVerdict {\n\tconst verdict = Object.freeze({}) as ApprovalScopeVerdict;\n\tapprovalScopeVerdicts.set(verdict, { address, classification });\n\treturn verdict;\n}\n\nfunction mintLiveAdmissionVerdict(\n\tevidence: PostLockAdmissionEvidence,\n): LiveAdmissionVerdict {\n\tif (!isPostLockAdmissionEvidence(evidence))\n\t\tthrow new Error(\n\t\t\t'admitted permit requires authentic post-lock admission evidence',\n\t\t);\n\tconst verdict = Object.freeze({}) as LiveAdmissionVerdict;\n\tliveAdmissionVerdicts.set(verdict, evidence);\n\treturn verdict;\n}\n\n/** NEXT ROUND target for direct compatibility runners without durable evidence. */\nfunction requireAdmittedVerdicts(\n\tdigestBinding: DigestBindingVerdict,\n\tvalidatedManifest: ValidatedManifestVerdict,\n\tapprovalScope: ApprovalScopeVerdict,\n\tliveAdmission: LiveAdmissionVerdict,\n\tevidence?: PostLockAdmissionEvidence,\n): void {\n\tif (!digestBindingVerdicts.has(digestBinding))\n\t\tthrow new Error('admitted permit requires a digest-binding verdict');\n\tif (!validatedManifestVerdicts.has(validatedManifest))\n\t\tthrow new Error('admitted permit requires a validated-manifest verdict');\n\tif (!approvalScopeVerdicts.has(approvalScope))\n\t\tthrow new Error('admitted permit requires an approval-scope verdict');\n\tconst boundEvidence = liveAdmissionVerdicts.get(liveAdmission);\n\tif (!boundEvidence || !isPostLockAdmissionEvidence(boundEvidence))\n\t\tthrow new Error(\n\t\t\t'admitted permit requires a post-lock live-admission verdict',\n\t\t);\n\tif (\n\t\tevidence &&\n\t\t(!isPostLockAdmissionEvidence(evidence) || boundEvidence !== evidence)\n\t)\n\t\tthrow new Error(\n\t\t\t'admitted permit requires the post-lock evidence that minted its live-admission verdict',\n\t\t);\n}\n\nexport function mintAdmittedPermit(\n\tclaim: AdmittedOutcomeClaim,\n\tdigestBinding: DigestBindingVerdict,\n\tvalidatedManifest: ValidatedManifestVerdict,\n\tapprovalScope: ApprovalScopeVerdict,\n\tliveAdmission: LiveAdmissionVerdict,\n\tevidence: PostLockAdmissionEvidence,\n): AdmittedPermit {\n\trequireAdmittedVerdicts(\n\t\tdigestBinding,\n\t\tvalidatedManifest,\n\t\tapprovalScope,\n\t\tliveAdmission,\n\t\tevidence,\n\t);\n\tconst approval = approvalScopeVerdicts.get(approvalScope);\n\tif (\n\t\tapproval?.classification !== 'single-outcome' ||\n\t\t!sameLedgerAddress(approval.address, claim.plan.address)\n\t)\n\t\tthrow new Error(\n\t\t\t'admitted permit refuses an approval scope verdict for another operation',\n\t\t);\n\tconst permit = Object.freeze({}) as AdmittedPermit;\n\tadmittedPermitRecords.set(permit, { claim });\n\treturn permit;\n}\n\nfunction mintPairedReaddressPermit(\n\tpairId: string,\n\tstatements: readonly ClaimBundleStatement[],\n\tdigestBinding: DigestBindingVerdict,\n\tvalidatedManifest: ValidatedManifestVerdict,\n\tapprovalScope: ApprovalScopeVerdict,\n\tliveAdmission: LiveAdmissionVerdict,\n): AdmittedPermit {\n\trequireAdmittedVerdicts(\n\t\tdigestBinding,\n\t\tvalidatedManifest,\n\t\tapprovalScope,\n\t\tliveAdmission,\n\t);\n\tconst approval = approvalScopeVerdicts.get(approvalScope);\n\tif (approval?.classification !== 'paired-readdress')\n\t\tthrow new Error(\n\t\t\t'admitted permit refuses an approval scope verdict for another operation',\n\t\t);\n\tconst permit = Object.freeze({}) as AdmittedPermit;\n\tadmittedPermitRecords.set(permit, { paired: { pairId, statements } });\n\treturn permit;\n}\n\nfunction admittedClaim(\n\tpermit: AdmittedPermit,\n): AdmittedOutcomeClaim | undefined {\n\treturn admittedPermitRecords.get(permit)?.claim;\n}\n\n/** The destructive DDL sink cannot be called with raw evidence or a bare token. */\nexport interface PgDestructiveOutcomeExecutionRequest {\n\treadonly claim: AdmittedDestructiveOutcomeClaim;\n\treadonly statements: readonly ClaimBundleStatement[];\n}\n\n/**\n * Predecessors are ledger facts, never lifecycle predictions. Every managed\n * successor reads the unique current terminal on the same pinned session and\n * in the transaction that will append it; a previous append in that\n * transaction is therefore visible here too.\n */\nasync function currentTerminalPredecessor(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\taddress: LedgerAddress,\n): Promise<string | undefined> {\n\treturn (await readPgLedgerAddressChain(executor, target, address))\n\t\t.terminalMember?.eventId;\n}\n\nasync function memberWithCurrentTerminalPredecessor(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\tmember: Omit<LedgerChainMember, 'controller' | 'recordedAt'>,\n): Promise<Omit<LedgerChainMember, 'controller' | 'recordedAt'>> {\n\tconst predecessor = await currentTerminalPredecessor(\n\t\texecutor,\n\t\ttarget,\n\t\tmember.address,\n\t);\n\tconst { predecessor: _predicted, ...withoutPredictedPredecessor } = member;\n\treturn {\n\t\t...withoutPredictedPredecessor,\n\t\t...(predecessor === undefined ? {} : { predecessor }),\n\t};\n}\n\nexport type PgDestructiveOutcomeResult =\n\t| { readonly kind: 'executed-destructive-outcome' }\n\t/**\n\t * SQL was admitted and may have run, but its operation-owned read-back could\n\t * not establish a terminal fact. Keep the durable claim open for reconcile;\n\t * in particular, never turn this post-executing state into `refused`.\n\t */\n\t| { readonly kind: 'outcome-protocol-pending'; readonly reason: string }\n\t| OutcomeProtocolRefusal\n\t| { readonly kind: 'outcome-transport-ambiguous'; readonly reason: string }\n\t| {\n\t\t\treadonly kind: 'outcome-recovery-required';\n\t\t\treadonly claimId: string;\n\t\t\treadonly reason: string;\n\t };\n\n/**\n * High-level managed destructive execution. It owns claim admission and the\n * token-gated PostgreSQL sender so callers cannot compose raw ledger writes\n * with a fabricated capability.\n */\nasync function runPgDestructiveOutcome(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeClaimGroupRequest,\n\trun: PgLockedRun,\n\treadBackAndResolve: (\n\t\texecutor: TransitionJournalQueryable,\n\t\tclaim: AdmittedDestructiveOutcomeClaim,\n\t) => Promise<PgOutcomeClaimGroupResolution>,\n): Promise<PgDestructiveOutcomeResult> {\n\treturn withPgOutcomeSession(executor, async (session) => {\n\t\tconst admission =\n\t\t\trequest.members.length > 0\n\t\t\t\t? (await openPgOutcomeClaimGroup(session, request, run)).root\n\t\t\t\t: await openPgOutcomeClaim(session, request, run);\n\t\tif (admission.kind !== 'admitted-outcome-claim') return admission;\n\t\tif (!('destructivePermit' in admission))\n\t\t\treturn refusal('destructive admission did not mint an authority permit');\n\t\tlet executingCommitted = false;\n\t\tconst recoveryRequired = (reason: string): PgDestructiveOutcomeResult => ({\n\t\t\tkind: 'outcome-recovery-required',\n\t\t\tclaimId: admission.plan.claimId,\n\t\t\treason,\n\t\t});\n\t\ttry {\n\t\t\t// Persist the send boundary before the first autocommitted statement.\n\t\t\tawait begin(session, request.lockTimeoutMs);\n\t\t\tconst executingLock = await acquirePgLedgerLocks(\n\t\t\t\tsession,\n\t\t\t\thomesForGroup(request),\n\t\t\t);\n\t\t\tif (executingLock.kind !== 'acquired') {\n\t\t\t\tawait rollback(session);\n\t\t\t\treturn refusal('ledger advisory lock is busy');\n\t\t\t}\n\t\t\tconst executingPostLockEvidence = await createPostLockAdmissionEvidence(\n\t\t\t\tsession,\n\t\t\t\texecutingLock.proof,\n\t\t\t);\n\t\t\tconst executingLiveAdmission = await checkLiveAdmission(\n\t\t\t\texecutingPostLockEvidence,\n\t\t\t);\n\t\t\tif ('kind' in executingLiveAdmission) {\n\t\t\t\tawait rollback(session);\n\t\t\t\treturn executingLiveAdmission;\n\t\t\t}\n\t\t\tconst integrity = await validatePgLedgerRuntimeIntegrity(\n\t\t\t\tsession,\n\t\t\t\thomesForGroup(request),\n\t\t\t\trun,\n\t\t\t);\n\t\t\tif (integrity) {\n\t\t\t\tawait rollback(session);\n\t\t\t\treturn integrity;\n\t\t\t}\n\t\t\tawait checkpoint(request.observer, 'post-lock-integrity-before-append');\n\t\t\tconst target = targetForPlan(request.plan);\n\t\t\tconst predecessor = await currentTerminalPredecessor(\n\t\t\t\tsession,\n\t\t\t\ttarget,\n\t\t\t\tadmission.plan.address,\n\t\t\t);\n\t\t\tif (!predecessor)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`claim ${admission.plan.claimId} has no current terminal`,\n\t\t\t\t);\n\t\t\tawait appendPgLedgerProgress(session, target, {\n\t\t\t\teventId: `${request.plan.claimId}:executing`,\n\t\t\t\t...(admission.plan.executionId === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { executionId: admission.plan.executionId }),\n\t\t\t\t...(admission.plan.plannedClaimKey === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { plannedClaimKey: admission.plan.plannedClaimKey }),\n\t\t\t\t...(admission.plan.claimGroupId === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { claimGroupId: admission.plan.claimGroupId }),\n\t\t\t\t...(admission.plan.rootClaimId === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { rootClaimId: admission.plan.rootClaimId }),\n\t\t\t\taddress: admission.plan.address,\n\t\t\t\teventKind: 'executing',\n\t\t\t\tpredecessor,\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tawait commitPgOutcome(session, request.observer);\n\t\t\t\texecutingCommitted = true;\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof PgCommitDeterministicFailureError) throw error;\n\t\t\t\tif (error instanceof PgCommitAcknowledgementAmbiguousError)\n\t\t\t\t\treturn recoveryRequired(error.message);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst sent = await executePgDestructiveBundle(session, {\n\t\t\t\tclaim: admission as AdmittedDestructiveOutcomeClaim,\n\t\t\t\tstatements: request.plan.statementBundle.statements,\n\t\t\t});\n\t\t\tif (sent) return recoveryRequired(sent.reason);\n\t\t\tawait checkpoint(request.observer, 'ddl-completed-before-read-back');\n\t\t\tconst resolution = await readBackAndResolve(\n\t\t\t\tsession,\n\t\t\t\tadmission as AdmittedDestructiveOutcomeClaim,\n\t\t\t);\n\t\t\t// The read-back factory owns the durable terminal material, while the\n\t\t\t// admitted operation owns the test-only observer. Preserve both so the\n\t\t\t// terminal resolution COMMIT is observable by the same one-shot\n\t\t\t// checkpoint protocol as the preceding executing COMMIT.\n\t\t\tconst resolved = await resolvePgDestructiveOutcome(session, {\n\t\t\t\t...resolution,\n\t\t\t\truntimeIntegrityRun: run,\n\t\t\t\t...(request.observer === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { observer: request.observer }),\n\t\t\t});\n\t\t\tif (\n\t\t\t\tresolution.members.some(\n\t\t\t\t\t({ member }) => member.eventKind === 'indeterminate',\n\t\t\t\t)\n\t\t\t)\n\t\t\t\treturn {\n\t\t\t\t\tkind: 'outcome-protocol-pending',\n\t\t\t\t\treason:\n\t\t\t\t\t\t'destructive read-back found a surviving closure member; the claim remains indeterminate',\n\t\t\t\t};\n\t\t\treturn resolved\n\t\t\t\t? recoveryRequired(resolved.reason)\n\t\t\t\t: { kind: 'executed-destructive-outcome' };\n\t\t} catch (error) {\n\t\t\tawait rollback(session);\n\t\t\tif (error instanceof PgCommitDeterministicFailureError) throw error;\n\t\t\tif (error instanceof PgCommitAcknowledgementAmbiguousError)\n\t\t\t\treturn recoveryRequired(error.message);\n\t\t\tmarkPgOutcomeSessionCompromised(session, error);\n\t\t\tif (executingCommitted) return recoveryRequired(detail(error));\n\t\t\treturn refusal(detail(error));\n\t\t}\n\t});\n}\n\n/**\n * Internal compatibility bridge. Callers must bring the durable run and scoped\n * approvals that the façade consumes; this bridge never invents either.\n */\nexport async function executePgDestructiveOutcome(\n\texecutor: TransitionJournalQueryable,\n\tinput: {\n\t\treadonly run: PgLockedRun;\n\t\treadonly approval: ScopedApprovalSet;\n\t\treadonly request: PgOutcomeClaimGroupRequest;\n\t\treadonly readBackAndResolve: (\n\t\t\texecutor: TransitionJournalQueryable,\n\t\t\tclaim: AdmittedDestructiveOutcomeClaim,\n\t\t) => Promise<PgOutcomeClaimGroupResolution>;\n\t},\n): Promise<PgDestructiveOutcomeResult> {\n\tconst result = await executePgAdmittedOperation(executor, {\n\t\trun: input.run,\n\t\tapproval: input.approval,\n\t\toperation: {\n\t\t\tkind: 'destructive-outcome',\n\t\t\trequest: input.request,\n\t\t\treadBackAndResolve: input.readBackAndResolve,\n\t\t},\n\t});\n\treturn result as PgDestructiveOutcomeResult;\n}\n\n/** Keeps terminal appends and reservation release behind the managed facade. */\nexport async function resolvePgDestructiveOutcome(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeClaimGroupResolution,\n): Promise<undefined | OutcomeProtocolRefusal> {\n\tif (request.members.length === 0)\n\t\treturn refusal('destructive outcome has no terminal member');\n\tif (request.members.length > 1)\n\t\treturn resolvePgOutcomeClaimGroup(executor, request);\n\tconst terminal = request.members[0]!;\n\treturn withPgOutcomeSession(executor, async (session) => {\n\t\tlet begun = false;\n\t\ttry {\n\t\t\tawait begin(session, request.lockTimeoutMs);\n\t\t\tbegun = true;\n\t\t\tconst lock = await acquirePgLedgerLocks(session, [terminal.target]);\n\t\t\tif (lock.kind !== 'acquired') {\n\t\t\t\tawait rollback(session);\n\t\t\t\tbegun = false;\n\t\t\t\treturn refusal('ledger advisory lock is busy');\n\t\t\t}\n\t\t\tconst postLockEvidence = await createPostLockAdmissionEvidence(\n\t\t\t\tsession,\n\t\t\t\tlock.proof,\n\t\t\t);\n\t\t\tconst liveAdmission = await checkLiveAdmission(postLockEvidence);\n\t\t\tif ('kind' in liveAdmission) {\n\t\t\t\tawait rollback(session);\n\t\t\t\tbegun = false;\n\t\t\t\treturn liveAdmission;\n\t\t\t}\n\t\t\tconst integrity = await validatePgLedgerRuntimeIntegrity(\n\t\t\t\tsession,\n\t\t\t\t[terminal.target],\n\t\t\t\trequest.runtimeIntegrityRun,\n\t\t\t);\n\t\t\tif (integrity) {\n\t\t\t\tawait rollback(session);\n\t\t\t\tbegun = false;\n\t\t\t\treturn integrity;\n\t\t\t}\n\t\t\tawait checkpoint(request.observer, 'post-lock-integrity-before-append');\n\t\t\tconst member = await memberWithCurrentTerminalPredecessor(\n\t\t\t\tsession,\n\t\t\t\tterminal.target,\n\t\t\t\tterminal.member,\n\t\t\t);\n\t\t\tif (member.eventKind === 'indeterminate')\n\t\t\t\tawait appendPgLedgerProgress(session, terminal.target, member);\n\t\t\telse\n\t\t\t\tawait appendPgLedgerResolution(\n\t\t\t\t\tsession,\n\t\t\t\t\tterminal.target,\n\t\t\t\t\tmember,\n\t\t\t\t\trequest.rootClaimId,\n\t\t\t\t\trequest.reservations,\n\t\t\t\t);\n\t\t\tawait commitPgOutcome(session, request.observer);\n\t\t\tbegun = false;\n\t\t\treturn undefined;\n\t\t} catch (error) {\n\t\t\tif (begun) await rollback(session);\n\t\t\tif (\n\t\t\t\terror instanceof PgCommitDeterministicFailureError ||\n\t\t\t\terror instanceof PgCommitAcknowledgementAmbiguousError\n\t\t\t)\n\t\t\t\tthrow error;\n\t\t\treturn refusal(detail(error));\n\t\t}\n\t});\n}\n\nexport interface PgOutcomeTransactionalRequest extends PgOutcomeClaimRequest {\n\treadonly resolution: PgOutcomeResolution;\n\t/** Core has already opened the segment transaction; never nest BEGIN. */\n\treadonly transactionOpen?: boolean;\n\t/**\n\t * Operation-owned terminal read-back; generic catalogue identity is not\n\t * evidence. It receives the admitted session so transactional DDL is read\n\t * before its terminal ledger fact commits.\n\t */\n\treadonly readBack?: (\n\t\texecutor: GeneratedPostconditionSession,\n\t) => Promise<LedgerPayload>;\n\t/** Required for creations; the reader runs after the claim and before SQL. */\n\treadonly vacancy?: (\n\t\texecutor: TransitionJournalQueryable,\n\t\tplan: OutcomeClaimPlan,\n\t) => Promise<OutcomeVacancy>;\n\t/** Re-check operation-specific live facts after the claim/reservation opens. */\n\treadonly verifyLiveAdmission?: (\n\t\texecutor: TransitionJournalQueryable,\n\t\tplan: OutcomeClaimPlan,\n\t) => Promise<OutcomeProtocolRefusal | undefined>;\n\t/** Record the post-DDL catalogue identity on a present terminal member. */\n\treadonly recordCatalogueIdentity?: boolean;\n}\n\nexport interface PgOutcomeNonTransactionalRequest\n\textends PgOutcomeTransactionalRequest {\n\treadonly executingEventId: string;\n\t/** Observable acknowledgement point after executing has committed, before SQL. */\n\treadonly onExecutingCommitted?: () => Promise<void> | void;\n}\n\n/** Builds the canonical read-back payload once catalogue presence is proven. */\nexport type PgOutcomeReadBackFactory = (\n\texecutor: GeneratedPostconditionSession,\n\taddress: LedgerAddress,\n\tcatalogueIdentity: NonNullable<\n\t\tAwaited<ReturnType<typeof readPgCatalogueIdentity>>\n\t>['catalogueIdentity'],\n) => Promise<LedgerPayload>;\n\n/**\n * A postcondition read owned by the operation itself. Catalogue identity is\n * still retained when present for the ledger, but effect classification comes\n * from the operation's value-level observation rather than object presence.\n */\nexport type PgOutcomeOperationReadBackFactory = (\n\texecutor: TransitionJournalQueryable,\n\taddress: LedgerAddress,\n\tcatalogueIdentity:\n\t\t| NonNullable<\n\t\t\t\tAwaited<ReturnType<typeof readPgCatalogueIdentity>>\n\t\t >['catalogueIdentity']\n\t\t| undefined,\n) => Promise<{\n\treadonly observed: LedgerPayload;\n\treadonly effect: OutcomeRecoveryEffect;\n}>;\n\nexport interface PgOutcomeRecoveryRequest {\n\treadonly address: LedgerAddress;\n\treadonly reservations: readonly Pick<LedgerReservationRow, 'address'>[];\n\treadonly resolutionEventId: string;\n\treadonly acceptedExternalDdlExclusion: boolean;\n\t/** Durable claim-bound evidence re-matched by reconcile under the run lock. */\n\treadonly indeterminateEvidence?: OutcomeIndeterminateRecoveryEvidence;\n\treadonly resolveIndeterminate?: boolean;\n\treadonly readBack: PgOutcomeReadBackFactory;\n\treadonly operationReadBack?: PgOutcomeOperationReadBackFactory;\n\treadonly lockTimeoutMs?: number;\n\t/** Internal-only, in-memory allowance for one harness-installed trigger. */\n\treadonly ledgerShapeAllowance?: PgLedgerShapeAllowance;\n\t/** Optional E2E observer for recovery's committing transaction. */\n\treadonly observer?: PgOutcomeCheckpointObserver;\n}\n\nexport type PgOutcomeResolutionAppendResult =\n\t| { readonly kind: 'appended-outcome-resolution' }\n\t| { readonly kind: 'already-appended-outcome-resolution' }\n\t| {\n\t\t\treadonly kind: 'malformed-outcome-resolution';\n\t\t\treadonly reason: string;\n\t };\n\nexport type PgOutcomeRecoveryResult =\n\t| Exclude<\n\t\t\tOutcomeRecoveryClassification,\n\t\t\t{ readonly kind: 'outcome-recovery-append' }\n\t >\n\t| {\n\t\t\treadonly kind: 'outcome-recovery-appended';\n\t\t\treadonly classification: Extract<\n\t\t\t\tOutcomeRecoveryClassification,\n\t\t\t\t{ readonly kind: 'outcome-recovery-append' }\n\t\t\t>;\n\t\t\treadonly append: Exclude<\n\t\t\t\tPgOutcomeResolutionAppendResult,\n\t\t\t\t{ readonly kind: 'malformed-outcome-resolution' }\n\t\t\t>;\n\t }\n\t| { readonly kind: 'outcome-transport-ambiguous'; readonly reason: string }\n\t| OutcomeProtocolRefusal;\n\nexport type PgOutcomeResult =\n\t| {\n\t\t\treadonly kind: 'executed-outcome-claim';\n\t\t\treadonly claim: AdmittedOutcomeClaim;\n\t }\n\t| OutcomeProtocolRefusal\n\t| { readonly kind: 'outcome-transport-ambiguous'; readonly reason: string }\n\t| {\n\t\t\treadonly kind: 'outcome-recovery-required';\n\t\t\treadonly claimId: string;\n\t\t\treadonly reason: string;\n\t };\n\nexport type PgPairedReaddressRecoveryDecision =\n\t| { readonly kind: 'refused'; readonly reason: string }\n\t| { readonly kind: 'pending'; readonly reason: string }\n\t| { readonly kind: 'indeterminate'; readonly reason: string }\n\t| { readonly kind: 'outcome-transport-ambiguous'; readonly reason: string };\n\n/**\n * Recovery owns its reservation set: it re-reads every durable pair row,\n * checks currency under the same locks, and appends only under a minted paired\n * permit. A caller's selected rows are evidence to compare, never authority.\n */\nexport async function recoverPgAdmittedReaddressPair(\n\texecutor: TransitionJournalQueryable,\n\trequest: {\n\t\treadonly pairId: string;\n\t\treadonly executionId: string;\n\t\treadonly reservations: readonly LedgerReservationRow[];\n\t\treadonly assess: (\n\t\t\texecutor: TransitionJournalQueryable,\n\t\t\treservations: readonly LedgerReservationRow[],\n\t\t) => Promise<PgPairedReaddressRecoveryDecision>;\n\t\treadonly observer?: PgOutcomeCheckpointObserver;\n\t},\n): Promise<PgPairedReaddressRecoveryDecision> {\n\treturn withPgOutcomeSession(executor, (session) =>\n\t\trecoverPgAdmittedReaddressPairOnSession(session, request),\n\t);\n}\n\nasync function recoverPgAdmittedReaddressPairOnSession(\n\texecutor: TransitionJournalQueryable,\n\trequest: {\n\t\treadonly pairId: string;\n\t\treadonly executionId: string;\n\t\treadonly reservations: readonly LedgerReservationRow[];\n\t\treadonly assess: (\n\t\t\texecutor: TransitionJournalQueryable,\n\t\t\treservations: readonly LedgerReservationRow[],\n\t\t) => Promise<PgPairedReaddressRecoveryDecision>;\n\t\treadonly observer?: PgOutcomeCheckpointObserver;\n\t},\n): Promise<PgPairedReaddressRecoveryDecision> {\n\tlet begun = false;\n\ttry {\n\t\tawait begin(executor, undefined);\n\t\tbegun = true;\n\t\tconst transactionId = await readPgTransactionId(executor);\n\t\tconst initial = await readPgLedgerReservationsForPairInTransaction(\n\t\t\texecutor,\n\t\t\trequest.pairId,\n\t\t);\n\t\tconst reservationKey = (rows: readonly LedgerReservationRow[]) =>\n\t\t\trows\n\t\t\t\t.map((row) => canonicalJson(row))\n\t\t\t\t.sort()\n\t\t\t\t.join('\\n');\n\t\tif (\n\t\t\tinitial.length === 0 ||\n\t\t\treservationKey(initial) !== reservationKey(request.reservations) ||\n\t\t\tinitial.some((row) => row.executionId !== request.executionId)\n\t\t) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn {\n\t\t\t\tkind: 'pending',\n\t\t\t\treason:\n\t\t\t\t\t're-address recovery reservation subset is not the durable execution closure',\n\t\t\t};\n\t\t}\n\t\tconst homes = uniquePgLedgerHomes(initial.map((row) => row.homeLedger));\n\t\tconst lock = await acquirePgLedgerLocks(executor, homes);\n\t\tif (lock.kind !== 'acquired') {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn { kind: 'pending', reason: 'ledger advisory lock is busy' };\n\t\t}\n\t\tassertPgTransactionId(\n\t\t\ttransactionId,\n\t\t\tawait readPgTransactionId(executor),\n\t\t\t'advisory lock',\n\t\t);\n\t\tconst postLockEvidence = await createPostLockAdmissionEvidence(\n\t\t\texecutor,\n\t\t\tlock.proof,\n\t\t);\n\t\tconst liveAdmission = await checkLiveAdmission(postLockEvidence);\n\t\tif ('kind' in liveAdmission) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn { kind: 'pending', reason: liveAdmission.reason };\n\t\t}\n\t\tconst integrity = await validatePgLedgerRuntimeIntegrity(executor, homes);\n\t\tif (integrity) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn { kind: 'pending', reason: integrity.reason };\n\t\t}\n\t\tconst durable = await readPgLedgerReservationsForPairInHomes(\n\t\t\texecutor,\n\t\t\trequest.pairId,\n\t\t\thomes,\n\t\t);\n\t\tassertPgTransactionId(\n\t\t\ttransactionId,\n\t\t\tawait readPgTransactionId(executor),\n\t\t\t'reservation reread',\n\t\t);\n\t\tif (\n\t\t\tdurable.length === 0 ||\n\t\t\treservationKey(durable) !== reservationKey(initial) ||\n\t\t\treservationKey(durable) !== reservationKey(request.reservations) ||\n\t\t\tdurable.some((row) => row.executionId !== request.executionId)\n\t\t) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn {\n\t\t\t\tkind: 'pending',\n\t\t\t\treason:\n\t\t\t\t\t're-address recovery reservation subset is not the durable execution closure',\n\t\t\t};\n\t\t}\n\t\tconst decision = await request.assess(executor, durable);\n\t\tif (decision.kind === 'pending') {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn decision;\n\t\t}\n\t\tfor (const reservation of durable) {\n\t\t\tif (decision.kind === 'indeterminate') {\n\t\t\t\tawait appendPgLedgerProgress(executor, reservation.homeLedger, {\n\t\t\t\t\teventId: `${reservation.rootClaimId}:reconcile:${request.executionId}:indeterminate`,\n\t\t\t\t\taddress: reservation.address,\n\t\t\t\t\teventKind: 'indeterminate',\n\t\t\t\t\tpredecessor: reservation.rootClaimId,\n\t\t\t\t\tpairId: request.pairId,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tawait appendPgLedgerResolution(\n\t\t\t\t\texecutor,\n\t\t\t\t\treservation.homeLedger,\n\t\t\t\t\t{\n\t\t\t\t\t\teventId: `${reservation.rootClaimId}:reconcile:${request.executionId}:refused`,\n\t\t\t\t\t\taddress: reservation.address,\n\t\t\t\t\t\teventKind: 'refused',\n\t\t\t\t\t\tpredecessor: reservation.rootClaimId,\n\t\t\t\t\t\tpairId: request.pairId,\n\t\t\t\t\t\trefusal: refusalFor('ERR-11', {\n\t\t\t\t\t\t\taddress: reservation.address,\n\t\t\t\t\t\t\tstate: 'unknown',\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\treservation.rootClaimId,\n\t\t\t\t\t[reservation],\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tassertPgTransactionId(\n\t\t\ttransactionId,\n\t\t\tawait readPgTransactionId(executor),\n\t\t\t'pair terminal append',\n\t\t);\n\t\tawait commitPgOutcome(executor, request.observer);\n\t\tbegun = false;\n\t\treturn decision;\n\t} catch (error) {\n\t\tif (begun) await rollback(executor);\n\t\tif (error instanceof PgCommitDeterministicFailureError) throw error;\n\t\tif (error instanceof PgCommitAcknowledgementAmbiguousError)\n\t\t\treturn { kind: 'outcome-transport-ambiguous', reason: error.message };\n\t\treturn { kind: 'pending', reason: detail(error) };\n\t}\n}\n\nfunction uniquePgLedgerHomes(\n\thomes: readonly PgLedgerTarget[],\n): readonly PgLedgerTarget[] {\n\tconst unique = new Map<string, PgLedgerTarget>();\n\tfor (const home of homes)\n\t\tunique.set(`${home.scope}:${home.schema ?? ''}`, home);\n\treturn [...unique.values()];\n}\n\nasync function readPgTransactionId(\n\texecutor: TransitionJournalQueryable,\n): Promise<string> {\n\tconst result = await executor.query(\n\t\t'SELECT pg_catalog.txid_current()::text AS transaction_id',\n\t);\n\tconst transactionId = result.rows[0]?.transaction_id;\n\tif (typeof transactionId !== 'string')\n\t\tthrow new Error(\n\t\t\t'paired recovery could not prove its PostgreSQL transaction identity',\n\t\t);\n\treturn transactionId;\n}\n\nfunction assertPgTransactionId(\n\texpected: string,\n\tactual: string,\n\tphase: string,\n): void {\n\tif (actual !== expected)\n\t\tthrow new Error(\n\t\t\t`paired recovery transaction changed across ${phase}; refusing split pair resolution`,\n\t\t);\n}\n\nfunction refusal(reason: string): OutcomeProtocolRefusal {\n\treturn { kind: 'outcome-protocol-refused', reason };\n}\n\nfunction detail(error: unknown): string {\n\treturn formatPgTransitionUnknownError(error);\n}\n\nfunction targetForPlan(plan: OutcomeClaimPlan): PgLedgerTarget {\n\treturn targetForAddress(plan.address, plan.claimId);\n}\n\nfunction targetForAddress(\n\taddress: LedgerAddress,\n\tlabel = address.name,\n): PgLedgerTarget {\n\tif (address.scope === 'database') return { scope: 'database' };\n\tif (!address.schema)\n\t\tthrow new Error(`schema-scoped claim ${label} has no schema address`);\n\treturn { scope: 'schema', schema: address.schema };\n}\n\nfunction homesFor(request: PgOutcomeClaimRequest) {\n\tconst homes = [targetForPlan(request.plan)];\n\tfor (const reservation of request.reservations) {\n\t\tif (reservation.address.scope === 'database')\n\t\t\thomes.push({ scope: 'database' });\n\t\telse if (reservation.address.schema)\n\t\t\thomes.push({ scope: 'schema', schema: reservation.address.schema });\n\t\telse\n\t\t\tthrow new Error(\n\t\t\t\t`schema-scoped reservation ${reservation.address.name} has no schema address`,\n\t\t\t);\n\t}\n\treturn homes;\n}\n\nfunction homesForGroup(request: PgOutcomeClaimGroupRequest) {\n\treturn [request, ...request.members].flatMap((member) => homesFor(member));\n}\n\nfunction boundedLockTimeout(value: number | undefined): number {\n\tif (!Number.isFinite(value)) return DEFAULT_DDL_LOCK_TIMEOUT_MS;\n\treturn Math.max(\n\t\t1,\n\t\tMath.min(86_400_000, Math.trunc(value ?? DEFAULT_DDL_LOCK_TIMEOUT_MS)),\n\t);\n}\n\n/**\n * The only adapter-to-core live-admission bridge. It reads controller and\n * catalogue identity on the claiming connection after ledger serialization;\n * callers never manufacture managed-by-me from a projected state.\n */\nasync function liveAdmission(\n\texecutor: TransitionJournalQueryable,\n\tplan: OutcomeClaimPlan,\n\tchain: Awaited<ReturnType<typeof readPgLedgerAddressChain>>,\n) {\n\tconst projection = projectLedgerChain(chain);\n\tif (\n\t\tprojection.kind !== 'projected-ledger-chain' ||\n\t\tprojection.stableState !== 'managed' ||\n\t\tplan.requiresVacancy === true\n\t)\n\t\treturn { plan, projection };\n\tconst role = await executor.query(\n\t\t'SELECT current_user AS current_user, current_user::regrole::oid::text AS current_user_oid',\n\t);\n\tconst currentUser = role.rows[0]?.current_user;\n\tconst currentUserOid = role.rows[0]?.current_user_oid;\n\tconst live = await readPgCatalogueIdentity(executor, plan.address);\n\treturn {\n\t\tplan,\n\t\tprojection,\n\t\t...(typeof currentUser === 'string' && typeof currentUserOid === 'string'\n\t\t\t? {\n\t\t\t\t\tcurrentController: { name: currentUser, oid: currentUserOid },\n\t\t\t\t}\n\t\t\t: {}),\n\t\tliveAddress: {\n\t\t\t...plan.address,\n\t\t\t...(live?.catalogueIdentity\n\t\t\t\t? { catalogueIdentity: live.catalogueIdentity }\n\t\t\t\t: {}),\n\t\t},\n\t};\n}\n\nfunction currencyRefusal(\n\tcurrency: Awaited<ReturnType<typeof readPgLedgerScopeCurrency>>,\n): OutcomeProtocolRefusal {\n\treturn refusal(\n\t\tcurrency.kind === 'not-current' && currency.reason === 'lineage'\n\t\t\t? 'managed-ledger-not-current: ledger lineage mismatch; run dbsp preflight --reinitialize'\n\t\t\t: `managed-ledger-not-current: ledger marker ${currency.marker.kind}; run dbsp preflight --reinitialize`,\n\t);\n}\n\ntype RuntimeIntegritySeams = {\n\treadonly validateShape: typeof validatePgLedgerPhysicalShape;\n\treadonly readCurrency: typeof readPgLedgerScopeCurrency;\n};\n\nconst runtimeIntegritySeams: RuntimeIntegritySeams = {\n\tvalidateShape: validatePgLedgerPhysicalShape,\n\treadCurrency: readPgLedgerScopeCurrency,\n};\n\n/**\n * The façade's runtime gate: validate the physical ledger and its marker /\n * lineage currency on the same pinned execution session before it admits DDL.\n * Callers must still take the ledger locks before claiming; this check avoids a\n * preflight-only trust decision without widening the ledger DDL grammar.\n */\nexport async function validatePgLedgerRuntimeIntegrity(\n\texecutor: TransitionJournalQueryable,\n\thomes: readonly PgLedgerTarget[],\n\trun?: PgLockedRun,\n\tseams: RuntimeIntegritySeams = runtimeIntegritySeams,\n): Promise<OutcomeProtocolRefusal | undefined> {\n\tconst seen = new Set<string>();\n\tfor (const home of homes) {\n\t\tconst key = `${home.scope}:${home.schema ?? ''}`;\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\t// Direct compatibility runners do not carry a durable run witness. They\n\t\t// keep their existing currency-only check; every witness-bearing admission\n\t\t// independently re-checks shape with no retained cache.\n\t\tif (run !== undefined) await seams.validateShape(executor, home);\n\t\tconst currency = await seams.readCurrency(executor, home);\n\t\tif (currency.kind !== 'current') return currencyRefusal(currency);\n\t}\n\treturn undefined;\n}\n\n/**\n * The sole claim-admission route: after the caller has begun and serialized\n * the claim transaction, it re-reads ledger currency, evaluates the core\n * lifecycle/controller/identity interpreter, and appends the claim.\n */\nasync function admitPgOutcomeClaim(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeClaimRequest,\n): Promise<{\n\treadonly admission: OutcomeClaimAdmission;\n\treadonly chain?: Awaited<ReturnType<typeof readPgLedgerAddressChain>>;\n}> {\n\tconst seen = new Set<string>();\n\tfor (const home of homesFor(request)) {\n\t\tconst key = `${home.scope}:${home.schema ?? ''}`;\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tconst currency = await readPgLedgerScopeCurrency(executor, home);\n\t\tif (currency.kind !== 'current')\n\t\t\treturn { admission: currencyRefusal(currency) };\n\t}\n\tconst target = targetForPlan(request.plan);\n\tconst chain = await readPgLedgerAddressChain(\n\t\texecutor,\n\t\ttarget,\n\t\trequest.plan.address,\n\t);\n\tconst admissionInput = await liveAdmission(executor, request.plan, chain);\n\tconst admission = request.destructiveDecision\n\t\t? await (async () => {\n\t\t\t\tconst decision = await request.destructiveDecision!(\n\t\t\t\t\texecutor,\n\t\t\t\t\trequest.plan,\n\t\t\t\t);\n\t\t\t\tif (decision.kind !== 'destructive-decision-permitted')\n\t\t\t\t\treturn refusal(decision.reasons.join('; '));\n\t\t\t\treturn admitDestructiveOutcomeClaim({\n\t\t\t\t\tdecision,\n\t\t\t\t\tadmission: admissionInput,\n\t\t\t\t});\n\t\t\t})()\n\t\t: admitOutcomeClaim(admissionInput);\n\tif (admission.kind !== 'admitted-outcome-claim') return { admission, chain };\n\tawait appendPgLedgerClaim(\n\t\texecutor,\n\t\ttarget,\n\t\tclaimMember(request, chain.terminalMember?.eventId),\n\t\trequest.reservations,\n\t);\n\treturn { admission, chain };\n}\n\nasync function begin(\n\texecutor: TransitionJournalQueryable,\n\ttimeout: number | undefined,\n) {\n\tawait executor.query('BEGIN');\n\tawait setPgTransitionLockTimeout(executor, timeout);\n}\n\nasync function rollback(executor: TransitionJournalQueryable): Promise<void> {\n\ttry {\n\t\tawait executor.query('ROLLBACK');\n\t} catch (error) {\n\t\t// A failed rollback leaves transaction and protocol state unknowable. The\n\t\t// outer outcome-session bracket consumes this marker at pool release.\n\t\tmarkPgOutcomeSessionCompromised(executor, error);\n\t\t// The original PostgreSQL words are the only useful refusal detail.\n\t}\n}\n\nfunction claimMember(\n\trequest: PgOutcomeClaimRequest,\n\tpredecessor: string | undefined,\n): Omit<LedgerChainMember, 'controller' | 'recordedAt'> {\n\treturn {\n\t\teventId: request.plan.claimId,\n\t\t...(request.plan.executionId === undefined\n\t\t\t? {}\n\t\t\t: { executionId: request.plan.executionId }),\n\t\t...(request.plan.plannedClaimKey === undefined\n\t\t\t? {}\n\t\t\t: { plannedClaimKey: request.plan.plannedClaimKey }),\n\t\t...(request.plan.claimGroupId === undefined\n\t\t\t? {}\n\t\t\t: { claimGroupId: request.plan.claimGroupId }),\n\t\t...(request.plan.rootClaimId === undefined\n\t\t\t? {}\n\t\t\t: { rootClaimId: request.plan.rootClaimId }),\n\t\taddress: request.plan.address,\n\t\teventKind: request.plan.claimKind,\n\t\t...(predecessor === undefined ? {} : { predecessor }),\n\t\t...(request.plan.pairId === undefined\n\t\t\t? {}\n\t\t\t: { pairId: request.plan.pairId }),\n\t\t...(request.plan.declared === undefined\n\t\t\t? {}\n\t\t\t: { declared: request.plan.declared }),\n\t};\n}\n\nfunction resolutionMember(\n\tclaim: AdmittedOutcomeClaim,\n\tresolution: PgOutcomeResolution,\n\tpredecessor: string,\n): Omit<LedgerChainMember, 'controller' | 'recordedAt'> {\n\treturn {\n\t\teventId: resolution.eventId,\n\t\t...(claim.plan.executionId === undefined\n\t\t\t? {}\n\t\t\t: { executionId: claim.plan.executionId }),\n\t\t...(claim.plan.plannedClaimKey === undefined\n\t\t\t? {}\n\t\t\t: { plannedClaimKey: claim.plan.plannedClaimKey }),\n\t\t...(claim.plan.claimGroupId === undefined\n\t\t\t? {}\n\t\t\t: { claimGroupId: claim.plan.claimGroupId }),\n\t\t...(claim.plan.rootClaimId === undefined\n\t\t\t? {}\n\t\t\t: { rootClaimId: claim.plan.rootClaimId }),\n\t\taddress: claim.plan.address,\n\t\teventKind: resolution.eventKind,\n\t\tpredecessor,\n\t\t...(resolution.observed === undefined\n\t\t\t? {}\n\t\t\t: { observed: resolution.observed }),\n\t\t...(resolution.refusal === undefined\n\t\t\t? {}\n\t\t\t: { refusal: resolution.refusal }),\n\t};\n}\n\nfunction recoveryResolutionMember(\n\taddress: LedgerAddress,\n\teventId: string,\n\tresolution: Extract<\n\t\tOutcomeRecoveryClassification,\n\t\t{ readonly kind: 'outcome-recovery-append' }\n\t>['resolution'],\n): Omit<LedgerChainMember, 'controller' | 'recordedAt'> {\n\tconst readBack = resolution.readBack;\n\treturn {\n\t\teventId,\n\t\taddress,\n\t\teventKind: resolution.eventKind,\n\t\tpredecessor: resolution.predecessor,\n\t\t...(resolution.refusal === undefined\n\t\t\t? {}\n\t\t\t: { refusal: resolution.refusal }),\n\t\t...(readBack.kind === 'present'\n\t\t\t? {\n\t\t\t\t\tcatalogueIdentity: readBack.catalogueIdentity,\n\t\t\t\t\tobserved: readBack.observed,\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\n/**\n * The last check before a terminal append proves catalogue state only. It\n * deliberately never runs an operation-owned read-back: that callback can\n * both cost materially and carry effects, so its single invocation belongs to\n * the operation observation rather than this state check.\n */\nasync function readPgFinalCatalogueIdentity(\n\texecutor: TransitionJournalQueryable,\n\taddress: LedgerAddress,\n): Promise<Awaited<ReturnType<typeof readPgCatalogueIdentity>>> {\n\t// Admission already holds the relation lock through this terminal append.\n\treturn readPgCatalogueIdentity(executor, address);\n}\n\nasync function observedResolutionMember(\n\texecutor: TransitionJournalQueryable,\n\tclaim: AdmittedOutcomeClaim,\n\tresolution: PgOutcomeResolution,\n\tpredecessor: string,\n\treadBack: (executor: GeneratedPostconditionSession) => Promise<LedgerPayload>,\n\trecordCatalogueIdentity: boolean | undefined,\n\tlockTimeoutMs: number | undefined,\n): Promise<Omit<LedgerChainMember, 'controller' | 'recordedAt'>> {\n\tconst live = recordCatalogueIdentity\n\t\t? await readPgCatalogueIdentityWithResolvableRelationLock(\n\t\t\t\texecutor,\n\t\t\t\tclaim.plan.address,\n\t\t\t\t'observed outcome',\n\t\t\t)\n\t\t: undefined;\n\tif (recordCatalogueIdentity && !live?.catalogueIdentity)\n\t\tthrow new Error(\n\t\t\t`observed outcome ${claim.plan.address.kind} ${claim.plan.address.name} refuses an absent catalogue identity`,\n\t\t);\n\tconst observed = await withPinnedGeneratedPostconditionSession(\n\t\texecutor,\n\t\treadBack,\n\t\tlockTimeoutMs,\n\t);\n\tconst finalLive = recordCatalogueIdentity\n\t\t? await readPgFinalCatalogueIdentity(executor, claim.plan.address)\n\t\t: undefined;\n\tif (recordCatalogueIdentity && !finalLive?.catalogueIdentity)\n\t\tthrow new Error(\n\t\t\t`observed outcome ${claim.plan.address.kind} ${claim.plan.address.name} became absent before its terminal append`,\n\t\t);\n\tif (\n\t\tlive?.catalogueIdentity &&\n\t\tfinalLive?.catalogueIdentity &&\n\t\tcanonicalJson(live.catalogueIdentity) !==\n\t\t\tcanonicalJson(finalLive.catalogueIdentity)\n\t)\n\t\tthrow new Error(\n\t\t\t`observed outcome ${claim.plan.address.kind} ${claim.plan.address.name} identity changed before its terminal append`,\n\t\t);\n\treturn {\n\t\t...resolutionMember(claim, resolution, predecessor),\n\t\t...(finalLive?.catalogueIdentity\n\t\t\t? { catalogueIdentity: finalLive.catalogueIdentity }\n\t\t\t: {}),\n\t\tobserved,\n\t};\n}\n\nasync function terminalResolutionMember(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeTransactionalRequest,\n\tclaim: AdmittedOutcomeClaim,\n\tpredecessor: string,\n): Promise<Omit<LedgerChainMember, 'controller' | 'recordedAt'>> {\n\tif (!request.readBack)\n\t\treturn resolutionMember(claim, request.resolution, predecessor);\n\treturn observedResolutionMember(\n\t\texecutor,\n\t\tclaim,\n\t\trequest.resolution,\n\t\tpredecessor,\n\t\trequest.readBack,\n\t\trequest.recordCatalogueIdentity,\n\t\trequest.lockTimeoutMs,\n\t);\n}\n\nfunction sameResolutionPayload(\n\tleft: Omit<LedgerChainMember, 'controller' | 'recordedAt'>,\n\tright: LedgerChainMember,\n): boolean {\n\treturn (\n\t\tleft.eventKind === right.eventKind &&\n\t\tleft.predecessor === right.predecessor &&\n\t\tleft.pairId === right.pairId &&\n\t\tcanonicalJson(left.catalogueIdentity ?? null) ===\n\t\t\tcanonicalJson(right.catalogueIdentity ?? null) &&\n\t\tcanonicalJson(left.declared ?? null) ===\n\t\t\tcanonicalJson(right.declared ?? null) &&\n\t\tcanonicalJson(left.observed ?? null) ===\n\t\t\tcanonicalJson(right.observed ?? null) &&\n\t\tcanonicalJson(left.refusal ?? null) === canonicalJson(right.refusal ?? null)\n\t);\n}\n\n/**\n * Appends a resolution once, or treats an already-written equal payload as a\n * successful retry. A different child cannot be written by PostgreSQL's\n * one-child constraint and is reported as a fail-closed malformed outcome.\n */\nexport async function appendPgOutcomeResolution(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\tmember: Omit<LedgerChainMember, 'controller' | 'recordedAt'>,\n\trootClaimId: string,\n\treservations: readonly Pick<LedgerReservationRow, 'address'>[],\n): Promise<PgOutcomeResolutionAppendResult> {\n\ttry {\n\t\tif (member.eventKind === 'indeterminate')\n\t\t\tawait appendPgLedgerProgress(executor, target, member);\n\t\telse\n\t\t\tawait appendPgLedgerResolution(\n\t\t\t\texecutor,\n\t\t\t\ttarget,\n\t\t\t\tmember,\n\t\t\t\trootClaimId,\n\t\t\t\treservations,\n\t\t\t);\n\t\treturn { kind: 'appended-outcome-resolution' };\n\t} catch (error) {\n\t\tconst original = detail(error);\n\t\tlet chain: Awaited<ReturnType<typeof readPgLedgerAddressChain>>;\n\t\ttry {\n\t\t\tchain = await readPgLedgerAddressChain(executor, target, member.address);\n\t\t} catch {\n\t\t\tthrow error;\n\t\t}\n\t\tconst existing = chain.events.find(\n\t\t\t(event) => event.predecessor === member.predecessor,\n\t\t);\n\t\tif (!existing) throw error;\n\t\tif (sameResolutionPayload(member, existing))\n\t\t\treturn { kind: 'already-appended-outcome-resolution' };\n\t\treturn {\n\t\t\tkind: 'malformed-outcome-resolution',\n\t\t\treason: `resolution predecessor ${member.predecessor ?? 'root'} has a differing terminal member after append failure: ${original}`,\n\t\t};\n\t}\n}\n\nasync function appendOutcomeTerminal(\n\texecutor: TransitionJournalQueryable,\n\ttarget: PgLedgerTarget,\n\tmember: Omit<LedgerChainMember, 'controller' | 'recordedAt'>,\n\trootClaimId: string,\n\treservations: readonly Pick<LedgerReservationRow, 'address'>[],\n): Promise<void> {\n\tif (member.eventKind === 'indeterminate') {\n\t\tawait appendPgLedgerProgress(executor, target, member);\n\t\treturn;\n\t}\n\tawait appendPgLedgerResolution(\n\t\texecutor,\n\t\ttarget,\n\t\tmember,\n\t\trootClaimId,\n\t\treservations,\n\t);\n}\n\ninterface PgOutcomeRecoveryObservation {\n\treadonly readBack: OutcomeRecoveryReadBack;\n\treadonly operation?: Awaited<ReturnType<PgOutcomeOperationReadBackFactory>>;\n}\n\nasync function readPgOutcomeRecoveryReadBackWithResource(\n\texecutor: TransitionJournalQueryable,\n\taddress: LedgerAddress,\n\treadBack: PgOutcomeReadBackFactory,\n\toperationReadBack: PgOutcomeOperationReadBackFactory | undefined,\n\tlockTimeoutMs: number | undefined,\n\tresource: Awaited<ReturnType<typeof readPgCatalogueIdentity>>,\n): Promise<PgOutcomeRecoveryObservation> {\n\tconst operation = operationReadBack\n\t\t? await operationReadBack(executor, address, resource?.catalogueIdentity)\n\t\t: undefined;\n\tif (!resource?.catalogueIdentity)\n\t\treturn {\n\t\t\treadBack: {\n\t\t\t\tkind: 'absent',\n\t\t\t\t...(operation === undefined ? {} : { effect: operation.effect }),\n\t\t\t},\n\t\t\t...(operation === undefined ? {} : { operation }),\n\t\t};\n\treturn {\n\t\treadBack: {\n\t\t\tkind: 'present',\n\t\t\tcatalogueIdentity: resource.catalogueIdentity,\n\t\t\tobserved:\n\t\t\t\toperation?.observed ??\n\t\t\t\t(await withPinnedGeneratedPostconditionSession(\n\t\t\t\t\texecutor,\n\t\t\t\t\t(session) => readBack(session, address, resource.catalogueIdentity),\n\t\t\t\t\tlockTimeoutMs,\n\t\t\t\t)),\n\t\t\t...(operation === undefined ? {} : { effect: operation.effect }),\n\t\t},\n\t\t...(operation === undefined ? {} : { operation }),\n\t};\n}\n\n/**\n * Standalone PostgreSQL catalogue read-back. This intentionally does not\n * issue LOCK TABLE: callers may supply a Pool, and protocol atomicity belongs\n * to the transaction-bound recovery and observed-resolution paths.\n */\nexport async function readPgOutcomeRecoveryReadBack(\n\texecutor: TransitionJournalQueryable,\n\taddress: LedgerAddress,\n\treadBack: PgOutcomeReadBackFactory,\n\toperationReadBack?: PgOutcomeOperationReadBackFactory,\n\tlockTimeoutMs?: number,\n): Promise<OutcomeRecoveryReadBack> {\n\treturn (\n\t\tawait readPgOutcomeRecoveryReadBackWithResource(\n\t\t\texecutor,\n\t\t\taddress,\n\t\t\treadBack,\n\t\t\toperationReadBack,\n\t\t\tlockTimeoutMs,\n\t\t\tawait readPgCatalogueIdentity(executor, address),\n\t\t)\n\t).readBack;\n}\n\nasync function readLockedPgOutcomeRecoveryReadBack(\n\texecutor: TransitionJournalQueryable,\n\taddress: LedgerAddress,\n\treadBack: PgOutcomeReadBackFactory,\n\toperationReadBack: PgOutcomeOperationReadBackFactory | undefined,\n\tlockTimeoutMs: number | undefined,\n): Promise<PgOutcomeRecoveryObservation> {\n\treturn readPgOutcomeRecoveryReadBackWithResource(\n\t\texecutor,\n\t\taddress,\n\t\treadBack,\n\t\toperationReadBack,\n\t\tlockTimeoutMs,\n\t\tawait readPgCatalogueIdentityWithResolvableRelationLock(\n\t\t\texecutor,\n\t\t\taddress,\n\t\t\t'outcome recovery',\n\t\t),\n\t);\n}\n\nasync function readFinalPgOutcomeRecoveryReadBack(\n\texecutor: TransitionJournalQueryable,\n\taddress: LedgerAddress,\n\tobservation: PgOutcomeRecoveryObservation,\n): Promise<OutcomeRecoveryReadBack> {\n\tconst resource = await readPgFinalCatalogueIdentity(executor, address);\n\tconst finalIdentity = resource?.catalogueIdentity;\n\tif (observation.readBack.kind === 'absent' && finalIdentity)\n\t\tthrow new Error(\n\t\t\t`final catalogue identity for ${address.kind} ${address.name} became present after evidence was read`,\n\t\t);\n\tif (observation.readBack.kind === 'present' && !finalIdentity)\n\t\tthrow new Error(\n\t\t\t`final catalogue identity for ${address.kind} ${address.name} became absent after evidence was read`,\n\t\t);\n\tif (\n\t\tobservation.readBack.kind === 'present' &&\n\t\tfinalIdentity &&\n\t\tcanonicalJson(observation.readBack.catalogueIdentity) !==\n\t\t\tcanonicalJson(finalIdentity)\n\t)\n\t\tthrow new Error(\n\t\t\t`final catalogue identity for ${address.kind} ${address.name} changed after evidence was read`,\n\t\t);\n\tif (!finalIdentity)\n\t\treturn {\n\t\t\tkind: 'absent',\n\t\t\t...(observation.operation === undefined\n\t\t\t\t? {}\n\t\t\t\t: { effect: observation.operation.effect }),\n\t\t};\n\treturn observation.readBack;\n}\n\n/**\n * Absence and kinds without a lockable relation (including indexes) retain a\n * final catalogue read immediately before their terminal append. Creation\n * between that read and COMMIT is not excluded by the relation lock; accepted\n * claim-bound external-DDL exclusion closes that residual window without\n * changing this control flow.\n */\nfunction requiresFinalRecoveryTerminalRead(\n\taddress: LedgerAddress,\n\tclassification: OutcomeRecoveryClassification,\n): classification is Extract<\n\tOutcomeRecoveryClassification,\n\t{ readonly kind: 'outcome-recovery-append' }\n> {\n\treturn (\n\t\tclassification.kind === 'outcome-recovery-append' &&\n\t\t(classification.resolution.readBack.kind === 'absent' ||\n\t\t\t!pgLockRelationForAddress(address))\n\t);\n}\n\nasync function commitRecoveryNonAppend(\n\texecutor: TransitionJournalQueryable,\n\tclassification: Exclude<\n\t\tOutcomeRecoveryClassification,\n\t\t{ readonly kind: 'outcome-recovery-append' }\n\t>,\n\tobserver: PgOutcomeCheckpointObserver | undefined,\n): Promise<void> {\n\ttry {\n\t\tawait commitPgOutcome(executor, observer);\n\t} catch (error) {\n\t\t// A lost catalogue session cannot append anyway. Preserve the\n\t\t// classifier's pending result rather than replacing it with a\n\t\t// transaction-cleanup failure after the read has failed.\n\t\tif (classification.kind !== 'outcome-recovery-pending') throw error;\n\t}\n}\n\n/** Opens a claim under its closure locks and commits it with its reservations. */\nasync function openPgOutcomeClaimOnSession(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeClaimRequest,\n\trun?: PgLockedRun,\n): Promise<OutcomeClaimAdmission> {\n\tlet begun = false;\n\ttry {\n\t\tawait begin(executor, request.lockTimeoutMs);\n\t\tbegun = true;\n\t\tconst lock = await acquirePgLedgerLocks(executor, homesFor(request));\n\t\tif (lock.kind !== 'acquired') {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn refusal(\n\t\t\t\tlock.kind === 'busy'\n\t\t\t\t\t? `ledger advisory lock is busy for ${lock.ledger.scope}${lock.ledger.schema ? ` ${lock.ledger.schema}` : ''}`\n\t\t\t\t\t: detail(lock.error),\n\t\t\t);\n\t\t}\n\t\tawait checkpoint(request.observer, 'post-lock-integrity-before-append');\n\t\tif (run) await createPostLockAdmissionEvidence(executor, lock.proof);\n\t\tconst integrity = await validatePgLedgerRuntimeIntegrity(\n\t\t\texecutor,\n\t\t\thomesFor(request),\n\t\t\trun,\n\t\t);\n\t\tif (integrity) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn integrity;\n\t\t}\n\t\tconst { admission } = await admitPgOutcomeClaim(executor, request);\n\t\tif (admission.kind !== 'admitted-outcome-claim') {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn admission;\n\t\t}\n\t\tawait commitPgOutcome(executor, request.observer);\n\t\tbegun = false;\n\t\treturn admission;\n\t} catch (error) {\n\t\tif (begun) await rollback(executor);\n\t\tif (error instanceof PgCommitDeterministicFailureError) throw error;\n\t\tif (error instanceof PgCommitAcknowledgementAmbiguousError) throw error;\n\t\tmarkPgOutcomeSessionCompromised(executor, error);\n\t\treturn refusal(detail(error));\n\t}\n}\n\n/** Opens a claim on one connection when supplied a PostgreSQL pool. */\nexport async function openPgOutcomeClaim(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeClaimRequest,\n\trun?: PgLockedRun,\n): Promise<OutcomeClaimAdmission> {\n\treturn withPgOutcomeSession(executor, (session) =>\n\t\topenPgOutcomeClaimOnSession(session, request, run),\n\t);\n}\n\n/**\n * Opens a root and all closure claims under globally ordered ledger locks in\n * one transaction. No child is ever durable before its root group commits.\n */\nexport async function openPgOutcomeClaimGroup(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeClaimGroupRequest,\n\trun?: PgLockedRun,\n): Promise<PgOutcomeClaimGroupAdmission> {\n\treturn withPgOutcomeSession(executor, async (session) => {\n\t\tlet begun = false;\n\t\ttry {\n\t\t\tawait begin(session, request.lockTimeoutMs);\n\t\t\tbegun = true;\n\t\t\tconst lock = await acquirePgLedgerLocks(session, homesForGroup(request));\n\t\t\tif (lock.kind !== 'acquired') {\n\t\t\t\tawait session.query('ROLLBACK');\n\t\t\t\tbegun = false;\n\t\t\t\treturn { root: refusal('ledger advisory lock is busy'), members: [] };\n\t\t\t}\n\t\t\tconst postLockEvidence = await createPostLockAdmissionEvidence(\n\t\t\t\tsession,\n\t\t\t\tlock.proof,\n\t\t\t);\n\t\t\tconst postLockLiveAdmission = await checkLiveAdmission(postLockEvidence);\n\t\t\tif ('kind' in postLockLiveAdmission) {\n\t\t\t\tawait session.query('ROLLBACK');\n\t\t\t\tbegun = false;\n\t\t\t\treturn { root: postLockLiveAdmission, members: [] };\n\t\t\t}\n\t\t\tconst integrity = await validatePgLedgerRuntimeIntegrity(\n\t\t\t\tsession,\n\t\t\t\thomesForGroup(request),\n\t\t\t\trun,\n\t\t\t);\n\t\t\tif (integrity) {\n\t\t\t\tawait session.query('ROLLBACK');\n\t\t\t\tbegun = false;\n\t\t\t\treturn { root: integrity, members: [] };\n\t\t\t}\n\t\t\tawait checkpoint(request.observer, 'post-lock-integrity-before-append');\n\t\t\tconst all = [request, ...request.members];\n\t\t\tconst currencyHomes = homesForGroup(request);\n\t\t\tconst seen = new Set<string>();\n\t\t\tfor (const home of currencyHomes) {\n\t\t\t\tconst key = `${home.scope}:${home.schema ?? ''}`;\n\t\t\t\tif (seen.has(key)) continue;\n\t\t\t\tseen.add(key);\n\t\t\t\tconst currency = await readPgLedgerScopeCurrency(session, home);\n\t\t\t\tif (currency.kind !== 'current') {\n\t\t\t\t\tawait session.query('ROLLBACK');\n\t\t\t\t\tbegun = false;\n\t\t\t\t\treturn { root: currencyRefusal(currency), members: [] };\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst admissions: OutcomeClaimAdmission[] = [];\n\t\t\tconst claims: Omit<LedgerChainMember, 'controller' | 'recordedAt'>[] = [];\n\t\t\tfor (const item of all) {\n\t\t\t\tconst chain = await readPgLedgerAddressChain(\n\t\t\t\t\tsession,\n\t\t\t\t\ttargetForPlan(item.plan),\n\t\t\t\t\titem.plan.address,\n\t\t\t\t);\n\t\t\t\tconst input = await liveAdmission(session, item.plan, chain);\n\t\t\t\tconst admission =\n\t\t\t\t\titem === request && request.destructiveDecision\n\t\t\t\t\t\t? await (async () => {\n\t\t\t\t\t\t\t\tconst decision = await request.destructiveDecision!(\n\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\trequest.plan,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn decision.kind === 'destructive-decision-permitted'\n\t\t\t\t\t\t\t\t\t? admitDestructiveOutcomeClaim({ decision, admission: input })\n\t\t\t\t\t\t\t\t\t: refusal(decision.reasons.join('; '));\n\t\t\t\t\t\t\t})()\n\t\t\t\t\t\t: admitOutcomeClaim(input);\n\t\t\t\tif (admission.kind !== 'admitted-outcome-claim') {\n\t\t\t\t\tawait session.query('ROLLBACK');\n\t\t\t\t\tbegun = false;\n\t\t\t\t\treturn { root: admission, members: admissions.slice(1) };\n\t\t\t\t}\n\t\t\t\tadmissions.push(admission);\n\t\t\t\t// This terminal comes from the locked transaction's live chain, not\n\t\t\t\t// from a planned lifecycle position. Each group address is unique.\n\t\t\t\tclaims.push(claimMember(item, chain.terminalMember?.eventId));\n\t\t\t}\n\t\t\tawait appendPgLedgerClaimGroup(session, claims[0]!, claims.slice(1), [\n\t\t\t\t...request.reservations,\n\t\t\t\t...request.members.flatMap((member) => member.reservations),\n\t\t\t]);\n\t\t\tawait commitPgOutcome(session, request.observer);\n\t\t\tbegun = false;\n\t\t\treturn { root: admissions[0]!, members: admissions.slice(1) };\n\t\t} catch (error) {\n\t\t\tif (begun) await rollback(session);\n\t\t\tif (\n\t\t\t\terror instanceof PgCommitDeterministicFailureError ||\n\t\t\t\terror instanceof PgCommitAcknowledgementAmbiguousError\n\t\t\t)\n\t\t\t\tthrow error;\n\t\t\treturn { root: refusal(detail(error)), members: [] };\n\t\t}\n\t});\n}\n\n/** Resolves every member terminal atomically under the same ordered locks. */\nexport async function resolvePgOutcomeClaimGroup(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeClaimGroupResolution,\n): Promise<undefined | OutcomeProtocolRefusal> {\n\treturn withPgOutcomeSession(executor, async (session) => {\n\t\tlet begun = false;\n\t\ttry {\n\t\t\tawait begin(session, request.lockTimeoutMs);\n\t\t\tbegun = true;\n\t\t\tconst lock = await acquirePgLedgerLocks(\n\t\t\t\tsession,\n\t\t\t\trequest.members.map(({ member }) => targetForAddress(member.address)),\n\t\t\t);\n\t\t\tif (lock.kind !== 'acquired') {\n\t\t\t\tawait session.query('ROLLBACK');\n\t\t\t\tbegun = false;\n\t\t\t\treturn refusal('ledger advisory lock is busy');\n\t\t\t}\n\t\t\tconst postLockEvidence = await createPostLockAdmissionEvidence(\n\t\t\t\tsession,\n\t\t\t\tlock.proof,\n\t\t\t);\n\t\t\tconst liveAdmission = await checkLiveAdmission(postLockEvidence);\n\t\t\tif ('kind' in liveAdmission) {\n\t\t\t\tawait session.query('ROLLBACK');\n\t\t\t\tbegun = false;\n\t\t\t\treturn liveAdmission;\n\t\t\t}\n\t\t\tconst integrity = await validatePgLedgerRuntimeIntegrity(\n\t\t\t\tsession,\n\t\t\t\trequest.members.map(({ member }) => targetForAddress(member.address)),\n\t\t\t\trequest.runtimeIntegrityRun,\n\t\t\t);\n\t\t\tif (integrity) {\n\t\t\t\tawait session.query('ROLLBACK');\n\t\t\t\tbegun = false;\n\t\t\t\treturn integrity;\n\t\t\t}\n\t\t\tawait checkpoint(request.observer, 'post-lock-integrity-before-append');\n\t\t\tconst members = await Promise.all(\n\t\t\t\trequest.members.map(async ({ target, member }) =>\n\t\t\t\t\tmemberWithCurrentTerminalPredecessor(session, target, member),\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (members.every((member) => member.eventKind === 'indeterminate')) {\n\t\t\t\t// A readable partial destructive effect keeps every member's claim\n\t\t\t\t// open. Reservations deliberately remain: another writer must not\n\t\t\t\t// turn this uncertainty into a competing lifecycle.\n\t\t\t\tfor (const member of members)\n\t\t\t\t\tawait appendPgLedgerProgress(\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\ttargetForAddress(member.address),\n\t\t\t\t\t\tmember,\n\t\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tawait appendPgLedgerResolutionGroup(\n\t\t\t\t\tsession,\n\t\t\t\t\trequest.rootClaimId,\n\t\t\t\t\tmembers,\n\t\t\t\t\trequest.reservations,\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait commitPgOutcome(session, request.observer);\n\t\t\tbegun = false;\n\t\t\treturn undefined;\n\t\t} catch (error) {\n\t\t\tif (begun) await rollback(session);\n\t\t\tif (\n\t\t\t\terror instanceof PgCommitDeterministicFailureError ||\n\t\t\t\terror instanceof PgCommitAcknowledgementAmbiguousError\n\t\t\t)\n\t\t\t\tthrow error;\n\t\t\treturn refusal(detail(error));\n\t\t}\n\t});\n}\n\nasync function claimIsOpen(\n\texecutor: TransitionJournalQueryable,\n\tclaim: AdmittedOutcomeClaim,\n): Promise<OutcomeProtocolRefusal | undefined> {\n\tconst chain = await readPgLedgerAddressChain(\n\t\texecutor,\n\t\ttargetForPlan(claim.plan),\n\t\tclaim.plan.address,\n\t);\n\tconst projection = projectLedgerChain(chain);\n\tif (projection.kind !== 'projected-ledger-chain')\n\t\treturn refusal(\n\t\t\t`${claimSubject(claim.plan)} refuses malformed ledger chain: ${projection.reason.code}`,\n\t\t);\n\tif (projection.openClaim?.event.eventId !== claim.plan.claimId)\n\t\treturn refusal(\n\t\t\t`claim token for ${claimSubject(claim.plan)} is no longer valid because its claim is closed`,\n\t\t);\n\treturn undefined;\n}\n\n/**\n * Keep the reviewed claim's stable identity beside its opaque execution hash\n * on every token-gate failure. The hash alone cannot identify the failed\n * generator change when one reviewed run contains multiple claims.\n */\nfunction claimSubject(plan: OutcomeClaimPlan): string {\n\treturn `${plan.claimId} (plannedClaimKey ${plan.plannedClaimKey ?? 'unknown'}; claim kind ${plan.claimKind}; address ${plan.address.name})`;\n}\n\n/**\n * The only managed DDL sink in this layer. A token parameter is mandatory, and\n * it is consumed immediately before the first statement is sent.\n */\nasync function executePgManagedBundle(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeExecutionRequest,\n): Promise<undefined | OutcomeProtocolRefusal> {\n\tconst tokenClaimId = claimIdForToken(request.token);\n\tif (tokenClaimId !== request.claim.plan.claimId)\n\t\treturn refusal(\n\t\t\ttokenClaimId === undefined\n\t\t\t\t? `claim token for ${claimSubject(request.claim.plan)} was not minted by claim admission`\n\t\t\t\t: `claim token belongs to claim ${tokenClaimId}, not ${claimSubject(request.claim.plan)}`,\n\t\t);\n\tconst open = await claimIsOpen(executor, request.claim);\n\tif (open) return open;\n\tconst consumption = consumeClaimToken(\n\t\trequest.token,\n\t\trequest.claim.plan.claimId,\n\t\trequest.statements,\n\t);\n\tif ('kind' in consumption) return consumption;\n\tfor (const statement of consumption.statements)\n\t\tawait classifyPgWrite(() => executor.query(statement.sql));\n}\n\n/**\n * The final PostgreSQL sender accepts only an opaque permit minted by live\n * admission. Neither a caller-supplied claim nor a core claim token reaches\n * this boundary directly.\n */\nasync function sendPgAdmittedBundle(\n\texecutor: TransitionJournalQueryable,\n\trequest: {\n\t\treadonly permit: AdmittedPermit;\n\t\treadonly statements: readonly ClaimBundleStatement[];\n\t},\n): Promise<undefined | OutcomeProtocolRefusal> {\n\tconst claim = admittedClaim(request.permit);\n\tif (!claim) return refusal('managed DDL sender refuses an unadmitted permit');\n\treturn executePgManagedBundle(executor, {\n\t\ttoken: claim.token,\n\t\tclaim,\n\t\tstatements: request.statements,\n\t});\n}\n\n/**\n * EFF-03 bridge endpoint for generator removals. Its required admission value\n * was minted by the sole authority interpreter and carries the claim token.\n */\nasync function executePgDestructiveBundle(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgDestructiveOutcomeExecutionRequest,\n): Promise<undefined | OutcomeProtocolRefusal> {\n\tif (!isDestructiveAuthorityPermit(request.claim.destructivePermit))\n\t\treturn refusal(\n\t\t\t'destructive authority permit was not minted by the interpreter',\n\t\t);\n\treturn executePgManagedBundle(executor, {\n\t\ttoken: request.claim.token,\n\t\tclaim: request.claim,\n\t\tstatements: request.statements,\n\t});\n}\n\nasync function verifyCreationVacancy(\n\texecutor: TransitionJournalQueryable,\n\tclaim: AdmittedOutcomeClaim,\n\treader: PgOutcomeTransactionalRequest['vacancy'],\n): Promise<OutcomeProtocolRefusal | undefined> {\n\tif (claim.plan.requiresVacancy === false) return undefined;\n\tif (!reader)\n\t\treturn refusal(\n\t\t\t`creation claim ${claim.plan.claimId} has no vacancy reader`,\n\t\t);\n\tconst vacancy = await reader(executor, claim.plan);\n\tif (vacancy.kind === 'vacant') return undefined;\n\treturn refusal(vacancy.reason);\n}\n\nasync function refuseClaim(\n\texecutor: TransitionJournalQueryable,\n\tclaim: AdmittedOutcomeClaim,\n\trequest: PgOutcomeClaimRequest,\n\teventId: string,\n\tcode: 'ERR-02' | 'ERR-05',\n): Promise<void> {\n\tconst target = targetForPlan(claim.plan);\n\tconst predecessor = await currentTerminalPredecessor(\n\t\texecutor,\n\t\ttarget,\n\t\tclaim.plan.address,\n\t);\n\tif (!predecessor)\n\t\tthrow new Error(`claim ${claim.plan.claimId} has no current terminal`);\n\tawait appendPgLedgerResolution(\n\t\texecutor,\n\t\ttarget,\n\t\tresolutionMember(\n\t\t\tclaim,\n\t\t\t{\n\t\t\t\teventId,\n\t\t\t\teventKind: 'refused',\n\t\t\t\trefusal: refusalFor(code, {\n\t\t\t\t\taddress: claim.plan.address,\n\t\t\t\t\tstate: claim.stableStateBeforeClaim,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tpredecessor,\n\t\t),\n\t\tclaim.plan.claimId,\n\t\trequest.reservations,\n\t);\n}\n\n/** Claim, vacancy read, bundle send and resolution share one transaction. */\nasync function runPgTransactionalOutcomeOnSession(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeTransactionalRequest,\n\tverdicts: AdmissionVerdicts,\n): Promise<PgOutcomeResult> {\n\tlet begun = false;\n\tconst ownsTransaction = !request.transactionOpen;\n\ttry {\n\t\tif (ownsTransaction) {\n\t\t\tawait begin(executor, request.lockTimeoutMs);\n\t\t\tbegun = true;\n\t\t}\n\t\tconst lock = await acquirePgLedgerLocks(executor, homesFor(request));\n\t\tif (lock.kind !== 'acquired') {\n\t\t\tif (ownsTransaction) await executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn refusal('ledger advisory lock is busy');\n\t\t}\n\t\tawait checkpoint(request.observer, 'post-lock-integrity-before-append');\n\t\tconst postLockEvidence = await createPostLockAdmissionEvidence(\n\t\t\texecutor,\n\t\t\tlock.proof,\n\t\t);\n\t\tconst liveAdmission = await checkLiveAdmission(postLockEvidence);\n\t\tif ('kind' in liveAdmission) {\n\t\t\tif (ownsTransaction) await executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn liveAdmission;\n\t\t}\n\t\tconst integrity = await validatePgLedgerRuntimeIntegrity(\n\t\t\texecutor,\n\t\t\thomesFor(request),\n\t\t\tverdicts.run,\n\t\t);\n\t\tif (integrity) {\n\t\t\tif (ownsTransaction) await executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn integrity;\n\t\t}\n\t\tconst target = targetForPlan(request.plan);\n\t\tconst { admission } = await admitPgOutcomeClaim(executor, request);\n\t\tif (admission.kind !== 'admitted-outcome-claim') {\n\t\t\tif (ownsTransaction) await executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn admission;\n\t\t}\n\t\tconst liveAdmissionRefusal = request.verifyLiveAdmission\n\t\t\t? await request.verifyLiveAdmission(executor, admission.plan)\n\t\t\t: undefined;\n\t\tif (liveAdmissionRefusal) {\n\t\t\tawait refuseClaim(\n\t\t\t\texecutor,\n\t\t\t\tadmission,\n\t\t\t\trequest,\n\t\t\t\trequest.resolution.eventId,\n\t\t\t\t'ERR-05',\n\t\t\t);\n\t\t\tif (ownsTransaction) await commitPgOutcome(executor, request.observer);\n\t\t\tbegun = false;\n\t\t\treturn liveAdmissionRefusal;\n\t\t}\n\t\tconst vacancy = await verifyCreationVacancy(\n\t\t\texecutor,\n\t\t\tadmission,\n\t\t\trequest.vacancy,\n\t\t);\n\t\tif (vacancy) {\n\t\t\tawait refuseClaim(\n\t\t\t\texecutor,\n\t\t\t\tadmission,\n\t\t\t\trequest,\n\t\t\t\trequest.resolution.eventId,\n\t\t\t\t'ERR-02',\n\t\t\t);\n\t\t\tif (ownsTransaction) await commitPgOutcome(executor, request.observer);\n\t\t\tbegun = false;\n\t\t\treturn vacancy;\n\t\t}\n\t\tconst permit = mintAdmittedPermit(\n\t\t\tadmission,\n\t\t\tverdicts.digestBinding,\n\t\t\tverdicts.validatedManifest,\n\t\t\tverdicts.approvalScope,\n\t\t\tliveAdmission,\n\t\t\tpostLockEvidence,\n\t\t);\n\t\tconst sent =\n\t\t\t'destructivePermit' in admission\n\t\t\t\t? await executePgDestructiveBundle(executor, {\n\t\t\t\t\t\tclaim: admission as AdmittedDestructiveOutcomeClaim,\n\t\t\t\t\t\tstatements: admission.plan.statementBundle.statements,\n\t\t\t\t\t})\n\t\t\t\t: await sendPgAdmittedBundle(executor, {\n\t\t\t\t\t\tpermit,\n\t\t\t\t\t\tstatements: admission.plan.statementBundle.statements,\n\t\t\t\t\t});\n\t\tif (sent) throw new Error(sent.reason);\n\t\tawait checkpoint(request.observer, 'ddl-completed-before-read-back');\n\t\tconst predecessor = await currentTerminalPredecessor(\n\t\t\texecutor,\n\t\t\ttarget,\n\t\t\tadmission.plan.address,\n\t\t);\n\t\tif (!predecessor)\n\t\t\tthrow new Error(\n\t\t\t\t`claim ${admission.plan.claimId} has no current terminal`,\n\t\t\t);\n\t\tawait appendOutcomeTerminal(\n\t\t\texecutor,\n\t\t\ttarget,\n\t\t\tawait terminalResolutionMember(executor, request, admission, predecessor),\n\t\t\trequest.plan.claimId,\n\t\t\trequest.reservations,\n\t\t);\n\t\tif (ownsTransaction) await commitPgOutcome(executor, request.observer);\n\t\tbegun = false;\n\t\treturn { kind: 'executed-outcome-claim', claim: admission };\n\t} catch (error) {\n\t\tif (begun) await rollback(executor);\n\t\tif (error instanceof PgCommitDeterministicFailureError) throw error;\n\t\tif (error instanceof PgCommitAcknowledgementAmbiguousError) throw error;\n\t\treturn refusal(detail(error));\n\t}\n}\n\nfunction sameStatementBundle(\n\tleft: readonly ClaimBundleStatement[],\n\tright: readonly ClaimBundleStatement[],\n): boolean {\n\treturn canonicalJson(left) === canonicalJson(right);\n}\n\n/** The paired sender accepts the same opaque permit boundary as every DDL sink. */\nasync function sendPgPairedReaddressBundle(\n\texecutor: TransitionJournalQueryable,\n\tpermit: AdmittedPermit,\n\tstatements: readonly ClaimBundleStatement[],\n): Promise<OutcomeProtocolRefusal | undefined> {\n\tconst paired = admittedPermitRecords.get(permit)?.paired;\n\tif (!paired)\n\t\treturn refusal('managed re-address sender refuses an unadmitted permit');\n\tif (!sameStatementBundle(paired.statements, statements))\n\t\treturn refusal(\n\t\t\t`managed re-address sender refuses a bundle outside admitted pair ${paired.pairId}`,\n\t\t);\n\tfor (const statement of paired.statements)\n\t\tawait classifyPgWrite(() => executor.query(statement.sql));\n\treturn undefined;\n}\n\nfunction homesForPairedReaddress(\n\trequest: PgPairedReaddressOperation['request'],\n): PgLedgerTarget[] {\n\treturn request.members.flatMap((member) => [\n\t\ttargetForAddress(member.source),\n\t\ttargetForAddress(member.target),\n\t]);\n}\n\nasync function currentControllerIdentity(\n\texecutor: TransitionJournalQueryable,\n): Promise<ControllerIdentity | OutcomeProtocolRefusal> {\n\tconst role = await executor.query(\n\t\t'SELECT current_user AS current_user, current_user::regrole::oid::text AS current_user_oid',\n\t);\n\tconst name = role.rows[0]?.current_user;\n\tconst oid = role.rows[0]?.current_user_oid;\n\treturn typeof name === 'string' && typeof oid === 'string'\n\t\t? { name, oid }\n\t\t: refusal('current controller identity is unreadable');\n}\n\n/** One paired admission, send and all paired terminals in one transaction. */\nasync function runPgPairedReaddressOperation(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgPairedReaddressOperation['request'],\n\tverdicts: AdmissionVerdicts,\n): Promise<PgAdmittedOperationResult> {\n\tlet begun = false;\n\tlet ddlMayHaveBeenSent = false;\n\ttry {\n\t\tawait begin(executor, request.lockTimeoutMs);\n\t\tbegun = true;\n\t\tconst homes = homesForPairedReaddress(request);\n\t\tconst lock = await acquirePgLedgerLocks(executor, homes);\n\t\tif (lock.kind !== 'acquired') {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn refusal('ledger advisory lock is busy');\n\t\t}\n\t\tconst liveAdmission = await checkLiveAdmission(\n\t\t\tawait createPostLockAdmissionEvidence(executor, lock.proof),\n\t\t);\n\t\tif ('kind' in liveAdmission) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn liveAdmission;\n\t\t}\n\t\tconst integrity = await validatePgLedgerRuntimeIntegrity(\n\t\t\texecutor,\n\t\t\thomes,\n\t\t\tverdicts.run,\n\t\t);\n\t\tif (integrity) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn integrity;\n\t\t}\n\t\tawait checkpoint(request.observer, 'post-lock-integrity-before-append');\n\t\tconst seen = new Set<string>();\n\t\tfor (const home of homes) {\n\t\t\tconst key = `${home.scope}:${home.schema ?? ''}`;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tconst currency = await readPgLedgerScopeCurrency(executor, home);\n\t\t\tif (currency.kind !== 'current') {\n\t\t\t\tawait executor.query('ROLLBACK');\n\t\t\t\tbegun = false;\n\t\t\t\treturn currencyRefusal(currency);\n\t\t\t}\n\t\t}\n\t\tconst controller = await currentControllerIdentity(executor);\n\t\tif ('kind' in controller) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn controller;\n\t\t}\n\t\tconst witnesses = await request.verifyLiveAdmission(executor, controller);\n\t\tif ('kind' in witnesses) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn witnesses;\n\t\t}\n\t\tif (request.members.length === 0) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn refusal('re-address has no closure members');\n\t\t}\n\t\tconst terminalMembers: {\n\t\t\treadonly member: PgPairedReaddressOperation['request']['members'][number];\n\t\t\treadonly liveTarget: NonNullable<\n\t\t\t\tAwaited<ReturnType<typeof readPgCatalogueIdentity>>\n\t\t\t> & {\n\t\t\t\treadonly catalogueIdentity: NonNullable<\n\t\t\t\t\tNonNullable<\n\t\t\t\t\t\tAwaited<ReturnType<typeof readPgCatalogueIdentity>>\n\t\t\t\t\t>['catalogueIdentity']\n\t\t\t\t>;\n\t\t\t};\n\t\t\treadonly sourceReservation: LedgerReservationRow;\n\t\t\treadonly targetReservation: LedgerReservationRow;\n\t\t\treadonly targetObserved: GeneratedPostconditionObservation;\n\t\t}[] = [];\n\t\tfor (const member of request.members) {\n\t\t\tfor (const [address, eventId] of [\n\t\t\t\t[member.source, member.sourceClaimId],\n\t\t\t\t[member.target, member.targetClaimId],\n\t\t\t] as const) {\n\t\t\t\tconst predecessor = await currentTerminalPredecessor(\n\t\t\t\t\texecutor,\n\t\t\t\t\ttargetForAddress(address),\n\t\t\t\t\taddress,\n\t\t\t\t);\n\t\t\t\tconst reservation = request.reservations.find(\n\t\t\t\t\t(candidate) =>\n\t\t\t\t\t\tsameLedgerAddress(candidate.address, address) &&\n\t\t\t\t\t\tcandidate.rootClaimId === eventId,\n\t\t\t\t);\n\t\t\t\tif (!reservation) {\n\t\t\t\t\tawait executor.query('ROLLBACK');\n\t\t\t\t\tbegun = false;\n\t\t\t\t\treturn refusal(\n\t\t\t\t\t\t`re-address pair ${request.pairId} has no reservation for ${address.name}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tawait appendPgLedgerClaim(\n\t\t\t\t\texecutor,\n\t\t\t\t\ttargetForAddress(address),\n\t\t\t\t\t{\n\t\t\t\t\t\teventId,\n\t\t\t\t\t\texecutionId: request.executionId,\n\t\t\t\t\t\trootClaimId: eventId,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\teventKind: 'readdress-intent',\n\t\t\t\t\t\t...(predecessor === undefined ? {} : { predecessor }),\n\t\t\t\t\t\tpairId: request.pairId,\n\t\t\t\t\t},\n\t\t\t\t\t[reservation],\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tddlMayHaveBeenSent = true;\n\t\tconst sent = await sendPgPairedReaddressBundle(\n\t\t\texecutor,\n\t\t\tmintPairedReaddressPermit(\n\t\t\t\trequest.pairId,\n\t\t\t\trequest.statements,\n\t\t\t\tverdicts.digestBinding,\n\t\t\t\tverdicts.validatedManifest,\n\t\t\t\tverdicts.approvalScope,\n\t\t\t\tliveAdmission,\n\t\t\t),\n\t\t\trequest.statements,\n\t\t);\n\t\tif (sent) throw new Error(sent.reason);\n\t\tawait checkpoint(request.observer, 'ddl-completed-before-read-back');\n\t\tfor (const member of request.members) {\n\t\t\t// The root table lock carries table, column, constraint, and policy\n\t\t\t// members through this append. An index has no SQL LOCK TABLE form\n\t\t\t// (ALTER INDEX RENAME locks the index itself), so its identity below is\n\t\t\t// the final-read window of this single admitted DDL transaction.\n\t\t\tconst liveTarget = await readPgCatalogueIdentity(executor, member.target);\n\t\t\tif (!liveTarget?.catalogueIdentity)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`re-address target read-back is absent for ${member.target.name}`,\n\t\t\t\t);\n\t\t\tassertPgPairedReaddressTargetWitness(witnesses, member, liveTarget);\n\t\t\tconst sourceReservation = request.reservations.find(\n\t\t\t\t(candidate) =>\n\t\t\t\t\tsameLedgerAddress(candidate.address, member.source) &&\n\t\t\t\t\tcandidate.rootClaimId === member.sourceClaimId,\n\t\t\t);\n\t\t\tconst targetReservation = request.reservations.find(\n\t\t\t\t(candidate) =>\n\t\t\t\t\tsameLedgerAddress(candidate.address, member.target) &&\n\t\t\t\t\tcandidate.rootClaimId === member.targetClaimId,\n\t\t\t);\n\t\t\tif (!sourceReservation || !targetReservation) {\n\t\t\t\tawait executor.query('ROLLBACK');\n\t\t\t\tbegun = false;\n\t\t\t\treturn refusal(`re-address pair ${request.pairId} lost a reservation`);\n\t\t\t}\n\t\t\t// Table declarations receive structural read-back. Every non-table member\n\t\t\t// receives generic identity observation while its declaration remains in\n\t\t\t// targetDeclared; undecodable declarations refuse before either claim.\n\t\t\tconst targetObserved = await withPinnedGeneratedPostconditionSession(\n\t\t\t\texecutor,\n\t\t\t\t(session) => readPgPairedReaddressObserved(session, member),\n\t\t\t);\n\t\t\tawait member.postDdlVerify?.(executor);\n\t\t\tterminalMembers.push({\n\t\t\t\tmember,\n\t\t\t\tliveTarget: {\n\t\t\t\t\t...liveTarget,\n\t\t\t\t\tcatalogueIdentity: liveTarget.catalogueIdentity,\n\t\t\t\t},\n\t\t\t\tsourceReservation,\n\t\t\t\ttargetReservation,\n\t\t\t\ttargetObserved,\n\t\t\t});\n\t\t}\n\t\tfor (const {\n\t\t\tmember,\n\t\t\tliveTarget,\n\t\t\tsourceReservation,\n\t\t\ttargetReservation,\n\t\t\ttargetObserved,\n\t\t} of terminalMembers) {\n\t\t\tawait appendPgLedgerResolution(\n\t\t\t\texecutor,\n\t\t\t\ttargetForAddress(member.source),\n\t\t\t\t{\n\t\t\t\t\teventId: `${member.sourceClaimId}:readdressed-to`,\n\t\t\t\t\texecutionId: request.executionId,\n\t\t\t\t\trootClaimId: member.sourceClaimId,\n\t\t\t\t\taddress: member.source,\n\t\t\t\t\teventKind: 'readdressed-to',\n\t\t\t\t\tpredecessor: member.sourceClaimId,\n\t\t\t\t\tpairId: request.pairId,\n\t\t\t\t},\n\t\t\t\tmember.sourceClaimId,\n\t\t\t\t[sourceReservation],\n\t\t\t);\n\t\t\tawait appendPgLedgerResolution(\n\t\t\t\texecutor,\n\t\t\t\ttargetForAddress(member.target),\n\t\t\t\t{\n\t\t\t\t\teventId: `${member.targetClaimId}:readdressed-from`,\n\t\t\t\t\texecutionId: request.executionId,\n\t\t\t\t\trootClaimId: member.targetClaimId,\n\t\t\t\t\taddress: member.target,\n\t\t\t\t\teventKind: 'readdressed-from',\n\t\t\t\t\tpredecessor: member.targetClaimId,\n\t\t\t\t\tpairId: request.pairId,\n\t\t\t\t\tcatalogueIdentity: liveTarget.catalogueIdentity,\n\t\t\t\t\tdeclared: member.targetDeclared,\n\t\t\t\t\tobserved: targetObserved,\n\t\t\t\t},\n\t\t\t\tmember.targetClaimId,\n\t\t\t\t[targetReservation],\n\t\t\t);\n\t\t}\n\t\tawait commitPgOutcome(executor, request.observer);\n\t\tbegun = false;\n\t\treturn { kind: 'executed-paired-readdress', pairId: request.pairId };\n\t} catch (error) {\n\t\tif (begun) await rollback(executor);\n\t\tif (error instanceof PgCommitDeterministicFailureError) throw error;\n\t\tif (error instanceof PgCommitAcknowledgementAmbiguousError)\n\t\t\tif (ddlMayHaveBeenSent)\n\t\t\t\treturn {\n\t\t\t\t\tkind: 'outcome-recovery-required',\n\t\t\t\t\tclaimId: request.members[0]?.sourceClaimId ?? request.pairId,\n\t\t\t\t\treason: error.message,\n\t\t\t\t};\n\t\tif (ddlMayHaveBeenSent)\n\t\t\treturn {\n\t\t\t\tkind: 'outcome-recovery-required',\n\t\t\t\tclaimId: request.members[0]?.sourceClaimId ?? request.pairId,\n\t\t\t\treason: detail(error),\n\t\t\t};\n\t\tif (error instanceof PgCommitAcknowledgementAmbiguousError)\n\t\t\treturn { kind: 'outcome-transport-ambiguous', reason: error.message };\n\t\tmarkPgOutcomeSessionCompromised(executor, error);\n\t\treturn refusal(detail(error));\n\t}\n}\n\ninterface AdmissionVerdicts {\n\treadonly digestBinding: DigestBindingVerdict;\n\treadonly validatedManifest: ValidatedManifestVerdict;\n\treadonly approvalScope: ApprovalScopeVerdict;\n\t/** Compatibility-only until direct runners receive durable run witnesses. */\n\treadonly liveAdmission?: LiveAdmissionVerdict;\n\t/** Enables one physical validation per locked run/home on this session. */\n\treadonly run?: PgLockedRun;\n}\n\nfunction operationApprovalSubject(operation: PgAdmittedOperation):\n\t| {\n\t\t\treadonly address: LedgerAddress;\n\t\t\treadonly classification: AdmissionOperationClassification;\n\t }\n\t| OutcomeProtocolRefusal {\n\tif (operation.kind === 'single-outcome')\n\t\treturn {\n\t\t\taddress: operation.request.plan.address,\n\t\t\tclassification: operation.kind,\n\t\t};\n\tif (operation.kind === 'destructive-outcome')\n\t\treturn {\n\t\t\taddress: operation.request.plan.address,\n\t\t\tclassification: operation.kind,\n\t\t};\n\tconst root = operation.request.members.find((member) =>\n\t\tsameLedgerAddress(member.source, operation.request.manifestPlan.address),\n\t);\n\tif (!root)\n\t\treturn refusal(\n\t\t\t`re-address closure has no declared root ${operation.request.manifestPlan.address.name}`,\n\t\t);\n\treturn {\n\t\taddress: root.source,\n\t\tclassification: operation.kind,\n\t};\n}\n\nexport function checkDigestBinding(input: {\n\treadonly run: PgLockedRun;\n\treadonly recomputedPlanDigest?: string;\n}): DigestBindingVerdict | OutcomeProtocolRefusal {\n\tif (!lockedRuns.has(input.run))\n\t\treturn refusal('admitted operation refuses an unbound locked journal run');\n\tif (input.recomputedPlanDigest !== input.run.planDigest)\n\t\treturn refusal(\n\t\t\t'admitted operation refuses a mismatched recomputed plan digest',\n\t\t);\n\treturn mintDigestBindingVerdict();\n}\n\nexport function checkValidatedManifest(input: {\n\treadonly manifest?: ValidatedManagedStepManifest;\n\t/** Plans whose claim keys are declared by the reviewed manifest. */\n\treadonly expectedPlans: readonly OutcomeClaimPlan[];\n\t/**\n\t * Live closure members supplement legacy root-only manifests. They may record\n\t * absent facts, but they cannot introduce SQL outside the manifest.\n\t */\n\treadonly supplementalPlans?: readonly OutcomeClaimPlan[];\n\t/** The façade, unlike a bare plan, knows which operation class is admitted. */\n\treadonly expectedClassification?:\n\t\t| 'non-destructive'\n\t\t| 'removal'\n\t\t| 'data-destructive';\n}): ValidatedManifestVerdict | OutcomeProtocolRefusal {\n\tif (input.expectedPlans.length === 0)\n\t\treturn refusal(\n\t\t\t'admitted operation refuses a manifest check without an expected plan',\n\t\t);\n\tconst supplementalNotCascadeCovered = input.supplementalPlans?.find(\n\t\t(plan) => plan.claimSpecies !== 'cascade-covered',\n\t);\n\tif (supplementalNotCascadeCovered)\n\t\treturn refusal(\n\t\t\t`admitted operation refuses supplemental closure member ${supplementalNotCascadeCovered.plannedClaimKey ?? supplementalNotCascadeCovered.address.name} that is not cascade-covered`,\n\t\t);\n\tconst supplementalWithSql = input.supplementalPlans?.find(\n\t\t(plan) => plan.statementBundle.statements.length !== 0,\n\t);\n\tif (supplementalWithSql)\n\t\treturn refusal(\n\t\t\t`admitted operation refuses supplemental closure member ${supplementalWithSql.plannedClaimKey ?? supplementalWithSql.address.name} with a non-empty statement bundle`,\n\t\t);\n\tconst manifest = input.manifest;\n\tconst manifestValid =\n\t\tmanifest !== undefined &&\n\t\tinput.expectedPlans.every((plan) =>\n\t\t\tmanifest.steps.some((step) => {\n\t\t\t\treturn (\n\t\t\t\t\tstep.plannedClaimKeys.includes(plan.plannedClaimKey ?? '') &&\n\t\t\t\t\tstep.address !== undefined &&\n\t\t\t\t\tsameLedgerAddress(step.address, plan.address) &&\n\t\t\t\t\tstep.claimKind === plan.claimKind &&\n\t\t\t\t\t(input.expectedClassification === undefined ||\n\t\t\t\t\t\tstep.classification === input.expectedClassification) &&\n\t\t\t\t\tstep.requiresVacancy === (plan.requiresVacancy ?? false) &&\n\t\t\t\t\tstep.statementBundle.statements.length ===\n\t\t\t\t\t\tplan.statementBundle.statements.length &&\n\t\t\t\t\tstep.statementBundle.statements.every(\n\t\t\t\t\t\t(statement, index) =>\n\t\t\t\t\t\t\tplan.statementBundle.statements[index]?.ordinal ===\n\t\t\t\t\t\t\t\tstatement.ordinal &&\n\t\t\t\t\t\t\tplan.statementBundle.statements[index]?.sql === statement.sql,\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\tif (!manifestValid)\n\t\treturn refusal(\n\t\t\t'admitted operation refuses an unvalidated managed-step manifest',\n\t\t);\n\treturn mintValidatedManifestVerdict();\n}\n\nexport function checkApprovalScope(input: {\n\treadonly run: PgLockedRun;\n\treadonly approval: ScopedApprovalSet;\n\treadonly operation: PgAdmittedOperation;\n}): ApprovalScopeVerdict | OutcomeProtocolRefusal {\n\tconst subject = operationApprovalSubject(input.operation);\n\tif ('kind' in subject) return subject;\n\tif (input.operation.kind === 'destructive-outcome') {\n\t\tconst destructiveAcceptances = input.approval.approvals.filter(\n\t\t\t(grant) =>\n\t\t\t\tgrant.class === `destructive-plan-accepted:${input.run.planDigest}`,\n\t\t);\n\t\tif (destructiveAcceptances.length === 0)\n\t\t\treturn refusal('operator acceptance is absent');\n\t\tconst accepted = destructiveAcceptances.some((grant) => {\n\t\t\tconst scope = grant.withinScope;\n\t\t\tconst inScope =\n\t\t\t\tscope === undefined ||\n\t\t\t\tscope.length === 0 ||\n\t\t\t\tscope.some((selector) =>\n\t\t\t\t\tselectorMatchesResource(selector, subject.address),\n\t\t\t\t);\n\t\t\tconst expectedRoot = input.approval.declaredTrustRoot;\n\t\t\tconst trustRootChecked =\n\t\t\t\texpectedRoot === undefined\n\t\t\t\t\t? grant.fromTrustRoot === undefined\n\t\t\t\t\t: grant.fromTrustRoot !== undefined &&\n\t\t\t\t\t\tcanonicalJson(grant.fromTrustRoot) === canonicalJson(expectedRoot);\n\t\t\treturn inScope && trustRootChecked;\n\t\t});\n\t\tif (!accepted)\n\t\t\treturn refusal(\n\t\t\t\t'admitted operation refuses destructive approval outside its scope or trust root',\n\t\t\t);\n\t}\n\treturn mintApprovalScopeVerdict(subject.address, subject.classification);\n}\n\nexport async function checkLiveAdmission(\n\tevidence: PostLockAdmissionEvidence,\n): Promise<LiveAdmissionVerdict | OutcomeProtocolRefusal> {\n\ttry {\n\t\treturn mintLiveAdmissionVerdict(evidence);\n\t} catch (error) {\n\t\treturn refusal(detail(error));\n\t}\n}\n\n/**\n * The public PostgreSQL admitted-execution boundary. It is intentionally not\n * used by legacy paths yet: later dispatches bind their persisted runs and\n * operation shapes here without changing this authority surface.\n */\nexport async function executePgAdmittedOperation(\n\tsession: TransitionJournalQueryable,\n\tinput: {\n\t\treadonly run: PgLockedRun;\n\t\treadonly operation: PgAdmittedOperation;\n\t\treadonly approval: ScopedApprovalSet;\n\t\t/** Branded proof that the operation came from the normalized manifest. */\n\t\treadonly manifest?: ValidatedManagedStepManifest;\n\t\t/** Recomputed from the durable plan while the caller owns its run lock. */\n\t\treadonly recomputedPlanDigest?: string;\n\t},\n): Promise<PgAdmittedOperationResult> {\n\ttry {\n\t\tconst { expectedPlans, supplementalPlans } =\n\t\t\tinput.operation.kind === 'paired-readdress'\n\t\t\t\t? {\n\t\t\t\t\t\texpectedPlans: [input.operation.request.manifestPlan],\n\t\t\t\t\t\tsupplementalPlans: [],\n\t\t\t\t\t}\n\t\t\t\t: input.operation.kind === 'destructive-outcome'\n\t\t\t\t\t? {\n\t\t\t\t\t\t\texpectedPlans: [input.operation.request.plan],\n\t\t\t\t\t\t\tsupplementalPlans: input.operation.request.members.map(\n\t\t\t\t\t\t\t\t(member) => member.plan,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\texpectedPlans: [input.operation.request.plan],\n\t\t\t\t\t\t\tsupplementalPlans: [],\n\t\t\t\t\t\t};\n\t\tconst digestBinding = checkDigestBinding(input);\n\t\tif ('kind' in digestBinding) return digestBinding;\n\t\tconst validatedManifest = checkValidatedManifest({\n\t\t\texpectedPlans,\n\t\t\tsupplementalPlans,\n\t\t\t...(input.manifest === undefined ? {} : { manifest: input.manifest }),\n\t\t});\n\t\tif ('kind' in validatedManifest) return validatedManifest;\n\t\tconst approvalScope = checkApprovalScope(input);\n\t\tif ('kind' in approvalScope) return approvalScope;\n\t\treturn await withPgOutcomeSession(session, async (pinnedSession) => {\n\t\t\tconst verdicts: AdmissionVerdicts = {\n\t\t\t\tdigestBinding,\n\t\t\t\tvalidatedManifest,\n\t\t\t\tapprovalScope,\n\t\t\t\trun: input.run,\n\t\t\t};\n\t\t\tif (input.operation.kind === 'paired-readdress')\n\t\t\t\treturn runPgPairedReaddressOperation(\n\t\t\t\t\tpinnedSession,\n\t\t\t\t\tinput.operation.request,\n\t\t\t\t\tverdicts,\n\t\t\t\t);\n\t\t\tif (input.operation.kind === 'destructive-outcome')\n\t\t\t\treturn runPgDestructiveOutcome(\n\t\t\t\t\tpinnedSession,\n\t\t\t\t\tinput.operation.request,\n\t\t\t\t\tinput.run,\n\t\t\t\t\tinput.operation.readBackAndResolve,\n\t\t\t\t);\n\t\t\treturn 'executingEventId' in input.operation.request\n\t\t\t\t? runPgNonTransactionalOutcomeOnSession(\n\t\t\t\t\t\tpinnedSession,\n\t\t\t\t\t\tinput.operation.request,\n\t\t\t\t\t\tverdicts,\n\t\t\t\t\t)\n\t\t\t\t: runPgTransactionalOutcomeOnSession(\n\t\t\t\t\t\tpinnedSession,\n\t\t\t\t\t\tinput.operation.request,\n\t\t\t\t\t\tverdicts,\n\t\t\t\t\t);\n\t\t});\n\t} catch (error) {\n\t\tif (error instanceof PgCommitDeterministicFailureError) throw error;\n\t\tif (error instanceof PgCommitAcknowledgementAmbiguousError)\n\t\t\treturn { kind: 'outcome-transport-ambiguous', reason: error.message };\n\t\treturn refusal(detail(error));\n\t}\n}\n\n/**\n * Commits claim first, then commits executing before invoking the token-gated\n * sender. The optional checkpoint makes that inter-commit/send boundary\n * observable to recovery tests without changing the production sequence.\n */\nasync function runPgNonTransactionalOutcomeOnSession(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeNonTransactionalRequest,\n\tverdicts: AdmissionVerdicts,\n): Promise<PgOutcomeResult> {\n\tconst admission = await openPgOutcomeClaimOnSession(\n\t\texecutor,\n\t\trequest,\n\t\tverdicts.run,\n\t);\n\tif (admission.kind !== 'admitted-outcome-claim') return admission;\n\tlet executingCommitted = false;\n\tconst recoveryRequired = (reason: string): PgOutcomeResult => ({\n\t\tkind: 'outcome-recovery-required',\n\t\tclaimId: admission.plan.claimId,\n\t\treason,\n\t});\n\ttry {\n\t\tawait begin(executor, request.lockTimeoutMs);\n\t\tconst executingLock = await acquirePgLedgerLocks(\n\t\t\texecutor,\n\t\t\thomesFor(request),\n\t\t);\n\t\tif (executingLock.kind !== 'acquired') {\n\t\t\tawait rollback(executor);\n\t\t\treturn refusal('ledger advisory lock is busy');\n\t\t}\n\t\tawait checkpoint(request.observer, 'post-lock-integrity-before-append');\n\t\tconst executingPostLockEvidence = await createPostLockAdmissionEvidence(\n\t\t\texecutor,\n\t\t\texecutingLock.proof,\n\t\t);\n\t\tconst executingLiveAdmission = await checkLiveAdmission(\n\t\t\texecutingPostLockEvidence,\n\t\t);\n\t\tif ('kind' in executingLiveAdmission) {\n\t\t\tawait rollback(executor);\n\t\t\treturn executingLiveAdmission;\n\t\t}\n\t\tconst executingIntegrity = await validatePgLedgerRuntimeIntegrity(\n\t\t\texecutor,\n\t\t\thomesFor(request),\n\t\t\tverdicts.run,\n\t\t);\n\t\tif (executingIntegrity) {\n\t\t\tawait rollback(executor);\n\t\t\treturn executingIntegrity;\n\t\t}\n\t\tconst target = targetForPlan(request.plan);\n\t\tconst liveAdmissionRefusal = request.verifyLiveAdmission\n\t\t\t? await request.verifyLiveAdmission(executor, admission.plan)\n\t\t\t: undefined;\n\t\tconst vacancy = liveAdmissionRefusal\n\t\t\t? undefined\n\t\t\t: await verifyCreationVacancy(executor, admission, request.vacancy);\n\t\tif (liveAdmissionRefusal || vacancy) {\n\t\t\tawait rollback(executor);\n\t\t\tawait begin(executor, request.lockTimeoutMs);\n\t\t\tconst terminalLock = await acquirePgLedgerLocks(\n\t\t\t\texecutor,\n\t\t\t\thomesFor(request),\n\t\t\t);\n\t\t\tif (terminalLock.kind !== 'acquired') {\n\t\t\t\tawait rollback(executor);\n\t\t\t\treturn refusal('ledger advisory lock is busy');\n\t\t\t}\n\t\t\tawait checkpoint(request.observer, 'post-lock-integrity-before-append');\n\t\t\tawait createPostLockAdmissionEvidence(executor, terminalLock.proof);\n\t\t\tawait refuseClaim(\n\t\t\t\texecutor,\n\t\t\t\tadmission,\n\t\t\t\trequest,\n\t\t\t\trequest.resolution.eventId,\n\t\t\t\tliveAdmissionRefusal ? 'ERR-05' : 'ERR-02',\n\t\t\t);\n\t\t\tawait commitPgOutcome(executor, request.observer);\n\t\t\treturn liveAdmissionRefusal ?? vacancy!;\n\t\t}\n\t\tconst executingPredecessor = await currentTerminalPredecessor(\n\t\t\texecutor,\n\t\t\ttarget,\n\t\t\tadmission.plan.address,\n\t\t);\n\t\tif (!executingPredecessor)\n\t\t\tthrow new Error(\n\t\t\t\t`claim ${admission.plan.claimId} has no current terminal`,\n\t\t\t);\n\t\tawait appendPgLedgerProgress(executor, target, {\n\t\t\teventId: request.executingEventId,\n\t\t\t...(admission.plan.executionId === undefined\n\t\t\t\t? {}\n\t\t\t\t: { executionId: admission.plan.executionId }),\n\t\t\t...(admission.plan.plannedClaimKey === undefined\n\t\t\t\t? {}\n\t\t\t\t: { plannedClaimKey: admission.plan.plannedClaimKey }),\n\t\t\t...(admission.plan.claimGroupId === undefined\n\t\t\t\t? {}\n\t\t\t\t: { claimGroupId: admission.plan.claimGroupId }),\n\t\t\t...(admission.plan.rootClaimId === undefined\n\t\t\t\t? {}\n\t\t\t\t: { rootClaimId: admission.plan.rootClaimId }),\n\t\t\taddress: request.plan.address,\n\t\t\teventKind: 'executing',\n\t\t\tpredecessor: executingPredecessor,\n\t\t});\n\t\tawait commitPgOutcome(executor, request.observer);\n\t\texecutingCommitted = true;\n\t\tawait request.onExecutingCommitted?.();\n\t\tconst sent = await sendPgAdmittedBundle(executor, {\n\t\t\tpermit: mintAdmittedPermit(\n\t\t\t\tadmission,\n\t\t\t\tverdicts.digestBinding,\n\t\t\t\tverdicts.validatedManifest,\n\t\t\t\tverdicts.approvalScope,\n\t\t\t\texecutingLiveAdmission,\n\t\t\t\texecutingPostLockEvidence,\n\t\t\t),\n\t\t\tstatements: admission.plan.statementBundle.statements,\n\t\t});\n\t\tif (sent) return recoveryRequired(sent.reason);\n\t\tawait checkpoint(request.observer, 'ddl-completed-before-read-back');\n\t\tawait begin(executor, request.lockTimeoutMs);\n\t\tconst terminalLock = await acquirePgLedgerLocks(\n\t\t\texecutor,\n\t\t\thomesFor(request),\n\t\t);\n\t\tif (terminalLock.kind !== 'acquired') {\n\t\t\tawait rollback(executor);\n\t\t\treturn recoveryRequired('ledger advisory lock is busy');\n\t\t}\n\t\tawait checkpoint(request.observer, 'post-lock-integrity-before-append');\n\t\tawait createPostLockAdmissionEvidence(executor, terminalLock.proof);\n\t\tconst terminalIntegrity = await validatePgLedgerRuntimeIntegrity(\n\t\t\texecutor,\n\t\t\thomesFor(request),\n\t\t\tverdicts.run,\n\t\t);\n\t\tif (terminalIntegrity) {\n\t\t\tawait rollback(executor);\n\t\t\treturn recoveryRequired(terminalIntegrity.reason);\n\t\t}\n\t\tconst terminalPredecessor = await currentTerminalPredecessor(\n\t\t\texecutor,\n\t\t\ttarget,\n\t\t\tadmission.plan.address,\n\t\t);\n\t\tif (!terminalPredecessor)\n\t\t\tthrow new Error(\n\t\t\t\t`claim ${admission.plan.claimId} has no current terminal`,\n\t\t\t);\n\t\tawait appendOutcomeTerminal(\n\t\t\texecutor,\n\t\t\ttarget,\n\t\t\tawait terminalResolutionMember(\n\t\t\t\texecutor,\n\t\t\t\trequest,\n\t\t\t\tadmission,\n\t\t\t\tterminalPredecessor,\n\t\t\t),\n\t\t\trequest.plan.claimId,\n\t\t\trequest.reservations,\n\t\t);\n\t\tawait commitPgOutcome(executor, request.observer);\n\t\treturn { kind: 'executed-outcome-claim', claim: admission };\n\t} catch (error) {\n\t\tawait rollback(executor);\n\t\tif (error instanceof PgCommitDeterministicFailureError) throw error;\n\t\tif (error instanceof PgCommitAcknowledgementAmbiguousError)\n\t\t\tif (executingCommitted) return recoveryRequired(error.message);\n\t\tif (error instanceof PgCommitAcknowledgementAmbiguousError)\n\t\t\treturn { kind: 'outcome-transport-ambiguous', reason: error.message };\n\t\tif (executingCommitted) {\n\t\t\tmarkPgOutcomeSessionCompromised(executor, error);\n\t\t\treturn recoveryRequired(detail(error));\n\t\t}\n\t\tmarkPgOutcomeSessionCompromised(executor, error);\n\t\treturn refusal(detail(error));\n\t}\n}\n\n/**\n * Reads an address's chain and live catalogue in one locked transaction before\n * appending the core classifier's instruction. It never calls the DDL sink.\n */\nexport async function recoverPgOutcomeClaim(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeRecoveryRequest,\n): Promise<PgOutcomeRecoveryResult> {\n\treturn withPgOutcomeSession(executor, (session) =>\n\t\trecoverPgOutcomeClaimOnSession(session, request),\n\t);\n}\n\nasync function recoverPgOutcomeClaimOnSession(\n\texecutor: TransitionJournalQueryable,\n\trequest: PgOutcomeRecoveryRequest,\n): Promise<PgOutcomeRecoveryResult> {\n\tlet begun = false;\n\ttry {\n\t\tif (request.reservations.length === 0)\n\t\t\treturn refusal(\n\t\t\t\t'outcome recovery reservation subset is not the live open claim',\n\t\t\t);\n\t\tawait begin(executor, request.lockTimeoutMs);\n\t\tbegun = true;\n\t\tconst target = targetForAddress(request.address, 'recovery target');\n\t\tconst homes = [target];\n\t\tfor (const reservation of request.reservations) {\n\t\t\tif (reservation.address.scope === 'database')\n\t\t\t\thomes.push({ scope: 'database' });\n\t\t\telse if (reservation.address.schema)\n\t\t\t\thomes.push({ scope: 'schema', schema: reservation.address.schema });\n\t\t\telse\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`schema-scoped recovery reservation ${reservation.address.name} has no schema address`,\n\t\t\t\t);\n\t\t}\n\t\tconst lock = await acquirePgLedgerLocks(executor, homes);\n\t\tif (lock.kind !== 'acquired') {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn refusal(\n\t\t\t\tlock.kind === 'busy'\n\t\t\t\t\t? 'ledger advisory lock is busy'\n\t\t\t\t\t: detail(lock.error),\n\t\t\t);\n\t\t}\n\t\tlet postLockEvidence: PostLockAdmissionEvidence;\n\t\ttry {\n\t\t\tpostLockEvidence = await createPostLockAdmissionEvidence(\n\t\t\t\texecutor,\n\t\t\t\tlock.proof,\n\t\t\t\tundefined,\n\t\t\t\trequest.ledgerShapeAllowance,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror instanceof PgLedgerPhysicalShapeValidationError &&\n\t\t\t\terror.outcome.kind !== 'shape-wrong'\n\t\t\t) {\n\t\t\t\t// The session can be gone with the catalogue read, so its rollback\n\t\t\t\t// acknowledgement is not evidence against the pending outcome.\n\t\t\t\tawait rollback(executor);\n\t\t\t\tbegun = false;\n\t\t\t\treturn {\n\t\t\t\t\tkind: 'outcome-recovery-pending',\n\t\t\t\t\taddress: request.address,\n\t\t\t\t\treason: detail(error),\n\t\t\t\t\treasonCode: 'catalogue-unavailable',\n\t\t\t\t};\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tconst liveAdmission = await checkLiveAdmission(postLockEvidence);\n\t\tif ('kind' in liveAdmission) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn liveAdmission;\n\t\t}\n\t\tconst integrity = await validatePgLedgerRuntimeIntegrity(executor, homes);\n\t\tif (integrity) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn integrity;\n\t\t}\n\t\tconst currencyHomes = new Set<string>();\n\t\tfor (const home of homes) {\n\t\t\tconst homeKey = `${home.scope}:${home.schema ?? ''}`;\n\t\t\tif (currencyHomes.has(homeKey)) continue;\n\t\t\tcurrencyHomes.add(homeKey);\n\t\t\tconst currency = await readPgLedgerScopeCurrency(executor, home);\n\t\t\tif (currency.kind !== 'current') {\n\t\t\t\tawait executor.query('ROLLBACK');\n\t\t\t\tbegun = false;\n\t\t\t\treturn currencyRefusal(currency);\n\t\t\t}\n\t\t}\n\t\tconst chain = await readPgLedgerAddressChain(\n\t\t\texecutor,\n\t\t\ttarget,\n\t\t\trequest.address,\n\t\t);\n\t\tlet recoveryObservation: PgOutcomeRecoveryObservation | undefined;\n\t\tlet classification = await classifyOutcomeRecovery({\n\t\t\tprojection: projectLedgerChain(chain),\n\t\t\tacceptedExternalDdlExclusion: request.acceptedExternalDdlExclusion,\n\t\t\t...(request.resolveIndeterminate === undefined\n\t\t\t\t? {}\n\t\t\t\t: { resolveIndeterminate: request.resolveIndeterminate }),\n\t\t\t...(request.indeterminateEvidence === undefined\n\t\t\t\t? {}\n\t\t\t\t: { indeterminateEvidence: request.indeterminateEvidence }),\n\t\t\tcatalogue: async (address) => {\n\t\t\t\ttry {\n\t\t\t\t\trecoveryObservation = await readLockedPgOutcomeRecoveryReadBack(\n\t\t\t\t\t\texecutor,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\trequest.readBack,\n\t\t\t\t\t\trequest.operationReadBack,\n\t\t\t\t\t\trequest.lockTimeoutMs,\n\t\t\t\t\t);\n\t\t\t\t\treturn recoveryObservation.readBack;\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn { kind: 'catalogue-unavailable', reason: detail(error) };\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tif (classification.kind !== 'outcome-recovery-append') {\n\t\t\tawait commitRecoveryNonAppend(executor, classification, request.observer);\n\t\t\tbegun = false;\n\t\t\treturn classification;\n\t\t}\n\t\t// Recovery is also an admitted resolution: bind the append to the live\n\t\t// open claim and its complete reservation subset rather than accepting a\n\t\t// caller-supplied terminal alone.\n\t\tconst projection = projectLedgerChain(chain);\n\t\tconst rootClaimId = classification.resolution.rootClaimId;\n\t\tif (\n\t\t\tprojection.kind !== 'projected-ledger-chain' ||\n\t\t\tprojection.openClaim?.event.eventId !== rootClaimId ||\n\t\t\trequest.reservations.length === 0 ||\n\t\t\t!request.reservations.some((row) =>\n\t\t\t\tsameLedgerAddress(row.address, request.address),\n\t\t\t)\n\t\t) {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn refusal(\n\t\t\t\t'outcome recovery reservation subset is not the live open claim',\n\t\t\t);\n\t\t}\n\t\tif (requiresFinalRecoveryTerminalRead(request.address, classification)) {\n\t\t\tif (!recoveryObservation)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`recovery ${request.address.name} has no operation observation to verify before append`,\n\t\t\t\t);\n\t\t\tconst initialRecoveryObservation = recoveryObservation;\n\t\t\tclassification = await classifyOutcomeRecovery({\n\t\t\t\tprojection,\n\t\t\t\tacceptedExternalDdlExclusion: request.acceptedExternalDdlExclusion,\n\t\t\t\t...(request.resolveIndeterminate === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { resolveIndeterminate: request.resolveIndeterminate }),\n\t\t\t\t...(request.indeterminateEvidence === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { indeterminateEvidence: request.indeterminateEvidence }),\n\t\t\t\tcatalogue: async (address) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn await readFinalPgOutcomeRecoveryReadBack(\n\t\t\t\t\t\t\texecutor,\n\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t\tinitialRecoveryObservation,\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treturn { kind: 'catalogue-unavailable', reason: detail(error) };\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (classification.kind !== 'outcome-recovery-append') {\n\t\t\t\tawait commitRecoveryNonAppend(\n\t\t\t\t\texecutor,\n\t\t\t\t\tclassification,\n\t\t\t\t\trequest.observer,\n\t\t\t\t);\n\t\t\t\tbegun = false;\n\t\t\t\treturn classification;\n\t\t\t}\n\t\t}\n\t\tconst append = await appendPgOutcomeResolution(\n\t\t\texecutor,\n\t\t\ttarget,\n\t\t\trecoveryResolutionMember(\n\t\t\t\trequest.address,\n\t\t\t\trequest.resolutionEventId,\n\t\t\t\tclassification.resolution,\n\t\t\t),\n\t\t\tclassification.resolution.rootClaimId,\n\t\t\trequest.reservations,\n\t\t);\n\t\tif (append.kind === 'malformed-outcome-resolution') {\n\t\t\tawait executor.query('ROLLBACK');\n\t\t\tbegun = false;\n\t\t\treturn refusal(append.reason);\n\t\t}\n\t\tawait commitPgOutcome(executor, request.observer);\n\t\tbegun = false;\n\t\treturn { kind: 'outcome-recovery-appended', classification, append };\n\t} catch (error) {\n\t\tif (begun) await rollback(executor);\n\t\tif (error instanceof PgCommitDeterministicFailureError) throw error;\n\t\tif (error instanceof PgCommitAcknowledgementAmbiguousError)\n\t\t\treturn { kind: 'outcome-transport-ambiguous', reason: error.message };\n\t\tmarkPgOutcomeSessionCompromised(executor, error);\n\t\treturn refusal(detail(error));\n\t}\n}\n"],"mappings":"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","names":["identifier","base","name","qualified","table","identifiers","identifier","POSTGRESQL_CAPABILITIES","quote","table","POSTGRESQL_CAPABILITIES","table","table","table","table","table","table","table","table","qualifyTable","table","unique","gen","table","table","qualifyTable","pkName","sup","table","record","address","named","detail","record","table","column","fkName","address","address","address","isRecord","exactKeys","targetBinding","payload","table","oid","quoteIdent","address","events","detail","createHash","result","createHash","createHash","ledgerAddressParentJson","table","ledgerSchema","quoteIdent","eventTable","ledgerAddressParentJson","address","addressKey","createHash","result","quoteIdent","qualified","table","detail","address","qualified","detail","isPoolQueryable","isConfirmedPgServerError","pgSqlState","checkpoint","address","liveAdmission","refusal","unique","targetForAddress","homesFor","oid","terminalLock"]}