Skip to content

plugin-auth: the environment-user host seam cannot cancel a pending person's invitation, and has no durable retry or per-row invitation status #33228

Open

Description

@objectstack-fleet

domain:server#7 · os-tesla · session_01L9qibzuZJBQY4wUQFJbkfx

Filing gate: a maintainer-ruled execution term not yet built (objectstack-ai/cloud#4465, quoted on #33181 comment 6870710213); follow-up of #33181 / draft PR #33227. ⛔ Not a claim; triage sets the lane and grade.

What is missing

#33181 adds pending, SSO-only people on a cloud-managed environment (POST /admin/add-sso-user, POST /admin/import-sso-users) and a host seam, the auth plugin's environmentUserHost option (environment-user-host.ts). The host is told after a person is added and asked before a person is deactivated (admin/ban-user) or reactivated (admin/unban-user). It can refuse with a typed 409 / 403. The event carries the administrator's cloud user id from their linked objectstack-cloud account.

Two execution terms from the rulings that #33181 does not cover:

  1. Cancel on delete. No door deletes a pending row on a Free or Team hosted kernel, so a typo'd address can't be cancelled, and the host has no member that tells it to cancel the invitation. Deactivating a pending row does tell the host (userDeactivated, with source: 'idp_pending'), but the row stays.
  2. Durable outbox with retry, and per-row invitation status. Today the seam is one call per operation. A host that fails is reported on the answer (host: { notified: false, reason: 'host_failed' }) and logged, and re-adding a still-pending person tells the host again. Nothing retries on its own, and Setup → Users has nothing to read an invitation status from.

The rulings this follows

Rulings relayed on #33181, comment 6870710213 (objectstack-ai/cloud#4465). Execution terms for the environment, verbatim:

  • A durable outbox with retry (mirror sys_environment_revocation), with per-row invitation status in Setup → Users.
  • Deleting or deactivating a pending row cancels its cloud invitation (the email-typo case).
  • No database transaction is held across the invite call. The cap calls back into the environment (GET /_admin/environments/:id/ai-seats, which fails closed with 503).

Edge path, verbatim:

  • A pending row that never accepts: it stays pending, can be re-sent, and can be deleted, which cancels the invitation.

What this card would decide and build

Seam

Seam: plugin-auth:environment-user-host.ts (EnvironmentUserHost) → cloud host (invitation create / cancel).

Dedupe words: remove-sso-user, cancel pending invitation, environment user outbox, invitation status Setup Users, environmentUserHost retry.

Activity

  1. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH

    Path: none

    Triage: first touch → domain:server · p1 · pm:blocked · 2026-11-14T06:44Z

    ⛔ Not a claim.

    Blocked-by: #33181

  2. added
    domain:serverDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    priority:p1High: required for production / M2
    on Nov 14, 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:serverDomain lane — seat card indexed by label:pm:seatpm:blockedBlocked by another issue/PR — body carries Blocked-by: #Npriority:p1High: required for production / M2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions