---
id: CAP-PFM-NOT-004
title: Render recipient-specific notification content
feature: FEAT-PFM-NOT-02
product_area: platform
module: notifications
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
  - NT-ACC-0001
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - >-
    services-platform:docs/milestones/plans/PLAT-M23-plan.humanized.md#PLAT-M23-S01
purpose: >-
  Recipients receive understandable content and a destination appropriate to
  their workspace and language.
outcomes:
  - Each eligible recipient receives content rendered for that person.
  - >-
    Navigation uses an absolute destination when the console base is configured;
    retained request data conceals declared link values.
concepts:
  - CON-PFM-NOT-003
actors:
  - ACT-PFM-031
  - ACT-PFM-027
surfaces:
  - job
  - console
preconditions: []
postconditions: []
permissions: []
rules:
  - id: BR-CAP-PFM-NOT-004-01
    statement: >-
      Rendering uses each recipient's locale and time zone; an unavailable
      regional locale falls back to its language, and an undeclared language
      falls back to English.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    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
    origin: none
  - id: BR-CAP-PFM-NOT-004-02
    statement: >-
      Template inputs combine request data with Platform-supplied recipient,
      organization, subject-record and destination objects.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/unit/render-message.spec.js#renders
      the platform’s four objects: the person, the organization, the record and
      the destination
    origin: none
  - id: BR-CAP-PFM-NOT-004-03
    statement: >-
      Console rendering truncates titles beyond 140 characters and bodies beyond
      2,000 instead of rejecting delivery.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    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
    origin: none
  - id: BR-CAP-PFM-NOT-004-04
    statement: >-
      Console destinations are workspace-relative and open in the notice's
      workspace; other channels use its console base address when available; HQ
      destinations retain their HQ path, and missing route parameters prevent
      destination construction.
    kind: calculation
    enforced_at:
      - service
      - console
    must_prove: true
    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
    origin: none
  - id: BR-CAP-PFM-NOT-004-05
    statement: >-
      After rendering, retained data replaces declared link values with a
      redaction marker while preserving their fields.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    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
    origin: none
  - id: BR-CAP-PFM-NOT-004-06
    statement: >-
      The resulting notice includes category, severity, subject-record identity
      and label, and occurrence time.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/unit/render-message.spec.js#carries
      the severity, the record and the instant it happened
    origin: none
  - id: BR-CAP-PFM-NOT-004-07
    statement: >-
      The console opens internal workspace routes in the current tab and
      absolute HTTPS destinations in another tab.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: test
    source: >-
      react-console:components/notifications/__tests__/destination.test.ts#keeps
      an absolute https link and opens it in a new tab
    origin: none
  - id: BR-CAP-PFM-NOT-004-08
    statement: >-
      Platform does not resolve resource names for responsibility wording;
      Organization-wide notices name the organization; scoped notices leave
      resource naming to the console.
    kind: policy
    enforced_at:
      - service
      - console
    must_prove: false
    provenance: documented
    source: 'services-platform:docs/notifications.md#9. Producers'
    origin: none
    note: >-
      External channel wording lacks the resource label; the findings retain the
      unresolved scope-naming decision.
scenarios:
  - id: SC-CAP-PFM-NOT-004-01
    given: Jane's Northeast assignment uses English locale and Eastern time.
    when: Platform renders her assignment item.
    then: >-
      Recipient content and time formatting follow her settings, and its action
      reaches My Responsibilities in her workspace.
    provenance: inferred
    source: >-
      services-platform:modules/notifications/services/orchestration/render-message.ts:renderNeutralMessage
    note: >-
      Combines renderer locale and time-zone behavior with the assignment
      destination; the browser journey does not assert the locale or time zone.
edge_cases: []
constraints: []
depends_on:
  - CAP-PFM-NOT-001
  - CAP-PFM-NOT-003
related:
  - CAP-PFM-NOT-009
  - CAP-PFM-NOT-007
journeys:
  - JNY-PFM-NOT-001
open_questions:
  - OQ-PFM-NOT-004
evidence:
  - >-
    Pinned evidence inventory 1:
    services-platform:docs/milestones/plans/PLAT-M23-plan.humanized.md;
    services-platform:modules/notifications/tests/integration/services/orchestration/orchestrate-request.integration.spec.js;
    services-platform:docs/notifications.md
  - >-
    Pinned evidence inventory 2:
    services-platform:modules/notifications/tests/unit/render-message.spec.js;
    react-console:components/notifications/__tests__/destination.test.ts;
    services-platform:modules/notifications/services/orchestration/render-message.ts
controls: [TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-PI-001, 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]
---

# Render recipient-specific notification content

## Purpose

Recipients receive understandable content and a destination appropriate to their workspace and language.

## How It Works

Platform loads the registered wording for each recipient. Locale fallback chooses a usable template, and time formatting uses the recipient's time zone. Request data is combined with trusted rendering objects. Destination construction uses the notice workspace rather than a producer-selected console origin. Oversized console content is truncated at rendering limits. Declared links are redacted from retained request values after use. The console opens the rendered destination according to its internal or external form. Resource names require console presentation because Platform does not own those names.

The rule rows define this outcome; the acceptance set identifies existing proof and proposed checks. Implementation evidence alone does not approve the observed details.

## Relationships

Registration supplies the event contract that later work validates and renders.

Recipient selection supplies the eligible people and their audience explanations.
