01must proveProposed | Platform-rendered purposes require an association's published template; Suggested starter content is authoring help rather than a delivery fallback. no proof recorded yet | policy | service | test |
02must proveProposed | 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 | validation | api, service | test |
03must proveProposed | 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 | validation | api, service | test |
04must proveProposed | Active templates per purpose are limited; archived templates are excluded from the count; Exceeding the limit rejects creation without writing. no proof recorded yet | validation | service | test |
05must proveProposed | Draft replacement checks the version read; Stale writes fail, and archived templates cannot be edited or published. no proof recorded yet | validation | api, service | test |
06must proveProposed | 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 | validation | service | test |
07must proveProposed | 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. no proof recorded yet | lifecycle | api, service | test |
08Proposed | Archiving hides a template from normal lists but preserves its detail and versions for historical references. | lifecycle | api, service | test |
09must proveProposed | 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. no proof recorded yet | lifecycle | service, database | test |
10must proveProposed | 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 | invariant | api, service | test |
11must proveProposed | 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 | invariant | service | test |
12must proveProposed | 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 | policy | service | test |
13must proveProposed | 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 | permission | api, service | test |
14Proposed | Readiness evaluates up to one hundred records or templates, reporting whether sending is possible and distinguishing absent templates from unpublished ones. | policy | service | test |
15must proveProposed | Rendering reads purpose-declared record fields, including association custom fields; missing record fields produce empty text instead of failing. no proof recorded yet | calculation | service | test |