Skip to content

CAP-PFM-OPS-014Resolve a workspace’s application availability

Markdown

CAP-PFM-OPS-014

Resolve a workspace’s application availability

Markdown
  • DocumentDraft
  • Product intentConfirmed
  • ImplementationObserved

KindCapabilityProduct areaPlatformModuleOperational RecordsRevision1

Read atservices-platform ad3f6a65

The Formal Contract

The narrative above explains; the sections below are authoritative — the rules, scenarios and tests this document binds.

Outcomes
Application lists and authorization have a shared commercial and operational basis.Always-available exceptions and ordinary readiness checks remain explicit.
Surfaces
api
Postconditions
Availability is resolved for the execution’s day and instant without storing a separate verdict.
Constraints
The pure availability resolver and the authorization query are separate implementations that must agree.
Intent sources
services-platform:docs/proposals/application-access-and-entitlements.md#Status (built and accepted, 2026-10-15)services-platform:docs/proposals/application-access-and-entitlements.md#10.1 (D3, D10, D11)services-platform:docs/licensing.md#2. What this does NOT do (Andrew, 2026-10-13: "enforce everywhere")

Controls

23 controls apply, from the corpus control catalogue.

TC-AVL-001 TC-AZ-001 TC-AZ-002 TC-AZ-003 TC-AZ-004 TC-DAT-001 TC-DAT-003 TC-DAT-004 TC-LOG-001 TC-LOG-004 TC-LOG-005 TC-MON-001 TC-PI-001 TC-PI-003 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

Business Rules

10 rules, 7 to be proved before approval. A rule's product intent is derived from its origin: 10 confirmed by a product decision, the rest inheriting this capability's confirmed.

IdRuleKindEnforced atProvenance
01must prove
Confirmed
Workspace availability includes always-available applications and licensed applications whose operational state is enabled.
calculationservice, databasetest
services-platform:modules/licensing/tests/unit/availability/application-availability.spec.ts#answers the available ones, and only those, from the same resolution
02must prove
Confirmed
Licence source resolution checks withhold, always-available status, current contract, grace contract, grant and expired contract in that order, regardless of decision recency.
calculationservice, databaseobserved
03must prove
Confirmed
Contract terms include their last calendar day, remain licensed throughout grace and become expired afterwards, while future terms provide no current licence.
calculationservicetest
services-platform:modules/licensing/tests/unit/availability/application-availability.spec.ts#answers expired the day after the grace ends, which is when a licence really runs out
04must prove
Confirmed
A current term outranks grace or expired terms, and a grant can supply access after all contract coverage and grace have ended.
calculationservicetest
services-platform:modules/licensing/tests/unit/availability/application-availability.spec.ts#falls back to a grant override once the contract has expired, which is a goodwill extension
05must prove
Confirmed
Platform and Contacts & Organizations bypass operational readiness but remain subject to explicit withholds, while Rhythm HQ is available by rule outside workspace application records.
origin: services-platform:docs/proposals/application-access-and-entitlements.md#10.1 Decided by Andrew on 2026-10-11 (D10, D11, 2026-10-12)
policyservicetest
services-platform:modules/licensing/tests/unit/availability/application-availability.spec.ts#lets a withhold beat always_available, which is the only way to take one of those away
06must prove
Confirmed
An unavailable application reports one commercial or operational refusal reason, covering absent licence, withhold, expiry, missing setup, setup in progress, failed setup or suspension.
calculationservicetest
services-platform:modules/licensing/tests/unit/availability/application-availability.spec.ts#gives each unavailable one the reason its own half of the rule refused by
07
Confirmed
A workspace without a HubSpot company resolves licensing solely from overrides and always-available status.
calculationservicetest
services-platform:modules/licensing/tests/unit/availability/application-availability.spec.ts#answers the same for a tenant with no licence windows as for one whose windows were not asked for
08
Confirmed
The availability decision supplies authorization and application-list inputs in every environment, so unlicensed application requests are refused before the handler executes.
origin: services-platform:docs/licensing.md#2. What this does NOT do (Andrew, 2026-10-13)
policyservicedocumented
services-platform:docs/licensing.md#9. How a licence reaches the permission check
09must prove
Confirmed
The catalog retains the retired commercial application key while product mappings grant Accounting & Billing under its replacement key.
origin: services-platform:docs/licensing.md#1. The rule (Andrew, 2026-10-13: accounting is the key, collect retired)
lifecycleservice, databasetest
services-platform:modules/licensing/tests/unit/catalog/product-grants.spec.ts#grant `accounting` and never the retired `collect`, which is the rename of 2026-10-13
10
Confirmed
Websites and Marketing have no mapped commercial product grants, so their production licensing currently depends on explicit overrides.
origin: services-platform:docs/licensing.md#1. The rule (Andrew, 2026-10-20: Marketing key, no product yet)
policyservicedocumented

Scenarios

IdGivenWhenThenProvenance
01An enabled application’s contract ended four days earlier.Availability is resolved for the workspace day.The application remains in grace; a date beyond grace produces expiry.inferred
services-platform:modules/licensing/tests/unit/availability/application-availability.spec.ts#answers in_grace the day after the window ends, which is still available (D3)
02An always-available application has failed preparation.Availability is resolved.The failure state remains reported without making the application unavailable.inferred
services-platform:modules/licensing/tests/unit/availability/application-availability.spec.ts#is available while its own provisioning is still failed, and reports that state all the same

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.