obsidian-meeting-standup
Process standup meeting notes (Green/Magenta) with automatic JIRA population. **Use when** router delegates standup meeting processing. **AUTOMATICALLY** populates JIRA section if empty (no asking, no exceptions), then handles pre/post-meeting workflows. **CRITICAL:** JIRA auto-population runs first, always, for all standups.
SKILL.md
| Name | obsidian-meeting-standup |
| Description | Process standup meeting notes (Green/Magenta) with automatic JIRA population. **Use when** router delegates standup meeting processing. **AUTOMATICALLY** populates JIRA section if empty (no asking, no exceptions), then handles pre/post-meeting workflows. **CRITICAL:** JIRA auto-population runs first, always, for all standups. |
name: obsidian-meeting-standup description: Process standup meeting notes (Green/Magenta) with automatic JIRA population. Use when user asks to process a standup, "process Green Standup", "process Magenta Standup", or when obsidian-meeting-router delegates standup processing. Automatically populates JIRA section and handles both pre-meeting and post-meeting workflows.
Obsidian Standup Meeting Processor
Populate JIRA sprint items, extract attendees, clean transcripts, and generate summaries for Green and Magenta standup meetings.
Read this section fully before starting. The JIRA auto-population behavior is the most important thing to get right.
JIRA Auto-Population: Always First
The most important rule for standup processing: always populate the JIRA section automatically, without asking.
Here's why: the whole point of the pre-meeting standup workflow is to arrive with the JIRA section already filled in, ready to discuss. If you ask for permission or skip this step, the entire value of the pre-meeting workflow is lost. The user has set this up to be automatic precisely because they don't want to be interrupted with confirmations.
The sequence is always:
- Read the meeting file
- Check if
## JIRAsection is empty - If empty → query and populate sprint issues immediately (no confirmation needed)
- Then continue with the appropriate workflow (pre-meeting or post-meeting)
This applies to every standup, every time, regardless of what else is in the file.
Team Detection
Detect team from filename:
- Green Standup → Green Team (Board ID: 214)
- Magenta Standup → Magenta Team (Board ID: 331)
Processing Modes
Mode Detection (Automatic)
After handling JIRA population, check meeting file state:
Pre-Meeting Mode - Execute if ALL are true:
- JIRA section populated (just did this in Step 3 above)
- No transcript present (## Transcript section empty)
- No Copilot Summary present (## Copilot Summary empty or absent)
- No attendee screenshot (
![[SCR-*.png]]not found) - → Execute pre-meeting workflow
Post-Meeting Mode - Execute if ANY are true:
- Transcript present (## Transcript has content)
- Copilot Summary present (## Copilot Summary has content)
- Attendee screenshot present (
![[SCR-*.png]]found) - → Execute post-meeting workflow
Pre-Meeting Workflow
Execute ALL steps automatically:
1. Populate Expected Attendees (REQUIRED)
Find 3-5 most recent meetings with same team name:
find ~/Documents/Obsidian/HPE/Meetings -name "*Green Standup*.md" -o -name "*Magenta Standup*.md" | sort -r | head -5
Extract unique attendees from those meetings and populate:
## Attendees
### Expected (based on recent meetings)
- [[Last, First|First Last]]
- [[Last, First|First Last]]
2. Populate JIRA Section (Already Done)
This was already completed in Step 3 of the absolute rule above.
Validation:
- ## Attendees populated with expected attendees
- ## JIRA populated with current sprint items
- All links use proper Obsidian format
Post-Meeting Workflow
Execute ALL steps in order:
1. Extract/Update Attendees
If screenshot present (![[SCR-*.png]]):
- Extract attendees from Teams screenshot
- Create missing People profiles with avatars
- Update ## Attendees section with actual participants
- Remove screenshot reference after extraction
If no screenshot:
- Keep expected attendees from pre-meeting (if exists)
- OR search meeting content for names and link to People profiles
2. Ensure JIRA Populated
JIRA section should already be populated from Step 3 of absolute rule. If somehow missing, populate it now (should never happen).
3. Process Transcript (if present and no Copilot Summary)
Check for Copilot Summary first:
- If
## Copilot Summaryhas content → Skip transcript cleanup and summary generation - If no Copilot Summary → Clean transcript and generate summary
Clean transcript:
# Use the transcript cleaning script
python3 ~/.copilot/skills/obsidian-meeting-standup/scripts/clean_transcript_simple.py "meeting-file.md"
Generate summary from transcript:
- Analyze cleaned transcript for key points
- Insert structured summary in ## Notes section
- Include: Decisions, Action Items, Open Questions
4. Add JIRA Item Updates (if JIRA section populated)
CRITICAL: This step runs AFTER meeting content processing (transcript/summary)
Objective: Link meeting discussions to specific JIRA items by adding update comments.
Requirements:
- JIRA section must be populated with items grouped by user
- Meeting content must exist (Copilot Summary, Notes, or Transcript)
Process:
- Extract all JIRA keys from the
## JIRAsection (e.g., GLCP-12345) - Search meeting content for mentions of each JIRA key in:
## Copilot Summarysection## Meeting notessection (if present)## Notessection# Decisionssubsection# Follow-up taskstable
- For each JIRA item with mentions:
- Extract relevant context about that specific JIRA item
- Add indented comment on next line after the JIRA item
- Format:
- **Update (YYYY-MM-DD):** [extracted context] - Use meeting date for timestamp
- Combine related mentions into a single coherent update comment
Format Example:
### [[Last, First|First Last]]
- [ ] [GLCP-12345](https://hpe.atlassian.net/browse/GLCP-12345) 📖 [In Review] - Feature implementation
- **Update (2026-01-30):** Code review completed. Awaiting approval from Alex. Deployment planned for Monday.
- [ ] [GLCP-12346](https://hpe.atlassian.net/browse/GLCP-12346) 🐛 [Assigned] - Bug fix
Extraction Guidelines:
- Focus on actionable updates: status changes, blockers, decisions, timelines
- Include relevant names/approvers mentioned
- Combine multiple mentions into single coherent update
- Prioritize information from Decisions section and Meeting notes
- Skip generic mentions without substantive updates
What NOT to include:
- Vague mentions without context
- Duplicate information already in the JIRA item title
- Unrelated discussion that just mentions the key
5. Validation Checklist
Verify all steps completed:
- ## Attendees updated with actual participants (or expected if pre-meeting)
- ## JIRA populated with sprint items grouped by assignee
- ## Transcript cleaned (if present and no Copilot Summary)
- ## Notes or ## Copilot Summary contains meeting summary
- JIRA items have update comments where mentioned in meeting content
- All People profiles created for new attendees
- All links use Obsidian format:
[[Last, First|First Last]] - All JIRA links include URLs:
[KEY](https://hpe.atlassian.net/browse/KEY)
JIRA Population Implementation
Query Commands (MANDATORY PATTERN)
# For Green Team (board 214):
SPRINT_ID=$(acli jira board list-sprints --id 214 --state active 2>&1 | grep "^│" | grep active | awk '{print $2}')
acli jira workitem search --jql "sprint = $SPRINT_ID AND status != Done AND status != Resolved ORDER BY assignee" 2>&1
# For Magenta Team (board 331):
SPRINT_ID=$(acli jira board list-sprints --id 331 --state active 2>&1 | grep "^│" | grep active | awk '{print $2}')
acli jira workitem search --jql "sprint = $SPRINT_ID AND status != Done AND status != Resolved ORDER BY assignee" 2>&1
CRITICAL: Do NOT use acli jira sprint list-workitems - it's incomplete. Always use acli jira workitem search with full JQL.
Output Format
Group issues by assignee with checkboxes, type icon, and status (not bullets):
## JIRA
### [[Last, First|First Last]]
- [ ] [GLCP-12345](https://hpe.atlassian.net/browse/GLCP-12345) 📖 [Assigned] - Issue title
- [ ] [GLCP-12346](https://hpe.atlassian.net/browse/GLCP-12346) 🐛 [In Review] - Another issue
### [[Last, First|First Last]]
- [ ] [GLCP-12347](https://hpe.atlassian.net/browse/GLCP-12347) ☑️ [In Test] - Their issue
### Unassigned
- [ ] [GLCP-12348](https://hpe.atlassian.net/browse/GLCP-12348) 📖 [New] - Unassigned work
CRITICAL:
- Use
- [ ](checkbox) NOT-(bullet) for each JIRA item - Include emoji icon for TYPE and
[STATUS]from JIRA:[KEY] {icon} [STATUS] - Summary - Type icons (from JIRA Type column):
- Story → 📖
- Bug → 🐛
- Sub-task → ☑️
- Task → 📌
- Epic → 🎯
- Spike → 💡
- Status comes from the Status column (Assigned, In Review, In Test, New, etc.)
Assignee Mapping
- Extract assignee displayName from JIRA (format: "First Last")
- Search People profiles:
~/Documents/Obsidian/HPE/People/ - Find matching profile:
ls -1 *.md | grep -i "Last, First" - Format as:
[[Last, First|First Last]] - Fallback: If no profile found, use plain text
Finding Meeting Files
# Today's standup
find ~/Documents/Obsidian/HPE/Meetings -name "$(date +%Y-%m-%d)*Standup*.md"
# Specific team today
find ~/Documents/Obsidian/HPE/Meetings -name "$(date +%Y-%m-%d)*Green Standup*.md"
find ~/Documents/Obsidian/HPE/Meetings -name "$(date +%Y-%m-%d)*Magenta Standup*.md"
# Specific date
find ~/Documents/Obsidian/HPE/Meetings -name "2026-01-28*Standup*.md"
Common Failure Modes (Avoid These)
These are patterns that break the standup workflow:
- Asking for permission to populate JIRA (just do it)
- Skipping JIRA population because the file looks complete in other ways
- Not detecting standup meetings correctly (check filename, not just content)
- Not checking whether the JIRA section is actually empty
- Stopping halfway through the workflow
The right approach:
- Check the JIRA section first, populate if empty
- Detect pre vs. post-meeting from file state
- Complete all workflow steps without prompting
Example Workflows
Example 1: Empty Standup File (Pre-Meeting)
Input: "Process 2026-01-28 - Green Standup.md"
File state: Empty file, just template
Actions:
- ✅ Read file → Detect Green Standup
- ✅ Check JIRA section → Empty
- ✅ Query Green Team board 214 for sprint issues
- ✅ Populate ## JIRA with grouped issues
- ✅ Detect pre-meeting mode (no transcript/screenshot)
- ✅ Find recent Green Standups
- ✅ Extract expected attendees
- ✅ Populate ## Attendees section
- ✅ Done
Example 2: Standup After Meeting (Post-Meeting)
Input: "Process 2026-01-28 - Magenta Standup.md"
File state: Has transcript and screenshot
Actions:
- ✅ Read file → Detect Magenta Standup
- ✅ Check JIRA section → Empty
- ✅ Query Magenta Team board 331 for sprint issues
- ✅ Populate ## JIRA with grouped issues
- ✅ Detect post-meeting mode (has transcript + screenshot)
- ✅ Extract attendees from screenshot
- ✅ Create missing People profiles
- ✅ Update ## Attendees section
- ✅ Clean ## Transcript section
- ✅ Generate meeting summary
- ✅ Add update comments to JIRA items mentioned in meeting
- ✅ Done
Success Criteria
After processing, verify:
- ## JIRA section is populated (populated automatically, not on request)
- Issues grouped by assignee with Obsidian links
- All JIRA IDs have full URLs
- JIRA items mentioned in meeting have update comments
- ## Attendees populated (expected or actual)
- Transcript cleaned if present
- Summary generated if no Copilot Summary
Additional Resources
- scripts/README.md - Transcript cleaning scripts
- examples.md - Complete standup examples
- reference.md - JIRA query patterns and team mappings