docs(website): the seeded template set as built (engagement Phase 5a) #185
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/engagement-templates"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Companion to website#172 (engagement Phase 5a). §6.0b assigns this phase two documents; both land here, and the row itself is split so 5a and 5b each own theirs.
ENGAGEMENT.md— "As built — 5a"The three decisions the org lead settled before any code, each because the tree contradicted something the plan assumed:
mailer.jssettext:only, so "renders byte-comparably" was a statement about a text body and whether 5a introduced HTML to live mail was an open choice. It did: multipart, with the text part byte-identical.registerBlockfreezes a fixed field set, so atoHtml/toTextpassed to it is silently dropped — §4.4's "reuse the block registry" needed a mechanism that did not exist.teamNotify/teamDigestWorkerare explicitly Phase 6's to rewrite.And a correction to §4.6.1 itself: it lists
auth.email-verifyas "(new — Phase 9)", but Phase 1b already shippedsendEmailVerification. Six bodies moved, not five.The section also records the things that will not be recoverable from the code six months from now: why two registries rather than one (and what one Map would have cost), why the ternaries stayed at the call site and arrive as
forWhom-style variables, why the shell contributes no content, why only the accent comes from the theme, and why the seeder'scustomized = 0guard is in the UPDATE's own WHERE rather than in a read-then-write.Plus the
foundRows: truenote, recorded here because Phase 4a was bitten by exactly this:affectedRowson an UPDATE counts matched rows, which is harmless for the seeder and is the wanted semantics for an operator's save — now stated in the code rather than relied on.And the two behaviour changes an operator will notice: mail is
multipart/alternative, and subjects now resolvesettings.getInstanceName()(the admin-setsite_title) rather thanBRAND_NAMEalone.BACKEND_DESIGN.mdengagement_templates— the column table, with the reasoning that is not recoverable from the DDL: whytrigger_idhas no foreign key, what the three seed columns are together, and why a missing row renders the shipped default rather than nothing.{{ name }}and nothing else, the escape/re-check rules, and the four ambient brand variables that are merged over whatever a caller passes.🤖 Generated with Claude Code