Blocked-by: objectstack-ai/objectstack#7253
Moved from objectstack-ai/objectstack#7250 by the repo:objectui PM seat (session session_01RV6yuVCxymHYE16PL9vQkE) under the maintainer's direct-dispatch authorisation, 2026-08-18, verbatim: 「转」.
Reason: file-at-destination. The original was titled "[objectui half]" and its own filing note says the target surface is objectui, "outside this card's filing repo" — it was filed in the platform repo only because that is where its spec half lived. This is the consumer half of a contract-first split, and consumer halves belong in the consuming repo.
⚠️ Three pieces of cross-repo machinery were rewritten in this move — check them if the unlock scan behaves oddly:
Blocked-by: is now the full cross-repo form (objectstack-ai/objectstack#7253) so this repo's unlock scan can resolve it. It was a bare #7253 and would have resolved to the wrong repo's #7253 after the move — that is the single most dangerous thing about transferring a blocked card, and it is why the line is rewritten rather than copied.pm:blocking did not carry over. The original had it, meaning open downstream dependents exist. That label is a cache derived by the triage sweep from the Blocked-by: reverse index, not hand-maintained — ⛔ so I have not hand-hung it here. It should reappear on the next sweep if dependents still point at this work. Flagging because until then, this card's unlock fan-out is under-counted in priority ordering.- Step 4 below lands in
objectstack, not here — see the scope note at the end.
Original thread has 2 comments; read them there.
Follow-up consumer card for objectstack-ai/objectstack#4848 (spec half landed by the claude/issue-4848-runaction-contract PR).
What the spec half now declares
ObjectNavItemSchema.runAction (optional): an object nav item declares the action to auto-run once on arrival at the object's list surface. The reference is validated (defineStack cross-reference walk + validate-action-name-refs, error severity, did-you-mean). runAction + recordId is parse-rejected. Ledgered planned + authorWarn until a shell consumes the declared slot.
What objectui needs to do
- NavigationRenderer / shell: when an
object nav item carries runAction, land on the list surface and auto-run the declared action once (same semantics EnvironmentListToolbar.tsx's useAutoRunCreate gives the raw ?runAction= query param today — consume-once, autoTrigger the matching toolbar action). CloudOnboardingNext.tsx: stop hand-concatenating ${envsRoute}?runAction=create_environment; drive the deep link from declared metadata via the slot.- Decide whether the URL query param remains the wire encoding of the declared slot (likely yes — the slot then owns the param name in ONE place) and pin the param name pair-wise (the transitional hardening
objectstack-ai/objectstack#4848's 2026-08-06 on-hold comment suggested: concatenation side and consumer side asserting the same constant). - After landing: flip the framework liveness ledger row
app.json → apps.navigation.children.runAction from planned/authorWarn to live with a NavigationRenderer evidence pointer.
⛔ Transitional guard — do not remove it early
cloud#1048's comment + pin test (cloud welcome.page.test.ts) keeps guarding the cloud-owned names (ENVIRONMENTS_ROUTE, create_environment) until this lands. Do not remove it before this card is done.
⚠️ Scope note added on move: step 4 is not in this repo
The liveness-ledger flip is a framework-side action — the ledger lives in objectstack. So this card cannot fully close itself here. When the objectui work lands, the ledger flip goes back to objectstack as a follow-up (or rides a framework PR), and this card should say so in its closing comment rather than silently leaving a planned row behind. That row is the mechanism by which the platform knows the slot is inert; leaving it stale re-creates the declared-but-unread shape this whole contract was built to close.
Refs: objectstack-ai/objectstack#4848 (ruling comment 5203605940), cloud#844, cloud#1048.
Blocked-by: objectstack-ai/objectstack#7253
Follow-up consumer card for
objectstack-ai/objectstack#4848(spec half landed by theclaude/issue-4848-runaction-contractPR).What the spec half now declares
ObjectNavItemSchema.runAction(optional): anobjectnav item declares the action to auto-run once on arrival at the object's list surface. The reference is validated (defineStack cross-reference walk +validate-action-name-refs, error severity, did-you-mean).runAction+recordIdis parse-rejected. Ledgeredplanned+authorWarnuntil a shell consumes the declared slot.What objectui needs to do
objectnav item carriesrunAction, land on the list surface and auto-run the declared action once (same semanticsEnvironmentListToolbar.tsx'suseAutoRunCreategives the raw?runAction=query param today — consume-once,autoTriggerthe matching toolbar action).CloudOnboardingNext.tsx: stop hand-concatenating${envsRoute}?runAction=create_environment; drive the deep link from declared metadata via the slot.objectstack-ai/objectstack#4848's 2026-08-06 on-hold comment suggested: concatenation side and consumer side asserting the same constant).app.json→apps.navigation.children.runActionfromplanned/authorWarntolivewith a NavigationRenderer evidence pointer.⛔ Transitional guard — do not remove it early
cloud#1048's comment + pin test (cloud
welcome.page.test.ts) keeps guarding the cloud-owned names (ENVIRONMENTS_ROUTE,create_environment) until this lands. Do not remove it before this card is done.The liveness-ledger flip is a framework-side action — the ledger lives in
objectstack. So this card cannot fully close itself here. When the objectui work lands, the ledger flip goes back toobjectstackas a follow-up (or rides a framework PR), and this card should say so in its closing comment rather than silently leaving aplannedrow behind. That row is the mechanism by which the platform knows the slot is inert; leaving it stale re-creates the declared-but-unread shape this whole contract was built to close.Refs:
objectstack-ai/objectstack#4848(ruling comment 5203605940), cloud#844, cloud#1048.