---
id: ATS-PFM-NOT-004
scope: CAP-PFM-NOT-004
product_area: platform
module: notifications
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-PFM-NOT-004-01
    title: Apply locale fallback and time-zone formatting
    level: unit
    proves:
      - BR-CAP-PFM-NOT-004-01
    preconditions: >-
      Prepare a definition with English and French templates; two people in
      different zones.
    steps: 'Render for Canadian French and German, using both recipient time zones.'
    expected: >-
      The regional French locale uses French, undeclared German uses English,
      and identical instants display according to each zone.
    negative: false
    data_needs: Use only records created and owned by this suite.
    bound_to:
      - >-
        services-platform:modules/notifications/tests/unit/render-message.spec.js#renders
        an instant in the recipient’s zone, not the server’s
      - >-
        services-platform:modules/notifications/tests/unit/render-message.spec.js#renders
        the same instant differently for a person in another zone
      - >-
        services-platform:modules/notifications/tests/unit/render-message.spec.js#uses
        the recipient’s locale when the definition declares it
      - >-
        services-platform:modules/notifications/tests/unit/render-message.spec.js#falls
        back from a regional locale to its language
      - >-
        services-platform:modules/notifications/tests/unit/render-message.spec.js#falls
        back to English for a locale the definition does not declare
      - >-
        services-platform:modules/notifications/tests/integration/services/orchestration/orchestrate-request.integration.spec.js#writes
        one instance for the person, rendered in their words, about nothing
      - TST-PFM-NOT-079
      - TST-PFM-NOT-113
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/unit/render-message.spec.js#renders
      an instant in the recipient’s zone, not the server’s
    category: rule
    binding_scope: >-
      Each binding supplies its own assertions; the aggregate references do not
      imply that one executable file proves every step.
  - id: ATS-PFM-NOT-004-02
    title: Truncate oversized console content
    level: unit
    proves:
      - BR-CAP-PFM-NOT-004-03
    preconditions: >-
      Provide rendering inputs producing a title of two hundred characters and a
      body of three thousand.
    steps: Generate the recipient content.
    expected: 'A notice is created with a 140-character title and 2,000-character body.'
    negative: false
    data_needs: Use only records created and owned by this suite.
    bound_to:
      - >-
        services-platform:modules/notifications/tests/unit/render-message.spec.js#cuts
        a title longer than 140 characters rather than refusing the notification
      - >-
        services-platform:modules/notifications/tests/unit/render-message.spec.js#cuts
        a body longer than 2,000 characters
      - TST-PFM-NOT-113
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/unit/render-message.spec.js#cuts
      a title longer than 140 characters rather than refusing the notification
    category: boundary
    binding_scope: >-
      Each binding supplies its own assertions; the aggregate references do not
      imply that one executable file proves every step.
  - id: ATS-PFM-NOT-004-03
    title: Build destinations for the notice workspace
    level: browser
    proves:
      - BR-CAP-PFM-NOT-004-04
    preconditions: >-
      Prepare a definition opening My Responsibilities; a request in a workspace
      and one in no workspace.
    steps: Generate both destination forms and follow the console action.
    expected: >-
      Console content retains the workspace-relative route; configured external
      channels receive an absolute link; the HQ route survives. Opening reaches
      My Responsibilities in the notice workspace.
    negative: false
    data_needs: Use only records created and owned by this suite.
    bound_to:
      - >-
        services-platform:modules/notifications/tests/unit/render-message.spec.js#gives
        the in-app record the tenant-relative path, and every other channel the
        absolute link under the workspace
      - >-
        services-platform:modules/notifications/tests/unit/render-message.spec.js#keeps
        an HQ route as it is when the request is in no tenant
      - >-
        services-platform:modules/notifications/tests/unit/render-message.spec.js#builds
        no destination when a parameter is missing
      - >-
        react-console:components/notifications/__tests__/destination.test.ts#binds
        /me/responsibilities to the workspace of the notice
      - >-
        react-console:acceptance/notifications/playwright/journeys/inbox/NT-ACC-0001.spec.ts#NT-ACC-0001
      - TST-PFM-NOT-005
      - TST-PFM-NOT-020
      - TST-PFM-NOT-113
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/unit/render-message.spec.js#gives
      the in-app record the tenant-relative path, and every other channel the
      absolute link under the workspace
    category: interaction
    binding_scope: >-
      Each binding supplies its own assertions; the aggregate references do not
      imply that one executable file proves every step.
  - id: ATS-PFM-NOT-004-04
    title: Redact retained link values
    level: api
    proves:
      - BR-CAP-PFM-NOT-004-05
    preconditions: Prepare a definition with a link field.
    steps: >-
      Submit link-bearing request data and retrieve its retained representation
      after processing.
    expected: >-
      The rendered destination remains usable while the stored request field
      contains a redaction marker.
    negative: false
    data_needs: Use only records created and owned by this suite.
    bound_to:
      - >-
        services-platform:modules/notifications/tests/integration/services/orchestration/orchestrate-request.integration.spec.js#redacts
        a url field of the data from the request after it was rendered
      - >-
        services-platform:modules/notifications/tests/unit/render-message.spec.js#replaces
        each with the marker and leaves the rest
      - TST-PFM-NOT-079
      - TST-PFM-NOT-113
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/integration/services/orchestration/orchestrate-request.integration.spec.js#redacts
      a url field of the data from the request after it was rendered
    category: invariant
    binding_scope: >-
      Each binding supplies its own assertions; the aggregate references do not
      imply that one executable file proves every step.
  - id: ATS-PFM-NOT-004-05
    title: Rendered destinations remain usable across channel and inbox views
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-NOT-004-04
    exercises:
      - CAP-PFM-NOT-004
      - CAP-PFM-NOT-009
      - CAP-PFM-NOT-007
    preconditions: >-
      Use localized recipients, a declared destination link and supported
      console and e-mail channels.
    steps: >-
      Process the occurrence, inspect retained data and deliveries, then open
      its destination from the recipient inbox.
    expected: >-
      The inbox opens the destination in the notice workspace; retained link
      data is redacted, and the skipped e-mail channel remains explainable.
    negative: false
    data_needs: >-
      A suite-owned workspace, named staff accounts and unique occurrence keys;
      external adapters record attempts without shared writes.
    bound_to: []
    provenance: proposed
    source:
      - >-
        rhythm-v2-docs:specs/platform/notifications/planning/capabilities/CAP-PFM-NOT-004-word-each-notice-for-the-person-who-receives-it.md#frontmatter
      - >-
        rhythm-v2-docs:specs/platform/notifications/planning/capabilities/CAP-PFM-NOT-009-work-through-my-own-notifications.md#frontmatter
      - >-
        rhythm-v2-docs:specs/platform/notifications/planning/capabilities/CAP-PFM-NOT-007-deliver-each-notice-on-the-channels-it-may-use.md#frontmatter
    interaction_with:
      - CAP-PFM-NOT-009
      - CAP-PFM-NOT-007
evidence:
  - >-
    Pinned evidence inventory 1:
    services-platform:modules/notifications/tests/unit/render-message.spec.js;
    react-console:components/notifications/__tests__/destination.test.ts
  - >-
    Pinned evidence inventory 2:
    services-platform:modules/notifications/tests/integration/services/orchestration/orchestrate-request.integration.spec.js;
    react-console:acceptance/notifications/playwright/journeys/inbox/NT-ACC-0001.spec.ts
coverage:
  rule: covered
  transition: not-applicable
  validation: 'gap: FND-PFM-NOT-065'
  permission: not-applicable
  edge: 'gap: FND-PFM-NOT-065'
  failure: 'gap: FND-PFM-NOT-065'
  boundary: covered
  concurrency: 'gap: FND-PFM-NOT-065'
  invariant: covered
  interaction: covered
coverage_notes:
  permission: >-
    This capability declares no independent access key; callers enter through
    the producing or reading capability.
  transition: >-
    This capability computes or reads an outcome and owns no lifecycle
    transition; state changes are tested in the owning capability.
  validation: Malformed input is not isolated in a dedicated category scenario.
  edge: Exceptional but valid input needs a dedicated expected-outcome case.
  failure: The suite lacks an isolated dependency failure and recovery case.
  concurrency: >-
    The suite lacks a complete race case with controlled interleaving and
    post-race assertions.
findings:
  - FND-PFM-NOT-065
transition_coverage: []
workflow_coverage:
  - workflow: WF-PFM-NOT-003
    capabilities:
      - CAP-PFM-NOT-003
      - CAP-PFM-NOT-004
      - CAP-PFM-NOT-005
      - CAP-PFM-NOT-006
      - CAP-PFM-NOT-007
      - CAP-PFM-NOT-008
    scenario_candidate: ATS-PFM-NOT-004-05
    coverage: 'gap: FND-PFM-NOT-084'
    reason: >-
      The proposed related-capability sequence does not independently isolate
      every workflow hop, failure seam and interleaving.
domain_invariant_coverage: []
---

# Render recipient-specific notification content: Capability Test Specification

## Coverage

Each scenario names the guarantee it proves. Category coverage describes specified cases; executable bindings retain their narrower assertion boundaries. Lifecycle coverage remains a gap wherever guards and effects lack independent verification.

| Rule | Proof |
|---|---|
| `BR-CAP-PFM-NOT-004-01` | `ATS-PFM-NOT-004-01`, `ATS-PFM-NOT-004-05` |
| `BR-CAP-PFM-NOT-004-03` | `ATS-PFM-NOT-004-02` |
| `BR-CAP-PFM-NOT-004-04` | `ATS-PFM-NOT-004-03` |
| `BR-CAP-PFM-NOT-004-05` | `ATS-PFM-NOT-004-04` |

## Interactions With Related Capabilities

Use localized recipients, a declared destination link and supported console and e-mail channels. Process the occurrence, inspect retained data and deliveries, then open its destination from the recipient inbox.

The interaction case combines the producing, processing and reading outcomes named in its frontmatter. It remains proposed until an executable suite performs that complete sequence.
