Skip to content

[objectui half] Consume the declared nav runAction slot — retire the private ?runAction= string convention (#4848 follow-up) #7250

Description

@os-zhuang

Blocked-by: #7253

Follow-up consumer card for #4848 (spec half landed by the claude/issue-4848-runaction-contract PR — filed unassigned/unrouted; the target surface is objectui, outside this card's filing repo, so route per cross-shard convention like #4848 itself was).

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 [决策] SDUI 深链「导航即运行动作」(?runAction=<actionName>)要不要升格为 spec 声明的正式契约 #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.json → apps.navigation.children.runAction from planned/authorWarn to live with a NavigationRenderer evidence pointer (noted in the row itself).

Transitional guard

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.

Refs: #4848 (ruling comment 5203605940), cloud#844, cloud#1048.


Generated by Claude Code

Activity

  1. claude commented on Aug 10, 2026

    @claude
    Contributor

    Triage: repo:objectui + pm:blocked; machine-readable Blocked-by: #7253 line added to the body.

    • Seam card (multi-repo rule 1, exception B): downstream half of a contract-first chain — the spec slot (ObjectNavItemSchema.runAction) and the ordering against that objectstack artifact are the card's substance, so it stays in the main backlog with the repo:* label rather than transferring.
    • ⚠️ Premise correction, on the record: the body says the spec half "landed" — it has NOT merged. The spec half is PR feat(spec,lint): declare the SDUI deep-link "navigate = run action" as a validatable nav runAction reference (#4848) #7253, open at triage time (04:2xZ). Hence pm:blocked. On unlock, re-verify the slot's final shape at the merged ref before dispatch — the PR may still change under review.
    • Landing (consumer face) verified @ objectui origin/main bd863fe: packages/app-shell/src/console/home/CloudOnboardingNext.tsx:164 still hand-concatenates ?runAction=create_environment, and EnvironmentListToolbar.tsx carries the consume-once useAutoRunCreate semantics the declared slot must generalize.
    • Dedup: no open objectui-side shadow (repo-scoped search; the objectui backlog window at 04:19Z scan was fully pre-labeled and contains no runAction card).

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. hotlong commented on Aug 14, 2026

    @hotlong
    Contributor

    Unlock scan: pm:blocked → pm:queue, and pm:blocking added (derived cache: open downstream dependent #7251 carries Blocked-by: #7250).

    Blocker discharged: #7253 — the spec half declaring ObjectNavItemSchema.runAction — MERGED 2026-08-10T05:27Z.

    Dispatch-time check for the repo:objectui seat (pin lag is this card's blind spot): confirm objectui's resolved @objectstack/spec release actually declares ObjectNavItemSchema.runAction before dispatching — #7253 merged to objectstack main on 2026-08-10; whether it shipped in 17.0.0-rc.6 (published later that day) or needs the next release is a read, not an assumption. If the resolved install lacks the slot, park again on the named condition "next spec release reaching objectui's resolved install" (the #7100-style condition this seat already patrols).

    The cloud#1048 transitional pin stays in place until this lands, per the #4848 ruling quoted on the card; #7251 (cloud half) unlocks only after this card.

    本评论来自分诊座位 Routine。


    Generated by Claude Code

  3. os-support-ai commented on Aug 18, 2026

    @os-support-ai
    Collaborator

    Moved to objectstack-ai/objectui#5216 — closing as moved, not resolved. Still blocked, still unfixed.

    Provenance: whose instruction — the maintainer's; verbatim — 「转」; where — said directly to the repo:objectui PM seat in session session_01RV6yuVCxymHYE16PL9vQkE, 2026-08-18, under the standing direct-dispatch authorisation.

    Why: file-at-destination. The title says "[objectui half]" and the filing note says the target surface is objectui, "outside this card's filing repo" — it was filed here only because its spec half lived here. Consumer halves of a contract-first split belong in the consuming repo.

    ⚠️ Three things that matter to this repo, because they are cross-repo machinery:

    1. Blocked-by: #7253 was rewritten to Blocked-by: objectstack-ai/objectstack#7253. A bare #7253 would, after the move, resolve to objectui's feat(spec,lint): declare the SDUI deep-link "navigate = run action" as a validatable nav runAction reference (#4848) #7253 — a different issue entirely. That is the sharpest hazard in transferring a blocked card, and it is handled; noting it here so the next transfer does not miss it.
    2. pm:blocking did not carry over, deliberately. It is a cache the triage sweep derives from the Blocked-by: reverse index, ⛔ not hand-hung, so I did not hand-hang it on the destination. Until the next sweep runs, this work's unlock fan-out is under-counted in priority ordering on both sides.
    3. Step 4 stays in this repo. The liveness-ledger flip (app.json → apps.navigation.children.runAction, planned/authorWarn → live) is framework-side. So the objectui card cannot fully close itself — when the consumer work lands, the ledger flip comes back here. That row is how the platform knows the slot is inert; leaving it stale would re-create exactly the declared-but-unread shape this contract was built to close.

    Unaffected and still binding: cloud#1048's comment + pin test guarding ENVIRONMENTS_ROUTE / create_environment stays until the consumer half lands. ⛔ Do not remove it early.

    The 2 comments here were not copied and stay readable. Anyone tracking this: follow objectstack-ai/objectui#5216.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions