Steps
- Sunday 7am ET: the cron computes Tier 1 metrics from Kick, Mercury, Thera, PostHog, Meta, Short.io (definitions below).
- It writes the full snapshot to metrics/YYYY-Www-leverage.md and commits.
- It appends the week’s row to the Leverage Scoreboard Google Sheet.
- It DMs Michael the summary (format spec below), analysis and recommendations included.
- When a new tool is connected or the structure changes: update this playbook in the same session and note the change under “Scoreboard changes” in the next DM.
Metric definitions for the Sunday 7am ET scoreboard DM to Michael. The cron computes what it can, states assumptions inline, and marks unavailable inputs as “pending” rather than fabricating. Owner-tier report: it may include Owner tier financial detail because it goes only to Michael’s Slack DM.
Standing rule: this playbook is living
Whenever a new tool is connected to Hermes or the business structure changes, update this file in the same session: metric inputs (estimated -> actual), definitions, and propose new metrics the tool enables. Log each change as a git commit and note it in the next scoreboard under “Scoreboard changes.”
Tier 1: headline
- Consolidated net operating cash flow: sum across ALL Kick entities (IDs in Owner tier). Report week and trailing 4 weeks. North star.
- Revenue per person: trailing-4-week consolidated revenue (annualized) divided by people count. People count = 1 FT + active staff contractors (9 as of 2026-08-30, from Team, confirmed by Michael against a Thera pull). The prior input, 16 as of 2026-07-29, was an unreconciled estimate and overstated the denominator by 16/9 = 1.78x. Every revenue-per-person reading taken before 2026-08-30 is therefore 56.2% of its true value, i.e. the corrected figure is 77.8% HIGHER than what was reported. Restate rather than compare: a pre-correction and a post-correction value are on different bases and their difference is not growth. Rebuild the candidate list from a Thera pull and have Michael confirm it; Thera lags reality in BOTH directions (a contract nobody closed reads Active, an equity holder can work for months without an invoice), so never derive status from invoice recency and never hand-edit the number. Excludes the RYEVALLEY_MEGAPHONE_CREATORS pool: those are per-post creator payouts, not team.
- Revenue per payroll dollar: trailing-4-week consolidated revenue divided by total
people cost (Michael draw + contractor payments) over the same window. This is the
cost-adjusted companion to revenue per person: it captures that a VA-hour and an
engineer-hour are not the same input. People cost = CASH ACTUALS via
Mercury: sum all debits where counterparty/description matches “thera” (or “carbon
benefit”) across ALL entity Mercury accounts over the window. Method validated
2026-07-30: 30d total $63,555.83 (RV holding $61,035.83 across 41 txns, JOLT
$2,520.00), cross-checked against Kick's ~$65.2k T4W Contract Labor, ~2.5% gap =
timing differences, acceptable. Label the metric “actuals (cash basis)”. Payroll
provider is Thera (4 entity read-only keys stored; entity map in
Owner tier). Thera API is LIVE (2026-07-30: header
X-Thera-API-Key, GET /external/contractors/bulk-details per entity key, response
under
users, amounts in cents): use it for per-contractor rates, the payroll-vs-creator-payout split (dba key vs main key), and invoice-level status. The Mercury cash method remains the total-cost source of truth; Thera provides the granularity layer. Keep Megaphone creator payouts separate from general payroll once distinguishable (today they run through RV holding’s Thera account, so the split waits on Thera API granularity). - Hours returned this week: estimated human hours replaced by agent systems.
Formula v1 (crude, published, refine with data):
- client drafts shipped x 45 min each
- daily briefings delivered x 30 min each
- Viral Examples issues prepped x 3 h each
- other completed agent jobs x 15 min each State the assumptions in the DM until they stabilize.
Tier 2: system health
-
Agent output shipped vs planned: drafts approved, issues sent, briefings delivered, against what was scheduled. Stalled crons must be visible here.
-
Human touch rate: % of agent outputs requiring human correction. Source: content profile metrics/review-log.jsonl once the content system is activated; “pending activation” until then.
-
Revenue per AI dollar (token dollar): trailing-4-week consolidated revenue divided by AI spend over the same window. Revenue = the Income sub-row of Cash In from owner_cash_flow, all 7 entities (excludes expense reversals and intercompany transfers). AI spend = Kick outflows matching Nous/Hermes (incl. LINK.COM* NOUS), Anthropic (API reloads + Claude.ai), OpenAI, OpenRouter. Report Apify and HeyGen as a separate “AI tooling” line, not in the ratio. Also show the calendar-month value. Baselines (computed 2026-10-15): Aug $9.36, Sep $8.08, Oct 1-15 $6.42. 7a. **Token share of spend** (added 2026-10-15, Michael): AI spend (as in 7) divided by total operating Cash Out (owner_cash_flow cash-out, which already excludes transfers, distributions and asset purchases). T4W and calendar month. Rising share is fine only if 7 and 7b hold or improve; rising share with falling 7 is the waste signal. 7b. **Revenue per human dollar** (added 2026-10-15, Michael): same revenue divided by all people cost: Payroll category (Thera contractors, PCR salary, direct contractor payments) PLUS outside human services booked as COGS (Unlimited Content, Ember Technology Lab). Excludes creator payouts (per-post revenue share, not team). This supersedes metric 3 as the headline people-efficiency number; keep 3 for continuity. Baselines: Aug $2.92, Sep $4.07, Oct 1-15 $3.67 (Oct labor incomplete). Rules for 7/7a/7b: (a) do not compare 7 vs 7b as “which input is better”; both share one numerator, so the gap mostly reflects spend size. Read their trends and the 7a mix together. (b) Referral fees are revenue (Michael 2026-10-15: the Micro1 $49,999 wire on 2026-09-18 was a referral, "It's revenue"). Never exclude them from the ratios. A single inflow over $20k may be named in the analysis to explain a swing, but the headline number always includes it. Smooth lumpiness with windows, never exclusions: report 7, 7a and 7b on trailing 4 weeks AND trailing 3 months (Michael agreed 2026-10-15); read trends off the T3M value. (c) Lump-sum back pay (e.g. Tatem’s June-Aug JOLT pay on 2026-09-03) distorts monthly 7b; note it. (d) Months under ~10 days old restate; label them. (e) NEVER mark 7/7a/7b “pending” because entity splits (kick_intercompany.py) have not run yet: splits only move cost between entities, the consolidated AI total is identical before and after. Compute them every week from transactions_query keyword matches. Sheet columns: see the Google Sheet section (K-P).
-
Build velocity: are we shipping and using the machine, week over week?
- Code velocity: commits and net LOC delta this week across Rye Valley repos. Known repos to check (update this list as repos are added): ~/ryevalley-brain (Mini), RyeValley/jolt on GitHub (gh api), ~/lore-content (Mini), and the content profile at ~/.hermes/profiles/ryevalley (Mini). Exclude merge commits.
- Token velocity: total agent tokens consumed this week across Hermes profiles on the Mini, from Hermes usage/session data if exposed; otherwise count agent runs (cron executions + chat sessions this week) as a proxy and label it proxy. Interpretation note for the analysis section: velocity is a health signal, not a target. Flag when it drops sharply (stalled systems) or when token spend rises without output shipped rising (waste), not when raw numbers are merely low.
Website traffic (connected 2026-08-11)
Source of truth is PostHog, project 447038 “Rye Valley Web (all sites)”, POSTHOG_API_KEY in ~/.hermes/.env. Computed by ~/.hermes/scripts/web_traffic_stats.py, which is attached to BOTH this weekly cron (—mode weekly) and the daily briefing cron (—mode daily) so the two reports can never disagree.
- Website traffic (aggregate): pageviews and unique visitors summed across all production RV hosts, this week vs prior week. Production only: the script excludes dev.*, *.vercel.app, and localhost, which otherwise inflate the numbers with internal traffic.
Rules:
- Never cite Cloudflare analytics for traffic. It reads zero for every RV zone by design: all DNS records are gray-clouded (DNS only), so visitor requests go straight to Vercel/Squarespace and never touch the Cloudflare edge. Confirmed 2026-08-11 on joltexclamationpoint.com.
- Instrumentation began 2026-08-03. There is NO data before that on any host. Any window reaching earlier is labeled PARTIAL by the script; report that label verbatim and never present a partial-window jump as growth. First honest 30-day/MoM comparison is available 2026-09-02.
- Aggregate goes in the metrics table. Per-site numbers belong in analysis only when a real pattern exists (a live site dropping to zero, a sustained swing beyond roughly 40 percent, a new site appearing), not routine variance.
- Short.io go.* link clicks are a separate stream and are not counted here.
Meta Ads (connected 2026-07-29)
META_ADS_TOKEN in ~/.hermes/.env (system user hermes-brain, ads_read only, read-only verified). ONE shared ad account for all entities for now: act_601589271801820 (“Founding Journey”, the live one; act_1377922856133495 is empty). Ads generate newsletter leads per vertical agency; attribute spend to entities via campaign names until per-agency ad accounts exist.
Add to the per-entity strip and analysis where relevant:
- Weekly ad spend (account level, GET /act_601589271801820/insights?date_preset=last_7d)
- Cost per lead (spend / lead actions) and, once beehiiv weekly sub growth is tracked, blended cost per net new subscriber
- Flag spend anomalies (week-over-week swing >30%) in the analysis section
Traffic (added 2026-08-01)
Weekly traffic signals. Compute what is connected; list the rest under Data gaps.
- Short link clicks (Short.io, connected 2026-08-01): total + human clicks for the week on go.foundingjourney.com (domain id 1184876), WoW delta, and top 3 links by clicks. API: https://statistics.short.io/statistics/domain/1184876?period=last7 and per-link stats; header auth, SHORTIO_API_KEY in ~/.hermes/.env (both machines). MCP tools mcp_shortio_* also available. Human clicks are the honest number; bots inflate totals (Jul 2026: 1936 total vs 724 human). Flag WoW human-click swings >30%.
- Newsletter click traffic (beehiiv): weekly email clicks/CTR for Anyhouck (formerly Hard Calls) from the existing beehiiv stats pull; per-vertical newsletters once their keys are added.
- Site analytics: NOT CONNECTED. No analytics on hardcalls.com, megaphone, JOLT!, Lore client sites. Candidate: PostHog (free tier, API-queryable) or DataFa.st (paid, revenue attribution). Until connected, mark “site traffic: pending” in Data gaps. When any analytics tool is connected, update this section with the query method in the same session (standing rule).
DM placement: one Traffic line in the headline section (human short-link clicks WoW plus best-performing link), full breakdown in the sheet row and brain snapshot. Sheet: append new columns for weekly human clicks + total clicks, note in Scoreboard changes on first run.
Tier 3: brain vitality
- Capture rate: meetings filed in meetings/ vs meetings held per Granola (list_meetings via the granola MCP, connected 2026-07-29), decisions logged this week, inbox items filed vs sitting >7 days.
Per-entity strip (one line each)
- Anyhouck (formerly Hard Calls): revenue, active subs + avg open rate + weekly sub growth (beehiiv API: BEEHIIV_API_KEY in ~/.hermes/.env, GET /v2/publications/pub_b3883e6d-0769-469a-8e5e-29a5d6019999?expand=stats).
- Newsletter subs report under their OWNING entity (map on the Hard Calls entity page): Megaphone line includes Viral Examples subs, JOLT! line includes Trendspotting subs, Lore line includes Internalized subs. Houck’s Dealflow is unassigned pending Michael’s confirmation; list it separately until then.
- Megaphone: revenue, active clients, drafts shipped, touch rate
- JOLT!: revenue, active clients
- Lore: revenue + operator KPI (TBD with Michael)
- Hockey Stick: pipeline once launched (stack signups, sprint bookings)
- Rye Valley holding: cash flow only, with a flag on any large ambiguous transaction
Analysis and recommendations (required every week)
The scoreboard is not just numbers; every issue must include:
- What happened this week and why: read the week’s evidence before writing. Sources: prior weeks’ snapshots in metrics/ (for deltas and trends), Kick transactions behind any notable revenue/expense move, decisions/ and meetings/ pages filed this week, inbox/ items, cron run history, and the brain git log. Explain the 2-4 biggest movements with causes, not restatements. “Megaphone revenue up $X because two clients onboarded (meetings/2026-08-03-acme-kickoff.md)” is analysis; “revenue went up” is not. If the cause is not findable in the data, say “cause unclear” and name what data would answer it.
- Recommendations: 2-4 specific, actionable recommendations addressed to Michael, each tied to evidence above and each with a concrete next step. Rank by expected leverage. Include at most one “connect/instrument X” recommendation per week (the Data gaps section already tracks the full list); the rest must be about the business itself (pricing, clients, content, cost, focus).
- Anomalies and flags: anything odd (ambiguous large transactions, stalled crons, a metric moving against trend) even without a recommendation attached.
Keep the whole analysis section under ~250 words. Insight density over length.
Google Sheet (data home)
Sheet: https://docs.google.com/spreadsheets/d/1nY2hDogDLWdxaFVbitnSKOYPdDcFLC5iib6oP-mBKXE Rebuilt 2026-10-15 (Michael: “a total mess”). Tabs: Scoreboard (one row per ISO week), Monthly (one row per calendar month), Definitions, Archive (old format, read-only).
Scoreboard columns, A:U, fixed order. Write RAW numbers only: no ”$", no "~", no "pending", no words in numeric cells. Unknown = leave the cell empty. Dollar/percent formatting is already on the columns. Percent columns take a fraction (0.232, not 23.2). A Week (2026-W42) | B Start (Mon, YYYY-MM-DD) | C End (Sun) | D Revenue | E Operating cash out | F NOI | G NOI T4W | H Revenue T4W | I AI spend T4W | J Human labor T4W | K Rev per AI $ T4W | L Rev per human $T4W | M Token share T4W | N Rev per AI$ T3M | O Rev per human $ T3M | P Token share T3M | Q Hours returned (est) | R Meetings filed | S Decisions logged | T Brain commits | U Notes (one short line; caveats and data gaps go here)
Sources: D-H from one owner_cash_flow call (cycle week, all 7 entities, maxDepth 2, startDate 13 weeks back): Revenue = Cash In/Income, cash out = Cash Out total, NOI = Operating Cash Flow, T4W/T3M = sums of the last 4/13 week columns. I, J, N-P per metrics 7/7a/7b. R-T: files dated in that week in meetings/ and decisions/, non-merge brain commits.
Before appending, re-pull the prior 2 weeks and overwrite their rows: Kick restates recent weeks, and the sheet should hold the settled numbers. After the 10th of each month, update that month’s Monthly row (Revenue, Operating cash out, NOI, AI spend, Human labor, Rev per AI $, Rev per human $, Token share) and add the current month-to-date row labeled “Mon YYYY (to Mon D)”.
Never add a column without updating this section and the Definitions tab in the same run. Verify every write by reading the row back.
Output format (Slack DM)
The DM is the SUMMARY, the sheet is the DATA, the brain snapshot is the ARCHIVE. Format this like a CEO update: concise, evidence-led, no filler. Under 30 lines total.
Slack-native formatting only: bold single asterisks, bullet character, no headers, no --- rules. No em dashes.
Structure:
- One-line topline: “Rye Valley - Www Scoreboard (date range)” header.
- One-line MTD NOI callout: Jul MTD final + MoM + YoY. Bold the number.
- Metrics section: render as a monospaced code block (triple backticks) with 4 columns:
Metric | Value | WoW | MoM
Use dashes as the separator row. Pad columns with spaces so they align. Include:
- Week NOI
- MTD NOI (final or running)
- Rev / person (annualized)
- Rev / payroll $
- Token share of spend (7a)
- Rev / AI $ (7)
- Rev / human $ (7b)
- Hours returned by agents
- Intervention rate (6), once the review log exists; otherwise “pending”
- Capture rate (9): meetings filed / meetings held
- Build commits + net LOC (one row each or combined)
- Meta leads + CPL (one row each or combined)
- Short.io human clicks Leave WoW/MoM blank (—) when no prior-period data exists. Populate from sheet history when available. Flag with * and a footnote when a baseline caveat applies.
- What drove it section: 2-4 bullets, cause-level analysis, not restatements.
- Risks: 2-3 bullets. Open client risks, billing gaps, churn signals.
- Actions: 2-4 numbered, owner named, concrete next step.
- Sheet link on its own line.
- Data gaps: single compressed line (e.g. “pending: payroll API, beehiiv, Granola”).
Tier 2/3 detail and the per-entity strip go in the SHEET ROW and the brain snapshot, not the DM, unless one of them is the subject of an analysis bullet or flag.
If a data source fails, say so briefly; never present a partial picture as complete. Also write the full snapshot including analysis to metrics/YYYY-Www-leverage.md and commit.
Anyhouck content retro (formerly Hard Calls) (added 2026-08-09; runs only when there is data)
After the metrics sections, read /Users/michael/hardcalls-dna/content-ledger.md (runtime master copy, lives on this machine).
GATE: if the ledger table has ZERO data rows, skip this entire section. Say nothing about content in the DM, add nothing to the sheet. Silence is the designed behavior, not a failure.
When rows exist:
- Fill metrics for rows missing them, only from real sources. Trust-pole essay rows: pull opens and click rate from the beehiiv API (BEEHIIV_API_KEY in ~/.hermes/.env, publication id pub_b3883e6d-0769-469a-8e5e-29a5d6019999, the FJ publication, now Anyhouck, verified 2026-08-09; GET /v2/publications/{id}/posts and match the post by title or slug from the piece column). Discovery-pole rows (TikTok, LinkedIn, X): no API is wired; leave blank. Never invent or estimate a metric; a cell you cannot fill stays blank. Write the updated table back to the same file.
- Compare verdict to outcome per the piece’s own pole (poles and thresholds are defined in ~/hardcalls-dna/content-commandments.md, section “What we measure”). Flag only genuine mismatches: a SHIP that clearly died on its pole’s metrics, or a piece that traveled despite REVISE-level friction.
- Report in the Slack DM as a “Content” block, max 8 lines: one line per filled piece (piece, pole, headline metric), then mismatch flags if any, each with a one-line hypothesis. Mismatch flags are review-context for Michael and the interactive session; do NOT edit the commandments, the review skill, or any canon file from this job. Flagging is this job’s entire mandate.
- If beehiiv errors or a post cannot be matched, one line saying so; never present a partial fill as complete.
Same formatting rules as the rest of the DM: Slack-native, no em dashes anywhere.
Publish to michaelhouck.co/audit (added 2026-10-15, Michael approved publishing RV’s ratios)
After the Slack DM, when the most recent FULL calendar month has closed in Kick (run on or after the 10th of the following month so Kick has settled), write ~/michaelhouck-site-data/leverage.json for that month and publish it:
{"month": "YYYY-MM", "revenuePerHumanDollar": 0.00, "revenuePerAiDollar": 0.00, "aiShareOfSpend": 0.000, "employees": 1, "source": "Kick, all entities, <Month YYYY>"}- Use the same definitions as metrics 7, 7a and 7b above (all revenue counts, referral fees and one-offs included). Round ratios to 2 decimals and the share to 3.
- Only ever publish a closed month; never a partial month.
- Skip if the file already holds that month.
- Then run
bash ~/michaelhouck-site-data/publish.shand confirm the commit landed withgit -C ~/michaelhouck-site-data log -1. - The audit page reads https://raw.githubusercontent.com/RyeValley/michaelhouck-site-data/main/leverage.json hourly and falls back to a bundled copy, so a bad file only shows stale numbers; still validate the JSON before publishing.