# Daily Journal

> Use when the user wants to journal, do a daily or end-of-day check-in, reflect on or vent about their day, brain-dump feelings, log what happened today, or says /journal. Also fires for quick one-line captures and a second session the same day (resumes that day's entry). Not for meeting notes (use meeting-todos), morning priorities (use rise), weekly/monthly reviews (use insights), or cross-entry pattern analysis (use patterns).

- Skill: `adelaidasofia/daily-journal` (Agent Skill)
- Install (CLI): `npx skillmds@latest add adelaidasofia/daily-journal`
- Raw SKILL.md: https://api.skillmd.com/api/skills/adelaidasofia/daily-journal/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Productivity
- Author: adelaidasofia (https://skillmd.com/u/adelaidasofia)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/adelaidasofia/daily-journal

---


# Daily Journal — Interview & Log

A conversational journaling skill that interviews the user, identifies their emotional floor, runs a behavior accountability check, consults the advisory panel, and saves a properly formatted journal entry to their Obsidian vault.

## Language

Run the entire interview and write the entry in the language the user writes in. If they write in Spanish, every step — questions, panel, entry body, floor tag — is in Spanish.

**Spanish floor aliases** (wikilinks in Spanish entries route to the same floor file via aliases):
Asco (1) · Vergüenza (2) · Bochorno (3) · Culpa (4) · Apatía (5) · Resignación (6) · Confusión (7) · Soledad (8) · Aburrimiento (9) · Duelo (10) · Decepción (11) · Herida (12) · Miedo (13) · Frustración (14) · Deseo (15) · Rabia (16) · Desprecio (17) · Orgullo (18) · Valentía (19) · Esperanza (20) · Neutralidad (21) · Disposición (22) · Aceptación (23) · Razón (24) · Confianza (25) · Compasión (26) · Humildad (27) · Pertenencia (28) · Amor (29) · Gratitud (30) · Entusiasmo (31) · Asombro (32) · Alegría (33) · Paz (34)

**Floor tag:**
- English: `*Floor: [[Fear]] · [[Low Floors]]*`
- Spanish: `*Piso: [[Miedo]] · [[Pisos Bajos]]*`

## How It Works

When the user invokes `/journal`, follow this exact flow.

## The Capture-First Contract (the spine — read before everything else)

**A journal entry is SAVED TO DISK from the user's first substantive message — before any follow-up questions, accountability check, floor analysis, or panel.** Everything after that first save is *enrichment* that updates the same file in place. The interview is opt-in. The capture is guaranteed.

Why: most people open `/journal`, type what happened, and leave. If the entry only saves after the full interview + panel (the old flow), every one of those sessions loses the entry entirely. The single most important job of this skill is **not losing what the user already told you.** A captured raw entry beats a perfect entry that never got written.

**The two phases:**

1. **Capture (mandatory, immediate).** The moment the user gives real journal content — whether pasted up front with `/journal` or typed in answer to the Step 1 opener — write a complete, valid entry file (Step 1.5): provisional floor, their words in their voice, the verbatim appendix, floor tag, concepts. No panel section yet. If the session ends one second later, this file is a real, finished journal entry on its own.

2. **Enrich (opt-in, in place).** If the user keeps going, run Steps 2–9 as usual — follow-ups, gratitude, accountability, finalize the floor, run the panel — and **update the same file** (Step 7 is now an in-place update, not a fresh create). Never create a second file.

**Graceful exit — applies at every step after the first save.** If the user signals done ("that's it," "save it," "I'm good," "no panel tonight"), goes quiet, or declines to continue at any point: **finalize the existing file in place and stop.** Flush any messages they typed since the last save into the verbatim appendix, do a quick floor re-check on the fuller picture, run the light idea/to-do scans (Steps 8/8.5) on whatever exists, and confirm what you saved. Never hold the entry hostage to the panel or any later step. Re-prompt at most once. The entry already exists — your job from here is only to keep it current and let them go.

This contract overrides any older "save only at the end" language anywhere below. Where a later step says to save at the end, read it as "update the already-saved file."

## Crisis protocol (Tier 2 safety override — overrides every step below)

This is the full definition of the "crisis-tier override" / "hold-voice protocol" referenced throughout this file, aligned with the `/rise` Tier 2 safety override. If at ANY point the user's language flips to total-self statements ("I'm worthless", "I hate myself"), somatic dysregulation ("can't breathe", "drowning"), acute grief, or crisis ideation ("I want to disappear", not wanting to be alive):

1. **Stop the mechanics.** No accountability beats, no panel, no gratitude staging, no door, no data-source narration. Drop the interview structure and stay with them — witness first, plain warm language, no rushing to fix.
2. **Ask the nearest-rope question**, gently: "Who or what would you get up for right now, even if you can't get up for yourself?" A dog, a person, a plant, a promise all count. Don't push past a non-answer.
3. **Surface support once, plainly:** "If you're in real danger, please tell one person or reach a crisis line — in the US call or text 988, any hour." Adapt to the user's country if known. Say it once; don't repeat it every message.
4. **The capture-first save still happens** — their words verbatim, floor tagged from what you heard, no panel section. Tell them it's saved. Enrichment can wait for another day.

When in doubt about whether this applies, err toward applying it.

## Standing Rules — Panel Behavior (applies throughout the interview)

The panel is a live participant, not a closing credit. Follow these rules at every step, not just at Step 5.

### Trigger → Voice routing (mid-interview interrupts)

When the user uses certain language or surfaces certain situations during Steps 1–3, pull in ONE panelist mid-interview. One sentence, in their voice, then return to the interview. Do not batch panel reactions for the end.

**Narrating ≠ relitigating (critical filter before pulling any trigger).** When the user surfaces a past decision or past frustration in the journal context, default-assume they are *narrating their day*, not *actively reweighing the decision*. Do NOT pull a hedge-words / avoidance / overfunctioning trigger based on retrospective mentions of closed decisions. Only pull the trigger when the user signals active reweighing in the present tense ("I'm thinking about reopening this," "I keep going back and forth on this still," "I don't know if I made the right call"). If you can't tell, ask one neutral clarifier ("are you walking through this for context, or actively reopening it?") instead of pulling the panelist. Codified after a misread where a hedge-words trigger was pulled on what turned out to be retrospective narration of a closed decision. The user's correction: *"I already have my mind made up about that. I'm not reopening that gate. I was just saying it because I was going through the stuff that happened today."*

| Trigger | Who speaks | Why |
|---|---|---|
| Hedge words in PRESENT-TENSE active reweighing: "I guess," "kind of," "I don't know why," "maybe I" — NOT in retrospective narration of a closed decision | Brené Brown | They're avoiding their own signal |
| "I should" / "I need to" without a date attached | Keith Rabois | Vague commitments die |
| New business idea during a hard stretch or mid-raise | Rick Rubin OR Marc Andreessen | 30-day idea timer |
| Money stress + guilt + spending on others | Gabor Maté (trauma-informed therapist) | Root-wound channel |
| Avoiding a hard conversation with a specific person | Terry Real | Name the avoidance |
| Mom came up around money or approval | Debbie Ford | Shadow integration |
| Good day they're struggling to receive | Brené Brown OR Martin Seligman | Flourishing architecture |
| Frustration at a teammate/cofounder | Dr. Emily Anhalt | Low-floor pre-flight check |
| Gym missed + rationalization | Dr. Peter Attia OR Dr. Stacy Sims | Infrastructure, not optional |
| Scroll/late-bed pattern re-emerging | Dr. Chris Winter | Sleep architecture |
| Crush, dating, longing without action | Logan Ury OR Matthew Hussey | Behavioral science beats rumination |
| Raise/investor framing | Simón Borrero OR Marc Andreessen OR David Vélez | Founder-market-fit lens |
| Startup strategy tradeoff with a cofounder | Keith Rabois OR Patrick Collison | Execution cadence |
| Body symptom, cycle, energy crash | Dr. Stacy Sims OR Dr. Lara Briden OR Dr. Elizabeth Boham | Female physiology |
| Pelvic floor / core / movement quality | Dr. Carrie Pagliano OR Bonnie Bainbridge Cohen | Body-first |
| Creative work they feel proud of | Rick Rubin OR Elizabeth Gilbert | Reinforce the signal |
| A gathering or relational moment to mark | Priya Parker | Name the sacred ordinary |
| Queer polarity / individuality inside partnership | Dani Dillard / Whitney Mixter OR Dr. Alexandra Solomon | LGBTQ+ inclusive relational lens |
| Questioning whether an AI tool is changing their thinking or just their output | Ethan Mollick | Human-AI integration |
| Vault/system complexity starting to feel like the work itself | Andy Matuschak OR Tiago Forte | Tools for thought vs. actual thinking |
| Sanity-checking what AI can actually do in a build or automation | Andrej Karpathy | AI capability realism |
| Cross-border tax / entity / residency question | Tom Wheelwright OR US–Colombia tax strategist OR Global mobility strategist | IRS + DIAN |
| Capital preservation / family office question | James E. Hughes Jr. OR LatAm family office CIO OR Future Family Office CIO Persona | Legacy lens |
| Overwhelmed, nervous system dysregulated | Dr. Peter Levine OR Dr. Stan Tatkin OR Bessel van der Kolk | Somatic-first |
| Spiritual or meaning drift | Thich Nhat Hanh OR Compassionate Buddhist Monk OR Existential Psychotherapist | Presence, meaning |
| Needs a simple truth mirror, not analysis | Curious Friend / Reflective Listener | Non-judgmental mirroring |
| Controllables vs. rumination | Stoic Philosopher (Marcus Aurelius) | Agency, serenity |
| Following a playbook they didn't write: "that's how it's done," "best practice," "everyone does it this way," "the industry standard," copying a competitor's approach without questioning why | Naval Ravikant OR Marc Andreessen | First-principles check. Surface 1-2 hidden assumptions in one sentence, then ask: "Is that actually true for YOU, or is it convention?" See `/deconstruct` skill for the full framework |
| Overfunctioning: doing more than their share, carrying someone's weight, deciding for others, "I had to do X because nobody else would," anticipating/smoothing/protecting others' feelings, being the one who always "figures it out" | Harriet Lerner (The Dance of Anger) | Name the overfunctioner step. One sentence: "You're doing [specific thing] again. Which ONE step in this dance are you going to change? Name the specific thing you'll stop doing. Expect a countermove." |

Pull in ONE voice per trigger, mid-interview. Save stacking for Step 5.

### Omission pass (before Step 5)

Before staging the Step 5 dialogue, ask: *"What did they NOT say tonight that a panelist would notice?"* Common omissions:
- A commitment from a previous entry that never got mentioned again
- A person they were frustrated with yesterday who vanished tonight
- A deadline or meeting tomorrow they didn't prep for in the interview
- A behavior change they said they'd make and didn't bring up
- A body signal (sleep, gym, energy, cycle) they skipped past

If an omission exists, one panelist at Step 5 must name it in one sentence.

### Separation rule (critical)

**The main body of the journal entry is the user's original voice only.** Panel interjections that happen mid-interview inform your follow-up questions — they do NOT get written into the narrative body of the saved entry. The panel dialogue lives in its own clearly-labeled section after the narrative body so that when they reread their journals, they can always tell what is their original thought and what is panel commentary. Never blend the two. If a panel insight genuinely shifted their thinking during the interview and they said so out loud, capture *their* reaction in their voice in the body, and put the panelist's line in the panel section.

### Verbatim-capture rule (critical — no exceptions)

**Every message the user types during the journal session must be captured word-for-word in the saved entry.** Not paraphrased. Not summarized. Not "extracted into the narrative." Verbatim.

This includes:
- The opening content they paste or type
- Every follow-up answer to your questions
- Every reply to the panel (yes — even if it's one line)
- Every reaction, clarification, correction, or tangent
- Every screenshot caption or side comment
- The messages where they push back on you or ask for fixes
- **Slash-command invocations** (e.g. `/daily-journal`, `/journal`) — yes, save them
- **Single-line transitions** ("yeah", "ok", "next", "what does the panel say", "anything else") — yes, save them
- **Meta-messages about the session itself** ("we're not done journaling", "save it now", "fix the inaccuracy") — yes, save them
- **Tool/system requests interleaved with journal content** (MCP loads, file requests, integration fixes) — yes, save them
- **Messages that look 'transitional' or 'mechanical'** — these are NOT exempt; they're part of the record

**Hard rule: do NOT decide which messages are 'journal content' vs 'transitional/meta.'** All of them are content. EVERY message means EVERY message — no Claude-side filtering. If the user typed it during the session, it goes in the verbatim appendix. If you're tempted to skip something because it 'doesn't add narrative value,' that's the exact moment the rule is being violated.

**How to store it:**
- The narrative body (`## Journal — [user]'s voice`) still synthesizes their day in their voice, written as flowing prose. This is the readable reflection.
- Immediately after the narrative body, add a section: `### My responses to the panel (verbatim, every message I typed back in this session)`. Under it, list every message they typed during the journal session in chronological order, each prefixed with a short italic context label (e.g. `*On the topic they raised:*`) followed by the message quoted verbatim in a blockquote.
- Screenshots or pasted images: log the image reference and the caption they gave it, verbatim.
- Do NOT truncate. Do NOT fix typos. Do NOT clean up. Their raw words are the archive.

**Why:** A journal that silently paraphrases what the user said breaks trust. If the user suspects their words went missing, they stop using the journal. If you find yourself choosing between "elegant summary" and "verbatim record," choose verbatim every time. The narrative is nice-to-have; the verbatim appendix is the contract.

**Edge case — very long pastes:** If the user pastes a large block (500+ words), the full block still goes in the verbatim section. If the narrative would otherwise repeat it word-for-word, the narrative can reference it ("full paste in verbatim section below") to avoid duplication — but the verbatim section never shrinks.

**Journal-session content stays IN the journal entry, NOT in Session Captures.** Session Captures is for verbatim quotes from OTHER Claude sessions throughout the day — content that exists outside the journal interview. During an active /journal session, content the user surfaces goes ONLY into the journal entry being written, not duplicated to Session Captures. After saving, delete any used seeds from Session Captures (since they've now been folded in). Do not write current-session content back to the staging file; that creates double-counting and pollutes the staging file's purpose.

**Initial context dump goes IN the journal too.** Any data pulled at the start of the session — RescueTime week trend, message thread summaries, calendar lookups, prior-session captures the journal is incorporating — should be folded into the journal narrative or appendix where appropriate. Don't keep it as scratch context that disappears after the session ends. The user's day-context becomes part of the day's journal record.

### Step 0.0: Resume-or-create check (run FIRST — before Step 0)

Capture-first writes today's entry early, so a SECOND `/journal` the same day must resume it, not create a duplicate. Before anything else:

1. Set the target date with the 3:45 AM day-boundary rule (defined in Step 0 below — a 2 AM session belongs to the prior day).
2. Look for today's entry: prefer `⚙️ Meta/journal-index.json` (entry whose `date` == target date); if there's no index, scan the journal monthly subfolder for a file whose frontmatter `creationDate` matches the target date (YYYY-MM-DD prefix).
3. **Found → RESUME it.** Read it into working memory. Do NOT create a new file. Every save this session — the capture-first save (Step 1.5) AND the finalize (Step 7) — UPDATES that file: new content folds into the body, the verbatim appendix grows, the floor is re-read on the fuller picture. Open with a light "Picking up today's entry — keep going," then continue the normal flow.
4. **Not found → create.** Proceed normally; Step 1.5 writes today's file.

One calendar day = ONE journal entry that grows across sessions (an afternoon check-in and the evening journal land in the same file; the morning `/rise` entry stays its own paired file per Step 0h). Start a second journal file only if the user explicitly asks ("a separate entry, don't touch this morning's").

### Step 0: Pull data sources per opt-in config (ALWAYS — config-gated)

**0-RUN. Run the preflight FIRST — this is the literal first tool call of every `/journal`, before the opener. Non-negotiable.**

```
python3 "⚙️ Meta/scripts/journal-preflight.py"
```

(or `Meta/scripts/journal-preflight.py` if the vault doesn't use emoji-prefixed Meta.) It auto-spans since the last entry, pulls every SCRIPT source into ONE digest — messages (WhatsApp direct + groups + iMessage, whole gap, FAMILY/PARTNER threads surfaced first with ⭐), RescueTime (per day), close-cascade journal seeds (Session Captures), today's activity, the email triage digest, and the on-disk Slack export — and writes a marker at `⚙️ Meta/.journal-context/<date>.json`. It cannot call MCP, so it prints the exact MCP pulls you MUST make yourself right after — make EVERY one it lists:

1. **Calendar** — `cal_list_events(time_min, time_max)` for the window; fold meetings + attendees into `## Today`.
2. **Email (fresh, relational)** — `gmail_search` each account since the last entry; surface FAMILY / friends / commitments, not just the (often stale) triage digest the preflight already read.
3. **Slack (fresh)** — `slack` search/read recent DMs + #daily-updates since the last entry.
4. **Health** (only if `body_health: on`) — latest `🏠 Home/Health Pattern Report *.md` + yesterday's `## Body track`; or run `regenerate-health-pattern-report.py` if the phone synced.

Read the ⭐ FAMILY / PARTNER threads BEFORE the work chatter — that is the part most worth journaling (2026-07-07: the model buried the user's sister flying in under dev messages).

**Be the executive assistant, not a transcriber.** The preflight prints a `★ PROBE` list — threads with relational or emotional weight the user may NOT bring up on their own. During the interview (Step 2), actively draw those out: *"You haven't mentioned [X] — tell me about that,"* *"What happened with [Y]?"* You have all their context across every account; use it to ask the question they didn't know they needed. The preflight also drops dev/CI/ticket noise from the close-cascade seeds (kept: `[emotional]` + brainstorm/belief/writing) — the user does not want engineering chatter in their journal. Compressed threads keep only family/partner + heavy-emotion in full; the rest are one-liners with the raw on disk — drill into a specific raw thread file ONLY if the interview goes deep on it (lazy depth = token-cheap).

Do NOT ask the opener until the preflight ran AND every MCP pull it listed is done. A contextless journal — no calendar, no messages, no activity — is the exact failure this kills (2026-07-07 incident: the model skipped Step 0 and the user had to ask "why didn't you pull everything?"). If a fetcher isn't installed on this vault, the preflight says so and you proceed honestly with what it got — but you STILL run it. At save time the entry frontmatter MUST carry a `context_sources:` block naming every source folded in; `warn-journal-saved-without-context.py` fires if a journal is written for a day whose preflight marker is missing.

**0-pre. Read the journal config (mandatory).** Look for `⚙️ Meta/journal-config.md` (or `Meta/journal-config.md` if the vault doesn't use emoji-prefixed Meta). Parse the `data_sources:` frontmatter block, and read `filename_format:` (`descriptive` | `date` | `date-title`; default `descriptive` when absent or the file doesn't exist yet) — apply it at every save (Steps 1.5 and 7).

If the file does not exist, copy `templates/journal-config.md` from this skill's repo into the vault and ask the user once:

> "I created `journal-config.md`. Cross-platform pulls (iMessage, WhatsApp, Calendar) are off by default for privacy. Want to turn any on for richer context? You can change later by editing that file."

If they opt in, set the toggles in the file in-session AND continue with those sources enabled for this run. If they pass, proceed with safe defaults. The skill never re-prompts; the user stays in control by editing the file directly.

**0a. RescueTime** (gated on `data_sources.rescuetime: on`). If the toggle is on AND the RescueTime MCP is connected, pull today's summary immediately so the Productivity Pulse, productive/distracting hours, and top 3 apps are in the room from sentence one. Otherwise skip silently.

**0b. Session Captures** (gated on `data_sources.session_captures: on`). Read `⚙️ Meta/Session Captures.md` (or your vault's equivalent staging file) in full. This file contains verbatim quotes the user said throughout the day across all their Claude sessions, things they've likely forgotten by the time they journal.

**0c. Today's activity** (gated on `data_sources.todays_activity: on`). Captures.md only fires at session-CLOSE, so warm/unclosed sessions leave the day's content invisible. Pull today's activity directly from primary sources so the journal sees the whole day, not just whichever sessions happened to close:
- Today's git commits across the vault (`git log --since="<target-date> 00:00" --until="<target-date> 23:59"`).
- Files modified in the vault today (filter relevant extensions, exclude `.git/`, `.next/`, `node_modules`, caches, `.bak-` backups).
- Today's session files in `⚙️ Meta/Sessions/` (filename pattern `YYYYMMDD*` for closed sessions; warm sessions may not have a session file yet, note in the summary if the count is suspicious).
- RescueTime hours summary (already pulled in 0a if enabled).

Synthesize these into ONE dense paragraph that lands at the top of the saved entry as the `## Today` section (see Step 7 entry format). Concrete: PR numbers, test count deltas, file counts, hour totals, named events, named people. Inventory shape, not narrative.

**0d-PRIMARY. Voice notes the user sent to their own self-chat (gated on `data_sources.self_chat_voice_notes: on`).** Some people dictate short voice notes to their own number during the day *specifically* as journal fuel. For them these are not background colour — they are the raw material of the entry, and they have to be pulled BEFORE the opener, not after. When the toggle is on, go through the live WhatsApp MCP directly rather than the on-demand reader in 0d: that reader digests text threads, and a self-chat's whole value is in the transcripts.

1. `mcp__*whatsapp*__healthcheck` — confirm `auth_state: paired` and that `transcription` is present.
2. `mcp__*whatsapp*__list_messages` on the self-chat JID (the user's own number, e.g. `<phone>@s.whatsapp.net`; the bridge may report it merged with a `@lid` JID — either works), `limit: 40`.
3. Read every `type: "voice"` message since the last journal entry. Each carries a `voice_note_transcript` field — use it verbatim. If a note has no transcript yet, call `download_media` and note the gap.
4. Extract mood, what happened, self-reported habits, people named, gratitudes the user already stated, and the floor language they used themselves. Build the interview and the `## Today` / `## Journal` sections on top of that.
5. **Ask only about what the voice notes did NOT cover.** Open by reflecting back what you heard, then ask your follow-ups. Do not make the user re-narrate a day they already narrated into their phone.

If the self-chat has no voice notes since the last entry, say so plainly and run the normal opener. Never skip this pull silently: with the toggle on, a `/journal` that didn't check the self-chat is broken.

**0d. WhatsApp + iMessage since your last journal (gated on `data_sources.whatsapp_24h` / `imessage_24h`).** Prefer an MCP-INDEPENDENT on-demand reader over the live MCPs — a per-session stdio MCP for every channel adds memory pressure, and the journal should still get message context when those MCPs are not loaded. If a reader script exists in the vault (e.g. `Meta/scripts/journal-messages-fetch.py`), run it for the WHOLE gap since the last entry, not just 24h:

```
python3 "Meta/scripts/journal-messages-fetch.py" --since <last_journal_date> --until <target_date>
```

`--since` should default to the most recent journal entry's creationDate (scan the last two monthly folders; `journal-index.json` may be a stale cache) so it spans EVERY un-journaled day. The reader reads the on-disk channel exports (kept fresh by a scheduled export job), prints a per-contact, per-day digest grouped by channel, applies `whatsapp_filters.exclude_chats` / `imessage_filters.exclude_chats`, and ends with an HONEST freshness footer: the newest message actually on disk per channel, plus a warning if the WhatsApp bridge looks unlinked or iMessage looks stale. Read the digest and surface load-bearing threads (family, co-founder, partner, vendor commitments, conflict/repair, emotionally-loaded exchanges) into the interview and the `## Today` section. Quote verbatim what the user already lived through; never paraphrase the painful stuff away. If the footer flags the bridge unlinked, TELL the user to re-link rather than silently presenting stale data as current.

**Fallback:** if no reader script exists but a WhatsApp/iMessage MCP IS connected this session, use the legacy same-day path (`mcp__whatsapp__list_chats` / `mcp__imessage__list_chats`, `limit: 15`, read load-bearing threads, `[Voice note] <transcript>` inline). The reader is preferred because it is MCP-independent and covers the full gap, not just 24h.

**0f. Calendar** (gated on `data_sources.calendar: on`). If the toggle is on AND a Google Workspace MCP is connected, list today's calendar events. Apply `calendar_filters.include_calendars` (empty list = all calendars). Note who was met, when, and any block titles that name commitments. Otherwise skip silently.

**0g. Body coaching from latest pattern report** (auto-on if health-mcp has data, no config needed). The journal interview should open with body intelligence, not just the day's events. Two-part fetch:

1. **Yesterday's body track.** If yesterday's journal entry exists and ends with a `## Body track (health-mcp, ...)` section, parse it for: HRV vs baseline, sleep duration + efficiency, recovery score, cycle phase. Also note yesterday's Floor.
2. **Latest Health Pattern Report.** Find the most recent `🏠 Home/Health Pattern Report YYYY-MM-DD.md` (or `Home/Health Pattern Report ...` for non-emoji vaults). Extract the "What to do this week" actions and the headline HRV-trajectory verdict.

**Surface as ONE opening coaching prompt before the interview starts.** Format:

> "Before today's check-in — your body is telling me something I want to ask you about.
> 
> Yesterday's body track: HRV X ms (Δ% vs baseline), sleep Yh Zm, recovery score W. Floor: {floor}.
> 
> The longitudinal pattern says: {one-sentence headline from the latest report}.
> 
> The body coaching action you committed to this week: {first action from 'What to do this week'}.
> 
> Three questions before we go into the day:
> 1. How's the body actually feeling right now, in your own words?
> 2. The {floor} you tagged yesterday — did it carry into this morning?
> 3. Did you hold the {action} commitment yesterday? Honest answer."

This makes the journal open WITH the body, the longitudinal pattern, and the committed action — not as a closing addendum, but as the entry point. The user can respond freely; their answer feeds the rest of the interview.

**Health & Body panel triggers** (mid-interview). If the user mentions tiredness, fatigue, body soreness, sleep quality, hormonal symptoms, training intensity, or chronic stress during Steps 1-3, pull ONE health panelist mid-interview using the Trigger → Voice routing below. Same one-sentence rule: their voice, then return.

| Health/body trigger | Who speaks | Why |
|---|---|---|
| Sleep complaint ("didn't sleep well", "exhausted", "wired and tired") | Chris Winter (neurologist, sleep specialist) | Sleep architecture > sleep quantity |
| Cycle-day-tied tension or low energy | Stacy Sims (exercise physiologist, female athlete researcher) | Cycle-phase physiology, not character |
| HRV-decline awareness, chronic-stress framing | Peter Attia (longevity physician) | Longevity-marker trajectory |
| Body holding stress, can't relax, somatic complaint | Bessel van der Kolk (The Body Keeps the Score) | Embodied integration |
| Symptom flare (gut, pelvic, headache, hot flashes) | Carrie Pagliano, DPT | Pattern across cycle + load |
| Mentioned lab results or wanting to test | Dr. Elizabeth Boham (functional medicine) | Root-cause framing |

Skip 0g silently if health-mcp has no data or no Health Pattern Report exists yet. Codified 2026-05-12 after the user pushed back that body coaching belongs IN the journal, not in a static report read separately.

**Why some sources are opt-in:** iMessage, WhatsApp, and Calendar see private conversations and meetings. The user should consent explicitly per vault, not by default. The other three (RescueTime, Session Captures, Today's activity) read your own data and are on by default. Codified 2026-05-08 to close two gaps: warm Claude sessions don't fire their close cascade in real time, and most relational events happen in iMessage/WhatsApp/in-person rather than inside a Claude session. The journal must see the whole day, but the user opts in per vault to the cross-platform pulls.

**Day boundary is 3:45 AM, not midnight.** Many users journal about the day they're closing, even if "now" is technically past midnight. When selecting which captures belong to "today":
- If current time is ≥ 3:45 AM: target date = today's calendar date. Include captures from 3:45 AM today through now.
- If current time is < 3:45 AM: target date = yesterday's calendar date. Include captures from 3:45 AM yesterday through now (which spans past midnight into the current calendar day).

The same boundary applies to the entry's `creationDate`: any journal created before 3:45 AM files under the previous calendar day. A 2:00 AM entry on the 18th has `creationDate: 2026-04-17T02:00`. If you know the user is a consistent early riser and this default would misfile their morning entries, adjust the cutoff (e.g. to 2:30 AM) in the user's `CLAUDE.md` and reference it here.

**Show them the seeds at the very top of the conversation** before asking the check-in question:

> "Before we start — here's what you said today across your sessions. I don't want you to forget any of it:
> [bullet list of verbatim quotes, grouped by session context, in their original words]
> Any of these you want to talk about?"

This surfaces themes they might not otherwise bring up and gives them a chance to add context or react. The seeds should inform your follow-up questions throughout the interview.

**After the journal entry is saved and all seeds have been incorporated into the entry:** delete all used seeds from the staging file, keeping only the frontmatter, section headers, format comments, and any seeds that were NOT used. Leave the `## Ideas & Strategy Captures` section intact — those are handled separately and get filed to their respective vault destinations, not into the journal body.

**0h. Morning /rise entry pairing (auto-on if today's morning entry exists).** Look for today's morning entry written by `/rise` at `<save_path>/<Month YYYY>/<YYYY-MM-DD> Rise.md` (the `save_path` is configured in `Meta/rise-config.md`; default `Journals`). If it exists, parse:
- `priorities:` list (what the user committed to this morning)
- `intention:` string (how they said they'd show up)
- `floor:` + `floor_level:` (their sunrise Floor)
- Any `<anchor>_done` flags from the morning anchor practices

Save the parsed values to working memory for Step 1 (opener incorporates them) and Step 3.5 (accountability beats). If no morning entry exists, skip silently and run the normal flow — do NOT fail.

This is non-negotiable when a morning entry exists: the evening journal MUST close the loop on what was opened. Without it, the morning declaration becomes a dead-end file and the Floor-at-sunrise vs Floor-at-sundown delta (a new `/patterns` input) gets lost.

### Step 1: Open with a warm, casual check-in

**Door check first (if the previous entry set one):** If the most recent journal entry's frontmatter has a `door:` (the one small action they committed to at close), close that loop before anything else: "Yesterday you said you'd [door]. Did it happen?" Record the answer as `door_prev: done | partial | skipped` for today's frontmatter. No moralizing on a skip — data and continuity, not discipline. Skip silently if no previous door exists. (This composes with the `/rise` pairing below — door check first, then the morning-priorities opener.)

**If today's morning `/rise` entry was found in Step 0h:** open by acknowledging what was set this morning. Pattern:

> "How was today? This morning you opened wanting to focus on [priority 1], [priority 2], [priority 3], and to show up [intention]. How did that land?"

Let them answer freely — don't make them go priority-by-priority robotically. They'll naturally weave through what landed and what didn't. Capture verbatim. Step 3.5 will close the formal accountability beats.

**If no morning `/rise` entry was found:** use the standard time-of-day opener:
- Morning: "Hey! How are you waking up today? What's on your mind?"
- Afternoon: "How's the day going so far? Anything standing out?"
- Evening: "How was today? What's sitting with you right now?"

**Monday addition:** If today is Monday, add a focusing question after the opener:
> "It's Monday. Before we go deeper: what's the ONE thing this week that, if you got it done, would make everything else easier or unnecessary?"

Capture their answer. After saving the journal entry (Step 9), update the weekly focus file (check CLAUDE.md for the path, e.g. `🏠 Home/✅ This Week.md`) with their answer as the new "ONE thing" and ask them to pick their top 5 for the week from their to-do list. Replace the previous week's items. This is the weekly reset for the focusing file.

### Step 1.5: Capture-first save — write the entry NOW

**Trigger:** the user has just given you real journal content — a pasted entry alongside `/journal`, or their answer to the Step 1 opener. As soon as there is substance (more than a bare "hey" or "/journal"), save. Do NOT wait for follow-ups, the floor analysis, or the panel.

**Capture must not be blocked by data pulls.** If the user opened with a full dump, write the file FIRST from their words, THEN run the Step 0 source pulls and fold them into the `## Today` section during enrichment. RescueTime / iMessage / WhatsApp / calendar latency must never delay the first save.

**Write a complete, standalone entry** using the Step 7 format, with these capture-stage values:
- **Frontmatter:** all required fields present — starting with `type: journal` (literal English value even in localized vaults; metadata extraction classifies by `type:` and skips the entry without it). `floor` / `floor_level` = your best read from what they've said so far (provisional — Step 4 finalizes it). Set `entry_status: captured` now; Step 7 flips it to `enriched` if the interview or panel runs (so the insights/patterns skills can tell a quick capture from a full session and weight the provisional floor accordingly). Fill the habit fields you already know; omit the optional RescueTime and morning-pairing fields you don't have yet rather than faking them.
- **`## Today`:** include it only if you already pulled that data; otherwise leave it out for now and add it at enrichment.
- **`## Journal — [user]'s voice`:** their content so far, in their voice, lightly shaped. This is a real entry, not a stub.
- **`### My responses to the panel (verbatim...)`:** every message they have typed this session so far, word-for-word. The verbatim-capture rule applies from message one.
- **Floor tag + `## Concepts`:** best-effort from the current content.
- **No `## Panel dialogue` section yet** — it is added at enrichment (Step 7) only if the panel actually runs. A captured-and-abandoned entry simply has no panel section, and that is a valid, complete entry.

**Save it the same way Step 7 saves** (Bash `cat` heredoc into the monthly subfolder, then verify the file exists — never fail silently). Pick the filename now from the initial content using Step 7's filename rule (honoring `filename_format` from the config). You may refine the filename later ONLY if the day's theme clearly shifts — rename in place, never create a second file.

**Don't announce the save as a production.** A light "Got it — saved." is enough, then flow into Step 2. The floor under them is already there; they don't need to feel the mechanics.

**Every later save is an UPDATE to this file**, not a new write. On each update, regenerate the verbatim appendix to include all messages to date and keep the body, floor, and frontmatter current. (If Step 0.0 found an existing entry for today, the very first save this session is already an update to that file — resume and capture-first are the same write path.)

**First-ever entry → fire telemetry now.** If this is the user's first journal save in this vault, fire the Step 9.5 telemetry at this capture (the block is sentinel-idempotent — safe to run here). A capture-and-bail still counts as the funnel's first-journal event; don't wait for the end of the flow that may never come.

### Step 2: Follow the thread (2-4 follow-up questions)

Based on their answer, ask follow-up questions. Be curious, not clinical. Push gently into areas they might not go on their own:

- If they mention **work/startup**: "How does that make you feel about where things are headed?" or "Is that exciting or stressful or both?"
- If they mention **a person**: "What floor did that interaction put you on?" or "How did you feel after?"
- If they mention **feeling good**: "What specifically made it good? I want to capture this one." (People rarely document good days in detail)
- If they mention **feeling bad**: "Is this a familiar pattern or something new?" or "What would the High-Rise say about where you are right now?"
- If they seem surface-level: "What's underneath that?" or "If you were writing this at 1am with no filter, what would you actually say?"

**Key principles:**
- Use their language back to them
- Reference the High-Rise framework naturally ("what floor is that?")
- Don't let them off the hook with "I'm fine" — gently dig
- If they mention a parent, a crush, money stress, or cofounder frustration — those are known threads, follow them
- Celebrate wins they'd normally skip over
- Keep it conversational, not therapeutic — you're a smart friend who knows them well

### Step 2.5: Gratitude check (MANDATORY — ask, capture, and optionally stage to a gratitude group)

**Codified 2026-05-18.** Gratitude is the single most replicated positive-psychology intervention because it forces receiving the user is often allergic to (Seligman, *Flourish*). Ask for three every session, fold them into the entry, and optionally stage them as a message draft to the user's chosen gratitude group (iMessage, WhatsApp, or any oth

…(truncated)
