---
id: CAP-PFM-OPS-013
title: Explain workspace licensing to Rhythm staff
feature: FEAT-PFM-OPS-03
product_area: platform
module: operations
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: inconsistent
supersedes: []
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - >-
    services-platform:docs/proposals/application-access-and-entitlements.md#Status (HQ licensing panel
    accepted by Andrew, 2026-10-15)
purpose: Give Rhythm staff enough licensing context to investigate and explain application access.
outcomes:
  - Staff can inspect the decisions behind workspace application availability.
  - Management controls depend on separate staff authority.
concepts:
  - CON-PFM-OPS-003
actors:
  - ACT-PFM-005
  - ACT-PFM-004
surfaces:
  - console
  - api
preconditions:
  - The staff caller holds HQ licensing-read authority.
postconditions:
  - Licensing inspection does not alter the decision or operational records.
permissions:
  - key: hq.licensing.read
    where_checked: api
    scope: global
  - key: hq.licensing.manage
    where_checked: console
    scope: global
rules:
  - id: BR-CAP-PFM-OPS-013-01
    proved_by: [ATS-PFM-OPS-013-01, ATS-PFM-OPS-013-08, ATS-PFM-OPS-013-09, TST-PFM-OPS-081]
    statement: >-
      HQ licensing readership exposes each application’s commercial, operational and availability states with
      current and historical override reasons and authors, while unauthorized staff and customer callers are
      refused.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#answers the overrides behind the
      decision, with the reason and the author of each
    origin: none
  - id: BR-CAP-PFM-OPS-013-02
    proved_by: [ATS-PFM-OPS-011-12, ATS-PFM-OPS-013-02, ATS-PFM-OPS-013-07, TST-PFM-OPS-081]
    statement: Revoked overrides remain in the staff licensing response as part of the decision history.
    kind: policy
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#keeps a revoked override in the
      answer, because the trail is what the screen is for
    origin: none
  - id: BR-CAP-PFM-OPS-013-03
    proved_by: [ATS-PFM-OPS-013-03, ATS-PFM-OPS-016-04, TST-PFM-OPS-081]
    statement: >-
      The staff response distinguishes withheld access from missing licensing and contract-derived licences
      from override-derived licences.
    kind: policy
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/licensing/tests/e2e/licensing.e2e.spec.js#tells staff the same application was
      withheld, which is the distinction the two answers keep
    origin: none
  - id: BR-CAP-PFM-OPS-013-04
    proved_by: [ATS-PFM-OPS-013-04]
    statement: >-
      The HQ panel resolves author names, collapses historical overrides and limits licensing actions to staff
      with management authority.
    kind: permission
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: >-
      react-console:e2e/dev/hq-licensing.dev.spec.ts#the panel lists the Fictional Association's applications,
      names every author and folds the past overrides away
    origin: none
  - id: BR-CAP-PFM-OPS-013-05
    proved_by: [ATS-PFM-OPS-013-05, TST-PFM-OPS-053]
    statement: >-
      Panel actions require a reason of at least twenty characters, and a grant for a customer workspace also
      requires an end date.
    kind: validation
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: 'react-console:e2e/mock/application-access.mock.spec.ts#asks for a reason long enough to be one'
    origin: none
  - id: BR-CAP-PFM-OPS-013-06
    proved_by: []
    statement: >-
      The revoke dialog collects a reason that the backend route neither accepts nor retains, leaving the
      original override reason in history.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: >-
      react-console:components/console/hq/tenant-licensing-card.tsx (Reason for Revoking);
      services-platform:modules/licensing/aws/api/licensing.routes.ts:revokeTenantLicenceOverride (no body)
    origin: none
  - id: BR-CAP-PFM-OPS-013-07
    proved_by: [ATS-PFM-OPS-013-06]
    statement: >-
      The product should restore the failed-application retry action; its console address differs from the
      served route and therefore cannot invoke that operation.
    kind: policy
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: >-
      react-console:lib/hq/licensing.ts:licensingPaths.application ("retry-provisioning");
      services-platform:modules/licensing/aws/api/licensing.routes.ts:retryTenantApplicationProvisioning
      ("retry_provisioning")
    origin: none
  - id: BR-CAP-PFM-OPS-013-08
    proved_by: []
    statement: Company contract and sync-health reads exist for staff but have no corresponding HQ interface.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: 'react-console:lib/hq/licensing.ts (no company or sync health read)'
    origin: none
scenarios:
  - id: SC-CAP-PFM-OPS-013-01
    given: The workspace has current and historical override records.
    when: A Rhythm administrator opens its licensing panel.
    then: 'Applications use readable states and author names, with past decisions collapsed.'
    provenance: inferred
    source: >-
      react-console:e2e/dev/hq-licensing.dev.spec.ts#the panel lists the Fictional Association's applications,
      names every author and folds the past overrides away
    note: >-
      This illustrative example combines behavior established by the cited test and the capability’s
      implementation evidence; it is not an independently bound end-to-end proof.
  - id: SC-CAP-PFM-OPS-013-02
    given: An HQ staff reader lacks licensing-management authority.
    when: The reader inspects the workspace licensing panel.
    then: The information remains readable without management actions.
    provenance: observed
    source: 'react-console:components/console/hq/tenant-licensing-card.tsx:ApplicationRow (canManage)'
edge_cases: []
constraints:
  - The licensing section appears within the workspace’s HQ page owned by security.
depends_on:
  - CAP-PFM-OPS-014
related:
  - CAP-PFM-OPS-011
  - CAP-PFM-OPS-012
  - CAP-PFM-OPS-015
journeys:
  - JNY-PFM-OPS-004
open_questions: []
evidence:
  - >-
    services-platform at ad3f6a6: modules/licensing/aws/api/licensing.routes.ts:getTenantLicensing,
    licensing-api-mapper.ts:toStaffLicensing; licensing e2e ("what Rhythm's own people see");
    docs/licensing.md §4.
  - >-
    react-console at baf6dae: components/console/hq/tenant-licensing-card.tsx, tenant-licensing-section.tsx,
    licensing-dialogs.tsx, lib/hq/licensing.ts, licensing-types.ts, use-hq-licensing.ts, permissions.ts;
    e2e/dev/hq-licensing.dev.spec.ts, e2e/mock/application-access.mock.spec.ts (Rhythm HQ licensing).
  - 'Operations this capability covers: getTenantLicensing. Permission keys: hq.licensing.read.'
  - >-
    Examination: proposed acceptance matrices retain candidate test references; incomplete proof is recorded
    by FND-PFM-OPS-028.
controls: [TC-AVL-001, TC-AVL-004, 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-IAM-003, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-MON-001, TC-PI-001, TC-PI-002, TC-PI-004, TC-PI-005, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-VEN-001, TC-VEN-002, TC-VEN-003]
exercised_by: [FAS-PFM-OPS-03-01, FAS-PFM-OPS-03-02, FAS-PFM-OPS-03-03, FAS-PFM-OPS-03-04, FAS-PFM-OPS-03-05]
suites: [TST-PFM-OPS-053, TST-PFM-OPS-081]
---

# Explain workspace licensing to Rhythm staff

## Purpose

Give Rhythm staff enough licensing context to investigate and explain application access.

## How It Works

Rhythm staff inspect Licensing & Applications on the workspace’s HQ page. Readers can see the states and decisions behind access, including historical overrides. The panel resolves authors into names and folds past decisions out of the initial view. Managers receive actions for commercial decisions and operational changes. Dialogs require a substantive explanation before submission. The revoke dialog asks for an explanation the receiving route does not store. Failed application setup also has a retry action, but its address does not match the served route. Company contract inspection and sync health remain API-only, leaving staff without a complete HQ commercial-monitoring surface.

## Relationships

Licence decisions feed availability alongside operational state; security applies the resulting access decision and the console explains it.
