---
name: process-meeting-notes
display_name: Process Meeting Notes
description: "Process raw meeting notes from today's prep files into structured outcomes. Use when someone says 'process meeting notes', 'clean up my notes', 'process my notes', 'meeting follow-up', or 'process notes for [customer]'. Companion to the daily-meeting-prep skill."
icon: "📝"
trigger: process meeting notes
inputs:
  - name: target
    description: "Which files to process — 'all' (scan all prep files for the given date), a specific customer name, or a specific filename in CurrentActivities/"
    type: string
    required: false
    default: all
  - name: date
    description: "Which day's prep files to process — accepts 'today', 'yesterday', 'last week', 'this morning', a weekday name like 'Thursday', or a literal date like '2026-04-25'. Resolved to YYYY-MM-DD for filename matching."
    type: string
    required: false
    default: today
tools: [file_read, file_write, file_edit, file_read_pdf, file_read_image, run_python, run_javascript, open_in_session_tab, open_file, fdfind, ripgrep, folder_list, file_copy, file_move, file_delete]
depends-on: [outlook_builtin, slack_builtin, user_mcp__awsentral, quick_suite__phone_tool]
---

## Overview

Post-meeting companion to the daily-meeting-prep skill. Scans prep files in the **CurrentActivities folder** (`/Users/joratm/Downloads/Kiro Projects/joratmDaily/CurrentActivities/`) for raw notes below the `## My Notes` section, checks calendar status (cancelled/occurred), gathers Slack context from customer channels, merges in Amazon Meetings Summary emails when available, and transforms everything into structured Meeting Outcomes. Updates the prep file in place, saves a trimmed copy to the customer's locally synced SharePoint folder, and offers to apply SFDC updates and draft SIFT entries. Designed to run without clarifying questions — processes what it finds and reports what it did.

**Portability**: This skill auto-detects available paths and falls back gracefully. If the primary output directory, customerinfo.md, or SharePoint local sync folders are unavailable, the skill still processes notes — it just keeps files in place rather than copying to SharePoint.

## Trigger Routing

| Trigger Phrase | Action |
|---------------|--------|
| "process meeting notes" | Process all prep files for today |
| "clean up my notes" | Same as above |
| "process my notes" | Same as above |
| "meeting follow-up" | Same as above |
| "process notes for [customer]" | Process only that customer's prep files for today |
| "process yesterday's notes" / "process Thursday's notes" | Process files for specified date |
| "process notes for all" | Process all customers, all dates found |

## Configuration

| Setting | Value | Fallback |
|---------|-------|----------|
| **Prep Files Directory** | `/Users/joratm/Downloads/Kiro Projects/joratmDaily/CurrentActivities/` | If path doesn't exist → `artifacts/daily_prep/` (auto-created) |
| **Neo Files Directory** | `/Users/joratm/Downloads/Kiro Projects/joratmDaily/CurrentActivities-Neo/` | If path doesn't exist → skip Neo cleanup (Step 14) entirely |
| **File Naming (v2)** | `{YYYY-MM-DD}_{HHMM}_{Customer}-{Topic}.md` | Same convention regardless of directory |
| **File Naming (v1)** | `{Customer}_{topic}_{YYYY-MM-DD}.md` | Same convention regardless of directory |

**Path resolution logic** (applied at start of Step 1):
1. Check if the primary Prep Files Directory exists on disk
2. If yes → use it (files persist across sessions, companion to daily-meeting-prep output)
3. If no → check `artifacts/daily_prep/` in the session workspace
4. If neither exists → report "No prep files directory found" and stop
5. For Neo: check if Neo directory exists. If not, skip Step 14 silently.

Prep files are read from the resolved directory. After processing, files that were successfully saved to SharePoint are cleaned up from that same directory.

## API Throttle Rules

Apply these limits for ALL connector calls throughout the workflow:
- **Outlook**: Max 3 concurrent calls, 1-second pause between batches. If throttled (MailboxConcurrency), retry after 2 seconds.
- **Slack**: Max 3 concurrent searches. Respect rate limit headers.
- **AWSentral**: Max 2 concurrent calls, 1-second delay between.

Do not repeat these rules in individual steps — they apply globally.

## Workflow

### Step 0: Identity Detection
- **Mode**: `deterministic`
- **Input**: None
- **Output**: User identity (name, alias)

1. Call `phone_tool__Me` → get the user's alias
2. Call `phone_tool__GetEmployeeDetailByAlias` → get full name
3. Greet: "Hey [First Name], let me process your meeting notes."

**Fallback:** If Phone Tool is unavailable, proceed without greeting. The skill functions without identity.

### Step 1: Find Prep Files
- **Mode**: `agentic`
- **Input**: `{{target}}` and `{{date}}`
- **Output**: List of prep files to evaluate
- **Validate**: At least one file found
- **On failure**: Report that no prep files were found matching the target and date

**Path resolution**: Before scanning, resolve the active directory using the Configuration fallback logic. If the primary path (`/Users/joratm/Downloads/Kiro Projects/joratmDaily/CurrentActivities/`) doesn't exist, use `artifacts/daily_prep/`. If neither exists, report an error and stop.

**Date resolution** — always resolve backward (notes are about the past) unless the input is explicitly forward-looking:
- `"today"` / `"this morning"` → current date
- `"yesterday"` → previous day
- A weekday name like `"Thursday"` → most recent past Thursday (or today if it is Thursday)
- `"last week"` → Monday through Friday of previous week (process all matching files in that range)
- A literal date like `"2026-04-25"` → use as-is (even if future — user may be pre-creating)
- `"tomorrow"` / `"next Tuesday"` → resolve to future date (user knows what they're doing)

Scan the **resolved prep directory** (primary or fallback — see Configuration) for markdown files matching either naming convention:
- **v2 (current)**: `{YYYY-MM-DD}_{HHMM}_{Customer}-{Topic}.md` — date prefix, time, customer-topic. Glob: `{resolved_date}_*.md`
- **v1 (legacy)**: `{Customer}_{topic}_{YYYY-MM-DD}.md` — customer first, date suffix. Glob: `*_{resolved_date}.md`

Use both glob patterns and deduplicate results (a file can only match one pattern). If `{{target}}` is a specific customer or filename, filter further. If `{{target}}` is `"all"`, include all matching files.

**Parsing filenames**:
- v2 format: split on `_` — segment 1 = date (YYYY-MM-DD), segment 2 = time (HHMM), segment 3+ = Customer-Topic (split by `-` for customer vs topic)
- v1 format: split on `_` — first segment = Customer, last segment (before .md) = date, middle segments = topic

### Step 2: Check Calendar Status
- **Mode**: `agentic`
- **Tool**: Outlook calendar tools
- **Input**: Meeting name and date from each prep file header
- **Output**: Meeting status — occurred, cancelled, or no-show
- **Validate**: Calendar event found for each prep file
- **On failure**: If calendar lookup fails (connector error), log the error and proceed assuming the meeting occurred. Do not stop the workflow.

For each prep file, look up the matching calendar event by title and date.

- **Cancelled** (`isCancelled: true`): Update the prep file — replace `## My Notes` with `## Meeting Cancelled` and a brief note: "This meeting was cancelled on {date}." Skip all further processing for this file. If a SharePoint meeting log exists for this customer+topic, append a cancellation entry.
- **Occurred** (not cancelled): Continue to Step 3.
- **Calendar event not found**: Treat as occurred (the meeting might have been ad-hoc or the invite was deleted).

### Step 3: Detect Raw Notes
- **Mode**: `agentic`
- **Tool**: `file_read`
- **Input**: Each non-cancelled prep file from Step 2
- **Output**: List of files with their raw note content (including image references)
- **Validate**: Content detection complete for all files
- **On failure**: Report read errors and skip affected files

For each file, read the **full content** from the `## My Notes` line to the end of the file.

- If there is **ANY text** below the HTML comment placeholder (`<!-- ... -->`) — even a single line, an image reference like `![alt](image.png)`, or shorthand fragments — the file **has raw notes**. Process it.
- If the section is empty (only the placeholder and whitespace), the file **might still be processable** — proceed to Steps 4-5 to check for email summary and Slack context.
- If the section is empty AND no email summary AND no Slack context is found, this is a **no-show candidate** — handle in Step 7.

**Image inventory**: While reading, collect all image references (`![...](...)`) and embedded file paths. These must be preserved in the final Meeting Outcomes output (Step 6).

Do NOT use grep line-count heuristics. Read the actual content and make a judgment call.

### Step 4: Search for Meeting Summary Email
- **Mode**: `agentic`
- **Tool**: `email_search`, `email_read`
- **Input**: Meeting name and date from the prep file header
- **Output**: Extracted summary content (discussion points, action items, decisions, attendees)
- **Validate**: Email found and content extracted
- **On failure**: If neither search finds a summary, proceed with other sources.

Search email for "Amazon Meetings Summary" or "Meeting summary:" matching the meeting name and date. These are auto-generated Zoom meeting summaries sent after calls. **Always search both the default mailbox AND the `deleteditems` folder simultaneously** (not as fallback) — the user frequently deletes meeting summary emails immediately after reading, so `deleteditems` is often the ONLY location.

If found, read the full email with `email_read` and extract:
- Key discussion points not already captured in the raw notes
- Action items with owners and deadlines
- Decisions made
- Attendee or context details that add value

Merge these into the raw notes before cleanup. The email summary fills gaps — if the user's raw notes are sparse, the email summary becomes the primary source. If the raw notes are detailed, the email summary supplements with anything missed.

**Connector errors**: If the first Outlook call fails (timeout, auth error, throttle), log the error and note "Email summary unavailable" in the processing log. Do not stop the workflow — proceed with raw notes and Slack context.

### Step 5: Search Slack for Meeting Context
- **Mode**: `agentic`
- **Tool**: `search_messages`, `conversations_history`
- **Input**: Customer name, meeting topic, meeting date, customer Slack channel
- **Output**: Relevant Slack messages from around the meeting time
- **Validate**: Search completed (even if no results found)
- **On failure**: Log the error and proceed without Slack context. Do not stop the workflow.

Internal conversation often continues in Slack before and after a customer call. Search for context that supplements the raw notes.

**Find the customer's Slack channel**: Use the customer lookup strategy (see "Customer Lookup" section below) to find the primary Slack channel. If not found, search by customer name.

**Search strategy** (in order):
1. `search_messages(query="{customer name} {meeting topic}")` — broad match
2. If a customer channel is identified, pull `conversations_history` for that channel filtered to the meeting date (±1 day) — catches pre-meeting prep discussion and post-meeting follow-up
3. `search_messages(query="{key attendee names}")` — catches DM-style updates like "just got off the call with {customer}"

**What to extract**:
- Pre-meeting context: "heads up, they're going to ask about X"
- Post-meeting follow-up: "just talked to {customer}, they confirmed Y"
- Action items discussed in Slack but not in notes
- Decisions or escalations relayed via Slack

**Merge with raw notes**: Slack context supplements — it doesn't replace. Flag Slack-sourced items with attribution (e.g., "Per Slack: ...") so the user knows what came from where.

**Connector errors**: If the first Slack call fails, log the error and note "Slack context unavailable." Continue processing.

### Step 6: Update Prep File In Place
- **Mode**: `deterministic`
- **Tool**: `file_edit`
- **Input**: Merged content from raw notes + email summary + Slack context
- **Output**: Prep file updated with structured Meeting Outcomes section
- **Validate**: The `## Meeting Outcomes` section exists with populated subsections
- **On failure**: Report which subsections couldn't be populated

Replace everything from `## My Notes` downward (including the raw notes and placeholder comment) with a clean `## Meeting Outcomes` section.

**Template selection** — use content richness to choose the template:

**Full template** (use when 2+ sources have content, or raw notes are detailed):

<!-- FULL TEMPLATE (paste into prep file) -->
```markdown
## Meeting Outcomes

### Discussion Summary
Narrative form, concise. What was discussed and why it matters. Not bullet soup.

### Attendees Present
Who actually showed up (from the prep file attendees list, adjusted based on notes/meeting summary).

### Decisions Made
Anything agreed upon or confirmed during the meeting.

### Action Items
| Owner | Action | Due Date |
|-------|--------|----------|
| Name  | What   | When     |

### Open Questions
Anything unresolved or needing follow-up.

### SFDC Updates Needed
Flag any opps that need stage changes, next step updates, or new opps to create. Be specific.

### Embedded Media
_Preserved image references and screenshots from the original notes._
```

**Lightweight template** (use when notes are thin — a few lines from one source only, e.g., a quick 15-min sync):

<!-- LIGHTWEIGHT TEMPLATE (paste into prep file) -->
```markdown
## Meeting Outcomes

### Discussion Summary
What was discussed — brief narrative.

### Action Items & Follow-ups
| Owner | Action | Due Date |
|-------|--------|----------|
| Name  | What   | When     |

Combined open questions, SFDC updates, and follow-ups in one section.

### Embedded Media
_Preserved image references and screenshots from the original notes._
```

**Template rules**:
- **Only include subsections that have actual content.** If no decisions were made, omit `### Decisions Made` entirely — don't write "None."
- **Only include `### Embedded Media`** if images were found in Step 3. Preserve all `![alt](path)` references exactly as they appeared — these are user-pasted screenshots, whiteboard photos, etc. that must carry over into the structured output.
- If the raw notes reference images, verify the image files exist in the CurrentActivities folder or the workspace. If a referenced image is missing, keep the markdown reference but add a note: `_(image file not found)_`.

Keep ALL original prep content above `## My Notes` intact (pipeline, SIFTs, email threads, account snapshot, etc.).

---

### Step 7: Handle No-Show Meetings
- **Mode**: `agentic`
- **Input**: Files from Step 3 that had no raw notes AND no email summary (Step 4) AND no Slack context (Step 5)
- **Output**: No-show annotation in prep file and SharePoint
- **Validate**: Files annotated correctly
- **On failure**: Skip annotation and note in summary

For files where the meeting was NOT cancelled (Step 2) but zero evidence of it occurring was found (no notes, no email summary, no Slack mentions):

1. Update the prep file: replace `## My Notes` with:
   ```markdown
   ## Meeting Status: Did Not Occur
   No meeting notes, email summary, or Slack context found for this meeting.
   If the meeting did take place, add notes and re-run "process meeting notes".
   ```

2. When saving the SharePoint copy (Step 8), include this status so there's a record.

This catches meetings that were effectively no-shows without being formally cancelled.

### Step 8: Save SharePoint Copy
- **Mode**: `agentic`
- **Tool**: `file_read`, `file_copy`, `file_write`, `file_edit`
- **Input**: Processed meeting outcomes + customer identification
- **Output**: Trimmed copy saved to the customer's meeting notes folder
- **Validate**: File written successfully
- **On failure**: Report the error and continue to next file. Do not fail the entire workflow.

**Pre-check**: Before attempting the SharePoint copy, verify the target path exists on disk. If the SharePoint folder path (from customerinfo.md or KG) does not exist (e.g., user doesn't have OneDrive sync for this customer), skip the copy for this customer. Note in the summary: 'SharePoint path not found for {customer} — file remains in {resolved_dir}.' Do NOT error or ask the user.

**Customer lookup**: Read `/Users/joratm/Downloads/Kiro Projects/joratmDaily/Reference/customerinfo.md`. Find the customer's section by matching the customer name from the prep file filename. Extract the **SharePoint Folder** path listed in that section. This path already points directly to the correct `Meetings/` or `Meeting Notes/` subfolder — no further folder discovery is needed.

**If customer not found in customerinfo.md**: Skip the SharePoint save for that file, note it in the summary. Do not fail.

**File naming**: `{Customer}_{MeetingTopic}_{YYYY-MM-DD}.md` — **always use this v1 format for SharePoint copies**, regardless of which format the source prep file used. This ensures the daily-meeting-prep skill's Step 3i can find and read meeting history correctly.

**Customer/topic extraction from source filename**:
- If source is v2 format (`2026-05-04_1230_NuSkin-DGDQ-Walkthrough.md`): date = first segment, skip time, Customer = first part of third segment (before first `-`), Topic = rest of third segment. → SharePoint copy: `NuSkin_DGDQ-Walkthrough_2026-05-04.md`
- If source is v1 format (`NuSkin_dg-dq-walkthru_2026-05-04.md`): already in the right format for SharePoint copy

**Before creating**: Check the target folder for an existing file with the same `{Customer}_{MeetingTopic}` prefix (ignoring the date). This catches recurring meetings.

- **Match found**: Open the existing file, insert the new entry at the top (above previous entries), separated by `---`. Creates a reverse-chronological running log.
- **No match**: Create a new file.

**The SharePoint copy should include:**
- Meeting name, date, time
- Meeting status (occurred / cancelled / did not occur)
- Attendees present
- Topics discussed (what actually came up)
- Full Meeting Outcomes section (summary, decisions, action items, open questions, SFDC updates)
- Preserved image references

**The SharePoint copy should NOT include:**
- Pipeline tables
- Account snapshot / spend data
- SIFT entries
- Email thread summaries
- Slack highlights
- The original recommended talking points

### Step 9: Offer SFDC Updates
- **Mode**: `agentic`
- **Tool**: AWSentral tools
- **Input**: SFDC Updates Needed from each processed file's Meeting Outcomes
- **Output**: User-approved SFDC changes applied, or skipped
- **Validate**: User responded to the offer
- **On failure**: Note which updates couldn't be applied and why

After all files are processed, collect all `### SFDC Updates Needed` content across files. If any updates were flagged, present them to the user:

> "I found these SFDC updates from today's meetings:
> - **{Customer A}**: Update {opp name} next step to "{new next step}" (was: "{old}")
> - **{Customer B}**: Create new opp for {workstream} — {details}
> - **{Customer C}**: Log meeting activity on {account}
>
> Want me to apply these?"

Use a decision card with:
- "Apply all" — execute all updates
- "Let me pick" — present each update individually
- "Skip" — don't apply any

**Applying updates**: Use `awsentral__update_opportunity` for opp changes, `awsentral__create_event` or `awsentral__log_activity` for activity logging.

If no SFDC updates were flagged across any file, skip this step silently.

### Step 10: Offer SIFT Suggestions
- **Mode**: `agentic`
- **Input**: Meeting Outcomes from all processed files
- **Output**: Draft SIFT entries offered to user
- **Validate**: User responded to the offer
- **On failure**: Skip gracefully

After processing, review all Meeting Outcomes for SIFT-worthy material:
- **Highlights (🟢)**: Customer wins, positive signals, successful adoption
- **Risks (🔴)**: Churn signals, competitive threats, escalations
- **Challenges (🟡)**: Blockers, delays, resource constraints
- **Observations (🔵)**: Strategic shifts, org changes, new stakeholders

If any potential SIFTs are identified, offer:

> "Based on today's meetings, I see {N} potential SIFT entries:
> - 🟢 **{Customer}**: {one-line summary}
> - 🔴 **{Customer}**: {one-line summary}
>
> Want me to draft these? (You can also run the full SIFT skill later with 'SIFT suggestions for {customer}'.)"

Use a decision card:
- "Draft them" — write full SIFT drafts in a markdown file and open for review
- "Skip for now" — move on

If no SIFT-worthy material found, skip silently.

### Step 11: Open Updated Files
- **Mode**: `deterministic`
- **Tool**: `open_in_session_tab`
- **Input**: Updated prep file(s)
- **Output**: Files opened for review
- **Validate**: Files render correctly

Open each updated prep file in a session tab so the user can review the Meeting Outcomes.

### Step 12: Summarize
- **Mode**: `deterministic`
- **Input**: Processing results from all files
- **Output**: Actionable summary message

Present a consolidated mini-dashboard across all processed meetings:

**Per-file report:**
- Which files were processed (with clickable `qw-file://` links)
- Which customers
- Status: processed / cancelled / no-show / skipped (and why)
- Whether SharePoint copies were saved (and where)

**Cross-meeting action item dashboard:**
```
## Today's Action Items ({total count})

### Your Actions ({count})
| Customer | Action | Due Date | Priority |
|----------|--------|----------|----------|
| {name}   | {what} | {when}   | 🔴/🟡/🟢 |

### Others' Actions ({count})
| Customer | Owner | Action | Due Date |
|----------|-------|--------|----------|
| {name}   | {who} | {what} | {when}   |

**Top Priority**: {highest-urgency item with context}
**This Week**: {count} items due by Friday
```

Prioritize actions by due date (overdue > today > this week > later), then by severity (customer commitment > internal follow-up).

**Pending offers** (if not already handled): Remind about SFDC updates and SIFT suggestions if the user hasn't responded yet.

Do not ask clarifying questions in the summary. Just report what happened and surface what matters.

### Step 13: Clean Up CurrentActivities Files
- **Mode**: `deterministic`
- **Tool**: `file_delete`
- **Input**: List of successfully processed files from Steps 6-8
- **Output**: Processed prep files deleted from CurrentActivities/
- **Validate**: Files deleted successfully
- **On failure**: Report which files couldn't be deleted and why. Do not fail the workflow.

Only clean up files from the resolved prep directory if ALL of the following are true: (a) The file was successfully processed (Step 6 completed), (b) If a SharePoint save was attempted, it succeeded (Step 8 confirmed). If SharePoint save was skipped (no path available), keep the file in the prep directory — do NOT delete it. It's better to leave a processed file in place than to lose it.

This keeps the prep folder clean — it's a staging area, not a permanent archive. The permanent copy lives in the customer's SharePoint folder.

**Process**:
1. For each file that was successfully processed (has `## Meeting Outcomes`) AND successfully copied to SharePoint:
   - Delete the file from `/Users/joratm/Downloads/Kiro Projects/joratmDaily/CurrentActivities/`
2. For files that were NOT copied to SharePoint (customer not found, SharePoint path missing, or write failed):
   - Do NOT delete — leave them in CurrentActivities/ for manual handling
3. Report: "{N} prep files moved to SharePoint and removed from CurrentActivities. {M} files remain (no SharePoint destination)."

**Safety**: Only delete files that have been confirmed written to SharePoint. If the SharePoint copy failed or was skipped, the file stays in CurrentActivities/ as the only copy.

---

### Step 14: Clean Up Neo Files
- **Mode**: `deterministic`
- **Tool**: `file_delete`
- **Input**: Date from Step 1 (resolved YYYY-MM-DD)
- **Output**: Neo files for the processed date deleted
- **Validate**: Files deleted successfully or folder empty
- **On failure**: Report which files couldn't be deleted and why. Do not fail the workflow.

**Pre-check**: If the Neo directory (`/Users/joratm/Downloads/Kiro Projects/joratmDaily/CurrentActivities-Neo/`) does not exist on disk, skip this step entirely. Log: 'No Neo directory found — skipping cleanup.'

If present, clean up the **CurrentActivities-Neo/** folder by deleting files that match the processed date.

**Target folder**: `/Users/joratm/Downloads/Kiro Projects/joratmDaily/CurrentActivities-Neo/`

**Process**:
1. Scan the Neo folder for markdown files matching the resolved date: glob `{resolved_date}_*.md`
2. Delete each matching file using `file_delete`
3. Report how many Neo files were removed

**Why**: The Neo files are reference-only prep documents generated by a separate tool. Once the daily-meeting-prep skill has generated its own richer prep files (in CurrentActivities/) and those files have been processed with Meeting Outcomes, the Neo files are redundant and clutter the folder.

**Safety**: Only delete files matching the exact date that was processed in this run. Never delete files for other dates.

## Customer Lookup

Consistent with the daily-meeting-prep skill, use a 2-tier lookup for resolving customer metadata:

1. **Reference file (PRIMARY)**: Read `/Users/joratm/Downloads/Kiro Projects/joratmDaily/Reference/customerinfo.md` directly. This file contains all customer metadata: SFDC Account IDs, OneTeam members, email folder IDs, Slack channel IDs, and **SharePoint local paths**. Look up the customer by name (section header match). This is the authoritative source for SharePoint folder paths.
2. **Knowledge Graph (SUPPLEMENTAL)**: `kg_search(query="{customer name}", category="Organization", compact=False, include_edges=True)` — use for additional context not in customerinfo.md (e.g., recent activity, relationships, notes).

**Do NOT use AWSentral for customer lookups** — customerinfo.md already has everything needed.

**customerinfo.md location**: `/Users/joratm/Downloads/Kiro Projects/joratmDaily/Reference/customerinfo.md`

Cache resolved metadata for the duration of the run — don't re-lookup the same customer across multiple files.

**Portability fallback**: If `customerinfo.md` is not found via `fdfind` across allowed folders, skip the customerinfo tier entirely. Use KG-only lookup (`kg_search(query="{customer name}", category="Organization", include_edges=True)`). If KG has no sharepoint_local_path in its properties, the SharePoint copy step (Step 8) will be skipped for this customer. Log: 'No customer reference file found — using KG-only lookup. SharePoint save will be skipped if no local path is available.'

## Output

Updated prep files in the **CurrentActivities folder** with `## Meeting Outcomes` replacing `## My Notes`. Trimmed copies in the customer's SharePoint meeting notes folder as a running meeting log. Optional SFDC updates applied. Optional SIFT draft entries.

## Lessons Learned

### Do
- Search Slack for pre/post-meeting context in the customer's channel — internal follow-up often happens there
- Merge email summaries and Slack context with raw notes rather than replacing one with the other
- Check for existing files with the same `{Customer}_{MeetingTopic}` prefix before creating a new SharePoint copy — recurring meetings should append to the same file
- Use the adaptive template — full for substantive meetings, lightweight for quick syncs
- Only include subsections that have actual content — no empty sections with "None"
- Use the 2-tier customer lookup (customerinfo.md → KG) consistent with the meeting prep skill

- **Handle both v1 and v2 prep file naming formats** — the daily-meeting-prep skill transitioned from `Customer_topic_date.md` (v1) to `date_time_Customer-Topic.md` (v2). Always scan for both patterns. SharePoint copies always use v1 format for cross-skill compatibility.

### Don't
- Don't pre-check connectors on startup — handle errors lazily at point of use
- Don't use grep line-count heuristics to detect notes — read the actual content
- Don't ask clarifying questions unless you truly can't identify the customer — just do your best
- Don't include pipeline/SIFT/spend data in the SharePoint copy — that's internal prep context
- Don't stop processing if one file has no notes — check for email summary and Slack first, then mark as no-show or skip
- Don't overwrite the original prep content above `## My Notes` — only replace that section downward
- Don't drop image references during the notes-to-outcomes transformation
- Don't auto-create SharePoint folders — ask the user where to save if no `meetings` folder exists

### Common Failures
- **No email summary found**: Search inbox and `deleteditems` simultaneously. If neither works, check Slack. If no Slack either and no raw notes, mark as no-show.
- **Slack connector error**: Log the error and proceed without Slack context. Don't fail the workflow.
- **SharePoint folder not in allowed folders**: Skip the SharePoint save, note it in the summary.
- **SharePoint `meetings` subfolder not found**: Ask the user where to save. Remember their answer.
- **Customer identification**: Derive from the filename (format: `{Customer}_{Topic}_{Date}.md`). Fallback: 2-tier lookup (customerinfo.md → KG). If truly ambiguous, ask.
- **Image files missing**: Keep the markdown reference but note `_(image file not found)_`.

### When to Ask the User
- If a customer's SharePoint folder exists but has no `meetings` subfolder — ask where to save
- If you truly cannot identify which customer a prep file belongs to
- Before applying SFDC updates (always ask — never auto-apply)
- Before drafting SIFT entries (always offer — never auto-generate)