You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(spec)!: the Studio authoring surface closes (#4001 batch 7) (#4541)
All 27 shapes across `studio/` — plugin manifests, the flow builder, the object
designer. These are the configs a Studio extension author writes by hand, and a
dropped key here is quiet in the way this campaign cares about: the plugin
loads, the canvas renders, the designer opens, each contributing less than its
author declared. A viewer that never appears in the switcher looks like a
registration bug, not a spelling one.
The triage verdicts were provisional and verifying them found one wrong. All
three files carried `(p)`; `plugin.zod.ts` was `mixed` with an EMPTY note, which
is how an unexamined label survives. Reading it settles it: all eight shapes are
contribution points on a hand-written manifest, no wire half.
The method is the part worth keeping, because the original triage had none —
each file exports a `define*` factory that parses an author-written literal, and
a `define*` factory IS the authoring door. Same lens the registered-type batches
used, and cheaper than reasoning about who consumes the output. Recorded in the
ledger for the next row that needs promoting out of `(p)`.
The manifest gets the guidance it invites: this file says outright that it is
"the package.json equivalent" and that `contributes` is "analogous to VS Code's".
That analogy is the point and the hazard — every near-miss is a word that is
correct over there. `displayName` → `name`, `publisher` → `author`,
`contributions` → `contributes`; and for keys with no counterpart (`main`,
`engines`, `categories`, `keywords`, `repository`, `icon`, `dependencies`) a
sentence saying what to use instead. `main` is the dangerous one: an author
declares an entry point, gets a plugin that loads and contributes nothing, and
it looks exactly like a broken `activate()`.
What this checkout could not settle is stated in the ledger rather than glossed:
whether objectui also CONSTRUCTS these configs programmatically and parses them
with extra internal keys. If it does, strictness makes that a loud 422 at its
build, with the rename suggested, instead of the silent narrowing it replaces.
Verified: full monorepo suite 132/132 tasks, spec 7241 tests, tsc clean,
8 generated artifacts current, all 10 spec gates green.
Claude-Session: https://claude.ai/code/session_01WnqGjQFQMqd5k81LYV8SCY
Co-authored-by: Claude <noreply@anthropic.com>
The Studio authoring surface rejects unknown keys — plugin manifests, the flow builder, and the object designer.
6
+
7
+
All 27 shapes across `studio/` close. These are the configs a Studio extension author writes by hand, and a dropped key here is quiet in the way this campaign cares about: the plugin loads, the canvas renders, the designer opens — each contributing less than its author declared. A viewer that never appears in the switcher looks like a registration bug, not a spelling one.
8
+
9
+
**The plugin manifest gets the guidance that matters, because this file invites the mistake itself.** It says outright that the manifest is "the `package.json` equivalent" and that `contributes` is "analogous to VS Code's". That analogy is the point *and* the hazard: an author who knows VS Code reaches for its vocabulary, and every near-miss is a word that is correct over there. `displayName` → `name`, `publisher` → `author`, `contributions` → `contributes`, `activation` → `activationEvents`; and for the keys with no counterpart at all — `main`, `engines`, `categories`, `keywords`, `repository`, `icon`, `dependencies` — a sentence saying what to use instead.
10
+
11
+
`main` is the one worth calling out. An author declares an entry point, gets a plugin that loads and contributes nothing, and it looks exactly like a broken `activate()`. The rejection now says there is no entry-point key: contributions are declared in the manifest, runtime components are registered imperatively in `activate()`.
12
+
13
+
**The triage verdicts were provisional, and verifying them found one wrong.** All three files carried `(p)` from the original pass, and `plugin.zod.ts` was `mixed` — with an empty note, which is how an unexamined label survives. Reading it settles the question: all eight shapes are contribution points on a hand-written manifest. There is no wire half.
14
+
15
+
The method is worth keeping, because the original triage had none: **each file exports a `define*` factory that parses an author-written literal, and a `define*` factory is the authoring door.** That is the same lens the registered-type batches used, and it is cheaper than reasoning about who consumes the output. Recorded in the ledger for the next row that needs promoting out of `(p)`.
16
+
17
+
What this checkout could not settle, stated in the ledger rather than glossed: whether `objectui` also *constructs* these configs programmatically and parses them with extra internal keys. If it does, strictness turns that into a loud 422 at its build — detectable, with the rename suggested — rather than the silent narrowing it replaces.
0 commit comments