Repository navigation
sql-driver: one emission-identity source — loud refusal for redshift/cockroachdb DDL, pgnative joins the Postgres family (#11756 ruling) #11991
Description
Activity
{ "issue": 11991, "branch": "claude/issue-11991-emission-identity-source", "pr": "https://github.com/objectstack-ai/objectstack/pull/12591", "status": "done", "premise_still_valid": true, "premiseReverified": "Partly stale, re-measured and reported in the PR. The #11756 ruling itself was re-verified on GitHub (issue closed `completed`; comment 5404884704 stands as quoted) rather than taken from the dispatch summary. On origin/main at b307bfd2ae the three tables were ALREADY converged onto one source (PR #11783 introduced POSTGRES_EMIT_CLIENTS / SQLITE_EMIT_CLIENTS / MYSQL_EMIT_CLIENTS; #11784 gave redshift its timeout row), so the card's 2026-08-24 drift reading ('identity getter only pg/postgresql, timeout table also cockroachdb, wire table also redshift') no longer describes the tree. What was NOT converged is the EXTENSION: the pair cockroachdb+redshift was hand-written into DIALECT_CONNECT_TIMEOUT and again into POSTGRES_WIRE_CLIENTS, and the new refusal would have been a third copy. Part 1 therefore landed as naming that extension once (POSTGRES_WIRE_ONLY_CLIENTS). No line numbers are quoted anywhere in the PR; every anchor is a symbol name.", "summary": "Landed all five parts of the #11756 ruling. POSTGRES_WIRE_ONLY_CLIENTS = {cockroachdb, redshift} is the one declared extension; POSTGRES_WIRE_CLIENTS and the pg arm of DIALECT_CONNECT_TIMEOUT are now POSTGRES_EMIT_CLIENTS union that set, and SqlDriver.assertDialectEmits (called from the existing assertSchemaMutable choke point, after the unchanged schemaMode check) refuses exactly its members with UnsupportedDialectEmissionError — code SQL_DIALECT_EMISSION_UNSUPPORTED, status 501, structured client/operation/supportedClients, and a message rendered from the driver's own tables naming the supported clients and the skipSchemaSync / OS_SKIP_SCHEMA_SYNC=1 posture. It throws before ensureDatabaseExists and before the first hasTable probe, pinned with a real round-trip proving no table was created. pgnative was added to POSTGRES_EMIT_CLIENTS; its wire-table and connect-timeout memberships arrived by derivation with NO edit to either table, which is itself the proof the derivation is real. The code is registered under a new '@objectstack/driver-sql' key in ERROR_CODE_LEDGER because it IS wire-reachable (engine.syncObjectSchema -> syncSchema -> DDL gate on a live server) — the same test #8035 applied when it UNregistered MONGODB_MULTI_TENANT_UNSUPPORTED. mariadb is untouched and now pinned as neither recognised nor refused, because the refusal is keyed on the named set rather than on dialectName === 'unknown'. Part 4's rewrite of the deliberately-pinned #11756 block was done as its own act with the ruling named on the line.", "clause2": "yes", "clause2_evidence": "git diff --stat b307bfd2ae..d215aaa903 = 7 files, 807 insertions, 69 deletions: .changeset/sql-emission-identity-one-source.md (+55) | packages/drivers/driver-sql/src/dialect-emission-refusal.ts (+135) | packages/drivers/driver-sql/src/index.ts (+11) | packages/drivers/driver-sql/src/sql-driver-11550-dialect-client-spellings.test.ts (147 changed) | packages/drivers/driver-sql/src/sql-driver-11991-emission-identity-refusal.test.ts (+296) | packages/drivers/driver-sql/src/sql-driver.ts (215 changed) | packages/spec/src/api/error-code-ledger.zod.ts (+17). REJECT direction: a redshift/cockroachdb datasource that previously completed schema sync now throws at the DDL gate (measured: DDL gate PROCEEDS before, REFUSED SQL_DIALECT_EMISSION_UNSUPPORTED / 501 after). ACCEPT direction: pgnative gains emission identity, a different DATE default, a connect bound and the #11389 wire parser (isPostgres false->true, dialectName unknown->postgres, nowDefault(date) CURRENT_TIMESTAMP -> (timezone('utc', now())::date)). SURFACE: error-code-ledger.zod.ts gains a member of the generated ErrorCode union and driver-sql's index exports a new error class, code, status constant and renderer. Matches the card's expected 'yes'; needs:contract-review already on the card.", "tests": "Union re-derived AFTER the final commit d215aaa903 with `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` (6 paths, 176 families discovered, --repo assertion holds). Every exit code captured before any pipe.", "gates": { "green": [ "@objectstack/driver-sql full suite — Test Files 138 passed | 8 skipped (146); Tests 2125 passed | 127 skipped (2252)", "@objectstack/driver-sql typecheck (tsc --noEmit) exit 0", "@objectstack/spec typecheck — 'check:test-typecheck: OK — @objectstack/spec's test layer compiles under packages/spec/tsconfig.test.json; 55 file(s) / 263 error(s) held' (unchanged)", "@objectstack/spec src/api + type-alias-convention.pin — Test Files 40 passed (40); Tests 1257 passed (1257)", "@objectstack/driver-sqlite-wasm — Test Files 25 passed (25); Tests 395 passed (395)", "@objectstack/driver-turso — Tests 1001 passed (1001); one file failed to COLLECT on 'Failed to resolve entry for package @objectstack/verify' (unbuilt closure, not a finding) and passes Test Files 1 passed (1) after building the closure", "pnpm lint (whole repo, eslint . --no-inline-config) exit 0, no findings — run in FULL, so no narrowing to justify", "check:dispatcher-error-vocabulary — 'OK — 21 unregistered code-stamping site(s), all classified' (count unchanged: the new code is registered, so it is not a site)", "check:error-code-casing exit 0", "check:error-status-conformance — '✓ every derivable runtime status is documented, and every documented status is reachable.'", "check-adr-0087-registration — '✓ 1 declared-breaking changeset(s), each carrying an ADR-0087 disposition' (not-required (no-migration-prescription))", "check:nul-bytes — 'check-nul-bytes: OK (scanned 6939 text file(s); no raw ASCII control bytes)'", "check:driver-conformance, check:engine-double-contract, check:where-matcher, check:objectql-double-limit, check:query-options-erasure, check:test-source-alias, check:cross-package-test-inputs (+ scripts/check-cross-package-test-inputs.mjs), check:type-source-resolution, check:published-files, check:page-declaration-shape, check:slot-lookup, check:type-check-coverage, check-comment-mask-adoption, check-plugin-teardown-shape, check-ci-filter-parity — all exit 0", "check:authorable-surface, check:liveness, check:empty-state, check:strictness-ledger, check:variant-docs, check:spec-parsed-alias, check:doc-authoring, check:doc-formula-expressions, check:merge-driver — all exit 0", "check:changeset-gate-self-tests, check:objectui-changeset, check-changeset-no-major, check-empty-changeset, release-rehearsal-clone --self-test, docs-audit/check-affected-docs — all exit 0, re-run on the final commit" ], "red": [], "notMeasured": [ "check:type-check-debt (--re-measure) — refuses without the whole workspace built; its STRUCTURAL half check:type-check-coverage is green. CI owns it.", "docs-audit/check-drift-comment — needs PR context that does not exist locally.", "Live PG/MySQL cells: 8 skipped files / 127 skipped tests across driver-sql, and 3 skipped in sql-driver-11389-date-tz-skew.test.ts ('set OS_TEST_POSTGRES_URL' / 'OS_TEST_MYSQL_URL'). No PG or MySQL server in this container; CI's 'Temporal Conformance (live PG + MySQL)' runs them. pgnative's new wire pin is asserted through the recording-connection probe, NOT against a live server — a skip is declared here, never counted as a pass.", "The 48 downstream consumers of driver-sql were NOT swept in full. DECLARED NARROWING to the two packages that actually subclass SqlDriver and inherit the changed gate (driver-sqlite-wasm, driver-turso). Both resolve SqlDriver through package exports -> dist, so driver-sql was rebuilt first and dist reach proved on disk: SQL_DIALECT_EMISSION_UNSUPPORTED x1, POSTGRES_WIRE_ONLY_CLIENTS x11, 'pgnative' x1 in dist/index.js." ] }, "ablations": [ { "leg": "remove the refusal — SqlDriver.assertDialectEmits returns unconditionally", "predictionWrittenFirst": "Recorded to scratchpad/issue-11991/ablation-prediction.txt BEFORE the mutation ran. Direction: RED (baseline 0 failures for these two files). Exact count: 5 tests, named individually. Also predicted to stay GREEN: every pgnative case, the wire/timeout membership cases, and both not.toThrow() cases — an absent refusal cannot redden an assertion that nothing is thrown.", "mutationProvedOnDisk": "grep -cF on the original predicate 'if (!SqlDriver.POSTGRES_WIRE_ONLY_CLIENTS.has(client)) return;' 1 -> 0; grep -cF on the injected marker 'OS-ABLATION-11991' 0 -> 1; git diff --stat = 1 file changed, 1 insertion, 1 deletion. All three read BEFORE any test result. The script aborts on an anchor count != 1 and voids the reading if the post-mutation counts disagree.", "result": "5 failed | 24 passed — the five predicted tests, by name: (11991) 'initObjects refuses with ONE coded, actionable error', 'the message names the client, the supported set and the way out', 'refuses BEFORE any DDL runs — nothing is half-built', 'emission and the refusal are complements, never overlapping'; (11550) 'redshift and cockroachdb parse pg wire and are REFUSED for DDL'. Prediction matched exactly, direction and count.", "rebuild": "NOT required for this leg, checked rather than assumed: both suites import './sql-driver.js' RELATIVE inside the same package, so vitest resolves the mutated SOURCE with no exports->dist hop. The dist hazard belongs to driver-sqlite-wasm / driver-turso, neither of which is run in this leg (they were run separately, after a real rebuild with dist reach proved).", "restore": "trap '<restore>' EXIT INT TERM fired ('RESTORED (trap)'). Verified: git diff --stat empty, git status --short empty, predicate back at count 1, marker at count 0.", "wrapperExitCaveat": "The verify-lock wrapper printed 'VERDICT command-exit 0' for that hold while the inner vitest exit was 1 — exactly the trap the dispatch warned about. The per-command exit is the verdict quoted." } ], "openQuestions": [], "out_of_scope_findings": [], "observationsNotFiled": [ "scripts/pm/dispatch-gates.mjs reports 9 gate families whose declared population matches nothing in the tree ('THE LAYOUT MOVED under a gate that still spells the old path — a real miss, worth triaging'): check:api-surface, check:dual-source-exports, check:entry-nameability, check:export-origins, check:exported-any, check:meta-url-spelling, check:spec-changes, check:strictness-ledger, check:upgrade-guide. NOT FILED, and the reason is a limit rather than a judgement: the mandated pre-filing dedup read is REST-only, and this seat's token cannot reach repos/{owner}/{repo}/issues ('GitHub access is not enabled for this session') — only the MCP path answers, which the dispatch channel rule forbids for this read. The tool prints this on EVERY dispatch for EVERY card, so a card is very likely already open. Handing it to PM to triage rather than minting a probable duplicate." ] }
Generated by Claude Code
os-dev-report
(Authoritative copy. The comment immediately above carries the same JSON but its first-line
os-dev-reportHTML-comment marker was stripped by GitHub's body sanitizer on save — read-back confirmed the comment now begins with a bare newline, so a marker scan cannot see it. Per the marker discipline this copy leads with the literal text instead. Ignore the previous comment.){ "issue": 11991, "branch": "claude/issue-11991-emission-identity-source", "pr": "https://github.com/objectstack-ai/objectstack/pull/12591", "status": "done", "premise_still_valid": true, "premiseReverified": "Partly stale, re-measured and reported in the PR. The #11756 ruling itself was re-verified on GitHub (issue closed `completed`; comment 5404884704 stands as quoted) rather than taken from the dispatch summary. On origin/main at b307bfd2ae the three tables were ALREADY converged onto one source (PR #11783 introduced POSTGRES_EMIT_CLIENTS / SQLITE_EMIT_CLIENTS / MYSQL_EMIT_CLIENTS; #11784 gave redshift its timeout row), so the card's 2026-08-24 drift reading ('identity getter only pg/postgresql, timeout table also cockroachdb, wire table also redshift') no longer describes the tree. What was NOT converged is the EXTENSION: the pair cockroachdb+redshift was hand-written into DIALECT_CONNECT_TIMEOUT and again into POSTGRES_WIRE_CLIENTS, and the new refusal would have been a third copy. Part 1 therefore landed as naming that extension once (POSTGRES_WIRE_ONLY_CLIENTS). No line numbers are quoted anywhere in the PR; every anchor is a symbol name.", "summary": "Landed all five parts of the #11756 ruling. POSTGRES_WIRE_ONLY_CLIENTS = {cockroachdb, redshift} is the one declared extension; POSTGRES_WIRE_CLIENTS and the pg arm of DIALECT_CONNECT_TIMEOUT are now POSTGRES_EMIT_CLIENTS union that set, and SqlDriver.assertDialectEmits (called from the existing assertSchemaMutable choke point, after the unchanged schemaMode check) refuses exactly its members with UnsupportedDialectEmissionError — code SQL_DIALECT_EMISSION_UNSUPPORTED, status 501, structured client/operation/supportedClients, and a message rendered from the driver's own tables naming the supported clients and the skipSchemaSync / OS_SKIP_SCHEMA_SYNC=1 posture. It throws before ensureDatabaseExists and before the first hasTable probe, pinned with a real round-trip proving no table was created. pgnative was added to POSTGRES_EMIT_CLIENTS; its wire-table and connect-timeout memberships arrived by derivation with NO edit to either table, which is itself the proof the derivation is real. The code is registered under a new '@objectstack/driver-sql' key in ERROR_CODE_LEDGER because it IS wire-reachable (engine.syncObjectSchema to syncSchema to the DDL gate on a live server) — the same test #8035 applied when it UNregistered MONGODB_MULTI_TENANT_UNSUPPORTED. mariadb is untouched and now pinned as neither recognised nor refused, because the refusal is keyed on the named set rather than on dialectName === 'unknown'. Part 4's rewrite of the deliberately-pinned #11756 block was done as its own act with the ruling named on the line.", "clause2": "yes", "clause2_evidence": "git diff --stat b307bfd2ae..d215aaa903 = 7 files, 807 insertions, 69 deletions: .changeset/sql-emission-identity-one-source.md (+55) | packages/drivers/driver-sql/src/dialect-emission-refusal.ts (+135) | packages/drivers/driver-sql/src/index.ts (+11) | packages/drivers/driver-sql/src/sql-driver-11550-dialect-client-spellings.test.ts (147 changed) | packages/drivers/driver-sql/src/sql-driver-11991-emission-identity-refusal.test.ts (+296) | packages/drivers/driver-sql/src/sql-driver.ts (215 changed) | packages/spec/src/api/error-code-ledger.zod.ts (+17). REJECT direction: a redshift/cockroachdb datasource that previously completed schema sync now throws at the DDL gate (measured: DDL gate PROCEEDS before, REFUSED SQL_DIALECT_EMISSION_UNSUPPORTED / 501 after). ACCEPT direction: pgnative gains emission identity, a different DATE default, a connect bound and the #11389 wire parser (isPostgres false to true, dialectName unknown to postgres, nowDefault(date) CURRENT_TIMESTAMP to (timezone('utc', now())::date)). SURFACE: error-code-ledger.zod.ts gains a member of the generated ErrorCode union and driver-sql's index exports a new error class, code, status constant and renderer. Matches the card's expected 'yes'; needs:contract-review already on the card.", "tests": "Union re-derived AFTER the final commit d215aaa903 with `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` (6 paths, 176 families discovered, --repo assertion holds). Every exit code captured before any pipe.", "gates": { "green": [ "@objectstack/driver-sql full suite — Test Files 138 passed | 8 skipped (146); Tests 2125 passed | 127 skipped (2252)", "@objectstack/driver-sql typecheck (tsc --noEmit) exit 0", "@objectstack/spec typecheck — 'check:test-typecheck: OK — @objectstack/spec test layer compiles under packages/spec/tsconfig.test.json; 55 file(s) / 263 error(s) held' (unchanged)", "@objectstack/spec src/api + type-alias-convention.pin — Test Files 40 passed (40); Tests 1257 passed (1257)", "@objectstack/driver-sqlite-wasm — Test Files 25 passed (25); Tests 395 passed (395)", "@objectstack/driver-turso — Tests 1001 passed (1001); one file failed to COLLECT on 'Failed to resolve entry for package @objectstack/verify' (unbuilt closure, not a finding) and passes Test Files 1 passed (1) after building the closure", "pnpm lint (whole repo, eslint . --no-inline-config) exit 0, no findings — run in FULL, so no narrowing to justify", "check:dispatcher-error-vocabulary — 'OK — 21 unregistered code-stamping site(s), all classified' (count unchanged: the new code is registered, so it is not a site)", "check:error-code-casing exit 0", "check:error-status-conformance — 'every derivable runtime status is documented, and every documented status is reachable.'", "check-adr-0087-registration — '1 declared-breaking changeset(s), each carrying an ADR-0087 disposition' (not-required (no-migration-prescription))", "check:nul-bytes — 'check-nul-bytes: OK (scanned 6939 text file(s); no raw ASCII control bytes)'", "check:driver-conformance, check:engine-double-contract, check:where-matcher, check:objectql-double-limit, check:query-options-erasure, check:test-source-alias, check:cross-package-test-inputs (+ scripts/check-cross-package-test-inputs.mjs), check:type-source-resolution, check:published-files, check:page-declaration-shape, check:slot-lookup, check:type-check-coverage, check-comment-mask-adoption, check-plugin-teardown-shape, check-ci-filter-parity — all exit 0", "check:authorable-surface, check:liveness, check:empty-state, check:strictness-ledger, check:variant-docs, check:spec-parsed-alias, check:doc-authoring, check:doc-formula-expressions, check:merge-driver — all exit 0", "check:changeset-gate-self-tests, check:objectui-changeset, check-changeset-no-major, check-empty-changeset, release-rehearsal-clone --self-test, docs-audit/check-affected-docs — all exit 0, re-run on the final commit" ], "red": [], "notMeasured": [ "check:type-check-debt (--re-measure) — refuses without the whole workspace built; its STRUCTURAL half check:type-check-coverage is green. CI owns it.", "docs-audit/check-drift-comment — needs PR context that does not exist locally.", "Live PG/MySQL cells: 8 skipped files / 127 skipped tests across driver-sql, and 3 skipped in sql-driver-11389-date-tz-skew.test.ts ('set OS_TEST_POSTGRES_URL' / 'OS_TEST_MYSQL_URL'). No PG or MySQL server in this container; CI's 'Temporal Conformance (live PG + MySQL)' runs them. pgnative's new wire pin is asserted through the recording-connection probe, NOT against a live server — a skip is declared here, never counted as a pass.", "The 48 downstream consumers of driver-sql were NOT swept in full. DECLARED NARROWING to the two packages that actually subclass SqlDriver and inherit the changed gate (driver-sqlite-wasm, driver-turso). Both resolve SqlDriver through package exports to dist, so driver-sql was rebuilt first and dist reach proved on disk: SQL_DIALECT_EMISSION_UNSUPPORTED x1, POSTGRES_WIRE_ONLY_CLIENTS x11, 'pgnative' x1 in dist/index.js." ] }, "ablations": [ { "leg": "remove the refusal — SqlDriver.assertDialectEmits returns unconditionally", "predictionWrittenFirst": "Recorded to scratchpad/issue-11991/ablation-prediction.txt BEFORE the mutation ran. Direction: RED (baseline 0 failures for these two files). Exact count: 5 tests, named individually. Also predicted to stay GREEN: every pgnative case, the wire/timeout membership cases, and both not.toThrow() cases — an absent refusal cannot redden an assertion that nothing is thrown.", "mutationProvedOnDisk": "grep -cF on the original predicate 'if (!SqlDriver.POSTGRES_WIRE_ONLY_CLIENTS.has(client)) return;' went 1 to 0; grep -cF on the injected marker 'OS-ABLATION-11991' went 0 to 1; git diff --stat = 1 file changed, 1 insertion, 1 deletion. All three read BEFORE any test result. The script aborts on an anchor count != 1 and voids the reading if the post-mutation counts disagree.", "result": "5 failed | 24 passed — the five predicted tests, by name: (11991) 'initObjects refuses with ONE coded, actionable error', 'the message names the client, the supported set and the way out', 'refuses BEFORE any DDL runs — nothing is half-built', 'emission and the refusal are complements, never overlapping'; (11550) 'redshift and cockroachdb parse pg wire and are REFUSED for DDL'. Prediction matched exactly, direction and count.", "rebuild": "NOT required for this leg, checked rather than assumed: both suites import './sql-driver.js' RELATIVE inside the same package, so vitest resolves the mutated SOURCE with no package-exports-to-dist hop. The dist hazard belongs to driver-sqlite-wasm / driver-turso, neither of which is run in this leg (they were run separately, after a real rebuild with dist reach proved).", "restore": "trap RESTORE on EXIT INT TERM fired (printed 'RESTORED (trap)'). Verified: git diff --stat empty, git status --short empty, predicate back at count 1, marker at count 0.", "wrapperExitCaveat": "The verify-lock wrapper printed 'VERDICT command-exit 0' for that hold while the inner vitest exit was 1 — exactly the trap the dispatch warned about. The per-command exit is the verdict quoted." } ], "openQuestions": [], "out_of_scope_findings": [], "observationsNotFiled": [ "scripts/pm/dispatch-gates.mjs reports 9 gate families whose declared population matches nothing in the tree ('THE LAYOUT MOVED under a gate that still spells the old path — a real miss, worth triaging'): check:api-surface, check:dual-source-exports, check:entry-nameability, check:export-origins, check:exported-any, check:meta-url-spelling, check:spec-changes, check:strictness-ledger, check:upgrade-guide. NOT FILED, and the reason is a limit rather than a judgement: the mandated pre-filing dedup read is REST-only, and this seat's token cannot reach repos/{owner}/{repo}/issues ('GitHub access is not enabled for this session') — only the MCP path answers, which the dispatch channel rule forbids for this read. The tool prints this on EVERY dispatch for EVERY card, so a card is very likely already open. Handing it to PM to triage rather than minting a probable duplicate." ] }
Generated by Claude Code
Claim record — posted retroactively, and the reason it is late is a failure of mine
- Session:
session_01W6HFzyH98W1YaQXhJUJt6o(domain:enginePM seat, seat post [PM seat] domain:engine — ⏳ vacant #6367) - Branch:
claude/issue-11991-emission-identity-source - Dispatched: 2026-08-26 ~12:30Z. This record: ~13:56Z, after the work landed as PR sql-driver: one emission-identity source — loud DDL refusal for redshift/cockroachdb, pgnative joins the Postgres family #12591.
I assigned this card and then posted the claim comment to the wrong issue — the text went to #5499 in the same turn. So from dispatch until now, #11991 carried an assignee and no evidence of which session held it.
That is not a bookkeeping nicety. All agents in this repo share one GitHub identity, which is exactly why a claim is defined as assign plus a comment carrying the session ID and branch: the assignee field cannot tell another seat whose claim it is. The prescribed check against double-dispatch is "re-read the comments before writing code" — and any seat that ran it on this card would have found only the triage note, and would have been entitled to take the card and duplicate the work.
The dev seat holding it noticed the card claimed a comment existed, verified none did, searched for a competing session ID, found none, proceeded, and reported the gap in its return rather than quietly assuming. That is the behaviour that contained this; the containment was theirs, not mine.
Recorded in §7 of the seat post. No competing claim was ever present, and nothing was duplicated.
Generated by Claude Code
- Session:
Implementation of the #11756 ruling (maintainer, 2026-08-25, verbatim 「同意」 on the presented 「C,但 pgnative 归入 Postgres 家族」; full record = #11756 comment 5404884704). Filed by PM session
session_01KWRU3s15AJz7PGW7a7wdChper the confirmed checklist.Content:
packages/drivers/driver-sql/src/sql-driver.ts(isPostgresgetter ·DIALECT_CONNECT_TIMEOUT·POSTGRES_WIRE_CLIENTS) into one emission-identity source, with the other tables as declared extensions over it. Premise-first: re-verify the spellings on the current tree (git grep -n "isPostgres\|DIALECT_CONNECT_TIMEOUT\|POSTGRES_WIRE_CLIENTS" origin/main -- packages/drivers/driver-sql/src/sql-driver.ts).redshift/cockroachdb: wire recognition stays (connection/parsing per driver-sql: every Field.date read from PostgreSQL is one day early when the process TZ is east of UTC — toDateOnly() reads UTC components off a local-midnight Date #11389, deliberate); ⛔ no emission identity. A configuration reaching the DDL-emission path gets an immediate named refusal with guidance (which configurations are supported) — never a silently mis-built table.pgnative: joins the Postgres family for emission (knex resolves it to the samepostgresqldialect — measured on [Decision] 会说 Postgres 方言的另外两种数据库(Redshift、CockroachDB),平台要不要当 Postgres 来建表?(#11550 的宽半边) #11756) AND enters the wire table (absent from both today), including the calendar-day parser pin the wire table carries.packages/drivers/driver-sql/src/sql-driver-11550-dialect-client-spellings.test.ts(landed by PR fix(driver-sql): recognise knex's canonicalpostgres/sqliteclient spellings in the dialect getters #11783 under a docblock naming [Decision] 会说 Postgres 方言的另外两种数据库(Redshift、CockroachDB),平台要不要当 Postgres 来建表?(#11550 的宽半边) #11756) — the rewrite IS the ruling landing; do it explicitly, never as refactor fallout.mariadb: ⛔ out of this ruling's scope — stays unrecognised; do not fold it in.Discipline: Clause-② — assess at claim time against the tree, expected yes (previously-proceeding configurations now refuse loudly;
pgnativegains emission — accept/reject behaviour changes in both directions); contract-review tier expected.Acceptance criterion: a stack configured with
redshiftorcockroachdbthat reaches DDL emission receives one named, actionable refusal (code + message pinned);pgnativebehaves identically topgfor emission and carries the wire parser pin; the emission-identity answer has exactly one source of truth.Reopening condition recorded on #11756: evidence of a real Redshift/CockroachDB customer reopens toward recognition, with a measured DDL boundary and the two databases judged separately.