---
id: ATS-PFM-CSH-009
scope: CAP-PFM-CSH-009
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-009-01
    title: Source guards keep the page inventory within the address boundary
    level: unit
    proves:
      - BR-CAP-PFM-CSH-009-01
      - BR-CAP-PFM-CSH-009-04
    preconditions: The pinned page tree and canonical route declarations are available.
    steps: Scan page inventory and forbidden literal navigation paths.
    expected: >-
      Every scanned page belongs to a route or declared exception; scanned
      console links use the permitted address construction.
    negative: true
    data_needs: Independent fixture inputs for the variants listed in this case.
    bound_to:
      - TST-PFM-CSH-027
    provenance: test
    source: >-
      react-console:lib/routes/__tests__/guards.test.ts#places every page.tsx on
      a route node or an allowed page that is not a tenant's
    category: invariant
    test_sources:
      - >-
        react-console:lib/routes/__tests__/guards.test.ts#places every page.tsx
        on a route node or an allowed page that is not a tenant's
      - >-
        react-console:lib/routes/__tests__/guards.test.ts#has a page for every
        route node that says it has one
      - >-
        react-console:lib/routes/__tests__/guards.test.ts#finds no literal
        console path outside lib/routes
      - >-
        react-console:lib/routes/__tests__/guards.test.ts#names the canonical
        place of a page added at an old path
    action_evidence:
      provenance: test
      source: >-
        react-console:lib/routes/__tests__/guards.test.ts#places every page.tsx
        on a route node or an allowed page that is not a tenant's
    assertion_evidence:
      provenance: test
      source: >-
        react-console:lib/routes/__tests__/guards.test.ts#places every page.tsx
        on a route node or an allowed page that is not a tenant's
  - id: ATS-PFM-CSH-009-02
    title: Defined address words follow the naming convention
    level: unit
    proves:
      - BR-CAP-PFM-CSH-009-03
    preconditions: Static route segments and application folder names are enumerated.
    steps: Check the defined words in both catalogues.
    expected: >-
      They use lowercase or camelCase and contain no forbidden hyphen or
      underscore.
    negative: true
    data_needs: Independent fixture inputs for the variants listed in this case.
    bound_to:
      - TST-PFM-CSH-027
    provenance: test
    source: >-
      react-console:lib/routes/__tests__/guards.test.ts#names every folder under
      app/ with a lowercase word or camelCase
    category: validation
    test_sources:
      - >-
        react-console:lib/routes/__tests__/guards.test.ts#names every folder
        under app/ with a lowercase word or camelCase
      - >-
        react-console:lib/routes/__tests__/guards.test.ts#names every static
        segment of the route table, Rhythm HQ and the sign-in pages the same way
    action_evidence:
      provenance: test
      source: >-
        react-console:lib/routes/__tests__/guards.test.ts#names every folder
        under app/ with a lowercase word or camelCase
    assertion_evidence:
      provenance: test
      source: >-
        react-console:lib/routes/__tests__/guards.test.ts#names every folder
        under app/ with a lowercase word or camelCase
  - id: ATS-PFM-CSH-009-03
    title: Representative builder and matcher fixtures agree
    level: unit
    proves:
      - BR-CAP-PFM-CSH-009-02
      - BR-CAP-PFM-CSH-009-09
    preconditions: >-
      Fixtures include Configuration Regions and a query-bearing contact or
      queue destination.
    steps: Build the fixture addresses and evaluate the matching destination fixture.
    expected: >-
      Built addresses retain supported query values and the representative
      destination matches its expected route nodes.
    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#puts a tenant path under
      the tenant, query kept
    category: rule
    test_sources:
      - >-
        react-console:lib/routes/__tests__/routes.test.ts#puts a tenant path
        under the tenant, query kept
      - >-
        react-console:lib/routes/__tests__/routes.test.ts#reads Configuration ›
        CRM › Regions
    action_evidence:
      provenance: test
      source: >-
        react-console:lib/routes/__tests__/routes.test.ts#puts a tenant path
        under the tenant, query kept
    assertion_evidence:
      provenance: test
      source: >-
        react-console:lib/routes/__tests__/routes.test.ts#puts a tenant path
        under the tenant, query kept
  - id: ATS-PFM-CSH-009-04
    title: Record reload and list history retain their destinations
    level: browser
    proves:
      - BR-CAP-PFM-CSH-009-06
      - AS-JNY-PFM-CSH-003-02
    preconditions: >-
      Independent browser fixtures cover a record and the Contacts and
      Organizations lists.
    steps: >-
      Reload the record; separately navigate the two lists and use Back and
      Forward.
    expected: >-
      The record keeps its identity and query on reload; the list-history case
      restores each visited list address.
    negative: false
    data_needs: >-
      An isolated browser context with the stated identity, workspace and
      response fixtures.
    bound_to:
      - TST-PFM-CSH-014
    provenance: test
    source: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#a record deep link
      survives a reload
    category: transition
    test_sources:
      - >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#a record deep link
        survives a reload
      - >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#back and forward
        move between tenant pages
    action_evidence:
      provenance: test
      source: >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#a record deep link
        survives a reload
    assertion_evidence:
      provenance: test
      source: >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#a record deep link
        survives a reload
  - id: ATS-PFM-CSH-009-05
    title: Sign-in returns to the requested page and query
    level: browser
    proves:
      - BR-CAP-PFM-CSH-009-07
      - AS-JNY-PFM-CSH-003-01
    preconditions: A signed-out browser opens a workspace destination with query information.
    steps: Follow sign-in and complete the development fixture login.
    expected: The signed-in browser reaches the original page with its query retained.
    negative: false
    data_needs: >-
      An isolated browser context with the stated identity, workspace and
      response fixtures.
    bound_to:
      - TST-PFM-CSH-009
    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
    category: interaction
    test_sources:
      - >-
        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
    action_evidence:
      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
    assertion_evidence:
      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
  - id: ATS-PFM-CSH-009-06
    title: Planned and unknown destinations remain different
    level: browser
    proves:
      - BR-CAP-PFM-CSH-009-08
    preconditions: A registered unfinished destination has a declared page permission.
    steps: 'Open it with and without authority, then open an unregistered path.'
    expected: >-
      The respective outcomes are a guarded placeholder, permission refusal and
      not found.
    negative: true
    data_needs: >-
      An isolated browser context with the stated identity, workspace and
      response fixtures.
    bound_to: []
    provenance: proposed
    source: >-
      react-console:app/(console)/console/[tenantId]/[...slug]/page.tsx:ModulePage
    category: edge
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        react-console:app/(console)/console/[tenantId]/[...slug]/page.tsx:ModulePage
    assertion_evidence:
      provenance: proposed
      source: >-
        react-console:app/(console)/console/[tenantId]/[...slug]/page.tsx:ModulePage
  - id: ATS-PFM-CSH-009-07
    title: Configuration namespaces never share one key
    level: unit
    proves:
      - BR-CAP-PFM-CSH-009-05
    preconditions: The registered modules and cross-module areas are both available.
    steps: Compare each area word with the module-key collection.
    expected: The two namespaces contain no shared key.
    negative: true
    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#never shares a word
      between a configuration module and a cross-module area
    test_sources:
      - >-
        react-console:lib/routes/__tests__/routes.test.ts#never shares a word
        between a configuration module and a cross-module area
    action_evidence:
      provenance: test
      source: >-
        react-console:lib/routes/__tests__/routes.test.ts#never shares a word
        between a configuration module and a cross-module area
    assertion_evidence:
      provenance: test
      source: >-
        react-console:lib/routes/__tests__/routes.test.ts#never shares a word
        between a configuration module and a cross-module area
    category: boundary
  - id: ATS-PFM-CSH-009-08
    title: Unknown and registered planned destinations diverge
    category: failure
    level: browser
    proves:
      - BR-CAP-PFM-CSH-009-08
    preconditions: >-
      One address is unregistered and another is a registered unfinished
      destination.
    steps: Open both destinations with their required authority.
    expected: >-
      The unregistered address yields not found; the registered address reaches
      its guarded placeholder.
    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-009-open-any-console-page-from-its-address.md
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        rhythm-v2-docs:specs/platform/console-shell/planning/capabilities/CAP-PFM-CSH-009-open-any-console-page-from-its-address.md
    assertion_evidence:
      provenance: proposed
      source: >-
        rhythm-v2-docs:specs/platform/console-shell/planning/capabilities/CAP-PFM-CSH-009-open-any-console-page-from-its-address.md
  - id: ATS-PFM-CSH-009-09
    title: A direct settings address aligns menu and breadcrumb
    category: interaction
    level: browser
    proves:
      - BR-CAP-PFM-CSH-009-02
      - BR-CAP-PFM-CSH-006-07
    preconditions: A customer administrator can read Configuration Regions.
    steps: Open Regions directly and inspect its active entry and breadcrumb.
    expected: >-
      Regions is active within Configuration and both navigation surfaces
      identify the same destination.
    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#Configuration › CRM ›
      Regions loads with its place in the sidebar and the breadcrumb
    test_sources:
      - >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#Configuration › CRM
        › Regions loads with its place in the sidebar and the breadcrumb
    action_evidence:
      provenance: test
      source: >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#Configuration › CRM
        › Regions loads with its place in the sidebar and the breadcrumb
    assertion_evidence:
      provenance: test
      source: >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#Configuration › CRM
        › Regions loads with its place in the sidebar and the breadcrumb
  - id: ATS-PFM-CSH-009-11
    title: Former Eligibility links preserve the workspace and rule screen
    category: rule
    level: unit
    proves:
      - BR-CAP-PFM-CSH-009-10
    preconditions: 'Redirect fixtures cover the list, creation and each defined rule subpage.'
    steps: >-
      Apply the permanent redirect declarations to each former address in two
      workspaces.
    expected: >-
      The matching Configuration destination keeps the named workspace and the
      selected rule screen; unrelated paths are unchanged.
    negative: false
    data_needs: >-
      The pinned route and page fixtures; browser measurements use a fresh
      demonstration context at each tested viewport.
    bound_to:
      - TST-PFM-CSH-026
    test_sources:
      - >-
        react-console:lib/routes/__tests__/eligibility-redirect.test.ts#redirect
        permanently
      - >-
        react-console:lib/routes/__tests__/eligibility-redirect.test.ts#send the
        list to the Configuration list
      - >-
        react-console:lib/routes/__tests__/eligibility-redirect.test.ts#send a
        rule and each of its screens to the same screen under the area
      - >-
        react-console:lib/routes/__tests__/eligibility-redirect.test.ts#keep the
        tenant the link named
      - >-
        react-console:lib/routes/__tests__/eligibility-redirect.test.ts#leave
        other pages alone
    provenance: test
    source: >-
      react-console:lib/routes/__tests__/eligibility-redirect.test.ts#redirect
      permanently
    action_evidence:
      provenance: test
      source: >-
        react-console:lib/routes/__tests__/eligibility-redirect.test.ts#redirect
        permanently
    assertion_evidence:
      provenance: test
      source: >-
        react-console:lib/routes/__tests__/eligibility-redirect.test.ts#redirect
        permanently
evidence:
  - >-
    react-console at baf6dae: docs/url-architecture.md,
    lib/routes/{definitions,build,match,routes,keys}.ts,
    lib/routes/__tests__/{routes,guards,eligibility-redirect}.test.ts,
    app/(console)/console/[tenantId]/[...slug]/page.tsx, next.config.mjs,
    e2e/mock/url-architecture.mock.spec.ts,
    e2e/dev/url-architecture.dev.spec.ts, e2e/security/navigation.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-059.
coverage:
  rule: covered
  transition: covered
  validation: covered
  permission: 'gap: FND-PFM-CSH-059'
  edge: covered
  failure: covered
  boundary: covered
  concurrency: 'gap: FND-PFM-CSH-059'
  invariant: 'gap: FND-PFM-CSH-059'
  interaction: 'gap: FND-PFM-CSH-059'
coverage_notes:
  rule:
    provenance: proposed
    source: >-
      ATS-PFM-CSH-009-01; ATS-PFM-CSH-009-02; ATS-PFM-CSH-009-04;
      ATS-PFM-CSH-009-05; ATS-PFM-CSH-009-06; ATS-PFM-CSH-009-07;
      ATS-PFM-CSH-009-08
    reason: >-
      Every mandatory rule has a proving scenario, including shared interaction
      cases; bindings identify execution separately.
  transition:
    provenance: proposed
    source: ATS-PFM-CSH-009-04
    reason: >-
      The listed scenarios specify this category; their bindings separately
      identify existing executable evidence.
  validation:
    provenance: proposed
    source: ATS-PFM-CSH-009-02
    reason: >-
      The listed scenarios specify this category; their bindings separately
      identify existing executable evidence.
  permission:
    provenance: unknown
    source: FND-PFM-CSH-059
    reason: >-
      The named permission keys still need a complete allowed, denied and scope
      matrix across their enforcement boundaries.
  edge:
    provenance: proposed
    source: ATS-PFM-CSH-009-06
    reason: >-
      The listed scenarios specify this category; their bindings separately
      identify existing executable evidence.
  failure:
    provenance: proposed
    source: ATS-PFM-CSH-009-08
    reason: >-
      The listed scenarios specify this category; their bindings separately
      identify existing executable evidence.
  boundary:
    provenance: test
    source: ATS-PFM-CSH-009-07
    reason: >-
      The Configuration namespace boundary has a source-fixture scenario and
      executable binding.
  concurrency:
    provenance: unknown
    source: FND-PFM-CSH-059
    reason: >-
      No complete scenario matrix covers repeated events, overlapping reads or
      superseded answers for this capability.
  invariant:
    provenance: unknown
    source: FND-PFM-CSH-059
    reason: Associated object invariants remain without explicit proving scenarios.
  interaction:
    provenance: unknown
    source: FND-PFM-CSH-059
    reason: >-
      Related-capability combinations remain unspecified beyond the interactions
      listed.
design_obligations: []
interactions:
  - capability: CAP-PFM-CSH-012
    provenance: unknown
    source: FND-PFM-CSH-059
  - capability: CAP-PFM-CSH-006
    provenance: proposed
    source: ATS-PFM-CSH-009-09
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-059'
    note: >-
      Review every hop, branch, failure and race with the cited capability
      scenarios; unexecuted combinations remain in the coverage finding.
  - artifact: WF-PFM-CSH-008
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/platform/console-shell/design/workflows/WF-PFM-CSH-008-open-a-page-from-its-address.md
    disposition: 'gap: FND-PFM-CSH-059'
    note: >-
      Review every hop, branch, failure and race with the cited capability
      scenarios; unexecuted combinations remain in the coverage finding.
---

# Open console work through a durable address: 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-009-01` | `ATS-PFM-CSH-009-01` |
| `BR-CAP-PFM-CSH-009-03` | `ATS-PFM-CSH-009-02` |
| `BR-CAP-PFM-CSH-009-04` | `ATS-PFM-CSH-009-01` |
| `BR-CAP-PFM-CSH-009-05` | `ATS-PFM-CSH-009-07` |
| `BR-CAP-PFM-CSH-009-06` | `ATS-PFM-CSH-009-04` |
| `BR-CAP-PFM-CSH-009-07` | `ATS-PFM-CSH-009-05` |
| `BR-CAP-PFM-CSH-009-08` | `ATS-PFM-CSH-009-06`, `ATS-PFM-CSH-009-08` |

Address coverage must separate recognized placeholders, unknown routes and sign-in return, including child records and query encoding. Builder and source-scanning tests cannot establish every runtime page guard.

## Interactions With Related Capabilities

Regions is active within Configuration and both navigation surfaces identify the same destination.

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.
