process-meetings
Skill509 starsChanged 3 months agoMITView on GitHub
Turn synced meetings into updated person pages, extracted tasks and organized notes. Use when the user says 'process my meetings', 'catch up my notes', or after Granola/Otter syncs. Also use proactively when unprocessed meetings exist. Not for prepping an upcoming meeting; use `meeting-prep`.
- Reads credentials
1 other project uses a version of this.
Adopted by
Most recently taken up by
- geekxx/ai-assistant-starter-kittheir own version, first seen Jul 22, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- geekxx/ai-assistant-starter-kit★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository153 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- .claude/plugins/compound-engineering/CLAUDE.mdCLAUDE.md
- .cursor/rules/search-routing.mdcCursor rule
- anthropic-algorithmic-artSkill
- anthropic-brand-guidelinesSkill
- anthropic-doc-coauthoringSkill
- anthropic-docxSkill
- anthropic-frontend-designSkill
- anthropic-internal-commsSkill
- anthropic-mcp-builderSkill
- anthropic-pptxSkill
- anthropic-slack-gif-creatorSkill
- anthropic-theme-factorySkill
- anthropic-webapp-testingSkill
- anthropic-web-artifacts-builderSkill
- anthropic-xlsxSkill
- atlassian-setupSkill
- backup-nowSkill
- backup-restoreSkill
- backup-setupSkill
- calendar-setupSkill
- commitmentsSkill
- create-mcpSkill
- daily-planSkill
- daily-reviewSkill
- decision-logSkill
- delegate-checkSkill
- dex-backlogSkill
- dex-doctorSkill
- dex-improveSkill
- dex-obsidian-setupSkill
- dex-rollbackSkill
- dex-updateSkill
- dex-whats-newSkill
- diff-profileSkill
- enable-semantic-searchSkill
- getting-startedSkill
- goal-backlogSkill
- google-workspace-setupSkill
- granola-setupSkill
- identity-snapshotSkill
- industry-truthsSkill
- initiative-kickoffSkill
- integrate-mcpSkill
- journalSkill
- manage-capabilitiesSkill
- meeting-closeoutSkill
- meeting-prepSkill
- ms-teams-setupSkill
- pipedrive-setupSkill
- pipeline-syncSkill
- product-briefSkill
- project-healthSkill
- prompt-improverSkill
- relationship-radarSkill
- reviewSkill
- save-insightSkill
- scrapeSkill
- skill-scoreSkill
- The first 60 shown.
The file
Show its rules and text
We split this skill into the rules it gives an agent
42 rules. About 0 are common, 23 are distinctive, and 19 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈23
Distinctive · estimate
This author's own choices. Worth a look.
19
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 11
Run inline in the current conversation by default, so this work can see what the user has already discussed, decided, or settled this …
- Very specific: line 31
Call the Agent tool with subagent_type: "general-purpose", model: "sonnet", that prompt, and a short description.
- Very specific: line 41
Use
AGENT_INSTRUCTIONS.mdverbatim: Read the file and pass its content as the subagent prompt, substituting only the placeholders. - Very specific: line 59
Always fall back: If the subagent fails, times out, or returns nothing usable, say so plainly and run the processing inline from the same …
- Very specific: line 88
Do not re-read every meeting note or the full task list to look for claims the report did not make.
- Distinctive: line 93
If a claim does not hold, say so plainly in the summary you present and treat that meeting as unprocessed.
- Distinctive: line 119
No arguments: Process all unprocessed meetings from the last 7 days
- Very specific: line 128
Read meeting_sources in System/user-profile.yaml before assuming a recorder.
- Distinctive: line 133
Never widen into an external service just because the profile names it.
- Very specific: line 178
If user runs --setup:
- Distinctive: line 185
Read the processed meetings state when it exists:
- Very specific: line 190
Search the valid configured folder first, then 00-Inbox/Meetings/.
- Distinctive: line 214
Check if person/company pages need updating
- Distinctive: line 215
Check if tasks need extracting (look for unchecked items in "For Me" section)
- Distinctive: line 232
Never copy join URLs, dial-ins, access codes, location, notes, descriptions, conferencing fields, or any other invite payload.
- Very specific: line 237
If 00-Inbox/Meetings/queue/*.json files exist, consume each queued meeting before continuing:
- Very specific: line 240
Read the complete JSON: id, title, createdAt, participants, attendees, company, notes, and transcript.
- Very specific: line 242
Check whether a meeting note with that JSON object's id as its granola_id already exists.
- Distinctive: line 251
Delete the queue JSON only after its note has been written successfully.
- Distinctive: line 265
If participant email domain matches user's domain → Internal
- Very specific: line 269
If lookup returns ambiguous: true, do not create a page.
- Distinctive: line 270
If a match exists, update that existing page.
- Distinctive: line 308
Add new meeting link under "## Recent Interactions"
- Distinctive: line 309
Keep max 20 entries (remove oldest if needed)
- Distinctive: line 310
Update "Last Interaction" in frontmatter
- Very specific: line 311
If the meeting created a dated follow-up the user owes, set i_owe_date.
- Distinctive: line 351
Add any new contacts to "Key Contacts"
- Distinctive: line 352
Add meeting to "Meeting History"
- Distinctive: line 358
If available, enhance meeting processing with meaning-based intelligence:
- Distinctive: line 392
Add implicit commitments to the action items list with a note: "*(detected — not explicitly stated)*"
- Distinctive: line 393
Add project links to meeting frontmatter
- Distinctive: line 395
If QMD unavailable, skip silently — regex extraction still works
- Very specific: line 404
Read pillar from meeting frontmatter, then resolve it to the unique pillar ID in System/pillars.yaml by matching either id or display name
- Distinctive: line 448
If entity resolution or stamping is unresolved, surface the exact failed line and leave the meeting unmarked for reconciliation.
- Distinctive: line 456
Only after every action item is verified, add this comment to the meeting note:
- Very specific: line 461
Also stamp meetings with nothing to extract: If a meeting note has no action items (or you just added AI analysis to a basic note and found …
- Distinctive: line 469
After finishing edits to each processed meeting note, run this once for every processed note:
- Very specific: line 474
Use node .scripts/auto-link-people.cjs --dry-run "<note-file>" to preview what would be linked without changing the file.
- Very specific: line 478
Run node .scripts/meeting-intel/verify-entities.cjs and show its one-line summary.
- Very specific: line 479
If ENTITY_SUGGESTIONS_FILE contains suggested people, list them and ask: "Want me to create these pages?
- Very specific: line 483
Never: set the suggestion to suppressed.
- Very specific: line 566
Call track_event with event_name meeting_processed and properties:
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
<!-- Generated from `.claude/skills/process-meetings/SKILL.md` by `scripts/generate-agents-skills.py`. Do not edit. -->Execution mode
Run inline in the current conversation by default, so this work can see what the user has already discussed, decided, or settled this session. Do not fork merely because this skill was selected. Only run in the background when the user explicitly asks for a background run or the host has already obtained a specific background-work approval for this run.
Delegated gathering (large-vault scaling)
This skill stays inline as described above: it keeps session awareness, it asks the user the questions, and it owns every interactive step. What it does NOT do inline is the bulk read-gathering, which on a mature vault (hundreds of notes, thousands of indexed messages, a live calendar and multiple integrations) can be large enough to exhaust the main conversation before the useful work starts.
So the gathering-and-processing phase is delegated to one general-purpose
subagent via the Agent tool, using the self-contained prompt in this skill's
AGENT_INSTRUCTIONS.md:
- Read
.agents/skills/process-meetings/AGENT_INSTRUCTIONS.md. - Substitute its placeholders (
{{ARGS}}, the arguments passed to this skill). - Call the Agent tool with
subagent_type: "general-purpose",model: "sonnet", that prompt, and a short description. The brief is mechanical processing with its own verification steps, so it runs on the fast tier; anything that needs a judgement call comes back to this conversation. - Display its summary report.
The subagent inherits MCP connections, runs in its own context, and that context is freed when it completes, so only its findings reach this conversation.
Use AGENT_INSTRUCTIONS.md verbatim. Read the file and pass its content as
the subagent prompt, substituting only the placeholders. Do NOT hand-write a
replacement brief from what you already know about the meetings: that is how
steps get silently dropped, and the omission looks complete because nothing
errors. If context from this conversation is worth adding, APPEND it to the
file's content; never substitute for it.
Two caveats that are load-bearing:
- Do not count on this skill's hook for the subagent's writes. The
PostToolUse hook
post-meeting-person-update.cjsis declared in this SKILL.md's frontmatter, so it belongs to this skill's run and must not be assumed to cover a subagent's writes.AGENT_INSTRUCTIONS.mdtherefore has the subagent update person pages itself. Do not remove that instruction believing the hook covers it. It is also safe if the hook does run for those writes: both write the same "Recent Interactions" line format, and both skip a person page that already references the meeting, so the entry cannot be added twice. - Always fall back. If the subagent fails, times out, or returns nothing
usable, say so plainly and run the processing inline from the same
AGENT_INSTRUCTIONS.md. A missing subagent must never mean a missing result.
Stays inline: the background-sync status check when it needs setup guidance
(--setup), the Granola pre-flight message when no API key is connected,
confirming each detected soft commitment before any task is created, resolving
ambiguous person matches and entity suggestions, and presenting the final
summary report.
Check the report for unstamped meetings. The subagent leaves a meeting
without its tasks-extracted marker whenever a task failed to create or stamp,
and reports the exact failing line. Surface those lines rather than burying
them: an unstamped meeting is the safe state, but it stays flagged as waiting
until someone resolves it.
The report is a claim, not evidence — check it before repeating it. This
subagent writes to the vault, and its summary states counts the user will act
on. Its report ends with a Touched block naming every task ID it created,
every note it stamped, and every page it created. Verify exactly those items,
and nothing wider:
- Each listed task ID: confirm it appears in
03-Tasks/Tasks.mdwith one targeted search per ID (grep, orlist_tasksfiltered to that ID). Do not read the whole task file. - Each listed stamped note: confirm the
tasks-extractedmarker is actually in that one file. - Each listed created page: confirm the file exists.
Do not re-read every meeting note or the full task list to look for claims the
report did not make; the full sweep was what made this step slow, and it never
found anything the Touched block did not name. If the report has no Touched
block, treat every count in it as unverified and say so.
If a claim does not hold, say so plainly in the summary you present and treat that meeting as unprocessed. Never pass an unverified count to the user as fact, and never repeat "processing complete" on the strength of the report alone.
Process Meetings
Process meetings that have been synced from Granola by the background automation. Updates person pages, extracts tasks, and organizes meeting notes.
Background Execution
This skill supports background execution. When invoked:
- Acknowledge: "Processing [N] meetings in the background. I'll let you know when done."
- Process all meetings
- On completion, provide summary: "[N] meetings processed. [X] person pages updated. [Y] action items created."
How It Works
Meetings are synced automatically every 30 minutes by a background process. This command reads those synced files and:
- Creates/updates person and company pages
- Extracts action items to 03-Tasks/Tasks.md
- Links everything together
No terminal commands are shown - the heavy lifting happens in the background.
Arguments
- No arguments: Process all unprocessed meetings from the last 7 days
today: Only process today's meetings"search term": Find meetings by title/attendee--people-only: Only update person/company pages (skip tasks)--no-todos: Create notes but don't extract tasks--setup: Install/check background automation
Pre-flight: Local Source Check
Read meeting_sources in System/user-profile.yaml before assuming a recorder.
The configured primary is provenance, not permission or tool access. A valid
vault-relative notes_folder outranks the default landing zone. Missing or
malformed config, an invalid primary, an absolute path, .., the vault root, or
a symlink escape must be reported and ignored; continue with safe local notes.
Never widen into an external service just because the profile names it.
For primary: granola, Granola sync uses the official public API. If
GRANOLA_API_KEY is absent, offer /granola-setup and continue with local
notes. Other primaries do not inherit a direct reader from this setting.
Process
Step 1: Check Source and Sync Status
Resolve meeting_sources.notes_folder using the rules above: only a valid
vault-relative folder is accepted; missing or malformed config, an absolute
path, .., the vault root, or a symlink escape falls back safely. The configured
primary does not grant access to an external service. Then check whether
Granola background sync has left its optional state file:
# Check for state file (indicates sync has run). The runtime copy survives
# an update; older installs may still have the shipped-folder copy.
ls System/.dex/processed-meetings.json \
|| ls .scripts/meeting-intel/processed-meetings.jsonIf the state file exists: Granola background sync has run. Continue to Step 2.
If it does not exist and Granola is the configured source: offer setup, but
continue with local notes. The missing file is not a gate for an
exported-folder, Zoom, Teams, manual note, or provider-neutral local source.
For Granola setup guidance:
"Background meeting sync isn't set up yet. This runs automatically every 30 minutes so
/process-meetingsdoesn't need terminal commands.To set up (one-time, takes 30 seconds):
cd .scripts/meeting-intel && ./install-automation.shOr run
/process-meetings --setupand I'll do it for you.Requirements:
- A Granola Business plan, with your Granola API key connected via
/granola-setup- An LLM API key in the vault-root
.env(GEMINI_API_KEY, ANTHROPIC_API_KEY, or OPENAI_API_KEY) — keep that file owner-only (chmod 600 .env)"
If user runs --setup:
cd .scripts/meeting-intel && ./install-automation.shStep 2: Find Waiting Meetings
Read the processed meetings state when it exists:
const state = JSON.parse(fs.readFileSync('System/.dex/processed-meetings.json'));Search the valid configured folder first, then 00-Inbox/Meetings/. If neither
contains a candidate, use bounded provider-neutral Markdown discovery in the
vault by date plus title, attendee, or meeting frontmatter. Exclude Dex
internals, dependencies, binaries, and archives outside the requested window;
never treat arbitrary Markdown as a meeting. For the default folder:
find 00-Inbox/Meetings -name "*.md" -mtime -7 | head -50This includes synced notes in day directories and flat *.md notes in the
folder root. A manual note with no capture id is valid; process and stamp it
with the same tasks-extracted marker as any other meeting note. The queue/
subfolder is handled in Step 2.5.
For each meeting file, skip notes containing <!-- dex:skip-processing -->:
- Preserve the actual vault-relative source path. Read
participants,company,date, and any non-empty scalar key ending in_id. Prefer the key matching a stringsource; if that key is absent, report the mismatch and use the note path. Whensourceis absent, use an id only when exactly one non-empty scalar candidate is present.granola_idandwispr_idare examples, not a closed list. Empty or non-scalar values do not count; multiple ids fall back to note-path identity. The path identity is the normalized vault-relative Markdown path, with/separators and the.mdextension retained; never reduce it to a basename - Check if person/company pages need updating
- Check if tasks need extracting (look for unchecked items in "For Me" section)
Report findings:
"Found X waiting meetings from the last 7 days. Y need person page updates, Z have unextracted tasks."
Match capture identity to Calendar
For a synced note with an aware ISO capture_started_at, call
calendar_get_events_with_attendees for that date after applying CLAUDE.md's
Calendar response confidence contract, then call the Work MCP
match_capture_to_calendar tool with the capture title, start time, attendees,
and the Calendar response's events array as calendar_events (not the whole
response object). Use a matched result's identity only (title, normalized
start, attendees); if the safe title differs, carry it into the note. Leave an
unmatched or ambiguous capture unchanged, and continue unchanged when Calendar
is unavailable. The matcher owns the hard five-minute limit, timezone parsing,
tie order, poor-title rule, and ambiguity decision—never redo or stretch them.
Never copy join URLs, dial-ins, access codes, location, notes, descriptions,
conferencing fields, or any other invite payload.
Step 2.5: Consume Queued Meetings (manual mode)
If 00-Inbox/Meetings/queue/*.json files exist, consume each queued meeting
before continuing:
- Read the complete JSON:
id,title,createdAt,participants,attendees,company,notes, andtranscript. - Check whether a meeting note with that JSON object's
idas itsgranola_idalready exists. If it does, delete the queue JSON and continue to the next one. - Otherwise, create the meeting note under
00-Inbox/Meetings/{date}/(with{date}andtimederived fromcreatedAt) in the standard format, including frontmatter fordate,time,type: meeting-note,source: granola,title,participants,attendees,company, andgranola_idfrom the JSONid. Include the queuednotesandtranscriptin the note body. - Delete the queue JSON only after its note has been written successfully.
The new note then flows through the normal processing steps. Never delete a queue file before its meeting note is written.
Step 3: Update Person Pages
For each participant in synced meetings:
- Load user profile for email domain:
Read System/user-profile.yaml → get email_domain - Classify as Internal/External:
- If participant email domain matches user's domain → Internal
- Otherwise → External
- Look up the person with the Work MCP
lookup_persontool.- If lookup returns
ambiguous: true, do not create a page. Surface the possible matches to the user. - If a match exists, update that existing page.
- If lookup returns
- If no match exists, call the Work MCP
create_persontool:- Pass
name,rolewhen known,emailsfrom the meeting'sattendeesblock, andlocationfrom that attendee'slocationfield. - Pass the meeting company and a short source note when available.
- Pass
<!-- What the create_person tool creates (reference only; do not hand-write this template). -->---
type: person
name: "{Name}"
role: null
company: "{company from meeting}"
company_page: null
emails: ["{lowercased email, if available}"]
aliases: []
location: {internal|external}
last_interaction: {meeting date}
i_owe_date: null
waiting_on_date: null
---
# {Name}
## Notes
*Auto-created from meeting on {date}*
## Recent Interactions
<!-- dex:auto:recent-interactions -->
- [{Meeting Title}](00-Inbox/Meetings/{date}/{slug}.md) — {date}
<!-- /dex:auto -->
## Key Context
```
5. **If page exists, add meeting to Recent Interactions:**
- Read existing page
- Add new meeting link under "## Recent Interactions"
- Keep max 20 entries (remove oldest if needed)
- Update "Last Interaction" in frontmatter
- If the meeting created a dated follow-up the user owes, set `i_owe_date`. If it is a date they are waiting on someone else, set `waiting_on_date`. Never write `next_action_date`, and never treat a waiting date as overdue.
6. **If lookup returns `status: quarantined` or a `warning`**, do not skip
silently. Repeat the warning, naming the page, leave that page untouched,
and continue with everyone else.
### Step 4: Update Company Pages
For each unique external company domain:
1. **Check if company page exists:** `05-Areas/Companies/{Company}.md`
2. **If doesn't exist, create it:**
```markdown
---
type: company
name: "{Company Name}"
domains: ["{lowercased domain}"]
website: "{website, if known}"
status: "Prospect"
---
# {Company Name}
## Key Contacts
<!-- dex:auto:key-contacts -->
- [[05-Areas/People/External/{Person}|{Person}]]
<!-- /dex:auto -->
## Meeting History
<!-- dex:auto:meeting-history -->
- [{Meeting Title}](00-Inbox/Meetings/{date}/{slug}.md) — {date}
<!-- /dex:auto -->
## Notes
*Auto-created from meeting on {date}*- If exists, update:
- Add any new contacts to "Key Contacts"
- Add meeting to "Meeting History"
Step 4.5: Semantic Enrichment (if QMD available)
Check if semantic search is available by looking for qmd in PATH.
If available, enhance meeting processing with meaning-based intelligence:
- Detect implicit commitments: For each meeting's discussion notes, search semantically:
Catch soft commitments that regex action-item extraction misses.qmd query "we should circle back on..." --limit 3 qmd query "let me think about..." --limit 3- Examples: "we should probably revisit the pricing model" → implicit action item
- "I need to noodle on the migration approach" → implicit commitment
- "Let's reconnect after the board meeting" → implicit follow-up
- Link meetings to projects: For the meeting topic, search:
againstqmd query "meeting topic/title" --limit 304-Projects/to auto-link the meeting to relevant projects that keyword matching would miss. - Enrich person context: For each new person encountered, search:
Find if they've been mentioned in other meetings/notes, even if they weren't a direct participant.qmd query "person name + company" --limit 3
Deterministic soft-commitment pass (always runs): Independently of QMD
availability, run the detect_soft_commitments Work-MCP tool over each meeting's
discussion notes. Add matches to the action-items list marked
"(soft commitment — confirm before creating)" so Step 5 confirms, creates, and
reads back every task ID. QMD is the semantic complement; NEVER auto-create.
The detector matches English and French phrasing only. If the tool returns
unsupported_locale: true, say that once — do not invent matches for other
languages.
Integration:
- Add implicit commitments to the action items list with a note: "(detected — not explicitly stated)"
- Add project links to meeting frontmatter
- Merge person context into newly-created person pages
- If QMD unavailable, skip silently — regex extraction still works
Step 5: Extract Tasks (unless --no-todos or --people-only)
For each meeting with unextracted tasks:
- Find action items in the "## Action Items > ### For Me" section
- For each unchecked item (
- [ ]):- Extract task description
- Read pillar from meeting frontmatter, then resolve it to the unique pillar
ID in
System/pillars.yamlby matching eitheridor displayname - Preserve the exact source checkbox line text for
stamp_source_line - Let
create_taskgenerate the task ID and stamp it back onto that line
Decide whether the item is a task at all. A tracked task is a promise the user has to keep, not a note that something came up. Create a task only when the item passes at least one of these tests:
- It has a when: a date, day or timeframe ("by Friday", "before the QBR", "next week")
- It has a who: something the user owes a named person or team ("send Sarah the deck", "answer Acme's security questions")
- It is urgent or blocking: flagged urgent, or another decision or meeting waits on it
Items that pass none of these ("think about pricing", "look into the new vendor", "consider a follow-up") stay in the meeting note exactly as they are: no task, no rewording, checkbox kept. List them in the summary under "Left in the note" so the user can promote one with a word. The
tasks-extractedmarker still goes on the note once the tracked items are verified; the note itself remains the record of everything else.Create task using Work MCP:
create_task( title: "Task description", priority: "P2", // default, P1 if "urgent" mentioned pillar: "{resolved pillar ID}", people: ["{participant page paths}"], source: "{meeting path}", stamp_source_line: "{exact source checkbox line text}" )peoplevalues must resolve to existing person page paths. Prefer the paths returned by Step 3'slookup_person/create_personflow; if only a bare participant name is available, pass that name unchanged and letcreate_taskresolve it. Never construct or guess a person page path.Verify every result before marking the meeting extracted:
- Require
success: truefor everycreate_taskcall. - Require either
stamp.stamped: true, orreason: "already_anchored"with the exact source line's existing anchor equal to the returnedtask.task_id. - If entity resolution or stamping is unresolved, surface the exact failed line and leave the meeting unmarked for reconciliation. Do not blindly retry a task that was created but not stamped.
A user can add
<!-- dex:skip-processing -->to any meeting note to permanently exclude it from processing and from the session-start sweep. Skip such notes entirely: do not extract tasks or add a completion stamp.Only after every action item is verified, add this comment to the meeting note:
<!-- tasks-extracted: 2026-02-03T10:30:00Z -->Also stamp meetings with nothing to extract. If a meeting note has no action items (or you just added AI analysis to a basic note and found none), add the same
tasks-extractedcomment once processing is complete. The session-start check treats that marker, or a^task-anchor on every remaining For Me item, as the durable sign the meeting is done.- Require
Step 6: Auto-link People in Processed Notes
After finishing edits to each processed meeting note, run this once for every processed note:
node .scripts/auto-link-people.cjs "<note-file>"Use node .scripts/auto-link-people.cjs --dry-run "<note-file>" to preview what would be linked without changing the file.
Step 7: Verify Entity Coverage
Run node .scripts/meeting-intel/verify-entities.cjs and show its one-line summary.
If ENTITY_SUGGESTIONS_FILE contains suggested people, list them and ask: "Want me to create these pages? (creates via create_person; dismiss or never also fine)"
- Accepted: call
create_person, set the suggestion toaccepted, and set the contact state tocreatedwith its page path. - Dismissed: set the suggestion to
dismissed. - Never: set the suggestion to
suppressed.
Step 8: Summary Report
## Meeting Processing Complete ✅
**Synced meetings found:** X (last 7 days)
**Background sync status:** Running (last sync: 10 min ago)
### Updates Made
**Person pages:**
- Created: 3 new (Alice Chen, Bob Smith, Carol Wang)
- Updated: 5 existing
**Company pages:**
- Created: 1 new (Acme Corp)
- Updated: 2 existing
**Tasks extracted:** 3 items added to 03-Tasks/Tasks.md
**Left in the note (not tracked):** 4 items with no date, owner or urgency —
say "track it" to promote any of them
- Product Review: "Think about the pricing page copy"
- Strategy Call: "Look into the new analytics vendor"
### Recent Meetings
| Date | Meeting | Company | Participants |
|------|---------|---------|--------------|
| Feb 3 | Product Review | Acme | Alice, Bob |
| Feb 2 | Strategy Call | BigCo | Carol |
---
*Background sync runs every 30 min. Check status: `.scripts/meeting-intel/install-automation.sh --status`*Error Handling
For MCP responses, follow CLAUDE.md's feature_status rendering convention before applying these fallbacks.
If no meetings found:
"No meetings synced in the last 7 days. Make sure:
- Your Granola API key is connected (run
/granola-setupif not)- Background sync is set up (run
/process-meetings --setup)- Check logs:
.scripts/logs/meeting-intel.stdout.log"
If background sync isn't running:
"Background sync appears to be stopped. To restart:
cd .scripts/meeting-intel && ./install-automation.sh ```"
Examples
/process-meetings"Found 8 synced meetings. Updating 12 person pages, extracting 5 tasks..."
/process-meetings today"Found 2 meetings from today. Processing..."
/process-meetings --setup"Installing background automation..." [runs install script]
/process-meetings --people-only"Updating person and company pages only (skipping task extraction)..."
Track Usage (Silent)
Call the mark_feature_used tool on the dex-analytics MCP server with process-meetings. This ticks the feature's box in System/usage_log.md, which is what /dex-level-up reads to recommend features that have not been tried. It writes locally and sends nothing, so it runs whether or not analytics is enabled.
Analytics (Silent):
Call track_event with event_name meeting_processed and properties:
meetings_count: number of meetings processedpeople_created: number of new person pages createdtodos_extracted: number of tasks extracted
This only fires if the user has opted into analytics. No action needed if it returns "analytics_disabled".
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

