Portfolio health snapshot — proposal sketch

Date: 2026-05-13 Pattern reuse: dare-pipeline GHA shape (cron → probe → narrator → render → deploy) Companion: audrey_dashboard_proposal_2026-05-13 Status: 🅿️ Sketched. Decision-stage. Build commits only if 80/20 says yes.


What you’d see — the daily snapshot

STASH4

Single-page, scannable in ~20 seconds. Narrator paragraph at the bottom for the “is anything quietly off?” read.


How it gets built — architecture

STASH5

Same shape as dare-pipeline. Only architectural addition: the multi-probe parallel fan-out (wrangler + CDN, security layer, and DNS provider sitting in front of dare.co.uk.">CF GraphQL + synthetic HTTP + capacity), then merge into one brief. The narrator pattern transfers directly.


Time and effort

Phase Outcome Effort
0 Inventory the surfaces; decide the probe set; mint any tokens still needed (CDN, security layer, and DNS provider sitting in front of dare.co.uk.">CF Analytics token already exists in Code Shared) ~30 min
1 MVP — probe.py fetches Worker deploy state + Pages last-deploy timestamps + GHA last-run status. Static HTML output, no narrator. ~2 hrs
2 Capacity numbers — R2 bucket size + object counts (wrangler r2 object list), D1 row counts (wrangler d1 execute), KV key counts. ~1.5 hrs
3 Synthetic API pings — curl -sI against Twilio / Anthropic / Resend / Shopify / TheDogAPI / Prodigi with timeout. Tracks 200/429/5xx. ~1 hr
4 Haiku narrator on the merged brief — “calm ops engineer” voice prompt. Threads numbers into a paragraph. ~1 hr
5 Cron schedule + GHA workflow + Pages deploy to a /health subpath of devreports.dare.co.uk ~30 min
Total Live daily-shipping portfolio health snapshot ~6.5 hrs

Spread across two evenings, you have a real surface. Phase 1 alone (~2.5 hrs total with Phase 0) gives you a bare-numbers snapshot — useful but not narrated.


What value it gives — concrete

Capability Value type Worked example from today’s session
Catch silent cron drops Operational The 6pm pickup-reminder cron got silently removed by today’s deploy from a stale branch; this would have flagged it at next-snapshot
R2 capacity trajectory Forward-looking dare-images at 2.1 GB today — knowing the daily delta tells you when to start thinking about Standard → Infrequent Access
Worker error rates Operational Catch a deploy that introduces silent 500s before customers do
Synthetic API health Defense-in-depth A vendor’s outage (Twilio incident, etc.) flagged here before it impacts users
GHA workflow health Operational Catch a workflow that’s silently failing after a yaml change
Narrator commentary Reading habit One paragraph per morning beats checking 8 dashboards
Cross-portfolio capacity awareness Strategic When dogwood + audrey + dare combined hit a tier limit, you see it coming

The recurring theme: every value here is “catch silent failures and capacity drift before they hurt.” That’s the operational genre — defensive, not generative.


What it costs

Component Monthly
CDN, security layer, and DNS provider sitting in front of dare.co.uk.">CF Analytics GraphQL $0
wrangler CLI (KV/R2/D1 reads) $0
Synthetic HTTP pings $0
Haiku narrator (5 variants × 1× daily × 365) ~$0.02/mo
GHA runner minutes $0 (under free quota)
CDN, security layer, and DNS provider sitting in front of dare.co.uk.">CF Pages $0
Total ~$0.02/mo

Same cost profile as audrey dashboard and dare dashboard — Haiku is the only paid component and it’s rounding error.


80/20 honest call

This is infrastructure work, not customer-facing value. Worth naming that directly.

Argument for building: - Today’s session surfaced two real silent failures (the worker.js Auth header in pre-flight + the 6pm cron drop on deploy). Both got caught by human attention; an automated snapshot makes attention scale. - Solo-founder operating across 7+ services manually doesn’t scale much past where you are now. - Same plumbing as audrey + dare dashboards — by project three the pattern is canonical, not bespoke. - Capacity-awareness is genuinely useful — knowing R2 trajectory before you hit a tier limit prevents a surprise.

Argument against building right now: - customer voice over internal tools says default-prefer outward-facing work. This is internal. - Audrey dashboard is unbuilt — it answers commercial decisions that grow the business. A health snapshot answers operational questions that protect the business. - At current footprint (~7 services, all in one Cloudflare account, you-as-sole-operator), the manual approach is barely tipping into pain. The pain isn’t compounding yet. - The dashboard.dare.co.uk + the dogwood narrator already give you partial signal. Building a third operational surface might be premature.

Senior-dev recommendation: park it as a sketch. The proposal IS the deliverable for now. Build resume signals are concrete:

Resume signal What it looks like
First post-cutover silent failure that costs >1 hour of debugging in the next 30 days Operational pain you’d-have-caught-with-this-snapshot crosses a threshold
Audrey dashboard ships and you want the same pattern for infra Operating habit established; copying becomes cheap
Footprint crosses ~12 services Manual visual checks stop being feasible
A client engagement asks for a similar health surface Build once, deliver to both portfolios

If none of those fire within 90 days, the disposition flips to gentle revisit — maybe a lighter version (just CDN, security layer, and DNS provider sitting in front of dare.co.uk.">CF deploys + GHA workflows, skip the narrator + synthetic pings).


Why park rather than just kill

The sketch + architecture is now committed to the catalog. Three values in keeping it:

  1. Future-me can resurrect cheaply — every probe + render decision is documented. Phase 0 is “read this report”, not “re-derive.”
  2. The pattern transfers — if a client engagement opens with “we need infra health visibility,” this proposal becomes the starting template. ~6.5 hrs to deliverable instead of ~2 days of re-thinking.
  3. The sketch itself adds value — naming what you’d see and what it would catch makes the current manual approach more deliberate. You now know which signals matter.

Open questions for Dan

  1. Audience. Just you (gated via CDN, security layer, and DNS provider sitting in front of dare.co.uk.">CF Access)? Or shareable with a future advisor/partner?
  2. Cadence. Daily after the dashboard cron, OR on-demand from a button, OR both?
  3. Alerting beyond the dashboard view. Email/SMS only on red? Quiet-by-default and you read the morning narrator?
  4. In-scope surfaces. The mockup includes 6 Pages sites + 3 Workers + 2 crons + 3 R2 buckets + 1 D1 + 1 KV + 6 external APIs. Is that the right inventory, or scope it down (skip Pages last-deploy timestamps, skip GHA workflow health)?
  5. Subdomain placement. /health subpath of devreports.dare.co.uk (cheap, gated) vs. a separate status.dare.co.uk (cleaner separation)?

Pattern connections


The best version of this sketch is the one that catches the next silent failure 90 days from now without ever being built. The second-best is the one that gets built when the build cost is half-paid by the proposal already existing.

Source: portfolio_health_snapshot_proposal_2026-05-13.md · Rendered 2026-05-13 15:13