Skip to content

CAP-PFM-NOT-016Author and publish association e-mail content

Markdown

CAP-PFM-NOT-016

Author and publish association e-mail content

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
Associations publish reusable e-mail content for supported purposes.Preview, readiness and test-send operations expose content preparation checks.
Surfaces
consoleapi
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

33 controls apply, from the corpus control catalogue.

TC-AVL-004 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-DAT-004 TC-IAM-001 TC-IAM-006 TC-LOG-004 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-TEN-004 TC-VEN-001 TC-VEN-002 TC-VEN-003

Permissions

KeyChecked atScope
platform.communication-templates.readapitenant
platform.communication-templates.createapitenant
platform.communication-templates.updateapitenant
platform.communication-templates.deleteapitenant
platform.communication-templates.publishapitenant
platform.communication-templates.test-sendapitenant

Business Rules

15 rules, 13 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
Platform-rendered purposes require an association's published template; Suggested starter content is authoring help rather than a delivery fallback.
no proof recorded yet
policyservicetest
02must prove
Proposed
Purpose discovery lists only Platform-rendered purposes and their metadata-provided records; Template operations reject caller-rendered and Marketing-version-owned purposes by name.
no proof recorded yet
validationapi, servicetest
03must prove
Proposed
Template drafts require a trimmed, bounded name, known purpose, valid reply-to and up to ten canonical, distinct copy and blind-copy addresses each; invalid content can remain saved with publication findings.
no proof recorded yet
validationapi, servicetest
04must prove
Proposed
Active templates per purpose are limited; archived templates are excluded from the count; Exceeding the limit rejects creation without writing.
no proof recorded yet
validationservicetest
05must prove
Proposed
Draft replacement checks the version read; Stale writes fail, and archived templates cannot be edited or published.
no proof recorded yet
validationapi, servicetest
06must prove
Proposed
Content checking rejects unsafe or unparseable Liquid, unavailable variables, included templates and prohibited HTML; Pasted Handlebars receives a syntax-specific finding with line and column.
no proof recorded yet
validationservicetest
07must prove
Proposed
Publication creates the next immutable numbered version, storing its content hash and variable usage and updating the current-version reference; invalid drafts cannot publish; later edits leave earlier versions unchanged.
origin: services-platform:docs/communications/architecture.md#2026-10-09 — Final acceptance
no proof recorded yet
lifecycleapi, servicetest
services-platform:modules/communications/tests/e2e/templates.e2e.spec.js#froze the draft as version 1, with the content hash and the variables it reads
08
Proposed
Archiving hides a template from normal lists but preserves its detail and versions for historical references.
lifecycleapi, servicetest
services-platform:modules/communications/tests/e2e/templates.e2e.spec.js#keeps it readable by id, because it is kept for history
09must prove
Proposed
A source record owns one active template per purpose; initial save creates and publishes version one; later partial saves preserve omitted fields, clear optional null fields and publish only changed content; invalid saves and dry runs write nothing; Clearing archives idempotently, and concurrent first saves converge on one template.
origin: services-platform:docs/communications/architecture.md#2026-10-09 — Final acceptance
no proof recorded yet
lifecycleservice, databasetest
10must prove
Proposed
General template operations may edit owned content but cannot change ownership or purpose; Archiving an owned template is equivalent to clearing its owner setting.
no proof recorded yet
invariantapi, servicetest
services-platform:modules/communications/tests/integration/services/templates/owned-templates.integration.spec.js#drops the purpose and the owner from the body before the operation sees them
11must prove
Proposed
A Marketing message version owns one published template version; Identical saves return it without writes; changing published content is refused; Staff template lists omit these records.
no proof recorded yet
invariantservicetest
services-platform:modules/communications/tests/integration/services/templates/message-version-templates.integration.spec.js#refuses different content for a message version that is published, as an illegal operation
12must prove
Proposed
Preview uses the delivery renderer on sample or supplied data and returns rendered output, empty merge-field names and validation findings; it neither persists nor sends a message.
no proof recorded yet
policyservicetest
13must prove
Proposed
Test sends target a test mailbox or the requesting user's address, prefix the subject with [TEST], use purpose samples and follow ordinary queued delivery.
no proof recorded yet
permissionapi, servicetest
services-platform:modules/communications/tests/e2e/templates.e2e.spec.js#refuses an address that is neither a test mailbox nor the caller’s own as 403
14
Proposed
Readiness evaluates up to one hundred records or templates, reporting whether sending is possible and distinguishing absent templates from unpublished ones.
policyservicetest
services-platform:modules/communications/tests/integration/services/requests/handle-invocation.integration.spec.js#answers not ready, with no_published_version, for a template that has only a draft
15must prove
Proposed
Rendering reads purpose-declared record fields, including association custom fields; missing record fields produce empty text instead of failing.
origin: services-platform:docs/communications/architecture.md#2026-10-09 — Final acceptance
no proof recorded yet
calculationservicetest

Scenarios

IdGivenWhenThenProvenance
01An organization type has no compliance content.Its administrator submits content with an undeclared variable and include, then corrects both problems.The invalid save reports both findings without persistence; corrected content publishes version one.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.