---
name: daily-prep
description: "Fetches today's calendar and produces a per-event context block for each meeting using what the graph already knows about the attendees. Triggers when the owner says 'what's on today', 'morning prep', 'meeting context', 'who am I seeing today', or names an upcoming meeting and asks for a brief on the attendees."
---

# Daily prep

This skill turns today's calendar into a ready-to-read context pack. For each event, it looks up the attendees in the graph and surfaces what the owner already knows about each one. It never invents context; if the graph has no record of a person, it says so out loud.

## When to run

Run when the owner asks for a per-meeting brief for today. The trigger phrases are above. Also run when the `briefing` skill calls into this skill for the calendar section of a daily briefing.

## Inputs

`date` (default: today in the owner's timezone). Optional: a `personName` filter to brief on one named attendee across every meeting.

## Method

1. **Fetch today's events.** Call `schedule-list` with the date filter and the owner's timezone. Sort by start time.
2. **For each event, list the attendees.** Read the event's `attendees` field or the `SCHEDULED_FOR` relationships in the graph. If the event has no attendees recorded, mark it as "solo or unspecified".
3. **For each attendee, look up the graph.** Call `memory-search` with the attendee's name. Take the highest-confidence `:Person` node. From the node and its neighbours, pull:
   - Role and current company (one line).
   - The most recent `:ConversationArchive` (carries `conversationIdentity` and `source`) or live `:Conversation` involving them, with the conversation's last-message timestamp.
   - Open `:Task` nodes that name them.
   - Open commitments the owner made to them (tasks with status `open` and the attendee in `SCHEDULED_FOR`).
4. **Compose one context block per event.** Keep each block to three short sentences: who is attending, what the latest contact was, what is open between the owner and them.
5. **Output a chronological list.** One event per line at the top; the context blocks below, each headed by the event's time and title.

## What "no record yet" means

When `memory-search` returns no `:Person` node for an attendee, say "no record yet" in the context block. Do not infer from training data. Do not guess. The "no record yet" signal is itself useful: it tells the owner this is the first meeting with this person from the graph's perspective, which may mean the contact has not been logged yet, or that the person is new.

## Output format

```
## Today

08:30-09:00: Coffee with Alice Cohen (Acme Corp)
09:30-10:30: Pricing review with the team
14:00-15:00: Call with Daniel Park (newco)

### Coffee with Alice Cohen
CFO at Acme Corp since 2024. Last conversation 11 days ago, where she asked for a referral introduction. One open task: send the intro to Sam Webber.

### Pricing review with the team
Three attendees: Mark Lee, Priya Singh, Jordan Lee. No active commitments between the owner and any of them this week. Standing recurring meeting; last week's notes are in the graph as :Section nodes under the team's :ConversationArchive.

### Call with Daniel Park
No record yet. The event was created from a calendar invite three days ago. The owner may want to add a one-line note on the meeting's purpose before joining.
```

## Failure modes

- **`schedule-list` returns no events.** Say so. Offer to brief on the next-business-day events instead.
- **`memory-search` returns no match for a high-stakes attendee** (e.g. someone whose name is in the event title). Surface the gap explicitly. The owner needs to know the graph has no context for this person.
- **Owner timezone is missing.** Refuse to compose times; ask the owner to set their timezone first via `profile-update`.

## What this skill does not do

It does not draft messages, schedule new events, or take any write action. It is read-only. Drafting a message to one of the attendees is `personal-assistant`'s job, invoked separately.
