daily-6-pager
The morning Pi-CEO 6-pager — every senior agent's prior-cycle output composed into one page the founder can read in 10 minutes.
Why this exists
Sahil Lavingia (Gumroad) and the Collisons (Stripe) both built their solo-CEO leverage around the daily 6-pager. The founder reads, comments, doesn't synchronously discuss. Pi-CEO automates the production of that artefact.
Each senior agent (CFO / CMO / CTO / CS) writes its own snapshot to a per-bot jsonl ledger every cycle. The 6-pager assembler reads the last per-business row from each ledger, runs the same detect_breaches + assemble_daily_brief functions the senior bots use internally, and stitches the output into a 6-page composition.
Page structure
📋 Pi-CEO daily 6-pager — {date}
1. 💰 CFO daily — burn / runway / NRR / GM / spend gate queue
2. 📈 CMO daily — LTV:CAC / CPA / channel mix / ad-spend gate queue
3. ⚙️ CTO daily — DORA quartet / p99 / uptime / production PR queue
4. 💬 CS daily — NPS / FCR / GRR / first-response / refund queue
5. 🧠 Margot insight of the day — latest deep-async / topic / ts
6. 📱 RA-1842 (iOS release) — state / last update / note
—
React 👍 to ack · ❌ to flag · ⏳ to defer per section.
Trigger
| When | What |
|---|---|
Cron 06:00 UTC (configurable per-business via TAO_SIX_PAGER_HOUR_UTC) |
assemble_six_pager() → pii_redactor.redact() → draft_review.post_draft() to REVIEW_CHAT_ID |
Founder Telegram intent "6-pager" / "brief me" / "daily picture" |
CoS bot routes to assemble_six_pager() and replies with the result |
| B3 Voice Mode (RA-1866) | After assembly, optionally produce a voice variant and send via telegram-bot/voice_handler.py |
Implementation
swarm/six_pager.py:assemble_six_pager(repo_root=None, date_str=None) -> str
├── _cfo_section — reads .harness/swarm/cfo_state.jsonl
├── _cmo_section — reads .harness/swarm/cmo_state.jsonl
├── _cto_section — reads .harness/swarm/cto_state.jsonl
├── _cs_section — reads .harness/swarm/cs_state.jsonl
├── _margot_section — reads .harness/margot/insights.jsonl
└── _ra_1842_section — reads .harness/ra-1842-status.json
Each section degrades gracefully when its upstream ledger is missing (returns a one-line "no recent snapshots" placeholder rather than failing the whole brief).
Safety bindings
- pii_redactor in front of every send. Names, emails, vendor strings flow through redaction.
- draft_review HITL gate — never auto-sent.
- Kill-switch aware — daily fire is queued (not sent) on
TAO_SWARM_ENABLED=0. - Read-only. No SDK calls, no external API calls. Pure file-read composition.
When NOT to use
- Real-time triage — that's CoS bot via
intent_router.py - Per-bot deep-dive — open the relevant senior-agent's own jsonl ledger directly
- Marketing artefact production (campaign copy, landing pages) —
marketing-orchestratorfamily - Code generation / PR creation —
pipeline.py+tier-orchestrator
Verification (Wave 4 A5)
- With all four senior-agent ledgers populated, brief assembles in <2s
- Missing CFO ledger →
_cfo_sectionemits placeholder, brief still renders - Missing Margot insight → section emits placeholder, brief still renders
- Missing RA-1842 status → section emits placeholder, brief still renders
- Page is composable into a Telegram message (≤4096 chars) — caller may need to chunk; assembler does not enforce length
References
- Blueprint:
~/Pi-CEO/Senior-Agent-Operations-Blueprint-2026-05-02.md§"Solo-CEO leverage patterns" (the 6-pager paradigm) - Parent ticket: RA-1863 (epic RA-1858)
- Composes:
swarm/cfo.py·swarm/cmo.py·swarm/cto.py·swarm/cs.py - HITL gate substrate:
swarm/draft_review.py - Voice variant (Wave 4 B3): RA-1866