---
name: process-fieldnotes
description: Read, summarize, recap, and act on meeting notes captured by the Fieldnotes Mac app (markdown exports in ~/Documents/Fieldnotes/). Use when the user invokes /process-fieldnotes, /fieldnotes-recap, /draft-followup, /fieldnotes-search, or asks any question about their meetings ("what did Marina say about pricing", "summarize this week's meetings", "draft a follow-up for the design review", etc.).
---

# Process Fieldnotes

This skill turns the user's Fieldnotes meeting corpus into a queryable knowledge base. Fieldnotes is a Mac app that records meetings on-device and exports them as speaker-attributed, timestamped markdown. This skill is the "brain" that processes those notes using *the user's* Claude session — no extra subscription required.

## File layout

The user has a directory of meeting notes. The default location is `~/Documents/Fieldnotes/` but the user may have overridden it in the app's Settings.

Each meeting is one `.md` file named:

```
YYYY-MM-DD <Meeting Title>.md
```

Inside, the format is:

```markdown
# <Title>

**Date:** Tuesday, May 12, 2026 at 9:00 AM
**Duration:** 00:48:21
**Participants:** Ryan, Marina, Cody

---

## Transcript

**Ryan** _0:00_
Where do we want to start today...

**Marina** _0:14_
Quick recap of yesterday before we dive in.

...

---

*Recorded with Fieldnotes*
```

After you process a meeting (via `/process-fieldnotes`), write a sidecar at `{original-stem}.summary.md`. Treat the presence of that sidecar as "already processed."

## First-run configuration

If the user has not yet set their notes directory in this skill's environment, your first action on any invocation is:

1. Check `~/Documents/Fieldnotes/` — list it with `Bash`.
2. If it exists and has `.md` files, use it.
3. If it doesn't exist or is empty, ask the user once: "Where do you keep your Fieldnotes exports?" — accept any absolute path, store it (in conversation context for now; the user can persist by adding `FIELDNOTES_DIR=/path` to their shell rc).

## Commands

### `/process-fieldnotes`

Find every meeting note that **does not have a corresponding `.summary.md` sidecar**, and for each:

1. Read the transcript.
2. Produce an opinionated structured summary in this exact format:

```markdown
# Summary: <original title>

**When:** <date + time from header>
**Duration:** <duration from header>
**Who was there:** <participants>

## What we decided
- <decision 1, attributed to who pushed it>
- ...

## Action items
- [ ] **<owner>** — <action> _(by <date if mentioned, else 'unspecified'>)_
- ...

## Open questions
- <question that didn't get resolved in this meeting>
- ...

## Quotes worth keeping
> <strong quote that captures intent or tension, with speaker attribution>

## Loose ends
<freeform paragraph: things that came up tangentially, deferred topics, observations about meeting dynamics if relevant>
```

3. Write that as `{original-stem}.summary.md` next to the original.
4. After processing all unprocessed meetings, print a tally: "Processed N new meetings. Skipped M already-summarized."

**Quality bar:** if your "What we decided" section is just a paraphrase of what people said, you've failed. Decisions are commitments with consequences. Quote the actual moment of decision when possible. If a meeting had no real decisions, say so — don't manufacture them.

### `/fieldnotes-recap <scope>`

Scope can be:
- `today` / `yesterday` / `this week` / `last week` / `this month`
- A date or date range: `2026-05-12` / `2026-05-10..2026-05-12`
- A topic or person: `'product roadmap'` / `'Marina'`

Behavior:

1. Resolve the scope to a set of meetings (date-filter on filename, or grep across the corpus for topic/person).
2. Read each meeting's `.summary.md` if present; fall back to reading the transcript if not.
3. Produce a synthesis in this format:

```markdown
# Recap: <scope>

**Meetings:** <count> across <date range>

## Thread: <recurring theme 1>
<2-4 sentences synthesizing across meetings, with file references>

## Thread: <recurring theme 2>
...

## What's now decided
- <decisions that solidified across these meetings>

## What's still open
- <questions that recurred but didn't resolve>

## Action items still outstanding
- [ ] **<owner>** — <action> _(originally <meeting>, <date>)_
```

**Quality bar:** themes should emerge from the text, not be top-down imposed. If you can't find threads, say so honestly: "These N meetings don't share a clear theme — they covered <topic A>, <topic B>, ..."

### `/draft-followup <meeting>`

Meeting argument can be a fuzzy match: filename stem, title substring, "yesterday's design review", etc.

1. Resolve to the single matching meeting (if ambiguous, ask which one).
2. Read the transcript + summary.
3. Look for a voice profile at `~/.claude/skills/process-fieldnotes/voice.md` or `<notes-dir>/.voice.md`. If present, use it. If not, ask the user once if they want to provide voice notes; otherwise default to a neutral professional tone.
4. Draft a follow-up email in this structure:

```
Subject: <meeting title> — followup

Hi <recipients>,

<2-3 sentence recap of the meeting's purpose and outcome>

To make sure we're aligned, the actions on the table are:
- <action> — <owner>
- ...

Open questions I'd like to settle before we move forward:
- <question>
- ...

<closing sentence appropriate to the relationship>

— <user's name>
```

5. Output the draft as a markdown code block the user can copy. Don't send it; we don't have email integration.

**Quality bar:** never invent actions or attendees that aren't in the transcript. If voice profile says "keep it casual" and the transcript shows a vendor pitch meeting, prioritize professional over casual — voice profiles are guidance, not gospel.

### `/fieldnotes-search <query>`

1. ripgrep across the notes directory for the query (case-insensitive, regex-friendly).
2. Return matches grouped by meeting, with surrounding context (1-2 lines), speaker, and timestamp where available.
3. Format:

```markdown
## <meeting filename>
> **<speaker>** _<timestamp>_ ... <match in context> ...
```

4. After matches, offer one follow-up: "Want me to recap across these N meetings?" — if yes, run `/fieldnotes-recap` against the set.

**Quality bar:** don't truncate aggressively. The user is searching because they want to see what was actually said. Show real quoted text, not paraphrase.

## Implementation notes for the agent

- Use `Bash` (`rg`, `ls`, `cat`) for filesystem and search operations. Don't try to read the whole corpus into context unless the user asks for something cross-cutting.
- When reading transcripts, prefer reading the `.summary.md` if it exists — it's cheaper context. Fall back to the raw transcript only when you need quote-level detail.
- Action items should always have an owner, even if "unspecified" — never silently drop ownership.
- If a meeting's transcript is empty or shorter than ~50 words, skip it during `/process-fieldnotes` with a one-line "skipped: <reason>" in the tally.
- Never modify the original transcript files. Sidecars only.
- This skill operates entirely on the user's local filesystem. There is no network call required.

## Example invocations

```
> /process-fieldnotes
Processed 4 new meetings. Skipped 12 already-summarized.

> /fieldnotes-recap this week
# Recap: this week
**Meetings:** 7 across May 8 – May 14
## Thread: Reskin direction
The team aligned on Field Notes National Parks as the visual target across Mon (kickoff) and Wed (Phase A review). ...

> /draft-followup design review
Subject: Design Review — followup
Hi Marina, Cody,
Thanks for walking through the typography pass today. ...

> /fieldnotes-search "shipping date"
## 2026-05-12 Product Sync.md
> **Marina** _12:34_ ... we should commit to a shipping date by end of week ...
## 2026-05-09 Roadmap Review.md
> **Ryan** _8:21_ ... the shipping date for v1 is still aspirational ...
```
