This is the open machine’s actual output — not a demo. One brief in content-index.json → the agent composes, renders, certifies, and ships every asset below. See it run here; run it yourself — the whole engine is open source. Each card links back to its storyboard (the brief + the exact composition). Built by Dom Davis. Minus the hype.
hero 600×600 [gif/image/html-motion] · the week's 1:1 cut as a loop, first-frame poster fallback, alt text, hosted URL
secondary 600×400 [html/image/gif] · the one promise in copy, single accent; optional
tertiary 600×250 [html] · the DOOR - a bulletproof button to the segment's door with the UTM spine; never a generic 'learn more'
footer 600×200 [html] · logo · links · unsubscribe · NAP
From nameauthored the name the inbox shows BEFORE the subject, and the first thing a reader decides on. Keep it the same across sends — changing it costs the recognition that earns the open. Never 'noreply'.
Subjectauthored ≤ 50 chars
Preheaderauthored ≤ 90 chars; finishes the subject's sentence
Bodyauthored the day's letter; reads-at-the-kitchen-table register
CTA doorauthored a segment door id; the tertiary block renders it
Hero assetauthored the hosted GIF URL + poster + alt text
Plain-text twin derived from the body; every client gets one
rules · subject ≤ 50 · preheader ≤ 90 · from name set, and the same one as last send · dark mode tested · Outlook shows the poster (no GIF motion) · total HTML < 102 KB (Gmail clips) · plain-text twin present · list = contacts with a consent receipt only · send window = the recipient's morning in their zone, never one flat hour · List-Unsubscribe + List-Unsubscribe-Post on EVERY bulk send: `List-Unsubscribe: <https://…>, <mailto:…>` and `List-Unsubscribe-Post: List-Unsubscribe=One-Click`. Gmail and Yahoo have required one-click unsubscribe of bulk senders since February 2024; without the headers the mail is throttled or spam-foldered no matter how good the copy is. This is the HEADER, set at the send — NOT the same thing as the rule below, which is what happens after somebody clicks it. · unsubscribe honoured at the consent root · every link carries the UTM spine, not only the door — an untagged link in the body is a click the reporting never sees
test matrix · dark mode · Outlook desktop (poster) · Gmail mobile · Apple Mail (motion) · 102 KB clip check
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by executive-manager
Blog (static .xyz + Duda .com)
The week's article — Article
H1authored the episode's argument as a sentence; ≤ 70 chars
Meta descriptionauthored ≤ 155 chars and UNIQUE across the blog — the line the search result shows, written as a promise, NOT the first 155 characters of the lede. Change it and the SERP snippet changes; leave it derived and two articles that open alike collide (the 2026-08-25 crawl reported description_duplicate on 8 URLs).
Authorauthored the byline the page shows and the JSON-LD Person points at; must be a real person with a live author page (/blog/author/<slug>). An article with no named author is the E-E-A-T signal Google's quality guidance asks for and we do not send.
Published dateauthored ISO date; renders as article:published_time and BlogPosting.datePublished, and orders the listing and the sitemap <lastmod>. Move it and the article moves in the feed.
Updated dateauthored ISO date, only when the article actually changed; renders as BlogPosting.dateModified. Stamp it on an unchanged article and the freshness signal is a lie.
OG image 1200×630 the chapter card; no typed name
In-article hero 1600×900 optional
16:9 video embed the week's 16:9 cut, in-article
Alt textauthored one line per in-article image, describing what the image SHOWS, not what it is called — the text a screen reader reads and the only thing an image search can read. An image authored with no alt text is not rendered.
Headingsauthored one per chapter; the scan tells the story
Canonical rel=canonical to the .xyz static page; syndication points back
Internal linksauthored links to other articles or office pages, in the body, beyond the door CTA — a page nothing links to is an orphan and the crawler reports it as one (sitemap_orphan). Every link carries the UTM spine.
Door linkauthored the segment door with the UTM spine, once, near the end
Schema (JSON-LD) Organization + Person(author) + BlogPosting + BreadcrumbList, derived from the layers above. NO templated FAQPage/HowTo — those rich results were deprecated in May 2026 and FAQPage is only honest where a visible Q&A exists. Change the author, dates or description and this changes with them, because it reads them.
Reading time derived
rules · h1 ≤ 70 · title UNIQUE across the blog (the ≤ 60-char SEO title, not just the h1 — two articles clamped to the same 60 characters are one page to a search engine) · meta description ≤ 155 and UNIQUE across the blog · author named, with a live author page · published date present; updated date only when the article changed · canonical present · one door link · at least one internal link in the body, beyond the door CTA · every image has alt text · JSON-LD present and derived from the authored layers (no hand-typed schema)
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by creative-lead
hero 600×600 [gif/image/html-motion] · the week's 1:1 cut as a loop, first-frame poster fallback, alt text, hosted URL
secondary 600×400 [html/image/gif] · the one promise in copy, single accent; optional
tertiary 600×250 [html] · the DOOR - a bulletproof button to the segment's door with the UTM spine; never a generic 'learn more'
footer 600×200 [html] · logo · links · unsubscribe · NAP
From nameauthored the name the inbox shows BEFORE the subject, and the first thing a reader decides on. Keep it the same across sends — changing it costs the recognition that earns the open. Never 'noreply'.
Subjectauthored ≤ 50 chars
Preheaderauthored ≤ 90 chars; finishes the subject's sentence
Bodyauthored the day's letter; reads-at-the-kitchen-table register
CTA doorauthored a segment door id; the tertiary block renders it
Hero assetauthored the hosted GIF URL + poster + alt text
Plain-text twin derived from the body; every client gets one
rules · subject ≤ 50 · preheader ≤ 90 · from name set, and the same one as last send · dark mode tested · Outlook shows the poster (no GIF motion) · total HTML < 102 KB (Gmail clips) · plain-text twin present · list = contacts with a consent receipt only · send window = the recipient's morning in their zone, never one flat hour · List-Unsubscribe + List-Unsubscribe-Post on EVERY bulk send: `List-Unsubscribe: <https://…>, <mailto:…>` and `List-Unsubscribe-Post: List-Unsubscribe=One-Click`. Gmail and Yahoo have required one-click unsubscribe of bulk senders since February 2024; without the headers the mail is throttled or spam-foldered no matter how good the copy is. This is the HEADER, set at the send — NOT the same thing as the rule below, which is what happens after somebody clicks it. · unsubscribe honoured at the consent root · every link carries the UTM spine, not only the door — an untagged link in the body is a click the reporting never sees
test matrix · dark mode · Outlook desktop (poster) · Gmail mobile · Apple Mail (motion) · 102 KB clip check
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by executive-manager
Blog (static .xyz + Duda .com)
The week's article — Article
H1authored the episode's argument as a sentence; ≤ 70 chars
Meta descriptionauthored ≤ 155 chars and UNIQUE across the blog — the line the search result shows, written as a promise, NOT the first 155 characters of the lede. Change it and the SERP snippet changes; leave it derived and two articles that open alike collide (the 2026-08-25 crawl reported description_duplicate on 8 URLs).
Authorauthored the byline the page shows and the JSON-LD Person points at; must be a real person with a live author page (/blog/author/<slug>). An article with no named author is the E-E-A-T signal Google's quality guidance asks for and we do not send.
Published dateauthored ISO date; renders as article:published_time and BlogPosting.datePublished, and orders the listing and the sitemap <lastmod>. Move it and the article moves in the feed.
Updated dateauthored ISO date, only when the article actually changed; renders as BlogPosting.dateModified. Stamp it on an unchanged article and the freshness signal is a lie.
OG image 1200×630 the chapter card; no typed name
In-article hero 1600×900 optional
16:9 video embed the week's 16:9 cut, in-article
Alt textauthored one line per in-article image, describing what the image SHOWS, not what it is called — the text a screen reader reads and the only thing an image search can read. An image authored with no alt text is not rendered.
Headingsauthored one per chapter; the scan tells the story
Canonical rel=canonical to the .xyz static page; syndication points back
Internal linksauthored links to other articles or office pages, in the body, beyond the door CTA — a page nothing links to is an orphan and the crawler reports it as one (sitemap_orphan). Every link carries the UTM spine.
Door linkauthored the segment door with the UTM spine, once, near the end
Schema (JSON-LD) Organization + Person(author) + BlogPosting + BreadcrumbList, derived from the layers above. NO templated FAQPage/HowTo — those rich results were deprecated in May 2026 and FAQPage is only honest where a visible Q&A exists. Change the author, dates or description and this changes with them, because it reads them.
Reading time derived
rules · h1 ≤ 70 · title UNIQUE across the blog (the ≤ 60-char SEO title, not just the h1 — two articles clamped to the same 60 characters are one page to a search engine) · meta description ≤ 155 and UNIQUE across the blog · author named, with a live author page · published date present; updated date only when the article changed · canonical present · one door link · at least one internal link in the body, beyond the door CTA · every image has alt text · JSON-LD present and derived from the authored layers (no hand-typed schema)
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by creative-lead
hero 600×600 [gif/image/html-motion] · the week's 1:1 cut as a loop, first-frame poster fallback, alt text, hosted URL
secondary 600×400 [html/image/gif] · the one promise in copy, single accent; optional
tertiary 600×250 [html] · the DOOR - a bulletproof button to the segment's door with the UTM spine; never a generic 'learn more'
footer 600×200 [html] · logo · links · unsubscribe · NAP
From nameauthored the name the inbox shows BEFORE the subject, and the first thing a reader decides on. Keep it the same across sends — changing it costs the recognition that earns the open. Never 'noreply'.
Subjectauthored ≤ 50 chars
Preheaderauthored ≤ 90 chars; finishes the subject's sentence
Bodyauthored the day's letter; reads-at-the-kitchen-table register
CTA doorauthored a segment door id; the tertiary block renders it
Hero assetauthored the hosted GIF URL + poster + alt text
Plain-text twin derived from the body; every client gets one
rules · subject ≤ 50 · preheader ≤ 90 · from name set, and the same one as last send · dark mode tested · Outlook shows the poster (no GIF motion) · total HTML < 102 KB (Gmail clips) · plain-text twin present · list = contacts with a consent receipt only · send window = the recipient's morning in their zone, never one flat hour · List-Unsubscribe + List-Unsubscribe-Post on EVERY bulk send: `List-Unsubscribe: <https://…>, <mailto:…>` and `List-Unsubscribe-Post: List-Unsubscribe=One-Click`. Gmail and Yahoo have required one-click unsubscribe of bulk senders since February 2024; without the headers the mail is throttled or spam-foldered no matter how good the copy is. This is the HEADER, set at the send — NOT the same thing as the rule below, which is what happens after somebody clicks it. · unsubscribe honoured at the consent root · every link carries the UTM spine, not only the door — an untagged link in the body is a click the reporting never sees
test matrix · dark mode · Outlook desktop (poster) · Gmail mobile · Apple Mail (motion) · 102 KB clip check
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by executive-manager
SMS / MMS (Twilio) · produced
Eight pillars, one engine. Reply RING for the one-page diagram of how they connect.
Bodyauthored ≤ 160 chars including the opt-out — but that is the GSM-7 limit. One emoji or one curly apostrophe flips the message to UCS-2 and the real limit is 70. One idea, one link.
MMS loop 720×720 the 1:1 cut as a short loop; a still if the carrier strips motion
Linkauthored one shortened link with the UTM spine, to a door
rules · body ≤ 160 incl. opt-out · encoding: GSM-7 → 160 in one message, 153 per segment when concatenated; UCS-2 → 70 and 67. One emoji or one curly apostrophe (’ “ ” — …) flips the whole message to UCS-2 and drops the limit 160 → 70 · segments: 1 — past the single-message limit for its encoding the message is billed as 2+ segments and any carrier that does not reassemble truncates it · HELP and STOP both answered — US carriers (CTIA messaging principles) require the HELP keyword alongside opt-out, not STOP alone · quiet hours (recipient zone) · sender id registered · 2 per week (Tue · Fri) · list = receipts only
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by executive-manager
Blog (static .xyz + Duda .com)
The week's article — Article
H1authored the episode's argument as a sentence; ≤ 70 chars
Meta descriptionauthored ≤ 155 chars and UNIQUE across the blog — the line the search result shows, written as a promise, NOT the first 155 characters of the lede. Change it and the SERP snippet changes; leave it derived and two articles that open alike collide (the 2026-08-25 crawl reported description_duplicate on 8 URLs).
Authorauthored the byline the page shows and the JSON-LD Person points at; must be a real person with a live author page (/blog/author/<slug>). An article with no named author is the E-E-A-T signal Google's quality guidance asks for and we do not send.
Published dateauthored ISO date; renders as article:published_time and BlogPosting.datePublished, and orders the listing and the sitemap <lastmod>. Move it and the article moves in the feed.
Updated dateauthored ISO date, only when the article actually changed; renders as BlogPosting.dateModified. Stamp it on an unchanged article and the freshness signal is a lie.
OG image 1200×630 the chapter card; no typed name
In-article hero 1600×900 optional
16:9 video embed the week's 16:9 cut, in-article
Alt textauthored one line per in-article image, describing what the image SHOWS, not what it is called — the text a screen reader reads and the only thing an image search can read. An image authored with no alt text is not rendered.
Headingsauthored one per chapter; the scan tells the story
Canonical rel=canonical to the .xyz static page; syndication points back
Internal linksauthored links to other articles or office pages, in the body, beyond the door CTA — a page nothing links to is an orphan and the crawler reports it as one (sitemap_orphan). Every link carries the UTM spine.
Door linkauthored the segment door with the UTM spine, once, near the end
Schema (JSON-LD) Organization + Person(author) + BlogPosting + BreadcrumbList, derived from the layers above. NO templated FAQPage/HowTo — those rich results were deprecated in May 2026 and FAQPage is only honest where a visible Q&A exists. Change the author, dates or description and this changes with them, because it reads them.
Reading time derived
rules · h1 ≤ 70 · title UNIQUE across the blog (the ≤ 60-char SEO title, not just the h1 — two articles clamped to the same 60 characters are one page to a search engine) · meta description ≤ 155 and UNIQUE across the blog · author named, with a live author page · published date present; updated date only when the article changed · canonical present · one door link · at least one internal link in the body, beyond the door CTA · every image has alt text · JSON-LD present and derived from the authored layers (no hand-typed schema)
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by creative-lead
hero 600×600 [gif/image/html-motion] · the week's 1:1 cut as a loop, first-frame poster fallback, alt text, hosted URL
secondary 600×400 [html/image/gif] · the one promise in copy, single accent; optional
tertiary 600×250 [html] · the DOOR - a bulletproof button to the segment's door with the UTM spine; never a generic 'learn more'
footer 600×200 [html] · logo · links · unsubscribe · NAP
From nameauthored the name the inbox shows BEFORE the subject, and the first thing a reader decides on. Keep it the same across sends — changing it costs the recognition that earns the open. Never 'noreply'.
Subjectauthored ≤ 50 chars
Preheaderauthored ≤ 90 chars; finishes the subject's sentence
Bodyauthored the day's letter; reads-at-the-kitchen-table register
CTA doorauthored a segment door id; the tertiary block renders it
Hero assetauthored the hosted GIF URL + poster + alt text
Plain-text twin derived from the body; every client gets one
rules · subject ≤ 50 · preheader ≤ 90 · from name set, and the same one as last send · dark mode tested · Outlook shows the poster (no GIF motion) · total HTML < 102 KB (Gmail clips) · plain-text twin present · list = contacts with a consent receipt only · send window = the recipient's morning in their zone, never one flat hour · List-Unsubscribe + List-Unsubscribe-Post on EVERY bulk send: `List-Unsubscribe: <https://…>, <mailto:…>` and `List-Unsubscribe-Post: List-Unsubscribe=One-Click`. Gmail and Yahoo have required one-click unsubscribe of bulk senders since February 2024; without the headers the mail is throttled or spam-foldered no matter how good the copy is. This is the HEADER, set at the send — NOT the same thing as the rule below, which is what happens after somebody clicks it. · unsubscribe honoured at the consent root · every link carries the UTM spine, not only the door — an untagged link in the body is a click the reporting never sees
test matrix · dark mode · Outlook desktop (poster) · Gmail mobile · Apple Mail (motion) · 102 KB clip check
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by executive-manager
Blog (static .xyz + Duda .com)
The week's article — Article
H1authored the episode's argument as a sentence; ≤ 70 chars
Meta descriptionauthored ≤ 155 chars and UNIQUE across the blog — the line the search result shows, written as a promise, NOT the first 155 characters of the lede. Change it and the SERP snippet changes; leave it derived and two articles that open alike collide (the 2026-08-25 crawl reported description_duplicate on 8 URLs).
Authorauthored the byline the page shows and the JSON-LD Person points at; must be a real person with a live author page (/blog/author/<slug>). An article with no named author is the E-E-A-T signal Google's quality guidance asks for and we do not send.
Published dateauthored ISO date; renders as article:published_time and BlogPosting.datePublished, and orders the listing and the sitemap <lastmod>. Move it and the article moves in the feed.
Updated dateauthored ISO date, only when the article actually changed; renders as BlogPosting.dateModified. Stamp it on an unchanged article and the freshness signal is a lie.
OG image 1200×630 the chapter card; no typed name
In-article hero 1600×900 optional
16:9 video embed the week's 16:9 cut, in-article
Alt textauthored one line per in-article image, describing what the image SHOWS, not what it is called — the text a screen reader reads and the only thing an image search can read. An image authored with no alt text is not rendered.
Headingsauthored one per chapter; the scan tells the story
Canonical rel=canonical to the .xyz static page; syndication points back
Internal linksauthored links to other articles or office pages, in the body, beyond the door CTA — a page nothing links to is an orphan and the crawler reports it as one (sitemap_orphan). Every link carries the UTM spine.
Door linkauthored the segment door with the UTM spine, once, near the end
Schema (JSON-LD) Organization + Person(author) + BlogPosting + BreadcrumbList, derived from the layers above. NO templated FAQPage/HowTo — those rich results were deprecated in May 2026 and FAQPage is only honest where a visible Q&A exists. Change the author, dates or description and this changes with them, because it reads them.
Reading time derived
rules · h1 ≤ 70 · title UNIQUE across the blog (the ≤ 60-char SEO title, not just the h1 — two articles clamped to the same 60 characters are one page to a search engine) · meta description ≤ 155 and UNIQUE across the blog · author named, with a live author page · published date present; updated date only when the article changed · canonical present · one door link · at least one internal link in the body, beyond the door CTA · every image has alt text · JSON-LD present and derived from the authored layers (no hand-typed schema)
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by creative-lead
hero 600×600 [gif/image/html-motion] · the week's 1:1 cut as a loop, first-frame poster fallback, alt text, hosted URL
secondary 600×400 [html/image/gif] · the one promise in copy, single accent; optional
tertiary 600×250 [html] · the DOOR - a bulletproof button to the segment's door with the UTM spine; never a generic 'learn more'
footer 600×200 [html] · logo · links · unsubscribe · NAP
From nameauthored the name the inbox shows BEFORE the subject, and the first thing a reader decides on. Keep it the same across sends — changing it costs the recognition that earns the open. Never 'noreply'.
Subjectauthored ≤ 50 chars
Preheaderauthored ≤ 90 chars; finishes the subject's sentence
Bodyauthored the day's letter; reads-at-the-kitchen-table register
CTA doorauthored a segment door id; the tertiary block renders it
Hero assetauthored the hosted GIF URL + poster + alt text
Plain-text twin derived from the body; every client gets one
rules · subject ≤ 50 · preheader ≤ 90 · from name set, and the same one as last send · dark mode tested · Outlook shows the poster (no GIF motion) · total HTML < 102 KB (Gmail clips) · plain-text twin present · list = contacts with a consent receipt only · send window = the recipient's morning in their zone, never one flat hour · List-Unsubscribe + List-Unsubscribe-Post on EVERY bulk send: `List-Unsubscribe: <https://…>, <mailto:…>` and `List-Unsubscribe-Post: List-Unsubscribe=One-Click`. Gmail and Yahoo have required one-click unsubscribe of bulk senders since February 2024; without the headers the mail is throttled or spam-foldered no matter how good the copy is. This is the HEADER, set at the send — NOT the same thing as the rule below, which is what happens after somebody clicks it. · unsubscribe honoured at the consent root · every link carries the UTM spine, not only the door — an untagged link in the body is a click the reporting never sees
test matrix · dark mode · Outlook desktop (poster) · Gmail mobile · Apple Mail (motion) · 102 KB clip check
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by executive-manager
Blog (static .xyz + Duda .com)
The week's article — Article
H1authored the episode's argument as a sentence; ≤ 70 chars
Meta descriptionauthored ≤ 155 chars and UNIQUE across the blog — the line the search result shows, written as a promise, NOT the first 155 characters of the lede. Change it and the SERP snippet changes; leave it derived and two articles that open alike collide (the 2026-08-25 crawl reported description_duplicate on 8 URLs).
Authorauthored the byline the page shows and the JSON-LD Person points at; must be a real person with a live author page (/blog/author/<slug>). An article with no named author is the E-E-A-T signal Google's quality guidance asks for and we do not send.
Published dateauthored ISO date; renders as article:published_time and BlogPosting.datePublished, and orders the listing and the sitemap <lastmod>. Move it and the article moves in the feed.
Updated dateauthored ISO date, only when the article actually changed; renders as BlogPosting.dateModified. Stamp it on an unchanged article and the freshness signal is a lie.
OG image 1200×630 the chapter card; no typed name
In-article hero 1600×900 optional
16:9 video embed the week's 16:9 cut, in-article
Alt textauthored one line per in-article image, describing what the image SHOWS, not what it is called — the text a screen reader reads and the only thing an image search can read. An image authored with no alt text is not rendered.
Headingsauthored one per chapter; the scan tells the story
Canonical rel=canonical to the .xyz static page; syndication points back
Internal linksauthored links to other articles or office pages, in the body, beyond the door CTA — a page nothing links to is an orphan and the crawler reports it as one (sitemap_orphan). Every link carries the UTM spine.
Door linkauthored the segment door with the UTM spine, once, near the end
Schema (JSON-LD) Organization + Person(author) + BlogPosting + BreadcrumbList, derived from the layers above. NO templated FAQPage/HowTo — those rich results were deprecated in May 2026 and FAQPage is only honest where a visible Q&A exists. Change the author, dates or description and this changes with them, because it reads them.
Reading time derived
rules · h1 ≤ 70 · title UNIQUE across the blog (the ≤ 60-char SEO title, not just the h1 — two articles clamped to the same 60 characters are one page to a search engine) · meta description ≤ 155 and UNIQUE across the blog · author named, with a live author page · published date present; updated date only when the article changed · canonical present · one door link · at least one internal link in the body, beyond the door CTA · every image has alt text · JSON-LD present and derived from the authored layers (no hand-typed schema)
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by creative-lead
hero 600×600 [gif/image/html-motion] · the week's 1:1 cut as a loop, first-frame poster fallback, alt text, hosted URL
secondary 600×400 [html/image/gif] · the one promise in copy, single accent; optional
tertiary 600×250 [html] · the DOOR - a bulletproof button to the segment's door with the UTM spine; never a generic 'learn more'
footer 600×200 [html] · logo · links · unsubscribe · NAP
From nameauthored the name the inbox shows BEFORE the subject, and the first thing a reader decides on. Keep it the same across sends — changing it costs the recognition that earns the open. Never 'noreply'.
Subjectauthored ≤ 50 chars
Preheaderauthored ≤ 90 chars; finishes the subject's sentence
Bodyauthored the day's letter; reads-at-the-kitchen-table register
CTA doorauthored a segment door id; the tertiary block renders it
Hero assetauthored the hosted GIF URL + poster + alt text
Plain-text twin derived from the body; every client gets one
rules · subject ≤ 50 · preheader ≤ 90 · from name set, and the same one as last send · dark mode tested · Outlook shows the poster (no GIF motion) · total HTML < 102 KB (Gmail clips) · plain-text twin present · list = contacts with a consent receipt only · send window = the recipient's morning in their zone, never one flat hour · List-Unsubscribe + List-Unsubscribe-Post on EVERY bulk send: `List-Unsubscribe: <https://…>, <mailto:…>` and `List-Unsubscribe-Post: List-Unsubscribe=One-Click`. Gmail and Yahoo have required one-click unsubscribe of bulk senders since February 2024; without the headers the mail is throttled or spam-foldered no matter how good the copy is. This is the HEADER, set at the send — NOT the same thing as the rule below, which is what happens after somebody clicks it. · unsubscribe honoured at the consent root · every link carries the UTM spine, not only the door — an untagged link in the body is a click the reporting never sees
test matrix · dark mode · Outlook desktop (poster) · Gmail mobile · Apple Mail (motion) · 102 KB clip check
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by executive-manager
SMS / MMS (Twilio) · produced
All eight pillars covered this week. Reply MAP for the full system one-pager.
Bodyauthored ≤ 160 chars including the opt-out — but that is the GSM-7 limit. One emoji or one curly apostrophe flips the message to UCS-2 and the real limit is 70. One idea, one link.
MMS loop 720×720 the 1:1 cut as a short loop; a still if the carrier strips motion
Linkauthored one shortened link with the UTM spine, to a door
rules · body ≤ 160 incl. opt-out · encoding: GSM-7 → 160 in one message, 153 per segment when concatenated; UCS-2 → 70 and 67. One emoji or one curly apostrophe (’ “ ” — …) flips the whole message to UCS-2 and drops the limit 160 → 70 · segments: 1 — past the single-message limit for its encoding the message is billed as 2+ segments and any carrier that does not reassemble truncates it · HELP and STOP both answered — US carriers (CTIA messaging principles) require the HELP keyword alongside opt-out, not STOP alone · quiet hours (recipient zone) · sender id registered · 2 per week (Tue · Fri) · list = receipts only
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by executive-manager
Blog (static .xyz + Duda .com)
The week's article — Article
H1authored the episode's argument as a sentence; ≤ 70 chars
Meta descriptionauthored ≤ 155 chars and UNIQUE across the blog — the line the search result shows, written as a promise, NOT the first 155 characters of the lede. Change it and the SERP snippet changes; leave it derived and two articles that open alike collide (the 2026-08-25 crawl reported description_duplicate on 8 URLs).
Authorauthored the byline the page shows and the JSON-LD Person points at; must be a real person with a live author page (/blog/author/<slug>). An article with no named author is the E-E-A-T signal Google's quality guidance asks for and we do not send.
Published dateauthored ISO date; renders as article:published_time and BlogPosting.datePublished, and orders the listing and the sitemap <lastmod>. Move it and the article moves in the feed.
Updated dateauthored ISO date, only when the article actually changed; renders as BlogPosting.dateModified. Stamp it on an unchanged article and the freshness signal is a lie.
OG image 1200×630 the chapter card; no typed name
In-article hero 1600×900 optional
16:9 video embed the week's 16:9 cut, in-article
Alt textauthored one line per in-article image, describing what the image SHOWS, not what it is called — the text a screen reader reads and the only thing an image search can read. An image authored with no alt text is not rendered.
Headingsauthored one per chapter; the scan tells the story
Canonical rel=canonical to the .xyz static page; syndication points back
Internal linksauthored links to other articles or office pages, in the body, beyond the door CTA — a page nothing links to is an orphan and the crawler reports it as one (sitemap_orphan). Every link carries the UTM spine.
Door linkauthored the segment door with the UTM spine, once, near the end
Schema (JSON-LD) Organization + Person(author) + BlogPosting + BreadcrumbList, derived from the layers above. NO templated FAQPage/HowTo — those rich results were deprecated in May 2026 and FAQPage is only honest where a visible Q&A exists. Change the author, dates or description and this changes with them, because it reads them.
Reading time derived
rules · h1 ≤ 70 · title UNIQUE across the blog (the ≤ 60-char SEO title, not just the h1 — two articles clamped to the same 60 characters are one page to a search engine) · meta description ≤ 155 and UNIQUE across the blog · author named, with a live author page · published date present; updated date only when the article changed · canonical present · one door link · at least one internal link in the body, beyond the door CTA · every image has alt text · JSON-LD present and derived from the authored layers (no hand-typed schema)
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by creative-lead
hero 600×600 [gif/image/html-motion] · the week's 1:1 cut as a loop, first-frame poster fallback, alt text, hosted URL
secondary 600×400 [html/image/gif] · the one promise in copy, single accent; optional
tertiary 600×250 [html] · the DOOR - a bulletproof button to the segment's door with the UTM spine; never a generic 'learn more'
footer 600×200 [html] · logo · links · unsubscribe · NAP
From nameauthored the name the inbox shows BEFORE the subject, and the first thing a reader decides on. Keep it the same across sends — changing it costs the recognition that earns the open. Never 'noreply'.
Subjectauthored ≤ 50 chars
Preheaderauthored ≤ 90 chars; finishes the subject's sentence
Bodyauthored the day's letter; reads-at-the-kitchen-table register
CTA doorauthored a segment door id; the tertiary block renders it
Hero assetauthored the hosted GIF URL + poster + alt text
Plain-text twin derived from the body; every client gets one
rules · subject ≤ 50 · preheader ≤ 90 · from name set, and the same one as last send · dark mode tested · Outlook shows the poster (no GIF motion) · total HTML < 102 KB (Gmail clips) · plain-text twin present · list = contacts with a consent receipt only · send window = the recipient's morning in their zone, never one flat hour · List-Unsubscribe + List-Unsubscribe-Post on EVERY bulk send: `List-Unsubscribe: <https://…>, <mailto:…>` and `List-Unsubscribe-Post: List-Unsubscribe=One-Click`. Gmail and Yahoo have required one-click unsubscribe of bulk senders since February 2024; without the headers the mail is throttled or spam-foldered no matter how good the copy is. This is the HEADER, set at the send — NOT the same thing as the rule below, which is what happens after somebody clicks it. · unsubscribe honoured at the consent root · every link carries the UTM spine, not only the door — an untagged link in the body is a click the reporting never sees
test matrix · dark mode · Outlook desktop (poster) · Gmail mobile · Apple Mail (motion) · 102 KB clip check
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by executive-manager
Blog (static .xyz + Duda .com)
The week's article — Article
H1authored the episode's argument as a sentence; ≤ 70 chars
Meta descriptionauthored ≤ 155 chars and UNIQUE across the blog — the line the search result shows, written as a promise, NOT the first 155 characters of the lede. Change it and the SERP snippet changes; leave it derived and two articles that open alike collide (the 2026-08-25 crawl reported description_duplicate on 8 URLs).
Authorauthored the byline the page shows and the JSON-LD Person points at; must be a real person with a live author page (/blog/author/<slug>). An article with no named author is the E-E-A-T signal Google's quality guidance asks for and we do not send.
Published dateauthored ISO date; renders as article:published_time and BlogPosting.datePublished, and orders the listing and the sitemap <lastmod>. Move it and the article moves in the feed.
Updated dateauthored ISO date, only when the article actually changed; renders as BlogPosting.dateModified. Stamp it on an unchanged article and the freshness signal is a lie.
OG image 1200×630 the chapter card; no typed name
In-article hero 1600×900 optional
16:9 video embed the week's 16:9 cut, in-article
Alt textauthored one line per in-article image, describing what the image SHOWS, not what it is called — the text a screen reader reads and the only thing an image search can read. An image authored with no alt text is not rendered.
Headingsauthored one per chapter; the scan tells the story
Canonical rel=canonical to the .xyz static page; syndication points back
Internal linksauthored links to other articles or office pages, in the body, beyond the door CTA — a page nothing links to is an orphan and the crawler reports it as one (sitemap_orphan). Every link carries the UTM spine.
Door linkauthored the segment door with the UTM spine, once, near the end
Schema (JSON-LD) Organization + Person(author) + BlogPosting + BreadcrumbList, derived from the layers above. NO templated FAQPage/HowTo — those rich results were deprecated in May 2026 and FAQPage is only honest where a visible Q&A exists. Change the author, dates or description and this changes with them, because it reads them.
Reading time derived
rules · h1 ≤ 70 · title UNIQUE across the blog (the ≤ 60-char SEO title, not just the h1 — two articles clamped to the same 60 characters are one page to a search engine) · meta description ≤ 155 and UNIQUE across the blog · author named, with a live author page · published date present; updated date only when the article changed · canonical present · one door link · at least one internal link in the body, beyond the door CTA · every image has alt text · JSON-LD present and derived from the authored layers (no hand-typed schema)
acceptance · gate verify_channel_specs.py#CHANNEL-SPECS PASS · review by creative-lead