---
id: CAP-PFM-NOT-009
title: Manage a personal notification inbox
feature: FEAT-PFM-NOT-03
product_area: platform
module: notifications
revision: 1
status: draft
product_intent: proposed
implementation_evidence: partially-observed
supersedes:
  - NT-ACC-0001
  - NT-ACC-0002
  - NT-ACC-0003
  - NT-ACC-0006
  - PLAT-M23-S01
  - PLAT-M23-S02
  - PLAT-M23-S03
  - PLAT-M23-S13
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - >-
    services-platform:docs/milestones/PLAT-M23-notifications-core-and-in-app.md#D2
  - 'services-platform:docs/proposals/notifications/23-decisions.md#D-06'
  - >-
    services-platform:docs/milestones/plans/PLAT-M23-plan.humanized.md#3. How it
    works for the user
  - >-
    services-platform:docs/milestones/plans/PLAT-M23-plan.humanized.md#PLAT-M23-S01
  - >-
    services-platform:docs/milestones/plans/PLAT-M23-plan.humanized.md#PLAT-M23-S02
  - >-
    services-platform:docs/milestones/plans/PLAT-M23-plan.humanized.md#PLAT-M23-S03
  - >-
    services-platform:docs/milestones/plans/PLAT-M23-plan.humanized.md#PLAT-M23-S13
purpose: >-
  Staff can review, open and organize their own notices without accessing
  another person's inbox.
outcomes:
  - 'Staff browse, read and archive their own notices.'
  - The inbox presents the implemented summary and navigation behavior.
concepts:
  - CON-PFM-NOT-003
actors:
  - ACT-PFM-027
surfaces:
  - console
  - api
preconditions: []
postconditions: []
permissions:
  - key: platform.notifications.use
    where_checked: api
    scope: record
  - key: platform.notifications.use
    where_checked: console
    scope: tenant
rules:
  - id: BR-CAP-PFM-NOT-009-01
    statement: >-
      Built-in console roles include personal notification permission; every
      personal notification route rejects callers lacking it.
    kind: permission
    enforced_at:
      - api
      - console
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/unit/permissions.spec.js#puts
      use at tier read, so every built-in console role carries it, and open to
      customers
    origin: >-
      services-platform:docs/milestones/PLAT-M23-notifications-core-and-in-app.md#D2
  - id: BR-CAP-PFM-NOT-009-02
    statement: >-
      Personal routes derive identity from the signed-in user rather than
      accepting a user selector; Another person's item is not found and cannot
      change; portal accounts are excluded.
    kind: permission
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#finds
      nothing of another person’s notification, whoever asks
    origin: >-
      services-platform:docs/milestones/plans/PLAT-M23-plan.humanized.md#PLAT-M23-S04
  - id: BR-CAP-PFM-NOT-009-03
    statement: >-
      The inbox returns newest-first notices, normally omitting archived items;
      Unread, category and since filters apply; pages default to fifty and cap
      at one hundred; invalid filters, cursors and sizes identify the offending
      parameter.
    kind: validation
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#refuses
      a bad filter, cursor or page size with a 400 naming the parameter
    origin: none
  - id: BR-CAP-PFM-NOT-009-04
    statement: >-
      Unread totals and category totals include only unread, unarchived,
      applicable notices; the unread list follows the same exclusions.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js#leaves
      out a notification that no longer applies
    origin: >-
      services-platform:docs/milestones/plans/PLAT-M23-plan.humanized.md#PLAT-M23-S03
  - id: BR-CAP-PFM-NOT-009-05
    statement: >-
      Opening marks an item read; repeated reading preserves the original read
      time; unread, archive and restore operations affect only the caller's item
      and return its updated state.
    kind: lifecycle
    enforced_at:
      - service
      - console
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#marks
      one read and unread, archives and unarchives it, answering it each time
    origin: none
  - id: BR-CAP-PFM-NOT-009-06
    statement: >-
      Mark-all-read updates the caller's unread, unarchived items, optionally
      restricted by category or creation cutoff; it returns the changed count
      and is idempotent.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/integration/services/persistence/instances.integration.spec.js#marks
      every unread instance read, but neither an archived instance nor another
      person’s
    origin: none
  - id: BR-CAP-PFM-NOT-009-07
    statement: >-
      A personal test request targets only the caller through the complete
      pipeline, supplying default wording when the message is omitted.
    kind: policy
    enforced_at:
      - api
      - service
      - console
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js#puts
      a test notification in the caller’s own list, through the whole pipeline,
      and nobody else’s
    origin: >-
      services-platform:docs/milestones/plans/PLAT-M23-plan.humanized.md#PLAT-M23-S13
  - id: BR-CAP-PFM-NOT-009-08
    statement: >-
      The inbox groups rows under Today, Yesterday and dated headings, provides
      Unread, All and Archived views, highlights unread titles and labels
      superseded notices in muted styling.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: test
    source: >-
      react-console:lib/notifications/__tests__/model.test.ts#groups under
      Today, Yesterday, then dates, keeping the order given
    origin: none
  - id: BR-CAP-PFM-NOT-009-09
    statement: >-
      The intended bell combines unread required-attention items and
      notifications in one count and presents notifications alongside Needs Your
      Attention.
    kind: calculation
    enforced_at:
      - console
    must_prove: true
    provenance: documented
    source: >-
      services-platform:docs/milestones/plans/PLAT-M23-plan.humanized.md#3. How
      it works for the user
    origin: 'services-platform:docs/proposals/notifications/23-decisions.md#D-06'
    note: >-
      Not built at the pinned commit: the bell popover has no notifications
      section; it is held until the relevant milestone is accepted.
  - id: BR-CAP-PFM-NOT-009-10
    statement: >-
      Navigation exposes the Notifications page only when the user has personal
      notification permission.
    kind: permission
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: >-
      react-console:app/(console)/console/[tenantId]/notifications/page.tsx:permissions.platform.notifications.use
    origin: none
scenarios:
  - id: SC-CAP-PFM-NOT-009-01
    given: >-
      A nonadministrative clerk account for Jane receives a Batch posting
      assignment.
    when: Jane opens Notifications and follows the assignment item.
    then: >-
      The item becomes read, its unread total decreases by one and My
      Responsibilities opens.
    provenance: test
    source: >-
      react-console:acceptance/notifications/playwright/journeys/inbox/NT-ACC-0001.spec.ts#NT-ACC-0001
  - id: SC-CAP-PFM-NOT-009-02
    given: Jane has moved an item out of her normal inbox.
    when: She selects Archived.
    then: The item is listed there and restoration returns it to the normal inbox.
    provenance: test
    source: >-
      react-console:acceptance/notifications/playwright/journeys/inbox/NT-ACC-0003.spec.ts#NT-ACC-0003
edge_cases: []
constraints: []
depends_on:
  - CAP-PFM-NOT-004
related:
  - CAP-PFM-NOT-010
  - CAP-PFM-NOT-006
  - CAP-PFM-NOT-005
  - CAP-PFM-NOT-014
journeys:
  - JNY-PFM-NOT-001
  - JNY-PFM-NOT-002
  - JNY-PFM-NOT-005
open_questions: []
evidence:
  - >-
    Pinned evidence inventory 1:
    services-platform:docs/milestones/PLAT-M23-notifications-core-and-in-app.md;
    services-platform:docs/milestones/plans/PLAT-M23-plan.humanized.md;
    services-platform:modules/notifications/tests/e2e/notifications.e2e.spec.js;
    services-platform:modules/notifications/tests/integration/services/persistence/instances.integration.spec.js;
    react-console:app/(console)/console/[tenantId]/notifications/page.tsx:permissions.platform.notifications.use;
    react-console:acceptance/notifications/playwright/journeys/inbox/NT-ACC-0003.spec.ts
  - >-
    Pinned evidence inventory 2:
    services-platform:docs/proposals/notifications/23-decisions.md;
    services-platform:modules/notifications/tests/unit/permissions.spec.js;
    services-platform:modules/notifications/tests/integration/services/centre/notification-centre.integration.spec.js;
    react-console:lib/notifications/__tests__/model.test.ts;
    react-console:acceptance/notifications/playwright/journeys/inbox/NT-ACC-0001.spec.ts
controls: [TC-AVL-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-CRY-001, TC-CRY-002, TC-CRY-003, TC-CRY-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-002, TC-PI-003, TC-PI-005, TC-PRV-001, TC-PRV-002, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-TEN-004, TC-VEN-001, TC-VEN-002, TC-VEN-003]
---

# Manage a personal notification inbox

## Purpose

Staff can review, open and organize their own notices without accessing another person's inbox.

## How It Works

A signed-in console user opens the personal Notifications page. Permission checking establishes access and the server derives the recipient identity. The page fetches notices and unread totals for that person. Filters and paging organize active and archived items. Opening or changing an item updates only its personal read and archive state. Bulk reading reports how many eligible items changed. A personal test exercises the publication pipeline without selecting another recipient. The combined header bell remains intended behavior with a recorded implementation gap.

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

Recipient rendering supplies the content and destinations displayed to staff.
