06-reference

sanity check bet architecture audit

Wed Apr 29 2026 20:00:00 GMT-0400 (Eastern Daylight Time) ·bet-architecture-audit ·status: canonical ·source: internal RDCO audit (Ray Data Co) ·by Ray (audit) + Ben Wilson (founder, decisions)

Sanity Check bet-architecture audit (2026-04-30)

Why this exists

Founder asked Ray to apply the four-layer RDCO bet-architecture playbook (2026-04-30-rdco-bet-architecture-playbook) to Sanity Check, the newsletter live at https://sc.raydata.co (production state v9.7.4 per ~/.claude/state/working-context.md). Squarely was the worked example; SC is the second bet to get the audit. Eat-our-own-dog-food: SC has more tooling surface than any other bet (most skills, freshest production deploy), so it’s the cleanest test of whether the playbook scales beyond the Squarely template.

The targeting systems

Layer 1: Targeting system

Exists — sub-process layer is well-articulated (revival-strategy.md sections 2-3: who reads it, what they get, voice, recurring formats, cadence). 1,000 True Fans is the explicit unit-of-success per Kelly. ⚠️ P&L layer is deferred-constraint — no economic targeting yet because the bet is pre-monetization by design (revival-strategy section 6: “do not monetize before issue 25 and 500 subscribers”).

Layer 2: Sensors / instrumentation

SensorStatusNotes
Resend send/delivery metricsWelcome email + (future) issue sends instrumented
Subscribe-form conversion (v9.7.4 Turnstile + cookie + dedupe)New + already-subscribed paths both return structured status; rate-limit 429 surfaced
Cloudflare Pages analytics (visits, top pages)⚠️ partialAvailable but not consolidated into a weekly snapshot
Reply rate (qualitative read)⚠️ manualFounder reads replies; no structured capture
Forward rate❌ GAPNo way to attribute forwards; would need referral-link or Resend-tracking
Open rate per issue❌ GAPResend supports open tracking but not yet wired into a per-issue dashboard
CTR per issue (which sections drive clicks)❌ GAPSame as above — not yet wired
Subscriber cohort engagement (true-fan core vs passive)❌ GAPNo segmentation; can’t tell if 1,000 True Fans target is being approached
Per-issue diagnostic (“which angle landed”)❌ GAPMost load-bearing missing sensor — the loop closer
Cost-routing discipline (SC-attributed costs)⚠️ partialxAI image gen tracked in working-context.md per-version; not aggregated

The honest read: SC has world-class production instrumentation at the subscribe surface (Turnstile, dedupe, cookie recognition, rate limit, audit-grade) but ad-hoc instrumentation on the actual newsletter loop (open/CTR/reply per issue). Subscribe form is over-instrumented; issue performance is under-instrumented.

Layer 3: Tools / actuators

ToolStatusNotes
Site build/deploy (Astro + Cloudflare Pages)v9.7.4 in production, 45s GH Actions build
build-landing-page skillFour-layer review loop; closed the design-quality gap
sanity-check-design skillBrand spec v0.3, palette + bento + sticker discipline
design-critic skillAutonomous critic; 9 structural rules (bento integrity, palette temp, sticker zones)
draft-review skillHook strength, tangible vs abstract, CopyThat patterns
voice-match skillCompares draft against archive
/research-brief skill3 angles + hooks + arc positioning; the Wed-before pipeline step
/remix skillLinkedIn + X thread + CTAs from published issue
/process-newsletter skillInbound newsletter ingestion (sources, not own pub)
Image generation (xAI grok-imagine)⚠️ workable$0.02-0.07/gen; quality “so-so but workable”; v8.1 + v9 doodles regenerated successfully
Mailing-list management (Resend audience API)GET-first dedupe pattern; idempotent
Cookie-based subscribed-state recognitionv9.5; FOUC-free swap
Bot protection (Turnstile + rate limit)v9.5
Issue-send pipeline (write → send → log)❌ GAPNo automated issue-send tool; the actual newsletter sending is still manual
Distribution multi-surface posting (LinkedIn + X)⚠️ partial/remix drafts but doesn’t post; manual LinkedIn copy-paste
Paid acquisition (X/LinkedIn ads for SC)❌ GAPpaid-ads skill exists but no SC campaigns running
Archive search/SEO surface⚠️ partialArchive page exists; SEO not audited; Vol I tile grid is curatorial not exhaustive
3 new research-brief tasks queued 2026-04-30🟡 readydbt-models-tickered + CTO-IC-inversion + kit-stage-AI-invisible — tool-layer assets ready for development
Recovered 5 SC essays via /sc-restore.py + Wayback dig🟡 readyContent assets ready for archive integration (Analytics Arcade + Silly Simple Question still pending Wayback)

Layer 4: Feedback loop

⚠️ Partial — under-formalized. What exists: founder reads replies qualitatively; design-critic runs structurally per design variant. What’s missing: per-issue post-mortem that asks (a) which hook/angle landed (open + reply signal), (b) which CTA converted (subscribe + click signal), (c) what to feed forward into next research-brief. Today’s loop is heroic-founder-reads-replies, not structured-diagnostic-to-experiment. The instrumentation gaps in Layer 2 (open rate, CTR, cohort engagement) are upstream blockers — you can’t formalize a feedback loop without the sensors that feed it.

The revival-strategy already specifies the loop shape (section 7: weekly metrics snapshot, monthly trend report, audience analysis), but those routines aren’t running yet.

Synthesis: load-bearing gaps

  1. Per-issue open/CTR/reply-rate dashboard (sensors layer) — the single most binding gap. Without it, the feedback loop stays heroic. Resend’s API supports it; needs a weekly snapshot routine, not new infra.
  2. Per-issue diagnostic → next-brief feedback loop (loop layer) — directly downstream of #1. Once sensors exist, formalize the “which angle landed → next research-brief input” cycle. /research-brief is the actuator already; it just needs the diagnostic input.
  3. Issue-send pipeline (write → send → log) (tools layer) — the actual newsletter delivery is still manual. v9.7.4 shipped the subscribe surface; the send surface is unbuilt. This is what makes #1 expensive — every issue is bespoke instead of templated, so per-issue metrics aren’t naturally captured.
  4. Subscriber cohort engagement segmentation (sensors layer) — the 1,000 True Fans target is unmeasurable without it. Lower priority than #1-3 because pre-launch the cohort is small enough to read by hand.
  5. Distribution actuator (LinkedIn + X auto-post or scheduled-draft) (tools layer) — /remix produces drafts; nobody schedules/posts them. Coupled with the X-voice mismatch feedback already in Ray’s memory — voice quality matters more than automation here, so this is a “formalize the loop” gap not a “build the bot” gap.

The coupled cluster is #1 + #2 + #3: sensor (open/CTR per issue) + actuator (templated send pipeline that auto-captures the sensor data) + loop (diagnostic feeds next brief). Building #3 in a way that emits sensor data for free solves #1 mechanically and unblocks #2. This is the SC analog of Squarely’s “Amazon ads sensor + actuator” coupled pair.

Modular-components mapping

GapModular component it buildsOther bets it pays off
Open/CTR per-issue dashboardEmail-engagement instrumentation (Resend webhook → DB → snapshot)Squarely (transactional emails to puzzle buyers); MAC (drip course); RDCO ops (any list mgmt)
Issue-send pipelineTemplated-send tool (write Markdown → Resend send → log delivery + opens)MAC drip course, Squarely customer-retention emails, future RDCO product launches
Distribution actuatorMulti-surface post-and-track (LinkedIn + X scheduled drafts → click attribution)MAC (LinkedIn primary), Squarely (X for indie-shop discovery), every public-surface bet
Cohort segmentationAudience-engagement segmentationEvery bet with a recurring audience touchpoint
Cost-routing disciplineCost-routing per bet (xAI gens, Resend sends, Pages bandwidth tagged to SC P&L)Already flagged as cross-bet need in playbook (Squarely audit too)

The high-leverage observation: gaps #1-3 build email-engagement-instrumentation + templated-send-tool, which are infrastructure for every future RDCO list bet (MAC drip, Squarely retention, any product launch list). The cross-bet payoff is strong. This is a load-bearing modular investment, not a single-bet local fix.

The cost-routing-per-bet component appears for the second time (also flagged in Squarely audit) — pattern confirmed: every bet’s P&L meta-layer needs cost-routing as table stakes. Worth building once at the RDCO ops layer.