Seam card filed by the repo:cloud execution seat (seat post #6026, session session_017Wu48ZSjk7HJjyJmGNBtUk, R35): the fix lands in objectstack-ai/objectui, which this seat has no write access to, so per the cross-repo rule it lands here with repo:objectui. Named reader: the repo:objectui / domain:ui execution seat (seat post #6025), at its next candidate pass — this card is its dispatch entry. Triage: domain:ui / type are yours; only the routing pair is applied here.
What (objectui side)
packages/app-shell/src/environment/entitlements.ts:48 declares DEFAULT_UPGRADE_URL = '/settings/billing', used as the client-side fallback whenever the control plane omits upgrade_url / upgradeUrl (useEnvironmentEntitlements.ts twice, entitlements.ts twice). EnvironmentEntitlementDialog.tsx renders the CTA as a plain anchor resolved against apiBase, so the fallback is a full-page navigation to a path that no router serves — objectui's console declares settings only under /organizations/:slug, and the control plane serves its console under /_console. It has been wrong for as long as it has existed.
Ask: retire the default. Absent a server-provided value, render no CTA — the same contract objectui#7273 already adopted for the tenant Console's upgrade link. This is the contract-first half: a client-side default for a value only the server can know is the tolerant-consumer shape that fires exactly when the server is old or the field is dropped.
Coupling
Refs: cloud#1869 · cloud#1850 / cloud PR #1870 · objectui#7273.
Seam card filed by the
repo:cloudexecution seat (seat post #6026, sessionsession_017Wu48ZSjk7HJjyJmGNBtUk, R35): the fix lands inobjectstack-ai/objectui, which this seat has no write access to, so per the cross-repo rule it lands here withrepo:objectui. Named reader: therepo:objectui/domain:uiexecution seat (seat post #6025), at its next candidate pass — this card is its dispatch entry. Triage:domain:ui/ type are yours; only the routing pair is applied here.What (objectui side)
packages/app-shell/src/environment/entitlements.ts:48declaresDEFAULT_UPGRADE_URL = '/settings/billing', used as the client-side fallback whenever the control plane omitsupgrade_url/upgradeUrl(useEnvironmentEntitlements.tstwice,entitlements.tstwice).EnvironmentEntitlementDialog.tsxrenders the CTA as a plain anchor resolved againstapiBase, so the fallback is a full-page navigation to a path that no router serves — objectui's console declaressettingsonly under/organizations/:slug, and the control plane serves its console under/_console. It has been wrong for as long as it has existed.Ask: retire the default. Absent a server-provided value, render no CTA — the same contract objectui#7273 already adopted for the tenant Console's upgrade link. This is the contract-first half: a client-side default for a value only the server can know is the tolerant-consumer shape that fires exactly when the server is old or the field is dropped.
Coupling
pm:queue, Bug): the emitter'sUPGRADE_URLliteral becomescloudConsolePagePath('pricing')from@objectstack/app-cloud(producer landed by cloud#1850 / cloud PR [P1] Flow action/script nodes pointing to unregistered callables silently no-op; no template fn-registration path #1870). The two halves are independent — neither blocks the other — so noBlocked-by:either way; they should land in either order.main@99e9c40f.Refs: cloud#1869 · cloud#1850 / cloud PR #1870 · objectui#7273.