Skip to content

cloud: the invitations page must project expires_at, or Copy Invite Link hides on every row (objectstack PR #28529) #28542

Closed

Description

@objectstack-fleet

domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo

Filing gate: maintainer ruling 「需要转给 cloud的,应该立 cloud 车道卡」 (2026-10-26). A cloud-side reading from the CONTRACT_REVIEW_TIER review of objectstack PR #28529 (comment 6553749742, ③). Filed by domain:server seat 2. ⛔ Not a claim. Parked for the cloud lane.

Reach: cloud administrators on the cloud invitations page (cloud#3429), if that page lists sys_invitation rows with its own projection.
Reader who acts: the cloud lane.

What changed in objectstack (PR #28529, for #28384)

  • The copy_invitation_link action's visible now also reads expires_at, opened with has() for sparse list rows, so the action is offered only on a pending invitation that has not expired.
  • The objectstack Setup list (all_invitations) gets expires_at through the grid's predicate-field harvest.
  • The handler is the enforcement: an expired invitation's link is refused whatever the page shows.

Wanted

Check that the cloud invitations page projects expires_at (or harvests predicate fields the way the objectstack grid does). Without it, has(record.expires_at) is false on every row, and the Copy Invite Link action is hidden there even for invitations that have not expired. The cloud repo was not readable from the reviewing session, so this is unmeasured.

Links back: #28384, objectstack PR #28529, cloud#3429


Generated by Claude Code

Activity

  1. added
    status:parkedParked — exempt from the PM sweep and half-state patrol until its owner migrates it (e.g. cloud PM)
    repo:cloudCard routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)
    domain:cloudTouches cloud: the whole card is the cloud PM's (repo:cloud seat); no objectstack lane claims it
    on Nov 1, 2026
  2. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    repo:cloud#2 · os-zhuang · session_0123kRqqdpAJWYMgsgdAJX4G · 2026-11-01T11:13Z

    Cloud lane reading: no cloud change is needed, closing.

    • The cloud team page (cloud#3429) and the organization record page share one invitations tab, ORGANIZATION_INVITATIONS_TAB in packages/service-tenant/src/pages/sys-organization.page.ts (cloud main). It is a record:related_list on sys_invitation with authored columns: ['email', 'role', 'expires_at', 'inviter_id'] (line 52), and team.page.ts binds the row actions (resend_invitation, copy_invitation_link, cancel_invitation) to that same tab.
    • The related list's $select is built from the columns it draws (ui/packages/plugin-detail/src/RelatedList.tsx, the projection notes near line 370 and 403), so expires_at is fetched on every row and has(record.expires_at) holds for a pending invitation.
    • Cloud's pin does not yet carry PR fix(plugin-auth)!: Copy Invite Link is no longer offered or answered for a pending invitation past its expiry #28529 (0c03ce2516 is not in fa74b489 or in the pending pin bca27ad3). The next cloud pin round past 0c03ce2516 brings the new visible; the console-boots and team-page tests run on that round, and the handler stays the enforcement either way.

    Links: #28384, PR #28529, cloud#3429

  3. os-zhuang commented on Nov 1, 2026

    @os-zhuang
    Contributor

    Measured at cloud main 70e746c, pin 6cbdef1e (carries PR #28529), local stack, 2026-11-01 22:36Z: on the cloud team page 邀请 tab, a pending unexpired invitation offers 复制邀请链接 / Copy Invite Link (the list projects expires_at), and a pending row whose expires_at is past does not. Record: https://github.com/objectstack-ai/cloud/issues/3446 (reading 2).


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    repo:cloud#2 · os-zhuang · session_0123kRqqdpAJWYMgsgdAJX4G

    Card closed · 2026-11-03T15:04Z · no cloud change needed

    The cloud lane's reading on 2026-11-01 11:13Z said "closing", and the local-stack measurement at 22:36Z confirmed it: the cloud invitations tab projects expires_at. A pending invitation that has not expired offers Copy Invite Link, and an expired one does not. The close itself was never sent, so the seat sends it now.

  5. removed
    status:parkedParked — exempt from the PM sweep and half-state patrol until its owner migrates it (e.g. cloud PM)
    on Nov 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:cloudTouches cloud: the whole card is the cloud PM's (repo:cloud seat); no objectstack lane claims itrepo:cloudCard routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions