Yesterday (2026-05-23T09:43:13Z) /newsletter built Agent Stack issue #027, saved the HTML to F:/TITAN/knowledge/staging/agent-stack-2026-05-23-issue027.html, then stopped at the Gmail-draft path instead of firing SES. Subscribers did not receive the issue. The journal explicitly logged the deviation; a feedback memo feedback_newsletter_gmail_vs_ses_routing_20260523.md was written 2 hours ago codifying the rule.
The root cause is already documented in a hot memo from 2026-04-27:
> project_newsletter_skill_ses_drift_20260427.md — "/newsletter skill still uses gmail_create_draft; scheduled task titan-daily-newsletter was migrated to SES on 2026-04-25 but the skill itself wasn't updated."
Confirmed today by direct read of F:/TITAN/skills/newsletter/SKILL.md:103-108:
### Step 5: Send
Use `mcp__*__gmail_create_draft` to create a draft to `harnoors@gmail.com`.
- Subject line: `[emoji] The Agent Stack #NNN — [curiosity-gap headline]`
- Content type: `text/html`
This bug has now misfired for ~27 days. Three daily newsletters (claude, agentic-ai, openclaw) wrote files to staging tonight but cannot be confirmed delivered without spot-checking SES logs.
File: F:/TITAN/skills/newsletter/SKILL.md lines 103-108
Mirror file: C:/Users/Harnoor/.claude/skills/newsletter/SKILL.md (same lines)
Write method: python F:/TITAN/scripts/titan_skill_writer.py (CLAUDE.md operating contract item 7 — Write/Edit prompts for approval on ~/.claude/ paths due to Anthropic bug #39523)
Replace the Step 5 block with:
### Step 5: Send via SES + Archive
1. Write the final HTML to `F:/TITAN/data/newsletters/newsletter-NNN-YYYY-MM-DD.html` (creates the durable archive).
2. Call `titan_email.send(subject=<line>, body=<plaintext_fallback>, html=<html>)`.
- Subject line: `[emoji] The Agent Stack #NNN — [curiosity-gap headline]`
- To: pulled from SES subscriber list (do NOT hardcode harnoors@gmail.com — that's the dev-loop, not the broadcast list)
3. Verify the response contains a `MessageId`. If it does not, raise — do NOT fall back to `gmail_create_draft`.
4. Increment `F:/TITAN/data/newsletter-counter.txt`.
Report: subject line, story count, MessageId, archive path.
Why these exact words:
MessageId check makes the SES path verifiable in stdout (feedback memo's rule).harnoors@gmail.com recipient prevents the dev-loop pattern from re-emerging.titan_email.send follow-up that the 2026-04-27 memo says "I had to manually invoke … to actually deliver."titan-daily-newsletter can drop its SES retry logic (out-of-scope for this proposal but unblocked by it).After patch lands:
1. Trigger /newsletter (or wait for tomorrow's titan-daily-newsletter scheduled run).
2. Confirm stdout includes MessageId: <ses-id> and archive: F:/TITAN/data/newsletters/newsletter-028-2026-05-25.html.
3. Inbox check on harnoors@gmail.com: issue #028 lands within 60s of run.
4. Metric: journal_2026-05-25.md "What I learned" section should NOT contain a Gmail-draft-vs-SES deviation entry.
5. Rollback signal: if SES MessageId missing two days in a row, revert and open a project memo on SES subscriber-list integration gaps.
audit-cadence.log chronic WARN (separate proposal).ANTHROPIC_API_KEY gap in F:/TITAN/server/.env (separate proposal — 3 batch jobs missed yesterday morning).