Back Office · office.temerarii.xyz
Hyper-accelerate revenue & attention for your brand. — minus the hype.
Media › 2026 · Week 47
Temerarii Media · Back office

2026 · Week 47 — media

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.
SundayMondayTuesdayWednesdayThursdayFridaySaturday

Long-form video — YouTube + LinkedIn · drops Sunday

performance · cell · ⟁ Mensor
One idea, nine outputs
pending render
16:9 · YouTube (long-form)
cuts · 12LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel+ Email (Resend, owned list) · SMS / MMS (Twilio) · Blog (static .xyz + Duda .com)
storyboard → brief + scenes
it dev · cell · ⟁ Faber
What you keep when we leave
pending render
16:9 · YouTube (long-form)
cuts · 12LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel+ Email (Resend, owned list) · SMS / MMS (Twilio) · Blog (static .xyz + Duda .com)
storyboard → brief + scenes

Sunday · open day →

brand · Email Hero GIF · ⟁ Signum
We open our own books
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 1+ Email (Resend, owned list)
storyboard → brief + scenes
performance · longform · ⟁ Mensor
The funnel, with the empty stages left
pending render
16:9 · YouTube (long-form)
cuts · 2YouTube Shorts 9:16 · 60s · SceneReel+ Blog (static .xyz + Duda .com)
storyboard → brief + scenes
multimedia · Interviews & Discussion · ⟁ Lumen
AI interviews. Fast. Real.
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
it dev · Accessibility · ⟁ Faber
Your dashboard shows what? Nothing useful.
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
performance · Custom analytics dashboards · ⟁ Mensor
Performance strategy. Let's define it.
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
performance · Strategy · ⟁ Mensor
Your brand at the register.
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
Email (Resend, owned list)
The day's note — EmailBlockStack · rendered at send
  • header 600×300 [html/image] · logo + nav; links live; dark-mode safe
  • 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

Monday · open day →

brand · Email Hero GIF · ⟁ Signum
Keep the input to one line
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 1+ Email (Resend, owned list)
storyboard → brief + scenes
brand · longform · ⟁ Signum
One engine, two brands
pending render
16:9 · YouTube (long-form)
cuts · 2YouTube Shorts 9:16 · 60s · SceneReel+ Blog (static .xyz + Duda .com)
storyboard → brief + scenes
multimedia · Event Coverage · ⟁ Lumen
Your staff runs on broken systems.
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
staff training · Content, Social & Brand Systems · ⟁ Magister
Brand rules lived in someone's head
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
strategic relations · Outbound at scale (Clay-style enrichment + AI sequencing) · ⟁ Nexus
Cold outreach used to be copy-paste
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
performance · Advertising · ⟁ Mensor
Content strategy. Most teams do it wrong.
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
staff training · Minus the Hype · ⟁ Magister
"Voice clone = your spokesperson"
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
Email (Resend, owned list)
The day's note — EmailBlockStack · rendered at send
  • header 600×300 [html/image] · logo + nav; links live; dark-mode safe
  • 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

Tuesday · open day →

brand · Email Hero GIF · ⟁ Signum
Fan-out, not copy-paste
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 1+ Email (Resend, owned list)
storyboard → brief + scenes
multimedia · longform · ⟁ Lumen
Where the scenes get looked at
pending render
16:9 · YouTube (long-form)
cuts · 2YouTube Shorts 9:16 · 60s · SceneReel+ Blog (static .xyz + Duda .com)
storyboard → brief + scenes
brand · SMS GIF · ⟁ Signum
One idea into nine drafts
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 1+ SMS / MMS (Twilio)
storyboard → brief + scenes
social · Social Media Management · ⟁ Nuntius
Managing socials meant tab roulette
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
staff training · Data & Analytics for Marketers · ⟁ Magister
Marketing data drowned the marketer
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
multimedia · 3D + generative pipeline (Blender + ComfyUI + R3F, Claude-controlled) · ⟁ Lumen
SMS. The fastest channel you ignore.
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
social · Ask the Operator · ⟁ Nuntius
Your app is slow. Still.
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
emerging tech · The Stack · ⟁ Augur
PostgreSQL waits for cron
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
Email (Resend, owned list)
The day's note — EmailBlockStack · rendered at send
  • header 600×300 [html/image] · logo + nav; links live; dark-mode safe
  • 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)
The day's text — SmsMms · rendered at send
  • 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

Wednesday · open day →

brand · Email Hero GIF · ⟁ Signum
The gate we will not automate
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 1+ Email (Resend, owned list)
storyboard → brief + scenes
social · longform · ⟁ Nuntius
The last mile: nine platforms, one connection
pending render
16:9 · YouTube (long-form)
cuts · 2YouTube Shorts 9:16 · 60s · SceneReel+ Blog (static .xyz + Duda .com)
storyboard → brief + scenes
social · Content Creation · ⟁ Nuntius
Content used to start from a blank
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
emerging tech · Artificial Intelligence · ⟁ Augur
AI was a buzzword you nodded at
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
emerging tech · TouchDesigner — realtime / generative visuals (the creative edge) · ⟁ Augur
Posting everywhere was a tab marathon
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
performance · Mobile App · ⟁ Mensor
Influencer deals were a guessing game
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
social · Build Log · ⟁ Nuntius
Shipped: a lead enrichment step
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
Email (Resend, owned list)
The day's note — EmailBlockStack · rendered at send
  • header 600×300 [html/image] · logo + nav; links live; dark-mode safe
  • 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

Thursday · open day →

brand · Email Hero GIF · ⟁ Signum
About three hours per cycle
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 1+ Email (Resend, owned list)
storyboard → brief + scenes
brand · Thanksgiving · ⟁ Signum
Grateful, on the record
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 12LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel+ Email (Resend, owned list) · SMS / MMS (Twilio) · Blog (static .xyz + Duda .com)
storyboard → brief + scenes
strategic relations · longform · ⟁ Nexus
What a family office actually asks
pending render
16:9 · YouTube (long-form)
cuts · 2YouTube Shorts 9:16 · 60s · SceneReel+ Blog (static .xyz + Duda .com)
storyboard → brief + scenes
strategic relations · Public Relations · ⟁ Nexus
PR used to be the spray-and-pray pitch
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
emerging tech · Augmented Reality · ⟁ Augur
AR was a gimmick with a dog
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
multimedia · HeyGen — the avatar / clone lane (a face that scales) · ⟁ Lumen
You paid a service to do this
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
emerging tech · Minus the Hype · ⟁ Augur
"AI = instant SEO content moat"
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
Email (Resend, owned list)
The day's note — EmailBlockStack · rendered at send
  • header 600×300 [html/image] · logo + nav; links live; dark-mode safe
  • 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

Friday · open day →

brand · Email Hero GIF · ⟁ Signum
One idea, nine outputs, one gate
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 1+ Email (Resend, owned list)
storyboard → brief + scenes
performance · Black Friday · ⟁ Mensor
Everyone runs the discount
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 12LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel+ Email (Resend, owned list) · SMS / MMS (Twilio) · Blog (static .xyz + Duda .com)
storyboard → brief + scenes
staff training · longform · ⟁ Magister
Roles that say what they do not
pending render
16:9 · YouTube (long-form)
cuts · 2YouTube Shorts 9:16 · 60s · SceneReel+ Blog (static .xyz + Duda .com)
storyboard → brief + scenes
brand · SMS GIF · ⟁ Signum
The map is yours
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 1+ SMS / MMS (Twilio)
storyboard → brief + scenes
strategic relations · Strategic Partnerships · ⟁ Nexus
Partnerships ran on gut and a handshake
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
emerging tech · Virtual Reality · ⟁ Augur
VR was a headset collecting dust
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
it dev · From n8n to typed Pydantic Python (workflows as structured data) · ⟁ Faber
Keeping up felt like drinking a firehose
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
it dev · Receipts · ⟁ Faber
210 threads. 1 schema.
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
Email (Resend, owned list)
The day's note — EmailBlockStack · rendered at send
  • header 600×300 [html/image] · logo + nav; links live; dark-mode safe
  • 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)
The day's text — SmsMms · rendered at send
  • 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

Saturday · open day →

brand · Email Hero GIF · ⟁ Signum
The nine-output method, end to end
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 1+ Email (Resend, owned list)
storyboard → brief + scenes
emerging tech · longform · ⟁ Augur
The broadcast stack, tested in public
pending render
16:9 · YouTube (long-form)
cuts · 2YouTube Shorts 9:16 · 60s · SceneReel+ Blog (static .xyz + Duda .com)
storyboard → brief + scenes
strategic relations · Event Coordination · ⟁ Nexus
Running an event was a spreadsheet swamp
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
emerging tech · Smart Contracts · ⟁ Augur
FFmpeg. Every video, every time.
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
multimedia · FFmpeg — the workhorse behind the media you love (run it locally) · ⟁ Lumen
Your data lived in someone else's box
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
performance · Affiliate · ⟁ Mensor
Commercials cost a small house
pending render
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
brand · Field Notes · ⟁ Signum
Editing 30 videos by hand
9:16 · TikTok · Instagram Reels · YouTube Shorts · Facebook Reels · Stories · Threads · Pinterest
pending render
1:1 · Instagram feed · Facebook · X/Twitter · Bluesky · LinkedIn feed
pending render
16:9 · YouTube · X card · LinkedIn video · Blog (embed)
cuts · 9LinkedIn 1:1 · 120s · LinkedInDocX 1:1 · 120s · XThreadCardYouTube Shorts 9:16 · 60s · SceneReelInstagram (Reels · feed) 9:16 · 90s · StoryReelFacebook (Reels · feed) 9:16 · 90s · SceneReelThreads 1:1 · 90s · SceneReelTikTok 9:16 · 60s · TikTokNativePinterest 9:16 · 60s · PinterestPinBluesky 1:1 · 60s · SceneReel
storyboard → brief + scenes
Email (Resend, owned list)
The day's note — EmailBlockStack · rendered at send
  • header 600×300 [html/image] · logo + nav; links live; dark-mode safe
  • 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