Found while fixing #8343. Filed rather than fixed: that card's file surface was the CLI wiring block plus tests, and this is a packages/cloud-connection behaviour change with its own blast radius.
packages/cloud-connection/src/runtime-config-plugin.ts builds its response with marketplace hardcoded:
features: {
installLocal: this.installLocal,
marketplace: true,
// aiStudio + autoPublishAiBuilds + any distribution keys.
...features,
},
installLocal is at least config-driven. marketplace is a literal, so /api/v1/runtime/config tells the Console the catalog is browsable on every runtime that mounts this plugin — including one where MarketplaceProxyPlugin was never mounted because no control-plane URL resolved. That is the same declared-is-not-enforced shape as #8343's second symptom, one key over: an affordance the SPA renders and the runtime cannot serve.
This is a live constraint, not a hypothetical. It is the reason #8343's fix mounts install-local alone on a cloud-less runtime and deliberately does not also mount RuntimeConfigPlugin there: doing so would have restored the Console's knowledge of install-local at the cost of asserting a browse capability that is definitively absent — trading the reported bug for its mirror image. So a cloud-less framework runtime currently has a working install-local route that the Console cannot discover.
Why it should be the plugin's own answer, not the host's
Adding a marketplace?: boolean config knob would work but repeats the mistake one layer up: every host must then remember to keep the flag in step with its own mounting, which is precisely what the objectos-ee config and the package README both failed to do. Preferable is for the flag to be derived from what is actually mounted — the proxy registers a service or is discoverable on the kernel at kernel:ready, and the runtime-config handler reports presence rather than a constant. The handler already runs per request and already reads the kernel (env-registry), so the seam exists.
That is a design call rather than an obvious edit, which is why this is filed for triage rather than folded into #8343.
Acceptance
features.marketplace reflects whether a marketplace browse surface is actually mounted on the kernel serving the response.
- A cloud-less runtime can report
installLocal: true truthfully without also claiming browse.
- Coverage pinning both directions (mounted proxy reports true; no proxy reports false).
Backlink: #8343. Related: #8355.
Generated by Claude Code
Found while fixing #8343. Filed rather than fixed: that card's file surface was the CLI wiring block plus tests, and this is a
packages/cloud-connectionbehaviour change with its own blast radius.packages/cloud-connection/src/runtime-config-plugin.tsbuilds its response withmarketplacehardcoded:installLocalis at least config-driven.marketplaceis a literal, so/api/v1/runtime/configtells the Console the catalog is browsable on every runtime that mounts this plugin — including one whereMarketplaceProxyPluginwas never mounted because no control-plane URL resolved. That is the same declared-is-not-enforced shape as #8343's second symptom, one key over: an affordance the SPA renders and the runtime cannot serve.This is a live constraint, not a hypothetical. It is the reason #8343's fix mounts install-local alone on a cloud-less runtime and deliberately does not also mount
RuntimeConfigPluginthere: doing so would have restored the Console's knowledge of install-local at the cost of asserting a browse capability that is definitively absent — trading the reported bug for its mirror image. So a cloud-less framework runtime currently has a working install-local route that the Console cannot discover.Why it should be the plugin's own answer, not the host's
Adding a
marketplace?: booleanconfig knob would work but repeats the mistake one layer up: every host must then remember to keep the flag in step with its own mounting, which is precisely what the objectos-ee config and the package README both failed to do. Preferable is for the flag to be derived from what is actually mounted — the proxy registers a service or is discoverable on the kernel atkernel:ready, and the runtime-config handler reports presence rather than a constant. The handler already runs per request and already reads the kernel (env-registry), so the seam exists.That is a design call rather than an obvious edit, which is why this is filed for triage rather than folded into #8343.
Acceptance
features.marketplacereflects whether a marketplace browse surface is actually mounted on the kernel serving the response.installLocal: truetruthfully without also claiming browse.Backlink: #8343. Related: #8355.
Generated by Claude Code