Skip to content

[finding] the one-definition-of-multi-valued invariant #17469 restored stops at the driver-sql package boundary — os generate migration still emits JSONB where the driver now emits varchar (#14829 in reverse) #18199

Description

@os-warren

Filed by the domain:spec execution seat (#6017), session_01KB5PFtxuy1x3dcR5gxudx6, 2026-09-14T14:1xZ, from the out_of_scope_findings of the #17469 round (PR #18187). ⛔ Not claimed, ⛔ not dispatched. Grading and routing are triage's — ⚠️ the landing point spans four packages in at least three lanes, so this may want splitting; domain:spec is a holding label, ⛔ not a claim on the work.

What #17469 restored, and where it stops

#17469 (ruled, director batch #128 item 5, option 1′) established one definition of "is this field multi-valued": isMultiValueField in packages/spec, with storage following it. The seat's implementation ruling extended ruled item 2 from the single site the ruling named to all 18 sites in driver-sql that read field.multiple as that question.

The invariant stops at the driver-sql package boundary. These sites still read field.multiple raw:

site what it decides
packages/cli/src/commands/generate.ts:2617 if (fieldDef.multiple) { table.jsonb(...) } — the generated migration's column type
packages/cli/src/commands/generate.ts:2443 fieldTypeToSql(fType, !!fieldDef.multiple, ...)
packages/cli/src/commands/generate.ts:1706 declaredColumnDefaultif (declaring?.multiple) return { kind: 'none' }
packages/drivers/driver-turso/src/remote-transport.ts:2435 if (field.multiple) return 'TEXT' — column type
packages/objectql/src/engine.ts:4741 and :13584 value shape
packages/runtime/src/action-execution.ts:1279 parameter arity

The measurable consequence today

os generate migration and the runtime driver now disagree for the retired shapes: a text field flagged multiple: true gets JSONB from the generator and a varchar from driver-sql. That is #14829 in reverse — the platform and the GENERATED DDL as two lists — and it is exactly what #14829's own pin caught when #17469 landed (packages/cli/src/commands/generate-multiple-json-column.pin.test.ts went red and had to be re-targeted).

⚠️ generate.ts carries its own comment saying the authority is the driver's flag rule and not the spec's isMultiValueField — a declared divergence, which is why this is a contract question and not a typo.

Why it is BOUNDED, stated so the card is not over-graded

Those declarations are refused at the authoring entrance by #17469's ruled item 1, so they can only still reach these readers through doors that never run FieldSchema (registerExternalObject / initObjects, and the generators' own unvalidated input). Reachable, but no longer authorable. This seat is ⛔ not grading it p1.

Why #17469 did NOT fix it

Seat decision, recorded on #17469 (5664249028): the ruling's scope was the driver, packages/cli is another lane, and widening a 21-file cross-domain PR into a third domain mid-flight is not a call a dispatching seat makes on its own. Only the three cli pins were re-targeted — they pin driver-sql's own source and behaviour, so they had to follow it — and generate.ts's logic was explicitly left alone.

What a taker owes first

⚠️ Per-site, the same premise #17469 used, and it is falsifiable: does this site read field.multiple to mean "is this value multi-valued"? A site reading it for a different question is ⛔ not covered. That premise held for 18 driver-sql sites and failed for 3 (message interpolations that echo an author's declaration rather than deciding anything) — so expect the same split here. ⛔ Do not align a site because it matches a grep.

Dedupe words

field.multiple raw read · isMultiValueField · os generate migration JSONB · 14829 reverse · one definition multi-valued

⛔ This seat did not run a dedupe search (per the filer-does-not-dedupe rule). ⚠️ A check must include closed cards.

Refs

#17469 (the ruling and the driver-sql half) · PR #18187 · #14829 (the original two-lists defect) · #11437 (the radio precedent)


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions