---
id: ATS-PFM-CSH-011
scope: CAP-PFM-CSH-011
product_area: platform
module: console-shell
revision: 3
status: proposed
approved_by: null
approved_at: null
source_sha:
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  rhythm-v2-docs: 25e253cb434aac6603ee294e3ca197ab6c4bfd0b
scenarios:
  - id: ATS-PFM-CSH-011-01
    title: Switch construction retains reusable work and removes records
    level: unit
    proves:
      - BR-CAP-PFM-CSH-011-02
    preconditions: 'Address fixtures cover record, administrative and planned destinations.'
    steps: Compute the reusable destination for a different workspace.
    expected: >-
      Area and list survive; record values and queries are removed, including
      the appropriate handling of a planned path.
    negative: false
    data_needs: Independent fixture inputs for the variants listed in this case.
    bound_to:
      - TST-PFM-CSH-029
    provenance: test
    source: >-
      react-console:lib/routes/__tests__/routes.test.ts#keeps the workspace and
      resource list and drops record ids and queries
    category: interaction
    test_sources:
      - >-
        react-console:lib/routes/__tests__/routes.test.ts#keeps the workspace
        and resource list and drops record ids and queries
    action_evidence:
      provenance: test
      source: >-
        react-console:lib/routes/__tests__/routes.test.ts#keeps the workspace
        and resource list and drops record ids and queries
    assertion_evidence:
      provenance: test
      source: >-
        react-console:lib/routes/__tests__/routes.test.ts#keeps the workspace
        and resource list and drops record ids and queries
  - id: ATS-PFM-CSH-011-02
    title: Browser switching waits for destination authority
    level: browser
    proves:
      - BR-CAP-PFM-CSH-011-02
      - BR-CAP-PFM-CSH-011-07
      - AS-JNY-PFM-CSH-004-01
    preconditions: A person can reach another workspace while viewing a contact record.
    steps: Select the other workspace and await entry.
    expected: >-
      Its contacts list uses the destination identity and authority without
      retaining the previous record body.
    negative: false
    data_needs: >-
      An isolated browser context with the stated identity, workspace and
      response fixtures.
    bound_to: []
    provenance: proposed
    source: 'react-console:lib/security-context/provider.tsx:openTenantId'
    category: rule
    test_sources: []
    action_evidence:
      provenance: proposed
      source: 'react-console:lib/security-context/provider.tsx:openTenantId'
    assertion_evidence:
      provenance: proposed
      source: 'react-console:lib/security-context/provider.tsx:openTenantId'
  - id: ATS-PFM-CSH-011-03
    title: The selector offers the context’s reachable choices
    level: browser
    proves:
      - BR-CAP-PFM-CSH-011-01
    preconditions: The context contains exactly two reachable workspaces.
    steps: Open the header selector and enumerate its choices.
    expected: >-
      The offered pair matches the context rather than a broader workspace
      catalogue.
    negative: false
    data_needs: >-
      An isolated browser context with the stated identity, workspace and
      response fixtures.
    bound_to: []
    provenance: proposed
    source: 'react-console:components/console/tenant-switcher.tsx:TenantSwitcher'
    category: invariant
    test_sources: []
    action_evidence:
      provenance: proposed
      source: 'react-console:components/console/tenant-switcher.tsx:TenantSwitcher'
    assertion_evidence:
      provenance: proposed
      source: 'react-console:components/console/tenant-switcher.tsx:TenantSwitcher'
  - id: ATS-PFM-CSH-011-04
    title: The current workspace selection causes no route change
    category: validation
    level: browser
    proves:
      - BR-CAP-PFM-CSH-011-03
    preconditions: The selector names the workspace already held.
    steps: Select that workspace and observe navigation and requests.
    expected: >-
      The address and working page remain in place with no selection-driven
      navigation.
    negative: false
    data_needs: >-
      A fresh browser context, isolated account fixtures and controlled
      responses for the listed transitions.
    bound_to: []
    provenance: proposed
    source: >-
      rhythm-v2-docs:specs/platform/console-shell/planning/capabilities/CAP-PFM-CSH-011-switch-to-another-workspace-without-carrying-records-across.md
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        rhythm-v2-docs:specs/platform/console-shell/planning/capabilities/CAP-PFM-CSH-011-switch-to-another-workspace-without-carrying-records-across.md
    assertion_evidence:
      provenance: proposed
      source: >-
        rhythm-v2-docs:specs/platform/console-shell/planning/capabilities/CAP-PFM-CSH-011-switch-to-another-workspace-without-carrying-records-across.md
  - id: ATS-PFM-CSH-011-05
    title: Workspace search appears only beyond six choices
    category: boundary
    level: browser
    proves:
      - BR-CAP-PFM-CSH-011-01
      - BR-CAP-PFM-CSH-011-05
    preconditions: 'The context is exercised with one, six and seven reachable workspaces.'
    steps: >-
      Inspect the selector and search by partial name and identifier when search
      is present.
    expected: >-
      Alternatives depend on having multiple choices; search is absent at six
      and present at seven, with a clear empty result for unmatched input.
    negative: false
    data_needs: >-
      A fresh browser context, isolated account fixtures and controlled
      responses for the listed transitions.
    bound_to: []
    provenance: proposed
    source: >-
      rhythm-v2-docs:specs/platform/console-shell/planning/capabilities/CAP-PFM-CSH-011-switch-to-another-workspace-without-carrying-records-across.md
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        rhythm-v2-docs:specs/platform/console-shell/planning/capabilities/CAP-PFM-CSH-011-switch-to-another-workspace-without-carrying-records-across.md
    assertion_evidence:
      provenance: proposed
      source: >-
        rhythm-v2-docs:specs/platform/console-shell/planning/capabilities/CAP-PFM-CSH-011-switch-to-another-workspace-without-carrying-records-across.md
  - id: ATS-PFM-CSH-011-06
    title: Switching rewrites a record destination to the new list
    category: interaction
    level: browser
    proves:
      - BR-CAP-PFM-CSH-011-02
      - BR-CAP-PFM-CSH-009-02
    preconditions: A contact record is open in the association workspace.
    steps: Select the reachable sandbox from the workspace selector.
    expected: >-
      The sandbox contact list opens without the old record identity and the
      selector names the sandbox.
    negative: false
    data_needs: >-
      A fresh browser context, isolated account fixtures and controlled
      responses for the listed transitions.
    bound_to:
      - TST-PFM-CSH-014
    provenance: test
    source: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#switching tenant
      opens the same list under the other tenant's id, record ids dropped
    test_sources:
      - >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#switching tenant
        opens the same list under the other tenant's id, record ids dropped
    action_evidence:
      provenance: test
      source: >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#switching tenant
        opens the same list under the other tenant's id, record ids dropped
    assertion_evidence:
      provenance: test
      source: >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#switching tenant
        opens the same list under the other tenant's id, record ids dropped
evidence:
  - >-
    react-console at baf6dae: components/console/tenant-switcher.tsx,
    lib/routes/match.ts (switchTenantPath), lib/routes/__tests__/routes.test.ts,
    docs/url-architecture.md §6 and §11 item 11,
    e2e/mock/url-architecture.mock.spec.ts.
  - >-
    services-platform at ad3f6a6: modules/security/aws/api/access.routes.ts
    (getMySecurityContext with tenant_id and preferred_tenant_id,
    getMySecurityContextInTenant; MOD-PFM-SEC).
  - >-
    rhythm-v2-docs at 25e253cb434aac6603ee294e3ca197ab6c4bfd0b: capability,
    related capabilities, domain objects, client lifecycles, workflows and prior
    OpenAI examinations; continuation coverage limitations are recorded in
    FND-PFM-CSH-061.
coverage:
  rule: 'gap: FND-PFM-CSH-061'
  transition: 'gap: FND-PFM-CSH-061'
  validation: covered
  permission: 'gap: FND-PFM-CSH-061'
  edge: 'gap: FND-PFM-CSH-061'
  failure: 'gap: FND-PFM-CSH-061'
  boundary: covered
  concurrency: 'gap: FND-PFM-CSH-061'
  invariant: 'gap: FND-PFM-CSH-061'
  interaction: covered
coverage_notes:
  rule:
    provenance: unknown
    source: FND-PFM-CSH-061
    reason: Some mandatory rules still need a scenario.
  transition:
    provenance: unknown
    source: FND-PFM-CSH-061
    reason: >-
      The associated lifecycle has additional transitions beyond the specified
      cases.
  validation:
    provenance: proposed
    source: ATS-PFM-CSH-011-04
    reason: >-
      The listed scenarios specify this category; their bindings separately
      identify existing executable evidence.
  permission:
    provenance: unknown
    source: FND-PFM-CSH-061
    reason: >-
      The named permission keys still need a complete allowed, denied and scope
      matrix across their enforcement boundaries.
  edge:
    provenance: unknown
    source: FND-PFM-CSH-061
    reason: >-
      No dedicated scenario establishes this category; applicability and the
      required fixtures need review.
  failure:
    provenance: unknown
    source: FND-PFM-CSH-061
    reason: >-
      No dedicated scenario establishes this category; applicability and the
      required fixtures need review.
  boundary:
    provenance: proposed
    source: ATS-PFM-CSH-011-05
    reason: >-
      The listed scenarios specify this category; their bindings separately
      identify existing executable evidence.
  concurrency:
    provenance: unknown
    source: FND-PFM-CSH-061
    reason: >-
      No complete scenario matrix covers repeated events, overlapping reads or
      superseded answers for this capability.
  invariant:
    provenance: unknown
    source: FND-PFM-CSH-061
    reason: Associated object invariants remain without explicit proving scenarios.
  interaction:
    provenance: proposed
    source: ATS-PFM-CSH-011-01; ATS-PFM-CSH-011-06
    reason: >-
      The listed scenarios specify this category; their bindings separately
      identify existing executable evidence.
design_obligations:
  - artifact: STATE-PFM-CSH-001
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/platform/console-shell/design/state-models/STATE-PFM-CSH-001-console-start-up-and-working-context.md
    transitions:
      - ordinal: 1
        from: loading
        to: unconfigured
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:boot
          (missingConfiguration)
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 2
        from: loading
        to: signing-in
        provenance: test
        source: >-
          react-console:e2e/dev/url-architecture.dev.spec.ts#a signed-out deep
          link goes through sign-in and comes back to the same page and query
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 3
        from: loading
        to: no-access
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:boot
          (PermissionDeniedError)
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 4
        from: loading
        to: failed
        provenance: observed
        source: 'react-console:lib/security-context/provider.tsx:boot'
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 5
        from: loading
        to: ready
        provenance: test
        source: >-
          react-console:lib/security-context/boot.test.ts;
          e2e/controlled/tenant-unavailable.controlled.spec.ts#falls back to the
          default tenant, with a word of explanation, rather than refusing
          access
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 6
        from: failed
        to: failed
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:SecurityContextProvider
          (attempt)
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 7
        from: ready
        to: changing-workspace
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:openTenantId,
          leaveTenant
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 8
        from: changing-workspace
        to: ready
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:openTenantId (ticket),
          leaveTenant
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 9
        from: changing-workspace
        to: failed
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:switchTenant (no
          screen calls it at the pinned commit)
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 10
        from: ready
        to: ended
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:signOut,
          onSessionEnded listener
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 11
        from: no-access
        to: ended
        provenance: observed
        source: >-
          react-console:components/console/console-boot-screens.tsx:consoleBootScreens
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 12
        from: failed
        to: ended
        provenance: observed
        source: >-
          react-console:components/console/console-boot-screens.tsx:consoleBootScreens
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 13
        from: ready
        to: ready
        provenance: observed
        source: 'react-console:lib/security-context/provider.tsx:leaveTenant'
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 14
        from: failed
        to: ready
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:SecurityContextProvider
          (boot)
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 15
        from: failed
        to: no-access
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:SecurityContextProvider
          (boot)
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 16
        from: failed
        to: unconfigured
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:SecurityContextProvider
          (boot)
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 17
        from: failed
        to: signing-in
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:SecurityContextProvider
          (boot)
        disposition: 'gap: FND-PFM-CSH-061'
    note: >-
      The finding carries exhaustive transition execution coverage; overlapping
      scenario examples do not close the remaining lifecycle matrix.
  - artifact: STATE-PFM-CSH-002
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/platform/console-shell/design/state-models/STATE-PFM-CSH-002-workspace-entry-from-an-address.md
    transitions:
      - ordinal: 1
        from: resolving
        to: entered
        provenance: test
        source: >-
          react-console:e2e/mock/url-architecture.mock.spec.ts#a record deep
          link survives a reload
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 2
        from: resolving
        to: waiting-after-leave
        provenance: observed
        source: >-
          react-console:components/console/tenant-id-gate.tsx:TenantIdGate
          (wasJustLeft, JUST_LEFT_RETRY_MS)
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 3
        from: waiting-after-leave
        to: resolving
        provenance: observed
        source: 'react-console:components/console/tenant-id-gate.tsx:TenantIdGate'
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 4
        from: resolving
        to: not-found
        provenance: test
        source: >-
          react-console:e2e/mock/url-architecture.mock.spec.ts#an id no tenant
          has shows not found
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 5
        from: resolving
        to: denied
        provenance: test
        source: >-
          react-console:components/console/__tests__/tenant-id-gate.test.tsx#leaves
          anyone else on the access-denied page
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 6
        from: denied
        to: sent-to-hq
        provenance: observed
        source: >-
          react-console:components/console/tenant-id-gate.tsx:deniedDestination,
          TenantIdGate
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 7
        from: resolving
        to: unavailable
        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
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 8
        from: resolving
        to: failed
        provenance: observed
        source: >-
          react-console:lib/security-context/tenant-id.ts:TenantIdUnconfirmedError;
          components/console/tenant-id-gate.tsx
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 9
        from: not-found
        to: resolving
        provenance: observed
        source: 'react-console:components/console/tenant-id-gate.tsx:rememberedRefusal'
        disposition: 'gap: FND-PFM-CSH-061'
      - ordinal: 10
        from: denied
        to: resolving
        provenance: observed
        source: 'react-console:components/console/tenant-id-gate.tsx:rememberedRefusal'
        disposition: 'gap: FND-PFM-CSH-061'
    note: >-
      The finding carries exhaustive transition execution coverage; overlapping
      scenario examples do not close the remaining lifecycle matrix.
interactions:
  - capability: CAP-PFM-CSH-009
    provenance: proposed
    source: ATS-PFM-CSH-011-06
workflow_obligations:
  - artifact: WF-PFM-CSH-002
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/platform/console-shell/design/workflows/WF-PFM-CSH-002-enter-the-workspace-an-address-names.md
    disposition: 'gap: FND-PFM-CSH-061'
    note: >-
      Review every hop, branch, failure and race with the cited capability
      scenarios; unexecuted combinations remain in the coverage finding.
  - artifact: WF-PFM-CSH-003
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/platform/console-shell/design/workflows/WF-PFM-CSH-003-switch-to-another-workspace.md
    disposition: 'gap: FND-PFM-CSH-061'
    note: >-
      Review every hop, branch, failure and race with the cited capability
      scenarios; unexecuted combinations remain in the coverage finding.
---

# Continue in another workspace without reusing a record: Capability Test Specification

## Coverage

The coverage map describes specified proof, not a passing run. Each mandatory rule below has a scenario or an explicit finding; a proposed scenario remains an execution obligation even when its expected outcome follows the pinned implementation.

| Mandatory Rule | Scenarios or Finding |
|---|---|
| `BR-CAP-PFM-CSH-011-01` | `ATS-PFM-CSH-011-03`, `ATS-PFM-CSH-011-05` |
| `BR-CAP-PFM-CSH-011-02` | `ATS-PFM-CSH-011-01`, `ATS-PFM-CSH-011-02`, `ATS-PFM-CSH-011-06` |
| `BR-CAP-PFM-CSH-011-03` | `ATS-PFM-CSH-011-04` |
| `BR-CAP-PFM-CSH-011-05` | `ATS-PFM-CSH-011-05` |
| `BR-CAP-PFM-CSH-011-07` | `ATS-PFM-CSH-010-09`, `ATS-PFM-CSH-011-02` |
| `BR-CAP-PFM-CSH-011-08` | `FND-PFM-CSH-061` |

Switching needs one, six and seven choices, name and identifier search, same-choice no-op, delayed confirmation, cleanup failure, concurrent destination answers and remembered identity isolation. A changed URL does not establish cleared caches.

## Interactions With Related Capabilities

The sandbox contact list opens without the old record identity and the selector names the sandbox.

The interaction rows cite the contracts they exercise. Related combinations without a complete case remain in the coverage finding, together with cross-capability workflows and permission boundaries. A helper assertion is bound only for its stated outcome; the full browser handoff remains proposed until a suite checks it.


Pinned source and exact test anchors are recorded in frontmatter. Test bindings record static assertion review and use the executable-suite register; no product test result is inferred from that review. The prior planning and design examinations supply context, while this continuation records the remaining proof obligations explicitly.
