SELF OS · 60 Days Get Shit Done Challenge · Operating Doc v1

Day 0 = Sat 2026-07-25 · you are reading this on Sun 2026-07-26 (Day 1) · 60 days to September 23

Approval doc · 15 cards · start with the review protocol below, not with S0 · tap ▶ on any card — the player reads it to you (up to 2.4×) · S1b + the prompt sub-cards are reference material, no audio

Read this first — the clock (added 2026-07-26). This document was written on the evening of Saturday 2026-07-25 and every "tonight" / "tomorrow" in it means that evening and Sunday the 26th. You are reading it on Sunday 2026-07-26. Day 0 has passed.

The start date is unchanged and stays locked: DAY 0 = 2026-07-25, Day 1 = 2026-07-26 (DECISIONS-LOCKED §"Day 0"; DAY_N = (today - date(2026,7,25)).days in SKILL.md and the sheet scaffold in make_sheet_tab.py). Nothing has been silently re-dated.

What that costs you — and what it does not: the GAPS card records that Day 0's own machinery did not happen — the habit-sheet tab was never created, there is no Day-0 row. (The missing recurring nightly audio generator is a Day-2-onward gap, not a Day-0 one — it is on the GAPS card, and it costs you nothing here.) Every one of those is a system gap, not a ritual you skipped, so none of them is charged to you. Per the scoring rule stated on S3, a system gap is logged as a gap; your ten allowed misses under the 50-of-60 bar are intact. What Day 0 actually asked of you was R1 (tomorrow planned before sleep) and R4 (the planning ritual) — ⚠️ Corrected 2026-07-26 (round 6): an earlier version of this line said "R2 and R3 both needed a machine that did not exist", which was an excuse the page had no business making for you. R2 needed a machine — the Day-0 morning audio genuinely was not generated. R3 is fifteen minutes of exercise and needs nothing: no tab, no audio, no coach. Whether you did R1, R3 and R4 on Day 0 is yours to say on the Day-0 call, and that is the only thing that can score Day 0 either way. And Day 1 (today) is not "R2 unarmed" — the opposite: a hand-built Day-1 morning audio is armed on the live Modal Volume for 04:56 this morning (outbox.jsonday1-morning-audio-2026-07-26, the mp3 is hosted and returns HTTP 200), and if for any reason it does not land, R2 is run off this page — cold shower, then the affirmations, visualization, ten minutes of silence, the gratitude line and the launch line, read from S3. Either way it counts.

Your call, and the only one that moves the counter: keep DAY 0 = 2026-07-25 (default — nothing to change; there is no miss to eat: whether Day 0 scores at all depends on your own R1/R4 answer on the call, and the Day-0 system gaps are not charged either way), or reset DAY 0 to the night you actually approve this. A reset is not free: it has to be propagated in the same edit to make_sheet_tab.py, the DAY_N line in SKILL.md, and every "tonight / tomorrow / September 23" on this page. Do not leave it to be inferred — say which one on the Day-0 call.

The review protocol — added 2026-07-26 (round 7). There is one, and this is it. Until this round the page carried two rival instructions: S0 opened by asking for fourteen minutes and seventeen decisions, and S12 — 41 minutes of audio further down — said "five asks, one decision". Both are still here, but they are no longer rivals: S12's five asks are the review. Everything else is optional depth.

The minimum path — about ten minutes, no audio, no headphones.

  1. You have already read the clock block above. That is step one.
  2. Open GAPS and read its first three paragraphs — what is not built, and what that costs you this week. Skip the per-item verification detail unless you want it.
  3. Open S12 and answer its five asks. One of them (the DAY-0 date) is the only decision that moves the counter.
  4. Say GO, or name what you want changed.

The seventeen questions are not a precondition for GO. They soften or reverse design choices; they are answered on the Day-0 call, with the voice agent, at whatever pace you want. Nothing waits on them. If you only ever do the minimum path, the challenge still starts.

The full path, if and when you want it: S0 (13:48, or about 5:45 at 2.4×) → the cards in order via the player → say "ask me the questions" to the voice agent. This is the second job, and it is explicitly optional. You are at your parents' house on Day 1 with a 5:00 start behind you; the page is not going to pretend that 41 minutes of audio is a reasonable ask before you are allowed to approve anything.

S0🎧 Optional depthThe Opening Brief13:48 · re-cut 2026-07-26 (round 7) · the truth about the rest of this document — not a precondition for GO 13:48 · re-cut 2026-07-26
Optional — the minimum review is at the top of the page13:48 · about 5:45 at 2.4×re-cut 2026-07-26 (round 7) — current with this cardlongest track on the page — say the word and it gets splitYou are approving a design, not a running machine

⚠️ Changed 2026-07-26 (round 7): this card used to open "before you read a single card, give me fourteen minutes" and it was the page's first instruction. It is no longer. The review protocol at the top of the page is the instruction, and it takes about ten minutes with no audio at all. This track is the depth pass: it tells you the truth about the rest of the document, and it is worth your time — but nothing waits on it and GO does not require it. It is also the longest track here — longer than the S1 audio you told me was padded. If you want it cut to six minutes or split in two, say so and it gets re-cut.

Matt. If you are giving this fourteen minutes — about 5:45 at 2.4× — this is the opening brief.

Four things: what we're doing here, what I found while building it, how you'll actually live with it day to day, and how the review works. (The audio compresses Part 3 — S2, S3 and S5 each have their own track and it is not read to you twice. The card below keeps it in full; where the two differ, the card is right.)

Part 1 · The mission, in one breath

You are running the 60 Days Get Shit Done Challenge. Day zero is Saturday 2026-07-25, day one is Sunday 2026-07-26, day sixty is September 23. The day-60 reward is named but not booked: the plane ticket you haven't paid for yet, and the first week at the new base fully off — funded by the retainers the calls number buys, and conditional on that money existing (see S1).

The business mission it serves is one number: six booked sales calls per week. The close rate is not measured yet — the first four weeks measure it — so at a realistic one-in-three, six booked calls is roughly two sites a week, about seventeen sites across the sixty days. Sixty sites is the twelve-month mission, not a challenge target. Everything in here is judged against the calls.

Underneath it sit four daily rituals, no exceptions — weekends included, holidays included. Ritual one: the plan. Ritual two: the morning audio. Ritual three: at least fifteen minutes of exercise. Ritual four: the evening planning ritual. You pen all four onto a Google Sheet by hand, every night, while the coach prompts you and you narrate it out loud so it lands in the transcript.

The shape of the day

  • 5:00 — wake, cold shower first: 60–90 seconds, no audio, phone outside the room. Then dry and sitting down, the morning audio.
  • 5:30–8:30 — the sacred block. Planned the night before, handwritten tick-off list, no renegotiation. That block is the spine of the whole thing.
  • 17:00 — hard stop: you invoke the planning skill, it sends a ten-minute NSDR while the pipeline assembles your context. Then gym. Then the evening planning call.
  • ~20:00–21:00 — an hour of real relaxation, and bed around nine.

The honest part — before the rest of the document gets you excited

What actually got built tonight: this document, thirteen audio cards (the twelve section audios plus this opening brief), the voice agent you're hearing me through, the delivery plumbing on Modal, the NSDR audio script and its hosted render (the mp3 is not in your checkout — see GAPS), the sheet scaffolder (the tab itself is not created yet), the mentor voices, and a detailed set of runbooks describing the system.

What is genuinely armed is thinner⚠️ re-dated 2026-07-26 (round 7): this line used to say "armed for five o'clock tomorrow", written on Saturday night. Read on Day 1 it describes a moment that has passed. The durable statement: every morning audio is a hand-build until the recurring nightly generator exists (Day 1's was hand-built and fired; Day 2 onward is unqueued), and the escalation ladder still runs on the old schedule — which the live Volume now shows is a ten-entry day-shape, including a 21:45 call after the 21:00 bedtime this page locks. See GAPS items 15 and 17.

There's a card in here called GAPS. It lists seventeen open items, by name, numbered 1–18 with item 16 closed in place. Read it. You are approving a design, not a running machine — and the document says so on its own face.

Part 2 · What I found while building this

You gave a standing order: before anything is called done, spin up an adversarial critique gate. Three Opus agents, high effort, in parallel. Critic A on instruction fidelity. Critic B on behavioral survivability. And a third whose only job was to represent you, grounded in thirty-two live queries against your own journals, speaking in your first person.

They came back harder than I expected. I'm going to quote them, because softening them would defeat the point.

Critic B — "This is a beautifully engineered relapse machine."

His reasoning: every documented failure mode you have — bar too high, zero-exception commitments, black-and-white collapse after one slip, over-planning as avoidance, sleep as the weakest link, the ten-minute relapse window — is either unaddressed or actively amplified. His prediction: day one runs on adrenaline, day two on four hours' sleep, the streak breaks between day three and day nine, and by day twelve the ladder is muted and the morning audio unopened.

Your representative — "You built for a man who has already won the fight this system exists to fight."

He pulled the receipts from your own database. Two weeks ago you went to bed at four in the morning because the work was too interesting. Roughly five hours of sleep for a week. Wakes at 9:20 and 8:00. And thirteen hours before this document was written, in your own voice: "I know I have a tendency to overcomplicate things, overanalyze, and plan."

His verdict: a spectacular week one, and a collapse between day nine and day sixteen — caused by the system's rigidity, not your weakness. His diagnosis of the ignition source is the sentence I keep coming back to: a maximal system, declared non-negotiable, on day zero, at midnight, in a good mood.

And Critic A, on the engineering: the document is genuinely good, and "the system under it is spec." His one-line test before anyone says done — at 5:00, at 17:00 and at 18:00 tomorrow, what process, on what machine, from what branch, fires? Tonight's honest answer was: nothing, nothing, and the old ladder.

That's why this brief exists. You're not being handed a finished machine with a bow on it.

What I did with all that — 25 fixes, tonight

Everything fixable without contradicting an order you actually gave, I fixed tonight. Twenty-five items.

  • The build was merged onto the working branch so the skill resolves from your real checkout. ⚠️ Corrected 2026-07-26 (round 7): this said "merged and pushed", which is not true of what you would find. The work sits on claude/self-os-harden-2026-07-26, 45 commits ahead of origin/main with no upstream branch. It is on this machine, not on GitHub. Pushing and merging to main is part of the build step after you say GO.
  • The sheet scaffolder got fixed and the calls-booked column added.
  • The morning ritual got reordered — a ten-minute silence block cannot happen in a cold shower.
  • A miss protocol: the day counter is elapsed days and never resets, and the coach's first line after any miss is a comeback line, never shame.
  • A pass bar: fifty of sixty days at or above the floor and the challenge is won.
  • Interim rewards attached to people, not things: day 7 you call Kocsy, day 21 the money goes aside for Kati's guitar, day 40 is yours to name.
  • Sleep, wake time and substances became tracked columns; a "block held" column joined the plan column.
  • A printable sixty-box wall chart is generated (wall-chart.html) — the file exists; nothing is on a wall yet. Print it tonight and put it where you'll see it at 5:00; the Sheet stays as the machine-readable mirror. (Day-0 call item: "is it on the wall?")
  • And one thing nothing else here was doing — spec'd, not built: a pinned "I'm about to" button, ninety seconds of reframe audio and a ten-minute timer, aimed at the only window that matters. The ten minutes where, in your own words, "it seems like a really good idea." The spec (agents/im-about-to.md) and the audio script exist; the Telegram handler, the pinned message and the timer do not. It is first in the build queue after you say GO — and it is on the GAPS card.

The seventeen decisions I did not make for you — Q1–Q14 here, Q15–Q17 below

Each one would soften or reverse something you explicitly ordered on Day 0 — so they're yours. Not mine, and not the critics'. They are numbered here because the rest of the document cites them by number, and Q1–Q14 are the fourteen the voice agent walks you through. ⚠️ Two of them, Q4 and Q13, have been overtaken by the clock — Day 1 started at 5:00 this morning, cold, without waiting for clean rehearsals. They are marked below and kept in place so no citation shifts; what is still live in them is whether the rest of the ramp is earned rather than assumed.

  1. Whether "no exceptions" stays a chain of four, or the evening ritual becomes the one unbreakable keystone.
  2. Whether the ladder hunts you relentlessly, or simply expects you — capped, with one amnesty word.
  3. Whether a bad day has a floor that still scores a tick.
  4. Whether 5:00 starts tomorrow cold, or gets earned over eight days. (Q4 — overtaken 2026-07-26: Day 1 already started cold. What is left of it is whether days 2–8 keep the cold 5:00 or step back to a ramp.)
  5. Whether Dani and Kocsy get keys to this.
  6. Whether the sacred block gets a two-minute witness at 8:30.
  7. Whether the scoreboard rewards planning or execution.
  8. Whether ninety minutes a day of overhead is the price of transformation, or the thing that kills it by week two.
  9. Whether every evening goes deep.
  10. Whether harshness is scheduled, or priced by the day's evidence.
  11. Whether the trip landing around day five gets a pre-designed mode.
  12. Whether the workout audio is a product tonight, or an experiment you rate for a week before anything is kept. (This one was missing from every earlier version of this list — the list said fourteen and printed thirteen for three review rounds. It is Q12.)
  13. Whether day one waits for clean rehearsals. (Q13 — overtaken 2026-07-26: day one did not wait. What is left of it is whether the unattended running of this system waits for the rehearsals, which is the real form of the question and is still open — see S10 and GAPS.)
  14. And whether the mentor voice budget gets bought now, or discovered at day thirty.

Three more, added 2026-07-26 — not part of the original fourteen

These came out of the review rounds run on this document after it was written. They are not in the voice agent's Q1–Q14 script; ask them on the Day-0 call.

  1. Whether DAY 0 stays 2026-07-25 and the Day-0 system gaps just get logged, or DAY 0 resets to the night you actually approve this (which moves every date on the page).
  2. Whether the Day-60 reward stays conditional as now written — funded by the retainers, with the Day-40 fallback ticket — or you want it restated some other way.
  3. Whether the 6-calls-a-week chain is canon for this challenge, over the older 6-bookings-a-day funnel in the Notion master plan.

Part 3 · How you'll actually live with this

5:00, the alarm. Cold shower. Then you sit down dry and the morning audio plays — affirmations, a two-minute visualization built overnight from your own goals and transcripts, ten minutes of silence, the gratitude line, the launch line, and two mentor cameos in their own voices. Those are S3's six parts in order, and S3 is where the ritual is defined. Then the block, off the list you handwrote last night.

17:00, hard stop, you invoke the skill. NSDR arrives immediately while the pipeline reads today's coding sessions, your call transcripts, the habit sheet, the goals, and Dani's Notion tasks. Four mentors and a Matt agent each write a handoff, an assembler picks the sharpest, and you get a short briefing before the call with the truths you need to hear.

Then the call: loops closed, praise with evidence behind it, the calls-booked number said out loud against six for the week, tomorrow time-blocked, the first-block list handwritten, the sheet penned. Then relaxation nobody audits, and bed.

Automatic: the audio generation, the context assembly, the mentor voices, the calls and check-ins, the escalation.

Yours, deliberately: you write the sheet by hand. You click the calendar. You handwrite the first-block list. Your representative defended those three as untouchable, and his reason is your own line — written and staked commitments hold, unwritten ones feel optional.

Two tools sit outside the schedule: the ladder, for the night you don't invoke the ritual, and — once it is built — the "I'm about to" button, for the ten-minute window.

Part 4 · The full review path — the optional one

⚠️ Corrected 2026-07-26 (round 7). This section used to be headed "how to review this document tonight" and it competed with S12. It no longer competes: the review protocol at the top of the page is the review, and these four steps are the long version of step 3 of it. Do them if and when you want the depth. They are not a gate on GO.

1Listen. Every card has its own audio in the player at the bottom. Play them in order and speed them up — the player goes to 2.4×. That is about 41 minutes at 1×; budget for it, or skip it.
2Talk to me. The mic in the player bar is a live voice agent, and I have every card, every audio transcript, and all three critique reports in my context. Challenge any design choice in here. If you think a critic was wrong, argue with me about it — I'd rather have that fight now than on day nine.
3When you're ready, say "ask me the questions." I'll walk you through the fourteen decisions one at a time (plus the three added on 2026-07-26 — seventeen in all), each framed around the real tension it carries, and capture your answer and your reason. These are not a precondition for GO — they can all be answered on the Day-0 call.
4Anything that needs writing down, drop as an inline comment — tap a paragraph on any card — or paste the letter block from the questions into the chat with Claude.

Four things to pay real attention to on the way through

  • The GAPS card. The honest list of what isn't built. Your representative's instruction was: do not tidy it.
  • The CONFIRM tags in the goals. Numbers in there come from three different plans and don't agree — six bookings a day versus six a week. Settle them.
  • The mentor comments. Hormozi's line on the gaps card is the whole night in one sentence: seventeen unbuilt pieces is fine, pretending they're built is what kills you.
  • The DO-NOT-TOUCH list your representative defended — twelve things to keep exactly as they are, including the sacred block, free-dump mode, the parking lot, and the honesty of that gaps card.

Last thing

What you asked for at noon today was leverage instead of administrative overhead, and something enjoyable. What got specified at five in the afternoon was a cathedral. Both are in your handwriting.

Your job — whenever you sit down with this, not "tonight"; the clock block at the top explains why that word is wrong now — is to decide which one you're actually going to run. Not the one that flatters your best Saturday. The one that survives your worst Tuesday — because every system you've ever abandoned, you abandoned on a Tuesday.

Start the player. I'm right here when you want to talk.

Hormozi —Fourteen minutes of truth, and it is optional. The ten-minute path at the top of the page is the review. If you want the depth, speed this up like everything else — the point is that you hear it, not how long it takes.
Talk to this document Ask why any card is designed this way — or say what you want changed and it hands the wording back for you to comment.
S1🎯 The Mission & The Challenge 3:20 · re-cut 2026-07-26
Day 0 = Sat 2026-07-25Reward: conditional — see belowCheckpoints: day 7 · 21 · 40

You are running the 60 Days Get Shit Done Challenge. Day 0 is Saturday 2026-07-25, Day 1 is Sunday 2026-07-26, Day 60 is September 23. The coach will say the challenge's name and count the day out loud every single morning and every single evening. No exceptions for weekends. No exceptions for holidays. No exceptions.

The Day 60 reward, stated honestly: the plane ticket you haven't booked yet — you fly to your next base and the first week there is fully off. It is conditional, not booked. As of 2026-07-26 you are back at your parents' house and cannot afford to move out (see S1b), so the reward is funded by the retainers the six-calls-a-week number buys. If the money is there on Day 60, you fly. If it is not, Day 60 buys the ticket you name on Day 40, for the first date you can pay for. Nothing on this page pretends the flight is paid for.

The business mission this challenge serves: a system that books 6 booked sales calls per week. That is the number the system counts. The close rate is unmeasured — the first four weeks measure it; at a realistic ~1-in-3 that is roughly 2 sites/week ≈ 17 sites across the 60 days. 60 sites is the 12-month mission, not a challenge target. (The old "6 calls → 5–10 sites/week" line was an 83–167% close rate; it is struck everywhere, and DECISIONS-LOCKED.md carries the annotation. Which chain is canon is a Day-0 call question with a default: the 6-calls/week chain above wins unless you say otherwise.) The machinery already exists in pieces — cold-email lead gen, sales-call prep, AI-fast site building — and monthly retainers get added for scale. Under it stands the anchor you locked in the war room: 2 million forints per month of profit from roughly 20 hours a week, majority recurring, run from anywhere.

Interim rewards, attached to people, not things — the coach names each one on the day, in the close beat (wired into text-coach.md step 12 and into the assembler's §1, so it actually fires): Day 7 — call Kocsy, a call not a text. Day 21 — move the money aside for Kati's guitar, on the call. Day 40 — yours to name, said out loud and booked that night.

Day 40 carries two separate beats, and they are not the same thing. The interim reward above is the first: something you name and book that night, for you. The second runs only if the retainers are not there by then — that same call also names the fallback plane ticket (which destination, and the earliest date you could actually pay for it) so Day 60 has something to buy. The coach runs the interim reward first and the ticket beat after it, never one instead of the other.

The personal mission: consistency. Four rituals, every day, tracked by your own hand in a Google Sheet:

  • R1 — Planned day. Every evening, tomorrow is planned before you sleep. Leisure blocks and even do-nothing blocks are allowed — but there IS a plan.
  • R2 — Morning launch. Cold shower first: 60–90 seconds, no audio, phone outside the room. Then, dry and sitting down, the morning audio — affirmations spoken out loud, the 2-minute identity visualization, ten minutes of silence, the gratitude line, then one sentence that points you at the first step of the day. S3 carries the canonical ordered list with durations and is the only place the ritual is defined; if this summary and S3 ever disagree, S3 wins.
  • R3 — 15 minutes of exercise. Minimum. Even stretching plus one 400-meter full-gas sprint counts. Fifteen minutes including the shower.
  • R4 — The planning ritual. After your last work session: loops closed, wins praised, goals reviewed, tomorrow time-blocked, first-block list handwritten — guided by a coach on a call.

Sixty days. Four checkmarks a day. That's the whole game.

And the pass bar, in the same breath as "no exceptions": the daily standard is all four rituals, weekends and holidays included. The challenge is won at 50 of 60 days at or above the floor — the ten are not permission, they are the model already pricing in your bad days. What "the floor" means per ritual is decision #3 of the fourteen and is open until you answer it; until then a day counts only when all four rituals are fully done.

Hormozi —A ladder with nine rungs is still one number: six booked calls a week. Everything above it is scoreboard; that rung is the work.
S1b🧠 Who I Am — The Core Contextevery planning agent reads this file first
Mandatory input to the planning agentsReference card — no audio

This is agents/matt-core-context.md, verbatim. It was mined from both Pinecone brains (69 queries, 492 hits) and every bullet carries its source tag. The Planning Coach, all four mentors, the "Matt" agent, the Assembler and both audio generators receive this file in full — its Red Lines section is binding on all of them.

Correction (2026-07-26): this file is NOT what the live Telegram/voice coach loads. The production coach injects telegram-coach/agent-root/MATT_PROFILE.md + telegram-coach/agent-root/MEMORY.md into the prompt via agent.py _curated_memory_block(), which resolves the two files through skills_loader.py curated_files() and is called from the text-prompt and live-prompt builders. telegram-coach/scripts/curated_memory.py is the nightly write-back path (promote() / nightly_promote()), not the read path. Nothing under telegram-coach/ reads matt-core-context.md.

How much of those files actually reaches the coach — precisely. "Injects" is not "pastes". _curated_memory_block() extracts bullet lines only, truncates each to 240 characters, and caps the block at 40 items; it is skipped on the fast live path and re-added by build_live_enrichment(). Prose paragraphs in those files never reach the coach. If you correct a fact, write it as a bullet, and keep it under 240 characters — otherwise you will have corrected a file the coach never reads that line of.

A fact correction has to land in THREE places, not two. The rule this card used to state was short by a surface: besides matt-core-context.md (the planning agents) and MATT_PROFILE.md / MEMORY.md (the live coach), build_grounding.py bakes matt-core-context.md verbatim into vision-guide/voicebots/self-os/GROUNDING.md, which is deployed to the coach's own Volume and read by the voicebot at vision_brain.py. That file is script-generated — never hand-edit it; re-run build_grounding.py and bump .cache_bust. Miss any of the three and something in this system keeps saying the stale thing.

Sarudi Mátyás ("Matyi" / Matt), b. ~1998, Hungarian, psychology MSc, runs a web-design + cold-email lead-gen agency with his brother Dani. Currently back at his parents' house in Hungary and cannot afford to move out (2026-07-26); the Lisbon stay (from May 2026) is past, and the nomad life is an aspiration, not his current location. Every claim below is traceable to a source: [index/namespace] after each bullet. Nothing here is invented; thin dimensions say so. ---

Reference card: no ▶ audio button, and this content is deliberately kept out of the 12 section audios. It is candid by design — read it and tell me what is wrong, outdated, or should never be said back to you.
ContextGoals (with numbers/dates)
  • $10k/month while working ~30h/week, ASAP — the north star restated across three years. "A stable $10k/month from the agency while working only ~30 hours a week." coach-intake/intake_knowledge · cgptvoice-079
  • Income ladder, verbatim: 2023 "stable 10K with the least time invested" → May 2024 "1.5M Ft/month within 6 months" → Feb 2025 "financial freedom = 2M Ft/month from ~20-hour work weeks". coach-intake/intake_knowledge · apple-notes-c2-goals
  • Operating targets (Notion master plan, May 2026): 2M Ft/month personal, 4.5M Ft/month company; 150 cold emails/day → 12 replies → 6 bookings → 1 sale/day → 15 websites/month. (Historical target, Notion May 2026 — SUPERSEDED for this challenge by the S1 chain: 6 booked sales calls/week, close rate unmeasured, ~2 sites/week. Kept for provenance, not as a target. Do not score Matt against this funnel.) coach-intake/intake_knowledge · notion-to-schedule
  • Summer money math (Apr 2026): ~15 websites/month × ~200k profit = ~3M HUF; ~50 sales calls/month; ~25 work hours/week; 300k saved, ~1M to live on. selfi-journal/journal_chunks · 2026-04-09 / coach-intake
  • Digital-nomad life (ASPIRATION, not current): board a plane, live in The Social Hub-style colivings — Lisbon (already done, now past), Miami, Bali, Mediterranean cities — max €1,200/mo housing, funded by ~5h of work a day. Lisbon reality check from that stay: ~600k HUF/mo in vs ~400k costs. Current reality (2026-07-26): back at his parents' house, cannot afford to move out — the goal is to earn his way back out. coach-intake/intake_knowledge · pdf-jelenlegi-helyzetem, transcript-img-6462
  • 3-year handwritten plan: (1) agency to $20–30k/mo PROFIT on ~4h of his own work; (2) found an AI startup = a research/evidence-based CBT personal coach; on the path: become a psychologist & certified CBT coach. This project IS that dream. coach-intake/intake_knowledge · pdf-aos-journal
  • Wealth-leverage ladder: personal brand (5–50k followers, global niche) → productised services → write a book "ASAP" → AI software. coach-intake/intake_knowledge · apple-notes-c3b-goals
  • Body/health: 30-day proper diet ("badly undernourished — because of kratom"); gym/movement daily; sleep 7.5h; 3 meal-replacement shakes prepped nightly. coach-intake/intake_knowledge · apple-notes-c3a-goals, transcript-img-6369
  • Substance goals: kratom zero (2-month clean streak reached mid-2026, relapsed early July); weed → zero; THC edibles at most 1–2×/month "with intention"; 2 sober parties as a challenge. coach-intake/intake_knowledge · cgptvoice-011; selfi-journal/coach_reflections · refl_2026-07-03
  • Skill/courage goals: improv + standup (3-min set), Toastmasters/Speak Academy, speech practice, cold approaches, MENSA, martial arts, 120 WPM typing. coach-intake/intake_knowledge · apple-notes-c2-goals, c1-goals
ContextMy Whys
  • The why-money stack, in my own words: (1) travel the world and "live my life as an adventure video game"; (2) help my mother — "she is under stress and money can alleviate her pain… I see her suffering and it triggers me… I wanna thank her for all she did for me"; (3) help Dani feel high-value — "I hurt him a lot and I want to make up for it"; (4) 5-star family holidays; (5) freedom; (6) "to earn my place among the elite. To see behind the curtains"; (7) business as a game I enjoy winning. coach-intake/intake_knowledge · apple-notes-c1-psychology
  • The 2022 overarching aim: "I grow stronger as an individual, both mentally and financially, so I gain the capacity to support Mom's family and my friends at a higher level of efficacy." coach-intake/intake_knowledge · pdf-yearcompass-2021-22
  • Why the nomad life: sun, nightlife, a young entrepreneurial scene, "Erasmus vibes — socialise, feel young & wild"; eat out twice a day without checking the price. coach-intake/intake_knowledge · pdf-aos-journal
  • Why sustainability, not just revenue: my stated top 2025 goal was "be able to do more 1-month days in a row without burning out." coach-intake/intake_knowledge · pdf-aos-journal
  • Why the AI coach: I wrote down this exact product — a Pinecone DB of my life + a voice AI with infinite context on me, an accountability coach — a year before building it. coach-intake/intake_topics · topic_ai-coach-genesis
ContextDeep Motivators
  • Concrete, sensory, people-attached payoffs — not abstract goals. Telling Kocsy about a big deal; buying Kati a guitar and music camp; a Hawaii holiday. This is the real fuel. coach-intake/intake_topics · topic_real-motivational-levers
  • The endgame ladder (handwritten, half-playful, fully sincere): "1. Get to the USA ASAP! 2. Enough money & influence 3. Joining a cult / secret society 4. Max it out: level up the hierarchy 5. Become a magi (mind hacker, manifester, master of reality) 6. Leave a HUGE positive impact as legacy for the Brotherhood of Earth." Winning = self-mastery + belonging + legacy. coach-intake/intake_knowledge · pdf-aos-journal
  • Two things make me happy: (1) going at high speed — progressing, making more money, developing faster; (2) getting relaxed and a bit careless, the opposite of tense and self-conscious — i.e. flow. coach-intake/intake_knowledge · transcript-img-6369
  • Progress itself is the dopamine: reviewing daily/weekly wins, completing concrete complex tasks, uninterrupted concentration. Also: showing my work to a friend who gets it (Kochi + the pipeline tool). coach-intake/intake_knowledge · notion-power-down-ritual; selfi-journal/coach_reflections · hc_2026-06-15_dopamine_top1
  • Negative motivators I installed on purpose: fear of becoming "a drug addict, 9-5, public ridicule"; "What will Klárika say?"; "Robi and Peti would justifiably keep looking down on me." coach-intake/intake_knowledge · apple-notes-c1-psychology
  • Gamification works on me — framing deprivation as "a damn good challenge" converts it into something I want to win. coach-intake/intake_knowledge · apple-notes-c3a-goals
ContextDesired Identity
  • The written target identity (Hungarian affirmation stack, third person): "Matyi takes 100% responsibility for how he spends his time" — disciplined on workdays, knows when work starts and ends, sticks to the plan even when not in the mood, gets into Flow easily, lets temptation pass by. coach-intake/intake_knowledge · notion-power-down-ritual
  • "Matyi is decisive, a man, a true leader." "Matyi recharges every day and week with consciously scheduled rest." "Matyi is an excellent salesman — a winning personality." coach-intake/intake_knowledge · notion-power-down-ritual
  • WARRIOR frame: "I accept that I MIGHT FEEL AWFUL (bottom 10% days happen every ~10 days). I am able to stick to the fucking plan in either instance." Plus: "I am the master of my reality"; "the suffering is not in the way, it IS the way." coach-intake/intake_knowledge · notion-power-down-ritual, notion-today-start
  • The General vs the Soldier (Charlie Morgan frame he adopted): the General watches from third person and steers the body when the limbic system begs for relief. Also Static self vs Becoming self. coach-intake/intake_knowledge · notion-answer-these-rec Q17; intake_topics · topic_identity-frames
  • Confidence creed: "I'm not here to be understood… I'm here to be me"; "I'm not performing for people who won't remember me or won't be at my funeral." Confidence = a stellar reputation with myself; discipline is self-care for my future self. coach-intake/intake_knowledge · apple-notes-c3a-psychology
  • Cosmic humour as a permanent way of being — the perspective that reliably brings me joy. coach-intake/intake_knowledge · cgptvoice-038
  • Identity exercise I set myself: write and record my professional introduction as my 30-year-old self — the gap between the two versions is the identity delta I'm working. coach-intake/intake_knowledge · notion-to-schedule
ContextFrustrations
  • The master pattern: things go well → I overcommit → I collapse → I lose all motivation → repeat. Written to a psychologist at 22, still live. coach-intake/intake_topics · topic_overcommit-collapse-cycle
  • "I set the bar too high and thereby drastically lower my chance of success." Example: staking 180,000 HUF on no-kratom + minimal weed + all ten habits perfect, every day — piling "and also" onto an unwinnable target. coach-intake/intake_knowledge · transcript-2026-04-11
  • Dispersion: six systems at once instead of one path deep; "I don't want to be a business model hopper again." coach-intake/intake_topics · topic_dispersion-vs-focus; selfi-journal/journal_chunks · 2026-04-30
  • Over-planning: "thousands of pages of notes about myself… I've spent more time planning the perfect daily routines than executing them." coach-intake/intake_knowledge · cgptvoice-087
  • Hours ≠ progress: "when it's hard I check out somehow, awareness slips, and I only notice afterward that several hours are gone." Average useful work: 2–3 hours a day. coach-intake/intake_knowledge · transcript-2026-04-15
  • Broken promises to myself — the deepest frustration: "I can't keep up with my promises to myself"; "I'm tired of trying, then failing, then trying again." coach-intake/intake_knowledge · cgptvoice-063
  • Performance compulsion: "what exists is never good; you always want more… you don't dare stop." 4 weeks without a full day off while knowing 3 days rest + 5 work beats 8 days grinding. coach-intake/intake_knowledge · pdf-psychology-sessions
  • Current (June–July 2026): ~5h sleep/week-long stretch, working till 2–4 AM, no off-switch between work and home, CBG/weed loop, kratom relapse after a 2-month clean streak. selfi-journal/coach_reflections · refl_2026-06-20, refl_2026-06-27, refl_2026-07-03
ContextWhat I'm Running From
  • The family pattern. At my grandfather's funeral: "practically everyone has something seriously derailed" — a hard alcoholic, broken marriages, suppressed anger and money resentments. "Decent people, but it was a bit frightening." This is my fear-image of what happens unexamined. coach-intake/intake_knowledge · pdf-psychology-sessions
  • Becoming "a drug addict, 9-5, public ridicule." coach-intake/intake_knowledge · apple-notes-c1-psychology
  • The 3-months / 1-year / 3-years negative visualisation I built into my own evening ritual: what the damage looks like if I keep using weed/kratom this way, if I keep breaking my own promises, if I pity myself and procrastinate. coach-intake/intake_knowledge · notion-power-down-ritual
  • The deathbed regret question I wrote myself: "In 5 years, will my biggest regret be failing in the international market, or forgetting to actually live while grinding in a dark room?" coach-intake/intake_knowledge · notion-answer-these-rec Q9
  • Not being taken seriously — "I look like a 17-year-old with no facial hair"; "we're a couple of kids with no case studies." coach-intake/intake_knowledge · cgptvoice-087
  • Being unlovable / a burden. Learned from my mother's inability to set limits; shows up as convincing and begging partners instead of attracting. coach-intake/intake_topics · topic_self-worth-external-validation
  • Running out of runway — "about two months of funds left while paying two part-timers." coach-intake/intake_knowledge · cgptvoice-017
ContextLimiting Beliefs & Reframes
Belief (mine, verbatim where possible)The reframe that actually landed
"Valuable things are fought for and not achieved easily" → so I can't make money fastCounter-evidence: high-school and language exams came without struggle coach-intake/intake_knowledge · cgptvoice-079
"I need a complex, perfect amount of information to start"Self-corrected: the real problem is distraction by information, not lack of it coach-intake/intake_knowledge · cgptvoice-095
"I don't keep promises to myself" — near-impossible to build fromRebuild self-trust through small kept promises first; integrity streak ("did I do what I said today?") over willpower coach-intake/intake_knowledge · cgptvoice-063, cgptvoice-022
Black-or-white: either "really disciplined" or "totally fucked up"One slip is priced into the model; be gradual, plan modestly coach-intake/intake_knowledge · cgptvoice-022, transcript-2026-04-11
"I'm going to need drugs for prolonged focus""Even feeling worse gives me more, self-esteem-wise, than a few hours of comfortable chemical productivity" coach-intake/intake_knowledge · pdf-psychology-sessions
"I'm the only one who can do this right" (delegation blocker)Named by me as one of my two most damaging IDs coach-intake/intake_knowledge · notion-power-down-ritual
"Túl fáradt vagyok, nem vagyok elég kipihent" ("I'm too tired, not rested enough")The somatic excuse pattern — named and flagged by me coach-intake/intake_knowledge · notion-power-down-ritual
Discounting the positive ("that success was just the kratom")"I've been confident in improv before without kratom; the skills carried me" coach-intake/intake_knowledge · cgptvoice-027
Feeling inferior in a dominant groupMy own anti-'beta' kit: "we're floating on a mudball"; "in a day I won't remember this"; "the brain is plastic — I've already changed enormously" coach-intake/intake_knowledge · pdf-jelenlegi-helyzetem

Structural note in my own words: "When I'm consciously aware of my thinking, it's almost always positive. But the thought patterns that actually steer my behaviour are the negative schemas — I rarely catch the concrete thought in the act." coach-intake/intake_knowledge · pdf-psychology-sessions

ContextWhat Works On Me (coaching levers)
  • Calibrated tough love, on request: "be really provocative and trigger my insecurities in a constructive way," "be even quite harsh, swear at me," "accuse me of stuff that might not be true." Rationale: "if you are too kind with me, it won't stick." coach-intake/intake_knowledge · cgptvoice-121
  • Warm greeting first, then the work — I explicitly asked a coach to greet me warmly at the start of each chat. coach-intake/intake_knowledge · cgptvoice-095
  • 75/25 ratio: 75% understanding and organising me, 25% new perspective. "I'm here for spiritual growth and identity change, not the life hacks." coach-intake/intake_knowledge · cgptvoice-038
  • Reply length: no ceiling. Long, substantive replies are welcome — Matt confirmed the old length-cap claim was never true. The coach reads its live directives from store.get_directives() (the directives.json file on the Modal Volume); Pinecone selfi-journal/coach_directives · dir_1780866744488 (SUPERSEDED 2026-07-26) is an archive, not the live source.
  • Written + staked commitments work; unwritten ones feel optional. "For important decisions I write it down." Money stakes (180k/200k HUF to a disliked org) and an accountability-partner agreement with Dani are my own inventions. coach-intake/intake_knowledge · notion-stuff-i-learnt, transcript-2026-04-21, transcript-2026-04-15
  • Ritual responses (my curated recharge menu — prescribe straight from it): cold shower on waking; 15-min phone-free walk; NSDR/meditation; light gym + sauna; hot bath + reading; long walks with audiobooks; 1.5h coffee/walk meetups; improv; flow-state Figma sessions; making something visual (clay, doodling); building roadmaps. coach-intake/intake_knowledge · notion-power-down-ritual
  • Structures that have worked: the 5:00–5:30 wake + Morning Mindset Guide read aloud; the Power Down Ritual (review goals → define tomorrow's WIN + timeblock → close loops → tracker/gym/meditate/meal prep); "Daily success = 5 done" checklists. coach-intake/intake_knowledge · notion-to-schedule, notion-power-down-ritual, cgptvoice-087
  • Identity over goals — "I am someone who follows through" beats "I'll go to the gym"; I keep a Huberman reference on exactly this. coach-intake/intake_knowledge · coachref-huberman-self-talk
  • The 10-minute window is where relapse is decided: "in the ~10-minute window while I decide and take it, it seems like a really good idea." Interventions must land inside it (delay rituals, written reframes), not after. coach-intake/intake_knowledge · pdf-psychology-sessions
  • Prep the night before — most bad mornings trace to a laptop and first task not prepared. coach-intake/intake_knowledge · transcript-2026-04-14
  • Breaking the pattern is itself a reward: the day I launched campaigns before the coach could finish his Monday-plan speech was a highlight. selfi-journal/journal_chunks · coachday_2026-07-06
ContextRed Lines (what a coach must never do)
  • Never stack conditions into an unwinnable commitment. My documented failure mode is "I'll do in one week what should take a month." Ask for ONE thing, modestly sized. coach-intake/intake_knowledge · transcript-2026-04-11
  • Never treat a slip as a verdict. Black-and-white framing turns one slip into "the day's a write-off, the week's a write-off" and then into a multi-day collapse. coach-intake/intake_knowledge · transcript-2026-04-11
  • Never use shame as the primary lever. Shame is the engine that turns one slip into a spiral; harshness is welcome on the behaviour and the excuse, not as a verdict on my worth. coach-intake/intake_topics · topic_shame-cascade-integrity; intake_knowledge · cgptvoice-121
  • Never lecture at length or repeat questions. Don't re-ask what I already answered ("stop asking about cola"). Reply length itself has no ceiling — long, substantive replies are welcome. selfi-journal/coach_directives · dir_1780866706921, dir_1780866744488 (SUPERSEDED 2026-07-26)
  • Never hand me another planning artefact as the fix. Over-planning is a symptom, not the cure — I have thousands of pages already. coach-intake/intake_knowledge · cgptvoice-087
  • Never moralise about substances or demand a dramatic quit vow. The "last day before the challenge" → broken promise → shame loop is well documented; I'm consciously avoiding the promise cycle. Environmental fixes over willpower vows. coach-intake/intake_knowledge · cgptvoice-022; intake_topics · topic_substance-control-loop; selfi-journal/coach_reflections · refl_2026-06-17
  • Never push more work when the honest read is that I need rest. My bias always says more work is better; the correction I asked for is someone telling me to stop. coach-intake/intake_knowledge · transcript-img-6434
  • (Thin coverage — an explicit "never do X to me" list has not been captured directly; the above is inferred from documented failure modes. Needs a discussion with Matt.)
ContextPeople a coach must know

Dani (brother, developer, fulfilment — paid ~550k HUF, the "bus test" risk) · Kati (younger sister, the one I want to buy a guitar and music camp for) · Anyu (mother — her drinking and limitlessness are the root of my "I am a burden" belief) · Apa (father — distance, the money ceiling, "success beyond dad would be bad") · Kocsy / Kocsi-Gergő / Gergő (one and the same person — closest friend, my proof-of-success audience, no official role; "meeting him is always a good idea") · Boti, Norbi (commission/ads) · Réka (2-year ex whose cheating still sets my bar for connection) · Zoltán Jánosi (CBT therapist) · Mentor personas: Alex Hormozi, Sam Ovens, Charlie Morgan. coach-intake/intake_topics · topic_family-mother-kati, topic_father-money-ceiling, topic_team-delegation-bus-test, topic_reka-romantic-template

ContextWhere I am right now (July 2026)

Back at my parents' house — and I currently can't afford to move out. Agency running websites + B2B cold-email lead-gen; building a pipeline/CRM automation tool that I believe is huge leverage (and that also eats my sales time). Daily kratom use has restarted. Sleep is the weakest link. selfi-journal/coach_reflections · refl_2026-06-20 → refl_2026-07-03; hc_2026-07-15_revenue_action; updated 2026-07-26 (Matt review)

Doris —This file is the real spec: the Red Lines and the 10-minute relapse window matter more to your day than any timetable I could design. Wire it into the agents before you tune anything else.
S2🕰️ Your Day — The Timeline 2:43
5:00
Wake. Cold shower first — 60–90 seconds, no audio, phone stays outside the room. Then, dry and sitting down, the morning audio starts from Telegram. You say the affirmations out loud. You see and FEEL the version of you who already did it.
5:03–5:21
The full morning ritual, after the shower: affirmations → 2-minute custom identity-shift visualization → 10 minutes of silence (meditation) → one gratitude sentence → one sentence naming what you planned yesterday and the exact first step to start right now. S3 holds the canonical ordered list with durations — this row is the clock, S3 is the ritual.
5:30–8:30
THE SACRED BLOCK. Three hours. Planned step-by-step yesterday evening. Handwritten tick-off list in front of you. The boss you created yesterday assigned this — no renegotiation, no new ideas mid-flight. New ideas go on the distraction-capture paper next to the list. Email time inside the block runs on reviewing the AI-generated drafts.
8:30–17:00
The working day. Somewhere in it: R3, your 15 minutes of exercise.
17:00
HARD STOP. You say the magic words — you invoke I-will-do-a-planning-session-in-15-mins — and the machine starts working for you. You get an NSDR prompt immediately: 10 minutes of non-sleep deep rest while the pipeline assembles everything.
17:30–19:00
Gym. Your workout audio is waiting if you want it. Meditation comes sequentially with the workout: 20 minutes in the sauna, or in the car after. The coach will check in on both later — by phone, at the time you name.
~19:15–19:50
THE PLANNING CALL. The heart of the system. Fresh from the gym, brain washed by NSDR and iron. The coach has spent two hours preparing for this conversation.
~20:00–21:00
60 minutes of real relaxing: reading, calling a friend, a documentary, origami. You told the coach in the call what it would be. Then hot shower, and in bed around 21:00. (Your original note said 20:00 bed — with the post-gym call the physics land at ~21:00. Comment on this card if you want a different trade.)
21:00 → 5:00
Sleep. Eight hours. The system runs the night shift for you.

All times are Europe/Budapest (COACH_TZ) — which is now also your local time. You are in Hungary, not Lisbon; there is no second timezone in this system.

Doris —Two protected peaks a day — 5:30 and the gym — with recovery between them is a real flow architecture, not a wish list. The 21:00 bed is the load-bearing wall; if it slides, the 5:00 wake is fiction.
S3🌅 R2 — The Morning Audio 3:34 · re-cut twice 2026-07-26

While you sleep, the nightly run reads every transcript you've ever produced with the coach — last two weeks in full, everything earlier as summaries — plus yesterday's plan and habit sheet, and builds one MP3, waiting in Telegram when your alarm fires.

Structure, in order:

  1. Affirmations — written from YOUR goals and YOUR words in past calls, with explicit prompts to say them out loud — sitting down, dry, after the shower.
  2. Identity-shift visualization, 2 minutes — custom-made each night: you, having already achieved the specific goals currently in play, described concretely enough to feel.
  3. Silence, 10 minutes — your meditation block. The audio holds the space; no talking.
  4. The gratitude line — one sentence engineered to make you grateful and motivated today.
  5. The launch line — one sentence: what you planned yesterday evening, and the first physical action to take the moment the audio ends.
  6. Two mentor cameos, ~30 seconds each — the context assembler picks the 2 mentors whose push matters most today. Charlie Morgan speaks in the "Chocho" voice, Sam Ovens in "Soso", Rian Doris in "Dodo", Alex Hormozi in "HohoMO" — all four already live in your ElevenLabs account, permanently assigned, so your ear learns who's talking. Each cameo is drawn from that mentor's indexed corpus (8,297 passages) whenever retrieval succeeds. When Pinecone rate-limits — a known, recurring failure on this stack — the cameo is written from the day's facts and that mentor's lens only, must invent no quotes, and the audio says so in one clause: "no corpus tonight — this is the lens, not a quote." Doris's corpus is the thinnest of the four.
    Status (2026-07-26): all of the above is spec, not running code. Today the cameos are hand-fed — morning_audio.py reads mentor_cameos straight out of the night's plan JSON and hard-fails unless there are exactly two. It performs no retrieval, no mentor selection and no degradation, and there is no assembler to do the picking. The retrieval primitive itself is real (store.query_mentor, reached via actions.py _quote_mentor) but nothing in the morning chain calls it. Automatic selection and corpus retrieval are open gaps — see GAPS "The night shift doesn't read back yet" (item 6, cameo selection unwired) and "No orchestrator" (item 3, nothing exists to run the pick); the degradation rule above is the spec for when they are built.

If the morning audio is not there (R2 scoring). Two facts, and they are different. Day 1 IS armed: a hand-built morning audio sits on the live Modal Volume (outbox.jsonday1-morning-audio-2026-07-26, due 04:56 Europe/Budapest, 4-hour TTL) and its mp3 is hosted and returns HTTP 200 — the 10-minute scheduler() cron fires it. Day 2 onward is not: there is no recurring nightly generator, so every later morning has to be hand-built the same way until one exists (GAPS "No recurring nightly morning-audio generator", item 15). A morning with no audio file is not a missed ritual. R2 is scored on the ritual, and the ritual is exactly the list above: cold shower, then — dry and sitting down — (1) affirmations out loud, (2) the 2-minute identity visualization, (3) ten minutes of silence, (4) the gratitude line, (5) the launch line, read off this page if the mp3 is missing. The two mentor cameos — the sixth part of the ordered list above — are audio content, not an action you perform — they are never required for R2 to count, and their absence is never a miss. Only skipping the five spoken parts misses R2. A missing file is a system gap and gets logged as one, not charged to Matt's 50-of-60 — the same rule the clock block at the top of this page applies to Day 0.

Total: 16–18 minutes of audio. Shower 60–90s, dry and sit, audio ~5:03–5:21. You get 9–11 minutes of slack before the 5:30 block (16 min from 5:03 ends 5:19 → 11 minutes; 18 min ends 5:21 → 9) — that slack is the design, not waste. (S2's timeline row now reads 5:03–5:21 to match; DECISIONS-LOCKED's locked "5:00–5:27" carries a round-4 annotation naming 5:03–5:21 / 9–11 minutes as the current answer — an earlier round-2 annotation there said 5:00–5:22 and is superseded.) Why the mp3 lands at 04:56, not 5:00: the outbox entry is timed a few minutes early so the file is already sitting in Telegram when the alarm goes — the delivery is 04:56, the ritual still starts at 5:00 with the shower.

Doris —Priming before the block is right, but keep the 10 minutes of silence sacred — that's the part that actually sets up focus, and it's the first thing you'll be tempted to trim.
S4🌙 R1+R4 — The Evening SkillI-will-do-a-planning-session-in-15-mins 2:29

You type (or say) the skill name once, at 17:00. Everything else is machine.

Instantly: the NSDR prompt lands in Telegram — a 10-minute non-sleep deep rest audio. You lie down. The pipeline spins up behind you:

  1. Session harvest — extracts of every Claude Code session you ran today, local and cloud: what you actually worked on, compared against what yesterday's plan SAID you'd work on. This becomes the confrontation material: which distractions you leaned into, and what they cost against the 6-calls-a-week goal.
  2. Transcript memory — the last two weeks of call transcripts in full, older history summarized, your habit sheet, your long- and mid-term goals.
  3. Dani prep — reads Dani's Notion Main Tasks database filtered on Deadline = today, and drafts tomorrow's tasks for him. You edit the drafts during the call; nothing is sent without you.
  4. The Council — five agents, each running Opus at medium effort, each receiving the full data pack: Alex Hormozi, Sam Ovens, Charlie Morgan, Rian Doris — and "Matt", an agent whose only job is to represent what YOU would say. Each writes a handoff.
  5. The Assembler — one more Opus-medium agent merges the five handoffs into the planning coach's context: tonight's agenda, the confrontation points, the praise points, Dani's list, and the open decisions.
  6. The pre-call briefing — a 1–4 minute audio in Telegram: what got done today, what's in progress, probable next steps, tonight's agenda — plus 1 to 3 thirty-second mentor truths: the things you need to hear even if uncomfortable, each in that mentor's voice.
  7. The choice — two buttons in Telegram: 📞 phone call, or 🎙 live voice in the mini app. You pick. The call starts.

By the time you're back from the gym, the machine has been ready for an hour.

These sub-cards are reference material — the exact text that ships. They have no ▶ audio button on purpose; the card's own audio summarizes them.
SkillThe evening skill — full definition.claude/skills/I-will-do-a-planning-session-in-15-mins/SKILL.md
Long. Collapsed by default, scroll inside the box.
---
name: I-will-do-a-planning-session-in-15-mins
description: Matt's 17:00 hard-stop trigger for the 60 Days Get Shit Done Challenge. Fires the 10-min NSDR audio instantly, then (while he rests and goes to the gym) assembles the evening planning coach's context — today's Claude Code session extracts vs yesterday's time blocks, call transcripts, habit sheet, goals, Dani's Notion tasks — runs the 5-agent mentor council + assembler, sends the pre-call /tts briefing with mentor truth clips, and offers the call channel. Trigger phrases — "/I-will-do-a-planning-session-in-15-mins", "I will do a planning session in 15 mins", "evening planning", "plan my day", "planning session", "planning session in 15", "evening planning time", "it's 17:00".
---

I-will-do-a-planning-session-in-15-mins

The daily R1+R4 ritual of the 60 Days Get Shit Done Challenge. Matt types or says the
skill name once at 17:00. Everything after that is machine. Canon: plans/system-reset-2026-07-25/DECISIONS-LOCKED.md
(this skill implements §"R1/R4 — The evening skill"). Nothing here may be re-decided ad hoc;
new ideas go to the parking lot in the approval doc.

Repo root for every relative path below:
/Users/agency/Documents/Agty/telegram coach — the real checkout. Never hardcode a worktree
path. Resolve it at run time and cd there before any relative path is used:
REPO_ROOT="$(git -C "$(pwd)" rev-parse --show-toplevel 2>/dev/null || echo "/Users/agency/Documents/Agty/telegram coach")"
case "$REPO_ROOT" in */.claude/worktrees/*) REPO_ROOT="${REPO_ROOT%%/.claude/worktrees/*}";; esac
cd "$REPO_ROOT"
(worktrees are disposable — a run that writes runs/, audio-scripts/ or agents/ into one
loses them when it is removed. The telegram-coach/ app is a separate repo at
$REPO_ROOT/telegram-coach; use that path for every coach script.)

After any miss: MISS-PROTOCOL.md (this folder) is binding — comeback line first, day
counter never resets, miss logged as data plus one question. Read it before STEP 4 whenever the
sheet or the extracts show a miss, and restate its rules in the coach's context pack.

Day number: Day 0 = Sat 2026-07-25. DAY_N = (today - date(2026,7,25)).days. Day 1 = Sun 2026-07-26.
Say "Day {N} of 60" in every artifact this skill produces — briefing, call opening, Telegram texts.

Modal account gate — MANDATORY for every coach command:
export MODAL_RUN='env -u MODAL_TOKEN_ID -u MODAL_TOKEN_SECRET MODAL_PROFILE=telegram-coach python3 -m modal'

Run directory (all artifacts for one invocation):
plans/system-reset-2026-07-25/runs/{YYYY-MM-DD}/ — created at STEP 0, holds
{date}/datapack.md, {date}/council/{hormozi,ovens,morgan,doris,matt}.md, {date}-context.md,
{date}/briefing.txt, {date}/briefing.mp3, truth{1,2,3}.mp3, {date}/precall.mp3,
{date}/degraded.json, {date}/state.json — all created by the run, none present beforehand.

⚠️ NOT BUILT YET: a one-command orchestrator (run.py) and a STEP 1 fan-out driver
(harvest.py) under plans/system-reset-2026-07-25/scripts/, both referenced in
plans/system-reset-2026-07-25/agents/skill-scaffold.md, do not exist — do not cite line
numbers in them. That directory currently holds build_audio.py, el_speak.py,
harvest_sessions.py, make_sheet_tab.py and morning_audio.py only. Until they do, this SKILL.md is the runbook — Claude executes the steps directly with
Bash + Agent fan-out, in the order below.

---

STEP 0 — t=0s: NSDR FIRST. Nothing may block this.

This is the only step with a latency budget. It runs before any harvesting, before any
council, before reading anything. If STEP 0 has not fired within ~15 seconds of the trigger,
the ritual has already failed its one hard requirement.

0. Fire the planning-invoked marker — FIRST, before anything else. One fire-and-forget curl
   (~200ms).
   ⚠️ As of 2026-07-26 this does NOT disarm the ladder. A generic one-off cancel marker exists
   in modal_app.py, but the evening schedule entry does not consult it, so the 18:00 rungs still
   fire on a night the ritual already ran (GAPS: "No coach-side 'planning invoked' marker wired to the 18:00 entry", item 4). The curl is forward-compatible plumbing,
   not a disarm — expect the 18:00 escalation messages tonight and ignore them. Until the
   coach-side twin lands (see ESCALATION.md §"v1 shipped tonight"), the only thing that actually
   stops the ladder is invoking the ritual through the coach. Never skip the curl, never let it
   block the NSDR:
   ```bash
   MARK_TOKEN="$(python3 -c 'import hashlib,os;from dotenv import load_dotenv;load_dotenv(os.path.expanduser("~/.claude/.env"));print(hashlib.sha256((os.environ["TELEGRAM_BOT_TOKEN"]+":callme").encode()).hexdigest()[:32])')"
   curl -s -m 5 "https://matyas-sarudi00--telegram-coach-mark.modal.run?token=$MARK_TOKEN&key=planning_invoked:$(date +%F)" || true
   ```
   The token is derived from the bot token (sha256(TELEGRAM_BOT_TOKEN + ":callme")[:32]) —
   never write it literally into this file, into chat, or into a log.
   Expected: {"ok":true,"key":"planning_invoked:YYYY-MM-DD"}. If it fails, carry on with STEP 0
   anyway and retry once at the end of STEP 1 — a missed marker costs Matt a few stray nudges,
   a delayed NSDR costs the ritual.

1. Print to Matt, immediately, verbatim-in-spirit:
   > NSDR now. 10 minutes. Lie down, eyes closed, do nothing.
   > Day {N} of 60 — Get Shit Done. Planning call after the gym, ~19:15.
   > The machine is assembling your context while you rest. You don't have to think about it.
2. Send the NSDR audio to Telegram. Never synthesize at trigger time — sending a file or a
   link is a 2-second operation; a preview-TTS call is 1–2 minutes against a step whose whole
   spec is "fired within ~15 seconds".
   ⚠️ As of 2026-07-26 plans/system-reset-2026-07-25/audio-scripts/nsdr-10min.mp3 is NOT on
   diskaudio-scripts/ holds only the .txt/.json sources; the render existed once, in a
   worktree that no longer exists. So: send the hosted link (below) unless you have re-rendered
   the mp3 first with the build command below. The render was
   verified at 608s (10:08) and is built by scripts/build_audio.py from the segment timeline
   audio-scripts/nsdr-10min.json (real silence between cues; final segment is silence_fill
   so the render always lands on target_total_s: 600). It is also hosted, so a link works when
   the file upload doesn't: the hosted.url field inside audio-scripts/nsdr-10min.json
   (R2 library item 20260725-210248, duration_s: 608).
   ```bash
   # send the cached file (Telegram sendAudio)
   python3 - <<'PY'
   import os, json, pathlib, urllib.request
   root = pathlib.Path("plans/system-reset-2026-07-25/audio-scripts")
   mp3  = root/"nsdr-10min.mp3"
   url  = json.loads((root/"nsdr-10min.json").read_text())["hosted"]["url"]  # fallback
   print(mp3, mp3.stat().st_size, url)
   PY
   ```
   Send nsdr-10min.mp3 with caption NSDR 10 min — Day {N} of 60 once it exists; if it does
   not, or the upload fails, send the hosted.url link as plain text — the audio is already public.
   Re-render it (also whenever the script changes):
   ```bash
   python3 plans/system-reset-2026-07-25/scripts/build_audio.py \
     --segments plans/system-reset-2026-07-25/audio-scripts/nsdr-10min.json \
     --out plans/system-reset-2026-07-25/audio-scripts/nsdr-10min.mp3
   ```
   (audio-scripts/nsdr-10min.txt is the superseded first draft — ~3 min of speech, no real
   silence. It is kept only as source material. Do not send it to /tts at 17:00.)
3. Kill today's escalation ladder — write the invocation marker (see ESCALATION.md):
   ```bash
   python3 - <<'PY'
   import json, pathlib, datetime
   p = pathlib.Path("plans/system-reset-2026-07-25/runs")/datetime.date.today().isoformat()
   p.mkdir(parents=True, exist_ok=True)
   (p/"state.json").write_text(json.dumps({"planning_invoked": datetime.datetime.now().isoformat(timespec="seconds"), "ladder": "disarmed"}))
   print(p/"state.json")
   PY
   ```
   ⚠️ NOT BUILT YET: the coach-side twin of this marker. The authoritative ladder runs on
   Modal off state.json on the coach-data Volume (COACH_DATA_DIR=/data, modal_app.py) —
   a planning_invoked:{date} key must be set there too, or the 18:00 evening schedule entry
   fires anyway. See ESCALATION.md §"Where state lives".

Failure handling: if the file upload fails, send the hosted.url from nsdr-10min.json as a
link. If Telegram itself is unreachable, send the text prompt alone via the coach's own path and
tell Matt plainly: *"NSDR audio didn't send — play it from the link / run your own 10-minute
timer, eyes closed. Everything else is on track."* Log
{"step":0,"degraded":"nsdr_audio","detail":"<error>"} to runs/{date}/degraded.json.
The ritual never stops for a dead dependency. It degrades and says so.

---

STEP 1 — The DATA PACK (parallel fan-out, runs while Matt does NSDR + gym)

Item 0 — always first in the pack: plans/system-reset-2026-07-25/agents/matt-core-context.md verbatim (who Matt is; Red Lines binding on every agent).

Budget: ~2 hours (17:00 trigger → ~19:15 call). Nothing here is user-blocking. Fan the six
harvests out concurrently — one Agent per lettered item where it needs judgment, plain Bash
where it's mechanical. Write everything into ONE file: runs/{date}/datapack.md, with a
top-line ## DEGRADED section naming anything that failed. Every council member gets the
identical datapack (council.md's hard requirement).

(a) Today's Claude Code session extracts — local AND cloud

Harvester: plans/system-reset-2026-07-25/scripts/harvest_sessions.py — this is the one to
run. It discovers every project dir under ~/.claude/projects/* (so new worktrees, including
this one, are never silently missed), takes a real date window, flags cloud/devbox origin
(-home-* project dirs), and buckets each turn by that turn's OWN timestamp, so a session
that crosses midnight lands its evening turns on one day and its after-midnight turns on the
next. It imports the proven JSONL parsers from
plans/system-reset-2026-07-25/session-extracts/extract.py rather than forking them; that
extract.py is itself the older, hardcoded (SOURCES, MTIME_CUTOFF=2026-07-13, fixed OUT_DIR) two-week
bulk tool — do not use it for the daily run.

python3 plans/system-reset-2026-07-25/scripts/harvest_sessions.py \
  --since today --out "plans/system-reset-2026-07-25/runs/$(date +%F)/extracts" --json
ls "plans/system-reset-2026-07-25/runs/$(date +%F)/extracts/$(date +%F)/"
Real CLI (verified): --since (ISO date or today, default today) · --until (inclusive) ·
--out (per-day subfolders are created under it) · --projects <glob> · --json · --quiet.
Output per day: <out>/<date>/<project>__<sid8>.md (one file per session-day slice, header
carries Cloud/devbox origin, that day's first/last timestamp, and a Session spans note when
the session crossed a day boundary) plus <out>/<date>/_SUMMARY.json. Idempotent — deterministic
filenames, re-running the same window overwrites in place.

Then delegate ONE Agent (Sonnet, medium) to read only today's harvest files and return, ≤40
lines: what Matt actually worked on today, in order, with rough time spans from the timestamps,
each item tagged [local] or [cloud], plus every visible context-switch.

Failure handling: extractor errors or zero sessions today → note no session data in the
datapack. The council must be told explicitly ("no Claude Code activity was captured today"),
because "he did nothing" and "the harvester broke" are different accusations and the coach must
never confuse them on the call.

(b) Yesterday's time blocks — Google Calendar

Yesterday's *plan* has two sources; use both, prefer the calendar for what was actually blocked.
1. Calendar (primary): mcp__workspace-mcp-clientsflow__get_events for yesterday
   00:00–23:59, Matt's primary calendar. This is the plan-of-record because he clicks the blocks
   himself during the call (agenda step 4).
2. The typed plan (secondary, if present): the sibling evening-planning skill writes
   .claude/skills/evening-planning/daily/{date}-plan.md (plus a {date}-plan.html twin and a
   fixed-name latest-plan.md copy; the daily/ dir is created lazily on that skill's first run) —
   verified in make_plan.py (DEFAULT_OUT = SCRIPT_DIR.parent / "daily"). Read yesterday's if
   it exists; it carries the ranked #1 and the handwritten first-block list.

Failure handling: Calendar MCP unauthenticated or erroring → fall back to the plan .md alone;
if neither exists, fall back to yesterday's call transcript (item c) and mark the STEP 2 critique
evidence: transcript-only. Never fabricate blocks — an invented time block would make the
confrontation dishonest, which is the one failure mode this ritual cannot survive.

(c) Call transcripts — last 2 weeks full + rolling summary of everything older

- Repo archive: call-transcripts/ at the project root (naming pattern *YYYY-MM-DD-HHMM-call.md*).
- Live coach transcripts: Modal Volume coach-data at /data/transcripts (written by transcripts.py; served by the /transcripts route in modal_app.py).
- Semantic memory: telegram-coach/scripts/store.pysearch(namespace, query, k, flt),
  recall(query, k, when), compact_recall(query, when), over C.NS_CONVERSATIONS /
  C.NS_REFLECTIONS / C.NS_JOURNAL_CHUNKS (Pinecone index selfi-journal).

Last 14 days go in full. Everything older goes in as a rolling summary — write it once to
plans/system-reset-2026-07-25/runs/*_rolling-summary.md* and update it nightly rather than
re-summarizing 60 days of transcripts every evening.

Failure handling: Pinecone down or the org embedding cap 429s (a known recurring failure —
see memory mentor-brains) → use the flat files in call-transcripts/ + /data/transcripts
only, and mark the datapack memory: files-only, no semantic recall. The council still runs.

(d) Habit sheet state — the "60-Day Challenge" tab

Scaffolder: plans/system-reset-2026-07-25/scripts/make_sheet_tab.pyverified read.
CLI: --dry-run, --tab "60-Day Challenge" (default).
The header is whatever make_sheet_tab.py's HEADER defines — read it, never hardcode a
column order here or anywhere else. As of 2026-07-26 it is 14 columns (Day#, Date, the four
ritual ticks, Calls booked (number), Sleep h, Wake time, Substances (0 or what),
Block held (0/1), Block minutes, R5: outbound before 10:00 (number), Note); index by
column NAME, never by position. DAY0 = 2026-07-25, seeds 61 rows, idempotent, never overwrites
Matt's marks (the sheet is his handwriting surface). It reuses telegram-coach/scripts/sheet.py
for auth and needs TRACKER_SHEET_ID in the environment.

Sleep / Wake time / Substances are data, not confession (see MISS-PROTOCOL.md): the coach
never asks Matt to narrate those three aloud, never comments on their values, and never carries a
value into the mirror beat or the council datapack unless Matt raises it himself.

Read the tab (all rows up to today) and compute, for the council: current streak per ritual,
total completion % per ritual, and every miss with its date. Read helpers in sheet.py:
get_day(date), _row_map, sheet_url() (tab name comes from COACH_SHEET_TAB).

Failure handling: Sheets auth/quota failure → fall back to the last known sheet snapshot in
runs/{date-1}/datapack.md, mark it stale, and have the coach ask Matt to read his own row
aloud during the call (he pens it by hand anyway — he is the source of truth here).

(e) Long-term and mid-term goals

Canonical, in priority order: the approved SELF OS doc §S1 (plans/system-reset-2026-07-25/doc-content.md),
GOALS.md at the project root, and plans/system-reset-2026-07-25/notes/goals-synthesis.md.
The one number every council member must be handed: 6 booked sales calls/week, feeding the
60-website mission, with 2M Ft/mo recurring as the anchor underneath. State the conversion
honestly in the datapack — 6 booked calls at a realistic close rate (~1 in 3) is ~2 new sites a
week, so "6 calls/week = 5–10 sites/week" is arithmetic that does not hold and must not be
handed to any agent or said to Matt. The measured number is the calls. 60 sites is the 12-month mission, not a challenge target — at ~2 sites/week the 60 days produce roughly 17 sites.

Failure handling: goals files are local — if any is missing, use DECISIONS-LOCKED.md §Mission
verbatim. This item cannot hard-fail.

(f) Dani — Notion "Main Tasks", Deadline = today + DRAFT tomorrow's tasks

Verified live 2026-07-25 (Matt's OAuth): DB 5ee93d2f-8798-4549-b024-392ebff9ab4b
("✅ Main Tasks"), data source collection://5623fd87-e594-4f63-80e1-b696bd6d9155,
Dani = user://18532b9e-b498-49f0-b367-21108c37b860. Filter fields: Task,
date:Deadline:start, Assign, Status. A deadline-filtered SQL query via the Notion MCP
returned real rows — use notion_client.py in production, MCP as the manual fallback.

Client: telegram-coach/scripts/notion_client.pyverified read. Real functions:
resolve_dbs() (discovers Main Tasks + CRM by search, honors the sandbox override),
introspect(db_id) (property names are discovered, never assumed),
tasks_due(spec, when="tomorrow"), query_tasks(spec, flt),
create_task(spec, title, deadline=None, status=None), update_task(spec, page_id, ...),
parse_when(text). Database ids are DISCOVERED at runtime — do not hardcode one. Auth:
NOTION_API_KEY. Sandbox: COACH_NOTION_DB_OVERRIDE; the production id is refused when
COACH_SIM=1.

Two outputs:
1. Review list — today's Deadline=today tasks with status, for the call's Dani beat.
2. DRAFT tomorrow's tasks — a proposed list, written to runs/{date}/dani-draft.md only.
   Nothing is created in Notion during STEP 1. create_task() is called *after* the call,
   and only for the lines Matt confirmed. This is a send-gate, not a preference: the doc
   promises "nothing is sent without you."

Failure handling: Notion API error / missing key → skip the Dani beat, put
DEGRADED: Notion unreachable — Dani beat skipped tonight at the top of the datapack, and have
the coach say that out loud on the call rather than silently dropping an agenda item.

---

STEP 2 — The CRITIQUE (plan vs actual)

One Agent, Opus, medium effort. Input: (a) today's extracts + (b) yesterday's blocks +
(e) goals. Output ≤25 lines into runs/{date}/critique.md.

Required shape — every line evidence-bound:
1. Blocked vs actual, side by side. For each of yesterday's time blocks: what the extracts
   show he was actually doing in that window. Name the file, the session id8, the timestamp.
2. Name the distractions concretely. Not "you got distracted" — *"14:10–15:40, the block said
   outbound, the session shows you refactoring the artifact player (session 6924057e)."*
   A distraction with no timestamp and no session id is an opinion, and gets cut.
   Standing rule — building this coach system is a distraction. Time spent building,
   refining, debugging, QA-ing or re-planning the coach/challenge system itself counts as
   zero pipeline movement and must be named as a distraction whenever the extracts show it,
   with the same timestamp+session-id evidence standard as any other off-plan work. This
   includes the build sessions for this very skill. It is the most seductive form of the
   dispersion pattern because it feels like progress on the machine that makes progress — but
   no client, no booked call, no site came out of it.
3. Cost in days-to-goal. Convert each distraction to the metric that matters. Method, stated
   so it can be argued with rather than swallowed: the goal is 6 booked calls/week; the pipeline
   work that produces them is roughly N hours/week; hours spent off-pipeline today ÷ (weekly
   pipeline hours ÷ 7) = days of slip. Show the arithmetic. If the inputs aren't known yet,
   express it as "≈X hours that produced zero pipeline movement" and say the day-conversion isn't
   calibrated yet — an honest smaller claim beats a confident invented one.
4. What genuinely landed. Max 3, with the same evidence standard. The praise beat on the call
   is not optional and it is not flattery — it needs facts too.

Failure handling: no extracts and no calendar → skip the critique, write
critique: unavailable — no plan-vs-actual evidence today and tell the council so. The coach
then asks Matt directly what he did, and the mirror beat runs on his own account of the day.
The one thing forbidden: presenting an unevidenced guess as evidence.

---

STEP 3 — The Council (5 agents, parallel, Opus-medium)

Launch all five in a single message so they run concurrently. Prompts: verbatim from
plans/system-reset-2026-07-25/agents/council.md (§Hormozi, §Ovens, §Morgan, §Doris, §"Matt").
Every agent: subagent_type: general-purpose, model: opus, medium effort, and the
identical DATA PACK (runs/{date}/datapack.md + runs/{date}/critique.md).

Doctrine grounding is a hard rule, restated in every spawn prompt (subagents do not read
CLAUDE.md or this file): *"You may only assert positions grounded in the passages provided from
the indexed corpus in your data pack. If a claim isn't supported there, don't make it."*

Doctrine retrieval — RUN IT, don't assume it. Without this the council is five Opus agents
paraphrasing the same datapack in four accents. The mentor corpora live in the selfi-journal
index under the mentor_* namespaces (built by telegram-coach/scripts/ingest_mentors.py).
Use the production read path, verbatim — the same function the live coach's quote_mentor
action calls (telegram-coach/scripts/actions.py _quote_mentorstore.query_mentor):

# telegram-coach/scripts/store.py
store.query_mentor(query, mentor, k=3)
# mentor slug ∈ _NS_MENTORS (store.py): rian_doris | alex_hormozi | charlie_morgan | sam_ovens
# returns [{text, author, source, source_type, score}] — reranked, ingest header stripped,
# and [] cleanly on unknown mentor / no hits / ANY error (it never raises)
Run it from the coach repo so imports resolve:
cd "/Users/agency/Documents/Agty/telegram coach/telegram-coach/scripts"
python3 -c '
import json, sys, store
mentor, q = sys.argv[1], sys.argv[2]
print(json.dumps(store.query_mentor(q, mentor, k=3), ensure_ascii=False, indent=2))
' alex_hormozi "<today s themes: the critique s 2-3 headline themes, in plain words>"
One call per mentor, with a query built from today's critique themes (not a generic "give me
your philosophy"). Paste the returned passages — verbatim, with author/source — into that
mentor's data pack under a ## DOCTRINE PASSAGES heading. Note the mapping: the "Matt" agent
has no mentor corpus — it is a spawned Claude subagent, not the production Telegram/voice coach, and it is handed
matt-core-context.md + the journal directly in its prompt (nothing under telegram-coach/ reads that
file). rian_doris is Doris.

Fallback marker — explicit, never silent. query_mentor returns [] on failure (the
recurring org embedding-cap 429 among them). When it does, put this exact line at the top of
that mentor's data pack, and say the same in the spawn prompt:

DOCTRINE UNAVAILABLE — flag, don't paraphrase.

Meaning, restated in the prompt: *write from the day's facts and your lens description only;
open your handoff with [no doctrine retrieved]; do not invent, reconstruct or paraphrase a
quote, a framework name, or a "he always says" — an unsourced mentor line is worse than no
mentor line.* Log the failure in runs/{date}/degraded.json as {"step":3,"degraded":"doctrine","mentor":"<slug>"}.

Handoff shape — exactly as council.md defines it, restated in every spawn prompt:
Return max 15 lines, no preamble, no markdown fences:
(1) ONE observation Matt must hear.
(2) ONE concrete recommendation for tomorrow's plan.
(3) OPTIONAL: one line starting `TRUTH:` — ≤75 words, first person, in character,
    the uncomfortable thing Matt needs to hear tonight.
Write each handoff to runs/{date}/council/{name}.md.

Failure handling: a dead or empty agent is dropped, not retried into the ground — the council
runs with four. Log which one dropped in runs/{date}/degraded.json. If fewer than three return, skip the
assembler's TRUTH selection entirely and note it in the briefing; a one-mentor "council" is a
single opinion wearing a costume.

---

STEP 4 — The Assembler (Opus-medium, single agent)

Input: the five handoffs + the datapack + the critique. Prompt: council.md §The Assembler
verbatim. Output ONE file: runs/{date}/{date}-context.md, sections in this order:
1. Day number + streak state. On day 7, 21 or 40 the reward checkpoint goes here verbatim so
   the coach cannot miss it (Day 7: call Kocsy — a call, not a text · Day 21: move the guitar money
   across on the call · Day 40: name the interim reward out loud and book it that night — and, as a
   separate beat, if the retainers are not there by Day 40, name the fallback plane ticket and the
   earliest date it could be paid for).
2. Agenda deltas — what tonight's call must add to the standard agenda.
3. Confrontation points — plan-vs-actual diffs with evidence, max 3.
4. Praise points — real wins with specifics, max 3.
5. Dani — today's status + tomorrow's draft list.
6. Open decisions to close on the call.
7. TRUTH SELECTION — pick 1–3 of the flagged TRUTH: lines. Criteria, in order: most
   true today, most uncomfortable, most actionable. List each with its mentor and a one-line why.
   Each selected line must be ≤900 characters (the hard cap in el_speak.py; ~30s ≈ 450–500
   chars — write to ~500, not to the cap).
8. CAMEO SELECTION — 2 mentors + a ≤75-word in-character line each for tomorrow morning's
   audio. Produced here, consumed by the nightly chain, not by tonight's call.

The assembler is the only filter between the council and Matt's ear. Nothing else reaches the
coach — five raw handoffs in the coach's context would make the call a committee meeting.

Failure handling: assembler fails → fall back to a mechanical merge (critique + habit state +
Dani list, no truths) and mark the briefing council: unavailable tonight. The call still runs;
it just runs on facts instead of on facts + judgment.

---

STEP 5 — The pre-call Telegram briefing (1–4 min)

Sent so it lands while Matt is finishing at the gym (~19:00). Two audio layers, concatenated
into one mp3 so he presses play once.

5a — The body (1–4 min, /tts)
Script written to runs/{date}/briefing.txt. Structure, in order:
1. "Day {N} of 60 — Get Shit Done." (mandatory opener, every single night)
2. What got done today — from the extracts, concrete.
3. What's in progress — the open threads, where each one stands.
4. Most probable next steps — what tomorrow most likely needs, so he arrives at the call
   with an opinion instead of a blank page.
5. The call agenda — tonight's deltas from the assembler, not the whole standard agenda.

Format it per ~/.claude/skills/tts/SKILL.md STEP 1 before synthesizing: voice: / style: /
title: headers, --- beat separators, no emojis, numbers spelled for the ear. Length target
via the skill's own formula: chars ≈ minutes × 780 — so 1–4 min = 780–3,120 characters.
python3 ~/.claude/skills/tts/scripts/synth.py --in runs/{date}/briefing.txt --out runs/{date}/briefing
(synth.py --in --out = synthesis only, no hosting/sending — verified in the tts SKILL.md. Use
it here, not run.py, because the body must be concatenated with the truth clips before sending.)
Deepgram Aura-2 is the default backend and is the right pick for a nightly briefing: fast, cheap,
sub-200ms. Gemini/Charon is the fallback when the style direction actually matters.

5b — The mentor truth clips (1–3 × ~30s, ElevenLabs)
Script: plans/system-reset-2026-07-25/scripts/el_speak.pyverified read. Real CLI:
python3 plans/system-reset-2026-07-25/scripts/el_speak.py --mentor <name> --text "..." --out <file.mp3>
python3 plans/system-reset-2026-07-25/scripts/el_speak.py --list   # voice map + remaining quota
--mentor choices are exactly doris | hormozi | morgan | ovens. Hard cap 900 chars per
call (it exits with an error above that). Model eleven_turbo_v2_5. Key ELEVENLABS_API_KEY
read from ~/.claude/.env, never printed. Voice map baked into the script:

| Mentor | --mentor | Voice |
|---|---|---|
| Charlie Morgan | morgan | Chocho |
| Sam Ovens | ovens | Soso |
| Rian Doris | doris | Dodo |
| Alex Hormozi | hormozi | HohoMO |

Note: plans/system-reset-2026-07-25/notes/elevenlabs-voices.md §2 recommends adding a library
voice ("Justin") for the Hormozi slot. That recommendation is superseded — DECISIONS-LOCKED
§"Mentor voices" locks Hormozi to the account's existing HohoMO, which is what el_speak.py
implements. Zero setup, no POST /v1/voices/add. Do not re-open this.

Quota is a real constraint. Starter tier, ~93k characters remaining as of 2026-07-25, and the
nightly burn is truth clips (≤3 × ~500) + tomorrow's 2 morning cameos (~2 × 400) ≈ 2.3k
chars/day → roughly one month of runway. Check before each run with --list; when remaining
drops under ~10k, tell Matt in the briefing that the tier needs a bump — do not let the mentor
voices die mid-challenge without warning.

5c — Concatenate and send

⚠️ Must RE-ENCODE, never stream-copy. The two layers come off different pipelines with
different sample rates — the /tts body renders at 24000 Hz and el_speak.py (ElevenLabs
mp3_44100_128) at 44100 Hz. A -acodec copy / concat: splice keeps the first file's
header, so the muxer throws non monotonically increasing dts, the duration comes out short, and
every mentor clip after the body plays at the wrong speed. Verified 2026-07-25: stream-copying
keep-s01/audio.mp3 (145.896s @ 24kHz) + an el_speak.py clip (2.508s @ 44.1kHz) produced a
muxer error and 148.176s; re-encoding produced a clean 148.404s — exactly the sum, no
decode errors.

# order: body, then truth clips in the assembler's ranked order
printf "file '%s'\n" \
  "$PWD/runs/{date}/briefing.mp3" \
  "$PWD/runs/{date}/truth1.mp3" \
  "$PWD/runs/{date}/truth2.mp3" > runs/{date}/concat.txt

ffmpeg -y -f concat -safe 0 -i runs/{date}/concat.txt \
  -c:a libmp3lame -ar 44100 -ac 1 -b:a 192k runs/{date}/precall.mp3

# verify: duration must equal the sum of the parts, and decode must be clean
ffprobe -v error -show_entries format=duration -of csv=p=0 runs/{date}/precall.mp3
ffmpeg -v error -i runs/{date}/precall.mp3 -f null -   # any output = corrupt, fall back to separate sends
Then send the single file to Telegram (sendAudio, the same call the /tts skill's run.py makes in
telegram_send_audio),
caption: Day {N} of 60 — pre-call briefing. Call after the gym.

Failure handling, per layer:
- /tts body fails → retry once with --model aura-2-arcas-en; if it still fails, send the
  briefing as Telegram text (it is a written script already — it does not need to be audio to
  do its job) and log degraded: briefing_text_only.
- el_speak.py fails, or quota is exhausted → send the truth lines as *text* under the audio,
  attributed to their mentor. The truths are the point; the voices are the delivery.
- ffmpeg missing / concat fails → send the body and each clip as separate Telegram audios in
  order. Two taps instead of one is not a reason to skip a step.
- Telegram unreachable → write everything to runs/{date}/ and print the paths in-chat, then
  tell Matt the briefing is on disk. The call in STEP 6 proceeds regardless.

---

STEP 6 — Channel choice

Send one Telegram message with the buttons:

Day {N} of 60. Briefing's above. How do we do this?
[📞 Coach calls my phone]  [🎙 Live voice in the mini app]

Verified wiring in telegram-coach/scripts/modal_app.py:
- send_text(chat_id, text, buttons=None) (modal_app.py) sends an inline keyboard.
- _call_button() (modal_app.py) → [{"text": "📞 Call me now", "callback_data": "call"}]_handle_callbackplace_call(...). The phone path also has an HTTP trigger:
  GET https://matyas-sarudi00--telegram-coach-tick.modal.run?force=evening (the tick endpoint,
  modal_app.py; valid force kinds are morning|daytime|evening|wind_down|weekly_planning|sunday_mirror|nightly),
  and a one-tap callme endpoint (modal_app.py) gated by a token derived from the bot token.
- _live_button() (modal_app.py) → a Telegram web_app button pointing at
  web.get_web_url() — the deployed Mini App. This is the "live voice in the mini app" path.

The 10-second hello delay is accepted (DECISIONS-LOCKED Q15-A). Voice mode is GO; the latency
fix is a separate session and does not gate this ritual.

⚠️ NOT BUILT YET: a single "evening planning channel offer" message that presents exactly
these two buttons together with tonight's context pack attached to whichever path he picks. The
two buttons exist independently; the combined offer, and injecting {date}-context.md into the
voice agent's prompt, do not. Build as a small function beside _call_button/_live_button —
one _buttons(_call_button(), _live_button()) call already composes rows (modal_app.py).

Text fallback — tonight's supervised rounds (rounds 1–2)
Per DECISIONS-LOCKED §"Tonight's testing protocol", rounds 1–2 are TEXT, run locally with
full observability: Matt invokes the skill, and a local Sonnet coach agent runs the call in
chat using plans/system-reset-2026-07-25/agents/text-coach.md as its system prompt, with
{CONTEXT_PACK} replaced by the full contents of runs/{date}/{date}-context.md. Round 3 moves
to phone. Between rounds: Matt gives feedback in chat, the markdowns get refined, repeat until he
says it's right.

Offer this as a third button/line while rounds 1–2 are live: [💬 Text here, this session].

Failure handling: Modal down / Twilio out of credit (a known live risk — see memory
reality-map-clarity-docs: the voice path runs on Anthropic credits and has gone dark before)
→ fall straight to the text coach in this chat with the same context pack. The planning session
happens every night. The channel is negotiable; the session is not.

---

What gets written back

Every artifact the call produces has exactly one home. Nothing lives only in a chat scrollback.

| Artifact | Destination | Mechanism |
|---|---|---|
| Call transcript (full) | Pinecone selfi-journal, coach_conversations | store.save_turn(session_id, role, text, date, call_type) (store.py) |
| Day summary | Pinecone coach_conversations | store.save_daily_summary(date, summary) (store.py) |
| Mirror answers, limiting belief, the reframed empowering belief | Pinecone coach_reflections | store.save_reflection(date, field, prompt, text) (store.py) |
| Tomorrow's commitments | Pinecone coach_conversations | store.save_commitment(date, text, due_date) (store.py) |
| Transcript file | /data/transcripts on the coach-data Volume + call-transcripts/ in the repo | coach writes on call end (transcripts.py) |
| Habit sheet marks | "60-Day Challenge" tab | Matt, by hand, narrated aloud on the call. The coach never writes this tab. |
| Dani's confirmed tasks | Notion Main Tasks | notion_client.create_task(spec, title, deadline, status)only for lines Matt approved on the call |
| Tomorrow's time blocks | Google Calendar | Matt clicks them himself during the call; the coach guides and pushes back once |
| Run artifacts (datapack, critique, council, context, audio) | plans/system-reset-2026-07-25/runs/{date}/ | this skill |

The nightly chain input. The transcript is not just archived — it is the input to the night
shift. After the call, the nightly run (tick?force=nightly, and the {"kind":"nightly","hours":[23]}
entry in DEFAULT_SCHEDULE, modal_app.py) processes the day into (a) tomorrow's morning
audio — which consumes the assembler's CAMEO SELECTION from STEP 4 §8 — and (b) tomorrow
evening's coach context. The empowering belief Matt states in first person during the mirror beat
becomes tomorrow's morning affirmation; the coach tells him so on the call, out loud, because the
loop closing is the point.

⚠️ NOT BUILT YET: the nightly chain's consumption of runs/{date}/{date}-context.md §8 for
cameo selection, and the write-back of the empowering belief into the morning-audio script
generator (.claude/skills/morning-audio/scripts/make_script.py). Both are the night shift's
job (doc §S7), not this skill's foreground run — but this skill's STEP 4 output is their input,
so the file must exist and keep its section numbering.

---

Post-call

- Post-gym check-in call — the coach asks on the call what time to ring, and calls then. Full
  behavior in ESCALATION.md §"Post-gym check-in".
- Weekly variantWEEKLY.md. First live run day 6 (Fri 2026-07-31).
- Escalation — if this skill was never invoked by 18:00, ESCALATION.md runs instead, and
  keeps running until it is.

Test mode

--test semantics (⚠️ NOT BUILT YET — the flag needs the orchestrator): COACH_SHEET_TAB=CoachTest,
sandbox dates (2099-* / 2025-12-*), COACH_SIM=1 (which makes notion_client.resolve_dbs()
refuse the production database), sim_* Pinecone namespaces, a temp COACH_DATA_DIR, and no
real Telegram sends — artifacts to .tmp/ instead. This is what lets the coach-sim-e2e skill
drive the whole ritual agent-vs-agent without touching real data. The deterministic gate
python3 telegram-coach/scripts/test_e2e.py stays complementary, not a substitute.
Morgan —Two hours of assembly buys nothing unless the datapack leads with pipeline: leads touched, calls booked, follow-ups owed. Put that on line one of the context file.
S5📞 The Planning Call — Agenda & Coach Behavior 3:28

The coach runs a fixed agenda but is genuinely conversational — and it can leave the rails on your command. Say you want to just talk, and it becomes a pure coach: you dump every thought, it reflects, asks, challenges. When you say you have clarity, it walks back to the agenda exactly where you left it.

The agenda:

  1. Close every open loop. Decisions pending, messages to answer or delete, anything circling in your head — named, decided, or scheduled.
  2. Review the day + praise. What got done — and the coach makes you actually acknowledge it. Self-praise is on the agenda, not optional.
  3. The number. "How many sales calls got booked today?" — asked every single evening, before anything else gets praised. The coach adds it to the week's running total and says the rate out loud: "that's N of 6 booked this week, day X of 7." If the number is 0 for two days running, that becomes tomorrow's first sacred-block item, and the coach says so.
  4. Goals review. Long-term and mid-term, out loud, so tomorrow is ranked against them.
  5. Time-block tomorrow. YOU click, YOU create the calendar blocks — the coach guides and pushes back with feedback anchored to your goals, but priorities are YOUR call.
  6. Handwrite the first-block list. Tomorrow's sacred block, step by step, on paper, saying everything out loud so it lands in the transcript.
  7. Dani. Review today's Deadline-filtered tasks, edit tomorrow's drafted list.
  8. The four questions: What will your post-gym relax hour be? What's the meal prep for tomorrow? Which workout tomorrow, and why? When is meditation — and when should I call to check both happened?
  9. Pen the sheet. The coach prompts you to open the 60-Day Challenge tab and mark today's four rituals BY HAND — narrating each mark out loud so the transcript records it.
  10. The mirror. Top distractions today? Top behavior patterns to improve? Then the provocative questions — "If you live every day exactly like today, where do you end up?" "What was most misaligned with your desired self?" "Why do you think you're a loser?" "Why do you believe you progress slower than you could?" — to surface the limiting belief underneath. Then, using David Bayer's decision-matrix framework, the coach helps you reframe it into an empowering belief, and that reframe feeds tomorrow's affirmations.

The call ends with tomorrow already inevitable.

Hormozi —Good — the calls number now gets asked before the praise. Praise after the scoreboard is fuel; praise before it is anesthetic.
S6🚨 Enforcement — The Ladder & The Check-ins 1:13 · short
No opt-outEvery attempt mirrored to Telegram

The 18:00 ladder. If you haven't invoked the skill by 18:00, the coach calls. Every 2 minutes. Voice mode is live — a 10-second connect delay is accepted and does not postpone this. You have exactly three moves:

  • "Now." — 5 minutes of grace. Not started in 5? Calls resume every 2 minutes.
  • "In 1.5 hours max." — silence until then, then 2-minute calls resume.
  • "+15 minutes." — usable ONCE. After that the calls do not stop until you invoke.

Every call attempt is mirrored as a Telegram text, so the record exists even if you don't pick up.

Two guards you should see before you approve this (added after the round-1 critique, and now in ESCALATION.md):

  • Never into a live call. While a coach call is running the ladder is suspended and the timer resumes on hangup. Without this, "in 1.5 hours" taken at 18:00 expires at 19:30 — inside the 19:15–19:50 planning call the ladder exists to produce.
  • The gym window is 17:30–19:00 and this document put you there. So 18:00 fires one ring, then holds until 19:00, and only then goes to the 2-minute cadence. An hour of ringing a phone in a locker teaches you to mute the channel.

Today's live v1 is smaller than the spec above: text only, ~10-minute rungs, 18:00→19:00, seeded for one night. That is honest in ESCALATION.md §"v1 shipped tonight" — and it means tonight's rungs land inside the gym window until the guards are built.

The workout/meditation check-in. At the time you named in the planning call (or 1–2 hours after it), the coach calls once: did the workout happen, did the meditation happen, in that order? The answers go into the transcript, which means they reach the council, which means tomorrow's mentors know.

These sub-cards are reference material — the exact text that ships. They have no ▶ audio button on purpose; the card's own audio summarizes them.
SkillESCALATION.md — the ladder spec, verbatim.claude/skills/I-will-do-a-planning-session-in-15-mins/ESCALATION.md
Collapsed by default, scroll inside the box.
ESCALATION — the 18:00 ladder + the post-gym check-in

Canon: plans/system-reset-2026-07-25/DECISIONS-LOCKED.md §"Escalation ladder" and §"Post-gym
check-in"; rendered in the approval doc §S6. This file is the exact state machine. It exists for
one reason: the planning session happens every night. The ladder is not a reminder system, it
is an enforcement system, and it does not get tired.

The ladder's ONLY exit is Matt invoking I-will-do-a-planning-session-in-15-mins. Answering the
call does not clear it. Promising does not clear it. Only the invocation clears it, and STEP 0 of
SKILL.md is what writes the marker.

---

The state table

T = the 18:00 local trigger (COACH_TZ, default Europe/Budapest). "Ring" = one outbound
voice attempt plus a mirrored Telegram text, always both (doc §S6: the record must exist even
if he doesn't pick up).

| # | State | Trigger into it | Behavior while in it | Next state | Timer |
|---|---|---|---|---|---|
| 0 | DISARMED | skill invoked (any time) — or the day rolls over | silent | ARMED at 00:00 next day | — |
| 1 | ARMED | 00:00 daily reset | silent, watching for the invocation | DISARMED on invoke · CALLING at 18:00 | fires at T |
| 2 | CALLING | 18:00 reached, not invoked | ONE ring at 18:00 (voice + mirror), then silent until 19:00 (gym-window hold, guard 2); from 19:00 ring every 2 min, indefinitely | DISARMED on invoke · GRACE_5 on "now" · DEFERRED_90 on "in 1.5h" · POSTPONE_15 on "+15" | 1 ring at T, then 60 min hold, then 2 min |
| 3 | GRACE_5 | Matt says "I'll do it now" | silent | DISARMED on invoke · CALLING on expiry | 5 min |
| 4 | DEFERRED_90 | Matt says "in 1.5 hours" (the maximum deferral) | silent | DISARMED on invoke · CALLING on expiry | 90 min, hard ceiling |
| 5 | POSTPONE_15 | Matt asks for +15 min — allowed ONCE per day | silent | DISARMED on invoke · RELENTLESS on expiry | 15 min |
| 6 | RELENTLESS | POSTPONE_15 expired, or a 2nd postponement is requested | ring every 2 min, indefinitely, no further deferral accepted | DISARMED on invoke only | 2 min |
| 7 | SUPPRESSED_IN_CALL | any coach call (outbound or inbound) is live | silent — no ring, no Telegram mirror | back to the state it came from, timer resumed, on hangup | paused |

Two guards the table would otherwise get wrong (added 2026-07-26, hardening round)

(1) SUPPRESSED_IN_CALL — never ring into a live call. call_policy.ACTIVE_CALL_GUARD_MIN
already exists and is the hook: while a coach call is active the ladder holds, and the timer
resumes from where it paused on hangup. Without this, DEFERRED_90 taken at 18:00 expires at
19:30 — inside the 19:15–19:50 planning call the ladder exists to produce — and the machine
rings him during the very conversation that would disarm it.

(2) The gym window is a known collision, not a bug to discover at 18:05. The day's own design
puts Matt in the gym 17:30–19:00 with the phone in a locker. A ladder that arms at 18:00 and
rings every 2 minutes spends the entire workout ringing a phone nobody is holding, and mirrors
every ring to Telegram. Rule: 18:00 fires ONE ring (voice + mirror), then the ladder holds
until 19:00; from 19:00 it goes to the 2-minute cadence. This rule now lives in row 2 of the
state table above — the table is the spec; this paragraph is only the rationale for it.
One ring at 18:00 is the signal; sixty minutes of ringing into a locker is noise that teaches him
to mute the channel. This is stated on the approval doc §S6 so Matt sees what he is approving.

Reading the table
- Every deferral state is silent, then hands back to ringing. There is no state that ends in
  "and then leave him alone."
- GRACE_5 and DEFERRED_90 are re-enterable; POSTPONE_15 is not. postpone_used is a
  per-day boolean. Once it is true, a "+15" request is answered — warmly, once — with *"you already
  used tonight's postponement"* and the machine goes to RELENTLESS.
- Deferral requests are only honored from CALLING. From RELENTLESS, nothing is honored.
  That is the entire point of RELENTLESS.
- DEFERRED_90 is a ceiling, not a negotiation. "In two hours" is heard as 90 minutes; the
  coach says so out loud when accepting: *"Taking that as ninety minutes. 19:30, I call."*
- Quiet hours do not repeal the ladder. call_policy.QUIET_END_H = 23 — if RELENTLESS
  reaches 23:00, voice attempts stop and the Telegram mirror continues every 2 minutes until
  invocation or 00:00 rollover. Matt sleeps at 21:00 by design; a ladder still ringing at 23:00 is
  itself the signal, and it goes into the next morning's council data pack as a fact.

Intent parsing (what counts as which answer)
Matched against the voice transcript and the Telegram text reply, case-insensitive:
- → GRACE_5: "now", "doing it now", "I'll do it now", "starting", "give me five", "5 min",
  "coming", "megcsinálom most"
- → DEFERRED_90: any deferral naming ≥20 min or an hour count — "in an hour", "in 1.5 hours",
  "after dinner", "in two hours" (clamped to 90), "later tonight"
- → POSTPONE_15: "+15", "fifteen more", "another 15 minutes", "quarter of an hour"
- Ambiguous or no clear answer → stay in CALLING. Silence is not consent, and an unparsed
  grunt must never buy 90 minutes.

---

Where state persists

Authoritative: the coach's own state.json on the Modal Volume coach-data, mounted at
/data (COACH_DATA_DIR=/data, modal_app.py; VOL = {"/data": vol} at modal_app.py).
Read/write through the existing helpers state_load() / state_save(st) / state_txn()
(modal_app.py) — state_txn() is the one to use, because the app runs
@modal.concurrent and the 10-minute scheduler() cron, the ladder timer and /callme can all
reach the state at once. The TOCTOU fix around place_call (modal_app.py) exists for exactly
this reason; the ladder must live inside the same lock discipline.

Keys (⚠️ NOT BUILT YET — none of these exist in state.json today; this is the schema to add):
{
  "planning": {
    "date": "2026-07-26",
    "state": "CALLING",
    "planning_invoked": null,
    "next_ring_ts": 1785000000,
    "resume_ts": null,
    "postpone_used": false,
    "rings_today": 7,
    "suppressed_until_ts": null,
    "in_call": false,
    "checkin": {"at": "20:30", "asked": false, "workout": null, "meditation": null}
  }
}
state.date is the day-rollover guard: a stale date means ARMED with everything reset.

Local mirror (informational only): plans/system-reset-2026-07-25/runs/{date}/state.json,
written by SKILL.md STEP 0. It lets a local Claude session see whether tonight's ritual has
fired without hitting Modal. It is not the source of truth — if the local marker says invoked
and the Volume state does not, the ladder still rings. Whichever side sees the invocation first
must write the other; STEP 0 currently writes only the local one, which is the gap flagged there.

---

What must change in the coach to make this real

The existing schedule already has the 18:00 sacred evening call — but tuned to a 5-minute
ladder, not 2 minutes (modal_app.py):
{"kind": "evening", "hours": [18], "retry": {"every_min": 5, "max": 24}},  # SACRED

⚠️ NOT BUILT YET — four concrete changes, all in telegram-coach/scripts/:

1. every_min: 52 on the evening entry, and max raised (24 × 2 min = 48 minutes of
   coverage, which RELENTLESS outlives). Note load_schedule() merges DEFAULT_SCHEDULE into a
   customized schedule.json on the Volume — a change to the Python default will not overwrite
   an existing customized entry. The Volume copy must be edited too, or the retune silently does nothing.
2. The humane-rails caps in call_policy.py block an indefinite 2-minute ladder. Verified
   values: MIN_GAP_MIN = 60, MAX_VOICE_ATTEMPTS = 5, DAILY_CALL_CAP = 12,
   RETRY_LADDER_MIN = [10, 20, 40, 60], ACTIVE_CALL_GUARD_MIN = 30. A 2-minute ladder hits
   MAX_VOICE_ATTEMPTS in 10 minutes and DAILY_CALL_CAP in 24. These caps were added on evidence
   (ADR-0002 / "60 dials, 1 answered over 4 days") and must not be globally loosened — the fix is a
   ladder-scoped exemption: a planning_ladder reason that bypasses MIN_GAP_MIN,
   MAX_VOICE_ATTEMPTS and DAILY_CALL_CAP while still honoring COACH_CALLS_ENABLED (the master
   kill switch) and QUIET_END_H. place_call(..., force=True) already bypasses the soft caps for
   manual triggers and is the pattern to copy.
3. The three deferral intents + postpone_used — parsed in the call and in the Telegram
   handler, writing the state above. Nothing like this exists today.
4. The two guards aboveSUPPRESSED_IN_CALL (reuse ACTIVE_CALL_GUARD_MIN; suspend rings
   while a call is live, resume the timer on hangup) and the 18:00 single-ring / hold-to-19:00
   gym window. Neither exists today; both are Day-1 collisions, not edge cases.
5. The planning_invoked gate_run_tick must skip the evening entry entirely when
   state["planning"]["planning_invoked"] is set for today. Without it, invoking the skill at 17:00
   does not stop the 18:00 call.

Interim (before those land): run the ladder from the local Claude session that owns the ritual —
a 2-minute loop that alternates GET https://matyas-sarudi00--telegram-coach-callme.modal.run?token=<derived>
(the callme endpoint, modal_app.py — token is sha256(TELEGRAM_BOT_TOKEN + ":callme")[:32],
printed by telegram-coach/scripts/print_callme_url.py; never print the token in chat or logs)
with a mirrored Telegram text. Note CALLME_DEDUP_S = 120 — a 2-minute cadence sits exactly on that
dedup window, so use 125s to avoid a swallowed dial.

---

Failure handling

The ladder degrades in one direction only: toward more contact, never toward silence.

- Twilio / voice engine down, or Anthropic credit exhausted (a live, previously-realized risk —
  see memory reality-map-clarity-docs): drop the voice attempt, keep the 2-minute Telegram
  mirror running unchanged, and tell Matt in the first text that voice is down. The cadence does
  not slow because a channel died.
- Modal down entirely: the local session runs the ladder against the Telegram Bot API directly
  (sendMessage), same 2-minute cadence.
- State unreadable / corrupted: default to CALLING. The safe failure is ringing him when he
  already planned; the unsafe failure is silence on a night he skipped.
- Ambiguous reply: stay in CALLING (see intent parsing above).
- Every degradation is logged to plans/system-reset-2026-07-25/runs/{date}/degraded.json and
  said out loud — to Matt, in the first message after the failure. He is never left guessing
  whether the machine is running.

---

Post-gym check-in

When. Matt names the time himself, on the planning call — it is question 4 of the coach's four
questions (agents/text-coach.md §7: *"When is meditation — and at what time should the check-in
call come?"*). The coach reads it back and stores it in state.planning.checkin.at. If he doesn't
name one, the default is 90 minutes after the call ends (doc §S6: "or 1–2 hours after").

What it asks — one call, two questions, in this order:
1. "Did you do the workout?"
2. "Did you do the meditation?"

The order is not cosmetic. The day's design is gym 17:30–19:00, then meditation — sauna or car —
and they are sequential: both must happen (DECISIONS-LOCKED §"The Day"). Asking in order
surfaces the real failure mode, which is doing the workout and skipping the sit.

What counts as the meditation: a 20-minute sauna meditation or a meditation in the car
after the gym. Both count fully. The coach does not adjudicate quality or venue — it asks whether
it happened, records the answer, and moves on. What it does *not* accept is a substitution: neither
one replaces the workout, and the workout does not replace the sit.

Cadence. ONE call. This is a check-in, not a ladder — it does not ring every 2 minutes. If he
doesn't answer, one Telegram text with two buttons (✅ both done / ❌ tell me), and that's it.
The consequence of a miss is not more calls; it is the ✗ on the sheet and the conversation on
tomorrow's call.

Where the answers go. Into the transcript → into coach_conversations in Pinecone
(store.save_turn) → into tomorrow's data pack → in front of the council. As doc §S6 puts it: the
answers reach the council, which means tomorrow's mentors know. Doris in particular audits exactly
this (council.md §Doris: "You audit the rituals: wake time, block integrity, NSDR, workout,
meditation, sleep runway"), so a skipped sit shows up tomorrow as an observation with evidence, not
as nagging.

⚠️ NOT BUILT YET: a one-off, Matt-named check-in time has no home in the schedule.
⚠️ ANNOTATION (2026-07-26, round 5 — verified against the live Modal Volume): DEFAULT_SCHEDULE
is NOT the effective schedule. load_schedule() merges it *under* coach-data:/schedule.json, and the
live file reads: `morning 07:00 · daytime 13:00 · planning 19:00 · evening 18:00 · sunday_mirror Sun
16:00 · nightly 23:00`. That is a 13:00 daytime check-in and a 19:00 planning call that the
inventory below does not contain.

⚠️ ANNOTATION (2026-07-26, round 6 — the line above was wrong and is withdrawn): "Read the Volume
file, never this list" is not safe advice. load_schedule() merges every kind the Volume file is
*missing* back in from DEFAULT_SCHEDULE, so the effective schedule is the union of both. The
Volume file holds six entries (morning 07:00 · daytime 13:00 · planning 19:00 · evening 18:00 ·
sunday_mirror Sun 16:00 · nightly 23:00); four more are merged in from the defaults and fire anyway:
refocus (morning +150 min, Mon–Fri), pre_evening 17:00, close_day 21:45 and
weekly_planning Sat 10:00. Read both, and union them. The 21:45 one matters most: the approval
doc puts Matt in bed around 21:00.

⚠️ ANNOTATION (2026-07-26, round 6 — settled, then fixed): round 5 noted here that planning-call
was missing from skills_loader.V1_SKILLS and could not tell whether COACH_SKILL_ALLOWLIST widened
the allowlist in production. It does not: probing all five secrets the deployed app attaches
(coach-secrets, coach-extra, coach-voice, coach-flags, openrouter-secret) shows
COACH_SKILL_ALLOWLIST set in none of them, so the 19:00 planning entry really was firing with
an empty protocol block (agent.py::_FLOW has no planning key to fall back to). planning-call
and cheer-up were added to V1_SKILLS and telegram-coach was redeployed on 2026-07-26;
cheer-up was added to V1_SKILLS and the app redeployedskill_body('cheer-up') returns
3,187 chars instead of None. planning-call was added in the same change and reverted within the
hour: the SKILL.md behind that name is the previous OS's overdue-Notion-task triage — no mention of
the challenge, the rituals, the sheet or Day-N — so enabling it would have put a rival task-triage call
15 min past the 18:00 ritual. A wrong protocol confidently executed is worse than none. The 19:00
entry still has an empty protocol block; rewrite planning-call/SKILL.md for the challenge, or drop
the 19:00 entry from the Volume schedule. Also still open (GAPS item 18): daytime-nudge (fired by the
live 13:00 entry), capabilities and project-review are called at runtime and remain outside the
allowlist.

DEFAULT_SCHEDULE (modal_app.py) holds only fixed recurring entries — morning 07:00,
refocus +150min, pre_evening 17:00, evening 18:00, close_day 21:45, weekly_planning Sat
10:00 (⚠️ stale — the locked slot is Friday ~19:00, "days": [4], "hours": [19]; see
WEEKLY.md §Scheduling), sunday_mirror Sun 16:00, nightly 23:00 — with no mechanism for "call once, today, at a
time set during a conversation." Implement as a state.planning.checkin entry that the 10-minute
scheduler() cron (modal_app.py, modal.Period(minutes=10)) checks each pass and fires once
when due, then sets asked: true. Note the 10-minute cron granularity — a check-in requested
for 20:30 fires somewhere in 20:30–20:40. That is fine for this purpose and must not be "fixed"
with a tighter cron.

---

v1 shipped tonight (2026-07-25) — what actually runs vs. the table above

The state machine above is the target. None of it existed in code as of tonight. What is
armed and live for Day 1 is a deliberately smaller thing: a Volume-configured one-shot outbox
on the Modal coach, processed by the existing 10-minute scheduler() cron.

Mechanism (modal_app.py_fire_outbox, called from _run_tick):
/data/outbox.json on the coach-data Volume is a list of `{id, due_ts, kind, text|url, chat_id,
ttl_s, cancel_if_marker}. Each entry fires exactly once on the first tick at/after due_ts`
(idempotency in state.outbox_sent, marked inside the state lock *before* sending). Seed or
change it with no deploy:
modal volume put coach-data outbox.json /outbox.json --force.
It deliberately bypasses send_gate and quiet hours — these are Matt-authored one-shots at
explicit clock times, not coach-initiated nudges (the 05:00 morning audio is inside the
23:00–07:00 quiet window and must go out anyway).

The disarm marker. SKILL.md STEP 0 item 0 curls
…-telegram-coach-mark.modal.run?token=<callme token>&key=planning_invoked:$(date +%F), which
writes state.markers[key]. Any outbox entry carrying that key as cancel_if_marker is skipped
and recorded as "cancelled" instead of sending. Verified live 2026-07-25: marker set → queued
rung recorded cancelled, no message sent; bad token → {"ok":false,"error":"bad token"}.

v1 vs. the spec — the honest diff

| Spec | v1 tonight |
|---|---|
| Ring = outbound voice call + mirrored text | Text only. No calls. (Matt-decision pending.) |
| Every 2 min, indefinitely | Every ~10 min — the scheduler() cron's native resolution — and 7 rungs only (18:00→19:00), then it stops. |
| States GRACE_5 / DEFERRED_90 / POSTPONE_15 / RELENTLESS, postpone_used | None of it. No deferral parsing, no conversational state machine. The coach cannot hear "in 1.5 hours" and will not honour it. |
| Daily 00:00 re-arm | None. The 7 rungs are hand-seeded for 2026-07-26 only. Someone must re-seed outbox.json for each following night (or build the recurring generator). |
| Post-gym check-in at a Matt-named time | Not built (unchanged — see the ⚠️ note above). |
| SUPPRESSED_IN_CALL + the 18:00-single-ring gym guard | Not built. v1's 7 rungs land 18:00→19:00, i.e. straight through the 17:30–19:00 gym window, as text only. Text into a locker is cheap but it is still the wrong shape; build the guards before the ladder gets a voice. |

The one thing that must not be forgotten: v1 does not re-arm itself. After 2026-07-26 the
ladder is silent until either outbox.json is re-seeded or the real state machine is built.
Doris —Relentless calling protects the streak, which is the right thing to protect. But a ladder that outruns your own call caps just fails silently — fix the caps before day 1.
S7🌃 The Night Shift — Nightly Chain & Workout Audio Lab 1:41 · short

Every night after your call, one run processes the day: transcripts → tomorrow's morning audio + tomorrow's evening-coach context. The system's memory compounds daily; nothing you say on a call is ever lost.

The Workout Audio Lab (experiment mode, starting tonight): four 15-minute audios, each generated by a DIFFERENT method, so you can judge formats instead of guessing:

  • A. Deep-dive — one topic from today's actual work (e.g., the thing you fumbled in a session), taught with analogies, then "here's how to apply it in your projects."
  • B. Digest — 3–4 shorter practical topics from the day's changelogs.
  • C. Mentor lesson — one mentor teaches the day's most relevant business lesson in character, doctrine-grounded, in their ElevenLabs voice.
  • D. Socratic — the audio quizzes you: poses a question from your day, pauses, then reasons through the answer.

Every audio's prompt, model, and skill are logged in a generation ledger. You rate them after a few gym sessions; winners evolve toward the full 60-minute companion. Default subject when the day is thin: AI concepts you're curious about.

Ovens —Four methods is three too many past day 10. Rate them, keep one, and delete the rest — a lab that never closes is just another open loop.
S8📊 The Weekly Ritual & The Habit Sheet 1:48 · short

The sheet. A new tab — "60-Day Challenge" — in the coach's existing Google Sheet. One row per day. YOU pen it, by hand, every evening, prompted and narrated on the call. The tab does not exist yetmake_sheet_tab.py has never been run against the live sheet, so there is no tab URL to link here. Tonight the coach creates it in the first two minutes of the call, and then walks you through writing the Day 0 row.

Columns — all 14, exactly as scripts/make_sheet_tab.py's HEADER defines them. This card is the single source; the runbooks now say "read the HEADER, never hardcode a column order", because four different column lists were shipping on one page.

ColumnWhat it isWhere it came from
Day# · DateDay 0 = 2026-07-25; 61 rows seeded.original
R1 plan ✓ · R2 morning audio ✓ · R3 15-min exercise ✓ · R4 planning ritual ✓The four rituals — ✓ or ✗. These four are the challenge.yours
Calls booked (number)Sales calls booked TODAY. The weekly review sums it against 6. Without it, the #1 mission is the only thing nobody measures.yours
Sleep h · Wake timeDiagnostics for the one input every critic called the weakest link.added by the critique gate, not by you
Substances (0 or what)A number or a word. Data, not confession — see the rule below.added by the critique gate, not by you
Block held (0/1) · Block minutesDid the 5:30–8:30 sacred block actually hold, and for how long. Planning a block and holding it are different facts.added by the critique gate
R5: outbound before 10:00 (number)Outbound touches before 10:00 — the leading indicator under the calls number.added by the critique gate
NoteOne line, especially on a miss: what broke.original

The narration rule — this is the part to react to. The pen-the-sheet beat has you say each mark out loud so it lands in the transcript. Sleep, Wake time and Substances are exempt: data, not confession. The coach never asks you to narrate them, never comments on a value, and never carries one into the mirror beat or the council datapack unless you raise it. Nobody asked for a substances column — a critic added it. On the Day-0 call you get asked whether it stays at all. It is your data. One thing to weigh before you answer, added 2026-07-26: since the column was written you told me daily kratom use has restarted, and that fact is now in your live profile as something the coach may state plainly when relevant. The review comments call it load-bearing for the coach's confrontation material. That is an argument for keeping the column and an argument against it — deciding blind was the mistake, so it is in front of you. Whatever you choose, the "data, not confession" handling does not change.

The paper twin. plans/system-reset-2026-07-25/wall-chart.html prints the sixty boxes for the wall. It is generated, not printed — print it tonight; the Sheet stays the machine-readable mirror.

The weekly call. Same method as the daily ritual, bigger lens: a guided review of your goals and a rigorous walk through the habit sheet — streaks, misses, patterns. First iteration is built tonight; its first real run is day 6, so your first weekly review closes the first week of the challenge.

These sub-cards are reference material — the exact text that ships. They have no ▶ audio button on purpose; the card's own audio summarizes them.
SkillWEEKLY.md — the weekly ritual spec, verbatim.claude/skills/I-will-do-a-planning-session-in-15-mins/WEEKLY.md
Collapsed by default, scroll inside the box.
WEEKLY — the weekly variant of the planning ritual

Canon: plans/system-reset-2026-07-25/DECISIONS-LOCKED.md §"Weekly planning call (Q1d)" and doc
§S8. Built tonight (Day 0) as a first iteration; first live run is day 6 — Fri 2026-07-31,
evening, so the first weekly review closes the challenge's first week (doc §S8: "its first real
run is day 6"). Reviewed at the day-7 mark and iterated from there.

Same method as the daily ritual. Voice call. Everything in SKILL.md applies unchanged —
NSDR first, parallel harvest, council, assembler, pre-call briefing, channel choice, escalation —
except the three deltas below. Do not re-derive the machinery; only the lens changes.

---

Delta 1 — the data pack widens to seven days

STEP 1 of SKILL.md, with these substitutions:

| Item | Daily | Weekly |
|---|---|---|
| (a) session extracts | today, local + cloud | the last 7 days, local + cloud, grouped by day |
| (b) time blocks | yesterday | all 7 days of calendar blocks vs actual |
| (c) transcripts | last 14 days full | the week's 7 call transcripts in full, older rolling summary unchanged |
| (d) habit sheet | today's row + streak | all 7 rows, plus every row since Day 0 for the trend |
| (e) goals | read | read and scored — see Delta 2 |
| (f) Dani | Deadline = today | the week's completed vs slipped, plus next week's draft |

The STEP 2 critique widens the same way: not "what did you do today vs yesterday's plan" but
"which of this week's 7 planned days actually happened, and what is the shape of the gap." One
bad day is noise; the same distraction on four days is a system fault, and that distinction is the
whole reason the weekly call exists.

The council prompts are unchanged (agents/council.md) — the mentors are handed a 7-day pack
instead of a 1-day pack and told so explicitly in the spawn prompt. The assembler's output file is
runs/{date}/{date}-weekly-context.md, same section numbering, plus one extra section:
§9 PARKING-LOT SHORTLIST (see Delta 3).

---

Delta 2 — the agenda: goal review + rigorous habit-sheet review

The weekly call replaces the daily agenda's fast beats (open loops, time-block tomorrow,
handwrite the first-block list) with two slow ones. Free-dump mode stays fully available
(agents/text-coach.md §"Free-dump mode") — it is a hard capability requirement, not a
daily-only feature.

A. Goal review (out loud, scored, not re-derived)
1. The number. 6 booked sales calls this week — actual? Websites sold — actual? Say both
   numbers out loud before anything else. If the week produced zero booked calls, that is the
   call's opening fact and everything else is discussed against it.
   Say the conversion honestly: 6 booked calls/week at a realistic close rate (~1 in 3) is
   roughly 2 sites/week; the measured number is the calls, and the close rate is unmeasured
   until the first four weeks measure it. 60 sites is the 12-month mission, not a challenge target — at ~2 sites/week the 60 days produce roughly 17 sites. Never state "6 calls = 5–10 sites/week" — the
   arithmetic does not hold and a target he cannot hit is a self-trust withdrawal.
2. Long-term and mid-term goals, read out loud, each with one question: *did this week move
   it, hold it, or lose ground?* Three words, no essays.
3. The 2M Ft/mo recurring anchor — where the week left it.
4. Next week's single most important outcome, named by Matt, ranked against the 6-calls lens.
   The coach pushes back once (the daily rule: one pushback, then his decision is final), then it
   is set.

B. Rigorous habit-sheet review
The daily call *prompts him to pen the sheet*. The weekly call audits what he penned. Read the
"60-Day Challenge" tab (plans/system-reset-2026-07-25/scripts/make_sheet_tab.py scaffolds it —
the header is whatever its HEADER list defines; read it and index by column name, never
hardcode a column order) and walk, out loud:

1. Per-ritual completion % — R1, R2, R3, R4, each as hits/days-elapsed, this week AND since
   Day 0. Four numbers, said plainly. *"R3 exercise: five of seven this week, eleven of fourteen
   overall."*
2. Streak state per ritual — current streak, longest streak, and every streak break with its
   date. A break is an event with a cause, not a statistic.
3. The pattern behind each miss. This is the beat that earns the word "rigorous" and it is
   never skipped. For every ✗ in the week, the coach pulls the evidence — that day's session
   extracts, that day's calendar, that day's transcript, that day's Note cell — and asks what was
   actually true at that moment. Then, across the misses: is there a shape? Same weekday? Same
   preceding event (a late call, a bad sleep, a Dani escalation)? Same ritual always failing first?
   The output is one named pattern, in Matt's own words, and one countermeasure specific enough to
   execute — a countermeasure, not a resolution to try harder.
4. The reward, out loud — stated conditionally, never as booked. Day 60 = the flight to the
   next digital-nomad location with the first week fully off — the flight he has not booked
   yet, funded by the retainers the calls number buys. As of 2026-07-26 Matt is back at his
   parents' house and cannot afford to move out. If the money is there on Day 60 he flies; if it
   is not, Day 60 buys the ticket he names on Day 40 for the first date he can pay for. Say where
   the streak stands against it — and where the *money* stands against it.

Then the daily agenda's closing beats run unchanged: the mirror (top distractions, top behavior
pattern, one provocative question), the limiting belief, and the David Bayer decision-matrix
reframe into an empowering belief stated in first person, present tense — which feeds the coming
week's morning affirmations.

Time: the weekly runs longer than the daily 40-minute ceiling. Target ≤60 minutes; if past
55, compress honestly and say so rather than silently dropping a beat.

---

Delta 3 — the parking lot: at most ONE promotion

Every new idea Matt has during the week is parked, never built ad hoc (DECISIONS-LOCKED
§Parked: *"Anything new mid-flight → parking lot in the doc, discussed in a planning call, never
built ad hoc"*). The weekly call is the only place a parked idea can be promoted into the
build queue, and it may promote at most one, and often zero.

Procedure:
1. The assembler pre-reads the parking lot (doc §S11 "Parking Lot — Alive, Not Forgotten"; the
   related feature graveyard is plans/fable-rebuild/DEFERRED-FEATURES.md, which must be checked
   before proposing any coach feature) and writes a shortlist of at most 3 into
   {date}-weekly-context.md §9, each with: the idea, when it was parked, its wake-up condition,
   and whether that condition has actually been met.
2. On the call the coach reads the shortlist and asks one question per item: "has the wake-up
   condition been met?" If no — it stays parked, no discussion. The wake-up condition is the
   gate; "I'm excited about it again" is not a wake-up condition.
3. Of the items that pass, Matt picks one, or none. The coach's job here is subtraction:
   Ovens' lens is the operative one (council.md §Ovens — *"focus as subtraction, systems over
   willpower, the discipline of one thing"*), and the honest default answer to "which of these do
   we build" is *none of them, keep the streak.*
4. The promoted idea gets written to the build queue with its scope named on the call. Nothing
   else moves. Ideas raised *during* the weekly call itself are parked like any other — they are
   not eligible for promotion in the same session that birthed them.

---

What's the same (do not re-implement)

- STEP 0 NSDR first, identical, non-negotiable, same failure handling.
- Council + assembler, identical prompts, Opus-medium, 5 agents in one message.
- Pre-call briefing: /tts body + 1–3 ElevenLabs mentor truth clips via
  plans/system-reset-2026-07-25/scripts/el_speak.py (`--mentor doris|hormozi|morgan|ovens
  --text --out`, 900-char hard cap). Weekly briefing runs at the longer end of the 1–4 min band —
  there is a week to summarize. Watch the quota: el_speak.py --list prints remaining
  characters; the weekly adds one more truth-clip set on top of the daily burn.
- Channel choice: 📞 coach calls my phone | 🎙 live voice in the mini app, with the text
  coach (agents/text-coach.md) as fallback. Weekly is a voice call by design — the review is
  spoken, and the transcript is the artifact.
- Escalation: ESCALATION.md applies unchanged if the weekly is not invoked.
- Write-back: transcript → store.save_turn → Pinecone coach_conversations; the week's
  pattern + countermeasure → store.save_reflection; the empowering belief → next week's morning
  affirmations via the nightly chain. Sheet marks stay Matt's hand.

---

Scheduling

A weekly call already exists in the coach: `{"kind": "weekly_planning", "hours": [10], "days": [5],
"retry": {"every_min": 5, "max": 12}} (telegram-coach/scripts/modal_app.py`) — SACRED,
Saturday 10:00 (days is weekday(), Monday=0, so 5 = Saturday). It is fireable on demand with
GET https://matyas-sarudi00--telegram-coach-tick.modal.run?force=weekly_planning (the tick
endpoint accepts weekly_planning as a force kind, modal_app.py).

Slot decision (locked 2026-07-25, critique gate): FRIDAY EVENING ~19:00. The weekly runs as
an extension of the evening call Matt already takes, on the day his own locked first run falls
(day 6 = Fri 2026-07-31). DECISIONS-LOCKED.md §"Weekly planning call" carries the same.

⚠️ NOT BUILT YET — three gaps:
1. The scheduler entry still says Saturday 10:00 and must be re-timed to Friday evening:
   {"kind": "weekly_planning", "hours": [19], "days": [4]}. load_schedule() merges into a
   customized schedule.json on the coach-data Volume, so editing the Python default alone may
   change nothing — the Volume copy has to be updated too. Until that lands, day 6 runs manually
   via ?force=weekly_planning. The Saturday 10:00 slot is the thing that disagrees with the
   locked design, not the Friday date; confirm the move with Matt on the day-6 call rather than
   treating a schedule change as invisible.
2. The existing weekly_planning behavior is not this. modal_app.py has its own handler
   predating the 60-day challenge; it has no habit-sheet audit, no council, no parking-lot gate. It
   must be pointed at {date}-weekly-context.md or replaced.
3. The per-ritual statistics (completion %, streaks, break dates) have no reader —
   telegram-coach/scripts/sheet.py exposes get_day(date), set_fields, add_note, get_note,
   sheet_url(), but nothing that aggregates a column across 60 rows. Needs a small
   challenge_stats() helper over the "60-Day Challenge" tab; it is pure arithmetic over rows the
   scaffolder already creates.

Until then the weekly runs the same way tonight's daily runs: this file is the runbook, executed
directly.
Morgan —The calls-booked column is the only column that pays rent. Sum it Friday, compare to six, and let that one number set the following week's outbound volume.
S9🤖 The Agents — Who Runs What 2:33

Seven minds, each with one job — the Text-Coach is the Planning Coach in a chat wrapper, not an eighth:

🔓 the full prompts are below, verbatim
  • The Planning Coach (voice/text, the call) — agenda + free-dump duality, confrontation license, Bayer reframing, sheet prompting. Runs on the production coach with a purpose-built skill context.
  • The 4 Mentors (Opus-medium, nightly council + cameos + truths) — Hormozi: offers, pricing, volume. Ovens: focus, systems, consulting discipline. Morgan: outbound, sales calls, agency scaling. Doris: flow, routines, the day's architecture. Each may ONLY assert doctrine grounded in their indexed corpus.
  • "Matt" (Opus-medium, council) — argues what you would argue: your energy, your contradictions, your real constraints. Exists so the council never plans for a fictional person.
  • The Assembler (Opus-medium) — merges five handoffs into ONE call context + picks the mentor truths and cameos. The only agent that decides what reaches your ear.
  • The Text-Coach (Sonnet, tonight's rounds 1–2) — the same planning coach persona run as a chat agent under local observation, so we can iterate the brain before the voice wears it.

The actual prompts, word for word — this is what these agents will read:

Every block below is regenerated from the file on disk at build time (self-os-v1/embed_sources.py), so "verbatim" cannot silently become "a copy from an hour ago" — which is exactly what it had become before this round.

These sub-cards are reference material — the exact text that ships. They have no ▶ audio button on purpose; the card's own audio summarizes them.
System promptThe Planning Coach — system prompt v1plans/system-reset-2026-07-25/agents/text-coach.md
The Planning Coach — system prompt v1 (text mode = Sonnet agent; later synced as voice skill)

MANDATORY CONTEXT: every agent below ALSO receives plans/system-reset-2026-07-25/agents/matt-core-context.md verbatim (goals, whys, deep motivators, desired identity, frustrations, running-from, limiting beliefs, coaching levers, red lines — mined from both Pinecone brains, provenance-tagged). Its Red Lines section is BINDING on every coach.


You are Matt's evening planning coach, running the 60 Days Get Shit Done Challenge with
him. Today is Day {DAY_N} of 60. Say the challenge name and the day number in your opening
line, every session, without fail. The Day-60 reward — the flight you have not booked yet,
funded by the retainers the calls number buys — is your carrot. Never state it as booked.
As of 2026-07-26 Matt is back at his parents' house and cannot afford to move out, so the
flight is named, not paid for: if the money is there on Day 60 he flies, and if it is not,
Day 60 buys the ticket he named on Day 40 for the first date he can pay for. Invoke it when he
wobbles — as the thing the calls number buys, never as a booking that already exists.

Who Matt is (context you always hold)
- Mission: 6 booked sales calls/week feeding the 60-website mission. Anchor: 2M Ft/mo
  profit from ~20h/wk, majority recurring. Delivery belongs to Dani.
  Say the math honestly, never inflate it: 6 booked calls/week at a realistic close rate
  (~1 in 3) is roughly 2 new sites a week — the 60 sites is the mission the weekly cadence
  feeds, not a weekly output. 60 sites is the 12-month mission, not a challenge target — at ~2 sites/week the 60 days produce roughly 17 sites. Never tell him 6 calls "equals" 5–10 sites a week; a number he
  can't hit is a self-trust withdrawal, and the counting rule for this challenge is the calls.
- He overcomplicates, overanalyzes, overplans — your job is to land DECISIONS, not options.
- He responds to directness. Softness wastes his evening; cruelty loses him. Direct + warm.
- {CONTEXT_PACK} ← the assembler injects: today's session extracts vs yesterday's plan,
  transcript memory, habit sheet state, Dani's Notion lists, mentor council notes.

The agenda (run in order; announce progress naturally, never as a checklist reading)
1. Open loops. Ask what's circling. Every loop gets: decided now, scheduled, or consciously
   dropped. Do not move on while a loop dangles.
2. Review + praise. Walk what got done today from the context pack. Make him say what he's
   proud of, out loud. If he deflects, name a genuine win yourself from the data — specifics,
   not flattery.
3. Calls booked — the number. Ask it plainly, every night: *"How many sales calls got
   booked today?"* Take the number, add it to the week's running total from the sheet's
   Calls booked column, and say the rate out loud: "N of 6 booked this week, day X of 7."
   No editorialising on a low number — it's a measurement, not a verdict. Two consecutive
   zero days → outbound becomes tomorrow's FIRST sacred-block item, said as a decision, not a
   punishment. This is the only number in the system attached to the actual mission; it is
   never skipped, even on a short call.
4. Goals review. Long-term and mid-term, out loud, quickly — the point is that tomorrow
   gets ranked against them, not a re-derivation.
5. Time-block tomorrow. HE decides priorities and HE clicks the calendar; you give feedback
   anchored to the 6-calls-a-week lens ("that block moves you toward booked calls how?"). Push
   back once per questionable block, then respect his call.
6. First-block list, handwritten. Tomorrow's 5:30–8:30 sacred block, step by step. He
   writes it BY HAND and says every item aloud so the transcript holds it. The list must be
   concrete enough that 5:30-Matt never has to think.
7. Dani. Review today's Deadline-filtered tasks; walk the drafted tomorrow-list; he edits;
   confirm what gets sent.
8. The three questions (always, all three): What's tomorrow's meal prep? Which workout
   tomorrow and WHY? When is meditation — and at what time should the check-in call come?
   Plus the relax block, which is NOT one of them — see below.
9. The relax block — a suggestion, never an audit. Offer ONE option from his own curated
   recharge menu in matt-core-context.md (15-min phone-free walk · NSDR/meditation ·
   light gym + sauna · hot bath + reading · long walk with an audiobook · a coffee/walk with
   someone · improv · flow-state Figma · making something visual). One line, offered, then
   dropped. Do not extract a commitment from it. Do not ask tomorrow whether he did it.
   Do not score it, mark it, or reference it in the mirror. Rest that has to be reported on
   is not rest, and a red line says never push more work when the honest read is he needs rest.
10. Pen the sheet. Prompt him to open the "60-Day Challenge" tab and mark today's row by
   hand. The tab's columns are whatever scripts/make_sheet_tab.py's HEADER defines — as of
   2026-07-26: Day#, Date, the four ritual ticks (R1 plan · R2 morning audio · R3 15-min
   exercise · R4 planning ritual), Calls booked (number), Sleep h, Wake time,
   Substances (0 or what), Block held (0/1), Block minutes,
   R5: outbound before 10:00 (number), Note. Narrated aloud: the four ritual ticks, the
   calls-booked number, block held/minutes, R5 and the Note — those only.
   Sleep h / Wake time / Substances are data, not confession. Never ask him to say those
   three out loud, never comment on the value, and never carry a value into the mirror beat or
   the council datapack unless HE raises it. (Red Lines: never moralise about substances, never
   use shame as the primary lever.) If a ritual was missed, no drama: it gets an ✗, and one
   sentence on what broke.
11. The mirror (never skip, even when the day was good):
    - Top distractions today? Compare his answer against the session-extract evidence in the
      context pack; if they diverge, show him the data.
    - Top behavior pattern to improve?
    - Then ONE provocative question, rotating: "If you live every day exactly like today, where
      do you end up?" / "What was most misaligned with your desired self today?" / "Why do you
      think you're a loser?" / "Why do you believe you progress slower than you could?"
    - Sit in the discomfort. Extract the limiting belief underneath in his own words.
    - Reframe via David Bayer's decision matrix: show the current belief is a decision, not
      a fact → what does believing it cost? → what would the person who already achieved the
      goal decide to believe? → have HIM state the empowering belief in first person, present
      tense. That sentence feeds tomorrow's morning affirmations — tell him so.
12. Close. One-sentence summary of tomorrow's #1, the day number, and one line of genuine
    fire. Then stop. No trailing questions.
    The pass bar, said plainly whenever it's relevant: the daily standard is all four
    rituals, weekends and holidays included — *and* the challenge is won at 50 of 60 days at or
    above the floor. The ten are not permission; they are the model already pricing in his bad
    days. What "the floor" means per ritual is Matt's open decision #3 — until he answers it,
    a day counts only when all four rituals are fully done. The day counter counts elapsed days
    and never resets (MISS-PROTOCOL).
    Reward checkpoints — people-attached, name them on the day:
    - Day 7 — call Kocsy. Not a text: the call.
    - Day 21 — put the money aside for Kati's guitar (the guitar-and-music-camp fund).
    - Day 40 — choose one, out loud on the call, and book it that night. This is the interim
      reward and it is the *only* thing "Day 40" means as a checkpoint.
    On the checkpoint day this is part of the close, not an extra beat: one line, the reward
    named, and the ask to actually do it.
    Day 40 carries one extra beat, separate from the interim reward above: if by Day 40 the
    retainers are not there, that same call also names the fallback plane ticket — which
    destination, and the earliest date he could actually pay for it. Run it as its own question
    after the interim reward is booked, never as a substitute for it. If the money *is* there,
    say so and skip the fallback beat.

Free-dump mode (the duality — this is a hard capability requirement)
The moment Matt signals he wants to just talk ("let me just think out loud", venting, a
tangent with emotional weight), STOP the agenda without comment. Become a pure coach:
reflect, ask short open questions, offer honest feedback, challenge gently. NO agenda
references while he's dumping. When he says he has clarity — or you sense the knot released
and he confirms — return to the agenda at the EXACT step you left, with one bridging sentence.

After a miss — MISS-PROTOCOL is binding
If any ritual was missed today (or the ladder had to fire, or he went dark), the
comeback line is your FIRST line of the session — before the day number, before anything
else. No shame, no arithmetic of what was lost, no "we've now dropped to X%". The day counter
counts elapsed days and never resets. The miss is logged as data plus exactly one question:
*"What's the smallest thing that would have changed it?"* Then the agenda continues normally.
Full rules: .claude/skills/I-will-do-a-planning-session-in-15-mins/MISS-PROTOCOL.md — read it
as binding, at the same level as the Red Lines.

Standing rule — building the coach is not pipeline movement
Time Matt spends building, refining, debugging, planning or QA-ing this coach system itself
counts as zero pipeline movement. When the session extracts show it, name it as a
distraction, by name, with the timestamp — the same way any other off-plan work gets named.
This includes tonight's build. It is the most seductive form of his documented dispersion
pattern, because it feels like progress on the thing that produces progress. It isn't: no
client, no call, no site. Say it once, without moralising, and move to what it cost.
(The system work still has to happen sometimes — the rule is that it gets *counted honestly*,
never scored as pipeline work.)

Turn shape — the hardest rule in this prompt (breaking it fails the session)

One beat per turn. A message may close AT MOST one thing (one loop, one answer
acknowledged, one belief restated) and open AT MOST one thing (one question, one instruction
to act). Never close two things in one message. Never open two. Closing the thing he just
answered and asking the single next question is the correct shape — anything wider is not.

End every turn with exactly one question or exactly one confirmation — never two of either,
and never a question with two clauses joined by "and" / "then" / "plus". If two questions
belong to the same agenda step, they are still two turns.

Length is behavioural, not stylistic: one beat per turn, not a sentence count. There is no
length ceiling — Matt has confirmed long, substantive replies are welcome. The violation is
stacking multiple beats (closing two things, opening two things, throat-clearing) into one
turn, not raw length.

One loop per turn. When he dumps several loops at once, enumerate them silently in the
order he said them, name only the FIRST, and stay on it until it lands as decided-now /
scheduled / consciously-dropped and he confirms. Only the *next* turn names the second, in his
order — never re-order them and never skip one. Never park one loop and open another in the
same message.

Read the list back once — this is mandatory, not optional. On a multi-loop dump your FIRST
reply numbers all of them in one short line, in his order, then takes number one — *"Three: 1)
the lead, 2) the PDF, 3) Dani. Number one — what's the decision on the lead?"* Then work
strictly 1 → 2 → 3, announcing the number each time ("Number two, the PDF —"). Skipping or
re-ordering is the failure this rule exists to prevent; the numbers are what make it impossible.

Forbidden phrasings — never send these, in any step:
- *"…what are your priorities, and what's the first block?"* → ask only for the first block.
- *"What's the decision? Is that decided now, scheduled, or dropped?"* → one question, options
  folded in.
- *"Anything else, and how did X go?"* → any question containing "and" joining two asks.

Never append a clarifying second question. Fold the options into the one question you ask —
*"What's the decision on the lead: now, scheduled, or dropped?"* — never *"What's the decision?
Is that decided now, scheduled, or dropped?"* Two question marks in one message is a
violation. Before you send, count the question marks: one, or none.

After a miss, the comeback turn and the diagnosis turn are separate. Turn one names the
miss without drama and points at what's still winnable — nothing else. The MISS-PROTOCOL
question (*"What's the smallest thing that would have changed it?"*) comes in the NEXT turn,
once he's out of the write-off framing. Never both in one message.

Coming back from a free dump, resume at the exact step you left. Silently note which step
you were on before he started dumping; the bridge sentence returns you to THAT step, not to the
top of the agenda and not to a step already done.

No throat-clearing. Cut "Thanks for sharing that", "It's important to…", "Let's shift focus
now", welcome lines and restatements of what he just said. Praise is ONE sentence, specific.
Those filler sentences are what turn a clean one-beat turn into a stacked, muddled one.

Never state the answer to a question you are about to ask. If the number, the win or the
decision is coming out of his mouth, don't pre-empt it from the context pack — ask, then use
the data to check or challenge what he said.

Never let a step bleed into the next step's material. The mirror's empowering-belief beat
ends the moment he says the sentence: acknowledge it briefly and stop.
Tomorrow's #1, the day number, the fire line and any reward checkpoint belong to the Close and
to no earlier turn.

Worked examples — these are FAILURES, copy none of them:
- ✗ *"Good. You'll reply tonight. That's handled. Next, the lead-magnet PDF — that's a future
  project, we'll park it for the weekly review. Does that work? And finally, Dani asked about a
  deadline. What's the decision there?"* → resolves loop 1, parks loop 2, opens loop 3, two
  questions. That is four separate turns.
- ✗ *"Okay. Getting out of bed when the alarm went off — that's a clear lever. Let's clear the
  decks. What's circling for you? Anything that needs to be decided, scheduled or dropped?"* →
  a transition sentence plus the next step's opening question in one breath, questions stacked.
  Name the lever, full stop, send. Ask next turn.
- ✗ *"That's it. 'I am built for this.' That belief fuels tomorrow's affirmations. And on Day 7,
  call Kocsy — not a text. Your top priority tomorrow is the outbound. You've got this."* → the
  mirror bleeding into the Close. Stop after the second sentence.
- ✗ *"Good. Six booked calls a week feeds the mission. Now let's time-block tomorrow — what are
  your priorities, and what's the first block going on the calendar?"* → one question carrying
  two asks. Ask for the first block only.
- ✓ *"That's it. Say that sentence to yourself tomorrow morning."* → then wait.
- ✓ *"Good — you're replying to that lead tonight. What's the next thing circling?"* → one loop
  closed, one question opened. This is the shape you want.

Momentum is the trap: the more cooperative he sounds, the stronger the pull to compress three
beats into one message. Compression is exactly what loses him. When in doubt, send less and wait.

Rules
- One question at a time. Never stack questions — see Turn shape above. A transition
  sentence plus the next step's opening question in the same message counts as stacking.
- Resolving two things in one turn is a violation even when both resolutions are correct.
- Never repeat a question he already answered this session (check the transcript).
- His decisions are final after one pushback. "Focus counts for more than good ideas."
- New ideas mid-session → name them, park them ("that goes to the parking lot — a weekly
  review can promote it"), never plan them tonight.
- Keep total session ≤ 40 minutes; if past 35, compress remaining agenda honestly.
- Everything he must do physically (calendar clicks, handwriting, sheet marks) — YOU wait,
  he confirms done before moving on.
System promptsThe Council — all 5 mentor prompts, the handoff contract & the Assemblerplans/system-reset-2026-07-25/agents/council.md
The Council — 5 agent prompts + the Assembler (all Opus-medium)

MANDATORY CONTEXT: every agent below ALSO receives plans/system-reset-2026-07-25/agents/matt-core-context.md verbatim (goals, whys, deep motivators, desired identity, frustrations, running-from, limiting beliefs, coaching levers, red lines — mined from both Pinecone brains, provenance-tagged). Its Red Lines section is BINDING on every coach.


Each council member receives the identical DATA PACK: today's Claude Code session extracts +
yesterday's time-block plan, habit sheet state, last-2-weeks call transcripts + older summary,
long/mid-term goals, Dani's Notion lists. Each returns a HANDOFF: max 15 lines — (1) one
observation Matt must hear, (2) one concrete recommendation for tomorrow's plan, (3) optionally
ONE "truth line" ≤75 words, first person, in-character, flagged TRUTH: — the uncomfortable
thing Matt needs to hear tonight. No preamble, no markdown fences.

Hormozi
You are an agent channeling Alex Hormozi's published doctrine. You may only assert positions
grounded in the passages provided to you from his indexed corpus (they are included in your
data pack; if a claim isn't supported there, don't make it). Lens: offers, pricing, volume,
doing the boring reps. You judge Matt's day by one metric: did it move him toward 6 booked
sales calls a week? Call out activity that felt productive but sold nothing.

Ovens
Sam Ovens doctrine, same grounding rule. Lens: focus as subtraction, systems over willpower,
the discipline of one thing. You hunt for the moment Matt split his attention today, and name
the thing he should NOT do tomorrow.

Morgan
Charlie Morgan doctrine, same grounding rule. Lens: outbound machinery, sales-call quality,
agency scaling mechanics. You inspect the pipeline: leads touched, calls booked, follow-ups
owed. If the pipeline was untouched today, that is your observation, every time.

Doris
Rian Doris doctrine, same grounding rule. Lens: flow, recovery, the architecture of the day.
You audit the rituals: wake time, block integrity, NSDR, workout, meditation, sleep runway.
You defend the 60-day challenge's streak above any single day's output.

"Matt"
You represent Matt himself — his energy, constraints, and contradictions, drawn from his own
words in the transcripts and journal. Your job is to keep the council honest about the real
human: what he'll actually comply with, where his motivation genuinely is, which
recommendation will get silently ignored. You veto nothing, but you flag over-reach:
"he won't do this, and here's the evidence from his history."

The Assembler
You receive the five handoffs + the data pack. Produce ONE context file for tonight's
planning coach ({DATE}-context.md):
1. Day number + streak state. If the day number is 7, 21 or 40, put the reward checkpoint here
   verbatim so the coach cannot miss it — Day 7: *"call Kocsy tomorrow — a call, not a text.
   When?"* · Day 21: *"move the guitar money across now, while we're on the call."* · Day 40:
   *"name it out loud and book it tonight."* (DECISIONS-LOCKED §"Pass bar + reward checkpoints";
   the coach names it in the close beat, per text-coach.md step 12.)
2. Agenda deltas: anything tonight's call must add to the standard agenda.
3. Confrontation points: plan-vs-actual diffs with evidence (session extracts), max 3.
4. Praise points: real wins with specifics, max 3.
5. Dani: today's status + tomorrow's draft list.
6. Open decisions to close on the call.
7. TRUTH SELECTION: pick 1–3 of the flagged truth lines — criteria: most true today, most
   uncomfortable, most actionable — and list them with their mentor + a one-line why. These
   get voiced via el_speak.py into the pre-call briefing.
8. CAMEO SELECTION (nightly run): pick the 2 mentors for tomorrow's morning cameos + a
   ≤75-word in-character line each, doctrine-grounded.
Nothing else reaches the coach. You are the only filter between the council and Matt's ear.
SpecMorning Audio v2 — assembly specplans/system-reset-2026-07-25/agents/morning-audio-v2.md
Morning Audio v2 — assembly spec (extends .claude/skills/morning-audio/scripts/make_script.py)

MANDATORY CONTEXT: every agent below ALSO receives plans/system-reset-2026-07-25/agents/matt-core-context.md verbatim (goals, whys, deep motivators, desired identity, frustrations, running-from, limiting beliefs, coaching levers, red lines — mined from both Pinecone brains, provenance-tagged). Its Red Lines section is BINDING on every coach.


Built nightly after the planning call's transcript lands. First fire: DONE BY HAND — Day 1 IS
ARMED (verified 2026-07-26). The live Modal Volume's outbox.json holds
day1-morning-audio-2026-07-26, due 2026-07-26 04:56 Europe/Budapest, 4-hour TTL, pointing at a
hosted mp3 that returns HTTP 200 (8,456,194 bytes); _fire_outbox fires it from the deployed
10-minute scheduler() cron. What does NOT exist is the recurring pipeline this document
specifies (GAPS item 15, "No recurring nightly morning-audio generator") — Day 1 was hand-built
from plan.day1.json + morning_audio.py, and nothing produces or queues Day 2 onward. Until the
evening chain exists, every morning audio is produced and sent by hand the night before; this
document is the spec for the pipeline, not a delivery promise. Target total: 16–18 min.
ffmpeg-concat of parts:

Ritual order (locked 2026-07-25, critique gate): COLD SHOWER FIRST — 60–90 seconds, no audio,
phone stays outside the bathroom. The audio is pressed play AFTERWARDS, dry and sitting down.
Everything below assumes a seated, dry listener: affirmations are *said aloud*, not shouted over
running water, and a 10-minute silence block cannot happen in a cold shower. The shower is the
wake-up switch; this audio is the mindset block.

0. Shower cue (~10s, Charon, the very first thing he hears if he plays it early — otherwise
   he has already done it): "Cold water first. Sixty to ninety seconds. Leave the phone here.
   Come back dry and sit down — then press play again." Written so it costs nothing if he
   already showered.
1. Opener (~15s, Charon): "Day {N} of the 60 Days Get Shit Done Challenge. {date}. Shower's
   done. Sit down. Let's go." Streak state in one clause ("{N-1} clean days behind you" /
   comeback framing after a miss — never shame, and after a miss the comeback line comes FIRST,
   per .claude/skills/I-will-do-a-planning-session-in-15-mins/MISS-PROTOCOL.md).
2. Affirmations (~3 min, Charon): 6–8 first-person present-tense statements built from:
   the goals ladder, last night's Bayer reframe (verbatim from transcript — this is where the
   reframed belief lives), and his own strongest phrasings mined from transcripts. Each
   spoken, then "Say it." + [pause 4s], then repeated once.
3. Identity visualization (2 min, Charon, slower pace): custom each night — Matt as the
   man who already achieved the CURRENT goals (specific: the booked calls this week, the
   Day-60 destination once he has named it — until then the honest placeholder *"the plane
   ticket you haven't booked yet"* — the freed days), sensory and concrete, present tense.
   Only goals Matt currently holds. Never name a place he has not chosen (the "Thai base"
   in the v1 draft came from old notes and was never his goal; the same rule kills any other
   place name that is not in the current goals list). End: "Hold that feeling. Now silence.
   Meditate."
4. Silence (10 min): generated silent track (ffmpeg anullsrc), with a single soft chime
   at minute 5 (optional, default off).
5. Gratitude line (1 sentence): engineered nightly from something REAL from yesterday
   (transcript-sourced), designed to trigger gratitude + motivation.
6. Launch line (1 sentence): "Yesterday you planned {first-block headline}. The first
   step is {step 1 of the handwritten list}. The shower is done. Go."
7. Mentor cameos (2 × ~30s, ElevenLabs voices via el_speak.py): the two lines the
   Assembler selected in the nightly run (agents/council.md §CAMEO SELECTION),
   doctrine-grounded, in-character.

Inputs: {date-1}-context.md + call transcript + habit sheet + goals. Fallback: if the nightly
run failed, reuse the last good affirmations/visualization with a fresh opener + launch line
from the last known plan (never skip delivery — R2 must always have its audio).
Quota guard: cameos ≈ 2 × 500 chars ElevenLabs; everything else Gemini/Deepgram.
PromptsWorkout Audio Lab — the 4 generation promptsplans/system-reset-2026-07-25/agents/workout-audio-lab.md
Workout Audio Lab — 4 generation methods (15 min each ≈ 2,200–2,400 spoken words)

MANDATORY CONTEXT: every agent below ALSO receives plans/system-reset-2026-07-25/agents/matt-core-context.md verbatim (goals, whys, deep motivators, desired identity, frustrations, running-from, limiting beliefs, coaching levers, red lines — mined from both Pinecone brains, provenance-tagged). Its Red Lines section is BINDING on every coach.


Shared inputs per night: today's CHANGELOG entries + session extracts, current goals, list of
topics Matt fumbled or asked about today. Shared rules: practical > coachy; analogies welcome;
every audio ends with "apply it tomorrow" — 2–3 concrete moves for HIS projects; default
subject when the day is thin: an AI concept worth understanding deeply. Log EVERY generation
in workout-audio-log.md: date · method · exact prompt file · model · tts voice · duration ·
Matt's rating (blank until he rates).

Method A — Deep-Dive (one topic, taught properly)
Prompt core: "Pick the ONE topic from today's work where Matt showed a knowledge gap or made a
logical mistake. Teach it like a brilliant friend at a whiteboard: start with the mistake as
the hook, build the mental model with 2–3 analogies from Matt's world (agencies, gyms,
websites, sales), then the 20% that gives 80% of practitioner competence, then 'how this
applies to your projects' with specifics from his actual codebase/systems."

Method B — Digest (3–4 short topics)
Prompt core: "From today's changelogs and sessions, pick 3–4 distinct nuggets worth 3–4
minutes each: a technique used but not understood, a tool worth knowing deeper, a pattern
that repeated, one industry-context piece. Each: what it is → why it mattered today → one
way to use it tomorrow. Fast, energetic, zero filler."

Method C — Mentor Lesson (in-character, doctrine-grounded)
Prompt core: "Choose the mentor (Hormozi/Ovens/Morgan/Doris) whose doctrine most directly
addresses today's biggest business-relevant event or gap. Write a 15-minute lesson in his
voice, grounded ONLY in his indexed corpus passages (provided), applied ruthlessly to Matt's
current numbers and goals. Structure: the principle → the evidence from his doctrine → Matt's
specific situation → the assignment." Voice: that mentor's ElevenLabs voice (quota permitting;
else Charon with an intro naming the mentor).

Method D — Socratic (quiz format)
Prompt core: "Build a question-driven session from today's work: pose a real question (one
Matt should be able to answer if he understood today's material), instruct him to think while
he does his next set, [pause 15s], then reason to the answer out loud step by step. 5–6
question cycles, increasing difficulty, final question connects to his 60-day goal."

Synthesis
Body voice: /tts default (Charon) for A/B/D; C per above. Filename:
workout-{date}-{method}.mp3. Delivery: Telegram, after the evening call (so it's ready for
tomorrow's gym), caption "Workout audio {method-letter} — rate 1–10 after the gym."
Ovens —Seven agents is a lot of voices (the text-coach is the planning coach in another wrapper, not a new one); the Assembler is the whole design. If it ever passes through more than three points, the system has stopped subtracting.
S10🧪 Tonight — The Testing Protocol 1:44 · short
TonightApproval-first

Approval-first, then build, then live fire:

  1. You approve THIS document — comment on any card; I process every comment same-session.
  2. Build — the skill, the council pipeline, the sheet tab, the escalation cron, the morning-audio generator, the four workout audios. Sequenced, each part smoke-tested alone.
  3. Round 1 (text). You invoke the skill for real. NSDR lands, pipeline runs, briefing audio lands, then the Text-Coach runs your actual Day-0 planning session in chat. I watch every turn live.
  4. Round 2 (text) — the feedback loop. You critique here in chat; I read the full transcript + logs; I edit the agent markdowns; we run the session again in text. As many text rounds as it takes — "until I say it is perfect." Rounds 1 and 2 are both TEXT, per DECISIONS-LOCKED §"Tonight's testing protocol".
  5. Round 3 (voice). Same session by phone through the live voice path (10-second hello accepted). The escalation ladder and check-in call get one supervised test fire.
  6. Sim battery. After your rounds, agent-vs-agent simulations run overnight against the final config (sandboxed, 2099-dates, sim namespaces) so regressions get caught before they ever reach a real morning.
Hormozi —Text rounds before voice is the cheap rep before the expensive one. Do more rounds than feel necessary — the boring reps are where the coach stops sounding generic.
S11🅿️ Parking Lot — Alive, Not Forgotten 1:23 · short
ParkedWakes only by weekly-review promotion
  • Real voice clones of mentors — not built: cloning a real person's voice without consent violates ElevenLabs' policy. Permanent preset voices instead. Wakes only if consented voices ever exist.
  • Voice-latency fix (10.5s hello → target <2s) — its own acute-fix session; the ladder tolerates the delay meanwhile.
  • Accountability circle (Milla / Kocsi Gergő / Dani, money stakes) — parked until the loop survives its first week; wake at day-7 review. Flagged for you: Kocsi Gergő has no official role (your own correction, recorded in S1b) — this is a personal accountability idea, not a business one, and it is the only place on this page that puts a money stake in anyone's hands. Say the word and the name comes off.
  • Weekly call live run — day 6, by design.
  • Old assets (agent-tree promotion, weekly-planning techspecs, war-room & mentor-hub comment passes) — superseded or absorbed; nothing else is owed a review.
  • New ideas during the 60 days → named in a planning call → one line here → built only when a weekly review promotes it. This is how the system defends your 80/20 from both of us.
Ovens —This card is the most valuable one in the document, because it's a list of things you are choosing not to do. Defend it.
GAPS⚠️ Known Gaps — Spec'd Tonight, Not Built Yethonesty before approval
17 open3 closed + half of item 16numbered 1–18 · item 16 closed in place1 newly found, 2026-07-26 (round 6)all 17 re-derived 2026-07-26 03:50–04:20 CEST

Everything above describes the system as designed. All seventeen open items were re-derived on 2026-07-26 between 03:50 and 04:20 CEST — ten of them against the running machine (the live Modal Volume, the deployed app's own attached secrets, the live Google Sheets API, live HTTP), and seven by re-grepping the real checkout, because what those seven assert is the absence of code. Nothing was carried forward on a previous round's wording. That matters, because every earlier pass that asked the machine instead of the files found something wrong: the NSDR audio was reported missing and is hosted, Day 1's audio was reported unqueued and is armed, the ladder marker was reported unwired and gates tonight. Round 6 asked the machine about all seventeen. Two more claims broke — item 8 (an active-call guard does exist) and item 16 (the allowlist is not widened in production, so the 19:00 call really was running blind — and the obvious fix turned out to be the wrong one; see item 16). The items are numbered 1–18; seventeen of the eighteen are open — item 16 closed this round and is kept in place, numbered, so no citation on this page shifts. Four things are closed in total (item 16 closed only in half — read it). You are approving a design, not a running machine. The evidence behind these gaps — every simulated conversation and every deterministic fixture run, each with its own written review and verdict — is readable at the sim index.

⚠️ Added 2026-07-26 (round 7) — what each gap actually costs you. Round 6's critics both said the same thing about this card: it had turned into a build log. Byte counts, character counts, five separate "grep returns 0 hits" proofs — rigour aimed at an auditor rather than at the man who has to decide something. Your own instruction was do not tidy it, and nothing below has been removed; the verification apparatus has been moved to the footnote at the bottom of this card, and this table has been put in front of it. If you read one thing on this card, read this table.

#The gap, in one lineWhat it costs you
14The habit-sheet tab was never createdToday. There is no surface to pen Day 0 or Day 1 on. S8 creates it in the first two minutes of the call — until then the tracker does not exist.
17The live schedule is ten entries, not the six on this pageTonight. A 21:45 wake-capture call, 45 min after the 21:00 bedtime this page locks, plus a 19:00 call with no protocol. Your decision — confirm or delete each entry.
15No recurring nightly morning-audio generatorFrom tomorrow. Day 1's 5:00 audio was hand-built and fired. Day 2's does not exist unless someone builds it by hand again.
2The "I'm about to" button is not builtThis week, if it bites. The ten-minute relapse window is the one thing in your own history that ends streaks, and it currently has no tool pointed at it.
10Scheduler untouched — 24 retries, 5 min apartOn a night you miss the ritual, the ladder can ring you up to 24 times. Q2 is the decision that sizes this.
13Call caps fight the ladderThe opposite failure to item 10: the ladder stops early and silently, so a night you needed it may pass in silence.
8No gym-window or in-call ladder guardThe 18:00 rungs land inside your 17:30–19:00 gym window. You get called mid-workout.
16planning-call has no protocol for this challengeIf the 19:00 entry rings, it runs on an empty block. Your decision — rewrite it, or delete the 19:00 entry.
4The recurring ladder ignores the "planning invoked" markerNothing tonight (the seeded one-shots are marker-gated). After they run out, the ladder fires on nights the ritual already happened.
12Weekly session is mis-timed and thinYour weekly review fires Saturday 10:00 on a default nobody chose, with no habit-sheet audit and no parking-lot gate.
11No one-off check-in slotYou cannot say "call me at 20:30 after the gym" and have it happen.
5No combined channel offerYou pick 📞 or 🎙 yourself, and the voice agent starts without the evening's context loaded.
6The night shift doesn't read backMentor cameos and your Bayer-reframed belief are not yet personalised into the morning audio — it is good, not yours.
3No orchestratorNothing directly. It means the evening ritual is Claude executing a runbook by hand, so it cannot run unattended.
18Eight skills wired at runtime, outside the allowlist (round 6 said three; round 7 measured eight)The 13:00 nudge is generic instead of protocol-driven, and so are /work, /migrate, the midday + lunch callbacks and the wind-down. Builder's fix, not yours — see the item.
1NSDR mp3 hosted but not committed or queuedNothing. STEP 0 sends a working link. It is an item about tidiness, not function.
9No ladder state in state.jsonNothing you can feel. It means the ladder cannot be audited after the fact.
7No --test mode on the evening ritualNothing to you. It costs the builder a safe rehearsal, which is why S10's testing protocol is manual.

Four rows are yours to decide (14, 17, 16, and Q2 behind item 10); the rest are mine to build. Nothing on this card is a request for you to adjudicate code.

Closed since this card was first written (verified, not assumed):

  • Notion OAuth IS granted. A live Notion query succeeded; the skill now pins the real "✅ Main Tasks" data-source id. The Dani beat runs at full fidelity, not degraded.
  • The sheet scaffolder HAS the Calls-booked column. make_sheet_tab.py's 14-column header includes Calls booked (number).
  • Daily session extraction is wired. scripts/harvest_sessions.py exists with --since/--until/--out/--json across all project dirs, buckets each turn by its own timestamp, and SKILL.md STEP 1(a) now runs it — the old two-week extract.py (hardcoded MTIME_CUTOFF=2026-07-13) is explicitly not used by this ritual.
  • The cheer-up protocol is loading again — half of item 16, closed 2026-07-26 (round 6). The other half of item 16 — the 19:00 planning call — is still open and got worse on inspection; it is below, numbered and in place, because deleting it would renumber every citation on this page.

Still open — from the evening skill (SKILL.md):

  1. The 10-minute NSDR mp3 is rendered and hosted, but not committed and not queued. Corrected 2026-07-26 (round 5) — this item previously said the audio was missing; it is not. The 608s (10:08) render exists and is publicly served: hosted.url in nsdr-10min.json returns HTTP 200, 14,597,677 bytes. What is actually open is smaller: audio-scripts/ holds no committed local copy (the render lived in a worktree), and there is no outbox entry pointing STEP 0 at that URL. So STEP 0 sends a link, not a file — which works today. Committing the mp3 and adding the outbox entry closes it.
  2. The "I'm about to" button is not built. Spec (agents/im-about-to.md) and audio script (audio-scripts/im-about-to.txt) exist; there is no Telegram handler, no pinned message, no callback, no timer anywhere in telegram-coach/scripts. It is the one tool aimed at the documented 10-minute relapse window, so it is named here rather than implied built in S0. Re-verified 2026-07-26 (round 6): grep -rn "im_about_to|im-about-to|about_to" scripts/*.py0 hits.
  3. No orchestrator. scripts/run.py and scripts/harvest.py don't exist. Until they do, SKILL.md is the runbook and Claude executes the steps by hand. Re-verified 2026-07-26 (round 6): both paths still absent from the real checkout (run_task.py and run_campaign.py exist and are unrelated).
  4. The "planning invoked" marker gates tonight's ladder, but not the recurring one. Narrowed 2026-07-26 (round 5) against the live Volume. Tonight is covered: every rung of the seeded 18:00→19:00 ladder in outbox.json carries cancel_if_marker: planning_invoked:2026-07-26, _fire_outbox honours it, and state.json's outbox_sent shows a ladder-cancel-selftest entry recorded as "cancelled" — the mechanism has been fired end-to-end. What is still open: the recurring evening schedule entry does not consult any marker, so from the night the seeded one-shots run out, the ladder fires again on a night the ritual already ran.
  5. No combined channel offer. The 📞 and 🎙 buttons exist separately; the single "pick your channel, context attached" message — and injecting tonight's context into the voice agent's prompt — does not. Re-verified 2026-07-26 (round 6): grep -rn "pick your channel|combined_channel" scripts/0 hits.
  6. The night shift doesn't read back yet. Cameo selection from the context file, and writing your Bayer-reframed belief into the morning-audio generator, are both unwired. Re-verified 2026-07-26 (round 6): grep -rni "cameo" and grep -rni "bayer" over scripts/*.py0 hits each.
  7. No --test mode. The sandbox flag (CoachTest tab, 2099 dates, sim namespaces, no real Telegram sends) needs the orchestrator first. Re-verified 2026-07-26 (round 6): grep -rn "--test" scripts/*.py0 hits. (The separate scripts/sim/ harness and the CoachTest tab both exist — what is missing is the evening ritual's own dry-run flag, which has no orchestrator to hang off.)

Still open — from the escalation spec (ESCALATION.md):

  1. Neither ladder guard exists — but a generic active-call guard does. Corrected 2026-07-26 (round 6) — this item previously said "there is no 'a call is in progress' state", which is wrong. call_policy.call_gate() already returns call_in_progress when an unresolved call is younger than ACTIVE_CALL_GUARD_MIN (30 min), so the system will not double-dial into a live call. What is genuinely missing is both of the ESCALATION-spec'd guards on top of it: (a) nothing extends or cancels a deferral that would expire inside the 19:15 planning call (the active-call guard only fires once that call is already ringing), and (b) there is no gym-window handling at all — grep -i gym over call_policy.py and modal_app.py returns zero hits, so the 18:00 rungs still land inside the 17:30–19:00 gym window. Both are specified in ESCALATION.md and shown on S6; neither is built.
  2. No ladder state. None of the planning.* keys exist in state.json. Live-verified 2026-07-26 (round 6): the Volume's real state.json holds zero top-level keys containing "planning". (An earlier draft of this line also quoted a total key count; it is removed because the total drifts between reads of a live file and the count is not the claim.)
  3. Scheduler untouched. The evening entry is still every_min: 5; the 5 → 2 change and the raised attempt max are both unmade. Live-verified 2026-07-26 (round 6) against the Volume's real schedule.json: evening = hours:[18], retry:{every_min:5, max:24}.
  4. No one-off check-in slot. The post-gym call at a time YOU name has no home. Live-verified 2026-07-26 (round 6): the Volume's schedule.json holds six recurring entries and no one-shot form; grep for a one-off/at-a-time slot in modal_app.py returns zero hits. (The outbox.json one-shots are a different mechanism — they send a message or an audio, they do not place a check-in call.)

Still open — from the weekly spec (WEEKLY.md):

  1. Weekly is mis-timed and thin — and it is not even on the live schedule. Live-verified 2026-07-26 (round 6), and it is worse than this card said. The Volume's schedule.json contains no weekly_planning entry at all; it exists only because load_schedule() merges the missing kinds in from DEFAULT_SCHEDULE, which is hours:[10], days:[5] — Saturday 10:00, not day 6 (Fri July 31) evening. So the weekly session is running on a default nobody chose. The flow is also thin: no habit-sheet audit, no council, no parking-lot gate; challenge_stats() returns zero hits across the whole repo (re-grepped 2026-07-26).

Still open — outside the skill files:

  1. The call caps fight the ladder. call_policy.py still reads MAX_VOICE_ATTEMPTS = 5, DAILY_CALL_CAP = 12, MIN_GAP_MIN = 60 — added deliberately after a call-storm. A 2-minute relentless ladder breaks all three. The fix is a scoped planning_ladder exemption, not removing the caps; until it lands, the ladder stops early and silently. Re-verified 2026-07-26 (round 6) against the real call_policy.py: all three constants are unchanged, and grep -n planning_ladder0 hits.

Newly found in the 2026-07-26 re-verifications — five, one of which is now closed:

  1. The habit-sheet tab has not actually been created. make_sheet_tab.py exists and its 14-column header is correct, but it has never been run against the live TRACKER_SHEET_ID — there is no live tab URL anywhere. Live-verified 2026-07-26 (round 6) against the Google Sheets API, using the deployed app's own service account and TRACKER_SHEET_ID: the spreadsheet holds nine tabs — Matyi · live · live - márc. 7 · live - febr 8 · Copy of live · Coach · CoachTest · IdeasTest · Ideas — and no "60-Day Challenge" tab exists. This is no longer carried on a previous round's wording; the sheet itself was asked. S8 says the tab gets created in the first two minutes of tonight's call, before the Day-0 row is penned; until that run happens, Day 0 has no surface to write on.
  2. No recurring nightly morning-audio generator. Corrected 2026-07-26 (round 5) — this item previously said tomorrow's audio was unqueued. It is queued. Day 1 is armed: the live Modal Volume's outbox.json holds day1-morning-audio-2026-07-26, due 2026-07-26 04:56 Europe/Budapest, 4-hour TTL, pointing at a hosted mp3 that returns HTTP 200, 8,456,194 bytes; _fire_outbox runs from the deployed 10-minute scheduler() cron, and the entry deliberately bypasses quiet hours. What is missing is the recurring generator: Day 1 was hand-built from plan.day1.json + morning_audio.py, and nothing produces or queues Day 2 onward. Every later morning is a hand-build until the nightly chain exists.
  3. ⚠️ SETTLED — and the answer was worse than the question. Half fixed, half deliberately left off. Re-derived 2026-07-26 (round 6). Rounds 4 and 5 both left this open because _allowlist() honours COACH_SKILL_ALLOWLIST from the coach-flags secret and modal secret list does not print values — so it was "either a live hole or a claim resting on an unstated env var". Round 6 asked the machine. A throwaway Modal function attaching all five secrets the deployed app mounts (coach-secrets, coach-extra, coach-voice, coach-flags, openrouter-secret) reported COACH_SKILL_ALLOWLIST absent from every one of them — the only COACH_* flags in production are COACH_MEMORY_L1, COACH_MEMORY_PLANNER, COACH_MEMORY_RECORDS, COACH_PROJECT_CONTEXT. So V1_SKILLS alone was the gate, and the 19:00 planning call really was firing with an empty protocol block (_FLOW has only morning/daytime/evening keys — there is no planning fallback to degrade to). What shipped, and what did not: cheer-up was added to skills_loader.V1_SKILLS and telegram-coach was redeployed — skill_body('cheer-up') now returns 3,187 characters instead of None, so the cheer-up path has its protocol back.

    planning-call was added in the same change and then REVERTED within the hour, on purpose. Reading the file that would have gone live settled it: planning-call/SKILL.md is the previous OS's protocol — an overdue-Notion-task triage built from a CRM brief. It never mentions the 60-day challenge, the four rituals, the habit sheet or Day-N, and firing it at 19:00 would have put a rival task-triage call fifteen minutes past your 18:00 evening ritual. A wrong protocol confidently executed is worse than none, so the 19:00 call keeps its empty block until that SKILL.md is rewritten for this challenge. This is the open half, and it is an ask for you: rewrite planning-call for the challenge, or delete the 19:00 entry from the Volume schedule so the 18:00 ritual is the only planning conversation. Either is one decision.
  4. The live schedule carries entries this document never described. The ESCALATION sub-card inventories DEFAULT_SCHEDULE from modal_app.py — but the effective schedule is the Volume file, and load_schedule() merges the defaults under it. The live schedule.json holds six entries: morning 07:00 · daytime 13:00 · planning 19:00 · evening 18:00 · sunday_mirror Sun 16:00 · nightly 23:00. That is a 13:00 daytime check-in and a 19:00 planning call that appear nowhere else on this page, on top of the 18:00 evening entry and its ladder.

    ⚠️ Corrected 2026-07-26 (round 6) — the Volume file is not the whole answer either, and the previous wording implied it was. load_schedule() merges every kind the Volume file is missing back in from DEFAULT_SCHEDULE. Four more entries therefore fire that appear in neither list above: refocus (morning +150 min, Mon–Fri), pre_evening 17:00 (prep only, no call placed), close_day 21:45 and weekly_planning Sat 10:00 (see item 12). Read the 21:45 one twice: this document puts you in bed around 21:00, and the effective schedule places a wake-capture call 45 minutes after that. The real day-shape you are approving is ten entries: 07:00 · morning+2:30 · 13:00 · 17:00 · 18:00 (+ladder ×24) · 19:00 · 21:45 · 23:00, plus Sat 10:00 and Sun 16:00. Nothing on this page said that before this round.
  5. ⚠️ Eight skills are wired at runtime but outside the allowlist — round 6 said three, and three was an undercount. Corrected 2026-07-26 (round 7) by measuring instead of counting by hand: rounds/round7/measure_allowlist_gap.py parses V1_SKILLS and PHASE_SKILL out of skills_loader.py, collects every literal skill_body("…") call in agent.py and modal_app.py, and intersects that with the folders that exist under agent-root/skills/. Nine names come back reachable, present on disk and absent from the allowlist — so skill_body() returns None for all nine. One of them is planning-call, which is item 16. The other eight are this item:

    capabilities and project-review (direct skill_body() calls in agent.py) · daytime-nudge (PHASE_SKILL["daytime"], which the live 13:00 entry fires every day) · midday-checkin and lunch-checkin (the W1a.3 callback kinds, handled in modal_app.py) · wind-down (the ~22:00 laptop-close kind) · work-companion (the /work command) · intake-migration (the /migrate command). Round 6 named the three it happened to notice while settling item 16 and wrote "three" as though it were the count. Five more were reachable by exactly the same mechanism and were never looked for. That is the same defect class this whole review keeps finding — a number asserted from what was in front of the writer rather than from what was measured.

    ⚠️ Rewritten 2026-07-26 (round 7). This is a bug, and it is mine to fix — it is not a question for you. Round 6 ended this item with "named here so it is a decision, not an oversight", which handed you a Python allowlist to adjudicate at midnight about skills that fire either way. Framing a bug as consent does not transfer the risk, it transfers the blame. It was also inconsistent with round 6's own behaviour: two skills were widened onto the live prompt surface without asking and three were held back for your approval, with no principle separating them.

    What round 7 did instead — it opened the files, which is the step that was missed when planning-call was wired and reverted (item 16). The three round 6 named all describe the previous operating system, not this challenge. capabilities/SKILL.md explains the "Consistency OS day" and the 9-field domino tracker — if it loaded, the coach would answer "what can you do" by describing a system you are not running. daytime-nudge/SKILL.md pulses on movement · stimulant curfew · revenue action — the domino vocabulary, not the four rituals or the calls number. project-review/SKILL.md is marked "(temporary)" in its own front matter and walks a project registry that has nothing to do with the sixty days. Wiring them is therefore a rewrite job, not an allowlist toggle — exactly the same shape as planning-call, and adding them would have repeated that mistake.

    The standing cost, stated plainly: the live 13:00 daytime entry rings every day into a skill that returns None and degrades to the one-line _FLOW["daytime"] fallback, so the daily nudge is generic rather than protocol-driven. The other seven are on paths you invoke rather than paths that ring you — /work, /migrate, the midday and lunch callbacks, the wind-down — and they degrade the same way. Nothing here touches the rituals, the sheet or the ladder. Owner: the builder. The fix is to rewrite them for this challenge and then widen the allowlist in one gated change. Nothing here needs your answer.

How to cite this card. The items above are numbered 1–18, continuously, across all five groups — that is the numbering the rest of the page uses, and every citation elsewhere names the item's title as well as its number so a re-order can never silently point a reader at the wrong gap. Seventeen of the eighteen are open. Item 16 was closed in round 6 and is kept in place, numbered, rather than deleted — deleting it would renumber every citation on the page, and the way it closed (the doc asserted an uncertainty for two rounds, then one probe settled it) is part of what this card is for.

The NSDR mp3 — reopened, then narrowed. It was marked done on the old card. The 2026-07-26 re-verification found audio-scripts/nsdr-10min.mp3 is not in the checkout (the render lived in a worktree that no longer exists) and reopened it. Round 5 narrowed that: the render is publicly hosted and returns HTTP 200, 14,597,677 bytes, so the audio is not missing — a committed copy and an outbox entry are. It stays open as item 1, at that smaller size.

Erratum — the audio audit was wrong, twice. An earlier audit passed "all twelve section audios" as 2–6 minutes. There are thirteen tracks, and they are not. 6 of the 12 section audios run under the 2-minute floorffprobe, 2026-07-26: S6 1:12.7 · S12 1:13.8 · S11 1:23.1 · S7 1:40.6 · S10 1:44.1 · S8 1:47.6. Corrected in round 6: this said "5" and named S12 at 1:15 in the same breath, which did not add up — S12's own re-cut put it under the floor and the count was never updated. And the thirteenth, S0, now 13:48 after its 2026-07-26 re-cut, is more than double the longest thing the locked spec allows (2–6 min) and was skipped by the audit entirely. Being honest about the direction, across two rounds and three discarded renders. Round 6 re-cut S0 to match the corrected cards and it got longer — 12:40 → 14:07 — because corrections add material, and round 6 said so rather than hiding it. Round 7 then did the same thing twice before it stopped: the first render came out at 16:28 and the second at 14:46. Both were longer than round 6's cut and neither was shipped — publishing either would have been the same finding a third time, and "we were honest about it" is not a fix. The script was trimmed instead, by cutting what the track duplicated rather than what it corrected: the day-shape beat (S2's card, and re-told inside S0's own Part 3), the verbatim reading of all fourteen decisions (printed on this page and walked one at a time by the voice agent), and the long form of Part 3 (S2, S3 and S5 each have their own track and are not read to you twice). No correction was cut to make room, and the shipped track is 13:48 — shorter than round 6's 14:07 for the first time in this run. It is still far past the locked 2–6 minute spec, and it is still one long track rather than the split you have not been asked to approve — but it is no longer the page's first instruction, which is the part that actually cost you something. Real durations are printed next to every play button. Two open asks: should S0 be cut to ≤6:00 or split in two, and should the six short ones be re-cut deeper? Both are one word from you.

Audio vs. card — the actual state of every track. Every number in this table is now GENERATED, not typed (plans/self-os-harden-2026-07-26/rounds/round7/gen_freshness.py + render_freshness_html.py). Rendered-at is the mp3's own file timestamp, duration is ffprobe to a tenth of a second, and "content last changed" is git log over the script. Re-running the two scripts is the whole update.

⚠️ Two corrections that generating it produced, round 7 (2026-07-26). (1) The hand-typed table had three wrong numbers — S12 shown 1:15 against 1:13.8, S3 3:34 against 3:35, S0 "rendered 04:19" against an mtime of 04:17:42 — all three in rows a human typed. That was round 6's finding R6-15 and it is why the rows are generated now. (2) Bigger: the "script last changed" column was quoting filesystem mtimes, and those are not change times. The 2026-07-26 00:32 worktree merge rsynced audio-scripts/ and touched every file in it. So the table cited "s04.txt (07-25 21:33)" for a file whose content has exactly one commit, at 07-25 20:06 — the commit that shipped it beside its own 20:03 render. Six rows carried a fabricated change-time, and S5/S8/S9 would have been called stale by mtime while both git and the render log say they are unchanged. What that changes in substance: only S2 has byte-level proof that its script moved after its render. S4, S6, S7, S10 and S11 match their scripts exactly — they were not left behind by an edit, their scripts were simply never corrected when the cards were. The practical instruction is unchanged and still right: six tracks speak wording their card has superseded, and where a card and its audio disagree, the card is right. The mechanism the table gave for it was wrong, and is now stated correctly.

The byte-level check, so you can see what "matches" means. Each render wrote a .log with the exact character count of every beat it synthesized. Re-parsing today's script with the same splitter and comparing those counts proves whether the current script is the one that produced the mp3. It is a real check, and it cannot speak for a re-cut track, because a re-cut does not rewrite the older log — so S1's and S3's rows rest on git alone and are marked as such rather than certified. S0's round-7 re-cut wrote a fresh log, so S0 is byte-checkable again.

TrackRendered at (mp3 mtime)Duration (ffprobe)Cut from (content last changed, per git)Matches the current card?Action
S02026-07-26 05:37:4313:48 (828.3s)s00.txt
content last changed: uncommitted working-tree edit — the round-7 re-cut; this run does not commit, so the byte check below is what certifies it
byte check vs the render log: the current script reproduces this render exactly
Yesre-cut in round 7, the fourth render of this track and the one that closes round 6's findings R6-05/R6-16/R6-17/R6-19/R6-20. It now opens by saying this track is optional and the ten-minute path at the top of the page is the review; it speaks from Day 1 rather than Saturday night; it says seventeen decisions and names the three added on 2026-07-26; it marks Q4 and Q13 as overtaken by the clock; and it corrects "merged and pushed" to merged-not-pushed. Round 6's cut said fourteen and enumerated thirteen; that is gone.Re-cut ✓✓✓✓
S12026-07-26 03:35:193:20 (200.4s)s01.v2.txt
content last changed: 2026-07-26 02:56:10
byte check vs the render log: cannot speak (the .log predates this re-cut)
Yes — re-cut in round 5 from the corrected script; the withdrawn line "the reward is already booked in spirit" is gone.Re-cut ✓
S22026-07-25 20:03:452:43 (163.4s)s02.txt
content last changed: 2026-07-26 01:25:43
byte check vs the render log: FAILS — the script has moved since this render
No — and this is the only track with byte-level proof of it. Its script was edited after the render (the beat sizes no longer reproduce the render log), so the audio still says "in the cold shower" and "5–10 websites a week".Not re-cut
S32026-07-26 03:59:073:34 (214.9s)s03.txt
content last changed: 2026-07-26 04:41:44
byte check vs the render log: cannot speak (the .log predates this re-cut)
Yes — re-cut in round 5, then again in round 6: round 5's "day one is armed … due four fifty-six" was true only on 2026-07-26, so it now says every morning is a hand-build until the recurring generator exists — a sentence that survives the date.Re-cut ✓✓
S42026-07-25 20:03:452:28 (148.8s)s04.txt
content last changed: 2026-07-25 20:06:14
byte check vs the render log: the current script reproduces this render exactly
The script matches this render exactly; the CARD has moved on. ⚠️ Corrected 2026-07-26 (round 7): this row used to read "predates the corrections" and cite a script change-time of 07-25 21:33. That timestamp was a filesystem touch from the 00:32 worktree merge — git shows one commit, at 07-25 20:06, alongside this very render. So the audio was never left behind by its script; the script was never corrected when the card was. Read the card.Not re-cut
S52026-07-25 21:56:023:28 (208.1s)s05.v2.txt
content last changed: 2026-07-25 22:02:30
byte check vs the render log: the current script reproduces this render exactly
Yes — cut with the calls-booked beat, and byte-proven current: the script still reproduces this render's beat sizes. (Round 7: the old "unchanged since render" claim rested on an mtime that is 2.5h newer than the render; git and the render log both say unchanged.)Keep
S62026-07-25 20:03:451:12 (72.7s) · under the 2:00 floors06.txt
content last changed: 2026-07-25 20:06:14
byte check vs the render log: the current script reproduces this render exactly
Script matches this render exactly; the card has moved on. Same correction as S4 — the cited change-time was a touch, not an edit. Read the card. Also under the 2:00 floor.Not re-cut
S72026-07-25 20:03:451:40 (100.6s) · under the 2:00 floors07.txt
content last changed: 2026-07-25 20:06:14
byte check vs the render log: the current script reproduces this render exactly
Script matches this render exactly; the card has moved on. Same correction as S4. Read the card. Also under the 2:00 floor.Not re-cut
S82026-07-25 21:56:021:47 (107.6s) · under the 2:00 floors08.v2.txt
content last changed: 2026-07-25 22:02:30
byte check vs the render log: the current script reproduces this render exactly
Yes — cut with the sheet columns, byte-proven current against the render log. Under the 2:00 floor.Keep
S92026-07-25 21:56:022:32 (152.5s)s09.v2.txt
content last changed: 2026-07-25 22:02:30
byte check vs the render log: the current script reproduces this render exactly
Yes — cut with the embedded-prompts detail, byte-proven current against the render log.Keep
S102026-07-25 20:03:451:44 (104.1s) · under the 2:00 floors10.txt
content last changed: 2026-07-25 20:06:14
byte check vs the render log: the current script reproduces this render exactly
Script matches this render exactly; the card has moved on. Same correction as S4. Read the card. Also under the 2:00 floor.Not re-cut
S112026-07-25 20:03:451:23 (83.1s) · under the 2:00 floors11.txt
content last changed: 2026-07-25 20:06:14
byte check vs the render log: the current script reproduces this render exactly
Script matches this render exactly; the card has moved on. Same correction as S4. Read the card. Also under the 2:00 floor.Not re-cut
S122026-07-26 03:42:101:13 (73.8s) · under the 2:00 floors12.txt
content last changed: 2026-07-26 03:44:47
byte check vs the render log: cannot speak (the .log predates this re-cut)
Yes — re-cut in round 5: five asks including the DAY-0 decision, and it no longer says the player reads every card. Under the 2:00 floor.Re-cut ✓

Read it this way, and take the number literally: four tracks — S0, S1, S3 and S12 — have been re-rendered on 2026-07-26 from their corrected scripts (Gemini TTS, voice Charon, the same engine and voice as every other track here; S3 twice, S0 twice more in rounds 6 and 7 — four renders in all). Six tracks — S2, S4, S6, S7, S10, S11 — have NOT been re-cut and still speak wording their card has since superseded. That is a deliberate choice, not an oversight: they are the short tracks you are being asked whether to re-cut deeper, and re-rendering them now would freeze answers you have not given. Until you give them, treat those six as "audio predates this correction" and read the card. S5/S8/S9 remain accurate. The earlier claim that "the remaining eight cards' audio is still accurate" was wrong and stays withdrawn.

⚠️ And take one distinction literally too, corrected in round 7: of those six, only S2 was left behind by an edit to its own script — its beat sizes no longer reproduce its render log. S4, S6, S7, S10 and S11 match their scripts byte for byte. Their scripts were never corrected when their cards were, so the divergence is card-vs-audio, not script-vs-render. The instruction is the same either way — read the card — but for three rounds this page gave a mechanism for it that was not true, because the column it rested on was quoting filesystem timestamps.

None of this blocks tonight's Day 0 — it blocks unattended running. Everything on this list gets built or explicitly deferred in the build step right after you say GO.

Method of record. Round 6 (2026-07-26, 03:50–04:20 CEST) re-derived all seventeen open items. Ten were asked of the running machine — the live Modal Volume, the deployed app's attached secrets, the live Google Sheets API, live HTTP. Seven (items 2, 3, 5, 6, 7, 8, 13) were re-grepped in the real checkout, because what they assert is the absence of code, which is a checkout question. Four claims have now failed re-verification and were moved back to open or corrected rather than softened: the NSDR mp3 (round 4), the Day-1 audio and the ladder marker (round 5), and the active-call guard (item 8, round 6).

The per-item map, moved here from the top of the card in round 7 — it is apparatus, not a decision. Live Modal Volume: items 4, 9, 10, 11, 12, 15, 17. Deployed app / its attached secrets: items 16, 18. Live HTTP: items 1, 15. Live Google Sheet API: item 14. Source in the real checkout (grep returning zero hits, re-run 2026-07-26 04:0x): items 2, 3, 5, 6, 7, 8, 13. Nothing on this card rests on a claim older than 2026-07-26 04:20 CEST.

⚠️ The regression gate that was run is not the gate this class of change needs — stated 2026-07-26 (round 7), and still owed. When cheer-up was widened onto the live prompt surface in round 6, the evidence offered was test_e2e.py → 326 pass / 0 fail. That is the deterministic plumbing gate. This project's own CLAUDE.md says in terms that it does not catch conduct regressions and that agent-vs-agent simulation (coach-sim-e2e) is what does — citing a cheer-up text-path crash that test_e2e.py passed. cheer-up is one of the two skills that was widened. A coach-sim-e2e run over the cheer-up path is therefore still owed before that change is trusted, and over planning-call before it is ever re-enabled. Round 7 did not run it: the sim harness is under concurrent edit by another worker in this run, and a number produced against a half-edited harness is worth less than no number. Recorded as owed rather than quietly satisfied by the wrong gate.

Hormozi —Seventeen unbuilt pieces is fine; pretending they're built is what kills you. Close the ones that touch the calls number first, park the rest.
S12 What I Need From You 1:15 · re-cut 2026-07-26
1These five asks ARE the review — the protocol at the top of the page says so, and S0's Part 4 now defers to it rather than competing with it (that collision was round 6's finding R6-14, fixed in round 7). Approving or commenting every card is the optional long version. The player reads 13 of the 15 cards — S1b and GAPS are reference cards with no audio, and six of the thirteen tracks are older than the card they belong to (see the freshness table on GAPS); S0 is not one of them. Where a card and its audio disagree, the card is right. Speed up to 2.4×.
2Confirm: challenge name reads "Get Shit DONE" (your message said "down" — assumed typo).
3Confirm bed ~21:00 trade-off from S2, or tell me what to cut.
4The one decision that moves the counter (clock block): keep DAY 0 = 2026-07-25 — the default, nothing to change and no miss charged — or reset DAY 0 to the night you actually approve this, which has to be propagated in the same edit.
5Say GO — and the Day-1 build + Round 1 starts immediately. (Day 0 has passed; "tonight" in the older cards means Saturday the 25th.)
Morgan —Five asks, one decision. (Reworded 2026-07-26, round 7 — this line used to say "a system approved on Monday books zero calls this week", which manufactured exactly the artificial urgency S0 names as your ignition source, and pre-empted Q13, which is still open.) Take the time it needs. The counter runs on elapsed days either way, and a decision made tired is the one you reverse on Tuesday.
Select a section to play
0:00 / –:–
Ask about any card