---
id: ATS-PFM-NOT-011
scope: CAP-PFM-NOT-011
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-011-01
    title: Require notification management for History
    level: api
    proves:
      - BR-CAP-PFM-NOT-011-01
    preconditions: Prepare a administrator and a clerk with only the use permission.
    steps: 'Retrieve History, the requests list and a chain as each.'
    expected: Administrator reads succeed; each equivalent clerk request is denied.
    negative: true
    data_needs: Use only records created and owned by this suite.
    bound_to:
      - >-
        services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#refuses
        History and the chain to a caller with only platform.notifications.use
      - >-
        services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#leaves
        the list to an administrator, not to a caller who only reads their own
      - >-
        services-platform:modules/notifications/tests/unit/permissions.spec.js#puts
        manage at tier admin and sensitive, for the Administrator
      - >-
        react-console:acceptance/notifications/playwright/journeys/history/NT-ACC-0100.spec.ts#NT-ACC-0100
      - TST-PFM-NOT-002
      - TST-PFM-NOT-069
      - TST-PFM-NOT-109
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#refuses
      History and the chain to a caller with only platform.notifications.use
    category: permission
    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-011-02
    title: Filter and page workspace History
    level: api
    proves:
      - BR-CAP-PFM-NOT-011-02
    preconditions: Create several recipients' items spanning two monthly partitions.
    steps: >-
      Retrieve the list of History; narrow by each filter; page across the month
      boundary; send an unrecognized status.
    expected: >-
      Results match the selected filters in descending time order. Paging
      crosses months without lost records, and invalid status input fails.
    negative: false
    data_needs: Use only records created and owned by this suite.
    bound_to:
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#lists
        every person’s notifications newest first with the person and the
        request
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#narrows
        to one person
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#narrows
        to one definition
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#narrows
        to one category and refuses one that does not exist
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#narrows
        to the notifications that have a delivery on a channel
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#narrows
        to one status and refuses one that does not exist
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#walks
        back through the months while the page is not full, newest first
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#pages
        across the month boundary by keyset
      - >-
        services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#lists
        every person’s notifications with the person, and narrows by filters
      - TST-PFM-NOT-069
      - TST-PFM-NOT-073
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#lists
      every person’s notifications newest first with the person and the request
    category: validation
    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-011-03
    title: Include requests that produced no notices
    level: browser
    proves:
      - BR-CAP-PFM-NOT-011-03
    preconditions: >-
      Prepare a request that excluded an outsider, an invalid one of 201 people
      and one that was heard.
    steps: Open History's Requests view; narrow by outcome.
    expected: >-
      All three requests show their outcomes and notice counts; the first
      problem is visible and diagnostic navigation opens.
    negative: false
    data_needs: Use only records created and owned by this suite.
    bound_to:
      - >-
        services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#lists
        a request that dropped a named person, one that was refused as invalid
        and one that was heard, and no other tenant’s
      - >-
        services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#narrows
        by outcome, definition and since, newest first, and pages by keyset
      - >-
        services-platform:modules/notifications/tests/integration/services/persistence/requests.queries.integration.spec.js#maps
        every request with the number of instances it made, none for the ones
        that told nobody
      - >-
        react-console:components/notifications/__tests__/notifications.test.tsx#lists
        the requests that told nobody in the Requests view, with the first
        problem, and opens the chain on one
      - >-
        react-console:acceptance/notifications/playwright/journeys/pipeline/NT-ACC-0202.spec.ts#NT-ACC-0202
      - >-
        react-console:acceptance/notifications/playwright/journeys/pipeline/NT-ACC-0203.spec.ts#NT-ACC-0203
      - TST-PFM-NOT-013
      - TST-PFM-NOT-014
      - TST-PFM-NOT-021
      - TST-PFM-NOT-069
      - TST-PFM-NOT-094
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#lists
      a request that dropped a named person, one that was refused as invalid and
      one that was heard, and no other tenant’s
    category: edge
    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-011-04
    title: 'Read complete request, notice and delivery links'
    level: api
    proves:
      - BR-CAP-PFM-NOT-011-04
    preconditions: Prepare a accepted request with one notice and its deliveries.
    steps: 'Retrieve the request, the notice and a delivery.'
    expected: >-
      Each detail supplies its linked records, with empty collections
      represented as lists.
    negative: false
    data_needs: Use only records created and owned by this suite.
    bound_to:
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#reads
        a request with the notifications it made
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#carries
        the why and the deliveries of each notification on the request, as the
        notification’s own chain does
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#reads
        a delivery with its events, its notification and its request
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#answers
        a request without problems as an empty list, never null
      - >-
        services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#reads
        the request, the notification with its why and the delivery with its
        chain
      - >-
        react-console:components/notifications/__tests__/notifications.test.tsx#opens
        the chain on a request whose problems are null or absent (DEF-NT-0011)
      - TST-PFM-NOT-021
      - TST-PFM-NOT-069
      - TST-PFM-NOT-073
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#reads
      a request with the notifications it made
    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-011-05
    title: Keep administrator reads inside the workspace
    level: api
    proves:
      - BR-CAP-PFM-NOT-011-06
    preconditions: Two workspaces with notices.
    steps: Retrieve History and a chain of the other organization by id.
    expected: >-
      Other-workspace records are absent and direct foreign lookups return not
      found.
    negative: true
    data_needs: Use only records created and owned by this suite.
    bound_to:
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#shows
        nothing of another tenant
      - >-
        services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#finds
        nothing in another tenant or for an id that is nobody’s
      - >-
        services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#finds
        nothing for an id that is nobody’s
      - TST-PFM-NOT-069
      - TST-PFM-NOT-073
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#shows
      nothing of another tenant
    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-011-06
    title: Investigate delivered and recipient-less activity
    level: browser
    proves:
      - AS-JNY-PFM-NOT-003-01
      - AS-JNY-PFM-NOT-003-02
      - AS-JNY-PFM-NOT-003-03
    preconditions: >-
      Create items for Jane and colleagues, an outsider-only request and an
      audience with two hundred and one candidates.
    steps: Exercise the administrator review workflow.
    expected: >-
      History exposes Jane's item, diagnostic chain and unused channels; request
      view includes both submissions that produced no notices.
    negative: false
    data_needs: The journey's own personas and Northeast unit.
    bound_to:
      - >-
        react-console:acceptance/notifications/playwright/journeys/history/NT-ACC-0100.spec.ts#NT-ACC-0100
      - >-
        react-console:acceptance/notifications/playwright/journeys/history/NT-ACC-0101.spec.ts#NT-ACC-0101
      - >-
        react-console:acceptance/notifications/playwright/journeys/pipeline/NT-ACC-0202.spec.ts#NT-ACC-0202
      - >-
        react-console:acceptance/notifications/playwright/journeys/pipeline/NT-ACC-0203.spec.ts#NT-ACC-0203
      - TST-PFM-NOT-002
      - TST-PFM-NOT-003
      - TST-PFM-NOT-013
      - TST-PFM-NOT-014
    provenance: test
    source: >-
      react-console:acceptance/notifications/playwright/journeys/history/NT-ACC-0100.spec.ts#NT-ACC-0100
    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-011-07
    title: Workspace investigation carries the same chain into granted support
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-NOT-011-04
    exercises:
      - CAP-PFM-NOT-011
      - CAP-PFM-NOT-010
      - CAP-PFM-NOT-012
    preconditions: Prepare one accepted request and one request with an empty audience.
    steps: >-
      Inspect both in administrator History and their diagnostic detail, then
      compare HQ History with and without an active workspace grant.
    expected: >-
      The accepted request links its explained notice and deliveries; the empty
      request remains inspectable without notices. Granted HQ lists agree with
      administrator lists and ungranted reads refuse access.
    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-011-see-what-the-organization-told-whom.md#frontmatter
      - >-
        rhythm-v2-docs:specs/platform/notifications/planning/capabilities/CAP-PFM-NOT-010-understand-why-i-was-told.md#frontmatter
      - >-
        rhythm-v2-docs:specs/platform/notifications/planning/capabilities/CAP-PFM-NOT-012-support-a-customers-notifications-from-rhythm-hq.md#frontmatter
    interaction_with:
      - CAP-PFM-NOT-010
      - CAP-PFM-NOT-012
evidence:
  - >-
    Pinned evidence inventory 1:
    services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js;
    react-console:acceptance/notifications/playwright/journeys/history/NT-ACC-0100.spec.ts;
    services-platform:modules/notifications/tests/integration/services/persistence/requests.queries.integration.spec.js;
    react-console:acceptance/notifications/playwright/journeys/pipeline/NT-ACC-0202.spec.ts;
    react-console:acceptance/notifications/playwright/journeys/history/NT-ACC-0101.spec.ts
  - >-
    Pinned evidence inventory 2:
    services-platform:modules/notifications/tests/unit/permissions.spec.js;
    services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js;
    react-console:components/notifications/__tests__/notifications.test.tsx;
    react-console:acceptance/notifications/playwright/journeys/pipeline/NT-ACC-0203.spec.ts
coverage:
  rule: 'gap: FND-PFM-NOT-072'
  transition: not-applicable
  validation: covered
  permission: covered
  edge: covered
  failure: 'gap: FND-PFM-NOT-072'
  boundary: covered
  concurrency: 'gap: FND-PFM-NOT-072'
  invariant: 'gap: FND-PFM-NOT-072'
  interaction: covered
coverage_notes:
  transition: >-
    This capability computes or reads an outcome and owns no lifecycle
    transition; state changes are tested in the owning capability.
  rule: >-
    The specification does not isolate a general positive outcome outside the
    narrower category cases.
  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.
  invariant: >-
    The suite does not isolate every persistent guarantee in a dedicated
    category scenario.
findings:
  - FND-PFM-NOT-072
transition_coverage: []
workflow_coverage: []
domain_invariant_coverage: []
---

# Review workspace notification activity: 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-011-01` | `ATS-PFM-NOT-011-01`, `ATS-PFM-NOT-011-07` |
| `BR-CAP-PFM-NOT-011-02` | `ATS-PFM-NOT-011-02` |
| `BR-CAP-PFM-NOT-011-03` | `ATS-PFM-NOT-011-03` |
| `BR-CAP-PFM-NOT-011-04` | `ATS-PFM-NOT-011-04` |
| `BR-CAP-PFM-NOT-011-06` | `ATS-PFM-NOT-011-05` |
| `BR-CAP-PFM-NOT-011-08` | `FND-PFM-NOT-072` |

## Interactions With Related Capabilities

Prepare one accepted request and one request with an empty audience. Inspect both in administrator History and their diagnostic detail, then compare HQ History with and without an active workspace grant.

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.
