---
id: CAP-PFM-CSH-017
title: Understand the workspace’s application availability
feature: FEAT-PFM-CSH-04
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:
  - >-
    services-platform:docs/proposals/application-access-and-entitlements.md#6.4 Console integration
    (built and accepted by Andrew 2026-10-15)
  - >-
    services-platform:docs/proposals/application-access-and-entitlements.md#7.2 Tenant
    administrators: why an application is unavailable (built and accepted by Andrew 2026-10-15)
purpose: Administrators inspect a read-only overview of which applications the workspace can use.
outcomes:
  - Workspace availability is explained independently of personal menu access.
  - The overview supplies recovery actions for loading problems.
concepts:
  - CON-PFM-CSH-004
actors:
  - ACT-PFM-001
surfaces:
  - console
  - api
preconditions: []
postconditions: []
permissions:
  - key: configuration.applications.view
    where_checked: console
    scope: tenant
  - key: platform.tenant-applications.read
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-PFM-CSH-017-01
    statement: >-
      Configuration’s home hosts the Applications overview behind its console view key, mapped to
      the workspace-applications read authority.
    kind: permission
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: >-
      react-console:components/configuration/applications/tenant-applications.tsx:TenantApplications;
      lib/authz/backend-aliases.ts:BACKEND_ALIASES
    origin: >-
      services-platform:docs/proposals/application-access-and-entitlements.md#6.4 Console
      integration, item 6 (built and accepted by Andrew 2026-10-15)
  - id: BR-CAP-PFM-CSH-017-02
    statement: >-
      The overview displays the returned applications with available entries first and name ordering
      within each group.
    kind: calculation
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: >-
      react-console:lib/applications/availability.test.ts#lists the available applications first,
      then by name
    origin: none
  - id: BR-CAP-PFM-CSH-017-03
    statement: >-
      Availability badges and explanations use readable wording, converting recognized service
      reason codes rather than displaying those codes.
    kind: calculation
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: >-
      react-console:lib/applications/availability.test.ts#turns Platform's reason code into English
      and never shows the code
    origin: >-
      services-platform:docs/proposals/application-access-and-entitlements.md#6.4 Console
      integration, item 6 (built and accepted by Andrew 2026-10-15)
  - id: BR-CAP-PFM-CSH-017-04
    statement: >-
      An ordinary working application needs no explanation, while an ending licence is described
      without changing its Available badge.
    kind: calculation
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: >-
      react-console:lib/applications/availability.test.ts#tells somebody a licence is ending without
      calling the application unavailable
    origin: none
  - id: BR-CAP-PFM-CSH-017-05
    statement: Licence dates are presented as the supplied calendar day across reader time zones.
    kind: calculation
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: >-
      react-console:lib/applications/availability.test.ts#reads a licence date as the day Platform
      sent it, in a zone behind UTC
    origin: none
  - id: BR-CAP-PFM-CSH-017-06
    statement: Open Configuration appears only for an available application with a configuration destination.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:components/configuration/applications/applications-page.tsx:ApplicationRow'
    origin: none
  - id: BR-CAP-PFM-CSH-017-07
    statement: The overview identifies itself as read-only and says Rhythm controls application changes.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:components/configuration/applications/applications-page.tsx:ApplicationsPage'
    origin: none
  - id: BR-CAP-PFM-CSH-017-08
    statement: >-
      The body displays loading, retry after a failed initial read, and a contact-Rhythm empty state
      for no applications.
    kind: lifecycle
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: 'react-console:components/configuration/applications/applications-page.tsx:ApplicationsBody'
    origin: none
  - id: BR-CAP-PFM-CSH-017-09
    statement: >-
      Parsing drops entries without a readable key and maps unknown licence and operational states
      to unlicensed and not set up.
    kind: validation
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: >-
      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
    origin: none
  - id: BR-CAP-PFM-CSH-017-10
    statement: >-
      All Applications is the first Configuration application link when the person holds its view
      permission.
    kind: permission
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: 'react-console:components/console/nav-config.ts:configurationArea'
    origin: none
  - id: BR-CAP-PFM-CSH-017-11
    statement: >-
      Parsing defaults availability to true for any value other than exactly false, including a
      missing flag and unreadable companion states.
    kind: calculation
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: 'react-console:lib/applications/types.ts:parseTenantApplication'
    origin: none
  - id: BR-CAP-PFM-CSH-017-12
    statement: >-
      The administrator list checks workspace reach itself, returns not found outside that reach and
      can answer for a disabled workspace within reach.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: observed
    source: >-
      services-platform:modules/tenants/aws/api/tenant-applications.routes.ts:tenantApplicationsRoutes
    origin: none
  - id: BR-CAP-PFM-CSH-017-13
    statement: >-
      The administrator answer includes application identity, licence dates, operational state and
      availability, collapses licence state to licensed or unlicensed, translates withholding to
      unlicensed and omits overrides, staff identities and operational reasons.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-platform:modules/licensing/aws/api/licensing-api-mapper.ts:toTenantApplications,
      tenantLicenceStateOf, tenantReasonOf
    origin: none
  - id: BR-CAP-PFM-CSH-017-14
    statement: >-
      The administrator application API serves a permitted console caller, refuses a caller lacking
      its read key as forbidden and refuses an anonymous caller as unauthenticated.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#serves an administrator of
      the customer holding platform.tenant-applications.read;
      modules/licensing/tests/e2e/licensing.e2e.spec.js#refuses a console user who does not hold
      that key, with 403; modules/licensing/tests/e2e/licensing.e2e.spec.js#refuses an anonymous
      caller with 401
    origin: none
scenarios:
  - id: SC-CAP-PFM-CSH-017-01
    given: An application is available and its licence has a finite end day.
    when: The administrator reads the overview.
    then: The entry remains Available and explains its ending date.
    provenance: test
    source: >-
      react-console:lib/applications/availability.test.ts#tells somebody a licence is ending without
      calling the application unavailable
  - id: SC-CAP-PFM-CSH-017-02
    given: The initial workspace applications request fails.
    when: The overview renders the result.
    then: The failure state offers a retry.
    provenance: observed
    source: 'react-console:components/configuration/applications/applications-page.tsx:ApplicationsBody'
edge_cases: []
constraints: []
depends_on: []
related:
  - CAP-PFM-CSH-015
  - CAP-PFM-CSH-007
journeys:
  - JNY-PFM-CSH-005
open_questions:
  - OQ-PFM-CSH-002
evidence:
  - >-
    react-console at baf6dae: app/(console)/console/[tenantId]/configuration/page.tsx,
    components/configuration/applications/{tenant-applications,applications-page}.tsx,
    lib/applications/{api,availability,availability.test,types}.ts, lib/authz/backend-aliases.ts
    (configuration.applications.view), e2e/mock/application-access.mock.spec.ts,
    e2e/dev/hq-licensing.dev.spec.ts.
  - >-
    services-platform at ad3f6a6: modules/tenants/aws/api/tenant-applications.routes.ts
    (listTenantApplicationsForTenant), modules/licensing/aws/api/licensing-api-mapper.ts
    (toTenantApplications),
    modules/licensing/services/persistence/{applications,tenant-applications}.ts,
    modules/licensing/db/{applications,tenant-applications,licence-windows,licence-overrides}.table.ts
    (read through the availability answer; MOD-PFM-OPS),
    modules/licensing/tests/e2e/licensing.e2e.spec.js,
    docs/proposals/application-access-and-entitlements.md §6.4 and §7.2.
controls: [TC-AVL-001, TC-AVL-004, TC-AVL-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-DAT-001, TC-DAT-003, TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-LOG-004, TC-LOG-005, TC-MON-001, TC-PI-001, TC-PI-002, TC-PI-004, 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]
---
# Understand the workspace’s application availability

## Purpose

Administrators inspect a read-only overview of which applications the workspace can use.

## How It Works

An administrator opens the Applications overview from Configuration or a blocked page. The overview reads the workspace’s availability answer from Platform. It uses plain labels and explanations without exposing the staff licensing record. Available entries may lead to their configuration area. Loading, empty and failure states keep the overview usable when no list is ready. The product should make incomplete availability answers fail closed and prove that behavior before relying on the overview.

## Relationships

- Operations owns the availability calculation and licensing records.
- The workspace applications route enforces the administrator’s read authority.
- Application unavailability links here for further explanation.
