Skip to content

feat(auth): migrate to the ADR-0042 input model — a generated value is a config param, not a secret#173

Merged
wmadden-electric merged 11 commits into
mainfrom
claude/auth-adr-0041-migration
Jul 24, 2026
Merged

feat(auth): migrate to the ADR-0042 input model — a generated value is a config param, not a secret#173
wmadden-electric merged 11 commits into
mainfrom
claude/auth-adr-0041-migration

Conversation

@wmadden-electric

@wmadden-electric wmadden-electric commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Wiring the auth module onto the new input model looks like this — one schema, one binding, and the instance signing value the framework generates for you:

// auth-service.ts — the service declares its whole input as one schema
input: type({ baseUrl: 'string', secret: secretString() }),

// auth-module.ts — the operator brings the public origin; the framework generates the secret
input: { baseUrl: params.baseUrl, secret: generatedParam() },

// auth-entrypoint.ts — one accessor; the port comes from the framework
const { baseUrl, secret } = service.input();
const port = service.port();

This PR migrates the auth module onto ADR-0042's single input schema and, in doing so, fixes a vocabulary mistake the earlier auth work shipped: it called the generated signing value a mintedSecret. It is not a secret.

Stacked on #161 (ADR-0042). Supersedes #163 and #165 — the same S1+S2 auth module, re-applied on the new model. Base retargets to main when #161 merges.

The decision: a generated value is a config param, not a secret

The framework has exactly one secret concept: envSecret — a value the deployment reads from the environment by name, whose contents never enter deploy state. That never-in-state property is only possible because an external holder (the operator, the platform) holds the value and the framework merely references it.

A value the framework generates at deploy — an rpc service key, the auth instance signing value — has no external holder. It must be stored to be stable across redeploys. So it is a config param the system produces and owns, and it lives in deploy state by design. It is "secret" only in the everyday sense that knowing it lets you participate; in our model that is config, not a secret. Redaction (don't print it) is an orthogonal display facet, not what makes a value a secret.

So there is no "minted secret." The concept is a generated param, and "minted" — a coining metaphor — is retired in favour of "generated". The settled model is one param bound to a source, with four sources: literal, envParam, envSecret (the only secret), and generatedParam.

What's in the PR

  • generatedParam() (target/src/param.ts, beside envParam — it is a param source, not a secret): the target generates the value at deploy from the wiring info and keeps it stable across redeploys.
  • The $generated pointer carries its redaction facet{ "$generated": VAR, "redacted": <bool> }. A generated param may be redacted or plain, and boot cannot ask an opaque Standard Schema which; so the deploy, which knows, writes the facet into the self-describing document and boot reads it from the pointer. The value never appears in the document — only the pointer — so the deploy report stays printable.
  • The auth migration: service declares one input schema; the module binds generatedParam() for the signing value; the entrypoint reads service.input() + service.port(). Everything the earlier S1/S2 work delivered is re-applied on the new base — the PN extension-pack machinery, composeServiceFetch, the ensureLocalAuthSchema dbInit local bootstrap, Hono example apps, the email flows, the bundling fixes.
  • One pointer-collision guard covers $secret and $generated names together (also closing the pre-existing case-collision gap a prior review flagged).
  • The vocabulary is documented: the glossary and config-params.md state the source model; ADR-0029 is rewritten (a secret is environment-sourced and never stored), ADR-0030 names the service key a generated param, and ADR-0042 gains a § Generated sources.

Alternatives considered

  • Keep it a secret, as an input leaf with a minting carve-out. Rejected: it forces the never-mints-a-resource invariant of ADR-0042's binding walk to grow an exception at every point that funnels secrets through one check — reintroducing exactly the thing the model removed, to house a value that isn't a secret.
  • Its own channel, like a bare service key. Closer, but still framed it as not-quite-config. The precise answer is simpler: it is config — a param with a generated source — so it rides the ordinary param channel and needs no special home.

Verification

Typecheck 74/74, target 327 tests, auth 104 (incl. integration), email untouched at 96, examples/auth 2, lint/depcruise/casts clean; a fresh build confirms the deployed entrypoint carries no Prisma Next control client and the testing bundle is self-contained; zero minted-family survivors in shipped source. Opus review: SATISFIED, zero findings.

Deployed smoke: passed 13/13 on real Prisma Cloud, teardown clean (48/48 deleted, project removed, nothing left). The deploy report shows the mechanism working end to end: the GeneratedParam resource created, its value written to COMPOSER_AUTH_SERVICE_SECRET_GENERATED, the input document carrying {"$generated":"…","redacted":true}, and — on a second pass that corrected AUTH_BASE_URL — the auth service rolling while the generated secret no-op'd (reconcile-keeps-output, so the signing value stays stable across redeploys). The six JWT/session steps confirm Better Auth signs and verifies with the generated value.

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 154 files, which is 54 over the limit of 100.

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

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 507a85c0-fdf1-4cfd-84e2-d36697ce9629

📥 Commits

Reviewing files that changed from the base of the PR and between 64bce1b and 38fd01d.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (154)
  • .agents/rules/exports-entrypoints.mdc
  • .drive/projects/auth-module/design-notes.md
  • .drive/projects/auth-module/plan.md
  • .drive/projects/auth-module/slices/adr-0041-migration/spec.md
  • .drive/projects/auth-module/slices/auth-email-flows/plan.md
  • .drive/projects/auth-module/slices/auth-module-core/plan.md
  • .drive/projects/auth-module/slices/auth-module-core/spec.md
  • .drive/projects/auth-module/slices/rpc-port-isolation/spec.md
  • .drive/projects/auth-module/spec.md
  • architecture.config.json
  • biome.jsonc
  • docs/design/03-domain-model/glossary.md
  • docs/design/10-domains/config-params.md
  • docs/design/90-decisions/ADR-0029-secrets-are-a-forwardable-slot.md
  • docs/design/90-decisions/ADR-0030-rpc-callers-verified-with-an-auto-provisioned-service-key.md
  • docs/design/90-decisions/ADR-0042-service-input-is-one-standard-schema.md
  • examples/auth/contract.d.ts
  • examples/auth/contract.json
  • examples/auth/contract.prisma
  • examples/auth/migrations/app/20260723T0709_init/end-contract.d.ts
  • examples/auth/migrations/app/20260723T0709_init/end-contract.json
  • examples/auth/migrations/app/20260723T0709_init/migration.json
  • examples/auth/migrations/app/20260723T0709_init/migration.ts
  • examples/auth/migrations/app/20260723T0709_init/ops.json
  • examples/auth/migrations/auth/0001_init/migration.json
  • examples/auth/migrations/auth/0001_init/ops.json
  • examples/auth/migrations/auth/contract.d.ts
  • examples/auth/migrations/auth/contract.json
  • examples/auth/migrations/auth/refs/head.json
  • examples/auth/module.ts
  • examples/auth/package.json
  • examples/auth/prisma-composer.config.ts
  • examples/auth/prisma-next.config.ts
  • examples/auth/scripts/smoke.ts
  • examples/auth/src/api/app.ts
  • examples/auth/src/api/server.ts
  • examples/auth/src/api/service.ts
  • examples/auth/src/contract.ts
  • examples/auth/src/ops/app.ts
  • examples/auth/src/ops/server.ts
  • examples/auth/src/ops/service.ts
  • examples/auth/tests/local.integration.test.ts
  • examples/auth/tests/pg-harness.ts
  • examples/auth/tsconfig.json
  • examples/auth/turbo.json
  • examples/email/module.ts
  • packages/0-framework/1-core/core/src/__tests__/lowering.test.ts
  • packages/0-framework/1-core/core/src/__tests__/params.test-d.ts
  • packages/0-framework/1-core/core/src/config.ts
  • packages/0-framework/2-authoring/service-rpc/package.json
  • packages/0-framework/2-authoring/service-rpc/src/__tests__/compose-fetch.test.ts
  • packages/0-framework/2-authoring/service-rpc/src/__tests__/invariants.test.ts
  • packages/0-framework/2-authoring/service-rpc/src/__tests__/serve-handlers.test-d.ts
  • packages/0-framework/2-authoring/service-rpc/src/__tests__/serve-mixed-expose.test.ts
  • packages/0-framework/2-authoring/service-rpc/src/compose-fetch.ts
  • packages/0-framework/2-authoring/service-rpc/src/exports/compose-fetch.ts
  • packages/0-framework/2-authoring/service-rpc/src/exports/index.ts
  • packages/0-framework/2-authoring/service-rpc/src/rpc.ts
  • packages/0-framework/2-authoring/service-rpc/src/serve.ts
  • packages/0-framework/2-authoring/service-rpc/tsdown.config.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/control-lowering.test.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/fixtures/packed-contract/pack.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/fixtures/packed-contract/source/contract.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/fixtures/packed-contract/source/prisma-next.config.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/generated-param.test.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/input-serializer.test.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/invariants.test.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/pack-preflight.test.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/pn-config.test.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/pn-extension-packs.integration.test.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/pn-migration-resource.test.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/preflight.test.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/prisma-next-migrate.integration.test.ts
  • packages/1-prisma-cloud/1-extensions/target/src/__tests__/prisma-next.test.ts
  • packages/1-prisma-cloud/1-extensions/target/src/control/extension.ts
  • packages/1-prisma-cloud/1-extensions/target/src/descriptors/compute.ts
  • packages/1-prisma-cloud/1-extensions/target/src/descriptors/prisma-next.ts
  • packages/1-prisma-cloud/1-extensions/target/src/exports/index.ts
  • packages/1-prisma-cloud/1-extensions/target/src/generated-param-resource.ts
  • packages/1-prisma-cloud/1-extensions/target/src/local-target/descriptor.ts
  • packages/1-prisma-cloud/1-extensions/target/src/param.ts
  • packages/1-prisma-cloud/1-extensions/target/src/pn-config.ts
  • packages/1-prisma-cloud/1-extensions/target/src/pn-migration-resource.ts
  • packages/1-prisma-cloud/1-extensions/target/src/preflight-names.ts
  • packages/1-prisma-cloud/1-extensions/target/src/preflight.ts
  • packages/1-prisma-cloud/1-extensions/target/src/prisma-next-migrate.ts
  • packages/1-prisma-cloud/1-extensions/target/src/prisma-next.ts
  • packages/1-prisma-cloud/1-extensions/target/src/required-pack-head.ts
  • packages/1-prisma-cloud/1-extensions/target/src/serializer.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/README.md
  • packages/1-prisma-cloud/2-shared-modules/auth/package.json
  • packages/1-prisma-cloud/2-shared-modules/auth/prisma-next.config.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/auth-options.test.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/auth-store.test.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/barrel-invariants.test.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/contract.test-d.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/contract.test.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/email-outbox.integration.test.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/fixtures/empty-app/emitted/contract.d.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/fixtures/empty-app/source/contract.prisma
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/fixtures/empty-app/source/prisma-next.config.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/fixtures/probe-authoring.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/handlers.test.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/local-server.integration.test.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/module.test.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/pack-conformance.integration.test.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/pg-auth-store.integration.test.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/postgres-harness.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/proxy.test.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/__tests__/templates.test.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/auth-module.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/auth-options.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/auth-service.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/auth-store.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/contract.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/execution/auth-entrypoint.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/execution/empty-app-contract.json
  • packages/1-prisma-cloud/2-shared-modules/auth/src/execution/local-schema.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/execution/testing.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/exports/auth-entrypoint.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/exports/auth-service.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/exports/index.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/exports/pack.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/exports/testing.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/handlers.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/pack/constants.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/pack/contract.d.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/pack/contract.json
  • packages/1-prisma-cloud/2-shared-modules/auth/src/pack/contract.prisma
  • packages/1-prisma-cloud/2-shared-modules/auth/src/pack/index.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/pack/migrations/0001_init/migration.json
  • packages/1-prisma-cloud/2-shared-modules/auth/src/pack/migrations/0001_init/ops.json
  • packages/1-prisma-cloud/2-shared-modules/auth/src/pg-auth-store.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/proxy.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/src/templates.ts
  • packages/1-prisma-cloud/2-shared-modules/auth/tsconfig.json
  • packages/1-prisma-cloud/2-shared-modules/auth/tsdown.config.ts
  • packages/1-prisma-cloud/2-shared-modules/cron/src/__tests__/module.test-d.ts
  • packages/1-prisma-cloud/2-shared-modules/email/src/__tests__/contract.test-d.ts
  • packages/1-prisma-cloud/2-shared-modules/email/src/contract.ts
  • packages/1-prisma-cloud/2-shared-modules/email/src/email-module.ts
  • packages/1-prisma-cloud/2-shared-modules/email/src/handlers.ts
  • packages/1-prisma-cloud/2-shared-modules/email/src/outbox-store.ts
  • packages/1-prisma-cloud/2-shared-modules/storage/src/__tests__/memory-store.test.ts
  • packages/1-prisma-cloud/2-shared-modules/storage/src/contract.ts
  • packages/1-prisma-cloud/2-shared-modules/storage/src/exports/index.ts
  • packages/1-prisma-cloud/2-shared-modules/storage/src/storage-server.ts
  • packages/9-public/composer-prisma-cloud/package.json
  • packages/9-public/composer-prisma-cloud/scripts/rewrite-internal-dts.mjs
  • packages/9-public/composer-prisma-cloud/src/exports/auth-pack.ts
  • packages/9-public/composer-prisma-cloud/src/exports/auth-testing.ts
  • packages/9-public/composer-prisma-cloud/src/exports/auth.ts
  • packages/9-public/composer-prisma-cloud/tsdown.config.ts
  • tsconfig.depcruise.json

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/auth-adr-0041-migration
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch claude/auth-adr-0041-migration

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.

@pkg-pr-new

pkg-pr-new Bot commented Jul 24, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@prisma/composer@173
npm i https://pkg.pr.new/@prisma/composer-prisma-cloud@173

commit: 38fd01d

Comment thread examples/auth/src/api/app.ts Outdated
Comment thread examples/auth/src/ops/app.ts Outdated
Base automatically changed from claude/adr-input-schema to main July 24, 2026 12:00
@wmadden-electric
wmadden-electric force-pushed the claude/auth-adr-0041-migration branch from ed65be9 to 73457d2 Compare July 24, 2026 12:19
…branch

Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
… deploy walk

Adds the target-generated param mechanism on the ADR-0041 input walk:

- generatedParam() param source (param.ts): branded GeneratedParamPayload,
  isGeneratedParamSource, bytes 16..1024 (default 32), redacted (default true).
- GeneratedParam Alchemy resource (generated-param-resource.ts): Web-Crypto
  generate, reconcile keeps persisted output stable across redeploys; provider
  registered in control/extension.ts.
- Serializer walk: recognizes a generated leaf (before the param/secret
  branches), emits a {"$generated":VAR} pointer (VAR =
  generatedParamVarName(address,path) = COMPOSER_<addr>_<KEY>_GENERATED), sentinel
  is SecretBox("") when redacted else "", records a ResolvedInputBinding.generated
  list, extends the $secret escaping table to cover $generated, and boots by
  hydrating $generated from process.env[VAR].
- General collision guard (assertDistinctPointerNames): all $secret AND
  $generated var names must be distinct after uppercasing; duplicate names deploy-error.
- Descriptor: provisions a GeneratedParam + EnvironmentVariable per generated leaf.
- Preflight: collectSecretLeafNames skips generated leaves (nothing to seed).

Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
…k, and collision guard

generated-param.test.ts: reconcile generate/stability (bytes-length, redeploy no-op,
bytes-change keeps value, randomness), construction validation (16..1024, defaults),
isGeneratedParamSource discrimination (env/secret NOT generated, raw paramSource NOT).
input-serializer.test.ts: $generated pointer + sentinel-by-redaction + generated list,
address/path-scoped var name, boot round-trip + missing-var error, $generated escaping,
and the pointer-name collision guard (secret/secret, generated/generated, secret-vs-generated,
case-collision). preflight.test.ts: a generated leaf makes zero platform calls.
control-lowering.test.ts: serialize yields a GeneratedParam resource + env row per leaf.
invariants.test.ts: serializer.ts process.env count 11 -> 12 (boot generated-pointer lookup).

Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
Boot is schema-blind (a Standard Schema exposes only validate, never its field
types), so the redacted facet now rides the pointer: the document leaf is
{"$generated":"<VAR>","redacted":<bool>}. hydrateInputDocument boxes iff the
pointers redacted is true, plain string otherwise — replacing D1s uniform
boxing, which would have failed a non-redacted leaf paired with a plain string
schema field. isGeneratedPointer recognizes the 2-key shape; substitution emits
the facet from the leaf. Adds the redacted:false -> plain-string boot round-trip
test that uniform boxing would have broken.

Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
…point: typecheck-green)

Halfway checkpoint per the dispatch. Brings the auth project (auth package, auth
example, service-rpc composeServiceFetch, PN pack-requirement machinery) from
s2-rebase onto #161+D1 and migrates it to the input model:

- §6.1-6.3 auth-service/module/entrypoint: one input document
  (baseUrl + secretString), secret bound to generatedParam(), service.input()
  + service.port() + secret.expose().
- §6.6 example servers -> service.port(); §6.7 module.test.ts -> graph.inputBindings.
- Shared target files kept at #161+D1 shape (secret/serializer/preflight/compute);
  PN machinery (prisma-next/descriptors/exports/preflight) 3-way reconciled to keep
  #161 ADR-0040 binding + auth PN renames + runPackPreflight.
- §6.11 runPackPreflight inert head-comparison branch DELETED (pack-not-listed kept).
- @prisma-next 0.15.0 -> 0.16.0 across auth pkg + example to match #161 (emit
  format stable, no contract regen).

Full graph typecheck 74/74. Tests + §6.11 survival checks + lint/build validation
land in the follow-up commit.

Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
…ted per §6.11)

Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
…Secret the only secret; retire "minted"

Glossary + config-params source model; rewrite ADR-0029 (a secret is
environment-sourced, never stored) and ADR-0030 (a service key is a generated
param, not a secret); ADR-0042 gains a Generated sources section.

Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
…ram-roll gap note

Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
…hand-declared ApiDeps/OpsDeps

createApiApp/createOpsApp now type their deps parameter as ReturnType<typeof {api,ops}Service.load> — the HydratedDeps the framework already infers from compute({ deps }). The hand-declared ApiDeps/OpsDeps interfaces duplicated that inferred shape, so they are removed (addresses the review comments on api/app.ts and ops/app.ts).

The local integration test now drives the services through the framework testing seam: bootstrapService boots each real built entry (dist/{api,ops}/server.mjs) with its inputs pointed at the running startLocalAuthServer/startLocalEmailServer, mirroring examples/cron and examples/storefront-auth, instead of hand-building a deps object and calling the factories directly.

Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
… Node/undici

Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
@wmadden-electric
wmadden-electric force-pushed the claude/auth-adr-0041-migration branch from 73457d2 to 7178b05 Compare July 24, 2026 12:27
…oviders

The ADR-0042 migration added generatedParam() and registered its
GeneratedParamProvider in the deploy provider set (control/extension.ts)
but not in the near-mirror local-target set (local-target/descriptor.ts),
which predates generatedParam. Result: prisma-composer dev fails at
converge for any module using generatedParam() (the auth module binds its
instance secret to it) with "Provider not found for
PrismaCloud.GeneratedParam".

Register the existing pure provider in the local-target Layer.mergeAll,
mirroring the deploy registration. The provider mints random bytes via Web
Crypto with reconcile-keeps-output and makes no cloud calls, so it behaves
identically under local dev.

Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
@wmadden-electric
wmadden-electric merged commit 6ba0314 into main Jul 24, 2026
18 checks passed
@wmadden-electric
wmadden-electric deleted the claude/auth-adr-0041-migration branch July 24, 2026 13:01
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