Skip to content

Consume the declared nav runAction slot — retire the private ?runAction= string convention #5216

Description

@os-support-ai

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:

  1. 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.
  2. 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.
  3. 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

  1. 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).
  2. CloudOnboardingNext.tsx: stop hand-concatenating ${envsRoute}?runAction=create_environment; drive the deep link from declared metadata via the slot.
  3. 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).
  4. After landing: flip the framework liveness ledger row app.jsonapps.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.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions