Skip to content

v0.34.0-dev.3

@wmadden-electric wmadden-electric tagged this 23 Oct 16:17
* chore(drive): spec and plan the node-addressing project

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* chore(drive): record the Alchemy rename spike's findings

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* chore(drive): specify and plan slice A1, fully qualified node identity

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs(design): decide that a node's address is its full path from the app name

ADR-0056 supersedes ADR-0051. Addresses start with the deployed app name,
resource IDs and COMPOSER_ env keys are built from them, and existing
stages migrate on their next deploy through renamedFrom declarations.
The index marks ADR-0051 superseded and notes the amendments to ADR-0006,
ADR-0019, ADR-0048, ADR-0052 and ADR-0053.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs(design): describe fully qualified addresses in the principles, glossary and domain docs

The address principle, the glossary entry, core-model, deploy-cli,
alchemy-lowering, pdp-data-model, config-params, local-dev and
module-composition now describe addresses that start with the app name,
dotted resource IDs with their previous IDs, and env keys built from the
full address.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* feat(core): start every node address with the deployed app name

Load now joins every child to the root's id, so addresses read
shop.catalog and shop.auth.api instead of catalog and auth.api. The CLI
resolves the app name (the root's name or --name) before Load, so its
graph and the deploy lowering share one root, and the topology's root
logicalId equals the Project's. logicalIds, bundle keys, reports and
errors follow from the graph. The name-length error now names the
address it measured. Tests use the full form (ADR-0056).

Resource IDs still use the old suffix pattern on top of the new address;
the next change replaces them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* feat(prisma-cloud): build COMPOSER_ keys from the full address, with - turned into _

An app name may contain -, which no POSIX variable name may. configKey,
generatedParamVarName and local dev's copies of the key rule now map it
to _, so my-shop.api gives COMPOSER_MY_SHOP_API_... (ADR-0056).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs(prisma-cloud): say serviceOrigin() takes the full address

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* feat(local-target): find a database's or bucket's instance by its resource ID

The resource ID of a Database or Bucket is now the node's address, which
is also the node's key in the directory's record. Keying by it frees the
name prop to stay a label in its old form, so recordKeyOf goes away.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* feat(prisma-cloud): give every resource a dotted ID and rename it from its old one

Each node's main resource is now its address (shop.catalog) and every
other piece is <address>.<role> (shop.catalog.conn, shop.web.env.<KEY>,
shop.web.generated.<path>, <consumer>.servicekey.<input>,
<provider>.streamskey). Every resource declares the ID the previous
release built with renamedFrom, computed in legacy-resource-ids.ts, so an
existing stage moves its state instead of recreating databases, buckets,
generated values and service keys.

Names whose change makes upstream replace a resource (Connection,
BucketAccessKey, Bucket, branchless Database) stay the address without
the app name, so credentials are not rotated (ADR-0056).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs(design): record which props force replacement and how env rows migrate

Also corrects where an unknown serviceOrigin() address fails: while the
deploy builds its plan, not at Load.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* feat(local-target): keep local instances, ports and bucket data across the address upgrade

A record keyed by addresses without the app name now reads with the app
name in front of each such key, and is written back that way, so the
first prisma dev after upgrading reuses every instance and port. The
rule lives in legacy-address-keys.ts. A bucket's objects stay in
buckets/<app>/<address without the app name>, the folder earlier
releases used, so an existing bucket instance keeps its directory.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs(design): say how local dev's record and bucket folders survive the upgrade

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* fix(cli): print the deploy tree once under the app name

Every address now starts with the app name, so the tree built from the
addresses had the app as its only top-level node, under a first line
that already names the app. The tree now starts below it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* test(prisma-cloud): use full addresses in the local current-app and attach tests

These tests run against local-target's built output, so they kept passing
with short addresses until it was rebuilt with the app-relative bucket
folders.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs: write full addresses everywhere users see them, and remove apps with project delete

Guides, the agent skill, the auth module's README and examples now write
addresses with the app name (serviceOrigin('auth-example.api'),
prisma dev url my-app.gateway, COMPOSER_MY_APP_... keys). The deploying
guide explains the upgrade to full addresses, and points whole-app
teardown at prisma project delete, keeping the destroy operation for a
single stage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* feat(core): refuse an app name that cannot start every address

The app name (the root module's name or --name) is the first segment of
every address and of every COMPOSER_ key, so Load now requires letters,
digits, - and _, starting with a letter or digit, before anything is
assembled or deployed. A provision edge also carries the app name, so a
provisioner can build names below it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* feat(local-target): mark the dev record's format instead of guessing old keys

Every write stores formatVersion 2. A record without it was written
before node keys were full addresses, so every one of its keys gets the
app name in front, including a child named like the app. A versioned
record is read as is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* feat(prisma-cloud): name every platform resource below the app, with noun roles

addressBelowApp removes the known app name from an address. It is the
one place that computes it, used for every legacy ID and for every
platform name Composer writes: the App display name, the branchless
Database name, and the Connection, Bucket and access key names. Those
names are labels inside the app's own Project and stay within the
65-character limit however long the app name is. validateName checks
that name and says plainly that fixing it changes the node's identity.

Roles are now nouns: connection, accesskey, deployment, warmup,
migration, streamkey. The local App provider finds its instance by
resource ID, like databases and buckets, and the emulators hook keys
every node through resourceId, with a test pinning the two together.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs(design): record the platform name rule, noun roles, the record format and serviceOrigin with --name

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* chore(drive): add A1 review artifacts and the project handover draft

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* chore(drive): bring the node-addressing handover up to date

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* chore(drive): every platform name is the full address; plan the merge and rename dispatches

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* chore(drive): make no data loss on upgrade a critical done condition, including state outside the graph

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs(design): renumber the identity decision to ADR-0057

Main took ADR-0056 for the dev-server decision. The identity record and
every reference that means it now say ADR-0057; references to the
dev-server record keep ADR-0056.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* style: format two files the branch left unformatted

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* chore(drive): record what the upgrade deploy does to each resource

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* feat(prisma-cloud): name every platform row by the node's full address

The App display name, the local dev Database name, and the Connection,
Bucket and bucket access key names are now the full address. Name
validation checks each kind against the platform's own limit (Connection
65, Bucket 100, App 256, access key none) and names the address on
failure. addressBelowApp moves into legacy-resource-ids.ts, the only place
that still needs it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs(design): every platform name is the full address

ADR-0057, the glossary, the principle, the lowering doc, core-model and
the deploying guide now say every platform name is the address, and that
the upgrade recreates Composer's Connections and access keys with new
credentials that its services receive in the same deploy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* fix(prisma-cloud): limit a Connection's address to 52 characters

Upstream appends `-` and a 12-character token to every Connection name
and cuts what does not fit in the platform's 65, so 52 keeps the whole
address. A new test records that a module named like the app gives one
node's new env key the value of another node's old key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs(design): Connection name suffix, hosted database names, the env key clash

ADR-0057 and alchemy-lowering.md say upstream adds `-` and a 12-character
token to every Connection name, and that a hosted database takes its name
from upstream, not Composer. ADR-0057 records that an app with a module
named like the app fails its upgrade with a conflict and deletes nothing;
renaming one node first fixes it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* chore(drive): add round-2 review artifacts, plan the fixes and the QA checks for state outside the graph

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* feat(prisma-cloud): stop the upgrade before a COMPOSER_ key changes owner

The move to full addresses can give one row's new key to another row's
old key: a module or service named like the app in any letter case, or
modules spelling an app name with `-` or `_`. Upstream then fails partway
with a conflict that names neither node. Deploy preflight now computes
every row's new and old key from the graph and, while the old owner's
row still holds the key on the stage and has not moved, fails before any
change, naming both addresses, the variable and the
`prisma project env delete` command that clears it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* chore: give Load back its doc comment and cite ADR-0057 for row adoption

APP_NAME and assertAppName had been inserted between Load and its doc
comment. Two comments still cited the superseded ADR-0051 for the rule
that the row holding a node's logicalId is that node's row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs(design): the env key clash, default connection rotation, emulator labels

ADR-0057 no longer says keys cannot collide during the move, describes
every form of the clash and the preflight that stops it, and replaces the
advice to rename a node, which would delete its rows, with deleting the
one old variable. The deploying guide gives the same fix and notes that
emulator instances keep their old address labels until --fresh.
upgrade-effects.md states when a Database update rotates its default
connection: never for a stage last deployed by v0.34.0. The glossary says
a Connection's platform name carries upstream's suffix; core-model's
sketch names the Connection by its address.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* chore(drive): add the round-3 review and update the handover's QA steps

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* fix(prisma-cloud): report a whole chain of env key clashes in one run

With `shop.x`, `shop.shop.x` and `shop.shop.shop.x`, the middle node's new
key is the last node's old key, so it exists before any move and hid the
first clash. A row under the old owner's new key now counts as moved only
when that key's own clash is not pending. The error also says what is
true: no resource has been created, changed or deleted, but the Branch's
topology has been replaced and the build recorded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs(design): say what the env key clash check has already changed

ADR-0057, the deploying guide and upgrade-effects.md no longer say the
deploy stops before changing anything. They say, as the ADR does for
serviceOrigin, that no resource has been created, changed or deleted but
the Branch's topology has been replaced, and that a chain of clashes is
reported in one run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* docs(design): a chain of env key clashes names several variables to delete

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* chore(drive): record A1 upgrade QA on the real platform

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* chore: classify the new prisma-cloud target files for the architecture check

env-key-clash.ts, legacy-resource-ids.ts and resource-ids.ts are only
imported by deploy-time code (descriptors, control, preflight, the local
target), so they join the control plane of the prisma-cloud extensions
layer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* ci: find deployed apps by logicalId in the e2e verify scripts and canaries

App display names are now the full address, so looking an App up by its
short name (`storefront`, `blobs`, `widgets`, `jobs`, `streams.service`,
`cron.runner`) finds nothing. The scripts now match the App's logicalId,
the full address built from STACK_NAME, which every CI deploy passes as
`--name`. The cold-start canary also looks for the streams artifact under
its full-address file name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* fix(prisma-cloud): address review comments on platform names and the clash error

- Remove the architecture rule for the deleted service-app.ts.
- validatePlatformName enforces the Management API's minimums as well as
  its maximums (Connection 3 to 52 after upstream's suffix, Bucket 1 to
  100, App 1 to 256) and names the address and both limits.
- The env key clash error single-quotes the key, project id and stage in
  the printed delete command, so it is safe to paste; the guide's example
  is quoted the same way.
- serializer.ts's header describes the current key scheme: the full
  address from the app name, `-` turned into `_`; only the boot stash is
  address-free.
- The core-concepts skill says short provision ids are fine, since every
  platform name is the full address, and gives each kind's real limits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

* fix(prisma-cloud): quote the project and stage in the missing-setting command

missingError printed `--branch "<stage>"` with the stage unescaped, so a
stage containing `"`, `$` or a space printed a command unsafe to paste. It
now single-quotes the `KEY=<value>` pair, the project id and the stage
with the same shellQuote the env key clash error uses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>

---------

Signed-off-by: willbot <w.a.madden+machine@gmail.com>
Signed-off-by: Will Madden <madden@prisma.io>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Assets 2
Loading