---
title: Console shell planning examination and final OpenAI text
examined_at: '2026-10-23'
examiner: codex
source_sha:
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
branch: agent/platform-console-shell-plan-exam-1
corpus_base_sha: 97017031361174d5cd94fc1a595f73ca7a3ea344
counts:
  existing_files_rewritten: 50
  new_planning_files: 2
  planning_files_examined: 52
  features: 4
  concepts: 4
  capabilities: 18
  capability_rules: 155
  must_prove_rules: 109
  capability_scenarios: 38
  journeys: 5
  journey_steps: 23
  journey_alternates: 9
  journey_failures: 10
  journey_assertions: 16
  acceptance_sets: 18
  acceptance_scenarios: 95
  bound_acceptance_scenarios: 46
  proposed_acceptance_scenarios: 49
  distinct_test_bindings: 102
  must_prove_with_scenarios: 98
  must_prove_with_static_bindings: 49
  must_prove_without_scenario: 11
  findings: 34
  open_questions: 3
  module_actor_rows_added: 0
  shared_actors_reused: 5
source_reference_audit:
  repository_prefixed_references: 556
  direct_files: 76
  missing_files: 0
  missing_bound_titles: 0
verification_changes:
  - artifact: JNY-PFM-CSH-001
    row: steps 3
    field: source
    before: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#the bare root opens the remembered
      tenant's home
    after: 'react-console:app/(console)/console/[tenantId]/page.tsx:HomePage'
  - artifact: JNY-PFM-CSH-001
    row: steps 3
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-001
    row: failures 1
    field: source
    before: >-
      react-console:e2e/controlled/security-context.controlled.spec.ts#will not open the console
      when the Platform cannot say what somebody may do, and opens it on the retry
    after: >-
      react-console:components/console/console-boot-screens.tsx:consoleBootScreens;
      lib/security-context/provider.tsx
  - artifact: JNY-PFM-CSH-001
    row: failures 1
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-004
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: JNY-PFM-CSH-004
    row: steps 2
    field: source
    before: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#switching tenant opens the same list
      under the other tenant's id, record ids dropped
    after: 'react-console:components/console/tenant-switcher.tsx:choose'
  - artifact: JNY-PFM-CSH-004
    row: steps 2
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-004
    row: steps 4
    field: source
    before: >-
      react-console:lib/security-context/entitlements.test.ts#enables only the domains of the
      applications the context lists
    after: >-
      react-console:lib/security-context/provider.tsx:openTenantId;
      lib/security-context/entitlements.ts:entitlementsFromSecurityContext
  - artifact: JNY-PFM-CSH-004
    row: steps 4
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-004
    row: steps 5
    field: source
    before: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#the bare root opens the remembered
      tenant's home
    after: >-
      react-console:lib/security-context/provider.tsx:openTenantId;
      lib/auth/session.ts:rememberTenantFor
  - artifact: JNY-PFM-CSH-004
    row: steps 5
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-004
    row: failures 1
    field: source
    before: >-
      react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads a non-staff person to
      another workspace, never the unavailable one
    after: 'react-console:components/console/tenant-id-gate.tsx:TenantIdGate, deniedReturnTenant'
  - artifact: JNY-PFM-CSH-004
    row: failures 1
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-004
    row: failures 2
    field: source
    before: >-
      react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads to the tenant the
      person is still in
    after: 'react-console:components/console/tenant-id-gate.tsx:TenantIdGate, deniedReturnTenant'
  - artifact: JNY-PFM-CSH-004
    row: failures 2
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-004
    row: AS-JNY-PFM-CSH-004-02
    field: source
    before: >-
      react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads to the tenant the
      person is still in
    after: 'react-console:components/console/tenant-id-gate.tsx:deniedReturnTenant'
  - artifact: JNY-PFM-CSH-004
    row: AS-JNY-PFM-CSH-004-02
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-004
    row: AS-JNY-PFM-CSH-004-03
    field: source
    before: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#the bare root opens the remembered
      tenant's home
    after: >-
      react-console:lib/security-context/provider.tsx:openTenantId;
      lib/auth/session.ts:rememberTenantFor
  - artifact: JNY-PFM-CSH-004
    row: AS-JNY-PFM-CSH-004-03
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-005
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: JNY-PFM-CSH-005
    row: steps 3
    field: source
    before: >-
      react-console:e2e/mock/application-access.mock.spec.ts#the Applications page says which
      applications there are and why one cannot be used
    after: 'react-console:components/configuration/applications/applications-page.tsx:ApplicationsBody'
  - artifact: JNY-PFM-CSH-005
    row: steps 3
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-005
    row: alternates 1
    field: source
    before: >-
      react-console:lib/console/application-guard.test.ts#denies when the application is there and
      the permission is not
    after: 'react-console:lib/authz/guard.tsx:RequirePermission, AccessDenied'
  - artifact: JNY-PFM-CSH-005
    row: alternates 1
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-005
    row: failures 1
    field: source
    before: >-
      services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#refuses a console user who
      does not hold that key, with 403
    after: >-
      react-console:components/configuration/applications/tenant-applications.tsx:TenantApplications;
      lib/authz/guard.tsx:RequirePermission
  - artifact: JNY-PFM-CSH-005
    row: failures 1
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-005
    row: AS-JNY-PFM-CSH-005-03
    field: source
    before: >-
      react-console:e2e/mock/application-access.mock.spec.ts#the Applications page says which
      applications there are and why one cannot be used
    after: 'react-console:lib/applications/availability.ts:applicationAvailabilityReason'
  - artifact: JNY-PFM-CSH-005
    row: AS-JNY-PFM-CSH-005-03
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-003
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: JNY-PFM-CSH-003
    row: steps 1
    field: source
    before: >-
      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
    after: 'react-console:docs/url-architecture.md#6. Tenant from the URL'
  - artifact: JNY-PFM-CSH-003
    row: steps 1
    field: provenance
    before: test
    after: documented
  - artifact: JNY-PFM-CSH-003
    row: steps 2
    field: source
    before: >-
      react-console:e2e/dev/initialisation.dev.spec.ts#asks the Platform exactly one thing first,
      and shows nothing until it is answered
    after: 'react-console:lib/security-context/provider.tsx:openTenantId'
  - artifact: JNY-PFM-CSH-003
    row: steps 2
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-003
    row: steps 3
    field: source
    before: >-
      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
    after: 'react-console:docs/url-architecture.md#6. Tenant from the URL'
  - artifact: JNY-PFM-CSH-003
    row: steps 3
    field: provenance
    before: test
    after: documented
  - artifact: JNY-PFM-CSH-003
    row: steps 4
    field: source
    before: >-
      react-console:e2e/dev/url-architecture.dev.spec.ts#reloading a record deep link keeps the
      tenant and the record
    after: 'react-console:e2e/mock/url-architecture.mock.spec.ts#a record deep link survives a reload'
  - artifact: JNY-PFM-CSH-003
    row: steps 5
    field: source
    before: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#back and forward move between tenant
      pages
    after: 'react-console:docs/url-architecture.md#8. Tests'
  - artifact: JNY-PFM-CSH-003
    row: steps 5
    field: provenance
    before: test
    after: documented
  - artifact: JNY-PFM-CSH-003
    row: alternates 2
    field: source
    before: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#a staff member's bookmark into a
      standing-grant tenant opens that page and query, from Rhythm HQ too
    after: 'react-console:docs/url-architecture.md#11. Decisions made during the build'
  - artifact: JNY-PFM-CSH-003
    row: alternates 2
    field: provenance
    before: test
    after: documented
  - artifact: JNY-PFM-CSH-003
    row: failures 2
    field: source
    before: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#a tenant the person cannot reach is
      denied
    after: 'react-console:components/console/tenant-id-gate.tsx:TenantIdGate, deniedReturnTenant'
  - artifact: JNY-PFM-CSH-003
    row: failures 2
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-003
    row: AS-JNY-PFM-CSH-003-02
    field: source
    before: >-
      react-console:e2e/dev/url-architecture.dev.spec.ts#reloading a record deep link keeps the
      tenant and the record
    after: 'react-console:e2e/mock/url-architecture.mock.spec.ts#a record deep link survives a reload'
  - artifact: JNY-PFM-CSH-002
    row: steps 2
    field: source
    before: >-
      react-console:e2e/dev/regions.dev.spec.ts#is reached through the configuration navigation, and
      shows the tenant's regions and rules
    after: >-
      react-console:components/console/app-sidebar.tsx:SettingsNavigation;
      components/console/nav-config.ts:CONFIGURATION_HOME
  - artifact: JNY-PFM-CSH-002
    row: steps 2
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-002
    row: failures 1
    field: source
    before: >-
      react-console:lib/console/application-guard.test.ts#denies when the application is there and
      the permission is not
    after: 'react-console:lib/authz/guard.tsx:RequirePermission, AccessDenied'
  - artifact: JNY-PFM-CSH-002
    row: failures 1
    field: provenance
    before: test
    after: observed
  - artifact: JNY-PFM-CSH-002
    row: AS-JNY-PFM-CSH-002-01
    field: source
    before: >-
      react-console:e2e/dev/regions.dev.spec.ts#is reached through the configuration navigation, and
      shows the tenant's regions and rules
    after: 'react-console:components/console/app-sidebar.tsx:SettingsNavigation'
  - artifact: JNY-PFM-CSH-002
    row: AS-JNY-PFM-CSH-002-01
    field: provenance
    before: test
    after: observed
  - artifact: ATS-PFM-CSH-012
    row: ATS-PFM-CSH-012-01
    field: source
    before: 'react-console:lib/routes/__tests__/legacy.test.ts#the legacy table (temporary)'
    after: 'react-console:lib/routes/__tests__/legacy.test.ts#${from} → ${to}'
  - artifact: ATS-PFM-CSH-012
    row: ATS-PFM-CSH-012-01
    field: bound_to
    before:
      - 'react-console:lib/routes/__tests__/legacy.test.ts#the legacy table (temporary)'
    after:
      - 'react-console:lib/routes/__tests__/legacy.test.ts#${from} → ${to}'
  - artifact: ATS-PFM-CSH-012
    row: ATS-PFM-CSH-012-04
    field: source
    before: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#a staff member's old tenant-less bookmark
      opens their remembered tenant after landing in Rhythm HQ
    after: 'react-console:components/console/legacy-redirect.tsx:LegacyRedirect'
  - artifact: ATS-PFM-CSH-012
    row: ATS-PFM-CSH-012-04
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-012
    row: ATS-PFM-CSH-012-04
    field: bound_to
    before:
      - >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#a staff member's old tenant-less
        bookmark opens their remembered tenant after landing in Rhythm HQ
    after: []
  - artifact: ATS-PFM-CSH-007
    row: ATS-PFM-CSH-007-01
    field: source
    before: >-
      react-console:lib/console/__tests__/settings-area-menu.test.ts#does not offer Security or
      Maintenance to a person who holds only the areas' access keys
    after: 'react-console:lib/console/use-visible-nav.ts:visibleSettingsLinks'
  - artifact: ATS-PFM-CSH-007
    row: ATS-PFM-CSH-007-01
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-007
    row: ATS-PFM-CSH-007-01
    field: bound_to
    before:
      - >-
        react-console:lib/console/__tests__/settings-area-menu.test.ts#does not offer Security or
        Maintenance to a person who holds only the areas' access keys
      - >-
        react-console:lib/console/__tests__/settings-area-menu.test.ts#offers Security once the
        person holds one of its links' keys
      - >-
        react-console:lib/console/__tests__/settings-area-menu.test.ts#still offers every area to a
        person who holds everything, and none to a person who holds nothing
    after: []
  - artifact: ATS-PFM-CSH-007
    row: ATS-PFM-CSH-007-02
    field: source
    before: >-
      react-console:e2e/dev/regions.dev.spec.ts#is reached through the configuration navigation, and
      shows the tenant's regions and rules
    after: 'react-console:components/console/app-sidebar.tsx:AppSidebar, SettingsNavigation'
  - artifact: ATS-PFM-CSH-007
    row: ATS-PFM-CSH-007-02
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-007
    row: ATS-PFM-CSH-007-02
    field: bound_to
    before:
      - >-
        react-console:e2e/dev/regions.dev.spec.ts#is reached through the configuration navigation,
        and shows the tenant's regions and rules
    after: []
  - artifact: ATS-PFM-CSH-007
    row: ATS-PFM-CSH-007-05
    field: source
    before: 'react-console:e2e/security/navigation.spec.ts#reaches every Security area from the sidebar'
    after: 'react-console:components/console/nav-config.ts:securityArea'
  - artifact: ATS-PFM-CSH-007
    row: ATS-PFM-CSH-007-05
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-007
    row: ATS-PFM-CSH-007-05
    field: bound_to
    before:
      - 'react-console:e2e/security/navigation.spec.ts#reaches every Security area from the sidebar'
    after: []
  - artifact: ATS-PFM-CSH-008
    row: ATS-PFM-CSH-008-03
    field: bound_to
    before:
      - >-
        react-console:lib/custom-objects/__tests__/navigation.test.ts#hides a custom app the person
        reads nothing in
    after:
      - >-
        react-console:lib/custom-objects/__tests__/navigation.test.ts#hides a custom app the person
        reads nothing in
      - >-
        react-console:lib/custom-objects/__tests__/navigation.test.ts#orders custom apps by display
        order and groups items, ungrouped first
  - artifact: ATS-PFM-CSH-008
    row: ATS-PFM-CSH-008-04
    field: source
    before: >-
      react-console:lib/custom-objects/__tests__/navigation.test.ts#trusts the navigation route's
      answer, even where the key is held tenant-wide and no scoped entry names the object
    after: 'react-console:lib/custom-objects/use-custom-navigation.ts:readNavigation'
  - artifact: ATS-PFM-CSH-008
    row: ATS-PFM-CSH-008-04
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-008
    row: ATS-PFM-CSH-008-04
    field: bound_to
    before:
      - >-
        react-console:lib/custom-objects/__tests__/navigation.test.ts#trusts the navigation route's
        answer, even where the key is held tenant-wide and no scoped entry names the object
      - >-
        react-console:lib/security-context/entitlements.test.ts#lets the holder read a roles-only
        object it names, and no other
    after: []
  - artifact: ATS-PFM-CSH-008
    row: ATS-PFM-CSH-008-05
    field: source
    before: >-
      react-console:lib/custom-objects/__tests__/navigation.test.ts#leaves the built-in navigation
      unchanged when no custom object is placed
    after: 'react-console:lib/custom-objects/use-custom-navigation.ts:useCustomNavigation'
  - artifact: ATS-PFM-CSH-008
    row: ATS-PFM-CSH-008-05
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-008
    row: ATS-PFM-CSH-008-05
    field: bound_to
    before:
      - >-
        react-console:lib/custom-objects/__tests__/navigation.test.ts#leaves the built-in navigation
        unchanged when no custom object is placed
    after: []
  - artifact: ATS-PFM-CSH-011
    row: ATS-PFM-CSH-011-01
    field: bound_to
    before:
      - >-
        react-console:lib/routes/__tests__/routes.test.ts#keeps the workspace and resource list and
        drops record ids and queries
      - 'react-console:lib/routes/__tests__/routes.test.ts#moves a path to another domain, query kept'
    after:
      - >-
        react-console:lib/routes/__tests__/routes.test.ts#keeps the workspace and resource list and
        drops record ids and queries
  - artifact: ATS-PFM-CSH-011
    row: ATS-PFM-CSH-011-02
    field: source
    before: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#switching tenant opens the same list
      under the other tenant's id, record ids dropped
    after: 'react-console:lib/security-context/provider.tsx:openTenantId'
  - artifact: ATS-PFM-CSH-011
    row: ATS-PFM-CSH-011-02
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-011
    row: ATS-PFM-CSH-011-02
    field: bound_to
    before:
      - >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#switching tenant opens the same list
        under the other tenant's id, record ids dropped
    after: []
  - artifact: ATS-PFM-CSH-003
    row: ATS-PFM-CSH-003-01
    field: proves
    before:
      - BR-CAP-PFM-CSH-003-01
    after:
      - BR-CAP-PFM-CSH-003-07
  - artifact: ATS-PFM-CSH-001
    row: ATS-PFM-CSH-001-02
    field: source
    before: >-
      react-console:e2e/controlled/security-context.controlled.spec.ts#will not open the console
      when the Platform cannot say what somebody may do, and opens it on the retry
    after: 'react-console:components/console/console-boot-screens.tsx:consoleBootScreens'
  - artifact: ATS-PFM-CSH-001
    row: ATS-PFM-CSH-001-02
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-001
    row: ATS-PFM-CSH-001-02
    field: bound_to
    before:
      - >-
        react-console:e2e/controlled/security-context.controlled.spec.ts#will not open the console
        when the Platform cannot say what somebody may do, and opens it on the retry
    after: []
  - artifact: ATS-PFM-CSH-017
    row: ATS-PFM-CSH-017-01
    field: proves
    before:
      - BR-CAP-PFM-CSH-017-01
    after:
      - BR-CAP-PFM-CSH-017-14
  - artifact: ATS-PFM-CSH-017
    row: ATS-PFM-CSH-017-01
    field: bound_to
    before:
      - >-
        services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#serves an administrator
        of the customer holding platform.tenant-applications.read
      - >-
        services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#refuses a console user
        who does not hold that key, with 403
      - >-
        services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#answers 404, not 403, to
        an administrator of another customer holding the same key
    after:
      - >-
        services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#serves an administrator
        of the customer holding platform.tenant-applications.read
      - >-
        services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#refuses a console user
        who does not hold that key, with 403
      - >-
        services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#refuses an anonymous
        caller with 401
  - artifact: ATS-PFM-CSH-017
    row: ATS-PFM-CSH-017-05
    field: proves
    before:
      - BR-CAP-PFM-CSH-017-01
    after:
      - BR-CAP-PFM-CSH-017-08
  - artifact: ATS-PFM-CSH-006
    row: ATS-PFM-CSH-006-04
    field: proves
    before:
      - BR-CAP-PFM-CSH-006-04
    after:
      - BR-CAP-PFM-CSH-006-04
      - BR-CAP-PFM-CSH-008-07
  - artifact: ATS-PFM-CSH-006
    row: ATS-PFM-CSH-006-05
    field: source
    before: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#Configuration › CRM › Regions loads with
      its place in the sidebar and the breadcrumb
    after: 'react-console:components/console/app-sidebar.tsx:useSectionOpenState, NavSectionItem'
  - artifact: ATS-PFM-CSH-006
    row: ATS-PFM-CSH-006-05
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-006
    row: ATS-PFM-CSH-006-05
    field: bound_to
    before:
      - >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#Configuration › CRM › Regions loads
        with its place in the sidebar and the breadcrumb
      - >-
        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
    after: []
  - artifact: ATS-PFM-CSH-006
    row: ATS-PFM-CSH-006-07
    field: source
    before: >-
      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
    after: 'react-console:components/console/app-sidebar.tsx:filterSections, Highlight'
  - artifact: ATS-PFM-CSH-006
    row: ATS-PFM-CSH-006-07
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-006
    row: ATS-PFM-CSH-006-07
    field: bound_to
    before:
      - >-
        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
    after: []
  - artifact: ATS-PFM-CSH-002
    row: ATS-PFM-CSH-002-02
    field: source
    before: >-
      react-console:components/console/__tests__/page-layout-adoption.test.ts#configuration lists
      render at the standard width
    after: 'react-console:docs/page-layouts.md#Defaults'
  - artifact: ATS-PFM-CSH-002
    row: ATS-PFM-CSH-002-02
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-002
    row: ATS-PFM-CSH-002-02
    field: bound_to
    before:
      - >-
        react-console:components/console/__tests__/page-layout-adoption.test.ts#configuration lists
        render at the standard width
      - >-
        react-console:components/console/__tests__/page-layout-adoption.test.ts#is rooted in a
        PageLayout that owns the gutters, at the default width
      - >-
        react-console:components/console/__tests__/page-layout-adoption.test.ts#renders both its
        pages through a full-width PageLayout
    after: []
  - artifact: ATS-PFM-CSH-002
    row: ATS-PFM-CSH-002-04
    field: source
    before: 'react-console:e2e/layout/page-layouts.spec.ts#contact types stays standard and centred'
    after: 'react-console:docs/page-layouts.md#Pages that collapse the sidebar'
  - artifact: ATS-PFM-CSH-002
    row: ATS-PFM-CSH-002-04
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-002
    row: ATS-PFM-CSH-002-04
    field: bound_to
    before:
      - 'react-console:e2e/layout/page-layouts.spec.ts#contact types stays standard and centred'
      - 'react-console:e2e/layout/page-layouts.spec.ts#the keyboard shortcut collapses it too'
    after: []
  - artifact: ATS-PFM-CSH-010
    row: ATS-PFM-CSH-010-01
    field: source
    before: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#switching tenant opens the same list
      under the other tenant's id, record ids dropped
    after: 'react-console:components/console/tenant-id-gate.tsx:TenantIdGate'
  - artifact: ATS-PFM-CSH-010
    row: ATS-PFM-CSH-010-01
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-010
    row: ATS-PFM-CSH-010-01
    field: bound_to
    before:
      - >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#switching tenant opens the same list
        under the other tenant's id, record ids dropped
    after: []
  - artifact: ATS-PFM-CSH-010
    row: ATS-PFM-CSH-010-03
    field: source
    before: >-
      react-console:components/console/__tests__/tenant-id-gate.test.tsx#leaves anyone else on the
      access-denied page
    after: 'react-console:components/console/tenant-id-gate.tsx:TenantIdGate, deniedReturnTenant'
  - artifact: ATS-PFM-CSH-010
    row: ATS-PFM-CSH-010-03
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-010
    row: ATS-PFM-CSH-010-03
    field: bound_to
    before:
      - >-
        react-console:components/console/__tests__/tenant-id-gate.test.tsx#leaves anyone else on the
        access-denied page
      - >-
        react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads to the tenant the
        person is still in
      - >-
        react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads to another tenant
        they can reach when they are in none, never the refused one
      - >-
        react-console:components/console/__tests__/tenant-id-gate.test.tsx#is not offered when they
        can reach no other tenant
      - >-
        react-console:components/console/__tests__/tenant-id-gate.test.tsx#is drawn on the
        access-denied panel
      - >-
        react-console:e2e/mock/url-architecture.mock.spec.ts#a tenant the person cannot reach is
        denied
    after: []
  - artifact: ATS-PFM-CSH-010
    row: ATS-PFM-CSH-010-04
    field: source
    before: >-
      react-console:components/console/__tests__/tenant-id-gate.test.tsx#says the workspace is
      unavailable, never no access, with the way back for staff
    after: 'react-console:components/console/tenant-id-gate.tsx:TenantIdGate'
  - artifact: ATS-PFM-CSH-010
    row: ATS-PFM-CSH-010-04
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-010
    row: ATS-PFM-CSH-010-04
    field: bound_to
    before:
      - >-
        react-console:components/console/__tests__/tenant-id-gate.test.tsx#says the workspace is
        unavailable, never no access, with the way back for staff
      - >-
        react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads a non-staff person
        to another workspace, never the unavailable one
    after: []
  - artifact: ATS-PFM-CSH-010
    row: ATS-PFM-CSH-010-05
    field: source
    before: >-
      react-console:e2e/dev/initialisation.dev.spec.ts#asks the Platform exactly one thing first,
      and shows nothing until it is answered
    after: 'react-console:lib/security-context/provider.tsx:openTenantId'
  - artifact: ATS-PFM-CSH-010
    row: ATS-PFM-CSH-010-05
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-010
    row: ATS-PFM-CSH-010-05
    field: bound_to
    before:
      - >-
        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
    after: []
  - artifact: ATS-PFM-CSH-013
    row: ATS-PFM-CSH-013-01
    field: source
    before: >-
      react-console:e2e/mock/staff-landing.mock.spec.ts#a staff member with a remembered tenant and
      a standing grant lands on /hq in HQ context
    after: >-
      react-console:components/console/use-shell-mode.ts:useShellMode;
      lib/security-context/provider.tsx
  - artifact: ATS-PFM-CSH-013
    row: ATS-PFM-CSH-013-01
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-013
    row: ATS-PFM-CSH-013-01
    field: bound_to
    before:
      - >-
        react-console:e2e/mock/staff-landing.mock.spec.ts#a staff member with a remembered tenant
        and a standing grant lands on /hq in HQ context
    after: []
  - artifact: ATS-PFM-CSH-009
    row: ATS-PFM-CSH-009-03
    field: source
    before: >-
      react-console:lib/routes/__tests__/routes.test.ts#puts a tenant path under the tenant, query
      kept
    after: 'react-console:lib/routes/build.ts; lib/routes/legacy.ts'
  - artifact: ATS-PFM-CSH-009
    row: ATS-PFM-CSH-009-03
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-009
    row: ATS-PFM-CSH-009-03
    field: bound_to
    before:
      - >-
        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#builds Configuration › CRM › Regions and
        Types & Categories in camelCase
      - 'react-console:lib/routes/__tests__/routes.test.ts#reads Configuration › CRM › Regions'
    after: []
  - artifact: ATS-PFM-CSH-009
    row: ATS-PFM-CSH-009-04
    field: bound_to
    before:
      - '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
      - >-
        react-console:e2e/dev/url-architecture.dev.spec.ts#reloading a record deep link keeps the
        tenant and the record
    after:
      - '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
  - artifact: ATS-PFM-CSH-009
    row: ATS-PFM-CSH-009-05
    field: bound_to
    before:
      - >-
        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
      - >-
        react-console:e2e/security/navigation.spec.ts#sends a signed-out person to the login screen,
        and back to the page they asked for
    after:
      - >-
        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
  - artifact: ATS-PFM-CSH-015
    row: ATS-PFM-CSH-015-02
    field: source
    before: >-
      react-console:lib/console/application-guard.test.ts#denies when the application is there and
      the permission is not
    after: 'react-console:lib/authz/guard.tsx:AccessDenied'
  - artifact: ATS-PFM-CSH-015
    row: ATS-PFM-CSH-015-02
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-015
    row: ATS-PFM-CSH-015-02
    field: level
    before: unit
    after: browser
  - artifact: ATS-PFM-CSH-015
    row: ATS-PFM-CSH-015-02
    field: bound_to
    before:
      - >-
        react-console:lib/console/application-guard.test.ts#denies when the application is there and
        the permission is not
      - >-
        react-console:lib/console/application-guard.test.ts#opens for somebody with the application
        and the permission
    after: []
  - artifact: ATS-PFM-CSH-015
    row: ATS-PFM-CSH-015-04
    field: source
    before: >-
      react-console:e2e/mock/application-access.mock.spec.ts#a deep link into one of them says the
      application isn't available
    after: >-
      react-console:components/console/application-route-gate.tsx:ApplicationRouteGate;
      components/console/application-unavailable.tsx:ApplicationUnavailable
  - artifact: ATS-PFM-CSH-015
    row: ATS-PFM-CSH-015-04
    field: provenance
    before: test
    after: proposed
  - artifact: ATS-PFM-CSH-015
    row: ATS-PFM-CSH-015-04
    field: bound_to
    before:
      - >-
        react-console:e2e/mock/application-access.mock.spec.ts#a deep link into one of them says the
        application isn't available
      - >-
        react-console:e2e/mock/application-access.mock.spec.ts#the same deep link opens for somebody
        whose organization has the application
    after: []
  - artifact: CON-PFM-CSH-004
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: CON-PFM-CSH-003
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: FEAT-PFM-CSH-04
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: FEAT-PFM-CSH-03
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: CAP-PFM-CSH-007
    row: BR-CAP-PFM-CSH-007-03
    field: source
    before: >-
      react-console:e2e/dev/regions.dev.spec.ts#is reached through the configuration navigation, and
      shows the tenant's regions and rules
    after: 'react-console:components/console/app-sidebar.tsx:AppSidebar, SettingsNavigation'
  - artifact: CAP-PFM-CSH-007
    row: BR-CAP-PFM-CSH-007-03
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-007
    row: BR-CAP-PFM-CSH-007-07
    field: source
    before: 'react-console:e2e/security/navigation.spec.ts#reaches every Security area from the sidebar'
    after: 'react-console:components/console/nav-config.ts:securityArea'
  - artifact: CAP-PFM-CSH-007
    row: BR-CAP-PFM-CSH-007-07
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-007
    row: SC-CAP-PFM-CSH-007-01
    field: source
    before: >-
      react-console:lib/console/__tests__/settings-area-menu.test.ts#does not offer Security or
      Maintenance to a person who holds only the areas' access keys
    after: 'react-console:components/console/app-sidebar.tsx:AppSidebar'
  - artifact: CAP-PFM-CSH-007
    row: SC-CAP-PFM-CSH-007-01
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-012
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: CAP-PFM-CSH-012
    row: SC-CAP-PFM-CSH-012-02
    field: source
    before: 'react-console:components/console/legacy-redirect.tsx:LegacyRedirect'
    after: >-
      react-console:lib/security-context/boot.ts:bootSecurityContext;
      components/console/legacy-redirect.tsx:LegacyRedirect
  - artifact: CAP-PFM-CSH-001
    row: BR-CAP-PFM-CSH-001-07
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-001
    row: SC-CAP-PFM-CSH-001-02
    field: source
    before: >-
      react-console:e2e/controlled/security-context.controlled.spec.ts#will not open the console
      when the Platform cannot say what somebody may do, and opens it on the retry
    after: 'react-console:components/console/console-boot-screens.tsx:consoleBootScreens'
  - artifact: CAP-PFM-CSH-001
    row: SC-CAP-PFM-CSH-001-02
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-015
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: CAP-PFM-CSH-015
    row: BR-CAP-PFM-CSH-015-03
    field: source
    before: >-
      react-console:lib/console/application-guard.test.ts#denies when the application is there and
      the permission is not
    after: 'react-console:lib/authz/guard.tsx:RequirePermission, AccessDenied'
  - artifact: CAP-PFM-CSH-015
    row: BR-CAP-PFM-CSH-015-03
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-015
    row: BR-CAP-PFM-CSH-015-08
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-015
    row: SC-CAP-PFM-CSH-015-02
    field: source
    before: >-
      react-console:e2e/mock/application-access.mock.spec.ts#the same deep link opens for somebody
      whose organization has the application
    after: 'react-console:lib/authz/guard.tsx:RequirePermission, AccessDenied'
  - artifact: CAP-PFM-CSH-015
    row: SC-CAP-PFM-CSH-015-02
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-006
    row: BR-CAP-PFM-CSH-006-04
    field: source
    before: >-
      react-console:lib/custom-objects/__tests__/navigation.test.ts#hides domains without a built
      screen, keeping Submissions and CRM
    after: 'react-console:components/console/nav-config.ts:primaryNav, hasBuiltItem'
  - artifact: CAP-PFM-CSH-006
    row: BR-CAP-PFM-CSH-006-04
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-006
    row: BR-CAP-PFM-CSH-006-06
    field: source
    before: >-
      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
    after: 'react-console:components/console/app-sidebar.tsx:useSectionOpenState'
  - artifact: CAP-PFM-CSH-006
    row: BR-CAP-PFM-CSH-006-06
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-006
    row: BR-CAP-PFM-CSH-006-07
    field: source
    before: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#Configuration › CRM › Regions loads with
      its place in the sidebar and the breadcrumb
    after: 'react-console:components/console/app-sidebar.tsx:NavSectionItem'
  - artifact: CAP-PFM-CSH-006
    row: BR-CAP-PFM-CSH-006-07
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-006
    row: BR-CAP-PFM-CSH-006-09
    field: source
    before: >-
      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
    after: 'react-console:components/console/app-sidebar.tsx:filterSections, Highlight'
  - artifact: CAP-PFM-CSH-006
    row: BR-CAP-PFM-CSH-006-09
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-006
    row: BR-CAP-PFM-CSH-006-12
    field: source
    before: >-
      react-console:lib/console/__tests__/registries.test.ts#drives the primary navigation and the
      flat page list
    after: 'react-console:components/console/nav-config.ts:allNav'
  - artifact: CAP-PFM-CSH-006
    row: BR-CAP-PFM-CSH-006-12
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-006
    row: SC-CAP-PFM-CSH-006-03
    field: source
    before: >-
      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
    after: 'react-console:components/console/app-sidebar.tsx:useSectionOpenState'
  - artifact: CAP-PFM-CSH-006
    row: SC-CAP-PFM-CSH-006-03
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-005
    row: BR-CAP-PFM-CSH-005-01
    field: source
    before: 'react-console:components/console/app-sidebar.tsx:initialsOf'
    after: 'react-console:components/console/app-sidebar.tsx:AppSidebar, initialsOf'
  - artifact: CAP-PFM-CSH-005
    row: BR-CAP-PFM-CSH-005-03
    field: source
    before: 'react-console:components/console/feedback-dialog.tsx:HELP_URL'
    after: >-
      react-console:components/console/app-sidebar.tsx:AppSidebar;
      components/console/feedback-dialog.tsx:HELP_URL
  - artifact: CAP-PFM-CSH-011
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: CAP-PFM-CSH-011
    row: BR-CAP-PFM-CSH-011-03
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-011
    row: BR-CAP-PFM-CSH-011-05
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-011
    row: BR-CAP-PFM-CSH-011-07
    field: source
    before: 'react-console:components/console/tenant-switcher.tsx (header)'
    after: >-
      react-console:lib/security-context/provider.tsx:openTenantId;
      components/console/tenant-id-gate.tsx:TenantIdGate
  - artifact: CAP-PFM-CSH-011
    row: BR-CAP-PFM-CSH-011-07
    field: provenance
    before: documented
    after: observed
  - artifact: CAP-PFM-CSH-011
    row: BR-CAP-PFM-CSH-011-07
    field: origin
    before: >-
      react-console:docs/url-architecture.md#6. Tenant from the URL (decided by Andrew 2026-10-14;
      final acceptance 2026-10-15)
    after: none
  - artifact: CAP-PFM-CSH-011
    row: BR-CAP-PFM-CSH-011-08
    field: source
    before: 'react-console:components/console/tenant-switcher.tsx (header)'
    after: >-
      react-console:lib/security-context/provider.tsx:openTenantId;
      lib/auth/session.ts:rememberTenantFor
  - artifact: CAP-PFM-CSH-011
    row: BR-CAP-PFM-CSH-011-08
    field: provenance
    before: documented
    after: observed
  - artifact: CAP-PFM-CSH-011
    row: BR-CAP-PFM-CSH-011-08
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-011
    row: SC-CAP-PFM-CSH-011-02
    field: source
    before: 'react-console:components/console/tenant-switcher.tsx:TenantSwitcher'
    after: 'react-console:components/console/tenant-id-gate.tsx:TenantIdGate, deniedReturnTenant'
  - artifact: CAP-PFM-CSH-009
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: CAP-PFM-CSH-009
    row: BR-CAP-PFM-CSH-009-01
    field: origin
    before: >-
      react-console:docs/url-architecture.md#1. Rules, rule 1 (decided by Andrew 2026-10-14; final
      acceptance 2026-10-15)
    after: none
  - artifact: CAP-PFM-CSH-009
    row: BR-CAP-PFM-CSH-009-05
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-009
    row: BR-CAP-PFM-CSH-009-09
    field: source
    before: 'react-console:docs/url-architecture.md#5. lib/routes'
    after: >-
      react-console:lib/routes/build.ts:queryString; lib/routes/legacy.ts:legacyTenantPath;
      lib/routes/match.ts:switchTenantPath
  - artifact: CAP-PFM-CSH-009
    row: BR-CAP-PFM-CSH-009-09
    field: provenance
    before: documented
    after: observed
  - artifact: CAP-PFM-CSH-014
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: CAP-PFM-CSH-014
    row: BR-CAP-PFM-CSH-014-02
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-014
    row: BR-CAP-PFM-CSH-014-05
    field: origin
    before: >-
      services-platform:docs/licensing.md#9. How a licence reaches the permission check (Andrew,
      2026-10-14)
    after: none
  - artifact: CAP-PFM-CSH-014
    row: BR-CAP-PFM-CSH-014-06
    field: source
    before: 'react-console:lib/security-context/entitlements.ts (header)'
    after: 'react-console:lib/security-context/entitlements.ts:allowedConsoleKeys'
  - artifact: CAP-PFM-CSH-014
    row: BR-CAP-PFM-CSH-014-06
    field: provenance
    before: documented
    after: observed
  - artifact: CAP-PFM-CSH-014
    row: BR-CAP-PFM-CSH-014-06
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-014
    row: SC-CAP-PFM-CSH-014-01
    field: source
    before: >-
      react-console:lib/security-context/entitlements.test.ts#enables only the domains of the
      applications the context lists
    after: >-
      react-console:lib/security-context/entitlements.test.ts#gives a staff wildcard no domain the
      applications did not give
  - artifact: CAP-PFM-CSH-014
    row: SC-CAP-PFM-CSH-014-02
    field: source
    before: >-
      react-console:lib/security-context/entitlements.test.ts#gives a staff wildcard no domain the
      applications did not give
    after: >-
      react-console:lib/security-context/entitlements.test.ts#lets a deny rule take one keyless key
      away
  - artifact: CAP-PFM-CSH-016
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: CAP-PFM-CSH-016
    row: BR-CAP-PFM-CSH-016-04
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-016
    row: BR-CAP-PFM-CSH-016-05
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-008
    row: BR-CAP-PFM-CSH-008-03
    field: source
    before: >-
      react-console:lib/custom-objects/__tests__/navigation.test.ts#hides a custom app the person
      reads nothing in
    after: 'react-console:lib/custom-objects/navigation.ts:customNavigation, arranged'
  - artifact: CAP-PFM-CSH-008
    row: BR-CAP-PFM-CSH-008-03
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-008
    row: BR-CAP-PFM-CSH-008-05
    field: source
    before: >-
      react-console:lib/custom-objects/__tests__/navigation.test.ts#leaves the built-in navigation
      unchanged when no custom object is placed
    after: 'react-console:lib/custom-objects/use-custom-navigation.ts:useCustomNavigation'
  - artifact: CAP-PFM-CSH-008
    row: BR-CAP-PFM-CSH-008-05
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-008
    row: BR-CAP-PFM-CSH-008-06
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-008
    row: BR-CAP-PFM-CSH-008-07
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-010
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: CAP-PFM-CSH-010
    row: BR-CAP-PFM-CSH-010-06
    field: origin
    before: >-
      react-console:docs/url-architecture.md#11. Decisions made during the build, item 9 (decided by
      Andrew 2026-10-14; final acceptance 2026-10-15)
    after: none
  - artifact: CAP-PFM-CSH-010
    row: BR-CAP-PFM-CSH-010-08
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-010
    row: BR-CAP-PFM-CSH-010-09
    field: source
    before: >-
      react-console:e2e/dev/initialisation.dev.spec.ts#asks the Platform exactly one thing first,
      and shows nothing until it is answered
    after: 'react-console:lib/security-context/provider.tsx:pendingUrlAnswer, openTenantId'
  - artifact: CAP-PFM-CSH-010
    row: BR-CAP-PFM-CSH-010-09
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-010
    row: BR-CAP-PFM-CSH-010-10
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-010
    row: SC-CAP-PFM-CSH-010-02
    field: source
    before: >-
      react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads to the tenant the
      person is still in
    after: 'react-console:components/console/tenant-id-gate.tsx:TenantIdGate, deniedReturnTenant'
  - artifact: CAP-PFM-CSH-010
    row: SC-CAP-PFM-CSH-010-02
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-010
    row: SC-CAP-PFM-CSH-010-03
    field: source
    before: >-
      react-console:components/console/__tests__/tenant-id-gate.test.tsx#leads a non-staff person to
      another workspace, never the unavailable one
    after: 'react-console:components/console/tenant-id-gate.tsx:TenantIdGate'
  - artifact: CAP-PFM-CSH-010
    row: SC-CAP-PFM-CSH-010-03
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-002
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: CAP-PFM-CSH-002
    row: BR-CAP-PFM-CSH-002-03
    field: source
    before: >-
      react-console:components/console/__tests__/page-layout-adoption.test.ts#configuration lists
      render at the standard width
    after: >-
      react-console:docs/page-layouts.md#Defaults;
      components/console/__tests__/page-layout-adoption.test.ts
  - artifact: CAP-PFM-CSH-002
    row: BR-CAP-PFM-CSH-002-03
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-002
    row: BR-CAP-PFM-CSH-002-03
    field: origin
    before: >-
      react-console:docs/page-layouts.md#2026-10-12 — Final acceptance (accepted by Andrew
      2026-10-12)
    after: none
  - artifact: CAP-PFM-CSH-002
    row: BR-CAP-PFM-CSH-002-07
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-004
    row: BR-CAP-PFM-CSH-004-03
    field: source
    before: 'react-console:app/(console)/console/[tenantId]/page.tsx:HomePage'
    after: >-
      react-console:lib/api/dashboard.ts:useDashboardSummary;
      components/console/home/dashboard-state.tsx:DashboardErrorAlert
  - artifact: CAP-PFM-CSH-013
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: CAP-PFM-CSH-017
    row: artifact
    field: product_intent
    before: confirmed
    after: proposed
  - artifact: CAP-PFM-CSH-017
    row: BR-CAP-PFM-CSH-017-01
    field: source
    before: >-
      services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#refuses a console user who
      does not hold that key, with 403
    after: >-
      react-console:components/configuration/applications/tenant-applications.tsx:TenantApplications;
      lib/authz/backend-aliases.ts:BACKEND_ALIASES
  - artifact: CAP-PFM-CSH-017
    row: BR-CAP-PFM-CSH-017-01
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-017
    row: BR-CAP-PFM-CSH-017-01
    field: enforced_at
    before:
      - console
      - api
    after:
      - console
  - artifact: CAP-PFM-CSH-017
    row: BR-CAP-PFM-CSH-017-05
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-017
    row: BR-CAP-PFM-CSH-017-08
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-017
    row: BR-CAP-PFM-CSH-017-09
    field: source
    before: >-
      react-console:lib/applications/availability.test.ts#treats a state it cannot read as no
      licence and an operation it cannot read as never set up
    after: >-
      react-console:lib/applications/availability.test.ts#takes the records it understands and
      leaves out the ones it does not; lib/applications/availability.test.ts#treats a state it
      cannot read as no licence and an operation it cannot read as never set up
  - artifact: CAP-PFM-CSH-017
    row: BR-CAP-PFM-CSH-017-09
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-017
    row: BR-CAP-PFM-CSH-017-10
    field: must_prove
    before: false
    after: true
  - artifact: CAP-PFM-CSH-017
    row: SC-CAP-PFM-CSH-017-01
    field: source
    before: >-
      react-console:e2e/mock/application-access.mock.spec.ts#the Applications page says which
      applications there are and why one cannot be used
    after: >-
      react-console:lib/applications/availability.test.ts#tells somebody a licence is ending without
      calling the application unavailable
  - artifact: CAP-PFM-CSH-017
    row: SC-CAP-PFM-CSH-017-02
    field: source
    before: >-
      services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#says a withheld
      application is simply not licensed, never that Rhythm withheld it
    after: 'react-console:components/configuration/applications/applications-page.tsx:ApplicationsBody'
  - artifact: CAP-PFM-CSH-017
    row: SC-CAP-PFM-CSH-017-02
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-003
    row: BR-CAP-PFM-CSH-003-01
    field: source
    before: >-
      react-console:lib/quick-search/__tests__/shortcut.test.ts#accepts Cmd+K and Ctrl+K, whatever
      the machine is
    after: >-
      react-console:components/console/console-provider.tsx:ConsoleProvider;
      lib/quick-search/shortcut.ts:isQuickSearchShortcut
  - artifact: CAP-PFM-CSH-003
    row: BR-CAP-PFM-CSH-003-01
    field: provenance
    before: test
    after: observed
  - artifact: CAP-PFM-CSH-003
    row: BR-CAP-PFM-CSH-003-06
    field: source
    before: >-
      react-console:lib/quick-search/__tests__/shortcut.test.ts#is the Command symbol on Apple
      hardware and Ctrl everywhere else
    after: >-
      react-console:lib/quick-search/shortcut.ts:quickSearchShortcutLabel;
      components/console/app-sidebar.tsx:AppSidebar
  - artifact: CAP-PFM-CSH-003
    row: BR-CAP-PFM-CSH-003-06
    field: provenance
    before: test
    after: observed
permission_coverage:
  - key: accounting.access
    reference: permissions.accounting.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.batches.view
    reference: permissions.accounting.batches.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.billing-runs.view
    reference: permissions.accounting.billingRuns.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.billing-templates.view
    reference: permissions.accounting.billingTemplates.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.credit-applications.view
    reference: permissions.accounting.creditApplications.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.credit-memos.view
    reference: permissions.accounting.creditMemos.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.credits.view
    reference: permissions.accounting.credits.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.debit-memos.view
    reference: permissions.accounting.debitMemos.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.fiscal-periods.read
    reference: permissions.accounting.fiscalPeriods.read
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.fiscal-years.view
    reference: permissions.accounting.fiscalYears.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.installment-schedules.view
    reference: permissions.accounting.installmentSchedules.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.invoices.view
    reference: permissions.accounting.invoices.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.payment-methods.view
    reference: permissions.accounting.paymentMethods.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.payments.view
    reference: permissions.accounting.payments.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.products.view
    reference: permissions.accounting.products.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.recurring-billing-runs.view
    reference: permissions.accounting.recurringBillingRuns.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.refunds.view
    reference: permissions.accounting.refunds.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accounting.write-offs.view
    reference: permissions.accounting.writeOffs.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accreditation.access
    reference: permissions.accreditation.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accreditation.accreditations.view
    reference: permissions.accreditation.accreditations.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accreditation.candidates.view
    reference: permissions.accreditation.candidates.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accreditation.evaluations.view
    reference: permissions.accreditation.evaluations.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accreditation.programs.view
    reference: permissions.accreditation.programs.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accreditation.reports.view
    reference: permissions.accreditation.reports.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: accreditation.visits.view
    reference: permissions.accreditation.visits.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: awards.access
    reference: permissions.awards.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: awards.applications.view
    reference: permissions.awards.applications.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: awards.awards.view
    reference: permissions.awards.awards.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: awards.nominations.view
    reference: permissions.awards.nominations.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: awards.nominees.view
    reference: permissions.awards.nominees.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: awards.recipients.view
    reference: permissions.awards.recipients.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: awards.references.view
    reference: permissions.awards.references.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: careers.access
    reference: permissions.careers.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: careers.applications.view
    reference: permissions.careers.applications.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: careers.employers.view
    reference: permissions.careers.employers.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: careers.job-postings.view
    reference: permissions.careers.jobPostings.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: careers.resumes.view
    reference: permissions.careers.resumes.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: careers.settings.view
    reference: permissions.careers.settings.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: certifications.access
    reference: permissions.certifications.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: certifications.activities.view
    reference: permissions.certifications.activities.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: certifications.applications.view
    reference: permissions.certifications.applications.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: certifications.certifications.view
    reference: permissions.certifications.certifications.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: certifications.courses.view
    reference: permissions.certifications.courses.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: certifications.credits.view
    reference: permissions.certifications.credits.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: certifications.exams.view
    reference: permissions.certifications.exams.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: certifications.training-providers.view
    reference: permissions.certifications.trainingProviders.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: committees.access
    reference: permissions.committees.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: committees.appointments.view
    reference: permissions.committees.appointments.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: committees.committees.view
    reference: permissions.committees.committees.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: configuration.access
    reference: permissions.configuration.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: configuration.applications.view
    reference: permissions.configuration.applications.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: configuration.bank-accounts.view
    reference: permissions.configuration.bankAccounts.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: configuration.business-units.view
    reference: permissions.configuration.businessUnits.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: configuration.duplicate-rules.view
    reference: permissions.configuration.duplicateRules.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: configuration.exchange-rates.view
    reference: permissions.configuration.exchangeRates.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: configuration.gl-accounts.view
    reference: permissions.configuration.glAccounts.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: configuration.integrations.read
    reference: permissions.configuration.integrations.read
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: configuration.merchant-accounts.view
    reference: permissions.configuration.merchantAccounts.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: configuration.responsibilities.view
    reference: permissions.configuration.responsibilities.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: crm.access
    reference: permissions.crm.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: crm.activities.view
    reference: permissions.crm.activities.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: crm.contacts.view
    reference: permissions.crm.contacts.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: crm.duplicates.view
    reference: permissions.crm.duplicates.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: crm.organizations.view
    reference: permissions.crm.organizations.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: crm.relationships.view
    reference: permissions.crm.relationships.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: data.exports.view
    reference: permissions.data.exports.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: data.jobs.view
    reference: permissions.data.jobs.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: documents.access
    reference: permissions.documents.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: documents.file-cabinets.view
    reference: permissions.documents.fileCabinets.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: documents.items.view
    reference: permissions.documents.items.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: eligibility.rules.read
    reference: permissions.eligibility.rules.read
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: fundraising.access
    reference: permissions.fundraising.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: fundraising.appeals.view
    reference: permissions.fundraising.appeals.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: fundraising.campaigns.view
    reference: permissions.fundraising.campaigns.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: fundraising.donors.view
    reference: permissions.fundraising.donors.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: fundraising.funds.view
    reference: permissions.fundraising.funds.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: fundraising.gifts.view
    reference: permissions.fundraising.gifts.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: fundraising.pledges.view
    reference: permissions.fundraising.pledges.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: fundraising.recurring-gifts.view
    reference: permissions.fundraising.recurringGifts.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: maintenance.access
    reference: permissions.maintenance.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: maintenance.scheduled-jobs.view
    reference: permissions.maintenance.scheduledJobs.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: marketing.access
    reference: permissions.marketing.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: marketing.audiences.view
    reference: permissions.marketing.audiences.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: marketing.lists.manage
    reference: permissions.marketing.lists.manage
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: meetings.abstracts.view
    reference: permissions.meetings.abstracts.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: meetings.access
    reference: permissions.meetings.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: meetings.events.view
    reference: permissions.meetings.events.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: meetings.exhibitors.view
    reference: permissions.meetings.exhibitors.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: meetings.functions.view
    reference: permissions.meetings.functions.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: meetings.registrations.view
    reference: permissions.meetings.registrations.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: meetings.sessions.view
    reference: permissions.meetings.sessions.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: meetings.speakers.view
    reference: permissions.meetings.speakers.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: meetings.sponsors.view
    reference: permissions.meetings.sponsors.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: meetings.waitlist.view
    reference: permissions.meetings.waitlist.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: membership.access
    reference: permissions.membership.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: membership.application-groups.view
    reference: permissions.membership.applicationGroups.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: membership.applications.view
    reference: permissions.membership.applications.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: membership.chapters.view
    reference: permissions.membership.chapters.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: membership.elections.view
    reference: permissions.membership.elections.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: membership.memberships.view
    reference: permissions.membership.memberships.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: membership.sections.view
    reference: permissions.membership.sections.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: membership.settings.view
    reference: permissions.membership.settings.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: objects.definitions.view
    reference: permissions.objects.definitions.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: objects.records.view
    reference: permissions.objects.records.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: objects.relationship-types.view
    reference: permissions.objects.relationshipTypes.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: orders.access
    reference: permissions.orders.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: orders.inventory.view
    reference: permissions.orders.inventory.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: orders.listings.view
    reference: permissions.orders.listings.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: orders.merchandise.view
    reference: permissions.orders.merchandise.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: orders.operations.view
    reference: permissions.orders.operations.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: orders.ordering-profiles.view
    reference: permissions.orders.orderingProfiles.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: orders.orders.view
    reference: permissions.orders.orders.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: orders.pricing-audiences.view
    reference: permissions.orders.pricingAudiences.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: orders.product-categories.view
    reference: permissions.orders.productCategories.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: orders.promotions.view
    reference: permissions.orders.promotions.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: orders.shipments.view
    reference: permissions.orders.shipments.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: orders.stores.view
    reference: permissions.orders.stores.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: platform.notifications.manage
    reference: permissions.platform.notifications.manage
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: publications.access
    reference: permissions.publications.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: publications.advertisers.view
    reference: permissions.publications.advertisers.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: publications.agencies.view
    reference: permissions.publications.agencies.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: publications.insertion-orders.view
    reference: permissions.publications.insertionOrders.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: publications.publications.view
    reference: permissions.publications.publications.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: publications.subscriptions.view
    reference: permissions.publications.subscriptions.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: sales.access
    reference: permissions.sales.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: sales.leads.view
    reference: permissions.sales.leads.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: sales.opportunities.view
    reference: permissions.sales.opportunities.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: sales.settings.view
    reference: permissions.sales.settings.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: security.access
    reference: permissions.security.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: security.policies.view
    reference: permissions.security.policies.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: security.roles.view
    reference: permissions.security.roles.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: security.staff-access.view
    reference: permissions.security.staffAccess.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: security.users.view
    reference: permissions.security.users.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: sponsorship.access
    reference: permissions.sponsorship.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: sponsorship.applications.view
    reference: permissions.sponsorship.applications.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: sponsorship.opportunities.view
    reference: permissions.sponsorship.opportunities.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: sponsorship.prospects.view
    reference: permissions.sponsorship.prospects.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: sponsorship.sponsorships.view
    reference: permissions.sponsorship.sponsorships.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: submissions.access
    reference: permissions.submissions.access
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: submissions.applications.view
    reference: permissions.submissions.applications.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: submissions.processes.view
    reference: permissions.submissions.processes.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: submissions.review-assignments.view
    reference: permissions.submissions.reviewAssignments.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: tools.queries.view
    reference: permissions.tools.queries.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: tools.reports.view
    reference: permissions.tools.reports.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
  - key: tools.tasks.view
    reference: permissions.tools.tasks.view
    covered_by:
      - CAP-PFM-CSH-006
      - CAP-PFM-CSH-007
      - CAP-PFM-CSH-014
      - CAP-PFM-CSH-018
operations_owned_by_operations:
  - getTenantLicensing
  - getHubspotCompanyLicensing
  - syncHubspotCompanyLicensing
  - getLicenceSyncHealth
  - createTenantLicenceOverride
  - revokeTenantLicenceOverride
  - suspendTenantApplication
  - resumeTenantApplication
  - retryTenantApplicationProvisioning
  - receiveHubspotWebhook
tables_owned_by_operations:
  - modules/licensing/db/licence-windows.table.ts
  - modules/licensing/db/applications.table.ts
  - modules/licensing/db/hubspot-company-syncs.table.ts
  - modules/licensing/db/hubspot-contracts.table.ts
  - modules/licensing/db/hubspot-contract-lines.table.ts
  - modules/licensing/db/commercial-products.table.ts
  - modules/licensing/db/data-export-entitlements.table.ts
  - modules/licensing/db/licence-overrides.table.ts
  - modules/licensing/db/tenant-applications.table.ts
licensing_tests_owned_by_operations:
  - modules/licensing/tests/integration/db/licence-overrides.table.integration.spec.js
  - modules/licensing/tests/integration/db/hubspot-licence-source.table.integration.spec.js
  - modules/licensing/tests/integration/db/applications.table.integration.spec.js
  - modules/licensing/tests/integration/db/tenant-applications.table.integration.spec.js
  - modules/licensing/tests/integration/db/data-export-entitlements.table.integration.spec.js
  - modules/licensing/tests/integration/services/persistence/licence-windows.integration.spec.js
  - modules/licensing/tests/integration/services/persistence/tenant-applications.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/persistence/hubspot-company-syncs.queries.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/persistence/hubspot-company-syncs.integration.spec.js
  - modules/licensing/tests/integration/services/persistence/commercial-products.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/persistence/hubspot-contracts.queries.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/persistence/commercial-products.queries.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/persistence/tenant-applications.availability.integration.spec.js
  - modules/licensing/tests/integration/services/persistence/licence-overrides.integration.spec.js
  - modules/licensing/tests/integration/services/persistence/hubspot-contracts.integration.spec.js
  - modules/licensing/tests/integration/services/persistence/applications.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/persistence/applications.queries.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/persistence/tenant-applications.queries.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/persistence/licence-windows.queries.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/persistence/data-export-entitlements.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/enablement/seed-development-licences.deletion.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/enablement/seed-development-licences.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/enablement/provision-tenant-application.integration.spec.js
  - >-
    modules/licensing/tests/integration/services/enablement/seed-development-licences.revoked.integration.spec.js
  - modules/licensing/tests/integration/services/sync/reconcile-licences.integration.spec.js
  - modules/licensing/tests/integration/services/sync/accept-webhook-delivery.integration.spec.js
  - modules/licensing/tests/integration/services/sync/sync-company-licences.integration.spec.js
  - modules/licensing/tests/e2e/licensing.e2e.spec.js
  - modules/licensing/tests/e2e/hubspot-licensing.e2e.spec.js
  - modules/licensing/tests/unit/hubspot/webhook-signature.spec.ts
  - modules/licensing/tests/unit/hubspot/webhook-events.spec.ts
  - modules/licensing/tests/unit/application-access-permission.spec.ts
  - modules/licensing/tests/unit/catalog/applications.spec.ts
  - modules/licensing/tests/unit/catalog/product-grants.spec.ts
  - modules/licensing/tests/unit/licences/development-grant-is-needed.spec.ts
  - modules/licensing/tests/unit/licences/resolve-licence-windows.spec.ts
  - modules/licensing/tests/unit/licences/seed-development-licences-for-tenant.spec.ts
  - modules/licensing/tests/unit/sync/sync-queue.spec.ts
  - modules/licensing/tests/unit/availability/application-availability.spec.ts
examined_direct_paths:
  - 'react-console/app/(console)/console/[tenantId]/[...slug]/page.tsx'
  - 'react-console/app/(console)/console/[tenantId]/page.tsx'
  - react-console/components/configuration/applications/applications-page.tsx
  - react-console/components/configuration/applications/tenant-applications.tsx
  - react-console/components/configuration/resources/custom-apps.tsx
  - react-console/components/console/__tests__/page-layout.test.tsx
  - react-console/components/console/__tests__/tenant-id-gate.test.tsx
  - react-console/components/console/app-sidebar.tsx
  - react-console/components/console/application-route-gate.tsx
  - react-console/components/console/application-unavailable.tsx
  - react-console/components/console/console-boot-screens.tsx
  - react-console/components/console/console-provider.tsx
  - react-console/components/console/console-shell.tsx
  - react-console/components/console/feedback-dialog.tsx
  - react-console/components/console/home/__tests__/dashboard-state.test.tsx
  - react-console/components/console/home/dashboard-panels.tsx
  - react-console/components/console/home/kpi-cards.tsx
  - react-console/components/console/legacy-redirect.tsx
  - react-console/components/console/nav-config.ts
  - react-console/components/console/site-header.tsx
  - react-console/components/console/tenant-id-gate.tsx
  - react-console/components/console/tenant-switcher.tsx
  - react-console/components/console/use-shell-mode.ts
  - react-console/components/ui/sidebar.tsx
  - react-console/docs/migration/02-information-architecture.md
  - react-console/docs/page-layouts.md
  - react-console/docs/url-architecture.md
  - react-console/e2e/controlled/staff-deep-link.controlled.spec.ts
  - react-console/e2e/controlled/tenant-unavailable.controlled.spec.ts
  - react-console/e2e/dev/hq-licensing.dev.spec.ts
  - react-console/e2e/dev/initialisation.dev.spec.ts
  - react-console/e2e/dev/url-architecture.dev.spec.ts
  - react-console/e2e/layout/page-layouts.spec.ts
  - react-console/e2e/mock/application-access.mock.spec.ts
  - react-console/e2e/mock/custom-object-navigation.mock.spec.ts
  - react-console/e2e/mock/staff-landing.mock.spec.ts
  - react-console/e2e/mock/url-architecture.mock.spec.ts
  - react-console/lib/api/dashboard.ts
  - react-console/lib/applications/availability.test.ts
  - react-console/lib/applications/availability.ts
  - react-console/lib/applications/types.ts
  - react-console/lib/authz/__tests__/authz.test.ts
  - react-console/lib/authz/__tests__/backend-aliases.test.ts
  - react-console/lib/authz/guard.tsx
  - react-console/lib/console/__tests__/orders-nav.test.ts
  - react-console/lib/console/__tests__/record-destination.test.ts
  - react-console/lib/console/__tests__/registries.test.ts
  - react-console/lib/console/__tests__/settings-area-menu.test.ts
  - react-console/lib/console/application-guard.test.ts
  - react-console/lib/console/domains.ts
  - react-console/lib/console/record-types.ts
  - react-console/lib/console/use-visible-nav.ts
  - react-console/lib/custom-objects/__tests__/navigation.test.ts
  - react-console/lib/custom-objects/navigation.ts
  - react-console/lib/custom-objects/use-custom-navigation.ts
  - react-console/lib/quick-search/__tests__/shortcut.test.ts
  - react-console/lib/quick-search/shortcut.ts
  - react-console/lib/routes/__tests__/eligibility-redirect.test.ts
  - react-console/lib/routes/__tests__/guards.test.ts
  - react-console/lib/routes/__tests__/legacy.test.ts
  - react-console/lib/routes/__tests__/routes.test.ts
  - react-console/lib/routes/build.ts
  - react-console/lib/routes/legacy.ts
  - react-console/lib/routes/match.ts
  - react-console/lib/security-context/application-refusal.test.ts
  - react-console/lib/security-context/boot.ts
  - react-console/lib/security-context/entitlements.test.ts
  - react-console/lib/security-context/entitlements.ts
  - react-console/lib/security-context/provider.tsx
  - react-console/next.config.mjs
  - services-platform/docs/licensing.md
  - services-platform/docs/proposals/application-access-and-entitlements.md
  - services-platform/modules/licensing/aws/api/licensing-api-mapper.ts
  - services-platform/modules/licensing/tests/e2e/licensing.e2e.spec.js
  - services-platform/modules/security/services/access/security-context.ts
  - services-platform/modules/tenants/aws/api/tenant-applications.routes.ts
  - react-console/lib/custom-objects/api.ts
  - services-platform/modules/custom-objects/aws/api/custom-apps.routes.ts
  - services-platform/modules/custom-objects/aws/api/custom-objects.routes.ts
validation:
  dependency_installation: 'passed: npm ci'
  corpus_check: 'passed: zero errors'
  corpus_tests: 'passed: 4 tests, 0 failed'
  product_suites: not run; bindings are static source examination
---

# Console shell planning examination

The examination reviews the draft at the pinned code revisions and writes its final product wording. The requested report name retains the draft’s date; the actual examination takes place on the following day. No product approval is inferred from implementation or from a test title.

## What is examined

| Artifact or row collection | Examined / total | Result |
|---|---|---|
| Existing module files | 50/50 | Human prose and structured human descriptions are rewritten; existing identifiers remain permanent |
| Added planning files | 2/2 | A record-reference capability and matching acceptance set supply the omitted outcome |
| Features | 4/4 | Names and grouping only |
| Key concepts | 4/4 | Broad nouns with facets, six sections each and 400–900 words each |
| Capabilities | 18/18 | Outcomes within the module target; no table or CRUD capability requires retirement |
| Rule rows | 155/155 | Sources, provenance, origin and enforcement boundaries reviewed |
| Capability examples | 38/38 | Examples aligned with source strength |
| Journeys | 5/5 | Steps, branches, failures and assertions rewritten and checked |
| Journey assertions | 16/16 | Broad claims narrowed where evidence proves a different example |
| Acceptance sets and scenarios | 18/18 sets; 95/95 scenarios | 46 bound and 49 proposed |
| Actor rows allocated by this module | 0/0 | No rows were added by the draft; five shared actors are reused and the shared register remains unchanged |
| Findings and material questions | 34/34 findings; 3/3 questions | Evidence and unresolved choices remain visible |

The grain remains four concepts and eighteen capabilities. Existing outcomes stay in place; the newly covered record-reference outcome has its own acceptance set. Header return behavior and custom-placement eligibility each have one rule home, while journeys refer to the governing rules through their structured references.

## Source and coverage audit

Repository heads match the required pins throughout the examination. The source audit resolves 556 explicit repository-prefixed source, origin and binding references to 76 directly parsed files, with no missing file or test-title result. Broader evidence lists and imported dependencies are reviewed in addition to that direct-reference count; existence alone is not treated as proof of a statement.

| Surface | Examined or assigned / total | Coverage | Uncovered by name |
|---|---|---|---|
| Shell pages and layouts | 7/7 | Frame, starting page, compatibility entry, workspace entry, home, planned destination and application overview | None |
| Platform operations called by the shell | 7/7 | Three Security reads, three Metadata reads and the administrator application read | None; service ownership remains external |
| Named permission references in frame and catalogues | 145/145 | Generic navigation and authority rules; every resolved key appears in the structured coverage list | None in the examined constant references |
| Shared console permission registry | 1026/1026 subject to the shared evaluator | Alias, synthetic-key, deny and scope behavior | Individual business actions belong to their product modules |
| Referenced console browser files | 10/10 | Static source examination, with unsupported bindings removed | Passing product runs are not recorded |
| Direct shell and integration unit files | 20/20 | Route guards, navigation, records, layout, application access, shortcuts and home errors | No omitted file after the additions |
| Security unit dependencies | 3/3 assigned | Boot, context parsing and strict workspace identity | Security owns their full specifications |
| Licensing API operations | 10/10 assigned | Operations owns the staff and synchronization operations | No shell-owned licensing operation |
| Licensing tables | 9/9 assigned | Operations owns all tables, including export entitlements | No shell-owned business table |
| Licensing queue, dead-letter queue and nightly schedule | 3/3 assigned | Operations owns synchronization and reconciliation | No shell-owned queue, schedule or state machine |
| Licensing product test files | 39/39 assigned | Operations owns the module suites; selected administrator API tests support this layer | Product suites are not executed here |
| Must-prove rules with scenarios | 98/109 | Remaining names are listed below and in the proof finding | 11 rules still need scenarios |
| Must-prove rules with test bindings | 49/109 | Static binding audit only | 60 rules lack complete bindings |
| Earlier shell acceptance inventory seeds | 0/0 | No seed numbering is continued | None found |

### Entry points and called operations

| Entry or operation | Capability coverage |
|---|---|
| Outer console layout | `CAP-PFM-CSH-001`, `CAP-PFM-CSH-013` |
| Bare starting page | `CAP-PFM-CSH-004`, `CAP-PFM-CSH-012`, `CAP-PFM-CSH-013` |
| Compatibility catch-all | `CAP-PFM-CSH-012` |
| Workspace layout | `CAP-PFM-CSH-010`, `CAP-PFM-CSH-015` |
| Workspace home | `CAP-PFM-CSH-004` |
| Planned-page catch-all | `CAP-PFM-CSH-009`, `CAP-PFM-CSH-015` |
| Configuration home | `CAP-PFM-CSH-017` |
| `getMySecurityContext` | `CAP-PFM-CSH-001`, `CAP-PFM-CSH-010`, `CAP-PFM-CSH-013` |
| `getMySecurityContextInTenant` | `CAP-PFM-CSH-011`, `CAP-PFM-CSH-013` |
| `getMyApplications` | `CAP-PFM-CSH-016` |
| `listTenantApplicationsForTenant` | `CAP-PFM-CSH-017` |
| `getCustomObjectsNavigation`, `listCustomObjects`, `listCustomApps` | `CAP-PFM-CSH-008` |

### Browser files

| Pinned browser file | Examination coverage |
|---|---|
| `e2e/controlled/staff-deep-link.controlled.spec.ts` | Staff context and landing |
| `e2e/controlled/tenant-unavailable.controlled.spec.ts` | Workspace destination and compatibility behavior |
| `e2e/dev/hq-licensing.dev.spec.ts` | Customer application overview; staff mutations belong to Operations |
| `e2e/dev/initialisation.dev.spec.ts` | Initial access boundary |
| `e2e/dev/url-architecture.dev.spec.ts` | Workspace destination and compatibility behavior |
| `e2e/layout/page-layouts.spec.ts` | Page room |
| `e2e/mock/application-access.mock.spec.ts` | Application presentation and refresh |
| `e2e/mock/custom-object-navigation.mock.spec.ts` | Custom placements |
| `e2e/mock/staff-landing.mock.spec.ts` | Staff context and landing |
| `e2e/mock/url-architecture.mock.spec.ts` | Workspace destination and compatibility behavior |

### Unit files

| Pinned unit file | Capability suffixes or owner |
|---|---|
| `lib/routes/__tests__/routes.test.ts` | 009, 011 |
| `lib/routes/__tests__/guards.test.ts` | 009 |
| `lib/routes/__tests__/legacy.test.ts` | 012 |
| `lib/routes/__tests__/eligibility-redirect.test.ts` | 009 |
| `lib/console/__tests__/registries.test.ts` | 006, 007, 018 |
| `lib/console/__tests__/settings-area-menu.test.ts` | 007 |
| `lib/console/__tests__/orders-nav.test.ts` | 007 |
| `lib/console/__tests__/record-destination.test.ts` | 018 |
| `lib/console/application-guard.test.ts` | 014, 015 |
| `components/console/__tests__/page-layout.test.tsx` | 002 |
| `components/console/__tests__/page-layout-adoption.test.ts` | 002 |
| `components/console/__tests__/tenant-id-gate.test.tsx` | 010 |
| `components/console/home/__tests__/dashboard-state.test.tsx` | 004 |
| `lib/security-context/entitlements.test.ts` | 014 |
| `lib/security-context/application-refusal.test.ts` | 016 |
| `lib/applications/availability.test.ts` | 017 |
| `lib/custom-objects/__tests__/navigation.test.ts` | 006, 008 |
| `lib/quick-search/__tests__/shortcut.test.ts` | 003 |
| `lib/authz/__tests__/authz.test.ts` | 014 |
| `lib/authz/__tests__/backend-aliases.test.ts` | 007, 014 |
| `lib/security-context/boot.test.ts` | Security dependency; entry integration in 010, 012, 013 |
| `lib/security-context/context.test.ts` | Security dependency; staff context in 013 |
| `lib/security-context/tenant-id.test.ts` | Security dependency; strict entry in 010 |

### Rules still without an acceptance scenario

| Rule | Finding |
|---|---|
| `BR-CAP-PFM-CSH-002-07` | `FND-PFM-CSH-021` |
| `BR-CAP-PFM-CSH-008-06` | `FND-PFM-CSH-021` |
| `BR-CAP-PFM-CSH-010-08` | `FND-PFM-CSH-021` |
| `BR-CAP-PFM-CSH-010-10` | `FND-PFM-CSH-021` |
| `BR-CAP-PFM-CSH-011-03` | `FND-PFM-CSH-021` |
| `BR-CAP-PFM-CSH-011-05` | `FND-PFM-CSH-021` |
| `BR-CAP-PFM-CSH-011-08` | `FND-PFM-CSH-021` |
| `BR-CAP-PFM-CSH-014-02` | `FND-PFM-CSH-021` |
| `BR-CAP-PFM-CSH-014-06` | `FND-PFM-CSH-021` |
| `BR-CAP-PFM-CSH-016-04` | `FND-PFM-CSH-021` |
| `BR-CAP-PFM-CSH-016-05` | `FND-PFM-CSH-021` |

## Verification changes by artifact

Every existing planning artifact receives final OpenAI wording in a rewrite commit separate from its verification. Later source discoveries are committed as additional verification units. The structured verification audit records every changed protected field with its previous and final values; unchanged identifiers, source pins and supersession values are preserved.

| Capability | Fact and evidence corrections |
|---|---|
| `CAP-PFM-CSH-001` | Separates missing setup from request-failure recovery; records fixed sample-money arithmetic; aligns start-up scenario evidence; moves the home-return target policy to the home capability. |
| `CAP-PFM-CSH-002` | Corrects standard width to a maximum rather than a fixed width; limits adoption claims to inspected screens; separates an approved layout requirement from universal implementation; requires proof of stored navigation preference. |
| `CAP-PFM-CSH-003` | Separates shortcut recognition from permission handling so pure chord tests do not claim browser authority; distinguishes adaptive search labels from Configuration’s fixed Command hint. |
| `CAP-PFM-CSH-004` | Distinguishes mock figures from the live hook’s suppressed request; covers error classification and unguarded percentage arithmetic; distinguishes customer landing from staff landing. |
| `CAP-PFM-CSH-005` | Corrects single-word initials and the actual help destination; adds rating and details-limit validation; retains the observed lack of feedback delivery and Profile behavior. |
| `CAP-PFM-CSH-006` | Records the filter exception to single-section expansion; places static built-screen eligibility here and custom-placement eligibility in the custom-navigation capability; corrects scenario examples and partial test bindings. |
| `CAP-PFM-CSH-007` | Corrects Configuration entry to its first configured destination and treats return behavior as observation; separates page refusal from menu visibility; adds the tested Orders store entry and price-schedule exclusion. |
| `CAP-PFM-CSH-008` | Records actual application, group and label ordering; distinguishes server navigation from list fallback and pending or failed reads; uses the real implementation symbols, corrects the backend file for the navigation read and assigns custom-placement eligibility one rule home. |
| `CAP-PFM-CSH-009` | Names explicit non-console and preview exceptions; limits literal-path and page-inventory claims to the guard scope; distinguishes supported query retention from deliberate switch query removal. |
| `CAP-PFM-CSH-010` | Separates helper results from rendered refusal and recovery; sources strict fresh entry from the provider and boot path; removes unsupported confirmation of the refusal interval and requires proof of remaining validations. |
| `CAP-PFM-CSH-011` | Corrects confirmation timing and cache-clear timing; separates customer remembered landing from staff HQ landing; requires proof for selection calculation, no-op selection and persisted workspace memory. |
| `CAP-PFM-CSH-012` | Limits the compatibility unit binding to enumerated cases; leaves unsupported no-workspace behavior proposed; includes boot evidence for reopening remembered staff context. |
| `CAP-PFM-CSH-013` | Keeps mixed staff-mode observations proposed while retaining decision origins for HQ landing and cleared direct entry; removes broad bindings that do not prove the whole frame and navigation. |
| `CAP-PFM-CSH-014` | Defines keyless domains by missing backend aliases rather than missing deployed catalogue keys; covers scoped grants and authoritative backend allowed keys; distinguishes normalized deny precedence from stale-rule normalization and corrects test fixtures. |
| `CAP-PFM-CSH-015` | Requires an enabled alternative application and a usable task permission; separates pure decisions from rendered denial; leaves transition and composite browser outcomes proposed. |
| `CAP-PFM-CSH-016` | Requires proof of partial-context replacement and concurrent refresh behavior; records the cross-workspace in-flight request risk and Security’s full-context read dependency. |
| `CAP-PFM-CSH-017` | Separates console view authority from tested API authority; covers explicit reach, disabled-workspace reads and sanitized answers; adds date, parser and permissive availability-default proof; corrects the HQ browser test to what it actually asserts. |
| `CAP-PFM-CSH-018` | Adds the omitted record-reference outcome, covering built-in guards, parent-dependent refusal, encoding, unknown-type behavior and custom fallback without a resource scope. |

| Other artifact | Final work |
|---|---|
| `FEAT-PFM-CSH-01` through `FEAT-PFM-CSH-04` | Final grouping titles, purposes and outcomes; mixed observations remain proposed |
| `CON-PFM-CSH-001` | Startup recovery distinguishes absent configuration from access refusal and request failure |
| `CON-PFM-CSH-002` | Filtering is distinguished from ordinary single-section navigation |
| `CON-PFM-CSH-003` | Other runtimes and preview exceptions are named; catalogue guard coverage is bounded |
| `CON-PFM-CSH-004` | Licence exemption is distinguished from withholding; missing aliases are distinguished from missing service permissions; application access is separated from task authority |
| `JNY-PFM-CSH-001` | Home content and failure recovery use observed sources; customer and staff starting cases remain distinct |
| `JNY-PFM-CSH-002` | Configuration enters Fields, not the application overview; Regions and return claims use their actual evidence |
| `JNY-PFM-CSH-003` | Contact-specific sign-in and history portions remain documented where browser tests exercise another destination |
| `JNY-PFM-CSH-004` | Confirmation precedes successful entry; strict URL entry and remembered customer landing use the actual provider path |
| `JNY-PFM-CSH-005` | The logo supplies the home return; overview explanations and console refusal use observed sources |
| `ATS-PFM-CSH-001` through `ATS-PFM-CSH-018` | All human scenario fields rewritten; coverage tables distinguish bindings, proposals and missing scenarios; added scenarios cover omitted calculations, normalization, API boundaries and record references |
| `MOD-PFM-CSH` | Scope, ownership and coverage denominators corrected; the registry status becomes planning examined |
| Module identifier register | New IDs reserved before authoring; count ranges reconciled without renumbering any existing artifact or row |
| Module findings register | Every finding and question receives final wording; sample-dashboard and historical-test overclaims corrected; findings 025–034 record examination discoveries |
| Shared Platform actor register | No module-added row exists and no unrelated row is changed |

### Changed bindings

| Acceptance scenario | Binding change |
|---|---|
| `ATS-PFM-CSH-012-01` | 1 → 1 bindings |
| `ATS-PFM-CSH-012-04` | 1 → 0 bindings |
| `ATS-PFM-CSH-007-01` | 3 → 0 bindings |
| `ATS-PFM-CSH-007-02` | 1 → 0 bindings |
| `ATS-PFM-CSH-007-05` | 1 → 0 bindings |
| `ATS-PFM-CSH-008-03` | 1 → 2 bindings |
| `ATS-PFM-CSH-008-04` | 2 → 0 bindings |
| `ATS-PFM-CSH-008-05` | 1 → 0 bindings |
| `ATS-PFM-CSH-011-01` | 2 → 1 bindings |
| `ATS-PFM-CSH-011-02` | 1 → 0 bindings |
| `ATS-PFM-CSH-001-02` | 1 → 0 bindings |
| `ATS-PFM-CSH-017-01` | 3 → 3 bindings |
| `ATS-PFM-CSH-006-05` | 2 → 0 bindings |
| `ATS-PFM-CSH-006-07` | 1 → 0 bindings |
| `ATS-PFM-CSH-002-02` | 3 → 0 bindings |
| `ATS-PFM-CSH-002-04` | 2 → 0 bindings |
| `ATS-PFM-CSH-010-01` | 1 → 0 bindings |
| `ATS-PFM-CSH-010-03` | 6 → 0 bindings |
| `ATS-PFM-CSH-010-04` | 2 → 0 bindings |
| `ATS-PFM-CSH-010-05` | 2 → 0 bindings |
| `ATS-PFM-CSH-013-01` | 1 → 0 bindings |
| `ATS-PFM-CSH-009-03` | 3 → 0 bindings |
| `ATS-PFM-CSH-009-04` | 3 → 2 bindings |
| `ATS-PFM-CSH-009-05` | 2 → 1 bindings |
| `ATS-PFM-CSH-015-02` | 2 → 0 bindings |
| `ATS-PFM-CSH-015-04` | 2 → 0 bindings |

### Changed protected metadata

| Artifact | Row | Field | Change |
|---|---|---|---|
| `JNY-PFM-CSH-001` | `steps 3` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-001` | `steps 3` | `provenance` | test → observed |
| `JNY-PFM-CSH-001` | `failures 1` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-001` | `failures 1` | `provenance` | test → observed |
| `JNY-PFM-CSH-004` | `artifact` | `product_intent` | confirmed → proposed |
| `JNY-PFM-CSH-004` | `steps 2` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-004` | `steps 2` | `provenance` | test → observed |
| `JNY-PFM-CSH-004` | `steps 4` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-004` | `steps 4` | `provenance` | test → observed |
| `JNY-PFM-CSH-004` | `steps 5` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-004` | `steps 5` | `provenance` | test → observed |
| `JNY-PFM-CSH-004` | `failures 1` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-004` | `failures 1` | `provenance` | test → observed |
| `JNY-PFM-CSH-004` | `failures 2` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-004` | `failures 2` | `provenance` | test → observed |
| `JNY-PFM-CSH-004` | `AS-JNY-PFM-CSH-004-02` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-004` | `AS-JNY-PFM-CSH-004-02` | `provenance` | test → observed |
| `JNY-PFM-CSH-004` | `AS-JNY-PFM-CSH-004-03` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-004` | `AS-JNY-PFM-CSH-004-03` | `provenance` | test → observed |
| `JNY-PFM-CSH-005` | `artifact` | `product_intent` | confirmed → proposed |
| `JNY-PFM-CSH-005` | `steps 3` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-005` | `steps 3` | `provenance` | test → observed |
| `JNY-PFM-CSH-005` | `alternates 1` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-005` | `alternates 1` | `provenance` | test → observed |
| `JNY-PFM-CSH-005` | `failures 1` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-005` | `failures 1` | `provenance` | test → observed |
| `JNY-PFM-CSH-005` | `AS-JNY-PFM-CSH-005-03` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-005` | `AS-JNY-PFM-CSH-005-03` | `provenance` | test → observed |
| `JNY-PFM-CSH-003` | `artifact` | `product_intent` | confirmed → proposed |
| `JNY-PFM-CSH-003` | `steps 1` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-003` | `steps 1` | `provenance` | test → documented |
| `JNY-PFM-CSH-003` | `steps 2` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-003` | `steps 2` | `provenance` | test → observed |
| `JNY-PFM-CSH-003` | `steps 3` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-003` | `steps 3` | `provenance` | test → documented |
| `JNY-PFM-CSH-003` | `steps 4` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-003` | `steps 5` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-003` | `steps 5` | `provenance` | test → documented |
| `JNY-PFM-CSH-003` | `alternates 2` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-003` | `alternates 2` | `provenance` | test → documented |
| `JNY-PFM-CSH-003` | `failures 2` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-003` | `failures 2` | `provenance` | test → observed |
| `JNY-PFM-CSH-003` | `AS-JNY-PFM-CSH-003-02` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-002` | `steps 2` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-002` | `steps 2` | `provenance` | test → observed |
| `JNY-PFM-CSH-002` | `failures 1` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-002` | `failures 1` | `provenance` | test → observed |
| `JNY-PFM-CSH-002` | `AS-JNY-PFM-CSH-002-01` | `source` | Exact replacement recorded in the structured verification audit |
| `JNY-PFM-CSH-002` | `AS-JNY-PFM-CSH-002-01` | `provenance` | test → observed |
| `ATS-PFM-CSH-012` | `ATS-PFM-CSH-012-01` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-012` | `ATS-PFM-CSH-012-04` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-012` | `ATS-PFM-CSH-012-04` | `provenance` | test → proposed |
| `ATS-PFM-CSH-007` | `ATS-PFM-CSH-007-01` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-007` | `ATS-PFM-CSH-007-01` | `provenance` | test → proposed |
| `ATS-PFM-CSH-007` | `ATS-PFM-CSH-007-02` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-007` | `ATS-PFM-CSH-007-02` | `provenance` | test → proposed |
| `ATS-PFM-CSH-007` | `ATS-PFM-CSH-007-05` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-007` | `ATS-PFM-CSH-007-05` | `provenance` | test → proposed |
| `ATS-PFM-CSH-008` | `ATS-PFM-CSH-008-04` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-008` | `ATS-PFM-CSH-008-04` | `provenance` | test → proposed |
| `ATS-PFM-CSH-008` | `ATS-PFM-CSH-008-05` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-008` | `ATS-PFM-CSH-008-05` | `provenance` | test → proposed |
| `ATS-PFM-CSH-011` | `ATS-PFM-CSH-011-02` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-011` | `ATS-PFM-CSH-011-02` | `provenance` | test → proposed |
| `ATS-PFM-CSH-003` | `ATS-PFM-CSH-003-01` | `proves` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-001` | `ATS-PFM-CSH-001-02` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-001` | `ATS-PFM-CSH-001-02` | `provenance` | test → proposed |
| `ATS-PFM-CSH-017` | `ATS-PFM-CSH-017-01` | `proves` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-017` | `ATS-PFM-CSH-017-05` | `proves` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-006` | `ATS-PFM-CSH-006-04` | `proves` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-006` | `ATS-PFM-CSH-006-05` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-006` | `ATS-PFM-CSH-006-05` | `provenance` | test → proposed |
| `ATS-PFM-CSH-006` | `ATS-PFM-CSH-006-07` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-006` | `ATS-PFM-CSH-006-07` | `provenance` | test → proposed |
| `ATS-PFM-CSH-002` | `ATS-PFM-CSH-002-02` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-002` | `ATS-PFM-CSH-002-02` | `provenance` | test → proposed |
| `ATS-PFM-CSH-002` | `ATS-PFM-CSH-002-04` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-002` | `ATS-PFM-CSH-002-04` | `provenance` | test → proposed |
| `ATS-PFM-CSH-010` | `ATS-PFM-CSH-010-01` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-010` | `ATS-PFM-CSH-010-01` | `provenance` | test → proposed |
| `ATS-PFM-CSH-010` | `ATS-PFM-CSH-010-03` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-010` | `ATS-PFM-CSH-010-03` | `provenance` | test → proposed |
| `ATS-PFM-CSH-010` | `ATS-PFM-CSH-010-04` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-010` | `ATS-PFM-CSH-010-04` | `provenance` | test → proposed |
| `ATS-PFM-CSH-010` | `ATS-PFM-CSH-010-05` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-010` | `ATS-PFM-CSH-010-05` | `provenance` | test → proposed |
| `ATS-PFM-CSH-013` | `ATS-PFM-CSH-013-01` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-013` | `ATS-PFM-CSH-013-01` | `provenance` | test → proposed |
| `ATS-PFM-CSH-009` | `ATS-PFM-CSH-009-03` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-009` | `ATS-PFM-CSH-009-03` | `provenance` | test → proposed |
| `ATS-PFM-CSH-015` | `ATS-PFM-CSH-015-02` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-015` | `ATS-PFM-CSH-015-02` | `provenance` | test → proposed |
| `ATS-PFM-CSH-015` | `ATS-PFM-CSH-015-02` | `level` | unit → browser |
| `ATS-PFM-CSH-015` | `ATS-PFM-CSH-015-04` | `source` | Exact replacement recorded in the structured verification audit |
| `ATS-PFM-CSH-015` | `ATS-PFM-CSH-015-04` | `provenance` | test → proposed |
| `CON-PFM-CSH-004` | `artifact` | `product_intent` | confirmed → proposed |
| `CON-PFM-CSH-003` | `artifact` | `product_intent` | confirmed → proposed |
| `FEAT-PFM-CSH-04` | `artifact` | `product_intent` | confirmed → proposed |
| `FEAT-PFM-CSH-03` | `artifact` | `product_intent` | confirmed → proposed |
| `CAP-PFM-CSH-007` | `BR-CAP-PFM-CSH-007-03` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-007` | `BR-CAP-PFM-CSH-007-03` | `provenance` | test → observed |
| `CAP-PFM-CSH-007` | `BR-CAP-PFM-CSH-007-07` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-007` | `BR-CAP-PFM-CSH-007-07` | `provenance` | test → observed |
| `CAP-PFM-CSH-007` | `SC-CAP-PFM-CSH-007-01` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-007` | `SC-CAP-PFM-CSH-007-01` | `provenance` | test → observed |
| `CAP-PFM-CSH-012` | `artifact` | `product_intent` | confirmed → proposed |
| `CAP-PFM-CSH-012` | `SC-CAP-PFM-CSH-012-02` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-001` | `BR-CAP-PFM-CSH-001-07` | `must_prove` | false → true |
| `CAP-PFM-CSH-001` | `SC-CAP-PFM-CSH-001-02` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-001` | `SC-CAP-PFM-CSH-001-02` | `provenance` | test → observed |
| `CAP-PFM-CSH-015` | `artifact` | `product_intent` | confirmed → proposed |
| `CAP-PFM-CSH-015` | `BR-CAP-PFM-CSH-015-03` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-015` | `BR-CAP-PFM-CSH-015-03` | `provenance` | test → observed |
| `CAP-PFM-CSH-015` | `BR-CAP-PFM-CSH-015-08` | `must_prove` | false → true |
| `CAP-PFM-CSH-015` | `SC-CAP-PFM-CSH-015-02` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-015` | `SC-CAP-PFM-CSH-015-02` | `provenance` | test → observed |
| `CAP-PFM-CSH-006` | `BR-CAP-PFM-CSH-006-04` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-006` | `BR-CAP-PFM-CSH-006-04` | `provenance` | test → observed |
| `CAP-PFM-CSH-006` | `BR-CAP-PFM-CSH-006-06` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-006` | `BR-CAP-PFM-CSH-006-06` | `provenance` | test → observed |
| `CAP-PFM-CSH-006` | `BR-CAP-PFM-CSH-006-07` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-006` | `BR-CAP-PFM-CSH-006-07` | `provenance` | test → observed |
| `CAP-PFM-CSH-006` | `BR-CAP-PFM-CSH-006-09` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-006` | `BR-CAP-PFM-CSH-006-09` | `provenance` | test → observed |
| `CAP-PFM-CSH-006` | `BR-CAP-PFM-CSH-006-12` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-006` | `BR-CAP-PFM-CSH-006-12` | `provenance` | test → observed |
| `CAP-PFM-CSH-006` | `SC-CAP-PFM-CSH-006-03` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-006` | `SC-CAP-PFM-CSH-006-03` | `provenance` | test → observed |
| `CAP-PFM-CSH-005` | `BR-CAP-PFM-CSH-005-01` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-005` | `BR-CAP-PFM-CSH-005-03` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-011` | `artifact` | `product_intent` | confirmed → proposed |
| `CAP-PFM-CSH-011` | `BR-CAP-PFM-CSH-011-03` | `must_prove` | false → true |
| `CAP-PFM-CSH-011` | `BR-CAP-PFM-CSH-011-05` | `must_prove` | false → true |
| `CAP-PFM-CSH-011` | `BR-CAP-PFM-CSH-011-07` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-011` | `BR-CAP-PFM-CSH-011-07` | `provenance` | documented → observed |
| `CAP-PFM-CSH-011` | `BR-CAP-PFM-CSH-011-07` | `origin` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-011` | `BR-CAP-PFM-CSH-011-08` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-011` | `BR-CAP-PFM-CSH-011-08` | `provenance` | documented → observed |
| `CAP-PFM-CSH-011` | `BR-CAP-PFM-CSH-011-08` | `must_prove` | false → true |
| `CAP-PFM-CSH-011` | `SC-CAP-PFM-CSH-011-02` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-009` | `artifact` | `product_intent` | confirmed → proposed |
| `CAP-PFM-CSH-009` | `BR-CAP-PFM-CSH-009-01` | `origin` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-009` | `BR-CAP-PFM-CSH-009-05` | `must_prove` | false → true |
| `CAP-PFM-CSH-009` | `BR-CAP-PFM-CSH-009-09` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-009` | `BR-CAP-PFM-CSH-009-09` | `provenance` | documented → observed |
| `CAP-PFM-CSH-014` | `artifact` | `product_intent` | confirmed → proposed |
| `CAP-PFM-CSH-014` | `BR-CAP-PFM-CSH-014-02` | `must_prove` | false → true |
| `CAP-PFM-CSH-014` | `BR-CAP-PFM-CSH-014-05` | `origin` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-014` | `BR-CAP-PFM-CSH-014-06` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-014` | `BR-CAP-PFM-CSH-014-06` | `provenance` | documented → observed |
| `CAP-PFM-CSH-014` | `BR-CAP-PFM-CSH-014-06` | `must_prove` | false → true |
| `CAP-PFM-CSH-014` | `SC-CAP-PFM-CSH-014-01` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-014` | `SC-CAP-PFM-CSH-014-02` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-016` | `artifact` | `product_intent` | confirmed → proposed |
| `CAP-PFM-CSH-016` | `BR-CAP-PFM-CSH-016-04` | `must_prove` | false → true |
| `CAP-PFM-CSH-016` | `BR-CAP-PFM-CSH-016-05` | `must_prove` | false → true |
| `CAP-PFM-CSH-008` | `BR-CAP-PFM-CSH-008-03` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-008` | `BR-CAP-PFM-CSH-008-03` | `provenance` | test → observed |
| `CAP-PFM-CSH-008` | `BR-CAP-PFM-CSH-008-05` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-008` | `BR-CAP-PFM-CSH-008-05` | `provenance` | test → observed |
| `CAP-PFM-CSH-008` | `BR-CAP-PFM-CSH-008-06` | `must_prove` | false → true |
| `CAP-PFM-CSH-008` | `BR-CAP-PFM-CSH-008-07` | `must_prove` | false → true |
| `CAP-PFM-CSH-010` | `artifact` | `product_intent` | confirmed → proposed |
| `CAP-PFM-CSH-010` | `BR-CAP-PFM-CSH-010-06` | `origin` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-010` | `BR-CAP-PFM-CSH-010-08` | `must_prove` | false → true |
| `CAP-PFM-CSH-010` | `BR-CAP-PFM-CSH-010-09` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-010` | `BR-CAP-PFM-CSH-010-09` | `provenance` | test → observed |
| `CAP-PFM-CSH-010` | `BR-CAP-PFM-CSH-010-10` | `must_prove` | false → true |
| `CAP-PFM-CSH-010` | `SC-CAP-PFM-CSH-010-02` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-010` | `SC-CAP-PFM-CSH-010-02` | `provenance` | test → observed |
| `CAP-PFM-CSH-010` | `SC-CAP-PFM-CSH-010-03` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-010` | `SC-CAP-PFM-CSH-010-03` | `provenance` | test → observed |
| `CAP-PFM-CSH-002` | `artifact` | `product_intent` | confirmed → proposed |
| `CAP-PFM-CSH-002` | `BR-CAP-PFM-CSH-002-03` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-002` | `BR-CAP-PFM-CSH-002-03` | `provenance` | test → observed |
| `CAP-PFM-CSH-002` | `BR-CAP-PFM-CSH-002-03` | `origin` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-002` | `BR-CAP-PFM-CSH-002-07` | `must_prove` | false → true |
| `CAP-PFM-CSH-004` | `BR-CAP-PFM-CSH-004-03` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-013` | `artifact` | `product_intent` | confirmed → proposed |
| `CAP-PFM-CSH-017` | `artifact` | `product_intent` | confirmed → proposed |
| `CAP-PFM-CSH-017` | `BR-CAP-PFM-CSH-017-01` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-017` | `BR-CAP-PFM-CSH-017-01` | `provenance` | test → observed |
| `CAP-PFM-CSH-017` | `BR-CAP-PFM-CSH-017-01` | `enforced_at` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-017` | `BR-CAP-PFM-CSH-017-05` | `must_prove` | false → true |
| `CAP-PFM-CSH-017` | `BR-CAP-PFM-CSH-017-08` | `must_prove` | false → true |
| `CAP-PFM-CSH-017` | `BR-CAP-PFM-CSH-017-09` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-017` | `BR-CAP-PFM-CSH-017-09` | `must_prove` | false → true |
| `CAP-PFM-CSH-017` | `BR-CAP-PFM-CSH-017-10` | `must_prove` | false → true |
| `CAP-PFM-CSH-017` | `SC-CAP-PFM-CSH-017-01` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-017` | `SC-CAP-PFM-CSH-017-02` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-017` | `SC-CAP-PFM-CSH-017-02` | `provenance` | test → observed |
| `CAP-PFM-CSH-003` | `BR-CAP-PFM-CSH-003-01` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-003` | `BR-CAP-PFM-CSH-003-01` | `provenance` | test → observed |
| `CAP-PFM-CSH-003` | `BR-CAP-PFM-CSH-003-06` | `source` | Exact replacement recorded in the structured verification audit |
| `CAP-PFM-CSH-003` | `BR-CAP-PFM-CSH-003-06` | `provenance` | test → observed |

## Findings and disagreements retained

A boundary correction can be complete while its finding remains useful as audit history. The remaining findings retain product decisions, incomplete proof, implementation debt or differences between the records and code. No unavailable product test result is presented as a current failure.

| Finding | Disposition | Issue |
|---|---|---|
| `FND-PFM-CSH-001` | Boundary or seed absence accounted for; retained for audit | Licensing appears in the shell’s read boundary, while Operations owns the calculation and records. The current scope preserves that separation and claims only the console consumption of the answer. |
| `FND-PFM-CSH-002` | Boundary or seed absence accounted for; retained for audit | Source coverage needs the application and workspace integrations as well as the frame. The registered boundary names these implementations so subsequent examinations include their effects. |
| `FND-PFM-CSH-003` | Boundary or seed absence accounted for; retained for audit | Custom Apps is an administrative screen within the registered source boundary, but metadata owns its records and editing policy. This module covers how those records contribute to navigation. |
| `FND-PFM-CSH-004` | Boundary or seed absence accounted for; retained for audit | The inspected acceptance inventories provide no earlier shell capability or journey seed. Existing console tests supply bindings, and the module does not inherit an earlier identifier series. |
| `FND-PFM-CSH-005` | Open | The home-page comment describes sample dashboard figures. The live hook actually suppresses the unavailable summary request, so sample figures are restricted to mock mode and the live home explains the missing dashboard connection. |
| `FND-PFM-CSH-006` | Open | Feedback submission displays thanks without delivering the submitted information. The product should connect acknowledgement to durable receipt or explain the current limitation before submission. |
| `FND-PFM-CSH-007` | Open | Profile appears among personal actions but has no selection behavior. The product should provide its destination or remove the unusable action. |
| `FND-PFM-CSH-008` | Open | The unavailable-page component accepts a detailed explanation, but current callers supply only the console section name. The administrative application view can explain the underlying state while the blocked destination cannot. |
| `FND-PFM-CSH-009` | Open | The recorded renewal decision calls for administrator warnings beginning sixty days before licence expiry. The security context omits the end date needed by that experience, and the shell does not show the agreed warning. |
| `FND-PFM-CSH-010` | Open | The accepted application-access design locates the administrator list under licensing. The implemented contract places it alongside workspace resources, leaving the recorded address inconsistent with the service. |
| `FND-PFM-CSH-011` | Open | The unapproved information architecture describes account notices, recent workspace choices and additional tools and administrative groups that are absent from the console. These proposals remain outside confirmed intent. |
| `FND-PFM-CSH-012` | Open | A code comment attributes the built-screen visibility policy to Andrew, but no inspected product record confirms that policy. It remains proposed; planned entries within an eligible section remain part of the current menu. |
| `FND-PFM-CSH-013` | Open | The console maintains fixed sample-money conversions alongside the separately selected working currency. The product should retire the illustrative conversion mechanism when the live dashboard has an agreed data source. |
| `FND-PFM-CSH-014` | Open | Workspace entry, selection and HQ navigation expose internal terminology while other screens use customer-facing wording. The product should adopt consistent customer language across the frame. |
| `FND-PFM-CSH-015` | Open | Planned-screen placeholders refer customers to internal migration planning and roadmap material. The product should describe the unfinished destination in customer terms. |
| `FND-PFM-CSH-016` | Open | Area-access keys alone do not make an administrative menu useful. The console compensates by checking whether an area contains visible destinations; direct entry still depends on each destination’s guard. This presentation policy has no inspected product decision. |
| `FND-PFM-CSH-017` | Open | The main shortcut handler is described in a comment as the only keyboard listener, although the sidebar has a separate folding listener. The implementation and comment disagree. |
| `FND-PFM-CSH-018` | Open | Navigation writes its fold preference to browser storage but does not restore that preference on a new load. The product should decide whether the stored preference is intended to persist. |
| `FND-PFM-CSH-019` | Open | The accepted address record describes a historical designer-width failure on a wide viewport with navigation collapsed. This examination does not rerun that product test, so the present failure state remains unverified. |
| `FND-PFM-CSH-020` | Open | The Websites menu link has no application or permission predicate in console navigation. Its owning service therefore remains the authority for any refusal after selection. |
| `FND-PFM-CSH-021` | Open | The listed rules lack complete test bindings. Proposed scenarios describe some of the required proof; the remaining rules need scenarios before approval. Source observation does not establish the full browser outcome. |
| `FND-PFM-CSH-022` | Open | Test bindings result from reading pinned test titles and assertions. This job runs corpus validation rather than the product suites, so these bindings do not certify passing product tests. |
| `FND-PFM-CSH-023` | Open | The shared route-level application check recognizes registered application domains. Administrative areas, tools and HQ destinations depend on their own guards; the shared check does not establish their individual authority. |
| `FND-PFM-CSH-024` | Open | The compatibility catalogue has a retirement condition requiring Andrew’s confirmation that earlier links are no longer held. No inspected record supplies that confirmation. |
| `FND-PFM-CSH-025` | Open | Some original bindings name existing tests that prove only part of a scenario or a different example. Unsupported bindings are removed and the scenarios remain proposed; browser state and cache transitions need direct evidence. |
| `FND-PFM-CSH-026` | Open | A switcher comment describes cache clearing before the destination answer. URL entry clears caches after a successful answer, and the confirmation appears before entry succeeds. The product should decide the intended transition timing and require browser proof. |
| `FND-PFM-CSH-027` | Open | An application entry defaults to available whenever its flag is not exactly false, including missing and malformed values. The product should decide whether incomplete answers may offer configuration links and prove that policy. |
| `FND-PFM-CSH-028` | Open | Configuration always displays the Command shortcut label while Quick Search adapts to the device. The product should present command hints consistently. |
| `FND-PFM-CSH-029` | Open | The original corpus omits the shared record-reference destination catalogue. The added capability covers built-in refusal, encoding and custom fallback; custom fallback checks general read authority without a record-type scope. |
| `FND-PFM-CSH-030` | Open | Reading security context can update the authentication record at a throttled interval. Application refresh also resolves the full security context. Security owns these effects and should examine them as reads with possible writes. |
| `FND-PFM-CSH-031` | Boundary or seed absence accounted for; retained for audit | Portal, payment and report-print routes use the shared route library outside the console frame. Operations owns licensing synchronization, reconciliation, export work and its database tests; the shell does not claim those implementations. |
| `FND-PFM-CSH-032` | Open | The application-list hook starts before its page guard renders, leaving service refusal necessary even for a denied page. Refresh also shares an in-flight request across workspace changes, so a new refresh can wait on an old result that is discarded. Both transitions need browser proof. |
| `FND-PFM-CSH-033` | Open | Mock dashboard percentages divide by regional totals or event capacity without a zero guard. Empty totals can produce unreadable percentages. The product should define the empty-total presentation and prove the arithmetic boundaries. |
| `FND-PFM-CSH-034` | Open | The Orders navigation test attributes its exclusion of Price Schedules to a product ruling, but the inspected source boundary contains no decision record confirming that ruling. The menu behavior remains proposed and the owning product module should supply the decision source. |

| Product question | Decision still needed |
|---|---|
| `OQ-PFM-CSH-001` | Compatibility retirement event and date |
| `OQ-PFM-CSH-002` | Renewal-warning delivery and the required expiry information |
| `OQ-PFM-CSH-003` | Customer presentation of unfinished destinations |

## Validation

The required dependency installation, corpus check and corpus tests are run before the final commit. Product unit, API and browser suites are not run; their bindings record source examination only. No code repository, deployment, shared development data, workflow or reader implementation is changed.

| Required command | Result |
|---|---|
| `npm ci && npm run check` | Passed; corpus check reports zero errors |
| `npm test` | Passed; 4 tests, 0 failures |

## Verdict for Andrew

The examined layer faithfully describes the module at the pinned commits, with observed behavior kept proposed and confirming decisions retained in rule origins. Its weakest part is automated proof of browser transitions and recovery, with 60 must-prove rules lacking complete bindings and 11 still lacking scenarios. Before design starts, Andrew should settle the three product questions, review the open findings and confirm the proposed policies, while assigning the missing transition and boundary tests.
