Skip to content

Commit 8a713cd

Browse files
committed
docs(changeset,spec,cloud-connection,metadata-protocol): the _lock status clause is ruled, not open; the door's comments name D3 in the merged order
Five shipped texts now say one thing about a lock an item ships with: the copy keeps it as written today, and a follow-up on #15213 strips it per #22971's ruling A. Two of them said its handling was an open question; three said only that the lock is kept. The INSTALL_MODES TSDoc, the changeset entry, the install-local door's header docblock, the verb's module header and importUnmanagedPackage's TSDoc. The merge placed main's ADR-0131 D3 walled-catalog refusal after step 1b and before step 1c, so ahead of step 1e. The door's header docblock and the 1e comment now list it among the checks that precede the mode judgement. No behaviour changes. Claude-Session: https://claude.ai/code/session_019G5ZnRrTMiwcHG6iZM19zf Co-authored-by: Claude <noreply@anthropic.com>
1 parent 5a7ed7c commit 8a713cd

5 files changed

Lines changed: 20 additions & 15 deletions

File tree

‎.changeset/15213-install-modes.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ A package declares how it may be installed — `installModes: ['managed', 'unman
99

1010
Clause-②: yes (widening: the new optional manifest key `installModes`; the new exports `INSTALL_MODES`, `InstallModeSchema`, `InstallMode`, `DEFAULT_INSTALL_MODES`, `resolveInstallModes`, `UNMANAGED_INSTALL_KEY_DISPOSITIONS`, `UNMANAGED_INSTALL_REFUSING_DISPOSITIONS`, `UnmanagedInstallKeyDisposition`, `unmanagedInstallValueCarries` and `unmanagedInstallPostureRefusal`; the install-local body field `installMode`; the CLI option `--install-mode`; the error codes `STACK_UNMANAGED_INSTALL_UNCOPYABLE` and `INSTALL_MODE_NOT_PERMITTED`)
1111

12-
A package installs one of two ways. **Managed**: it is registered as code, stays the authority, upgrades, and nothing it ships is edited in place. **Unmanaged**: its metadata is copied once into this environment under a new writable base; the copy's items are this environment's own metadata, the next save edits them, and it follows no upgrade. One exception is carried: an item the package ships with an authored protection lock (`_lock`) keeps that lock on the copy, and its handling is an open question on #15213. This entry adds the manifest key that declares the modes a package permits, and the install door that honours it; the copy itself is the companion entry `15213-unmanaged-import-verb`.
12+
A package installs one of two ways. **Managed**: it is registered as code, stays the authority, upgrades, and nothing it ships is edited in place. **Unmanaged**: its metadata is copied once into this environment under a new writable base; the copy's items are this environment's own metadata, the next save edits them, and it follows no upgrade. One exception is carried: an item the package ships with an authored protection lock (`_lock`) keeps that lock on the copy as written today, and a follow-up on #15213 strips it per #22971's ruling A. This entry adds the manifest key that declares the modes a package permits, and the install door that honours it; the copy itself is the companion entry `15213-unmanaged-import-verb`.
1313

1414
**This entry supersedes parts of that earlier entry, `15213-unmanaged-import-verb`, in this same release.** It says of the import "no door calls it yet, and no manifest key declares the mode yet". What holds now: the install door calls it for `installMode: 'unmanaged'`, and the manifest key `installModes` declares the modes a package permits. It says seed `data` and `translations` are "left to the install door, which applies them after the copy as it does for a managed install". What holds now: the import copies `translations` itself, as `translation` items, and an unmanaged install loads no seed `data` — neither the import nor the door applies it, and the door's answer says so under `seeded`. It also calls the copy "editable from then on" and says each item "is fully editable"; what holds is the sentence above: the copy's items are this environment's own metadata and the next save edits them, except an item shipped with an authored `_lock`, which keeps that lock. Where the two entries disagree, this one is current.
1515

‎packages/cloud-connection/src/marketplace-install-local-plugin.ts‎

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,16 @@
5656
* writable base in the environment ledger
5757
* (`importUnmanagedPackage`): the environment's own metadata,
5858
* which the next save edits (an item shipped with an authored
59-
* `_lock` keeps that lock on the copy), followed by no upgrade;
59+
* `_lock` keeps that lock on the copy as written today, and a
60+
* follow-up on #15213 strips it per #22971's ruling A),
61+
* followed by no upgrade;
6062
* nothing is registered, ledgered or rehydrated under the
6163
* package's id, and its sample data is not loaded. Refused
6264
* `409 UNMANAGED_INSTALL_WALLED_POSTURE` on a deployment whose
6365
* REQUESTED tenancy posture walls organizations: after the
64-
* payload check and steps 1b–1c (package id, protocol
65-
* handshake; none of them writes), before any write.
66+
* payload check, step 1b (package id), the ADR-0131 D3
67+
* walled-catalog refusal and step 1c (protocol handshake),
68+
* none of which writes, and before any write.
6669
* A mode the package's `installModes` does not permit answers
6770
* `422 INSTALL_MODE_NOT_PERMITTED`, before any write.
6871
*
@@ -1317,10 +1320,10 @@ export class MarketplaceInstallLocalPlugin implements Plugin {
13171320
}, refusal.status);
13181321
}
13191322

1320-
// 1e. [ADR-0131 D6] ⭐ THE INSTALL MODE — after the payload, id and
1321-
// handshake checks and before every other judgement of the package
1322-
// and any write, because nothing an author changes in the
1323-
// package answers either refusal:
1323+
// 1e. [ADR-0131 D6] ⭐ THE INSTALL MODE — after the payload, id, D3
1324+
// walled-catalog and handshake checks and before every other
1325+
// judgement of the package and any write, because nothing an
1326+
// author changes in the package answers either refusal:
13241327
// - the package must PERMIT the requested mode: its manifest's
13251328
// `installModes`, parsed by reference
13261329
// (`ManifestSchema.shape.installModes`) and read through the one

‎packages/metadata-protocol/src/package-unmanaged-install.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
* ruled on the D6 execution card, 2026-10-11): every metadata item is copied
1111
* ONCE into the environment ledger, becomes this environment's own metadata,
1212
* which the next save edits (an item shipped with an authored `_lock` keeps
13-
* that lock), and never follows an upgrade. The orchestration —
13+
* that lock as written today, and a follow-up on #15213 strips it per
14+
* #22971's ruling A), and never follows an upgrade. The orchestration —
1415
* reading the store, minting the base, writing each item through
1516
* `saveMetaItem`, deleting the base when a write fails — is
1617
* `ObjectStackProtocolImplementation.importUnmanagedPackage` (`protocol.ts`).

‎packages/metadata-protocol/src/protocol.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24485,8 +24485,9 @@ export class ObjectStackProtocolImplementation implements
2448524485
* door a Studio edit takes — so every copied item is environment metadata
2448624486
* from its first byte: owned by the base, `organization_id` NULL, served
2448724487
* `_provenance: 'org'`, edited by the next save (an item shipped with an
24488-
* authored `_lock` keeps that lock), and followed by no
24489-
* upgrade. The managed mode is the package install; this verb is what that
24488+
* authored `_lock` keeps that lock as written today, and a follow-up on
24489+
* #15213 strips it per #22971's ruling A), and followed by no upgrade.
24490+
* The managed mode is the package install; this verb is what that
2449024491
* install's manifest service is to it, and no more (see
2449124492
* `package-unmanaged-install.ts` for what is copied, what is refused, and
2449224493
* what is left to the door).

‎packages/spec/src/kernel/manifest.zod.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -408,10 +408,10 @@ export function manifestIdRefusal(key: string, input: unknown): string {
408408
* ledger, under a new writable base whose id differs from the package's.
409409
* From then on it is the environment's own metadata and the next save
410410
* edits it, except that an item shipped with an authored protection lock
411-
* (`_lock`) keeps that lock on the copy (an open question on #15213); it
412-
* follows no upgrade. A deployment whose
413-
* tenancy posture walls organizations (`group`, `isolated`) refuses it,
414-
* whatever the package permits.
411+
* (`_lock`) keeps that lock on the copy as written today, and a follow-up
412+
* on #15213 strips it per #22971's ruling A; it follows no upgrade. A
413+
* deployment whose tenancy posture walls organizations (`group`,
414+
* `isolated`) refuses it, whatever the package permits.
415415
*
416416
* The spelling is the maintainer's ruling B on the D6 execution card
417417
* (2026-10-11): `managed` and `unmanaged` are the two states of one property,

0 commit comments

Comments
 (0)