← The Helm

<!-- Seeded 2026-06-06 (cold start, spec §2 + Implementation order step 3). Two sources, strict provenance: (a) td export — only where the export logged decision reasoning verbatim. Cited as docs/archives/td-export-2026-06.md (<td-id>). (b) Recent voice logs (2026-05-* and 2026-06-*) — only genuinely decision-shaped POVs (explicit choice + rationale), not mere opinions or RC product-grooming micro-calls. Cited as voice/<file> <time>, with the original [[tags]] copied. No quote → no entry. Append-only going forward. Reversals append a Supersedes: line, never edit the prior entry. -->

2026-06-06 — [[td]], [[vigil]], [[implementation]] Retire personal/root td; replace with vigil-harvested open-loops + decisions

Decision: Retire td from the human-facing personal/root loop and replace it with a harvest model — vigil maintains open-loops.md and decisions.md, compiled from raw layers (voice/, sessions/) with no human capture ceremony. RC workspace td is out of scope and stays. Why: "I find the td concept a little outdated though. I rarely use it." (2026-06-05 22:24) → "ok spec it properly" (2026-06-05 22:28) → "ok review the spec with codex, then implement it (all in subagents)" (2026-06-06 21:53). td died of entry ceremony; the same information now accumulates as a byproduct of voice/session capture. Source: voice/2026-06-05.md 22:24, 22:28; voice/2026-06-06.md 21:53

2026-06-06 — [[td]], [[open-loops]], [[telegram-bot]] Fold codex fixes into td-retirement v2; explore durable telegram transcript store

Decision: Accept all codex review fixes into the td-retirement spec (including the simplified single-ledger decisions for Phase 1), and open exploration of a durable telegram transcript store as a raw harvest layer. Why: "ok fold it in, and should we also explore a durable telegram transcript store?" Source: voice/2026-06-06.md 21:34

2026-06-05 — [[exit-strategy]], [[sanjeev-email]], [[valuation]] Set the board sale range at $2–2.5M, anchored to net ARR

Decision: Tightened the Sanjeev/Piyush board email range from $2–3M to $2–2.5M after confirming real net ARR ≈ $2.08M ($2M = 1× net, $2.5M = 1.2× net). Held the line against Dinesh's "make the numbers look the way we want" framing. Why: "$3M (1.44× net) was the generous end that needs a growth story we don't have... the dilution math (SAFE repaid first + 1× participating preference) produces Sanjeev's likely 'no' honestly, so no skew needed, and Zach carries the exposure since it's his name on the email." Source: voice/2026-06-05.md 22:34

2026-06-05 — [[exit-strategy]], [[influencerhero]], [[board]] Written-acceptance gate before engaging any buyer

Decision: Operationalize a written gate — Sanjeev + Piyush must confirm in writing they're comfortable transacting around the stated range before anyone engages a buyer like IH; otherwise hold. Why: "before any of us put time into a process, I'd want to confirm you're both comfortable transacting around there" and "if you're not, my read is we're better off holding and coming back to it later from a stronger position." Source: voice/2026-06-05.md 15:46

2026-06-05 — [[reid]], [[learnings]], [[principles-over-rules]] Extract principles, not numeric rules, from retro learnings

Decision: Encode the why behind an observed edit as a transferable principle rather than a one-off numeric mandate (e.g. avoid "Max 2 stats per slide"). Why: "Can we extract principles rather than hard rules like 'Max 2 stats per slide'" — "Principles transfer; rules overfit." Source: voice/2026-06-05.md 21:46

2026-05-29 — [[piyush-1to1]], [[exit-strategy]], [[ai-rebuild]] Build continues through Q3; sell together; AI on the website now

Decision: After the Piyush 1:1 — (1) continue the rebuild through the Q3 checkpoint (don't sell at today's $2–2.9M); (2) sell together, no solo channels (Piyush offered to buy out Sanjeev to clear the cap table); (3) put AI on the website now. Why: Piyush: selling at today's $2–2.9M "is not even worth anything"; his floor "$500–700K → ~$7M exit target." The one demand that overruled Zach's stance: "put AI on the website now — 'must have', rejecting Zach's 'AI isn't a differentiator' line." Open risk Zach flagged: the $7M SAFE-trigger threshold is unverified. Source: voice/2026-05-29.md 15:51

2026-05-22 — [[anafore-exit]], [[ma-doctrine]], [[no-half-engagement]] M&A doctrine: commit fully or don't engage

Decision: Set a durable M&A doctrine for the current stage — decline inbounds (door-open) rather than run a part-time, single-buyer process on an unoptimized company. Why: "Entertaining these sort of requests now is a trap - sucks up time, and anchors valuation on an unoptimized company, and also doesn't force a bidding war... If we want to do this, I'd prep the company aggressively for this, engage multiple potential buyers at once, do this full time." Three rules: bilateral negotiation captures a fraction of auction value; engaging before optimization anchors low; M&A can't be run part-time alongside CEO duties. Source: voice/2026-05-22.md 14:06

2026-05-22 — [[anafore-exit]], [[ih-indication-error]], [[framing-discipline]] Treat a buyer's cash capacity as a ceiling, never a valuation

Decision: Never use a buyer's capacity figure (cash on hand / fund mandate) as a valuation comparison anchor; use only the realistic post-DD binding offer. Why: "IH's $5.4m is just an indication of their cash position, it is not an indication of how they value us or how much they are willing to pay for us." Realistic post-DD offer is typically 20-40% below the opening capacity figure. Source: voice/2026-05-22.md 14:23

2026-05-22 — [[product-monitoring]], [[codebase-first]], [[resource-scarcity]] Codebase reading replaces engineering consults during build

Decision: Default to reading the RC codebase for source-of-truth / schema / canonical-pattern questions instead of deferring to Glenn or other eng leads; reserve engineering for actual ownership transitions or genuinely opaque infra. Why: "Let's not rely on 'Defer to engineering / glenn for expert opinions', resources are scarce and we have direct access to the codebase here." Source: voice/2026-05-22.md 13:57

2026-05-22 — [[the-arsenal-archives]], [[news-feed-spine]] TAA is a high-quality football news feed; player surfaces are features on top

Decision: Scope TAA v0 as a high-quality football news feed (the spine), with off-pitch human-interest and player deep-dives as layered features, not the center of gravity. v0 anchor = J1 (catch-up scan) + J2 (off-pitch). Why: "It still is a news feed but a high quality feed... your ABCD - are just features of the site. Among ABCD, i'd say A and B and C maybe." Locked at 2026-05-24 14:18: "let's go with 1." Source: voice/2026-05-22.md 22:18 (anchor lock voice/2026-05-24.md 14:18)

2026-05-22 — [[the-arsenal-archives]], [[quality-definition]] Quality = source trust (deterministic) × originality (LLM)

Decision: Define TAA content quality on two ranked axes — Originality (first-hand, new info) and Source trust (Ornstein/Romano/Athletic/official) — pairing one cheap deterministic signal with one expensive corpus-comparison signal. Why: "1 and 3" (Originality + Source trust). "source trust is the cheap deterministic signal... originality is the expensive AI signal." Combined score = source_trust × originality. Source: voice/2026-05-22.md 22:23

2026-05-22 — [[monthly-overview-sheet]], [[redshift-as-source-of-truth]] Overwrite historical months with current Redshift values

Decision: Make the Monthly overview sheet a live Redshift view, not a snapshot archive — overwrite drifting historical months on each refresh. Why: "overwrite with current Redshift values... Decision posture: prefer freshness over preservation of historical-snapshot integrity." (Refunds mutate invoices.amount in-place, so historical revenue legitimately drifts.) Source: voice/2026-05-22.md 15:25

2026-05-21 — [[active-product-pilot]], [[csm-bandwidth]] Deliver the pilot via agent automation, not CSM outreach

Decision: The active-product pilot must deliver intervention through the referral-expert agent's own automation (chat + tools + merchant approval), ruling out human/CSM-delivered shapes. Why: "Let's rely on automated testing instead of CSM outreach, they are stretched already as it is." Source: voice/2026-05-21.md 11:06

2026-05-20 — [[anafore-exit]], [[ih-modeller]], [[scenario-shape]] Scenario presets must bracket the downside, mapped to waterfall thresholds

Decision: Drop the optimistic preset, add a Decline preset, and annotate each preset with the structural waterfall threshold it crosses. Why: "Drop optimistic" (the $4M ARR case "was the most fictional"). "Will 2.6M ARR with 0% growth actually get a 1.5x Multiple on revenue?" — the floor (Decline) needs to be a real preset, not a default-off state. Source: voice/2026-05-20.md 15:02 + 14:58

2026-05-19 — [[data-monitoring]], [[referral-first]], [[depth-vs-breadth]] Build monitoring deep on Referral first, then expand multi-product

Decision: Build the monitoring + derived-tables stack to Referral depth first, expanding to Loyalty/Affiliate/Moments sequentially after the pattern is proven (chose depth-first Option α over shallow-across-4 Option β). Why: "I'd actually go with A. Then do multi product. You are right - it is the biggest source of revenue and has the most users." Accepted cost: other product-allocation calls stay gut-driven through v1. Source: voice/2026-05-18.md (2026-05-19) 21:33

2026-05-19 — [[data-monitoring]], [[build-first]], [[ci-hook]] Build v1 monitoring first, productionize with Glenn later

Decision: Scout builds v1 autonomously with no upfront engineering allocation; Glenn is the eventual production-reliability POC; a CI/merge-hook for metric-definition re-certification is the proposed mechanism for semantic drift. Why: "let's build it first. Then I'll chat with glenn or the engineers to see how we can build this into a production system reliability. Maybe include a hook somewhere when code is merged etc that runs a process to check if data queries need updating?" Source: voice/2026-05-18.md (2026-05-19) 21:43

2026-05-19 — [[ticket-quality]], [[plain-language]], [[durable-rule]] Tickets and docs: low-density, no assumed jargon or ticket numbers

Decision: Durable workspace-wide rule — tickets and documents must not be dense, and must not assume readers understand technicalities or ticket numbers. Contracts go in; exposition, iteration history, and PM-internal labels stay out (in the audit trail). Why: "Ok yes, let's make sure that tickets or documents are not dense, and written without assuming people understand technicalities and ticket numbers etc." Source: voice/2026-05-19.md 19:25

2026-05-12 — [[reid]], [[ticket-references]] Reference issues in plain language, not ticket IDs

Decision: In narrative/standup/digest comms, describe an issue in plain language as the primary reference; the ticket ID is optional and parenthetical only. Why: "please do not reference issues by ticket name 'AC-XYX'. That doesn't mean anything to people who don't know what that ticket is about. Use plain simple language like 'The multiple session issue'." Source: voice/2026-05-12.md 08:58

2026-05-11 — [[meal-planner]], [[redmart-automation]], [[ship-discipline]] Drop the RedMart/browser-MCP build — ROI too marginal

Decision: Killed the RedMart grocery-automation project after a 5-lens spec review, including dropping the "generic browser MCP" justification. Why: "No — honestly RedMart is the only real driver." The cost review showed RedMart-only time ROI ≈ 12-28 h/year vs 13 h/year do-nothing — "the general uses are actually concrete or just hypothetical. If hypothetical, the spec is just specific dressed up." Source: voice/2026-05-11.md 14:38

2026-05-08 — [[meal-planner]], [[notes-feature]], [[storage-decision]] Use a side table for per-meal notes (reversed row-duplication)

Decision: Store per-meal notes in a side table (plan_slot_notes) instead of row-duplication, and embrace "notes-only slot" as a first-class state. Why: "A - sidetable okay" / "B - Embrace" — "when reviews push back on a locked decision with concrete code-level reasoning, flip — the cost of unwinding bad storage choices later vastly exceeds the cost of a mid-plan reversal." Source: voice/2026-05-08.md 13:16 (also logged at docs/archives/td-export-2026-06.md (td-59ffbe) 2026-05-08 13:34) Supersedes: the earlier row-duplication storage choice (same session, pre-review).

2026-05-08 — [[mkb-enrich]], [[root-cause-over-bandage]] Default to the root-cause fix on cron infra

Decision: Replace the Step 4 LLM enrichment with pure Python (root cause) rather than bumping the timeout 900→1500s (bandage). Why: "Let's do the root cause fix" — "when both a quick patch and a real fix are on the table for cron infra, default to the real fix even at higher upfront cost." Source: voice/2026-05-08.md 13:13

2026-03-20 — [[farscry]], [[product-vision]] Farscry is a product for others; personal integrations degrade gracefully

Decision: Frame Farscry as a product usable by others (core: sessions, schedules, dashboard, auth), with personal integrations (td, cron, session logs) configured per-user via env vars and degrading gracefully when unconfigured. Why: "Farscry is a product for others, not just Zach's dashboard. Core (sessions, schedules, dashboard, auth) ships clean. Personal integrations (td, cron, session logs) are configured via env vars and degrade gracefully when unconfigured." Source: docs/archives/td-export-2026-06.md (td-4a0efe) log 2026-03-20 23:16:48