---
id: ATS-PFM-CSH-006
scope: CAP-PFM-CSH-006
product_area: platform
module: console-shell
revision: 4
change: RS-20
status: draft
approved_by: null
approved_at: null
source_sha:
  docs-2: fb2806830dd8f650c05fb88d787f3d395a547a9b
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  rhythm-v2-docs: 25e253cb434aac6603ee294e3ca197ab6c4bfd0b
scenarios:
  - id: ATS-PFM-CSH-006-01
    title: Entitlements remove unusable menu sections
    level: unit
    proves:
      - BR-CAP-PFM-CSH-006-02
    preconditions: Input grants enable only selected application domains and item keys.
    steps: Compute visible sections from the registered menu.
    expected: >-
      Unavailable domains and refused entries disappear, including sections
      emptied by filtering.
    negative: true
    data_needs: Independent fixture inputs for the variants listed in this case.
    bound_to:
      - TST-PFM-CSH-021
    provenance: test
    source: >-
      react-console:lib/console/__tests__/registries.test.ts#hides domains the
      user cannot access and keeps what they can
    category: permission
    test_sources:
      - >-
        react-console:lib/console/__tests__/registries.test.ts#hides domains the
        user cannot access and keeps what they can
    action_evidence:
      provenance: test
      source: >-
        react-console:lib/console/__tests__/registries.test.ts#hides domains the
        user cannot access and keeps what they can
    assertion_evidence:
      provenance: test
      source: >-
        react-console:lib/console/__tests__/registries.test.ts#hides domains the
        user cannot access and keeps what they can
  - id: ATS-PFM-CSH-006-02
    title: An omitted product contributes no sidebar section
    level: browser
    proves:
      - BR-CAP-PFM-CSH-006-02
      - AS-JNY-PFM-CSH-005-01
    preconditions: The fixture context lists no access to the selected product.
    steps: Open the demonstration workspace sidebar.
    expected: The absent product’s section is omitted from the rendered menu.
    negative: true
    data_needs: >-
      An isolated browser context with the stated identity, workspace and
      response fixtures.
    bound_to:
      - TST-PFM-CSH-011
    provenance: test
    source: >-
      react-console:e2e/mock/application-access.mock.spec.ts#an application the
      organization does not have is absent from the sidebar
    category: permission
    test_sources:
      - >-
        react-console:e2e/mock/application-access.mock.spec.ts#an application
        the organization does not have is absent from the sidebar
    action_evidence:
      provenance: test
      source: >-
        react-console:e2e/mock/application-access.mock.spec.ts#an application
        the organization does not have is absent from the sidebar
    assertion_evidence:
      provenance: test
      source: >-
        react-console:e2e/mock/application-access.mock.spec.ts#an application
        the organization does not have is absent from the sidebar
  - id: ATS-PFM-CSH-006-03
    title: Tool grants and unguarded links remain distinct
    level: unit
    proves:
      - BR-CAP-PFM-CSH-006-03
    preconditions: Tool fixtures contain only part of the registered authority.
    steps: Compute tools and the separate related-service links.
    expected: >-
      Permitted tools remain; Websites remains visible because that menu link
      declares no permission.
    negative: true
    data_needs: Independent fixture inputs for the variants listed in this case.
    bound_to:
      - TST-PFM-CSH-021
    provenance: test
    source: >-
      react-console:lib/console/__tests__/registries.test.ts#filters tool and
      settings links by permission
    category: rule
    test_sources:
      - >-
        react-console:lib/console/__tests__/registries.test.ts#filters tool and
        settings links by permission
    action_evidence:
      provenance: test
      source: >-
        react-console:lib/console/__tests__/registries.test.ts#filters tool and
        settings links by permission
    assertion_evidence:
      provenance: test
      source: >-
        react-console:lib/console/__tests__/registries.test.ts#filters tool and
        settings links by permission
  - id: ATS-PFM-CSH-006-04
    title: A readable placement can reveal an unfinished section
    level: unit
    proves:
      - BR-CAP-PFM-CSH-006-04
      - BR-CAP-PFM-CSH-008-07
    preconditions: >-
      Built-item and custom-placement fixtures exercise otherwise unfinished
      domains.
    steps: Assemble the menu with and without the active placement.
    expected: >-
      A built entry or eligible placement supplies the section’s display
      eligibility.
    negative: false
    data_needs: Independent fixture inputs for the variants listed in this case.
    bound_to:
      - TST-PFM-CSH-024
    provenance: test
    source: >-
      react-console:lib/custom-objects/__tests__/navigation.test.ts#hides
      domains without a built screen, keeping Submissions and CRM
    category: interaction
    test_sources:
      - >-
        react-console:lib/custom-objects/__tests__/navigation.test.ts#hides
        domains without a built screen, keeping Submissions and CRM
      - >-
        react-console:lib/custom-objects/__tests__/navigation.test.ts#keeps a
        hidden domain reachable when a custom object is placed under it
    action_evidence:
      provenance: test
      source: >-
        react-console:lib/custom-objects/__tests__/navigation.test.ts#hides
        domains without a built screen, keeping Submissions and CRM
    assertion_evidence:
      provenance: test
      source: >-
        react-console:lib/custom-objects/__tests__/navigation.test.ts#hides
        domains without a built screen, keeping Submissions and CRM
  - id: ATS-PFM-CSH-006-05
    title: Direct destinations expose their navigation position
    level: browser
    proves:
      - BR-CAP-PFM-CSH-006-06
      - BR-CAP-PFM-CSH-006-07
      - AS-JNY-PFM-CSH-002-02
    preconditions: A nested settings destination and custom record destination are readable.
    steps: >-
      Open each destination directly and inspect active navigation and
      breadcrumbs.
    expected: >-
      The entry and containing group identify the same current destination as
      the breadcrumb.
    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/app-sidebar.tsx:useSectionOpenState,
      NavSectionItem
    category: interaction
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        react-console:components/console/app-sidebar.tsx:useSectionOpenState,
        NavSectionItem
    assertion_evidence:
      provenance: proposed
      source: >-
        react-console:components/console/app-sidebar.tsx:useSectionOpenState,
        NavSectionItem
  - id: ATS-PFM-CSH-006-06
    title: Opening one section closes the preceding section
    level: browser
    proves:
      - BR-CAP-PFM-CSH-006-06
    preconditions: Two menu sections are visible with an empty filter.
    steps: Open the first section and then the second.
    expected: The second stays open while the first closes.
    negative: false
    data_needs: >-
      An isolated browser context with the stated identity, workspace and
      response fixtures.
    bound_to: []
    provenance: proposed
    source: >-
      react-console:e2e/mock/custom-object-navigation.mock.spec.ts#the menu
      filter finds a custom object and its record pages keep the section open
    category: transition
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        react-console:e2e/mock/custom-object-navigation.mock.spec.ts#the menu
        filter finds a custom object and its record pages keep the section open
    assertion_evidence:
      provenance: proposed
      source: >-
        react-console:e2e/mock/custom-object-navigation.mock.spec.ts#the menu
        filter finds a custom object and its record pages keep the section open
  - id: ATS-PFM-CSH-006-07
    title: 'Menu filtering handles names, absence and reset'
    level: browser
    proves:
      - BR-CAP-PFM-CSH-006-09
    preconditions: The menu supplies multiple section and entry labels.
    steps: >-
      Try an entry fragment, a section label and unmatched text; then use
      Escape.
    expected: >-
      Entry matches are emphasized, section matches retain their entries, no
      matches are explained and reset restores normal navigation.
    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/app-sidebar.tsx:filterSections, Highlight'
    category: validation
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        react-console:components/console/app-sidebar.tsx:filterSections,
        Highlight
    assertion_evidence:
      provenance: proposed
      source: >-
        react-console:components/console/app-sidebar.tsx:filterSections,
        Highlight
  - id: ATS-PFM-CSH-006-08
    title: The planned sidebar revision places Accounting beside CRM
    level: browser
    proves:
      - BR-CAP-PFM-CSH-006-13
    preconditions: >-
      The workspace fixture shows both CRM and Accounting after the usual
      eligibility checks.
    steps: Render the proposed sidebar and compare those two positions.
    expected: >-
      Their positions satisfy the recorded adjacency obligation, which remains
      unbuilt at the source pin.
    negative: false
    data_needs: >-
      An isolated browser context with the stated identity, workspace and
      response fixtures.
    bound_to: []
    provenance: proposed
    source: >-
      docs-2:specs/apps/console/planning/shell/tests/REQ-CNS-292/AC-REQ-CNS-292-01-sidebar-shows-accounting-directly-below-crm-for-a-user-with-both-applications.md#5.
      Acceptance Criteria
    supersedes:
      - AC-REQ-CNS-292-01
    category: rule
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        docs-2:specs/apps/console/planning/shell/tests/REQ-CNS-292/AC-REQ-CNS-292-01-sidebar-shows-accounting-directly-below-crm-for-a-user-with-both-applications.md#5.
        Acceptance Criteria
    assertion_evidence:
      provenance: proposed
      source: >-
        docs-2:specs/apps/console/planning/shell/tests/REQ-CNS-292/AC-REQ-CNS-292-01-sidebar-shows-accounting-directly-below-crm-for-a-user-with-both-applications.md#5.
        Acceptance Criteria
  - id: ATS-PFM-CSH-006-09
    title: Moving Accounting preserves the other registry positions
    level: unit
    proves:
      - BR-CAP-PFM-CSH-006-13
    preconditions: The proposed registry and the pre-change baseline are comparison fixtures.
    steps: >-
      Compare the complete sequences, then compare them with Accounting
      excluded.
    expected: >-
      The proposed registry meets its adjacency obligation; removing the moved
      entry leaves every other position unchanged.
    negative: false
    data_needs: Independent fixture inputs for the variants listed in this case.
    bound_to: []
    provenance: proposed
    source: >-
      docs-2:specs/apps/console/planning/shell/tests/REQ-CNS-292/AC-REQ-CNS-292-02-domain-registry-keeps-accounting-immediately-after-crm.md#5.
      Acceptance Criteria
    supersedes:
      - AC-REQ-CNS-292-02
    category: invariant
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        docs-2:specs/apps/console/planning/shell/tests/REQ-CNS-292/AC-REQ-CNS-292-02-domain-registry-keeps-accounting-immediately-after-crm.md#5.
        Acceptance Criteria
    assertion_evidence:
      provenance: proposed
      source: >-
        docs-2:specs/apps/console/planning/shell/tests/REQ-CNS-292/AC-REQ-CNS-292-02-domain-registry-keeps-accounting-immediately-after-crm.md#5.
        Acceptance Criteria
  - id: ATS-PFM-CSH-006-10
    title: Filtering retains the proposed registry order
    level: browser
    proves:
      - BR-CAP-PFM-CSH-006-01
      - BR-CAP-PFM-CSH-006-02
      - BR-CAP-PFM-CSH-006-04
      - BR-CAP-PFM-CSH-006-13
    preconditions: >-
      Fixtures vary readable applications, built destinations and planned-only
      sections.
    steps: >-
      Render variants with both named applications present and each omitted
      separately.
    expected: >-
      Visible sections form the eligible registry subsequence; adjacency is
      checked when both named sections remain.
    negative: true
    data_needs: >-
      An isolated browser context with the stated identity, workspace and
      response fixtures.
    bound_to: []
    provenance: proposed
    source: >-
      docs-2:specs/apps/console/planning/shell/requirements/REQ-CNS-292-accounting-appears-immediately-under-crm-in-tenant-application-navigation.md#6.
      Required Behavior, items 4 and 6;
      docs-2:specs/apps/console/planning/shell/screens/shared/SCR-CNS-016-application-sidebar.md#4.1
      Tenant-Mode Application Order
    category: permission
    test_sources: []
    action_evidence:
      provenance: proposed
      source: >-
        docs-2:specs/apps/console/planning/shell/requirements/REQ-CNS-292-accounting-appears-immediately-under-crm-in-tenant-application-navigation.md#6.
        Required Behavior, items 4 and 6;
        docs-2:specs/apps/console/planning/shell/screens/shared/SCR-CNS-016-application-sidebar.md#4.1
        Tenant-Mode Application Order
    assertion_evidence:
      provenance: proposed
      source: >-
        docs-2:specs/apps/console/planning/shell/requirements/REQ-CNS-292-accounting-appears-immediately-under-crm-in-tenant-application-navigation.md#6.
        Required Behavior, items 4 and 6;
        docs-2:specs/apps/console/planning/shell/screens/shared/SCR-CNS-016-application-sidebar.md#4.1
        Tenant-Mode Application Order
  - id: ATS-PFM-CSH-006-11
    title: A placed object gives an unfinished application a destination
    category: interaction
    level: unit
    proves:
      - BR-CAP-PFM-CSH-006-04
      - BR-CAP-PFM-CSH-008-07
    preconditions: >-
      Awards has no built destination but contains an active readable Prizes
      placement.
    steps: >-
      Merge placement navigation into the complete domain registry and apply the
      built-item filter.
    expected: >-
      Awards survives with Prizes appended; without the placement it remains
      absent.
    negative: false
    data_needs: Independent in-memory fixtures for each listed input.
    bound_to:
      - TST-PFM-CSH-024
    provenance: test
    source: >-
      react-console:lib/custom-objects/__tests__/navigation.test.ts#keeps a
      hidden domain reachable when a custom object is placed under it
    test_sources:
      - >-
        react-console:lib/custom-objects/__tests__/navigation.test.ts#keeps a
        hidden domain reachable when a custom object is placed under it
    action_evidence:
      provenance: test
      source: >-
        react-console:lib/custom-objects/__tests__/navigation.test.ts#keeps a
        hidden domain reachable when a custom object is placed under it
    assertion_evidence:
      provenance: test
      source: >-
        react-console:lib/custom-objects/__tests__/navigation.test.ts#keeps a
        hidden domain reachable when a custom object is placed under it
evidence:
  - >-
    docs-2:specs/apps/console/planning/shell/tests/REQ-CNS-292/AC-REQ-CNS-292-01-sidebar-shows-accounting-directly-below-crm-for-a-user-with-both-applications.md
  - >-
    docs-2:specs/apps/console/planning/shell/tests/REQ-CNS-292/AC-REQ-CNS-292-02-domain-registry-keeps-accounting-immediately-after-crm.md
  - >-
    docs-2:.forge/context/RS-20/planning.changeset.json#revision 2;
    finalized.approval (Andrew Ryan, 2026-10-23T01:23:36.443Z; approvalId
    846d23adfdaddf891729e33fee72850a4c1d588517d40f29a4a78d264262ae53)
  - >-
    react-console at baf6dae:
    components/console/{nav-config.ts,app-sidebar.tsx},
    lib/console/{domains.ts,use-visible-nav.ts},
    lib/console/__tests__/registries.test.ts,
    lib/custom-objects/__tests__/navigation.test.ts,
    e2e/mock/{application-access,url-architecture,custom-object-navigation}.mock.spec.ts,
    docs/migration/02-information-architecture.md §1 to §3.
  - >-
    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-056.
coverage:
  rule: covered
  transition: covered
  validation: covered
  permission: 'gap: FND-PFM-CSH-056'
  edge: 'gap: FND-PFM-CSH-056'
  failure: 'gap: FND-PFM-CSH-056'
  boundary: 'gap: FND-PFM-CSH-056'
  concurrency: 'gap: FND-PFM-CSH-056'
  invariant: 'gap: FND-PFM-CSH-056'
  interaction: 'gap: FND-PFM-CSH-056'
coverage_notes:
  rule:
    provenance: proposed
    source: >-
      ATS-PFM-CSH-001-06; ATS-PFM-CSH-006-01; ATS-PFM-CSH-006-02;
      ATS-PFM-CSH-006-03; ATS-PFM-CSH-006-04; ATS-PFM-CSH-006-05;
      ATS-PFM-CSH-006-06; ATS-PFM-CSH-006-07; ATS-PFM-CSH-006-08;
      ATS-PFM-CSH-006-09; ATS-PFM-CSH-006-10; ATS-PFM-CSH-006-11;
      ATS-PFM-CSH-008-06; ATS-PFM-CSH-008-07; ATS-PFM-CSH-009-09;
      ATS-PFM-CSH-016-09
    reason: >-
      Every mandatory rule has a proving scenario, including shared interaction
      cases; bindings identify execution separately.
  transition:
    provenance: proposed
    source: ATS-PFM-CSH-006-06
    reason: >-
      The listed scenarios specify this category; their bindings separately
      identify existing executable evidence.
  validation:
    provenance: proposed
    source: ATS-PFM-CSH-006-07
    reason: >-
      The listed scenarios specify this category; their bindings separately
      identify existing executable evidence.
  permission:
    provenance: unknown
    source: FND-PFM-CSH-056
    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-056
    reason: >-
      No dedicated scenario establishes this category; applicability and the
      required fixtures need review.
  failure:
    provenance: unknown
    source: FND-PFM-CSH-056
    reason: >-
      No dedicated scenario establishes this category; applicability and the
      required fixtures need review.
  boundary:
    provenance: unknown
    source: FND-PFM-CSH-056
    reason: >-
      No dedicated scenario establishes this category; applicability and the
      required fixtures need review.
  concurrency:
    provenance: unknown
    source: FND-PFM-CSH-056
    reason: >-
      No complete scenario matrix covers repeated events, overlapping reads or
      superseded answers for this capability.
  invariant:
    provenance: unknown
    source: FND-PFM-CSH-056
    reason: Associated object invariants remain without explicit proving scenarios.
  interaction:
    provenance: unknown
    source: FND-PFM-CSH-056
    reason: >-
      Related-capability combinations remain unspecified beyond the interactions
      listed.
design_obligations: []
interactions:
  - capability: CAP-PFM-CSH-008
    provenance: proposed
    source: ATS-PFM-CSH-006-04; ATS-PFM-CSH-006-11
  - capability: CAP-PFM-CSH-007
    provenance: unknown
    source: FND-PFM-CSH-056
workflow_obligations:
  - artifact: WF-PFM-CSH-007
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/platform/console-shell/design/workflows/WF-PFM-CSH-007-assemble-the-navigation-menu.md
    disposition: 'gap: FND-PFM-CSH-056'
    note: >-
      Review every hop, branch, failure and race with the cited capability
      scenarios; unexecuted combinations remain in the coverage finding.
---

# Find a destination in the application menu: 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-006-02` | `ATS-PFM-CSH-001-06`, `ATS-PFM-CSH-006-01`, `ATS-PFM-CSH-006-02`, `ATS-PFM-CSH-006-10`, `ATS-PFM-CSH-016-09` |
| `BR-CAP-PFM-CSH-006-03` | `ATS-PFM-CSH-006-03` |
| `BR-CAP-PFM-CSH-006-04` | `ATS-PFM-CSH-006-04`, `ATS-PFM-CSH-006-10`, `ATS-PFM-CSH-006-11`, `ATS-PFM-CSH-008-07` |
| `BR-CAP-PFM-CSH-006-06` | `ATS-PFM-CSH-006-05`, `ATS-PFM-CSH-006-06` |
| `BR-CAP-PFM-CSH-006-07` | `ATS-PFM-CSH-006-05`, `ATS-PFM-CSH-008-06`, `ATS-PFM-CSH-009-09` |
| `BR-CAP-PFM-CSH-006-09` | `ATS-PFM-CSH-006-07` |
| `BR-CAP-PFM-CSH-006-13` | `ATS-PFM-CSH-006-08`, `ATS-PFM-CSH-006-09`, `ATS-PFM-CSH-006-10` |

Menu filtering needs labels, section matches, no matches, Escape, active breadcrumbs and rail navigation. Accounting adjacency remains a planned assertion that the pinned registry does not satisfy.

## Interactions With Related Capabilities

Awards survives with Prizes appended; without the placement it remains absent.

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.
