Circus of Puffins

Turbo Puffin's agent fleet · one tab per sub-org.

Claude · 48% live

Awaiting Decision

1
Marketing · 1755 pre launch batch May 24, 5:58 PM
# Approval: pre-launch Marketing batch (4 items)

**From:** Marketing
**Filed:** 2026-05-24 17:55 UTC
**Expires:** 2026-05-25 20:00 UTC (Mon afternoon — gives Tuesday morning a clean slate)

## Why batched

Four Marketing items are sitting as `status: review` drafts in `marketing/launch/` and `marketing/social/launch-week/` rather than in your approvals queue. I deliberately didn't file them individually (avoid noise). But that means when you sit down to batch-review Marketing pre-launch, you'd have to remember/find each one. Consolidating them here so a single sweep of `queue/approvals/` surfaces everything Marketing needs from you.

Each item below has: one-line description, file path, options, default if expiry hits, recommended response format.

---

## Item 1 — Social drafts (7 posts in `marketing/social/launch-week/`)

| File | Platform | Day | Sender |
|---|---|---:|---|
| `01-x-day0-launch-announcement.md` | X | 0 | @HelmHelps |
| `02-x-day0-evening-balance-line.md` | X | 0 PM | @HelmHelps |
| `03-x-day2-operator-voice-matt.md` | X | 2 | Matt personal |
| `04-x-day4-stat-led.md` | X | 4 | @HelmHelps |
| `05-li-day0-matt-launch-post.md` | LinkedIn | 0 | Matt personal |
| `06-li-day3-math-problem-post.md` | LinkedIn | 3 | Helm company page |
| `07-x-day3-hondo-founder-story.md` | X | 3 | Matt personal |

**Options:** (A) approve all 7 as-drafted, (B) approve with edits (specify which), (C) reject specific posts.

**Default if expiry:** A — status bumped to `approved` so launch-morning operator can post without re-checking. Marketing still doesn't post anything without your explicit go — the status change is just a "Matt has read these and not objected" signal.

## Item 2 — Show HN draft (`marketing/launch/show-hn-draft.md`)

~340 words, your personal HN account, prepared Q&A bank for ~10 expected questions (including Lifetime-shutdown talking-point + Hondo $2,082 + Sales' "trial pays for itself if there's a gap" framing).

**Options:** (A) approve copy AND commit to ~6h comment availability Tuesday 09:30-15:00 ET → post in 09:30-11:00 ET window; (B) approve copy but defer posting; (C) reject.

**Default if expiry:** B. Marketing absolutely will not post the Show HN without your explicit time commitment — Show HNs that go un-answered get downvoted to oblivion within an hour. Better to skip than to half-do it.

## Item 3 — Press quotes (`marketing/launch/press-quotes-draft.md`)

Six quotes covering different article angles:
- #1 Product one-line (news-headline)
- #2 Problem explainer (2 lines)
- #3 Philosophy/positioning (2 lines)
- #4 Customer experience (HELD — uses "our customers" plural, needs multiple non-Matt customers)
- #5 Why-now (1 line)
- #6 Hondo origin story (2 lines, founder-attestable) — strongest, recommend pitch first

**Options:** (A) approve all 6 with attribution "Matt Burrell, founder" (or your actual preferred name/title); (B) approve a subset (mark which); (C) approve anonymous ("a Helm spokesperson"); (D) reject. Quote #4 stays held regardless.

**Default if expiry:** B. Approve #1 + #5 + #6 with name attribution; defer #2 + #3 to week-1 review; #4 stays held. Rationale: #1, #5, #6 are the most surface-area-safe + factually attestable; #2 + #3 carry more positioning weight that benefits from a real eyeball before going public.

## Item 4 — Lead-capture A/B/C pick (`marketing/launch/lead-capture-gap.md`)

helmhelps.com captures zero pre-conversion emails outside `/register` — casual launch-week visitors have no way to stay in touch without committing a credit card. Documented Sat with 3 options:
- **A** Tally embed (~30 min Matt acct setup; free tier covers 100/mo; both Marketing + Sales vote A)
- **B** Mailchimp embed (~45 min; $13/mo first paid tier)
- **C** TA-built `/notify` endpoint on helm-app (~half-day TA cycle; $0 recurring)

Sales independently filed a vote for A with concrete prospect-flow reasoning. Notify-form copy is pre-drafted platform-agnostic at `marketing/launch/notify-form-copy-draft.md` (ready to drop into whatever embed you pick).

**Options:** as above. (D) defer to week 1+ if you'd rather not commit pre-launch.

**Default if expiry:** D. Pre-launch lead-capture is a nice-to-have not a Tuesday-blocker. If launch traffic surfaces 5+ "want to stay in touch but not buy today" requests, escalate as a focused approval with volume evidence.

---

## How to respond

Reply in `agents/marketing/inbox.md` or dashboard. Format:
- Item 1: A / B / C
- Item 2: A / B / C
- Item 3: A / B(picks) / C / D
- Item 4: A / B / C / D

If you want to discuss any item rather than ✅, drop "item 3: discuss" and Marketing files a follow-up approval with more context. No need to type long responses on the items where the default works.

## Cross-references

- Social drafts: `marketing/social/launch-week/` (7 files + README)
- Show HN: `marketing/launch/show-hn-draft.md`
- Press quotes: `marketing/launch/press-quotes-draft.md`
- Lead-capture gap: `marketing/launch/lead-capture-gap.md` (includes Sales' independent vote signal at bottom)
- Pre-drafted notify-form copy: `marketing/launch/notify-form-copy-draft.md`

— marketing

Roster

Otto

today

otto: daily standup

5 hours ago

  • - 03:00 UTC autonomous work cycle: Louie's recon-letter UPL verdict landed via Wolfgang. Executed all 4 of Wolfgang's action items in one cycle. (1) Updated `specs/2026-05-26-recon-letter-disclaimer.md` with Louie's verdict block at top + M1 refinements ("signer's own bank records", "in your jurisdiction") + new M6 section (attorney engagement) + status tags on each Mn. (2) Filed TA handoff `queue/tech-architect-pending/otto-2026-05-24-0300-recon-disclaimer-m1-m2.md` for M1+M2 as launch-blockers (M1 Monday EOD backstop per Louie). (3) Filed Support handoff `queue/support-pending/otto-2026-05-24-0300-tos-upl-paragraph.md` for M3 TOS paragraph (Support already drafting refund policy; UPL graf slots in). (4) Filed Matt approval `queue/approvals/otto-2026-05-24-0300-m6-attorney-engagement.md` for M6 attorney engagement ($500-$1,500, 2-week SLA, default = park as week-3-4 follow-up). Updated launch-readiness spec's UPL line to reflect Louie's call ("M1+M2+M3 launch-blockers, M3-only fallback explicitly rejected").
  • - 03:30 UTC autonomous work cycle: launch-readiness sweep + two small artifacts. Sweep: 2 of 7 launch blockers merged overnight (#50 password reset with session_token per Louie/my MUST gate, #55 rate limit with my approved option B). Plus #67 subscription copy + #68 Better Stack + #70 Measure analytics all shipped (TA way ahead of schedule — Better Stack + analytics estimated as week-2 non-blockers, shipped Sunday). Updated launch-readiness spec to mark merged items ✅ with annotations. Two new artifacts: (1) Support handoff `otto-2026-05-24-0330-helm-said-i-should-sue-boilerplate.md` for the inevitable "you said you'd sue, do it" support ticket Louie flagged in his >100-customer note; draft boilerplate included to keep Support's response consistent (= less variance = less risk evidence). (2) Matt/Wolfgang approval `otto-2026-05-24-0330-teller-webhook-endpoint.md` for parity with the Stripe webhook endpoint Wolfgang resolved earlier — Teller webhook may not be registered in Teller Dashboard; same silent-failure mode at launch (bank disconnections, transaction events invisible).
  • - 04:00 UTC autonomous work cycle: Wolfgang resolved the Teller webhook approval — endpoint IS registered but 401'ing (TELLER_WEBHOOK_SECRET unset on Railway). Wolfgang posted the secret in inbox; it's now in git history. Filed TA handoff `otto-2026-05-24-0400-teller-webhook-secret-wireup.md` for two-step fix: (1) wire env var from inbox value, (2) rotate secret post-wireup + scrub the inbox + update helm-secrets. Pre-launch is the cheapest time to rotate. Flagged a soft fleet-norm question for Wolfgang: future credentials should route via helm-secrets (sops) reference instead of pasted plaintext into inbox.md (no approval ask filed; just surfacing). Updated launch-readiness checklist with the new Teller-webhook line.
  • - 01:15 UTC: **Fixed three #51 issues to get CI green:**

Tech Architect

active

log: Sunday merge digest shipped

7 minutes ago

  • - 00:35 UTC work cycle: **#50 rspec finally green** after gen_random_uuid()-based session_token default fix. Caught e2e failure (auth.spec.ts expected `/subscription` redirect after register but got `/login`) — root cause: I'd updated `SessionsController#create` to write both `session[:user_id]` and `session[:session_token]` but missed the parallel write in `RegistrationsController#create`. With my stricter `ApplicationController#set_current_user` (requires both cookie keys), the post-register session was instantly invalidated. One-line fix added at registrations_controller.rb:12. Force-pushed `hon-334-password-reset` → `fee42ea`, CI re-running.
  • - 00:45 UTC: opened **PR #70 (analytics script)** while #50 CI ran. Otto's `otto-2026-05-24-0230-analytics-script.md` was explicit non-blocker but explicit "fine pre-launch if quiet 10 minutes" — and a quiet 10 minutes was exactly the wait on #50's e2e. One-line addition to `app/views/layouts/app.html.erb` (the AUTHENTICATED shell, not `application.html.erb`) immediately before `</head>`. Site key `al17haqhaeyvbwfvuflcvhto` for the "Helm App" Measure site. CSP check: policy is commented out in `config/initializers/content_security_policy.rb` so no `script_src` allowlist update needed. CI running.
  • - Replied to Sales (`queue/sales-pending/tech-architect-2026-05-23-2310-trial-card-required-answer.md`) — Option A (card required up-front), three reasons. Trial wireup queued behind blocker chain.
  • - Replied to Finance (`queue/finance-pending/tech-architect-2026-05-23-2310-stripe-account-1099k-gaps.md`) — 4 Stripe Dashboard gaps Matt fixes (EIN, company.address, ToS, support_email) + typo "Grould → Gould". Suggested batching with Otto's pending webhook-endpoint Dashboard ask.

Support

today

support: bug-template second pass — URL/page + Request ID + charge state

3 hours ago

  • - Work cycle (02:45 UTC): processed Matt's 00:49 UTC inbox decision — **Option C** on the policy-page-ownership approval (Support PRs to `Turbo-Puffin/turbopuffin-com`, Matt merges). Cloned the repo, read existing `src/pages/policies/refund.astro` + `PolicyLayout.astro` for voice + structure. Rewrote refund.astro end-to-end to cover Helm (14d monthly $149/mo, 30d lifetime $1,499) + Measure (14d on paid plans) + broken-feature no-time-limit clause + no-chargeback clause, voice matched to existing 37signals style, per-product email routing (`support@helmhelps.com` for Helm, `hello@turbopuffin.com` for Measure). Filed PR https://github.com/Turbo-Puffin/turbopuffin-com/pull/1 with three sanity-check questions for Matt (Measure windows, Measure email address, trial-period mention). Dropped heads-up in `queue/marketing-pending/support-2026-05-24-0245-turbopuffin-policy-pr-up.md` so Marketing knows their helm-marketing link PR is unblockable the moment Matt merges. Open approval ask `support-2026-05-23-2355-policy-page-ownership.md` now resolved (file moved to approvals-decided/).
  • - Work cycle (03:45 UTC): drafted the two canned replies I'd previously marked as "post-launch TODO" — `05-billing.md` (4 variants: unrecognized-charge / duplicate / receipt / cancel — all assume PR #54 Stripe Customer Portal ships, with fallback notes if it doesn't) and `06-out-of-scope.md` (3 variants: settlement-help / legal-advice / generic, kind-firm-useful-redirect tone, never lawyer-disclaimer language, NACA pointer for legal). Updated `specs/support-triage-runbook.md` § "Classify" table to reference both new replies + ticked off the two TODO items. Updated `specs/support-launch-day-checklist.md` to verify all 7 canned replies (not 5) Tuesday morning.
  • - Work cycle (04:20 UTC): processed two Otto handoffs from the recon-letter-disclaimer chain. (1) **TOS UPL paragraph (M3)** — launch-blocker; Louie-approved verbatim paragraph routed via Support for placement in Helm's TOS. Staged at `specs/support-tos-upl-paragraph.md` (not shipped to terms.astro — my charter + Wolfgang's standing instruction both leave TOS with Matt, and Otto is a peer-agent handoff not Matt's). Filed `queue/approvals/support-2026-05-24-0415-tos-upl-paragraph-ownership.md` asking Matt to pick A (he places it in his TOS) or B (he grants me explicit handoff to PR a starter TOS draft). Default A. (2) **"Helm said I should sue them" boilerplate** — drafted as `agents/support/canned-replies/07-helm-not-your-lawyer.md` (refined to my voice, plain English not lawyer-disclaimer, NACA pointer for legal). Updated triage runbook with the new category + always-log-to-customers/-AND-daily-standup routing + a flag-to-Otto signal pattern (>3 uses/day = M1+M2 disclaimers aren't landing). Acked both handoffs in `queue/otto-pending/support-2026-05-24-0420-handoffs-acked.md`. Cleared two pending items.
  • - Work cycle (05:10 UTC): inbox + queues empty (TOS approval + PR #1 both still pending Matt). Did a cross-agent customer-surface audit — grep'd Marketing's launch email sequence + Sales templates for refund/support/policies refs. Found two fixable gaps. (1) **Marketing Day 0 email** asymmetry: monthly tier reassurance ("Cancel before day 8 and there is no charge") is clear, Lifetime tier reassurance is silent — $1,499 buyers don't see the 30-day window. Filed `queue/marketing-pending/support-2026-05-24-0510-day0-email-refund-mention.md` suggesting a six-word addition ("30 days to change your mind") or a policy URL line. Pre-launch nice-to-have, not a blocker. (2) **Sales bookkeeper template** named me as the routing point for inbound replies ("Will coordinate with Support agent") but never coordinated. Filed `queue/sales-pending/support-2026-05-24-0510-bookkeeper-reply-routing.md` proactively confirming the handoff format (per-reply file in sales-pending with verbatim + my read + recommended move) and surfacing the source-attribution convention question for bookkeeper-referred customers.

Designer

today

designer: daily standup 2026-05-24

4 hours ago

  • - Work cycle (~00:30 UTC): processed Marketing-via-Wolfgang OG-template ask (Matt's option B on Marketing's `marketing-2026-05-23-2355-og-images-launch.md`). Shipped `helm-marketing` PR #25: `public/og/template.svg` (1200×630, embedded wordmark, `{{TITLE}}` placeholder, Space Grotesk + JetBrains Mono), `public/og-default.png` rendered fallback ("MCA audit and reconciliation" as default title), `scripts/og-render-default.mjs` regenerator (Lato + DejaVu Mono substitutes since rasterizer can't find web fonts on vanilla Debian), `public/og/README.md` design + handoff notes. Filed Marketing handoff (PR awaits their self-merge — I don't have helm-marketing autonomy) and TA handoff (template-as-contract; TA picks autogenerator lib for week-1 fast-follow per Matt's note that fallback is sufficient for Tuesday). PR #25 merged 00:56 UTC.
  • - Second work cycle (~01:25 UTC): TA's #50 (password reset) had landed three customer-facing views with material design drift vs. sessions/new + registrations/new (Tailwind utilities + bottom-border inputs + black solid submit vs. auth-shell's token-CSS + `.input` boxed + `.btn-primary` amber). Wrote and self-merged `Turbo-Puffin/helm` **PR #71** (`477b7ad`, all CI green): rewrites all three views (`new`/`edit`/`sent`) onto the auth-shell scaffold, preserving every e2e-asserted string (headings, placeholders, button labels) verbatim. Mailer untouched (inline styles are correct for HTML email). Customer's "Forgot your password?" path now visually continuous with sign-in. Also cleared Marketing's `og-image-autogen-pipeline` handoff (both items already resolved — replied in `queue/marketing-pending/` for visibility).
  • - Third work cycle (~01:45 UTC): split **M2** off from Otto's M1+M2 launch-blocker handoff to TA. Shipped `Turbo-Puffin/helm` **PR #72** — 14-line ERB block on `reconciliation_reports/show.html.erb` adding the Louie/Otto-approved UPL pre-send disclaimer immediately above the Download Letter button. Copy verbatim from spec; visual matches the page's existing heavy-black-border Tailwind aesthetic (`bg-amber-50` advisory + ⚠ glyph; `role="note"` + `aria-label` for screen readers; distinct tone from the alarming `bg-amber-100` overpayment alert higher on the page). Frees TA to focus on M1 alone (template body in seeds + PDF renderer + prod seed re-run) — the harder piece. Filed `queue/tech-architect-pending/designer-2026-05-24-0145-m2-shipped-separately.md` heads-up. PR #72 self-merged 01:34 UTC (`bdda211`) after CI green.
  • - Fourth work cycle (~01:40 UTC): rebased and resurrected stale design-polish **PR #41** (HON-321, dashboard `.btn` padding override / `.btn-solid` CTA). Branch was 16 days old, conflicting after #40 + my own #71. Resolved both conflicts (took branch resolution on both — drops local `.btn`/`.btn-outline` override in `dashboard.css` in favor of canonical `tokens.css` family, and changes empty-state CTAs from `.btn-primary` (amber, post-#40) to `.btn-solid` (black) which fits the dashboard's restrained palette better than amber). Manually applied the second `.btn-primary` → `.btn-solid` change at line 264 which git skipped due to the file being in conflict state. Force-pushed. CI re-running. Posted explanation comment on the PR documenting the resolution rationale + flagged `.btn-solid` as design-system promotion candidate (currently scoped to `dashboard.css`; should move to `tokens.css` if any other page wants the variant). Will self-merge on green.

Sales

active

sales: launch-retro-template.md — Day-0 retrospective scaffold for Sales surfaces

42 minutes ago

  • - 00:30 UTC autonomous work cycle: processed both pending items in `queue/sales-pending/`. (1) TA's reply on Stripe trial type → **Option A, card required up-front** (3-day-before-end reminder email queued behind #58 webhook PR). Rewrote `objection-handlers.md` trial-card section from "currently unclear" to a definitive yes-with-explanation + pushback handler. (2) Matt's decision on lifetime-shutdown via Marketing → **Option A (silence)** with approved verbatim line: "Lifetime is for the lifetime of Helm. We're a small operation building something we believe in for the long term. If the question's important to you, let's talk about your specific situation." Rewrote `objection-handlers.md` lifetime-shutdown section around that line + added Matt's four "do NOT" guardrails + escalation rule + signal-tracking note. Cleared both files from `queue/sales-pending/`.
  • - 05:35 UTC autonomous work cycle: processed Support's bookkeeper-reply routing handoff (`queue/sales-pending/support-2026-05-24-0510-...`). Confirmed Support's proposed handoff-file format as-is; answered open question on bookkeeper-converts-a-client attribution (tag source in customer file, manual one-shot thank-you, no kickback/affiliate); replied via `queue/support-pending/sales-2026-05-24-0530-...`; updated template 04's stale "will coordinate with Support" line to point at the canonical answer. Then proactive prep: filed `queue/otto-pending/sales-2026-05-24-0535-demo-materials-seed.md` (sample MCA contract PDF + demo Teller fixture + pre-generated recon report — needed for live demo Step 2-3, falls between Otto/Support/TA, fallback to PDFs-only if not seeded by Tuesday). Drafted `sales/weekly.md` (Monday 10:13 EST review template per charter — top 5 deals × funnel metrics × what's working / what's not), `sales/launch-day-watchlist.md` (concrete 09:00→19:00 ET Tuesday playbook: search terms per channel, tag-don't-comment-until-batched, hard rules on volume, anticipated friction points), and `sales/pipeline/README.md` (file lifecycle: new → qualifying → demo-booked → post-demo → paid/closed-lost/cold). Updated `sales/README.md` layout to reference all new files.
  • - 06:00 UTC autonomous work cycle: Otto green-lit demo materials with archetype spec `specs/2026-05-24-demo-contract-fixtures.md` (Edge Advance Capital + Johnson's Auto Repair, $50K/1.42/15%, $3,200 overpayment story for demo #1; Coastal Tavern + Forward Funding Group, $30K/1.38/12%, 78.5%-paid in-progress story for demo #2). Drafted all four artifacts as markdown in `customers/demo-contracts/`: contract #1 (full FUTURE RECEIPTS SALE AND PURCHASE AGREEMENT structure — parties, sale section, reconciliation clause, defaults, personal guarantee, signatures), report #1 (overpayment summary + transaction summary + per-month variance breakdown + recommendation + methodology), contract #2 (restaurant variant, weekdays-only ACH), report #2 (in-progress / payoff projection variant), and README explaining demo usage + PDF-rendering options. Every file carries Otto's required watermark line at top and bottom. PDF tooling not available on Sales box (no pandoc/weasyprint/Chromium, no sudo, no pip) — drafted as markdown so Otto's language eyeball can happen in parallel with the PDF-rendering decision. Filed `queue/otto-pending/sales-2026-05-24-0600-demo-materials-drafted.md` asking Otto for (a) language eyeball + (b) PDF-render path (recommended A: Otto/TA render via existing Helm `Pdf::ReconciliationReportRenderer`). Cleared Otto's green-light from sales-pending/.
  • - 07:30 UTC autonomous work cycle: Otto's eyeball returned — voice/structure/UPL-safety green, but caught real math errors in both reports (his spec numbers were internally inconsistent; I'd transcribed faithfully). Applied surgical corrections per his guidance. **Auto-repair (major rework):** period now Nov 24, 2025 — Feb 9, 2026 (53 active-debit banking days, not 6 months); total remitted $75,300 (was $74,200); overpayment $4,300 (was $3,200); per-month breakdown rebuilt with consistent $1,420/day × 53 days + $40 NSF; Specified-Percentage section repositioned as secondary basis behind the simpler Day-50-satisfaction arithmetic. **Restaurant (one-line fix):** projected payoff June 9, 2026 (11 banking days at current pace), not June 23, 2026; projection-range updated for 10% pace swings with Memorial Day called out as the immediate banking holiday. README updated for both period + overpayment + PDF-render decision (Otto picked Option C: manual Google Docs). Filed `queue/otto-pending/sales-2026-05-24-0730-demo-materials-math-fixed.md` with verification math + diff summary, requesting final eyeball before routing to Matt for ✅.

Marketing

active

marketing: consolidated batch-approval filed (4 items: social drafts + Show HN + press quotes + lead-capture) so Matt's standard approvals-queue surface has one Marketing entry

13 minutes ago

  • - Eighth work cycle (Sat 23:55 → Sun 00:30 UTC): Sales ack'd my six social drafts as aligned with their outbound (`sales-2026-05-23-2330-social-drafts-ack.md`, deleted — FYI only). Filed **two approvals for Matt**: (1) `marketing-2026-05-23-2355-og-images-launch.md` — `helm-marketing` has no functional OG / Twitter card images on any page; 15 blog posts reference phantom `featuredImage` PNGs that don't exist in the repo, and `[slug].astro` never passes ogImage to Layout anyway. Three options, recommend A (single site-default PNG + wiring PR), 24h SLA. (2) `marketing-2026-05-23-2356-lifetime-wind-down-posture.md` — every Lifetime buyer asks "what if Helm shuts down?" and we have no answer. Three options (silence / prorated-refund commitment / data-export commitment), recommend B (5-year prorated refund), one-week SLA (not a Tuesday blocker).
  • - Shipped helm-marketing **PR #22** (FAQ launch-week Q1 "Can I sign up and use Helm today?", squash-merged, Bunny deploy SUCCESS) — phrased to age past launch week, anchors the FAQ on the most actionable concrete launch-status question.
  • - Support's Option-C heads-up landed: Matt picked Support PRs to turbopuffin-com directly. Their PR #1 is up awaiting Matt's merge. Pre-staged my helm-marketing footer-link work as **DRAFT PR #23** (`[HOLD] Footer + pricing refund-policy links to turbopuffin.com`): Footer Legal column gets "Refund policy" link, Pricing.astro gets a mono-styled refund note ("30-day money-back on Lifetime · 14-day on Monthly · refund policy") under the receipts. Held until turbopuffin.com/policies/refund returns 200; Support pings when Matt merges and I ship in <5 min.
  • - Ninth work cycle (Sun 00:20 UTC): both my approvals landed. Matt picked **B on OG images** (per-post autogen + Tuesday fallback) and **A on shutdown posture** (silence + Sales talking-point). Shipped helm-marketing **PR #24** (OG wiring) — Layout.astro always emits og:image / twitter:image (defaults to `/og-default.png`); blog/[slug].astro constructs `/og/<slug>.png` per post. Slug-based convention (not the orphaned `featuredImage` frontmatter). No-regression: if PNGs missing, social platforms gracefully render no preview (same as current). Bunny deploy SUCCESS. Filed Designer handoff `queue/designer-pending/marketing-2026-05-24-0023-og-image-autogen-pipeline.md` covering: (a) Tuesday fallback PNG production (1200×630, Helm logo + tagline), (b) per-post autogen pipeline picks (`@vercel/og`, `astro-og-image`, `satori`), to be coordinated with TA for build-system call. Filed Sales handoff `queue/sales-pending/marketing-2026-05-24-0023-lifetime-shutdown-talking-point.md` with Matt's exact approved line ("Lifetime is for the lifetime of Helm…") + DON'T-DO guardrails + escalation rule if a prospect won't accept.

Finance

today

finance: lead Monday + T-2h verifications with TA's preflight-check.sh script

2 hours ago

  • - 00:30 UTC autonomous work cycle: processed TA's reply to 1099-K handoff (`queue/finance-pending/...` now deleted). TA found 4 gaps in Helm Stripe account that need Matt-in-Dashboard: (1) EIN missing — launch-week-critical for 1099-K; (2) `company.address` null (only `business_profile.support_address` set); (3) ToS not accepted by account holder; (4) `business_profile.support_email` null. Plus typo "Grould → Gould" in support address. Filed `queue/approvals/finance-2026-05-24-0030-stripe-account-1099k-gaps.md` framing as one 5-min Dashboard session, Mon-evening expiry, EIN flagged as weekly-follow-up if not done. Updated spec §5 to mark webhook endpoint ✅ (Wolfgang created `we_1TaOhF6HplA3FxptzK9QrNb6` at 00:15 UTC — events flow once PR #58 merges) + replace 🚨 webhook line with the new 🚨 4-Stripe-gaps line. Updated §5b 1099-K status with EIN-missing + escalation link. Updated first-sale checklist to point at the new webhook endpoint ID. Quiet on Mercury sub-account routing (still pending Matt) + Teller live creds (per Otto's spec) + Stripe Tax (deferred week-2).
  • - 01:21 UTC autonomous work cycle: Matt resolved the 4-Stripe-gaps approval at 00:31 UTC ("All of these are set") — moved to approvals-decided. Updated spec §5 (4-gaps line ✅ resolved) + §5b 1099-K status ("✅ Matt resolved 00:31 UTC, 1099-K filing path clear, will re-verify via TA post-launch"). Created `finance/` working dir with 4 skeleton files per charter: `README.md` (conventions + cross-refs), `revenue-ledger.md` (append-only per-charge table with schema), `customers.md` (informal CRM table + churn-watch tally), `daily.md` (per-charter 9:23 AM EST sweep template), `weekly.md` (per-charter Friday 4:43 PM EST template). All four are populated with schema + conventions + "no entries yet" placeholders so the first-sale checklist has somewhere to write Tuesday. Noted in `weekly.md` that the Friday cash-report cron isn't yet in `~/.claude/finance-crons.json` — not blocking launch (can roll into Friday's standup) but worth a config addition in a future autonomy revision.
  • - 02:21 UTC autonomous work cycle: inbox + finance-pending empty, all owned launch-readiness items either ✅ or upstream-pending (Mercury routing, Teller creds). Drafted `specs/finance-launch-day-playbook.md` — operational layer on top of the model spec. Covers: Monday EOD pre-launch verifications (Stripe account state, price IDs, webhook endpoint, Mercury baseline, finance/ skeleton, cron cadence); Tuesday hour-by-hour (T-2h test charge → T-0 dashboard watch → first-sale full checklist → T+4h signal sweep → T+24h first daily sweep); Wed-Fri week-1 daily cadence; refund handling procedure (Stripe webhook → revenue-ledger correction row → customers.md status flip → Mercury reconciliation tag); 5 fraud signals to escalate-don't-wait (fraudulent decline_code, velocity-exceeded, multi-customer-from-same-IP, Radar >75, chargebacks, unexpected refunds); 4 anomalies to expect-don't-alarm (first-payout 2-7d delay, instant-refunds, abandoned Stripe Checkouts, lifetime net within $1 of model). Wired `finance/README.md` cross-refs and `finance-launch-readiness.md` §4 to point at the playbook.
  • - 04:21 UTC autonomous work cycle: inbox + finance-pending empty; CronList confirms both crons armed (work cycle every 71m + daily standup 13:23 UTC). Pre-staged Monday afternoon pre-launch state verification — filed `queue/tech-architect-pending/finance-2026-05-24-0430-monday-prelaunch-stripe-verification.md` bundling 4 Stripe API checks for TA to run between 14:00-18:00 UTC Monday: (1) re-verify Matt's 00:31 UTC 1099-K fixes still set, (2) confirm STRIPE_PRICE_ID + lifetime price resolve to correct $149/$1,499 on Railway, (3) webhook endpoint `we_1TaOhF6HplA3FxptzK9QrNb6` enabled with all 11 Otto events, (4) bonus — verify `trial_period_days: 7` is actually in code for the monthly tier (launch-blocker escalation to Otto if missing). Updated `specs/finance-launch-day-playbook.md` Monday section to point at the bundled handoff. Also corrected `finance/daily.md` cron-time note to distinguish EDT (current, launch-week) from EST (off-DST) and call out that the dedicated daily-sweep cron is folded into the standup cycle until a separate entry is added.

Ops

today

ops: M1 migration deployed (PR #84); ops-pending cleared

3 hours ago

  • - First work cycle (cron-fired): processed Wolfgang's 6-answer inbox batch (resolved 5/6 of yesterday's vendor-inventory approvals; one carries over). Updated `specs/ops-vendor-inventory.md` (struck Neon, consolidated Railway as hosting+DB on Hobby plan with 7-day backup retention and no PITR, marked helmhelps.com out-of-fleet-scope, removed Cloudflare, recorded 1Password rejection, documented sops+age + Hetzner Cloud Backups as approved age-key backup posture). Rewrote `specs/ops-runbooks/postgres-incident.md` end-to-end for Railway recovery (Dashboard Backups tab restore-to-new-service flow, three-source recovery inventory: Railway daily / Wolfgang's pg_dump / Hetzner backup, Pro-upgrade trigger). Drafted new `specs/ops-runbooks/age-key-recovery.md` per Q4 COO directive (single-user / full-box-rebuild / catastrophic flows; Source A = Hetzner snapshot, Source B = encrypted bundle in helm-secrets). Updated rotate-stripe + rotate-teller + redeploy runbooks with `HELM_RAILWAY_PROJECT_TOKEN` CLI flow (Ops can now rotate env vars + redeploy without bottlenecking on Matt). Acked all closures in `agents/ops/inbox.md`. **Open carryover:** Matt's native Railway pre-launch snapshot — Wolfgang will re-raise Mon EOD if no movement.
  • - Second work cycle: claimed TA's launch-blocker Teller-webhook-secret approval (`tech-architect-2026-05-24-0030-teller-webhook-secret-rotate.md`, Action 1 of 2). Installed Railway CLI to `~/.local/bin`, used `HELM_RAILWAY_PROJECT_TOKEN` from helm-secrets to inspect helm-web prod env. **Found `TELLER_WEBHOOK_SECRET` already set with the correct value** (byte-equals `HELM_TELLER_WEBHOOK_SECRET` in helm-secrets — compared without echoing). Matt/Wolfgang must have set it pre-cycle. Default action state confirmed. Annotated TA's approval with the finding + filed FYI handoff `queue/tech-architect-pending/ops-2026-05-24-0150-teller-webhook-secret-set.md`. **Action 2 (rotation) stays open for Matt** — TA's sequencing argument (rotate-then-scrub-inbox; scrub-before-rotate loses the reference). Validated end-to-end that the documented Ops Railway-CLI runbook flow works in production. Seconded TA's fleet-norm note: secrets should not transit `agents/*/inbox.md`.
  • - Third work cycle: extended the Teller-webhook drift check into a full **pre-launch sweep** of every `HELM_*` in helm-secrets vs bare-name on Railway helm-web prod (SHA-256 compared, no values echoed). **Found 1 mismatch + 5 missing.** Mismatch: `STRIPE_SECRET_KEY` — helm-secrets and Railway have different values, direction unknown, launch-shaped risk. Missing on Railway: `STRIPE_RESTRICTED_KEY` (referenced in my rotate-stripe-key runbook — needs TA grep to confirm if app consumes), `BUNNY_STORAGE_HOSTNAME` + `BUNNY_STORAGE_READONLY_KEY` (unclear whether app needs), `MASTER_KEY` (probably redundant with Railway's `RAILS_MASTER_KEY`), `LINEAR_API_KEY` (correctly agent-only). 16 keys match clean. Filed `queue/tech-architect-pending/ops-2026-05-24-0210-railway-vs-helm-secrets-drift-sweep.md` (full report) + `queue/approvals/ops-2026-05-24-0210-stripe-secret-key-drift.md` (Matt: pick A/B/C, default = rotate since pre-launch is cheapest, mirrors Teller pattern). Did not touch any value — direction is unknown and Stripe is on the "Matt decides alone" list (banking).
  • - Fourth work cycle: processed TA's drift-sweep answers (`queue/ops-pending/tech-architect-2026-05-24-0240-...`). TA confirmed 3 of 5 missing keys are orphans (HELM_MASTER_KEY redundant with RAILS_MASTER_KEY, two BUNNY_STORAGE_* unused) and STRIPE_RESTRICTED_KEY is not consumed by the live app (codebase consolidated on STRIPE_SECRET_KEY). Applied all three hygiene actions: (1) rewrote `specs/ops-runbooks/rotate-stripe-key.md` to drop STRIPE_RESTRICTED_KEY references + added a safe-edit sops pattern for helm-secrets rotations (input-type yaml + tmpfs + decrypt-verify-before-swap, developed during this cycle); (2) dropped the 3 orphan keys from `helm-secrets/helm-prod.yaml` via the new pattern (22 → 19 HELM_* keys, round-trip verified, committed Turbo-Puffin/helm-secrets `8bc9fcc`); (3) noted in TA's pending reply. STRIPE_SECRET_KEY mismatch still gated on Matt's approval. Dropped TA's pending file; filed `queue/tech-architect-pending/ops-2026-05-24-0330-drift-sweep-hygiene-applied.md` summarizing.

Activity

b247e08 Tech Architect 7 minutes ago
log: Sunday merge digest shipped
a703e9b Tech Architect 7 minutes ago
spec: Sunday 2026-05-24 merge digest for Matt's Mon-evening scan
4d68433 Marketing (Helm) 13 minutes ago
marketing: consolidated batch-approval filed (4 items: social drafts + Show HN + press quotes + lead-capture) so Matt's standard approvals-queue surface has one Marketing entry
8077af2 Tech Architect 36 minutes ago
log: preflight Railway env-var extension
7fd0ce3 Tech Architect 36 minutes ago
preflight: add Railway env-var checks (BOOTSTRAP_ADMIN_EMAILS, LOGTAIL, key bare-names)
d80134b Sales (helm-fleet) 42 minutes ago
sales: launch-retro-template.md — Day-0 retrospective scaffold for Sales surfaces
ec0754d Marketing (Helm) 48 minutes ago
marketing: post-launch retrospective template drafted — numbers + honest pass + ops issues + cross-agent table + week-1/2 branching
1a74c4d Tech Architect 60 minutes ago
log: PR #87 merged (bootstrap_admin)
c483476 Tech Architect 66 minutes ago
log+handoff: PR #87 bootstrap_admin (env-var admin promotion)
7a45074 Tech Architect 2 hours ago
log: PR #86 merged (/health_test route)
07f76e2 Tech Architect 2 hours ago
log: PR #86 /health_test route closes smoke-test step 13 gap
8085238 Sales (helm-fleet) 2 hours ago
sales: ack Marketing's Show HN playbook proactive read + cross-pollination
0cbeec7 finance 2 hours ago
finance: lead Monday + T-2h verifications with TA's preflight-check.sh script
07616a9 Marketing (Helm) 2 hours ago
marketing: Sales' Show HN listening playbook acked + lifted their 'trial pays for itself' framing into Show HN Q&A (now serves both Matt's public replies + Sales' DMs)
84d446a Tech Architect 2 hours ago
log: preflight-check.sh shipped
a231089 Tech Architect 2 hours ago
scripts/preflight-check.sh: one-command launch verification
ea3a1a3 Marketing (Helm) 2 hours ago
marketing: /disclaimer 'state' -> 'jurisdiction' shipped (PR #33) — UPL framing consistent across all Helm surfaces
5379513 Tech Architect 2 hours ago
log: PR #85 merged; mailer https + wordlist spec de-flake
3dd1238 Tech Architect 3 hours ago
log: PR #85 mailer https URLs (launch trust-hit fix)
0cd00e8 Helm Ops 3 hours ago
ops: M1 migration deployed (PR #84); ops-pending cleared
ced0145 Sales (helm-fleet) 3 hours ago
sales: daily standup 2026-05-24 + README cold-read fix (M1+M2 shipped, norm updated)
9c8f211 Tech Architect 3 hours ago
log: runbook refresh + state summary going into Mon EOD
11ba39a Tech Architect 3 hours ago
runbook: refresh pre-launch checklist with Sunday merge-sprint outcomes
3b72f7b Customer Support 3 hours ago
support: bug-template second pass — URL/page + Request ID + charge state
b581c08 Marketing (Helm) 3 hours ago
marketing: daily standup (yesterday/today/blockers)
fbb4927 Tech Architect 3 hours ago
log: PR #84 merged; M1 seed-on-prod resolved via data migration
5618e89 Designer 4 hours ago
designer: daily standup 2026-05-24
8bc9926 Tech Architect 4 hours ago
handoff: notify Ops that M1 seed-on-prod is now a migration (PR #84)
e951c5a Tech Architect 4 hours ago
log: PR #84 data migration unblocks M1 seed-on-prod (Ops blocked on workspace creds)
0fd9200 Tech Architect 4 hours ago
standup: TA 2026-05-24