Repository navigation
feat(codegen-ts): generate Prisma schema from the model - #502
Merged
Merged
Conversation
…risma" (#479) A project that keeps Prisma as its ORM now declares each field once, in the MetaObjects model, and the build fails when Prisma and the model drift. - New `prisma-schema` reference generator (`prismaSchemaFile()`), for the postgresql, mysql and sqlite providers. It builds on the expected schema that `meta migrate` writes and `meta verify --db` compares against. It maps types, ids, defaults, nullability, enums, relations, unique keys, indexes, @map/@@Map and Postgres @@Schema. CHECK constraints go in a companion schema.checks.sql. What Prisma cannot express is refused with an ERR_PRISMA_* code, not dropped. Hand edits are overwritten, so `verify --codegen` fails on one. The generator is ejectable and byte-identical to its reference copy. - New `orm` config switch. `orm: "prisma"` defaults every target to runtime: false and refuses runtime: true and the Drizzle-bound generators (queries, routes, routes-hono, callable). `orm: "drizzle"` is the default. - migrate-ts: a new `@metaobjectsdev/migrate-ts/expected` subpath (no kysely). `@default: "now"` is now the expression now(), so Postgres no longer stamps every row with the table's creation time. SQLite verify accepts BOOLEAN, DECIMAL(p,s) and TRUE/FALSE defaults as the INTEGER, NUMERIC and 1/0 they store as. - Tests: goldens for all three providers and every refusal; an integration test running `prisma validate` and `prisma format`, `verify --codegen`, and `prisma db push` then `meta verify --db` on SQLite and real Postgres, passing and then failing on drift. The Postgres half runs in the ts-slow lane. - Docs: docs/recipes/prisma.md plus its codegen-skill mirror, the TS port doc, the README matrix, llms.txt, and the fit-assessment notes that said no generator targets Prisma.
# Conflicts: # CHANGELOG.md
# Conflicts: # CHANGELOG.md
…d objects, drop handEdits
…ecks in changelog
…le facts remain. No edits made.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #479.
Gate: one no-mistakes run (run
01M61G2D993T3D3PBVFNHM3QA9, three review fix rounds inside it). CI step skipped by triage (--skip ci).What Changed
prisma-schemareference generator (prismaSchemaFile(), ejectable viameta eject prisma-schema). Withorm: "prisma"inmetaobjects.config.ts,meta genwritesschema.prismafor thepostgresql,mysqlorsqliteprovider. Types, ids, defaults, nullability, enums, relations, unique keys, indexes,@map/@@mapand Postgres@schemaare mapped. CHECK constraints the model implies go toschema.checks.sql, applied withprisma db execute --file.ERR_PRISMA_*codes instead of being dropped.orm: "prisma"defaults every target toruntime: falseand rejectsruntime: trueand the Drizzle-writing generators (queries,routes,routes-hono,callable). The defaultorm: "drizzle"is unchanged.meta verify --codegenfails on a stale or hand-editedschema.prisma.meta verify --dbchecks a Prisma-pushed Postgres database against the model, and fixes SQLite type-spelling drift (BOOLEAN/INTEGER,DECIMAL/NUMERIC,TRUE/1). Adds the@metaobjectsdev/migrate-ts/expectedsubpath, whichcodegen-tsnow imports.Validation
Risk Assessment
Testing
The pushed-then-verified SQLite scenario passed live through the real Prisma CLI. I also drove the refusals and mappings live through
meta gen. Flattened objects map to addressStreet with @Map("address_street"). A non-default @Schema is refused with ERR_PRISMA_UNSUPPORTED_SCHEMA on sqlite and mysql, and emitted as @@Schema on postgres. A flattened-object model passesmeta verify --dbafterprisma db push.ci-local.sh --quickflaggedreference templates lint(biome useTemplate on a string concatenation in the Prisma reference template). I fixed it in both byte-identical copies (src/reference/prisma-schema.ts and src/generators/prisma-schema-file.ts); the byte-identical test, prisma tests and the full gates lane are green afterwards. The stryker mutation completeness gate (1765 mutants) hit my timeout and did not finish. The Postgres db push integration case was skipped because MIGRATE_TS_PG_URL is unset. There is no UI surface, so no screenshots apply.scripts/ci-local.sh --only gatesafter fixEvidence: Live gen outputs (summary)
Pipeline
Updates from git push no-mistakes
✅ **Intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
server/typescript/packages/codegen-ts/src/prisma/build-prisma-schema.ts:181- The generator drops a write-through entity's replica view without an error. This breaks the module's own rule ('refused, never dropped') and the documented claim that a pushed database passesmeta verify --db.isManagedReadOnlyrefuses an object only when it has no writable source (!hasWritableRdbSource). A write-through entity (FR-024 §7:@role: primarytable plus a@role: replica@kind: viewsource) has a writable table, so it passes. Its view is then lost, becausebuildPrismaSchemareads onlysnapshot.tablesand never asks for views. The CLI'sverify --dbadds that view throughbuildProjectionViews(its second loop,root.objects().filter(isWriteThrough)), so the failure path is:prisma db pushfrom the generated schema, thenmeta verify --dbreports the view as missing, and the generator never said anything. Sibling sites with the same problem: (1) on MySQL the generator ignores@schema(multiSchemais Postgres-only, build-prisma-schema.ts:714-715), so tables that declare different schemas collapse into one namespace and the schema is lost without an error. (2) The other direction: a projection on@kind: storedProc/tableFunction/materializedViewis refused, and the message saysmeta verify --db'would report it missing'. That is false, becauseclassifyReadOnlySourceskips those kinds and verify does not expect them. Earliest shared fix: build the refusal set from whatverify --dbactually expects. CallbuildProjectionViews(root, { dialect })(it lives in codegen-ts) and refuse each view whosefqnobject passesmatches. On MySQL, refuse a non-default@schema, or emit@@schemathere too.server/typescript/packages/codegen-ts/src/prisma/build-prisma-schema.ts:676- An entity with afield.object @storage: "flattened"field makes the generator throw a plainError('no field of ... maps to column ...'). It never returns aPrismaSchemaErrorand never produces a model.flattenObjectFieldin migrate-ts expected-schema.ts expands the field into one column per nested value-object field, named<parent_col>_<nested_col>(for exampleaddress_street).fieldsByColumn(line 198) maps only the entity's own fields byresolveColumnName, so no entry matches those columns. Flattened storage is documented vocabulary, so a Prisma adopter who uses it gets an internal-looking crash, not a mapping or a named refusal. The column-type mappers (sqliteColumnType,mysqlColumnType) also need the nested field's subtype. Fix: map each flattened column to its nested field, with a synthesized Prisma name such asaddressStreetand@map("address_street"). Or refuse it with aPrismaSchemaErrorcode that names the field and the fix.server/typescript/packages/codegen-ts/src/generators/prisma-schema-file.ts:53- Simplification: thehandEditsoption ofprismaSchemaFile()(also in reference/prisma-schema.ts:73, the registryoptionsstring and the recipe) is not needed for the stated intent, which is one place to declare a field and a build that fails on drift. It also contradicts the generator's own reasoning. The header says a merged hand edit 'would change the database without the model knowing', yet the option lets an adopter set"merge"/"keep"and do exactly that. An adopter who wants different behaviour can eject the generator. Recommended remedy: remove the option and hard-codehandEdits: "overwrite".docs/recipes/prisma.md:149- Fixed the refusal table'sERR_PRISMA_UNSUPPORTED_INDEXrow. It said every@usingis refused, but the code maps Postgreshash/gin/gist/brin/spgistto@@index(type: ...)and refuses only other methods. Made the same edit in the three mirrors so recipe-mirrors and agent-context-conformance stay byte-equal: agent-context/skills/metaobjects-codegen/references/typescript-prisma.md:128, and fixtures/agent-context-conformance/{ts-react-tanstack,ts-requirements}/expected/.claude/skills/metaobjects-codegen/references/typescript-prisma.md:128.CHANGELOG.md:26- Corrected the CHANGELOG claim that a database pushed byprisma db push'passesmeta verify --db... on Postgres and SQLite'. On SQLite,checks: "omit"is required, and the gate reports each missing CHECK, as the recipe and the integration test both state. The entry now says that Postgres passes once the checks file is applied, and that SQLite reports only the missing CHECKs.docs/recipes/prisma.md:149- The newERR_PRISMA_UNSUPPORTED_INDEXrow says a@usingmethod other than Postgreshash/gin/gist/brin/spgistis refused. That wording is still wrong for one case:build-prisma-schema.tsindexAttributesalso accepts@using: btreeon every provider (ix.using.toLowerCase() !== "btree"), so a btree index is never refused. Change the cell to read: "... or a@usingmethod other thanbtreeor, on Postgres,hash,gin,gist,brinorspgist". Make the same edit in the three byte-equal mirrors: agent-context/skills/metaobjects-codegen/references/typescript-prisma.md:128 and fixtures/agent-context-conformance/{ts-react-tanstack,ts-requirements}/expected/.claude/skills/metaobjects-codegen/references/typescript-prisma.md:128.🔧 Fix applied.
7 issues (5 warnings, 2 infos) still open:
server/typescript/packages/codegen-ts/src/prisma/build-prisma-schema.ts:181- The generator drops a write-through entity's replica view without an error. This breaks the module's own rule ('refused, never dropped') and the documented claim that a pushed database passesmeta verify --db.isManagedReadOnlyrefuses an object only when it has no writable source (!hasWritableRdbSource). A write-through entity (FR-024 §7:@role: primarytable plus a@role: replica@kind: viewsource) has a writable table, so it passes. Its view is then lost, becausebuildPrismaSchemareads onlysnapshot.tablesand never asks for views. The CLI'sverify --dbadds that view throughbuildProjectionViews(its second loop,root.objects().filter(isWriteThrough)), so the failure path is:prisma db pushfrom the generated schema, thenmeta verify --dbreports the view as missing, and the generator never said anything. Sibling sites with the same problem: (1) on MySQL the generator ignores@schema(multiSchemais Postgres-only, build-prisma-schema.ts:714-715), so tables that declare different schemas collapse into one namespace and the schema is lost without an error. (2) The other direction: a projection on@kind: storedProc/tableFunction/materializedViewis refused, and the message saysmeta verify --db'would report it missing'. That is false, becauseclassifyReadOnlySourceskips those kinds and verify does not expect them. Earliest shared fix: build the refusal set from whatverify --dbactually expects. CallbuildProjectionViews(root, { dialect })(it lives in codegen-ts) and refuse each view whosefqnobject passesmatches. On MySQL, refuse a non-default@schema, or emit@@schemathere too.server/typescript/packages/codegen-ts/src/prisma/build-prisma-schema.ts:676- An entity with afield.object @storage: "flattened"field makes the generator throw a plainError('no field of ... maps to column ...'). It never returns aPrismaSchemaErrorand never produces a model.flattenObjectFieldin migrate-ts expected-schema.ts expands the field into one column per nested value-object field, named<parent_col>_<nested_col>(for exampleaddress_street).fieldsByColumn(line 198) maps only the entity's own fields byresolveColumnName, so no entry matches those columns. Flattened storage is documented vocabulary, so a Prisma adopter who uses it gets an internal-looking crash, not a mapping or a named refusal. The column-type mappers (sqliteColumnType,mysqlColumnType) also need the nested field's subtype. Fix: map each flattened column to its nested field, with a synthesized Prisma name such asaddressStreetand@map("address_street"). Or refuse it with aPrismaSchemaErrorcode that names the field and the fix.server/typescript/packages/codegen-ts/src/generators/prisma-schema-file.ts:53- Simplification: thehandEditsoption ofprismaSchemaFile()(also in reference/prisma-schema.ts:73, the registryoptionsstring and the recipe) is not needed for the stated intent, which is one place to declare a field and a build that fails on drift. It also contradicts the generator's own reasoning. The header says a merged hand edit 'would change the database without the model knowing', yet the option lets an adopter set"merge"/"keep"and do exactly that. An adopter who wants different behaviour can eject the generator. Recommended remedy: remove the option and hard-codehandEdits: "overwrite".docs/recipes/prisma.md:149- Fixed the refusal table'sERR_PRISMA_UNSUPPORTED_INDEXrow. It said every@usingis refused, but the code maps Postgreshash/gin/gist/brin/spgistto@@index(type: ...)and refuses only other methods. Made the same edit in the three mirrors so recipe-mirrors and agent-context-conformance stay byte-equal: agent-context/skills/metaobjects-codegen/references/typescript-prisma.md:128, and fixtures/agent-context-conformance/{ts-react-tanstack,ts-requirements}/expected/.claude/skills/metaobjects-codegen/references/typescript-prisma.md:128.CHANGELOG.md:26- Corrected the CHANGELOG claim that a database pushed byprisma db push'passesmeta verify --db... on Postgres and SQLite'. On SQLite,checks: "omit"is required, and the gate reports each missing CHECK, as the recipe and the integration test both state. The entry now says that Postgres passes once the checks file is applied, and that SQLite reports only the missing CHECKs.docs/recipes/prisma.md:149- The newERR_PRISMA_UNSUPPORTED_INDEXrow says a@usingmethod other than Postgreshash/gin/gist/brin/spgistis refused. That wording is still wrong for one case:build-prisma-schema.tsindexAttributesalso accepts@using: btreeon every provider (ix.using.toLowerCase() !== "btree"), so a btree index is never refused. Change the cell to read: "... or a@usingmethod other thanbtreeor, on Postgres,hash,gin,gist,brinorspgist". Make the same edit in the three byte-equal mirrors: agent-context/skills/metaobjects-codegen/references/typescript-prisma.md:128 and fixtures/agent-context-conformance/{ts-react-tanstack,ts-requirements}/expected/.claude/skills/metaobjects-codegen/references/typescript-prisma.md:128.server/typescript/packages/codegen-ts/src/prisma/build-prisma-schema.ts:683- Fix round 2 (the @Schema sibling of prisma-write-through-view-dropped) addedrefuseSchemafor non-Postgres providers, and the CHANGELOG and recipe say a@schemaoutside Postgres gets an ERR_PRISMA_* code. That holds for MySQL only. Onprovider: "sqlite",buildExpectedSchemaWithProvenance(root, { dialect: "sqlite" })(line 672) throws first. migrate-ts expected-schema.ts:329-336 throws a plainError('sqlite does not support DB schemas; ...')for any table with a@schema, including objectsmatcheswould exclude. SorefuseSchemais unreachable for sqlite, and the sqlite case is neither aPrismaSchemaErrornor filterable. The new test covers mysql only. Fix: check@schemafor sqlite before building the expected schema (or build the schema with the postgres dialect for the check) so sqlite also raises ERR_PRISMA_UNSUPPORTED_SCHEMA and respectsmatches; add a sqlite case to the test.🔧 Fix applied.
9 issues (6 warnings, 3 infos) still open:
server/typescript/packages/codegen-ts/src/prisma/build-prisma-schema.ts:181- The generator drops a write-through entity's replica view without an error. This breaks the module's own rule ('refused, never dropped') and the documented claim that a pushed database passesmeta verify --db.isManagedReadOnlyrefuses an object only when it has no writable source (!hasWritableRdbSource). A write-through entity (FR-024 §7:@role: primarytable plus a@role: replica@kind: viewsource) has a writable table, so it passes. Its view is then lost, becausebuildPrismaSchemareads onlysnapshot.tablesand never asks for views. The CLI'sverify --dbadds that view throughbuildProjectionViews(its second loop,root.objects().filter(isWriteThrough)), so the failure path is:prisma db pushfrom the generated schema, thenmeta verify --dbreports the view as missing, and the generator never said anything. Sibling sites with the same problem: (1) on MySQL the generator ignores@schema(multiSchemais Postgres-only, build-prisma-schema.ts:714-715), so tables that declare different schemas collapse into one namespace and the schema is lost without an error. (2) The other direction: a projection on@kind: storedProc/tableFunction/materializedViewis refused, and the message saysmeta verify --db'would report it missing'. That is false, becauseclassifyReadOnlySourceskips those kinds and verify does not expect them. Earliest shared fix: build the refusal set from whatverify --dbactually expects. CallbuildProjectionViews(root, { dialect })(it lives in codegen-ts) and refuse each view whosefqnobject passesmatches. On MySQL, refuse a non-default@schema, or emit@@schemathere too.server/typescript/packages/codegen-ts/src/prisma/build-prisma-schema.ts:676- An entity with afield.object @storage: "flattened"field makes the generator throw a plainError('no field of ... maps to column ...'). It never returns aPrismaSchemaErrorand never produces a model.flattenObjectFieldin migrate-ts expected-schema.ts expands the field into one column per nested value-object field, named<parent_col>_<nested_col>(for exampleaddress_street).fieldsByColumn(line 198) maps only the entity's own fields byresolveColumnName, so no entry matches those columns. Flattened storage is documented vocabulary, so a Prisma adopter who uses it gets an internal-looking crash, not a mapping or a named refusal. The column-type mappers (sqliteColumnType,mysqlColumnType) also need the nested field's subtype. Fix: map each flattened column to its nested field, with a synthesized Prisma name such asaddressStreetand@map("address_street"). Or refuse it with aPrismaSchemaErrorcode that names the field and the fix.server/typescript/packages/codegen-ts/src/generators/prisma-schema-file.ts:53- Simplification: thehandEditsoption ofprismaSchemaFile()(also in reference/prisma-schema.ts:73, the registryoptionsstring and the recipe) is not needed for the stated intent, which is one place to declare a field and a build that fails on drift. It also contradicts the generator's own reasoning. The header says a merged hand edit 'would change the database without the model knowing', yet the option lets an adopter set"merge"/"keep"and do exactly that. An adopter who wants different behaviour can eject the generator. Recommended remedy: remove the option and hard-codehandEdits: "overwrite".docs/recipes/prisma.md:149- Fixed the refusal table'sERR_PRISMA_UNSUPPORTED_INDEXrow. It said every@usingis refused, but the code maps Postgreshash/gin/gist/brin/spgistto@@index(type: ...)and refuses only other methods. Made the same edit in the three mirrors so recipe-mirrors and agent-context-conformance stay byte-equal: agent-context/skills/metaobjects-codegen/references/typescript-prisma.md:128, and fixtures/agent-context-conformance/{ts-react-tanstack,ts-requirements}/expected/.claude/skills/metaobjects-codegen/references/typescript-prisma.md:128.CHANGELOG.md:26- Corrected the CHANGELOG claim that a database pushed byprisma db push'passesmeta verify --db... on Postgres and SQLite'. On SQLite,checks: "omit"is required, and the gate reports each missing CHECK, as the recipe and the integration test both state. The entry now says that Postgres passes once the checks file is applied, and that SQLite reports only the missing CHECKs.docs/recipes/prisma.md:149- The newERR_PRISMA_UNSUPPORTED_INDEXrow says a@usingmethod other than Postgreshash/gin/gist/brin/spgistis refused. That wording is still wrong for one case:build-prisma-schema.tsindexAttributesalso accepts@using: btreeon every provider (ix.using.toLowerCase() !== "btree"), so a btree index is never refused. Change the cell to read: "... or a@usingmethod other thanbtreeor, on Postgres,hash,gin,gist,brinorspgist". Make the same edit in the three byte-equal mirrors: agent-context/skills/metaobjects-codegen/references/typescript-prisma.md:128 and fixtures/agent-context-conformance/{ts-react-tanstack,ts-requirements}/expected/.claude/skills/metaobjects-codegen/references/typescript-prisma.md:128.server/typescript/packages/codegen-ts/src/prisma/build-prisma-schema.ts:683- Fix round 2 (the @Schema sibling of prisma-write-through-view-dropped) addedrefuseSchemafor non-Postgres providers, and the CHANGELOG and recipe say a@schemaoutside Postgres gets an ERR_PRISMA_* code. That holds for MySQL only. Onprovider: "sqlite",buildExpectedSchemaWithProvenance(root, { dialect: "sqlite" })(line 672) throws first. migrate-ts expected-schema.ts:329-336 throws a plainError('sqlite does not support DB schemas; ...')for any table with a@schema, including objectsmatcheswould exclude. SorefuseSchemais unreachable for sqlite, and the sqlite case is neither aPrismaSchemaErrornor filterable. The new test covers mysql only. Fix: check@schemafor sqlite before building the expected schema (or build the schema with the postgres dialect for the check) so sqlite also raises ERR_PRISMA_UNSUPPORTED_SCHEMA and respectsmatches; add a sqlite case to the test.server/typescript/packages/codegen-ts/src/index.ts:492- The package-root export list for the Prisma error codes omitsERR_PRISMA_UNSUPPORTED_SCHEMA. The constant is defined inprisma/prisma-errors.ts:11, listed inPRISMA_ERROR_CODES, raised byrefuseSchemainbuild-prisma-schema.ts, and documented in the recipe and the skill mirrors. The other seven codes are exported. The index comment says the pure stages are public so an owned (ejected) copy 'imports only this package'. A consumer that catchesPrismaSchemaErrorand comparese.codeto this one constant cannot import it from@metaobjectsdev/codegen-ts. The in-repo test imports it fromsrc/prisma/prisma-errors.js, so nothing fails today. Fix: addERR_PRISMA_UNSUPPORTED_SCHEMAto the export block at index.ts:486-492.CHANGELOG.md:29- The entry says what a Prisma schema cannot express 'is refused with anERR_PRISMA_*code, never dropped'. On MySQL,checksOf(build-prisma-schema.ts:623-638) silently leaves out every CHECK that is not enum membership (thevalidator.lengthandvalidator.numericchecks). It does this without an error andmeta verify --dbdoes not support MySQL, so nothing reports them. The recipe table and 'SQLite and MySQL' section state this, but the CHANGELOG sentence reads as absolute. Reword it to say MySQL gets the enum checks only, as the recipe does.🔧 Fix applied.
3 infos still open:
docs/recipes/prisma.md:149- Fixed the refusal table'sERR_PRISMA_UNSUPPORTED_INDEXrow. It said every@usingis refused, but the code maps Postgreshash/gin/gist/brin/spgistto@@index(type: ...)and refuses only other methods. Made the same edit in the three mirrors so recipe-mirrors and agent-context-conformance stay byte-equal: agent-context/skills/metaobjects-codegen/references/typescript-prisma.md:128, and fixtures/agent-context-conformance/{ts-react-tanstack,ts-requirements}/expected/.claude/skills/metaobjects-codegen/references/typescript-prisma.md:128.CHANGELOG.md:26- Corrected the CHANGELOG claim that a database pushed byprisma db push'passesmeta verify --db... on Postgres and SQLite'. On SQLite,checks: "omit"is required, and the gate reports each missing CHECK, as the recipe and the integration test both state. The entry now says that Postgres passes once the checks file is applied, and that SQLite reports only the missing CHECKs.server/typescript/packages/codegen-ts/src/reference/prisma-schema.ts:20- The header of the ejected template listsprismaChecksFileNamenext tofileNameas an option that decides where the files land. There is no such option:PrismaSchemaFileOptionshas no field of that name, andprismaChecksFileNameis a private function (line 91) that derives<name>.checks.sqlfromfileName. An adopter who reads the header and passesprismaChecksFileNamegets a type error. Fix: delete the name from the parenthesis, and say the checks file name followsfileName.✅ **Test** - passed
✅ No issues found.
scripts/ci-local.sh --only gatesafter fixscripts/ci-local.sh --only ts-fast --only ts-unit --strict-toolchainsbun test test/prisma test/reference-byte-identical.test.ts test/generator-registry.test.ts test/metaobjects-config.test.tsin codegen-ts (192 pass)bun test test/integration/prisma-schema.test.tsin cli: real gen, prisma validate/format, prisma db push, meta verify --codegen and --db on SQLite (4 pass, Postgres case skipped)Temporary driver (deleted afterwards): realmeta genfor flattened-object fields on postgres and sqlite, and @schema on sqlite, mysql and postgresTemporary driver: flattened-object model on sqlite, prisma db push, then meta verify --db (exit 0)scripts/ci-local.sh --quick: conformance typescript and ts unit suites passed; run killed at my 590s cap during the stryker mutation gatescripts/ci-local.sh --only gatesafter the lint fix: all gates green✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.