---
id: ATS-PFM-LLM-018
scope: CAP-PFM-LLM-018
product_area: platform
module: llm
revision: 2
status: proposed
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-PFM-LLM-018-01
    title: Customer refusal vocabulary preserves next steps
    level: unit
    proves:
      - BR-CAP-PFM-LLM-018-01
      - BR-CAP-PFM-LLM-018-02
      - BR-CAP-PFM-LLM-018-03
      - BR-CAP-PFM-LLM-018-04
    preconditions: Supported customer refusals and operator-only faults are represented.
    steps: Obtain each customer sentence.
    expected: >-
      Supported cases receive their defined retry, support or renewal guidance, and operator faults have no
      dedicated sentence.
    negative: false
    data_needs: Fixtures representing supported customer refusals and operator-only faults are represented.
    bound_to:
      - TST-PFM-LLM-085
    provenance: test
    source: >-
      services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#tells an organization
      that has used its allowance when it resumes
    category: rule
    test_sources:
      - >-
        services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#tells an organization
        that has used its allowance when it resumes
      - >-
        services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#asks an organization
        with too many requests running to try again in a few seconds
      - >-
        services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#tells an organization
        with a feature turned off to ask Rhythm support
      - >-
        services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#says the AI service is
        temporarily unavailable for an unavailable provider
      - >-
        services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#says the same for an
        open circuit, because the organization cannot tell them apart
  - id: ATS-PFM-LLM-018-02
    title: Vocabulary keeps internal terminology out of customer copy
    level: unit
    proves:
      - BR-CAP-PFM-LLM-018-06
    preconditions: All generated customer sentences are available.
    steps: Scan the sentences for prohibited internal words.
    expected: 'Only organization-facing terminology remains, without money, model, provider or override detail.'
    negative: false
    data_needs: Fixtures representing all generated customer sentences are available.
    bound_to:
      - TST-PFM-LLM-085
    provenance: test
    source: >-
      services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#is declared for a
      population of sentences, so the rule below is not vacuous
    category: invariant
    test_sources:
      - >-
        services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#is declared for a
        population of sentences, so the rule below is not vacuous
      - >-
        services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#names a tenant, money,
        a model, a provider or an override in none of them
  - id: ATS-PFM-LLM-018-03
    title: Pause notice and customer helper share wording
    level: browser
    proves:
      - BR-CAP-PFM-LLM-018-08
    preconditions: The same exhausted allowance supplies notice and console-helper content.
    steps: Generate both messages.
    expected: The pause explanation matches apart from the organization name versus direct address.
    negative: true
    data_needs: Fixtures representing the same exhausted allowance supplies notice and console-helper content.
    bound_to: []
    provenance: proposed
    source: 'react-console:lib/api/generate-query.ts:allowanceMessage'
    category: interaction
    test_sources: []
evidence:
  - >-
    services-platform at ad3f6a6582843008ed0f5a17b131878d15829af1: bound or cited
    modules/llm/tests/unit/services/usage/usage-sentences.spec.ts.
  - >-
    react-console at baf6dae382d6f41dce976c7f848667ccc37e076f: bound or cited
    lib/api/generate-query.ts:allowanceMessage.
coverage:
  rule: 'gap: FND-PFM-LLM-077'
  transition: not-applicable
  validation: 'gap: FND-PFM-LLM-077'
  permission: not-applicable
  edge: 'gap: FND-PFM-LLM-077'
  failure: 'gap: FND-PFM-LLM-077'
  boundary: 'gap: FND-PFM-LLM-077'
  concurrency: 'gap: FND-PFM-LLM-077'
  invariant: 'gap: FND-PFM-LLM-077'
  interaction: covered
coverage_notes:
  transition: This capability defines read-only presentation or validation and introduces no owned lifecycle transition.
  permission: >-
    This capability declares no permission key; caller authorization belongs to its consuming operation or a
    related capability.
  interaction: >-
    The related interaction register cites a concrete experiment for every dependency and related capability,
    including cross-capability workflow seams.
  invariant: >-
    The domain-invariant register maps each relevant invariant to a scenario or to the capability coverage
    finding; an example does not establish every invariant.
  rule: >-
    All must-prove rules have scenario references, but the coverage finding retains untested clauses and
    combined outcomes; scenario presence alone is not exhaustive rule proof.
related_interactions:
  - with: CAP-PFM-LLM-001
    scenarios:
      - ATS-PFM-LLM-001-18
    source: 'services-platform:modules/llm/services/catalog/catalog-authority.ts:resolveLlmOperation'
  - with: CAP-PFM-LLM-008
    scenarios:
      - ATS-PFM-LLM-008-13
    source: 'services-platform:modules/llm/services/persistence/allowance-periods.ts'
  - with: CAP-PFM-LLM-017
    scenarios:
      - ATS-PFM-LLM-017-11
    source: >-
      services-platform:modules/llm/tests/e2e/llm-adjustments-and-organization.e2e.spec.js#is refused to
      Rhythm staff holding every HQ key, because the routes are console
state_models: []
coverage_obligations:
  must_prove:
    - rule: BR-CAP-PFM-LLM-018-01
      scenarios:
        - ATS-PFM-LLM-018-01
      source: >-
        services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#tells an organization
        that has used its allowance when it resumes
      coverage: specified
    - rule: BR-CAP-PFM-LLM-018-02
      scenarios:
        - ATS-PFM-LLM-018-01
      source: >-
        services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#asks an organization
        with too many requests running to try again in a few seconds
      coverage: specified
    - rule: BR-CAP-PFM-LLM-018-03
      scenarios:
        - ATS-PFM-LLM-018-01
      source: >-
        services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#tells an organization
        with a feature turned off to ask Rhythm support
      coverage: specified
    - rule: BR-CAP-PFM-LLM-018-04
      scenarios:
        - ATS-PFM-LLM-018-01
      source: >-
        services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#says the same for an
        open circuit, because the organization cannot tell them apart
      coverage: partial
      gap: FND-PFM-LLM-077
    - rule: BR-CAP-PFM-LLM-018-06
      scenarios:
        - ATS-PFM-LLM-018-02
      source: >-
        services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#names a tenant, money,
        a model, a provider or an override in none of them
      coverage: specified
    - rule: BR-CAP-PFM-LLM-018-08
      scenarios:
        - ATS-PFM-LLM-018-03
      source: 'react-console:lib/api/generate-query.ts:allowanceMessage'
      coverage: partial
      gap: FND-PFM-LLM-077
  state_transitions: []
  domain_invariants:
    - invariant: INV-DOM-PFM-LLM-004-06
      scenarios: []
      gap: FND-PFM-LLM-077
      provenance: proposed
      source: 'services-platform:modules/llm/aws/api/llm-usage-api-mapper.ts:toOrganizationSummaryResponse'
coverage_limits:
  finding: FND-PFM-LLM-077
  statement: >-
    Customer wording at missing reset dates, internal server classifications and full notice-to-console
    agreement need complete interaction proof beyond individual sentence helpers.
  provenance: proposed
  source:
    - >-
      services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#tells an organization
      that has used its allowance when it resumes
    - >-
      services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#asks an organization
      with too many requests running to try again in a few seconds
    - >-
      services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#tells an organization
      with a feature turned off to ask Rhythm support
    - >-
      services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#says the same for an
      open circuit, because the organization cannot tell them apart
    - >-
      services-platform:modules/llm/tests/unit/services/usage/usage-sentences.spec.ts#names a tenant, money, a
      model, a provider or an override in none of them
    - 'react-console:lib/api/generate-query.ts:allowanceMessage'
    - 'services-platform:modules/llm/aws/api/llm-usage-api-mapper.ts:toOrganizationSummaryResponse'
  invariants_without_scenarios:
    - INV-DOM-PFM-LLM-004-06
---

# Give people understandable AI refusal messages: Capability Test Specification

## Coverage

| Rule | Scenario |
|---|---|
| `BR-CAP-PFM-LLM-018-01` | `ATS-PFM-LLM-018-01` |
| `BR-CAP-PFM-LLM-018-02` | `ATS-PFM-LLM-018-01` |
| `BR-CAP-PFM-LLM-018-03` | `ATS-PFM-LLM-018-01` |
| `BR-CAP-PFM-LLM-018-04` | `ATS-PFM-LLM-018-01` |
| `BR-CAP-PFM-LLM-018-06` | `ATS-PFM-LLM-018-02` |
| `BR-CAP-PFM-LLM-018-08` | `ATS-PFM-LLM-018-03` |

## Interactions With Related Capabilities

The interaction register links concrete experiments with run ai requests with consistent attribution and accounting; notify administrators at allowance thresholds; show administrators their organization’s ai allowance. Each experiment checks the outcome at the shared boundary; an unbound experiment remains proposed.

Customer wording at missing reset dates, internal server classifications and full notice-to-console agreement need complete interaction proof beyond individual sentence helpers.
