Skip to content

Layer 0: should a verified platform admin cross the org wall by PERMISSION entitlement, not only posturePermitsCrossTenant's three shapes? (cloud#1676 upstream half) #12974

Description

@hotlong

From cloud#1676 (control-plane operator console reads EMPTY on Tenant Usage / Payout Accruals under the armed Layer 0 wall) — this is the general-fix adjudication that card explicitly deferred upstream.

The contract question

computeTenantLayer0Filter lets a platform admin cross the organization wall only where posturePermitsCrossTenant holds — isPrivate || tenancyDisabled || isBetterAuthManaged (plugin-security/src/security-plugin.ts). A PUBLIC TENANT object matches none of the three, so a deliberately org-less platform admin hits isolated's "no active organization ⇒ fail closed" and reads EMPTY — even where a Layer-1 mechanism has already verified the admin and would audit the read (cloud's cross_org_admin_read widening fires, 200 is returned, zero rows inside).

Proposal to adjudicate: a verified platform admin crosses Layer 0 on any object their permission entitles them to, rather than only on the three enumerated shapes. Possibly via the OrgScopingEntitlement surface (#12704 added a platform-global exemption arm — is that the intended door, and does it cover per-object admin entitlement rather than only object-level exemption?).

Why it matters beyond the two objects

Any operator surface over PUBLIC tenant-owned control tables has this shape. Cloud has taken the contained route-side detour meanwhile (explicitly-authorized /api/v1/cloud/admin/* reads, admin-session-gated + audited, landed with the both-directions pin in unscoped-control-plane-tenant-wall.test.ts) — but the operator's METADATA-DRIVEN screens still read the generic data path and stay empty until either this adjudication opens the wall for entitled admins, or every such screen is moved off the generic path one by one.

Measured evidence

Two-tenant rig, apps/cloud/test/unscoped-control-plane-tenant-wall.test.ts: generic-path admin reads pinned EMPTY (both directions), route-side reads pinned FULL — the pair documents exactly the delta this adjudication would close.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions