From a626c2df65e0b72b202a2c6fb36cd676e9a2d34e Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 5 Jul 2026 06:45:04 +0000 Subject: [PATCH 1/2] fix(metadata-protocol): user-facing copy for writable_package_required rejection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The rejection message is surfaced verbatim as a Studio toast, but its copy was written for developers — it cited an internal ADR path as the remedy. Rewrite the sentence as end-user remediation (switch to a writable package in the package selector, or create one); the ADR pointer moves to a docs property on the error. code/status/packageId are unchanged, so API consumers and the ADR-0070 golden regression are unaffected. Found by the Studio package-create UX dogfood (#2609, tracking #2615). Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01DHQc5BdGhTzPfazex3vWdt --- .changeset/readonly-package-error-copy.md | 5 +++++ packages/metadata-protocol/src/protocol.ts | 10 ++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 .changeset/readonly-package-error-copy.md diff --git a/.changeset/readonly-package-error-copy.md b/.changeset/readonly-package-error-copy.md new file mode 100644 index 000000000..f999dd529 --- /dev/null +++ b/.changeset/readonly-package-error-copy.md @@ -0,0 +1,5 @@ +--- +"@objectstack/metadata-protocol": patch +--- + +Rewrite the `writable_package_required` rejection message as user-facing remediation ("switch to a writable package in the package selector, or create a new one") instead of developer-facing copy that cited an internal ADR path — the message is surfaced verbatim as a Studio toast. The ADR pointer moves to a `docs` property on the error; `code`, `status`, and `packageId` are unchanged. diff --git a/packages/metadata-protocol/src/protocol.ts b/packages/metadata-protocol/src/protocol.ts index 018b084e1..a8c719f82 100644 --- a/packages/metadata-protocol/src/protocol.ts +++ b/packages/metadata-protocol/src/protocol.ts @@ -3899,15 +3899,17 @@ export class ObjectStackProtocolImplementation implements ObjectStackProtocol { request.packageId != null && !this.isWritablePackage(request.packageId) ) { + // Surfaced verbatim as a console toast — keep the sentence + // user-actionable; the ADR pointer lives in `docs` below. const err = new Error( - `[writable_package_required] Cannot author ${singularTypeForRepo}/${request.name} into ` - + `'${request.packageId}': it is a read-only code/installed package, not a writable base. ` - + `Create or select a writable base (package) first, then retry. ` - + `See docs/adr/0070-package-first-authoring.md.`, + `[writable_package_required] Cannot save ${singularTypeForRepo}/${request.name}: ` + + `the package '${request.packageId}' is read-only (provided by code or an installed app). ` + + `Switch to a writable package in the package selector, or create a new one, and retry.`, ); (err as any).code = 'writable_package_required'; (err as any).status = 422; (err as any).packageId = request.packageId; + (err as any).docs = 'docs/adr/0070-package-first-authoring.md'; throw err; } const orgId = request.organizationId ?? null; From 520c4e11979071ca7a75efebc9a3ed9c9923f49b Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 5 Jul 2026 07:48:47 +0000 Subject: [PATCH 2/2] chore: retrigger CI Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01DHQc5BdGhTzPfazex3vWdt