Skip to content

TML-2751: wire symmetric domain plane (domain.namespaces)#653

Merged
wmadden merged 65 commits into
mainfrom
tml-symmetric-domain-plane
May 31, 2026
Merged

TML-2751: wire symmetric domain plane (domain.namespaces)#653
wmadden merged 65 commits into
mainfrom
tml-symmetric-domain-plane

Conversation

@wmadden-electric
Copy link
Copy Markdown
Contributor

Linked issue

Refs TML-2751

At a glance

Before — models lived at the contract root:

{
  "target": "postgres",
  "models": {
    "User": {
      "fields": { "id": { "nullable": false, "type": { "kind": "scalar", "codecId": "pg/int4@1" } } },
      "storage": { "table": "user", "fields": { "id": { "column": "id" } } }
    }
  },
  "storage": { "namespaces": { "__unbound__": { "tables": { "user": { } } } } }
}

After — the application plane is symmetric with storage; models and value objects sit under domain.namespaces:

{
  "target": "postgres",
  "domain": {
    "namespaces": {
      "__unbound__": {
        "models": {
          "User": {
            "fields": { "id": { "nullable": false, "type": { "kind": "scalar", "codecId": "pg/int4@1" } } },
            "storage": { "table": "user", "fields": { "id": { "column": "id" } } }
          }
        },
        "valueObjects": { }
      }
    }
  },
  "storage": { "namespaces": { "__unbound__": { "tables": { "user": { } } } } }
}

storage.namespaces is unchanged in shape and responsibility. The framework domain plane has no domain.types bucket (SQL storage types stay on storage only).

Why

ADR 221 calls for symmetric plane envelopes: both storage and domain carry a namespaces segment so extension packs and multi-namespace authoring compose the same way at each plane. Consumers stop reading flat contract.models / contract.valueObjects; runtime and DSL code use contract.domain.namespaces and helpers such as contractModels() / ContractModelsMap.

What changed

  • Contract IR, canonicalization, and validation emit and require domain.namespaces.
  • SQL and Mongo emitters, validators, and generated contract.d.ts include the domain envelope.
  • contractModels, ContractModelsMap, and ContractValueObjectsMap are the supported access paths; legacy flat domain roots are normalized at the boundary only.
  • SQL insert() / update row typing resolves models via ContractModelsMap (fixes never rows when only domain is populated).
  • Tests, examples, and tracked contract fixtures updated; pnpm fixtures:check passes.

Alternatives considered

PR #649 explored flattening storage (lifting tables out of storage.namespaces). That direction was abandoned in favour of this symmetric envelope: keep storage.namespaces as-is, add domain.namespaces for models/value objects, and avoid STORAGE_PLANE_RESERVED_KEYS or other storage reshaping.

Testing performed

  • pnpm fixtures:check
  • test/integration package pnpm typecheck
  • Full pnpm test:packages — last run: type errors clean; a few PGlite/MMS integration flakes in @prisma-next/adapter-postgres and unrelated packages (re-run on CI)
  • Full pnpm test:integration — not re-run end-to-end in this session after typecheck green; pretest build includes postgis demo (insert typing fixed via sql-builder)

Checklist

  • No domain.types on framework contracts
  • No storage flatten / STORAGE_PLANE_RESERVED_KEYS
  • Upgrade instructions not recorded (fixture/hash-only and test changes; no examples/ or packages/3-extensions/ source API changes requiring consumer migrations)

wmadden added 24 commits May 31, 2026 09:56
ADR 221 prescribed flat namespace keys under each plane, which mixes
plane-level metadata (storageHash, SQL storage.types) into the open
namespace map. Amend to { metadata?, namespaces } per plane, move the
grounding example codec alias to storage.types, and state explicitly
that framework domain has no types member.

Replan umbrella S2 as domain-plane wiring only (storage unchanged on
main). Add symmetric-domain-plane slice spec/plan. Cancels the flatten
direction attempted in closed PR #649.

Signed-off-by: Will Madden <madden@prisma.io>
Signed-off-by: Will Madden <madden@prisma.io>
Replace flat root models/valueObjects with domain.namespaces.<nsId>
slices in the Contract type, canonical emission, validation, and test
factories. Add contractModels/contractValueObjects helpers and legacy
JSON normalization for deserialize paths.

Signed-off-by: Will Madden <madden@prisma.io>
Mirror storage elementCoordinates over domain.namespaces without
reserved-key denylists; export from the IR surface.

Signed-off-by: Will Madden <madden@prisma.io>
Wire SQL builders, PSL interpreter, arktype schema, and emitters to the
domain plane envelope; remove erroneous domain.types spillover to
storage.types only.

Signed-off-by: Will Madden <madden@prisma.io>
Align Mongo schema, builder output, and deserializer normalization with
the symmetric domain plane shape.

Signed-off-by: Will Madden <madden@prisma.io>
Align testing factories and unit tests with DomainPlane typing after
the domain.namespaces substrate change.

Signed-off-by: Will Madden <madden@prisma.io>
Merge value-object entries across domain.namespaces at the type level so
family packages can infer VO maps without a flat contract.valueObjects root.

Signed-off-by: Will Madden <madden@prisma.io>
Use contractModels in validateMongoStorage and update mongo-contract tests
for the domain envelope shape and InferModelRow typing.

Signed-off-by: Will Madden <madden@prisma.io>
Read codec aliases from storage.types only, add contractModels helpers in
PSL/TS tests, and fix emitter type generation for the domain plane envelope.

Signed-off-by: Will Madden <madden@prisma.io>
contractModels and contractValueObjects accept either domain.namespaces
or pre-envelope flat models/valueObjects so emitters and tests can migrate
incrementally without breaking IR builders that still pass flat shapes.

Signed-off-by: Will Madden <madden@prisma.io>
Use ContractModelsMap for type-level model maps, contractModels and
contractValueObjects at runtime, and normalizeLegacyDomainRoot for JSON
fixtures still on the flat root. Relational-core column typing reads models
through ContractModelsMap so FieldOutputTypes resolve again.

Signed-off-by: Will Madden <madden@prisma.io>
Update in-repo tests, examples, and integration parity fixtures to read
models and value objects through domain.namespaces (or normalizeLegacyDomainRoot
for hand-authored JSON). Regenerated emitted contract.json and contract.d.ts
artifacts across examples, extensions, and test fixtures.

Signed-off-by: Will Madden <madden@prisma.io>
Wire TestContract through MongoContract<Storage, Models> with an explicit
__unbound__ namespace so ContractModelsMap keeps literal model keys.
Resolve nested value-object shapes via ContractValueObjectsMap instead of
legacy flat contract.valueObjects.

Signed-off-by: Will Madden <madden@prisma.io>
Use contractModels() and modelsFromCanonicalContract() where tests
previously asserted flat contract.models. Update emitter canonicalization
expectations for domain-before-storage key order.

Signed-off-by: Will Madden <madden@prisma.io>
Use bracket access for decoded row fields, compare User InferModelRow to
FieldOutputTypes, and assert polymorphic variant values via a type alias.

Signed-off-by: Will Madden <madden@prisma.io>
Narrow ContractBase.domain to __unbound__ with models and valueObjects so
ContractValueObjectsMap resolves for InferModelRow. Regenerate orm-contract
fixture and split User VO assertion to FieldOutputTypes.

Signed-off-by: Will Madden <madden@prisma.io>
Type decode fixture contracts through MongoContract<Storage, Models> and
use bracket field access in decode integration tests for index-signature
safety.

Signed-off-by: Will Madden <madden@prisma.io>
Signed-off-by: Will Madden <madden@prisma.io>
The spec still described the EA-era numbering (S2 = runtime
qualification, S3 = explicit DSL) while the plan had been rewritten to
a different numbering (S2 = domain plane). The two documents disagreed
about what every S-number meant. Replace the numbering with descriptive
unit names (domain-plane, public-by-default, runtime-qualification,
explicit-dsl) and bring the spec into sync with the plan.

Signed-off-by: Will Madden <madden@prisma.io>
FindModelForTable and FindFieldForColumn still read flat contract.models;
after the domain envelope move, that mapping was empty and insert() row types
collapsed to never. Use ContractModelsMap instead.

Signed-off-by: Will Madden <madden@prisma.io>
Regenerate tracked contract typings after domain.namespaces emission.
Fix mongo contract-builder model typing and DSL test accessors.

Signed-off-by: Will Madden <madden@prisma.io>
Inline Contract literals use buildDomainPlaneFromFlat; type tests use
ContractModelsMap and bracket namespace access; refresh value-object
mongo contract fixture to the domain envelope shape.

Signed-off-by: Will Madden <madden@prisma.io>
Align tracked contract typings with domain.namespaces emission output.

Signed-off-by: Will Madden <madden@prisma.io>
@wmadden-electric wmadden-electric requested a review from a team as a code owner May 31, 2026 09:52
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 31, 2026

Important

Review skipped

Too many files!

This PR contains 292 files, which is 142 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: f7068a3e-d3cd-4d73-9e52-02cc1fb97983

📥 Commits

Reviewing files that changed from the base of the PR and between f779815 and 6e6985b.

⛔ Files ignored due to path filters (8)
  • examples/bundle-size/src/mongo/generated/contract.d.ts is excluded by !**/generated/**
  • examples/bundle-size/src/mongo/generated/contract.json is excluded by !**/generated/**
  • examples/bundle-size/src/postgres/generated/contract.d.ts is excluded by !**/generated/**
  • examples/bundle-size/src/postgres/generated/contract.json is excluded by !**/generated/**
  • packages/2-sql/4-lanes/sql-builder/test/fixtures/generated/contract.d.ts is excluded by !**/generated/**
  • packages/2-sql/4-lanes/sql-builder/test/fixtures/generated/contract.json is excluded by !**/generated/**
  • packages/3-extensions/sql-orm-client/test/fixtures/generated/contract.d.ts is excluded by !**/generated/**
  • packages/3-extensions/sql-orm-client/test/fixtures/generated/contract.json is excluded by !**/generated/**
📒 Files selected for processing (292)
  • apps/telemetry-backend/src/prisma/contract.d.ts
  • apps/telemetry-backend/src/prisma/contract.json
  • docs/Testing Guide.md
  • docs/architecture docs/adrs/ADR 221 - Contract IR two planes with uniform entity coordinate and pack-contributed entity kinds.md
  • examples/mongo-blog-leaderboard/src/contract.d.ts
  • examples/mongo-blog-leaderboard/src/contract.json
  • examples/mongo-demo/migrations/app/20260409T1030_migration/end-contract.json
  • examples/mongo-demo/migrations/app/20260415_add-posts-author-index/end-contract.json
  • examples/mongo-demo/src/contract.d.ts
  • examples/mongo-demo/src/contract.json
  • examples/multi-extension-monorepo/app/src/contract.d.ts
  • examples/multi-extension-monorepo/app/src/contract.json
  • examples/multi-extension-monorepo/package.json
  • examples/multi-extension-monorepo/packages/audit/migrations/20260601T0000_create_audit_event/end-contract.d.ts
  • examples/multi-extension-monorepo/packages/audit/migrations/20260601T0000_create_audit_event/end-contract.json
  • examples/multi-extension-monorepo/packages/audit/migrations/20260601T0000_create_audit_event/migration.json
  • examples/multi-extension-monorepo/packages/audit/migrations/refs/head.json
  • examples/multi-extension-monorepo/packages/audit/src/contract.d.ts
  • examples/multi-extension-monorepo/packages/audit/src/contract.json
  • examples/multi-extension-monorepo/packages/feature-flags/migrations/20260601T0000_create_feature_flag/end-contract.d.ts
  • examples/multi-extension-monorepo/packages/feature-flags/migrations/20260601T0000_create_feature_flag/end-contract.json
  • examples/multi-extension-monorepo/packages/feature-flags/migrations/20260601T0000_create_feature_flag/migration.json
  • examples/multi-extension-monorepo/packages/feature-flags/migrations/refs/head.json
  • examples/multi-extension-monorepo/packages/feature-flags/src/contract.d.ts
  • examples/multi-extension-monorepo/packages/feature-flags/src/contract.json
  • examples/paradedb-demo/src/prisma/contract.d.ts
  • examples/paradedb-demo/src/prisma/contract.json
  • examples/prisma-next-cloudflare-worker/src/prisma/contract.d.ts
  • examples/prisma-next-cloudflare-worker/src/prisma/contract.json
  • examples/prisma-next-demo-sqlite/prisma/contract.d.ts
  • examples/prisma-next-demo-sqlite/prisma/contract.json
  • examples/prisma-next-demo-sqlite/src/prisma/contract.d.ts
  • examples/prisma-next-demo-sqlite/src/prisma/contract.json
  • examples/prisma-next-demo/migrations/app/20260422T0720_initial/end-contract.json
  • examples/prisma-next-demo/migrations/app/20260422T0742_migration/end-contract.json
  • examples/prisma-next-demo/migrations/app/20260422T0742_migration/start-contract.json
  • examples/prisma-next-demo/migrations/app/20260422T0748_migration/end-contract.json
  • examples/prisma-next-demo/migrations/app/20260422T0748_migration/start-contract.json
  • examples/prisma-next-demo/migrations/app/20260518T1701_namespaces_bookend/end-contract.json
  • examples/prisma-next-demo/migrations/app/20260518T1701_namespaces_bookend/start-contract.json
  • examples/prisma-next-demo/src/app/ContractView.test.tsx
  • examples/prisma-next-demo/src/app/ContractView.tsx
  • examples/prisma-next-demo/src/prisma/contract.d.ts
  • examples/prisma-next-demo/src/prisma/contract.json
  • examples/prisma-next-demo/test/demo-dx.integration.test.ts
  • examples/prisma-next-demo/test/demo-dx.types.test.ts
  • examples/prisma-next-demo/test/fixtures/basic-contract.json
  • examples/prisma-next-demo/test/no-emit-typed-flow.test-d.ts
  • examples/prisma-next-postgis-demo/migrations/app/20260512T1309_migration/end-contract.json
  • examples/prisma-next-postgis-demo/migrations/postgis/20260601T0000_install_postgis_extension/contract.json
  • examples/prisma-next-postgis-demo/migrations/postgis/contract.json
  • examples/prisma-next-postgis-demo/src/prisma/contract.d.ts
  • examples/prisma-next-postgis-demo/src/prisma/contract.json
  • examples/react-router-demo/src/prisma/contract.d.ts
  • examples/react-router-demo/src/prisma/contract.json
  • examples/retail-store/migrations/app/20260513T0505_initial/end-contract.json
  • examples/retail-store/migrations/app/20260513T0507_add_product_category_index/end-contract.json
  • examples/retail-store/migrations/app/20260513T0507_add_product_category_index/start-contract.json
  • examples/retail-store/migrations/app/20260513T0508_backfill_product_status/end-contract.json
  • examples/retail-store/migrations/app/20260513T0508_backfill_product_status/start-contract.json
  • examples/retail-store/src/contract.d.ts
  • examples/retail-store/src/contract.json
  • packages/1-framework/0-foundation/contract/package.json
  • packages/1-framework/0-foundation/contract/src/canonicalization.ts
  • packages/1-framework/0-foundation/contract/src/contract-types.ts
  • packages/1-framework/0-foundation/contract/src/contract-validation-error.ts
  • packages/1-framework/0-foundation/contract/src/domain-envelope.ts
  • packages/1-framework/0-foundation/contract/src/domain-types.ts
  • packages/1-framework/0-foundation/contract/src/exports/contract-validation-error.ts
  • packages/1-framework/0-foundation/contract/src/exports/testing.ts
  • packages/1-framework/0-foundation/contract/src/exports/types.ts
  • packages/1-framework/0-foundation/contract/src/hashing.ts
  • packages/1-framework/0-foundation/contract/src/validate-domain.ts
  • packages/1-framework/0-foundation/contract/test/canonicalization.test.ts
  • packages/1-framework/0-foundation/contract/test/contract-factories.test.ts
  • packages/1-framework/0-foundation/contract/test/contract-types.test-d.ts
  • packages/1-framework/0-foundation/contract/test/contract-types.test.ts
  • packages/1-framework/0-foundation/contract/test/support/application-domain-of.ts
  • packages/1-framework/0-foundation/contract/test/support/contract-factories.ts
  • packages/1-framework/0-foundation/contract/test/validate-domain.test.ts
  • packages/1-framework/0-foundation/contract/tsconfig.json
  • packages/1-framework/0-foundation/contract/tsdown.config.ts
  • packages/1-framework/0-foundation/contract/vitest.config.ts
  • packages/1-framework/1-core/framework-components/src/exports/ir.ts
  • packages/1-framework/1-core/framework-components/src/ir/domain.ts
  • packages/1-framework/1-core/framework-components/src/ir/storage.ts
  • packages/1-framework/1-core/framework-components/test/domain-element-coordinates.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migration-list.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/migration-status-aggregate-spaces.test.ts
  • packages/1-framework/3-tooling/cli/test/commands/read-commands-json-golden.test.ts
  • packages/1-framework/3-tooling/cli/test/control-api/contract-enrichment.test.ts
  • packages/1-framework/3-tooling/cli/test/control-api/db-verify.per-member-verifier.test.ts
  • packages/1-framework/3-tooling/cli/test/load-ts-contract.test.ts
  • packages/1-framework/3-tooling/cli/test/utils/contract-space-seed-phase.mongo.test.ts
  • packages/1-framework/3-tooling/cli/test/utils/plan-resolution.test.ts
  • packages/1-framework/3-tooling/emitter/README.md
  • packages/1-framework/3-tooling/emitter/src/generate-contract-dts.ts
  • packages/1-framework/3-tooling/emitter/test/canonicalization.test.ts
  • packages/1-framework/3-tooling/emitter/test/emitter.integration.test.ts
  • packages/1-framework/3-tooling/emitter/test/emitter.roundtrip.test.ts
  • packages/1-framework/3-tooling/emitter/test/emitter.test.ts
  • packages/1-framework/3-tooling/emitter/test/utils.ts
  • packages/1-framework/3-tooling/migration/package.json
  • packages/1-framework/3-tooling/migration/src/refs/snapshot.ts
  • packages/1-framework/3-tooling/migration/test/aggregate/contract-at.test.ts
  • packages/1-framework/3-tooling/migration/test/aggregate/loader.catastrophic-io.test.ts
  • packages/1-framework/3-tooling/migration/test/aggregate/loader.test.ts
  • packages/1-framework/3-tooling/migration/test/aggregate/planner.test.ts
  • packages/1-framework/3-tooling/migration/test/aggregate/project-schema-to-space.test.ts
  • packages/1-framework/3-tooling/migration/test/aggregate/strategies/graph-walk.test.ts
  • packages/1-framework/3-tooling/migration/test/aggregate/strategies/synth.test.ts
  • packages/1-framework/3-tooling/migration/test/aggregate/verifier.test.ts
  • packages/1-framework/3-tooling/migration/test/deletable-node-modules.test.ts
  • packages/1-framework/3-tooling/migration/test/fixtures.ts
  • packages/1-framework/3-tooling/migration/test/refs/snapshot.test.ts
  • packages/2-mongo-family/1-foundation/mongo-contract/src/contract-schema.ts
  • packages/2-mongo-family/1-foundation/mongo-contract/src/contract-types.ts
  • packages/2-mongo-family/1-foundation/mongo-contract/src/exports/index.ts
  • packages/2-mongo-family/1-foundation/mongo-contract/src/validate-storage.ts
  • packages/2-mongo-family/1-foundation/mongo-contract/test/contract-types.test-d.ts
  • packages/2-mongo-family/1-foundation/mongo-contract/test/fixtures/orm-contract.d.ts
  • packages/2-mongo-family/1-foundation/mongo-contract/test/fixtures/orm-contract.json
  • packages/2-mongo-family/1-foundation/mongo-contract/test/validate-domain.test.ts
  • packages/2-mongo-family/1-foundation/mongo-contract/test/validate-storage.test.ts
  • packages/2-mongo-family/2-authoring/contract-psl/src/interpreter.ts
  • packages/2-mongo-family/2-authoring/contract-psl/test/interpreter.polymorphism.test.ts
  • packages/2-mongo-family/2-authoring/contract-psl/test/interpreter.test.ts
  • packages/2-mongo-family/2-authoring/contract-psl/test/provider.test.ts
  • packages/2-mongo-family/2-authoring/contract-ts/src/contract-builder.ts
  • packages/2-mongo-family/2-authoring/contract-ts/test/contract-builder.dsl.test.ts
  • packages/2-mongo-family/2-authoring/contract-ts/test/contract-builder.types.test-d.ts
  • packages/2-mongo-family/3-tooling/emitter/src/index.ts
  • packages/2-mongo-family/3-tooling/emitter/test/emitter-hook.structure.test.ts
  • packages/2-mongo-family/3-tooling/emitter/test/fixtures/blog-contract.ts
  • packages/2-mongo-family/3-tooling/emitter/test/fixtures/create-mongo-contract.ts
  • packages/2-mongo-family/5-query-builders/orm/src/collection.ts
  • packages/2-mongo-family/5-query-builders/orm/src/field-accessor.ts
  • packages/2-mongo-family/5-query-builders/orm/src/mongo-raw.ts
  • packages/2-mongo-family/5-query-builders/orm/src/types.ts
  • packages/2-mongo-family/5-query-builders/orm/test/mongo-raw.test.ts
  • packages/2-mongo-family/5-query-builders/orm/test/value-object-inputs.test-d.ts
  • packages/2-mongo-family/5-query-builders/query-builder/src/builder.ts
  • packages/2-mongo-family/5-query-builders/query-builder/src/lookup-builder.ts
  • packages/2-mongo-family/5-query-builders/query-builder/src/query.ts
  • packages/2-mongo-family/5-query-builders/query-builder/src/resolve-path.ts
  • packages/2-mongo-family/5-query-builders/query-builder/src/state-classes.ts
  • packages/2-mongo-family/5-query-builders/query-builder/src/types.ts
  • packages/2-mongo-family/5-query-builders/query-builder/test/fixtures/test-contract.ts
  • packages/2-mongo-family/5-query-builders/query-builder/test/result-shape.test.ts
  • packages/2-mongo-family/7-runtime/test/decode-via-query-builder.test.ts
  • packages/2-mongo-family/7-runtime/test/decode.integration.test.ts
  • packages/2-mongo-family/7-runtime/test/fixtures/contract.json
  • packages/2-mongo-family/7-runtime/test/fixtures/decode-fixture-contract.ts
  • packages/2-mongo-family/7-runtime/test/orm-contract-types.test-d.ts
  • packages/2-mongo-family/7-runtime/test/runtime-types.test-d.ts
  • packages/2-mongo-family/9-family/test/mongo-contract-json-fixture.ts
  • packages/2-mongo-family/9-family/test/mongo-contract-serializer-base.test.ts
  • packages/2-sql/1-core/contract/src/validators.ts
  • packages/2-sql/1-core/contract/test/validators.test.ts
  • packages/2-sql/2-authoring/contract-psl/src/interpreter.ts
  • packages/2-sql/2-authoring/contract-psl/test/fixtures.ts
  • packages/2-sql/2-authoring/contract-psl/test/interpreter.polymorphism.test.ts
  • packages/2-sql/2-authoring/contract-psl/test/interpreter.relations.test.ts
  • packages/2-sql/2-authoring/contract-psl/test/interpreter.test.ts
  • packages/2-sql/2-authoring/contract-psl/test/interpreter.value-objects.test.ts
  • packages/2-sql/2-authoring/contract-psl/test/provider.test.ts
  • packages/2-sql/2-authoring/contract-ts/src/build-contract.ts
  • packages/2-sql/2-authoring/contract-ts/test/capability-defaults.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/config-types.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract-builder.contract-definition.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract-builder.dsl.helpers.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract-builder.dsl.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract-builder.dsl.types.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract-builder.normalization.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract-builder.value-objects.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract-test-helpers.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract.edge-cases.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract.integration.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract.logic.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract.model-validation.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract.normalization.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract.parameterized-types.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/contract.structure.test.ts
  • packages/2-sql/2-authoring/contract-ts/test/cross-ref-helpers.ts
  • packages/2-sql/2-authoring/contract-ts/test/fixtures/contract-with-relations.json
  • packages/2-sql/2-authoring/contract-ts/test/fixtures/contract.json
  • packages/2-sql/2-authoring/contract-ts/test/sql-contract-json-fixture.ts
  • packages/2-sql/2-authoring/contract-ts/test/unbound-tables.ts
  • packages/2-sql/3-tooling/emitter/src/index.ts
  • packages/2-sql/3-tooling/emitter/test/create-emitter-test-contract.ts
  • packages/2-sql/3-tooling/emitter/test/emitter-hook.generation.advanced.test.ts
  • packages/2-sql/3-tooling/emitter/test/emitter-hook.generation.basic.test.ts
  • packages/2-sql/3-tooling/emitter/test/emitter-hook.parameterized-types.test.ts
  • packages/2-sql/3-tooling/emitter/test/emitter-hook.structure.test.ts
  • packages/2-sql/3-tooling/emitter/test/emitter-hook.typeref-resolver.test.ts
  • packages/2-sql/3-tooling/emitter/test/emitter-hook.types.test.ts
  • packages/2-sql/4-lanes/relational-core/src/types.ts
  • packages/2-sql/4-lanes/relational-core/test/fixtures/contract.json
  • packages/2-sql/4-lanes/sql-builder/src/types/table-proxy.ts
  • packages/2-sql/5-runtime/src/sql-context.ts
  • packages/2-sql/5-runtime/test/codec-integrity.test.ts
  • packages/2-sql/5-runtime/test/contract-codec-registry.test.ts
  • packages/2-sql/5-runtime/test/intercept-decoding.test.ts
  • packages/2-sql/5-runtime/test/marker-verification.test.ts
  • packages/2-sql/5-runtime/test/marker-vs-intercept-ordering.test.ts
  • packages/2-sql/5-runtime/test/mutation-default-generators.test.ts
  • packages/2-sql/5-runtime/test/parameterized-types.test.ts
  • packages/2-sql/5-runtime/test/runtime-ctx-passthrough.test.ts
  • packages/2-sql/5-runtime/test/scope-plumbing.test.ts
  • packages/2-sql/5-runtime/test/sql-context.codec-context.test.ts
  • packages/2-sql/5-runtime/test/sql-context.test.ts
  • packages/2-sql/5-runtime/test/sql-family-adapter.test.ts
  • packages/2-sql/5-runtime/test/sql-runtime-abort.test.ts
  • packages/2-sql/5-runtime/test/sql-runtime.test.ts
  • packages/2-sql/5-runtime/test/utils.ts
  • packages/2-sql/9-family/test/contract-to-schema-ir.test.ts
  • packages/2-sql/9-family/test/control-instance.descriptor-self-consistency.test.ts
  • packages/2-sql/9-family/test/cross-reference-roundtrip.test.ts
  • packages/2-sql/9-family/test/field-event-planner.test.ts
  • packages/2-sql/9-family/test/schema-verify.helpers.ts
  • packages/3-extensions/mongo/test/contract-builder/define-contract.test-d.ts
  • packages/3-extensions/mongo/test/contract-builder/define-contract.test.ts
  • packages/3-extensions/paradedb/migrations/20260601T0000_install_pg_search_extension/end-contract.json
  • packages/3-extensions/paradedb/migrations/20260601T0000_install_pg_search_extension/migration.json
  • packages/3-extensions/paradedb/migrations/refs/head.json
  • packages/3-extensions/paradedb/src/contract.d.ts
  • packages/3-extensions/paradedb/src/contract.json
  • packages/3-extensions/pgvector/migrations/20260601T0000_install_vector_extension/end-contract.json
  • packages/3-extensions/pgvector/migrations/20260601T0000_install_vector_extension/migration.json
  • packages/3-extensions/pgvector/migrations/refs/head.json
  • packages/3-extensions/pgvector/src/contract.d.ts
  • packages/3-extensions/pgvector/src/contract.json
  • packages/3-extensions/pgvector/test/control-adapter-lower-parity.test.ts
  • packages/3-extensions/pgvector/test/migrations/planner.behavior.test.ts
  • packages/3-extensions/pgvector/test/migrations/planner.contract-to-schema-ir.test.ts
  • packages/3-extensions/pgvector/test/migrations/planner.storage-types.test.ts
  • packages/3-extensions/pgvector/test/operation-lowering.test.ts
  • packages/3-extensions/pgvector/test/rich-adapter.test.ts
  • packages/3-extensions/pgvector/test/sql-renderer.cast-policy.test.ts
  • packages/3-extensions/postgis/migrations/20260601T0000_install_postgis_extension/end-contract.json
  • packages/3-extensions/postgis/migrations/20260601T0000_install_postgis_extension/migration.json
  • packages/3-extensions/postgis/migrations/refs/head.json
  • packages/3-extensions/postgis/src/contract.d.ts
  • packages/3-extensions/postgis/src/contract.json
  • packages/3-extensions/postgres/test/contract-builder/define-contract.test-d.ts
  • packages/3-extensions/postgres/test/contract-builder/define-contract.test.ts
  • packages/3-extensions/postgres/test/postgres-close.test.ts
  • packages/3-extensions/postgres/test/postgres-serverless.test.ts
  • packages/3-extensions/postgres/test/postgres.test.ts
  • packages/3-extensions/sql-orm-client/src/collection-contract.ts
  • packages/3-extensions/sql-orm-client/src/collection.ts
  • packages/3-extensions/sql-orm-client/src/orm.ts
  • packages/3-extensions/sql-orm-client/src/types.ts
  • packages/3-extensions/sql-orm-client/test/collection-contract.test.ts
  • packages/3-extensions/sql-orm-client/test/collection-fixtures.ts
  • packages/3-extensions/sql-orm-client/test/collection-runtime.test.ts
  • packages/3-extensions/sql-orm-client/test/filters.test.ts
  • packages/3-extensions/sql-orm-client/test/generated-contract-types.test-d.ts
  • packages/3-extensions/sql-orm-client/test/helpers.ts
  • packages/3-extensions/sql-orm-client/test/model-accessor.test.ts
  • packages/3-extensions/sql-orm-client/test/mutation-executor.test.ts
  • packages/3-extensions/sqlite/test/contract-builder/define-contract.test-d.ts
  • packages/3-extensions/sqlite/test/contract-builder/define-contract.test.ts
  • packages/3-extensions/sqlite/test/sqlite-close.test.ts
  • packages/3-mongo-target/1-mongo-target/test/mongo-target-contract-serializer.test.ts
  • packages/3-mongo-target/1-mongo-target/test/mongo-target-schema-verifier.test.ts
  • packages/3-targets/3-targets/postgres/test/fixtures/snapshot-read-shapes/codec-instance.json
  • packages/3-targets/3-targets/postgres/test/fixtures/snapshot-read-shapes/postgres-enum.json
  • packages/3-targets/3-targets/postgres/test/migrations/enum-collision.test.ts
  • packages/3-targets/3-targets/postgres/test/migrations/issue-planner.test.ts
  • packages/3-targets/3-targets/postgres/test/migrations/verify-postgres-namespaces.test.ts
  • packages/3-targets/3-targets/postgres/test/postgres-contract-serializer.test.ts
  • packages/3-targets/3-targets/postgres/test/snapshot-read-shapes.test.ts
  • packages/3-targets/3-targets/sqlite/test/migrations/issue-planner.test.ts
  • packages/3-targets/3-targets/sqlite/test/migrations/nullability-backfill.test.ts
  • packages/3-targets/3-targets/sqlite/test/migrations/planner-strategies.test.ts
  • packages/3-targets/3-targets/sqlite/test/migrations/planner.authoring-surface.test.ts
  • packages/3-targets/3-targets/sqlite/test/sqlite-contract-serializer.test.ts
  • packages/3-targets/6-adapters/postgres/test/adapter-joins.test.ts
  • packages/3-targets/6-adapters/postgres/test/adapter.test.ts
  • packages/3-targets/6-adapters/postgres/test/control-adapter-lower-parity.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/cross-namespace-fk.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/db-init-update.cli.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/fixtures/runner-fixtures.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.authoring-surface.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.codec-field-event.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.fk-config.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.reconciliation.integration.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.reconciliation.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.referential-actions.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.semantic-satisfaction.test.ts
  • packages/3-targets/6-adapters/postgres/test/migrations/planner.storage-types.integration.test.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch tml-symmetric-domain-plane

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

wmadden added 2 commits May 31, 2026 11:58
…plane

Signed-off-by: Will Madden <madden@prisma.io>

# Conflicts:
#	examples/cipherstash-integration/src/prisma/contract.d.ts
#	examples/cipherstash-integration/src/prisma/contract.json
#	packages/3-extensions/cipherstash/migrations/20260601T0000_install_eql_bundle/migration.json
#	packages/3-extensions/cipherstash/migrations/refs/head.json
#	packages/3-extensions/cipherstash/src/contract.d.ts
#	packages/3-extensions/cipherstash/src/contract.json
#	test/integration/test/authoring/parity/cipherstash-encrypted-bigint/expected.contract.json
#	test/integration/test/authoring/parity/cipherstash-encrypted-boolean/expected.contract.json
#	test/integration/test/authoring/parity/cipherstash-encrypted-date/expected.contract.json
#	test/integration/test/authoring/parity/cipherstash-encrypted-double/expected.contract.json
#	test/integration/test/authoring/parity/cipherstash-encrypted-json/expected.contract.json
#	test/integration/test/authoring/parity/cipherstash-encrypted-string/expected.contract.json
Narrow legacy flat-root access in contractModels helpers, drop the
incorrect domain.types path in sql-runtime, and align test fixtures
with domain.namespaces after CipherStash removal on main.

Signed-off-by: Will Madden <madden@prisma.io>
@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new Bot commented May 31, 2026

Open in StackBlitz

@prisma-next/extension-author-tools

npm i https://pkg.pr.new/@prisma-next/extension-author-tools@653

@prisma-next/mongo-runtime

npm i https://pkg.pr.new/@prisma-next/mongo-runtime@653

@prisma-next/family-mongo

npm i https://pkg.pr.new/@prisma-next/family-mongo@653

@prisma-next/sql-runtime

npm i https://pkg.pr.new/@prisma-next/sql-runtime@653

@prisma-next/family-sql

npm i https://pkg.pr.new/@prisma-next/family-sql@653

@prisma-next/extension-arktype-json

npm i https://pkg.pr.new/@prisma-next/extension-arktype-json@653

@prisma-next/middleware-cache

npm i https://pkg.pr.new/@prisma-next/middleware-cache@653

@prisma-next/mongo

npm i https://pkg.pr.new/@prisma-next/mongo@653

@prisma-next/extension-paradedb

npm i https://pkg.pr.new/@prisma-next/extension-paradedb@653

@prisma-next/extension-pgvector

npm i https://pkg.pr.new/@prisma-next/extension-pgvector@653

@prisma-next/extension-postgis

npm i https://pkg.pr.new/@prisma-next/extension-postgis@653

@prisma-next/postgres

npm i https://pkg.pr.new/@prisma-next/postgres@653

@prisma-next/sql-orm-client

npm i https://pkg.pr.new/@prisma-next/sql-orm-client@653

@prisma-next/sqlite

npm i https://pkg.pr.new/@prisma-next/sqlite@653

@prisma-next/target-mongo

npm i https://pkg.pr.new/@prisma-next/target-mongo@653

@prisma-next/adapter-mongo

npm i https://pkg.pr.new/@prisma-next/adapter-mongo@653

@prisma-next/driver-mongo

npm i https://pkg.pr.new/@prisma-next/driver-mongo@653

@prisma-next/contract

npm i https://pkg.pr.new/@prisma-next/contract@653

@prisma-next/utils

npm i https://pkg.pr.new/@prisma-next/utils@653

@prisma-next/config

npm i https://pkg.pr.new/@prisma-next/config@653

@prisma-next/errors

npm i https://pkg.pr.new/@prisma-next/errors@653

@prisma-next/framework-components

npm i https://pkg.pr.new/@prisma-next/framework-components@653

@prisma-next/operations

npm i https://pkg.pr.new/@prisma-next/operations@653

@prisma-next/ts-render

npm i https://pkg.pr.new/@prisma-next/ts-render@653

@prisma-next/contract-authoring

npm i https://pkg.pr.new/@prisma-next/contract-authoring@653

@prisma-next/ids

npm i https://pkg.pr.new/@prisma-next/ids@653

@prisma-next/psl-parser

npm i https://pkg.pr.new/@prisma-next/psl-parser@653

@prisma-next/psl-printer

npm i https://pkg.pr.new/@prisma-next/psl-printer@653

@prisma-next/cli

npm i https://pkg.pr.new/@prisma-next/cli@653

@prisma-next/cli-telemetry

npm i https://pkg.pr.new/@prisma-next/cli-telemetry@653

@prisma-next/emitter

npm i https://pkg.pr.new/@prisma-next/emitter@653

@prisma-next/migration-tools

npm i https://pkg.pr.new/@prisma-next/migration-tools@653

prisma-next

npm i https://pkg.pr.new/prisma-next@653

@prisma-next/vite-plugin-contract-emit

npm i https://pkg.pr.new/@prisma-next/vite-plugin-contract-emit@653

@prisma-next/mongo-codec

npm i https://pkg.pr.new/@prisma-next/mongo-codec@653

@prisma-next/mongo-contract

npm i https://pkg.pr.new/@prisma-next/mongo-contract@653

@prisma-next/mongo-value

npm i https://pkg.pr.new/@prisma-next/mongo-value@653

@prisma-next/mongo-contract-psl

npm i https://pkg.pr.new/@prisma-next/mongo-contract-psl@653

@prisma-next/mongo-contract-ts

npm i https://pkg.pr.new/@prisma-next/mongo-contract-ts@653

@prisma-next/mongo-emitter

npm i https://pkg.pr.new/@prisma-next/mongo-emitter@653

@prisma-next/mongo-schema-ir

npm i https://pkg.pr.new/@prisma-next/mongo-schema-ir@653

@prisma-next/mongo-query-ast

npm i https://pkg.pr.new/@prisma-next/mongo-query-ast@653

@prisma-next/mongo-orm

npm i https://pkg.pr.new/@prisma-next/mongo-orm@653

@prisma-next/mongo-query-builder

npm i https://pkg.pr.new/@prisma-next/mongo-query-builder@653

@prisma-next/mongo-lowering

npm i https://pkg.pr.new/@prisma-next/mongo-lowering@653

@prisma-next/mongo-wire

npm i https://pkg.pr.new/@prisma-next/mongo-wire@653

@prisma-next/sql-contract

npm i https://pkg.pr.new/@prisma-next/sql-contract@653

@prisma-next/sql-errors

npm i https://pkg.pr.new/@prisma-next/sql-errors@653

@prisma-next/sql-operations

npm i https://pkg.pr.new/@prisma-next/sql-operations@653

@prisma-next/sql-schema-ir

npm i https://pkg.pr.new/@prisma-next/sql-schema-ir@653

@prisma-next/sql-contract-psl

npm i https://pkg.pr.new/@prisma-next/sql-contract-psl@653

@prisma-next/sql-contract-ts

npm i https://pkg.pr.new/@prisma-next/sql-contract-ts@653

@prisma-next/sql-contract-emitter

npm i https://pkg.pr.new/@prisma-next/sql-contract-emitter@653

@prisma-next/sql-lane-query-builder

npm i https://pkg.pr.new/@prisma-next/sql-lane-query-builder@653

@prisma-next/sql-relational-core

npm i https://pkg.pr.new/@prisma-next/sql-relational-core@653

@prisma-next/sql-builder

npm i https://pkg.pr.new/@prisma-next/sql-builder@653

@prisma-next/target-postgres

npm i https://pkg.pr.new/@prisma-next/target-postgres@653

@prisma-next/target-sqlite

npm i https://pkg.pr.new/@prisma-next/target-sqlite@653

@prisma-next/adapter-postgres

npm i https://pkg.pr.new/@prisma-next/adapter-postgres@653

@prisma-next/adapter-sqlite

npm i https://pkg.pr.new/@prisma-next/adapter-sqlite@653

@prisma-next/driver-postgres

npm i https://pkg.pr.new/@prisma-next/driver-postgres@653

@prisma-next/driver-sqlite

npm i https://pkg.pr.new/@prisma-next/driver-sqlite@653

commit: 6e6985b

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 31, 2026

size-limit report 📦

Path Size
postgres / no-emit 135.88 KB (+0.38% 🔺)
postgres / emit 125.59 KB (+0.35% 🔺)
mongo / no-emit 75.69 KB (+0.74% 🔺)
mongo / emit 70.68 KB (+0.76% 🔺)

wmadden added 12 commits May 31, 2026 13:03
Shared SQL/Mongo test helpers build domain slices instead of top-level
models; update expectations for coordinate-qualified validation messages.

Signed-off-by: Will Madden <madden@prisma.io>
Normalize model maps with default relations and widen storage casts in
validator tests; add relations on mongo-target fixture models.

Signed-off-by: Will Madden <madden@prisma.io>
Signed-off-by: Will Madden <madden@prisma.io>
Make domainPlaneOf generic so createContract infers DomainPlane<TModels>
without casts in testing-factories; reword domain doc comment; delete
orphan basic-contract.json and drop its snapshot-scan exclusion.

Signed-off-by: Will Madden <madden@prisma.io>
Hand-migrate snapshot-read-shapes fixtures to domain.namespaces; regenerate
multi-extension-monorepo contracts and sync extension head refs; add emit
script for fixtures:check; remove stale duplicate sqlite prisma artefacts.

Signed-off-by: Will Madden <madden@prisma.io>
Move root models/valueObjects under domain.namespaces.__unbound__ across
remaining checked-in migration snapshots, package test fixtures, and
integration value-object fixtures; fix sql-contract-ts null-relations
edge-case to target domain directly.

Signed-off-by: Will Madden <madden@prisma.io>
Re-attest pgvector, postgis, and paradedb baseline migrationHash values
after canonical JSON hashing drift from main. Remove stale Contract
imports in sql-contract-emitter hook tests that fail lint --error-on-warnings.

Signed-off-by: Will Madden <madden@prisma.io>
Replace forbidden non-null assertions with explicit undefined checks so
contract package lint passes --error-on-warnings in CI.

Signed-off-by: Will Madden <madden@prisma.io>
Validate migration ref snapshots against domain.namespaces instead of
top-level models. Update integration and demo tests for the symmetric
domain envelope, and re-sync audit/feature-flags contract-space migration
bookends after canonical hashing drift.

Signed-off-by: Will Madden <madden@prisma.io>
Use UNBOUND_NAMESPACE_ID in ContractView tests. Trim trailing newlines on
extension contract.json files so fixtures:check matches contract emit output.

Signed-off-by: Will Madden <madden@prisma.io>
Generic domain-plane parameter lets contractModels return the contract's
TModels so generated contract.d.ts usage typechecks in integration tests.

Signed-off-by: Will Madden <madden@prisma.io>
Copy link
Copy Markdown
Contributor

@wmadden wmadden left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's still some weird logic that looks like back compat shims

Comment thread packages/1-framework/0-foundation/contract/src/domain-envelope.ts Outdated
Comment thread packages/1-framework/0-foundation/contract/src/domain-envelope.ts
Comment thread packages/1-framework/0-foundation/contract/src/domain-envelope.ts
Comment thread packages/1-framework/0-foundation/contract/src/domain-envelope.ts Outdated
Comment thread packages/1-framework/0-foundation/contract/src/domain-envelope.ts Outdated
wmadden added 6 commits May 31, 2026 16:43
…ain rename, structural identity key, evict test helper)

Signed-off-by: Will Madden <madden@prisma.io>
Replace colon-joined coordinate strings with nested maps so model
identity stays unambiguous when names contain ":".

Signed-off-by: Will Madden <madden@prisma.io>
DomainPlane becomes ApplicationDomain, DomainNamespace becomes
ApplicationDomainNamespace, and domainPlaneOf becomes applicationDomainOf.
The contract field stays `domain`.

Signed-off-by: Will Madden <madden@prisma.io>
Evict the test-only domain authoring helper from the contract
production surface into @prisma-next/test-utils. Contract package tests
import it via a relative path to avoid a Turbo build cycle; all other
call sites use the test-utils export. Depends on @prisma-next/contract
for ApplicationDomain types.

Signed-off-by: Will Madden <madden@prisma.io>
…c reach

The foundation contract package cannot depend on @prisma-next/test-utils
(test-utils depends on contract), so its own tests cannot import the shared
applicationDomainOf via the package name. Replace the brittle 5-level relative
reach into test-utils/src with a tiny local copy, keeping package boundaries
one-way.

Signed-off-by: Will Madden <madden@prisma.io>
The @prisma-next/contract/types resolve alias became unused once the package
tests switched to a local test helper; remove it and the now-unused imports.

Signed-off-by: Will Madden <madden@prisma.io>
Comment thread packages/1-framework/0-foundation/contract/src/domain-envelope.ts Outdated
Comment thread packages/1-framework/0-foundation/contract/src/domain-envelope.ts
Comment thread test/utils/src/contract-factories.ts
wmadden added 6 commits May 31, 2026 17:22
The round-2 contract rework left dead profileHash value imports in test
helpers; biome's --error-on-warnings turns them into lint failures.

Signed-off-by: Will Madden <madden@prisma.io>
…ng-factories, relocate domain error)

Signed-off-by: Will Madden <madden@prisma.io>
…ractValidationError

Move the domain namespace resolution error class into the centralized
contract-validation-error module so domain-envelope stays structural only.

Signed-off-by: Will Madden <madden@prisma.io>
Move createContract/createSqlContract out of contract/src and drop the
@prisma-next/contract/testing subpath. Contract package tests keep a local
duplicate helper; other packages import from test-utils via the existing
@prisma-next/contract/hashing subpath for hash computation.

Signed-off-by: Will Madden <madden@prisma.io>
The emitter's test/utils.ts imported createContract from the
@prisma-next/test-utils root, whose index re-exports server helpers
that pull in @prisma/dev (a devDependency). When the emitter test
bundle is built, that drags @prisma/dev into emitter/dist/test/utils.mjs,
so integration tests (contract-imports, cli.emit) fail at runtime with
"Cannot find package '@prisma/dev'".

Add a dedicated ./contract-factories leaf entry/export to test-utils and
import createContract from that subpath instead. The leaf only depends on
@prisma-next/contract and @prisma-next/utils, keeping @prisma/dev out of
the emitter test bundle.

Signed-off-by: Will Madden <madden@prisma.io>
@wmadden wmadden merged commit 7ac37dd into main May 31, 2026
21 checks passed
@wmadden wmadden deleted the tml-symmetric-domain-plane branch May 31, 2026 16:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants