Skip to content

CAP-PFM-NOT-019Inspect communication outcomes and provider feedback

Markdown

CAP-PFM-NOT-019

Inspect communication outcomes and provider feedback

Markdown
  • DocumentDraft
  • Product intentProposed
  • ImplementationObserved

KindCapabilityProduct areaPlatformModuleStaff Notifications and Association CommunicationsRevision1

Read atservices-platform ad3f6a65react-console baf6dae3

The Formal Contract

The narrative above explains; the sections below are authoritative — the rules, scenarios and tests this document binds.

Outcomes
Authorized readers inspect communication requests, content and delivery outcomes.Changed-message feeds filter by the supplied requesting service, whose caller ownership remains unverified.
Surfaces
apijob
Intent sources
services-platform:docs/communications/architecture.md#15. Decisions for Andrewservices-platform:docs/communications/architecture.md#2026-10-09 — Final acceptanceservices-platform:docs/communications/architecture.md#16.5 CC and BCC (Andrew, 2026-10-09)services-platform:docs/communications/architecture.md#18. Rework 2026-10-10: queue pointers, S3 for request data and bodies, SQS owns retries

Controls

30 controls apply, from the corpus control catalogue.

TC-AVL-004 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-IAM-006 TC-LOG-002 TC-LOG-003 TC-LOG-005 TC-MON-001 TC-PI-001 TC-PI-002 TC-PI-003 TC-PI-004 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

Permissions

KeyChecked atScope
platform.communication-messages.readapitenant
platform.communication-messages.read-contentapitenant

Business Rules

12 rules, 8 to be proved before approval. A rule's product intent is derived from its origin: 0 confirmed by a product decision, the rest inheriting this capability's proposed.

IdRuleKindEnforced atProvenance
01must prove
Proposed
Provider send, delivery, deferral, bounce, complaint, rejection, open and click feedback uses submission tags to find the workspace message; Untagged reports are acknowledged as unrelated; missing tagged messages retry and eventually dead-letter.
no proof recorded yet
policyserviceobserved
services-platform:modules/communications/services/feedback/process-ses-event.ts:rhythm-message
02must prove
Proposed
Event identity prevents duplicate recording; Delivery states only advance in precedence, first occurrences retain the earliest instant and counters increase for new reports, making report order immaterial.
no proof recorded yet
calculationservicetest
03must prove
Proposed
Transactional mail also tracks opens and clicks; Proxy and scanner signals count as events but not likely-human activity; retained click links omit query strings.
no proof recorded yet
calculationservicetest
04
Proposed
Dispatch state records Platform's actions separately from delivery state reported by the provider.
invariantservicetest
services-platform:modules/communications/tests/e2e/messages.e2e.spec.js#says what Rhythm did and what the provider reported, as separate facts
05must prove
Proposed
Message-read permission exposes newest-first workspace messages with request, recipient, source record, dispatch, delivery and purpose filters; source-record filtering considers the latest five hundred requests; pages cap at two hundred; invented cursors and incomplete source filters are rejected.
no proof recorded yet
validationapi, servicetest
services-platform:modules/communications/tests/e2e/messages.e2e.spec.js#refuses a source type given without its id as 400
06
Proposed
Detail includes the originating request, rendering version, ordered attempts and up to the oldest two hundred provider events.
policyservicetest
07must prove
Proposed
Body access requires sensitive content-read permission; missing stored bodies are reported as unavailable rather than returned as empty content.
no proof recorded yet
permissionapi, servicetest
services-platform:modules/communications/tests/integration/services/storage/communication-objects.integration.spec.js#says the content is gone, rather than answering an empty e-mail, when the object is not there
08
Proposed
Request detail records purpose, classification, outcome, source, pinned version, actor, correlation, key and processing times, plus message counts by both states and blocking reasons; source-record requests list newest first with a fifty-row limit.
policyapi, servicetest
services-platform:modules/communications/tests/e2e/requests.e2e.spec.js#answers a blocked request with the reasons, which an accepted one has none of
09must prove
Proposed
The changed-message feed filters by the caller-supplied submitting service and returns oldest changes after a cursor, up to two hundred, without addresses or content; Further changes reappear with updated state; the service filter excludes other service names.
no proof recorded yet
policyservicetest
10must prove
Proposed
Workspace boundaries apply to requests, messages, content and events; records belonging elsewhere are not found.
no proof recorded yet
invariantservice, databasetest
11
Proposed
Rendered bodies have no age-based storage expiry; request objects expire after thirty days, and attachment bytes remain in those objects rather than relational records.
policyservicedocumented
12must prove
Proposed
Copy feedback enters message history, but primary-recipient feedback alone determines delivery state; a copy bounce suppresses that copy address only.
origin: services-platform:docs/communications/architecture.md#16.5 CC and BCC (Andrew, 2026-10-09)
no proof recorded yet
calculationservicetest

Scenarios

IdGivenWhenThenProvenance
01Compliance feedback includes delivery, an image-proxy open and a click.Staff inspect message detail.Detail separates Platform submission from provider delivery and shows delivery time, one automated open and one click.test

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.