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
fix(rest,client)!: reconcile the two REST↔client mismatches the audit ledgered (#3610, #3611) (#3621)
* fix(rest,client)!: reconcile the two REST-client mismatches the audit ledgered (#3610, #3611)
#3610: the REST package registrar claimed the bare POST /packages for
marketplace publish ({manifest, metadata}) while the dispatcher packages
domain gives the same verb+path install semantics — and REST registers
first in the production stack (first-match-wins), so every
client.packages.install call landed on the publish handler and 400'd.
Marketplace publish moves to POST /api/v1/packages/publish (zero direct
callers found repo- and objectui-wide; the dispatcher's two-segment
POST /packages/:id/publish is a different shape, no clash). The remaining
REST GET/GET/DELETE shadows are compatible and stay: the dispatcher
already double-writes on install (protocol.installPackage) and fully
uninstalls on DELETE (protocol.deletePackage).
#3611: meta.getView spoke the ?type= query dialect only the dispatcher
/ui domain understands; REST mounts only the path form
/ui/view/:object/:type, so the query form 404'd wherever REST serves
(e.g. project-scoped bases). The client now sends the path form both
surfaces accept, with a URL-pinning test — no test locked this URL
before, which is exactly how the split survived.
REST route ledger: both mismatch rows resolved (packages publish row is
server-only publisher tooling; ui row flips to sdk). Zero mismatches
remain.
Closes#3610Closes#3611
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LX9ut3MK3KykE11S9bJmv5
* docs(api): metadata-api packages section — bare POST installs, publish moved to /packages/publish
The doc described the pre-#3610 collision state: bare POST /packages as
marketplace publish. That path is install (409 duplicate guard, overwrite
opt-in); publish now lives at POST /packages/publish.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LX9ut3MK3KykE11S9bJmv5
---------
Co-authored-by: Claude <noreply@anthropic.com>
note: 'path-param dialect; meta.getView sends /ui/view/:object?type= (query dialect), which this pattern cannot match — the dispatcher /ui domain answers it instead. Reconcile shapes or retire one dialect.'},
note: 'was mismatch — meta.getView spoke the ?type= query dialectthis pattern cannot match; since #3611 the client sends the path form both surfaces accept'},
113
113
114
114
// ── data CRUD ─────────────────────────────────────────────────────────────
note: 'REST handler is registry publish ({manifest, metadata}); the dispatcher /packages domain gives POST /packages install semantics with a different body. REST registers first, so packages.install traffic lands here — reconcile before relying on either.'},
note: 'marketplace registry publish ({manifest, metadata}) — publisher tooling, not app-SDK surface. Moved off the bare POST /packages in #3610: that verb+path is the dispatcher install route, and REST registering it first swallowed every packages.install call with a 400.'},
0 commit comments