wtclaude
12ff201ed5
PR Checks / bot-tests (pull_request) Successful in 29s
PR Checks / client-build (pull_request) Successful in 31s
PR Checks / server-tests (pull_request) Successful in 2m38s
feat(engagement): templates — the email block family, renderer and seeded set (engagement Phase 5a)
...
Every subject and body moves out of `mailer.js` into `engagement_templates` rows an
operator can edit. A relocation, not a regression: nothing that sends mail today
starts depending on an operator authoring something first.
- `email.*` block family in its own registry, sharing the page family's envelope
walk and validate-then-sanitize order by binding rather than by copy.
- A server-side renderer producing both parts of a multipart message; the text
part is byte-identical to the literals this commit deletes.
- Nine seeded templates, six of them wired now; the seeder's `customized = 0`
guard lives in the UPDATE's own WHERE.
- `renderByKey` falls back to the shipped seed when a row is missing or unusable,
so no failure of the table can stop a password reset.
Also fixes `check:hosts` reading the template key `auth.email-verify` as the
hostname `auth.email`.
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-29 13:07:39 -05:00
..
2026-08-10 21:27:47 -05:00
2026-08-10 21:27:47 -05:00
2026-08-12 09:05:21 -05:00
2026-07-21 23:38:48 -05:00
2026-08-10 17:47:59 -05:00
2026-08-11 12:08:26 -05:00
2026-08-10 17:47:59 -05:00
2026-07-18 22:01:06 -05:00
2026-07-18 22:01:06 -05:00
2026-07-20 18:37:17 -05:00
2026-07-21 00:33:01 -05:00
2026-08-29 01:53:50 -05:00
2026-07-21 23:38:48 -05:00
2026-08-12 07:57:08 -05:00
2026-07-04 17:35:07 -05:00
2026-08-07 20:09:56 -05:00
2026-08-11 21:41:18 -05:00
2026-08-29 13:07:39 -05:00
2026-08-18 12:58:15 -05:00
2026-07-27 15:19:26 -05:00
2026-08-29 01:53:50 -05:00
2026-08-28 20:52:55 -05:00
2026-08-29 13:07:39 -05:00
2026-08-29 01:53:50 -05:00
2026-08-29 01:53:50 -05:00
2026-08-29 12:10:04 -05:00
2026-08-29 06:40:28 -05:00
2026-08-29 08:07:27 -05:00
2026-08-29 08:07:27 -05:00
2026-08-29 06:40:28 -05:00
2026-08-29 06:40:28 -05:00
2026-08-10 22:54:16 -05:00
2026-07-21 00:33:01 -05:00
2026-07-17 15:50:49 -05:00
2026-08-12 08:16:59 -05:00
2026-08-29 13:07:39 -05:00
2026-08-28 20:52:55 -05:00
2026-07-20 16:55:06 -05:00
2026-08-29 00:49:25 -05:00
2026-07-03 10:31:29 -05:00
2026-07-20 16:55:06 -05:00
2026-07-21 00:26:01 -05:00
2026-07-22 13:14:02 -05:00
2026-08-12 03:09:45 -05:00
2026-08-10 22:54:16 -05:00
2026-08-12 07:57:08 -05:00
2026-08-11 22:57:37 -05:00
2026-08-12 03:09:45 -05:00
2026-08-12 03:09:45 -05:00
2026-08-29 06:40:28 -05:00
2026-08-18 14:35:23 -05:00
2026-08-12 03:48:27 -05:00
2026-08-12 03:09:45 -05:00
2026-08-08 00:42:19 -05:00
2026-08-29 07:08:17 -05:00
2026-08-18 14:35:23 -05:00
2026-07-21 00:26:01 -05:00
2026-07-21 23:38:48 -05:00
2026-07-19 03:57:13 -05:00
2026-08-29 00:49:25 -05:00
2026-08-11 12:08:26 -05:00
2026-08-29 01:53:50 -05:00
2026-08-07 19:16:23 -05:00
2026-07-21 00:33:01 -05:00
2026-08-10 22:03:22 -05:00
2026-07-27 20:52:14 -05:00
2026-08-18 14:35:23 -05:00
2026-07-21 23:38:48 -05:00
2026-07-03 10:31:29 -05:00
2026-07-04 17:35:07 -05:00
2026-08-17 15:08:58 -05:00
2026-08-11 12:08:26 -05:00
2026-07-03 10:31:29 -05:00
2026-08-29 00:49:25 -05:00
2026-07-04 21:54:58 -05:00
2026-08-11 18:39:55 -05:00
2026-08-08 00:02:33 -05:00
2026-08-18 18:53:34 -05:00
2026-07-06 01:36:51 -05:00
2026-08-29 01:53:50 -05:00
2026-07-04 22:17:35 -05:00
2026-07-28 01:01:12 -05:00
2026-08-17 14:57:23 -05:00
2026-08-17 20:15:18 -05:00
2026-08-18 20:25:30 -05:00
2026-08-18 12:58:15 -05:00
2026-08-18 20:25:30 -05:00
2026-08-17 15:08:58 -05:00
2026-08-18 18:01:59 -05:00
2026-08-18 20:25:30 -05:00
2026-08-18 14:35:23 -05:00
2026-08-17 20:15:36 -05:00
2026-08-18 13:25:21 -05:00
2026-08-18 14:35:23 -05:00
2026-08-19 00:07:27 -05:00
2026-08-19 00:07:27 -05:00
2026-08-07 19:16:23 -05:00
2026-07-21 23:38:48 -05:00
2026-07-06 01:36:51 -05:00