---
id: CAP-PFM-CSH-006
title: Find a destination in the application menu
feature: FEAT-PFM-CSH-02
product_area: platform
module: console-shell
revision: 3
change: RS-20
status: draft
product_intent: proposed
implementation_evidence: partially-observed
supersedes:
  - REQ-CNS-292
source_sha:
  docs-2: fb2806830dd8f650c05fb88d787f3d395a547a9b
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
intent_sources:
  - >-
    services-platform:docs/proposals/application-access-and-entitlements.md#6.4 Console integration
    (built and accepted by Andrew 2026-10-15)
  - >-
    react-console:docs/url-architecture.md#5. lib/routes (decided by Andrew 2026-10-14; final
    acceptance 2026-10-15)
  - 'docs-2:.forge/context/RS-20/planning.changeset.json#revision 2; finalized.approval (Andrew Ryan, 2026-10-23T01:23:36.443Z; approvalId 846d23adfdaddf891729e33fee72850a4c1d588517d40f29a4a78d264262ae53)'
purpose: The main menu organizes application work and shared tools into recognizable destinations.
outcomes:
  - Staff browse a stable application and tool structure.
  - Menu state helps staff locate their current work.
concepts:
  - CON-PFM-CSH-002
actors:
  - ACT-PFM-001
  - ACT-PFM-002
surfaces:
  - console
preconditions: []
postconditions: []
permissions:
  - key: console.access
    where_checked: console
    scope: tenant
  - key: tools.tasks.view
    where_checked: console
    scope: tenant
  - key: tools.queries.view
    where_checked: console
    scope: tenant
  - key: tools.reports.view
    where_checked: console
    scope: tenant
  - key: platform.security-self.read
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-PFM-CSH-006-01
    proved_by: [ATS-PFM-CSH-006-10]
    statement: >-
      The main menu presents application sections in registry order, then Websites, with Tasks,
      Queries and Reports & Dashboards grouped as Tools.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:components/console/nav-config.ts:primaryNav, toolLinks, applicationLinks'
    origin: none
  - id: BR-CAP-PFM-CSH-006-02
    proved_by: [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, TST-PFM-CSH-011, TST-PFM-CSH-021]
    statement: >-
      A section with an application domain appears only when that domain is enabled, retains only
      permitted entries and disappears when no entries remain.
    kind: permission
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: >-
      react-console:lib/console/__tests__/registries.test.ts#hides domains the user cannot access
      and keeps what they can
    origin: >-
      services-platform:docs/proposals/application-access-and-entitlements.md#6.4 Console
      integration, item 1 (built and accepted by Andrew 2026-10-15)
  - id: BR-CAP-PFM-CSH-006-03
    proved_by: [ATS-PFM-CSH-006-03, TST-PFM-CSH-021]
    statement: >-
      Links and tools with a permission require it, while links without a permission remain visible
      to signed-in users.
    kind: permission
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: >-
      react-console:lib/console/__tests__/registries.test.ts#filters tool and settings links by
      permission
    origin: none
  - id: BR-CAP-PFM-CSH-006-04
    proved_by: [ATS-PFM-CSH-006-04, ATS-PFM-CSH-006-10, ATS-PFM-CSH-006-11, ATS-PFM-CSH-008-07, TST-PFM-CSH-024]
    statement: >-
      The static primary navigation retains an application section only when at least one registered
      destination is implemented.
    kind: policy
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: 'react-console:components/console/nav-config.ts:primaryNav, hasBuiltItem'
    origin: none
    note: The linked finding records the evidence limitation or implementation gap.
  - id: BR-CAP-PFM-CSH-006-05
    proved_by: []
    statement: >-
      A visible application section retains its planned entries, whose destinations display
      placeholders.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:components/console/nav-config.ts:hasBuiltItem'
    origin: none
    note: The linked finding records the evidence limitation or implementation gap.
  - id: BR-CAP-PFM-CSH-006-06
    proved_by: [ATS-PFM-CSH-006-05, ATS-PFM-CSH-006-06]
    statement: >-
      Outside filtering, opening a section closes the others and the current page’s section opens
      automatically, including after delayed custom navigation arrives; filtering opens all matching
      sections.
    kind: lifecycle
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: 'react-console:components/console/app-sidebar.tsx:useSectionOpenState'
    origin: none
  - id: BR-CAP-PFM-CSH-006-07
    proved_by: [ATS-PFM-CSH-006-05, ATS-PFM-CSH-008-06, ATS-PFM-CSH-009-09, TST-PFM-CSH-012, TST-PFM-CSH-014]
    statement: >-
      Navigation highlights the current entry and descendants unless exact matching is requested,
      and highlights its containing section in collapsed mode.
    kind: calculation
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: 'react-console:components/console/app-sidebar.tsx:NavSectionItem'
    origin: >-
      react-console:docs/url-architecture.md#5. lib/routes (decided by Andrew 2026-10-14; final
      acceptance 2026-10-15)
  - id: BR-CAP-PFM-CSH-006-08
    proved_by: []
    statement: Choosing a collapsed section expands navigation and opens that section.
    kind: lifecycle
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:components/console/app-sidebar.tsx:NavSectionItem'
    origin: none
  - id: BR-CAP-PFM-CSH-006-09
    proved_by: [ATS-PFM-CSH-006-07]
    statement: >-
      The filter matches trimmed text without case sensitivity, keeps all entries of a matching
      section title, expands retained sections and highlights the first matching text.
    kind: calculation
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: 'react-console:components/console/app-sidebar.tsx:filterSections, Highlight'
    origin: none
  - id: BR-CAP-PFM-CSH-006-10
    proved_by: []
    statement: >-
      Escape and the clear control reset the filter, and an empty result displays a message
      containing the entered text.
    kind: validation
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:components/console/app-sidebar.tsx:SidebarFilter, NoMatches'
    origin: none
  - id: BR-CAP-PFM-CSH-006-11
    proved_by: []
    statement: >-
      Websites has neither an application nor a permission check in this menu and relies on its
      owning service for authority.
    kind: permission
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:components/console/nav-config.ts:applicationLinks'
    origin: none
    note: The linked finding records the evidence limitation or implementation gap.
  - id: BR-CAP-PFM-CSH-006-12
    proved_by: []
    statement: >-
      The flattened menu retains the first occurrence of a repeated destination for placeholder
      lookup and page naming.
    kind: invariant
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:components/console/nav-config.ts:allNav'
    origin: none
  - id: BR-CAP-PFM-CSH-006-13
    proved_by: [ATS-PFM-CSH-006-08, ATS-PFM-CSH-006-09, ATS-PFM-CSH-006-10]
    statement: >-
      In workspace application navigation, Accounting sits immediately after CRM in the application
      registry, while every other registry entry retains its relative order from before the move.
    kind: policy
    enforced_at:
      - console
    must_prove: true
    provenance: documented
    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 2 and 3'
    origin: RS-20
    note: >-
      Approved planning defines this move; the pinned implementation still places Accounting after
      Marketing, so implementation and executed proof remain outstanding.
scenarios:
  - id: SC-CAP-PFM-CSH-006-01
    given: The current workspace does not offer Membership.
    when: The person inspects the main navigation.
    then: The Membership section is absent.
    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: SC-CAP-PFM-CSH-006-02
    given: The administrator opens Regions in Configuration.
    when: The page finishes loading.
    then: 'The sidebar and breadcrumb represent Configuration, CRM and Regions.'
    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: SC-CAP-PFM-CSH-006-03
    given: The current page belongs to a section that is initially closed.
    when: Navigation evaluates the page location.
    then: Its containing section opens.
    provenance: observed
    source: 'react-console:components/console/app-sidebar.tsx:useSectionOpenState'
edge_cases: []
constraints: []
depends_on:
  - CAP-PFM-CSH-014
  - CAP-PFM-CSH-009
related:
  - CAP-PFM-CSH-008
  - CAP-PFM-CSH-007
journeys: []
open_questions:
  - OQ-PFM-CSH-003
evidence:
  - 'docs-2:specs/apps/console/planning/shell/requirements/REQ-CNS-292-accounting-appears-immediately-under-crm-in-tenant-application-navigation.md#6. Required Behavior'
  - 'docs-2:specs/apps/console/planning/shell/screens/shared/SCR-CNS-016-application-sidebar.md#4.1 Tenant-Mode Application Order'
  - '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.
controls: [TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-CRY-001, TC-CRY-002, TC-CRY-003, TC-CRY-004, TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-PI-001, TC-PI-005, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-VEN-001, TC-VEN-002, TC-VEN-003]
exercised_by: [FAS-PFM-CSH-02-01, FAS-PFM-CSH-02-02, FAS-PFM-CSH-02-03, FAS-PFM-CSH-02-04, FAS-PFM-CSH-02-05]
suites: [TST-PFM-CSH-011, TST-PFM-CSH-012, TST-PFM-CSH-014, TST-PFM-CSH-021, TST-PFM-CSH-024]
---
# Find a destination in the application menu

## Purpose

The main menu organizes application work and shared tools into recognizable destinations.

## How It Works

Staff browse application sections or use the menu filter to locate a destination. The menu combines built-in definitions with custom placements before applying access visibility. Its open state follows the page during ordinary navigation. Filtering temporarily presents matching sections together. The current entry provides a visual reference after navigation. The product should decide how planned destinations appear in customer environments.

## Relationships

- Application access provides domain and permission visibility.
- Custom navigation contributes customer record-type placements.
- Settings work uses its own menu while the person is in an administrative area.
