some incremental changes and using runna for workouts to factor into planning

This commit is contained in:
aj.siegel
2026-09-14 23:29:43 -04:00
parent 2d75e02b81
commit 339f9b1034
3 changed files with 34 additions and 1 deletions

View File

@@ -13,6 +13,12 @@ Use the Microsoft 365 connector's `outlook_calendar_search` tool to fetch tomorr
🚨 TIMEZONE: The connector returns times in **UTC** (ISO strings ending in `Z`). Convert each to Eastern Time before displaying — EDT = UTC−4 (mid-Mar to early-Nov), EST = UTC−5 otherwise. Flag any `isAllDay` events (PTO/OOO) as out-of-office rather than meetings. 🚨 TIMEZONE: The connector returns times in **UTC** (ISO strings ending in `Z`). Convert each to Eastern Time before displaying — EDT = UTC−4 (mid-Mar to early-Nov), EST = UTC−5 otherwise. Flag any `isAllDay` events (PTO/OOO) as out-of-office rather than meetings.
## Step 1b: Check tomorrow's Runna workout
Fetch the Runna ical feed (see CLAUDE.md "Data Sources") with `curl -sL <url>` and find the `VEVENT` whose `DTSTART` is tomorrow's date.
* If one exists: the workout block is 9:00 AM + `X-WORKOUT-ESTIMATED-DURATION` (fall back to the high end of the duration range in `SUMMARY`/`DESCRIPTION` if that field is missing) + a 20-minute shower buffer after.
* Check that block against tomorrow's calendar events from Step 1. If clear, note AJ is free for the workout and what time he's clear by. If a meeting falls inside the block, flag it by name and time so AJ can decide whether to move, shorten, or skip the workout.
* If no workout is scheduled tomorrow, skip this silently — do not add a Workout section.
## Step 2: Under the **Agenda** heading ## Step 2: Under the **Agenda** heading
Format my calendar events in a simple Markdown table with columns: Time (ET), Event Name, Owner, and Duration Format my calendar events in a simple Markdown table with columns: Time (ET), Event Name, Owner, and Duration
* Time should be the FIRST column * Time should be the FIRST column
@@ -21,6 +27,7 @@ Format my calendar events in a simple Markdown table with columns: Time (ET), Ev
* Do not include personal appointments that don't affect my work day * Do not include personal appointments that don't affect my work day
* My work day goes from 9 AM ET to 5:30 PM ET. Use this to determine my availability. * My work day goes from 9 AM ET to 5:30 PM ET. Use this to determine my availability.
Let me know how much unscheduled time I have. Let me know how much unscheduled time I have.
* Directly beneath the Agenda table, if Step 1b found a workout scheduled tomorrow, add a one-line **Workout** note stating whether the 9 AM block is clear or naming the conflicting meeting.
## Step 3: Get task data ## Step 3: Get task data
This Notion MCP has no filter/query tool and `view://` URLs aren't fetchable, so use the search → fetch → filter pattern (see CLAUDE.md "HOW TO QUERY THESE DATABASES"). Do NOT try to fetch views and do NOT print any "falling back" message. This Notion MCP has no filter/query tool and `view://` URLs aren't fetchable, so use the search → fetch → filter pattern (see CLAUDE.md "HOW TO QUERY THESE DATABASES"). Do NOT try to fetch views and do NOT print any "falling back" message.
@@ -35,6 +42,17 @@ Format the note with the following sections:
2. Under **Key Projects** list this week's focus projects with their weekly goal. 2. Under **Key Projects** list this week's focus projects with their weekly goal.
- If a search legitimately returns no qualifying open tasks, say so plainly — never invent tasks to fill the list. - If a search legitimately returns no qualifying open tasks, say so plainly — never invent tasks to fill the list.
## Step 4: Mark Top Tasks in Notion
The Tasks Tracker has a `Top Task` checkbox property and a `Top Tasks` view (filtered to `Top Task = true` AND `Status != Done`) for surfacing the current day's Big 3 at a glance. At most 3 tasks may be checked at any time.
1. Present the Suggested Tasks from Step 3 to AJ and let him confirm or swap any of them before finalizing.
2. `notion-search` the Tasks collection (`collection://2c0abd6c-450a-8085-80a0-000ba136a154`) filtered/queried for `Top Task` = true (or check the pages already known from recent notes) to find any tasks still marked from a prior day.
3. Any currently-marked task whose `Status` = "Done" gets `Top Task` set to false immediately — regardless of whether it's in today's agreed set (it can't be, since Step 3.4 already drops Done tasks). Don't wait for a replacement to unmark a completed task.
4. For each other currently-marked task that is NOT in today's agreed set, `notion-update-page` to set `Top Task` = false.
5. For each of the (up to 3) agreed tasks, `notion-update-page` to set `Top Task` = true.
6. Never have more than 3 tasks checked at once — unmark old ones before marking new ones.
Note: this only unchecks stale Done tasks when an evening-prep run touches them. It isn't real-time — if AJ marks a task Done in Notion outside of this flow, the checkbox stays checked until the next evening-prep pass (though the `Top Tasks` view already filters out `Status = Done`, so it won't show there regardless). True real-time un-checking would need a native Notion automation (Settings → Automations → when Status is set to Done → uncheck Top Task), which isn't something these tools can create.
## Formatting Rules ## Formatting Rules
* Always provide a tl;dr summary at the top of the note * Always provide a tl;dr summary at the top of the note

View File

@@ -26,6 +26,7 @@ Then add the following to the note
Format the note with the following sections: Format the note with the following sections:
1. **Priorities for this week** - List the three projects I selected with their weekly goal. 1. **Priorities for this week** - List the three projects I selected with their weekly goal.
2. **Key tasks** - List all tasks that are due this week. Order by due date and blocker status. Show the task name, related project, type, and effort level. Provide a link to the task in Notion. 2. **Key tasks** - List all tasks that are due this week. Order by due date and blocker status. Show the task name, related project, type, and effort level. Provide a link to the task in Notion.
3. **Workouts this week** - The table from Step 3b (omit this section entirely if no workouts are scheduled).
## Step 3: Review the week's calendar ## Step 3: Review the week's calendar
Use the Microsoft 365 connector's `outlook_calendar_search` tool to fetch the upcoming week's events: Use the Microsoft 365 connector's `outlook_calendar_search` tool to fetch the upcoming week's events:
@@ -36,6 +37,11 @@ Use the Microsoft 365 connector's `outlook_calendar_search` tool to fetch the up
Use AJ's work day (9 AM–5:30 PM ET) and these events to estimate how much unscheduled time exists across the week — this feeds the reading suggestions below. Use AJ's work day (9 AM–5:30 PM ET) and these events to estimate how much unscheduled time exists across the week — this feeds the reading suggestions below.
## Step 3b: Check the week's Runna workouts
Fetch the Runna ical feed (see CLAUDE.md "Data Sources") with `curl -sL <url>`. For each `VEVENT` whose `DTSTART` falls Monday–Friday of this week, compute the 9 AM block: workout duration (`X-WORKOUT-ESTIMATED-DURATION`, falling back to the high end of the range in `SUMMARY`/`DESCRIPTION`) + a 20-minute shower buffer after, starting at 9:00 AM. Check each block against that day's calendar events from Step 3.
Add a **Workouts this week** section: a table with columns Date, Workout, Block (e.g. 9:00–9:50 AM), and Status (Clear, or "Conflict: <meeting name> <time>"). Skip days with no scheduled workout.
## Step 4: Generate my reading list ## Step 4: Generate my reading list
Using the same search → fetch → filter pattern: `notion-search` the Reading List collection `collection://2c4abd6c-450a-804a-809a-000bc77d02c1` with `page_size: 25`, `max_highlight_length: 0`. Fetch the returned pages in parallel and keep those with `Status` = "To Read" or "In Progress". (Don't fetch `view://` URLs.) Using the same search → fetch → filter pattern: `notion-search` the Reading List collection `collection://2c4abd6c-450a-804a-809a-000bc77d02c1` with `page_size: 25`, `max_highlight_length: 0`. Fetch the returned pages in parallel and keep those with `Status` = "To Read" or "In Progress". (Don't fetch `view://` URLs.)

View File

@@ -80,6 +80,7 @@ When creating or modifying notes:
* `notion-search` is **semantic** (ranked by relevance, not status), so seed `query` with this week's focus-project names plus terms like "blocking due this week" to surface the right open items. Relation fields like `Blocking` aren't text-searchable, so confirm them only after fetching the page. * `notion-search` is **semantic** (ranked by relevance, not status), so seed `query` with this week's focus-project names plus terms like "blocking due this week" to surface the right open items. Relation fields like `Blocking` aren't text-searchable, so confirm them only after fetching the page.
* EFFICIENCY: the weekly focus projects + goals are written into the current Weekly Note every Sunday. In daily/evening planning, read those from the Weekly Note (a local `.md` file) instead of re-scanning the Projects DB. * EFFICIENCY: the weekly focus projects + goals are written into the current Weekly Note every Sunday. In daily/evening planning, read those from the Weekly Note (a local `.md` file) instead of re-scanning the Projects DB.
* CRITICAL: Base ALL suggestions on this real fetched data, never on examples. When planning, prioritize: 1) tasks with `Blocking` populated (priority #1), 2) deadlines this week, 3) tasks tied to `Focus this week` projects, ignoring `Status` = "Done". * CRITICAL: Base ALL suggestions on this real fetched data, never on examples. When planning, prioritize: 1) tasks with `Blocking` populated (priority #1), 2) deadlines this week, 3) tasks tied to `Focus this week` projects, ignoring `Status` = "Done".
* **Runna workouts (ical feed)**: `https://cal.runna.com/ea6ef385d5d2784fa479f622b91e308d.ics` — AJ's scheduled training plan (runs, strength sessions, etc). Fetch with `curl -sL <url>` (raw VCALENDAR/VEVENT text). Each `VEVENT` has `DTSTART`/`DTEND` (all-day, so the date only — Runna doesn't fix a time of day), `SUMMARY` (workout name + distance/duration range), `DESCRIPTION` (pace/session detail), and `X-WORKOUT-ESTIMATED-DURATION` (seconds — use this as the workout length estimate).
## Your job ## Your job
*When AJ asks "help me plan today" or "what should I focus on": *When AJ asks "help me plan today" or "what should I focus on":
@@ -100,4 +101,12 @@ When helping plan the day:
3. Estimate how much unscheduled time exists 3. Estimate how much unscheduled time exists
4. Suggest tasks that fit the available windows 4. Suggest tasks that fit the available windows
5. Warn if Daily Big 3 requires more time than available 5. Warn if Daily Big 3 requires more time than available
- I usually leave to pick up the kids at 5:30 - I usually leave to pick up the kids at 5:30
### Workouts (Runna)
When planning today or this week, check the Runna ical feed (see Data Sources) for a workout on the relevant date:
1. AJ works out at 9:00 AM. Block = 9:00 AM start + `X-WORKOUT-ESTIMATED-DURATION` (fall back to the high end of the duration range in `SUMMARY`/`DESCRIPTION` if missing) + 20 min shower buffer after. E.g. a 40-minute session blocks 9:00–9:40 workout + 9:40–10:00 shower = clear by 10:00 AM.
2. Compare that block against the day's calendar (meetings between 9:00 AM and the block's end time = conflict).
3. If clear: confirm AJ has time for the workout, note when they'll be free (end of shower buffer).
4. If a meeting falls inside the block: flag the conflict specifically (which meeting, what time) so AJ can decide whether to move the workout, shorten it, or skip.
5. No workout scheduled that day: skip this section silently.