---
id: ATS-PFM-CSH-001
scope: CAP-PFM-CSH-001
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-001-01
    title: A context answer precedes working content
    level: browser
    proves:
      - BR-CAP-PFM-CSH-001-03
      - AS-JNY-PFM-CSH-001-01
    preconditions: A signed-in employee starts in a fresh browser context.
    steps: Capture the first load and repeat after reload.
    expected: >-
      The context read leads the application requests; working content mounts
      only after its answer.
    negative: false
    data_needs: >-
      An isolated browser context with the stated identity, workspace and
      response fixtures.
    bound_to:
      - TST-PFM-CSH-008
    provenance: test
    source: >-
      react-console:e2e/dev/initialisation.dev.spec.ts#asks the Platform exactly
      one thing first, and shows nothing until it is answered
    category: invariant
    test_sources:
      - >-
        react-console:e2e/dev/initialisation.dev.spec.ts#asks the Platform
        exactly one thing first, and shows nothing until it is answered
      - >-
        react-console:e2e/dev/initialisation.dev.spec.ts#asks again on a reload,
        still before anything else
    action_evidence:
      provenance: test
      source: >-
        react-console:e2e/dev/initialisation.dev.spec.ts#asks the Platform
        exactly one thing first, and shows nothing until it is answered
    assertion_evidence:
      provenance: test
      source: >-
        react-console:e2e/dev/initialisation.dev.spec.ts#asks the Platform
        exactly one thing first, and shows nothing until it is answered
  - id: ATS-PFM-CSH-001-02
    title: Retry moves failed startup into usable work
    level: browser
    proves:
      - BR-CAP-PFM-CSH-001-04
    preconditions: An initial context read fails; the retry can return usable authority.
    steps: 'Start the console, select retry and complete the next answer.'
    expected: >-
      The failure view supplies retry and sign-out; successful retry mounts the
      working console.
    negative: true
    data_needs: >-
      An isolated browser context with the stated identity, workspace and
      response fixtures.
    bound_to: []
    provenance: proposed
    source: >-
      react-console:components/console/console-boot-screens.tsx:consoleBootScreens
    category: failure
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        react-console:components/console/console-boot-screens.tsx:consoleBootScreens
    assertion_evidence:
      provenance: proposed
      source: >-
        react-console:components/console/console-boot-screens.tsx:consoleBootScreens
  - id: ATS-PFM-CSH-001-03
    title: Access refusal and incomplete setup remain distinguishable
    level: unit
    proves:
      - BR-CAP-PFM-CSH-001-04
    preconditions: >-
      One account is refused access; a separate build lacks required
      configuration.
    steps: Present each startup condition independently.
    expected: >-
      Refusal names the signed-in account and provides sign-out; incomplete
      setup lists the missing configuration.
    negative: true
    data_needs: Independent fixture inputs for the variants listed in this case.
    bound_to: []
    provenance: proposed
    source: >-
      react-console:components/console/console-boot-screens.tsx:consoleBootScreens
    category: permission
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        react-console:components/console/console-boot-screens.tsx:consoleBootScreens
    assertion_evidence:
      provenance: proposed
      source: >-
        react-console:components/console/console-boot-screens.tsx:consoleBootScreens
  - id: ATS-PFM-CSH-001-04
    title: Fallback notice can be dismissed without losing work
    level: browser
    proves:
      - BR-CAP-PFM-CSH-001-05
    preconditions: The remembered workspace has become unavailable.
    steps: 'Load the console, inspect the fallback notice and dismiss it.'
    expected: >-
      The changed starting context is explained; dismissal removes the notice
      while leaving the console usable.
    negative: false
    data_needs: >-
      An isolated browser context with the stated identity, workspace and
      response fixtures.
    bound_to:
      - TST-PFM-CSH-006
    provenance: test
    source: >-
      react-console:e2e/controlled/tenant-unavailable.controlled.spec.ts#falls
      back to the default tenant, with a word of explanation, rather than
      refusing access
    category: transition
    test_sources:
      - >-
        react-console:e2e/controlled/tenant-unavailable.controlled.spec.ts#falls
        back to the default tenant, with a word of explanation, rather than
        refusing access
    action_evidence:
      provenance: test
      source: >-
        react-console:e2e/controlled/tenant-unavailable.controlled.spec.ts#falls
        back to the default tenant, with a word of explanation, rather than
        refusing access
    assertion_evidence:
      provenance: test
      source: >-
        react-console:e2e/controlled/tenant-unavailable.controlled.spec.ts#falls
        back to the default tenant, with a word of explanation, rather than
        refusing access
  - id: ATS-PFM-CSH-001-05
    title: Sample currency conversion keeps its own rounding contract
    level: unit
    proves:
      - BR-CAP-PFM-CSH-001-07
    preconditions: The demonstration amount helper selects Canadian dollars.
    steps: >-
      Convert a base amount in both directions and format ordinary and compact
      results.
    expected: >-
      The fixed rate and cent rounding determine conversion; each display uses
      the helper’s defined precision.
    negative: false
    data_needs: Independent fixture inputs for the variants listed in this case.
    bound_to: []
    provenance: proposed
    source: 'react-console:components/console/console-provider.tsx:useMoney'
    category: boundary
    test_sources: []
    action_evidence:
      provenance: proposed
      source: 'react-console:components/console/console-provider.tsx:useMoney'
    assertion_evidence:
      provenance: proposed
      source: 'react-console:components/console/console-provider.tsx:useMoney'
  - id: ATS-PFM-CSH-001-06
    title: Frame startup supplies the first usable menu
    category: interaction
    level: browser
    proves:
      - BR-CAP-PFM-CSH-001-03
      - BR-CAP-PFM-CSH-006-02
    preconditions: An association employee opens a fresh workspace session.
    steps: 'Delay the context answer, then return an enabled CRM context.'
    expected: >-
      The frame and menu wait together; after the answer, CRM destinations
      appear under the established workspace.
    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-001-work-inside-one-console-frame.md
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        rhythm-v2-docs:specs/platform/console-shell/planning/capabilities/CAP-PFM-CSH-001-work-inside-one-console-frame.md
    assertion_evidence:
      provenance: proposed
      source: >-
        rhythm-v2-docs:specs/platform/console-shell/planning/capabilities/CAP-PFM-CSH-001-work-inside-one-console-frame.md
evidence:
  - >-
    react-console at baf6dae: app/(console)/layout.tsx,
    components/console/{console-shell,site-header,console-boot-screens,console-provider}.tsx,
    lib/auth/messages.ts, docs/migration/02-information-architecture.md §1.
  - >-
    services-platform at ad3f6a6: modules/security/aws/api/access.routes.ts
    (getMySecurityContext, getMySecurityContextInTenant: the answer the frame
    waits for; 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-051.
coverage:
  rule: 'gap: FND-PFM-CSH-051'
  transition: 'gap: FND-PFM-CSH-051'
  validation: 'gap: FND-PFM-CSH-051'
  permission: 'gap: FND-PFM-CSH-051'
  edge: 'gap: FND-PFM-CSH-051'
  failure: covered
  boundary: covered
  concurrency: 'gap: FND-PFM-CSH-051'
  invariant: 'gap: FND-PFM-CSH-051'
  interaction: 'gap: FND-PFM-CSH-051'
coverage_notes:
  rule:
    provenance: unknown
    source: FND-PFM-CSH-051
    reason: >-
      No dedicated scenario establishes this category; applicability and the
      required fixtures need review.
  transition:
    provenance: unknown
    source: FND-PFM-CSH-051
    reason: >-
      The associated lifecycle has additional transitions beyond the specified
      cases.
  validation:
    provenance: unknown
    source: FND-PFM-CSH-051
    reason: >-
      No dedicated scenario establishes this category; applicability and the
      required fixtures need review.
  permission:
    provenance: unknown
    source: FND-PFM-CSH-051
    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-051
    reason: >-
      No dedicated scenario establishes this category; applicability and the
      required fixtures need review.
  failure:
    provenance: proposed
    source: ATS-PFM-CSH-001-02
    reason: >-
      The listed scenarios specify this category; their bindings separately
      identify existing executable evidence.
  boundary:
    provenance: proposed
    source: ATS-PFM-CSH-001-05
    reason: >-
      The listed scenarios specify this category; their bindings separately
      identify existing executable evidence.
  concurrency:
    provenance: unknown
    source: FND-PFM-CSH-051
    reason: >-
      No complete scenario matrix covers repeated events, overlapping reads or
      superseded answers for this capability.
  invariant:
    provenance: unknown
    source: FND-PFM-CSH-051
    reason: Associated object invariants remain without explicit proving scenarios.
  interaction:
    provenance: unknown
    source: FND-PFM-CSH-051
    reason: >-
      Related-capability combinations remain unspecified beyond the interactions
      listed.
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-051'
      - 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-051'
      - ordinal: 3
        from: loading
        to: no-access
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:boot
          (PermissionDeniedError)
        disposition: 'gap: FND-PFM-CSH-051'
      - ordinal: 4
        from: loading
        to: failed
        provenance: observed
        source: 'react-console:lib/security-context/provider.tsx:boot'
        disposition: 'gap: FND-PFM-CSH-051'
      - 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-051'
      - ordinal: 6
        from: failed
        to: failed
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:SecurityContextProvider
          (attempt)
        disposition: 'gap: FND-PFM-CSH-051'
      - ordinal: 7
        from: ready
        to: changing-workspace
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:openTenantId,
          leaveTenant
        disposition: 'gap: FND-PFM-CSH-051'
      - 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-051'
      - 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-051'
      - ordinal: 10
        from: ready
        to: ended
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:signOut,
          onSessionEnded listener
        disposition: 'gap: FND-PFM-CSH-051'
      - ordinal: 11
        from: no-access
        to: ended
        provenance: observed
        source: >-
          react-console:components/console/console-boot-screens.tsx:consoleBootScreens
        disposition: 'gap: FND-PFM-CSH-051'
      - ordinal: 12
        from: failed
        to: ended
        provenance: observed
        source: >-
          react-console:components/console/console-boot-screens.tsx:consoleBootScreens
        disposition: 'gap: FND-PFM-CSH-051'
      - ordinal: 13
        from: ready
        to: ready
        provenance: observed
        source: 'react-console:lib/security-context/provider.tsx:leaveTenant'
        disposition: 'gap: FND-PFM-CSH-051'
      - ordinal: 14
        from: failed
        to: ready
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:SecurityContextProvider
          (boot)
        disposition: 'gap: FND-PFM-CSH-051'
      - ordinal: 15
        from: failed
        to: no-access
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:SecurityContextProvider
          (boot)
        disposition: 'gap: FND-PFM-CSH-051'
      - ordinal: 16
        from: failed
        to: unconfigured
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:SecurityContextProvider
          (boot)
        disposition: 'gap: FND-PFM-CSH-051'
      - ordinal: 17
        from: failed
        to: signing-in
        provenance: observed
        source: >-
          react-console:lib/security-context/provider.tsx:SecurityContextProvider
          (boot)
        disposition: 'gap: FND-PFM-CSH-051'
    note: >-
      The finding carries exhaustive transition execution coverage; overlapping
      scenario examples do not close the remaining lifecycle matrix.
interactions:
  - capability: CAP-PFM-CSH-006
    provenance: proposed
    source: ATS-PFM-CSH-001-06
  - capability: CAP-PFM-CSH-011
    provenance: unknown
    source: FND-PFM-CSH-051
  - capability: CAP-PFM-CSH-013
    provenance: unknown
    source: FND-PFM-CSH-051
workflow_obligations:
  - artifact: WF-PFM-CSH-001
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/platform/console-shell/design/workflows/WF-PFM-CSH-001-start-the-console-and-settle-the-working-context.md
    disposition: 'gap: FND-PFM-CSH-051'
    note: >-
      Review every hop, branch, failure and race with the cited capability
      scenarios; unexecuted combinations remain in the coverage finding.
---

# Use a consistent console frame: 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-001-03` | `ATS-PFM-CSH-001-01`, `ATS-PFM-CSH-001-06` |
| `BR-CAP-PFM-CSH-001-04` | `ATS-PFM-CSH-001-02`, `ATS-PFM-CSH-001-03` |
| `BR-CAP-PFM-CSH-001-05` | `ATS-PFM-CSH-001-04` |
| `BR-CAP-PFM-CSH-001-07` | `ATS-PFM-CSH-001-05` |

Startup retry must be exercised through every failure outcome, cancellation and session ending. Workspace remount and cleanup belong to the switching interactions, not to an assumed universal cache-erasure guarantee.

## Interactions With Related Capabilities

The frame and menu wait together; after the answer, CRM destinations appear under the established workspace.

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.
