---
id: CAP-PFM-CSH-012
title: Resolve older console links during the address transition
feature: FEAT-PFM-CSH-03
product_area: platform
module: console-shell
revision: 2
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes: []
source_sha:
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
intent_sources:
  - >-
    react-console:docs/url-architecture.md#7. Compatibility redirects (decided by Andrew 2026-10-14;
    final acceptance 2026-10-15)
purpose: Temporary legacy entry lets staff continue using bookmarks created before workspace addresses.
outcomes:
  - Recognized older links map to current console destinations.
  - Unrecognized older paths remain visibly unavailable.
concepts:
  - CON-PFM-CSH-003
actors:
  - ACT-PFM-001
  - ACT-PFM-002
  - ACT-PFM-004
  - ACT-PFM-005
surfaces:
  - console
preconditions: []
postconditions: []
permissions:
  - key: platform.security-self.read
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-PFM-CSH-012-01
    proved_by: [ATS-PFM-CSH-004-06, ATS-PFM-CSH-012-01, ATS-PFM-CSH-012-02, TST-PFM-CSH-014, TST-PFM-CSH-028]
    statement: >-
      A recognized older address redirects under the remembered or default workspace while retaining
      its record values and query.
    kind: lifecycle
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#an old tenant-less URL lands on its
      canonical URL, id and query kept
    origin: >-
      react-console:docs/url-architecture.md#7. Compatibility redirects (decided by Andrew
      2026-10-14; final acceptance 2026-10-15)
  - id: BR-CAP-PFM-CSH-012-02
    proved_by: [ATS-PFM-CSH-012-01, TST-PFM-CSH-028]
    statement: >-
      Workspace-relative canonical paths are rebound to the selected workspace, and recognized
      planned-area legacy words are converted to camelCase.
    kind: lifecycle
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:lib/routes/legacy.ts:legacyTenantPath'
    origin: >-
      react-console:docs/url-architecture.md#11. Decisions made during the build, item 13 (decided
      by Andrew 2026-10-14; final acceptance 2026-10-15)
  - id: BR-CAP-PFM-CSH-012-03
    proved_by: [ATS-PFM-CSH-012-03]
    statement: An unmapped legacy path displays the page-not-found message.
    kind: validation
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: 'react-console:components/console/legacy-redirect.tsx:LegacyRedirect'
    origin: >-
      react-console:docs/url-architecture.md#7. Compatibility redirects (decided by Andrew
      2026-10-14; final acceptance 2026-10-15)
  - id: BR-CAP-PFM-CSH-012-04
    proved_by: [ATS-PFM-CSH-012-04]
    statement: >-
      A staff user with no selected workspace and a recognized legacy destination is redirected to
      HQ.
    kind: policy
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: 'react-console:components/console/legacy-redirect.tsx:LegacyRedirect'
    origin: >-
      react-console:docs/url-architecture.md#7. Compatibility redirects (decided by Andrew
      2026-10-14; final acceptance 2026-10-15)
  - id: BR-CAP-PFM-CSH-012-05
    proved_by: []
    statement: >-
      Legacy authentication, custom-query-table and design-preview paths use permanent camelCase
      redirects that retain queries.
    kind: lifecycle
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:next.config.mjs:redirects'
    origin: >-
      react-console:docs/url-architecture.md#4.3 Not tenant pages (decided by Andrew 2026-10-14;
      final acceptance 2026-10-15)
  - id: BR-CAP-PFM-CSH-012-06
    proved_by: []
    statement: >-
      The compatibility table’s documented retirement condition is Andrew’s confirmation that older
      links are no longer held.
    kind: lifecycle
    enforced_at:
      - console
    must_prove: false
    provenance: documented
    source: 'react-console:docs/url-architecture.md#7. Compatibility redirects'
    origin: >-
      react-console:docs/url-architecture.md#7. Compatibility redirects (decided by Andrew
      2026-10-14; final acceptance 2026-10-15)
  - id: BR-CAP-PFM-CSH-012-07
    proved_by: [ATS-PFM-CSH-012-04, ATS-PFM-CSH-012-05, TST-PFM-CSH-014]
    statement: >-
      A still-cleared staff user’s older bookmark can reopen the remembered workspace after an HQ
      landing.
    kind: lifecycle
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: >-
      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
    origin: >-
      react-console:docs/url-architecture.md#11. Decisions made during the build, item 24 (Andrew,
      2026-10-15) (decided by Andrew 2026-10-14; final acceptance 2026-10-15)
scenarios:
  - id: SC-CAP-PFM-CSH-012-01
    given: An older contact bookmark includes a tab query.
    when: The person follows it with a usable workspace context.
    then: The canonical contact address retains the identifier and query.
    provenance: test
    source: >-
      react-console:e2e/mock/url-architecture.mock.spec.ts#an old tenant-less URL lands on its
      canonical URL, id and query kept
  - id: SC-CAP-PFM-CSH-012-02
    given: A cleared staff user previously entered a workspace and then landed in HQ.
    when: They open an older workspace-relative bookmark.
    then: The bookmark reopens the remembered workspace while the grant remains valid.
    provenance: observed
    source: >-
      react-console:lib/security-context/boot.ts:bootSecurityContext;
      components/console/legacy-redirect.tsx:LegacyRedirect
edge_cases: []
constraints: []
depends_on: []
related:
  - CAP-PFM-CSH-009
  - CAP-PFM-CSH-013
journeys: []
open_questions:
  - OQ-PFM-CSH-001
evidence:
  - >-
    react-console at baf6dae: lib/routes/legacy.ts, lib/routes/__tests__/legacy.test.ts,
    components/console/legacy-redirect.tsx, app/(console)/[...legacy]/page.tsx,
    app/(console)/page.tsx, next.config.mjs, docs/url-architecture.md §4.3, §7, §11 items 13 and 24,
    e2e/mock/url-architecture.mock.spec.ts.
controls: [TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-AZ-005, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-DAT-004, TC-IAM-003, TC-LOG-001, TC-PI-001, TC-PI-005, TC-PRV-001, TC-PRV-002, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-VEN-001, TC-VEN-002, TC-VEN-003]
exercised_by: [FAS-PFM-CSH-03-05]
suites: [TST-PFM-CSH-014, TST-PFM-CSH-028]
---
# Resolve older console links during the address transition

## Purpose

Temporary legacy entry lets staff continue using bookmarks created before workspace addresses.

## How It Works

A person arrives at a link created before workspace routing. The browser-side legacy entry consults a temporary mapping. A recognized destination is rebound to the selected context. An unknown path stays not found instead of inventing a destination. Staff landing and remembered access affect which context can be reopened. The product should record a dated retirement decision for the compatibility mechanism.

## Relationships

- Console address builders construct the mapped destination.
- Security’s remembered workspace and staff landing determine the usable context.
