src/cores/tr/NAVIGATION.md— short in-tree navigation classification table.src/platform/modules/module-registry/tr-module.ts— sidebar source of truth (navItems).src/platform/navigation/route-labels.ts— breadcrumb source of truth (BASE_ROUTE_LABELS).docs/pf/permissions-quick-reference.md— full platform permission catalog.
At-a-glance
New routes must be added to this table in the same PR — see
Adding a new route.
Live mirror: The in-app page at/transcription/admin-docsrenders the same routes/permissions/navigation tables, sourced directly from the route catalog, module registry, andROUTE_LABELSso it cannot drift from runtime config. Keep this markdown as the canonical narrative reference.
Routes in detail
/transcription
- Defined in:
src/routes/tr.tsx - Behavior:
<Navigate to="/transcription/vendor-settings" replace /> - Permission: None. The redirect runs before any page-level guard; the destination route enforces its own gates.
- Navigation:
- Sidebar: Not listed. The sidebar links directly to the destination
(
/transcription/vendor-settings). - Breadcrumbs: Labeled “Transcription” via
BASE_ROUTE_LABELS. This label is what renders as the parent crumb when a user is deeper in the module (e.g.Transcription / Vendor Settings).
- Sidebar: Not listed. The sidebar links directly to the destination
(
/transcription/vendor-settings
- Defined in:
src/routes/tr.tsx - Page component:
TranscriptionVendorSettingsPage - Permission (page-level): None. The page renders for any authenticated user; each card on the page enforces its own permission, so unauthorized users see an empty/locked page rather than a hard 403.
- Navigation:
- Sidebar: Listed under “Transcription” with label “Vendor Settings”
and the
Settingsicon. This is the module’sdefaultRouteandsettingsRoute. - Breadcrumbs:
Transcription / Vendor Settings.
- Sidebar: Listed under “Transcription” with label “Vendor Settings”
and the
Per-card permissions
The page composes three cards, each gated independently:Permission key reference
Declared insrc/platform/permissions/constants.ts:
All keys must also exist as rows in
pf_module_permissions (PF-30). Verify
with npm run audit:permissions.
Navigation: how each surface is wired
Sidebar
- Source of truth:
TR_MODULE_DEFINITION.navItemsinsrc/platform/modules/module-registry/tr-module.ts. - Today: one entry —
Vendor Settings→/transcription/vendor-settings. - Module chrome: the “Transcription” group itself is rendered from the
module’s
name+icon(Mic) in the same definition. - Sidebar visibility: governed by the module registry’s standard
permission filtering. The module has no top-level
requiredPermissiontoday, so the group is visible to all authenticated users; the underlying pages enforce their own gates.
Breadcrumbs
- Source of truth:
BASE_ROUTE_LABELSinsrc/platform/navigation/route-labels.ts. - Every route a user can land on (including pure redirects like
/transcription) needs a label here — otherwise the breadcrumb component falls back to a humanized URL segment, which fails the breadcrumb-coverage audit (npm run audit:breadcrumb-coverage -- --strict). - Labels for transcription routes are inline-tagged with
[sidebar]/[breadcrumb-only]so the classification is visible at the call site.
Why a route may be breadcrumb-only
A route that is not a sidebar destination still needs a breadcrumb label when:- It is a redirect parent (e.g.
/transcription). - It is a detail page reached only via in-page action (e.g. a future
/transcription/vendors/:idopened from a row click). - It is a deep link (e.g. an emailed link to a session detail).
BASE_ROUTE_LABELS only — do not
add it to navItems.
Adding a new route
When adding a<Route> under src/routes/tr.tsx:
- Decide the surface: sidebar destination vs breadcrumb-only (see criteria above).
- Add the label to
BASE_ROUTE_LABELSinsrc/platform/navigation/route-labels.ts, tagged// [sidebar]or// [breadcrumb-only]. - If sidebar: add an entry to
TR_MODULE_DEFINITION.navItemsintr-module.tswith a Lucide icon and the canonical label. - Permissions: declare any new permission constant in
src/platform/permissions/constants.tsAND add the matching row topf_module_permissionsvia migration. Runnpm run audit:permissions. - Update this file — add the route to the At-a-glance table and a Routes in detail entry.
- Update
src/cores/tr/NAVIGATION.mdand the doc-comment table intr-module.tsso all three classification tables stay in sync. - Verify:
npm run audit:routes-navigationandnpm run audit:breadcrumb-coverage -- --strict(both included innpm run validate:governance).
Out-of-tree references
- Vendor BAA management UI (CRUD on
pf_transcription_vendor_baas) — planned; will usepf.transcription.vendors.manage. - Org Defaults card (
pf_transcription_module_settings) — planned; will use the reservedpf.transcription.settings.view/pf.transcription.settings.managekeys. - Ambient Review (
/cl/ambient-review,/cl/ambient-review/:sessionId) is the consumer of transcription sessions but lives in the CL core, not the TR module. It is not part of the transcription admin surface and is not listed here.