---
id: TST-PFM-CSH-003
title: Workspace refusal decisions
kind: unit
product_area: platform
module: console-shell
revision: 1
status: draft
source_sha:
  rhythm-v2-docs: 25e253cb434aac6603ee294e3ca197ab6c4bfd0b
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
repository: react-console
files:
  - components/console/__tests__/tenant-id-gate.test.tsx
implements:
  - ATS-PFM-CSH-010-03
  - ATS-PFM-CSH-010-04
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 1
isolation: >-
  Independent in-memory fixtures, static rendering or read-only source
  inspection; mocked listeners and global state are restored by the test.
evidence:
  - >-
    react-console:components/console/__tests__/tenant-id-gate.test.tsx at
    baf6dae382d6f41dce976c7f848667ccc37e076f
  - >-
    react-console:components/console/__tests__/tenant-id-gate.test.tsx#leaves
    anyone else on the access-denied page
  - >-
    react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads to
    the tenant the person is still in
  - >-
    react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads to
    another tenant they can reach when they are in none, never the refused one
  - >-
    react-console:components/console/__tests__/tenant-id-gate.test.tsx#is not
    offered when they can reach no other tenant
  - >-
    react-console:components/console/__tests__/tenant-id-gate.test.tsx#says the
    workspace is unavailable, never no access, with the way back for staff
  - >-
    react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads a
    non-staff person to another workspace, never the unavailable one
binding_boundary:
  - scenario: ATS-PFM-CSH-010-03
    provenance: test
    source: >-
      react-console:components/console/__tests__/tenant-id-gate.test.tsx#leaves
      anyone else on the access-denied page;
      react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads
      to the tenant the person is still in;
      react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads
      to another tenant they can reach when they are in none, never the refused
      one; react-console:components/console/__tests__/tenant-id-gate.test.tsx#is
      not offered when they can reach no other tenant
    note: >-
      This file supplies the complete stated scenario outcome at its declared
      test boundary.
  - scenario: ATS-PFM-CSH-010-04
    provenance: test
    source: >-
      react-console:components/console/__tests__/tenant-id-gate.test.tsx#says
      the workspace is unavailable, never no access, with the way back for
      staff;
      react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads a
      non-staff person to another workspace, never the unavailable one
    note: >-
      This file supplies the complete stated scenario outcome at its declared
      test boundary.
---

# Workspace refusal decisions

## Verification Boundary

Pure decisions and static refusal panels check customer denial, staff routing, return-workspace selection and unavailable-workspace wording. Provider mounting, refusal memory and request timing remain outside these tests.

This register records static review at the supplied source commits. The suite exists, but this pass does not run it or mark its conformance verified.

## What This Suite Proves

- Refusal selects only a reachable return destination.
- Disabled workspace entry remains an availability refusal.

Bindings that span files are collective: each file contributes only its recorded assertions. The exact anchors are in frontmatter.

## What It Does Not Prove

The register claims only the linked scenario outcomes at this boundary. It establishes no passing deployment result, complete permission matrix or unlisted cross-capability journey. Proposed scenarios and the remaining lifecycle, invariant and race obligations stay in the coverage findings.

## Real Dependencies and Test Doubles

The imported functions, registry declarations and any static component rendering are real. Independent in-memory inputs represent grants, contexts or records; there is no deployed service or browser session.

## Must Not Be Doubled

Do not replace the function, component, registry or source declaration under test. Keep the expected outcome independent of its implementation; injected inputs do not justify stubbing the computation being verified.
