| name | project-activity |
| description | Generate weekly project activity summaries from Slack and JIRA |
| argument-hint | [days] |
| auto-approve | true |
Project Activity Agent
Generate a weekly summary of projects focused on what shipped, demos, risks, and upcoming milestones. Pulls from both Slack channels and JIRA issue comments. Organized by activity level for quick scanning.
Overview
This agent helps you:
- Parse all projects from
local/projects.md with metadata
- Extract key project status from Slack channels AND JIRA comments
- Generate executive summary for each project
- Organize by activity level (High/Medium/Low/None)
- Generate a scan-able report in 2-3 minutes
Prerequisites
local/projects.md file with project structure
- Configured Dash MCP for Slack access
- Atlassian Rovo MCP for JIRA issue access; local JIRA client only as a fallback
Usage Pattern
Step 1: Parse Projects from local/projects.md
Read local/projects.md to extract all projects with their metadata.
For each project section (marked by ### heading), extract:
- Project Name: The heading text (e.g., "Domain Restriction (Basic Gating)")
- Team: Team name and manager (e.g., "Team Formation (Dan)")
- JIRA Team Project: Project key (e.g., "TFM")
- JIRA Roadmap Initiative: All DBX-XXXX issue keys with their URLs
- Slack Channel: Channel name and URL (if exists)
- C1 Category: Which C1.X section it's under (e.g., "C1.1 - Team Formation")
Create a structured list of all projects with their metadata to process.
Step 2: Calculate Date Range
Calculate the start date for the time period.
- Default: 7 days (if no argument provided)
- Custom: Use
$ARGUMENTS if provided (e.g., 14 for 14 days)
DAYS=${ARGUMENTS:-7}
START_DATE=$(date -v-${DAYS}d '+%Y-%m-%d')
END_DATE=$(date '+%Y-%m-%d')
Step 3: Process All Projects
For each project, fetch data from both Slack (if channel exists) and JIRA, then extract structured summary.
3.1 Fetch Slack Messages (if channel exists)
If the project has a Slack channel, use the /slack skill approach with slack_search_messages:
dash_invoke_search_action(
action_id="slack_search_messages",
params={
"query": "after:YYYY-MM-DD in:#channel-name",
"max_results": 100,
"sort": "timestamp",
"sort_direction": "desc"
}
)
Handle pagination: Check for next_cursor in response. Fetch additional pages if needed (up to ~100 messages total per channel).
3.2 Fetch JIRA Issue Data
For each JIRA Roadmap Initiative (DBX-XXXX):
A. Fetch child Epics:
Use Atlassian Rovo MCP JQL search first, for example parent = DBX-XXXX. Scope by project or issue type when useful.
This returns all child issues (Epics, Stories, etc.). Filter for:
- Issue type = "Epic"
- Extract: key, summary, status
Track the list of child Epic keys for this Roadmap Initiative.
B. Fetch Roadmap Initiative comments:
Use Rovo search/fetch for the roadmap initiative. Fetch by returned Atlassian resource ID when available.
Extract:
- Issue status field (for overall status)
- Comments from the time period (filter by
created field >= START_DATE)
- For each comment: author, timestamp, body
C. Fetch Epic comments (for each child Epic):
For each child Epic found in step A, use Rovo search/fetch to retrieve the Epic details and comments. Fall back to python3 -m sidekick.clients.jira query-by-parent ... or python3 -m sidekick.clients.jira get-issue ... only when Rovo is unavailable or lacks the needed comment/detail fields.
Extract:
- Epic status
- Comments from the time period
Status extraction priority:
When determining project status, prioritize in this order:
- Recent comments (most current, includes context and blockers)
- Status field (official status, but may lag reality)
- Epic statuses (aggregate view of work progress)
Look in comments for:
- Status updates ("moved to X", "now in Y phase")
- Blockers and risks mentioned
- Milestone updates
- Team decisions and changes
Handle errors: If issue fetch fails (404, auth error), note it and continue to next issue.
3.3 Extract Structured Summary
For each project, immediately extract and save (combining Slack + JIRA data):
Executive Summary:
Generate a one-sentence summary of the project status based on:
- Recent activity level
- What shipped or key milestones
- Any major blockers
- Overall momentum (progressing, stalled, at risk)
Example: "Project is progressing well with experiment rollout complete; waiting on design approval for next phase."
Activity Level:
Count total Slack messages + JIRA comments in time period:
- High: 20+ items
- Medium: 5-19 items
- Low: 1-4 items
- None: 0 items
Project Metadata:
Include from local/projects.md:
- Team and manager
- JIRA Team Project
- JIRA Roadmap Initiative links
- C1 Category
What Shipped:
Search Slack messages AND JIRA comments for keywords (case-insensitive):
- "shipped", "deployed", "released", "launched", "live", "merged", "in production", "completed"
Extract 1-3 bullet points of what was shipped
Demos:
Search for keywords:
- "demo", "presentation", "recorded", "showcase", "demoed"
Extract mentions of demos (scheduled or completed)
Risks:
Search for keywords:
- "blocker", "blocked", "risk", "issue", "concern", "problem", "stuck", "waiting on", "dependency"
Extract 1-3 key risks or blockers
Next Milestone:
Search for keywords and patterns:
- "milestone", "M1", "M2", "M3", etc., "deadline", "target", "due"
- Date patterns: "Apr 28", "2026-04-28", "end of month", "next week"
Extract milestone name/number and target date if found
Sample Activity:
Save 3-5 representative items (Slack messages OR JIRA comments) with:
- Source (Slack or JIRA issue key)
- Timestamp (YYYY-MM-DD HH:MM format)
- Author/sender username
- Brief excerpt (first 80 characters)
- Link to message/comment
3.4 Error Handling
If a Slack channel or JIRA issue fails to fetch:
- Log the error with project name, source (Slack/JIRA), and error type
- Continue to next source - DO NOT stop processing
- Track failures in a list by error category:
- 404 Not Found: Channel/issue archived, renamed, or doesn't exist
- 429 Rate Limit: Too many API calls (wait 30 sec, retry once)
- 403 Forbidden: Auth error or no access
- Other: Any other error type
- Partial data is OK: If Slack works but JIRA fails (or vice versa), use what's available
3.5 Context Management
IMPORTANT: To preserve context window:
- Extract summary immediately after fetching each project's data (Slack + JIRA)
- Write to intermediate file
$TMP_DIR/project_summaries.md (append mode). Create $TMP_DIR with mktemp -d "${TMPDIR:-/tmp}/project-activity.XXXXXX" and clean it up with a trap.
- Discard full message/comment content - only keep the structured summary
- Process projects sequentially (one at a time)
- For JIRA: Only fetch issue summary and recent comments, not full issue details
Step 4: Generate Final Report
After processing all channels, generate consolidated report.
4.1 Organize by Activity Level and C1 Category
Group projects into sections:
- High Activity Projects (20+ items from Slack + JIRA)
- Medium Activity Projects (5-19 items)
- Low Activity Projects (1-4 items)
- No Activity (0 items)
- Errors (failed to fetch both Slack and JIRA)
Within each activity level, optionally group by C1 category (C1.1, C1.2, etc.).
4.2 Format Report
Create report with this structure:
# Project Activity Report
**Generated:** [END_DATE]
**Period:** [START_DATE] to [END_DATE] ([DAYS] days)
**Projects Processed:** [success_count] successful, [failure_count] failed
---
## High Activity Projects (20+ items)
### Project Name
**Executive Summary:** [One-sentence summary of status, momentum, and key issues]
**Metadata:**
- **C1 Category:** C1.X - [Category Name]
- **Team:** [Team Name] ([Manager])
- **JIRA Project:** [KEY]
- **Roadmap Initiatives:** [DBX-1234](link), [DBX-5678](link)
- **Slack Channel:** [#channel-name](link)
**Activity:** [count] items ([X] Slack messages, [Y] JIRA comments)
**What Shipped:**
- [Item 1]
- [Item 2]
- [Or "None mentioned" if nothing found]
**Demos:**
- [Item 1]
- [Or "None mentioned" if nothing found]
**Risks:**
- [Item 1]
- [Item 2]
- [Or "None mentioned" if nothing found]
**Next Milestone:**
- **[Milestone name]: [Description]** - Target: [Date]
- [Or "Not specified in recent activity" if not found]
**Sample Activity:**
- [Slack] [2026-04-20 14:30] @user: [Brief excerpt] [link]
- [DBX-1234] [2026-04-19 09:15] @user: [Brief excerpt] [link]
- [Slack] [2026-04-18 16:20] @user: [Brief excerpt] [link]
---
[Repeat for each High Activity channel]
## Medium Activity Projects (5-19 messages)
[Same format as above]
## Low Activity Projects (1-4 messages)
[Same format as above]
## No Activity (0 items)
### Project Name 1
**Team:** [Team Name] ([Manager])
**C1 Category:** C1.X - [Category Name]
No Slack or JIRA activity in the last [DAYS] days.
### Project Name 2
**Team:** [Team Name] ([Manager])
**C1 Category:** C1.X - [Category Name]
No Slack or JIRA activity in the last [DAYS] days.
---
## Errors
### Project Name
**Team:** [Team Name] ([Manager])
**Slack Error:** [404 Not Found / Rate Limit / N/A]
**JIRA Error:** [403 Forbidden / N/A]
**Reason:** [Brief explanation]
Step 5: Save and Report Output
-
Write final report to memory/project-activity-YYYY-MM-DD.md where YYYY-MM-DD is the end date
End the report with exactly:
This report generated using [chase-sidekick](https://github.com/chase-seibert/chase-sidekick) and the [project-activity skill](https://github.com/chase-seibert/chase-sidekick/tree/main/.agents/skills/project-activity).
-
Print processing summary:
Project Activity Report Generated
Processed: [success_count] projects successfully
Failed: [failure_count] projects (partial data may be available)
Time Period: [START_DATE] to [END_DATE] ([DAYS] days)
Activity Breakdown:
- High activity (20+ items): [count] projects
- Medium activity (5-19 items): [count] projects
- Low activity (1-4 items): [count] projects
- No activity (0 items): [count] projects
Data Sources:
- Slack messages: [total_count] across [channel_count] channels
- JIRA comments: [total_count] across [issue_count] issues
-
Output relative path to the memory file:
echo "Report saved to: memory/project-activity-${END_DATE}.md"
-
Clean up intermediate files:
rm -rf "$TMP_DIR"
Step 6: Update local/projects.md with JIRA Status
After generating the report, update local/projects.md with the latest JIRA status for each project.
6.1 Collect JIRA Status and Epic Data
For each project processed in Step 3, collect:
A. Roadmap Initiative status:
Track from Step 3.2:
- Issue key (e.g., DBX-1234)
- Status from recent comments (primary) or status field (fallback)
- Most recent status-related comment (if any)
B. Child Epics:
Track from Step 3.2A:
- Epic key (e.g., TEXP-123)
- Epic summary/title
- Epic status
6.2 Add Status and Child Epics to projects.md
For each project section in local/projects.md, update or add these lines:
Status Line (after JIRA Roadmap Initiative):
- **JIRA Roadmap Initiative:** [DBX-1234](link), [DBX-5678](link)
- **Status:** DBX-1234: In Progress (per comment 4/15: "moving to implementation phase"), DBX-5678: Done
Format:
- For each initiative:
[Issue-Key]: [Status]
- If recent comment has status info, include brief excerpt:
[Status] (per comment [date]: "[excerpt]")
- Multiple initiatives: comma-separated
Child Epics Line (after Status):
- **Status:** DBX-1234: In Progress
- **Child Epics:** [TEXP-123: Enable everyone group](link) (In Progress), [TEXP-456: Permissions API](link) (Done)
Format:
- For each Epic:
[KEY: Summary](jira-link) ([Status])
- Link format:
https://dropbox.atlassian.net/browse/EPIC-KEY
- Multiple Epics: comma-separated
- If no child Epics: Skip this line or show "None"
Handling edge cases:
- No initiatives: Skip Status and Child Epics lines
- No child Epics but has initiatives: Add Status line, skip Child Epics line
- Error fetching data: Keep existing lines or show "Unknown"
6.3 Update the File
Use the Edit tool to update local/projects.md:
For each project section:
- Find the project section by its
### heading
- Locate the JIRA Roadmap Initiative line (starts with
- **JIRA Roadmap Initiative:**)
- Check for existing Status and Child Epics lines (immediately after Roadmap Initiative)
If Status line exists:
- Update with new status information from Step 6.1
If Status line doesn't exist but project has initiatives:
- Add new Status line after Roadmap Initiative line
- Preserve indentation (should be at same level as other metadata bullets)
If Child Epics line exists:
- Update with new Epic list from Step 6.1
If Child Epics line doesn't exist but project has Epics:
- Add new Child Epics line after Status line
- Preserve indentation
Example transformation:
Before:
### Domain Restriction (Basic Gating)
- **Team:** Team Formation (Dan)
- **JIRA Team Project:** TFM
- **JIRA Roadmap Initiative:** [DBX-4526](link), [DBX-2957](link)
- **Slack Channel:** [#channel](link)
After:
### Domain Restriction (Basic Gating)
- **Team:** Team Formation (Dan)
- **JIRA Team Project:** TFM
- **JIRA Roadmap Initiative:** [DBX-4526](link), [DBX-2957](link)
- **Status:** DBX-4526: In Progress, DBX-2957: Done
- **Child Epics:** [TFM-123: Email notifications](link) (In Progress), [TFM-456: Admin UI](link) (Done)
- **Slack Channel:** [#channel](link)
Important:
- Only update Status and Child Epics lines, don't modify other content
- Preserve exact formatting and spacing (indentation, bullet style)
- If a project has no JIRA initiatives, skip it
- Make one Edit call per project section (more efficient than many small edits)
6.4 Identify Done Projects
After updating statuses, scan local/projects.md for projects where ALL roadmap initiatives are "Done":
- Find Done projects: Projects where every JIRA issue has status "Done" or "Closed"
- Count Done projects: Track how many projects are fully complete
- Prepare list: Create a list of project names that are Done
6.5 Offer to Prune Done Projects
Print to the user:
✓ Updated local/projects.md with latest JIRA statuses
Found [count] project(s) with all initiatives Done:
- [Project Name 1] (C1.X)
- [Project Name 2] (C1.X)
Would you like to archive these completed projects?
Options:
1. Remove from projects.md (clean file)
2. Move to archive section at bottom of file
3. Keep as-is (no changes)
Wait for user input - DO NOT automatically delete or move projects.
If user chooses option 1 (Remove):
- Use Edit tool to remove the entire project section (from
### heading to next ### or section boundary)
- Echo confirmation: "Removed [count] completed projects from local/projects.md"
If user chooses option 2 (Archive):
- Create "## Archived Projects" section at bottom of file if doesn't exist
- Move project sections to archive (preserve all metadata including Status)
- Echo confirmation: "Moved [count] completed projects to archive section"
If user chooses option 3 or doesn't respond:
- Do nothing, projects stay in place
- Echo: "Keeping completed projects in place"
Category Extraction Guidelines
Executive Summary
Synthesize a one-sentence status update covering:
- Current state: What phase/milestone the project is in
- Key achievement or blocker: Most important recent development
- Momentum: Is it progressing, stalled, at risk, or waiting on something
Prioritize JIRA comments for status:
- Recent comments often contain the most accurate status information
- Look for phrases like "moving to X phase", "now unblocked", "waiting on Y team"
- Comments provide context that status fields lack
- Epic statuses show granular progress (e.g., "2 of 5 Epics complete")
Information sources (in priority order):
- JIRA comments (most current, has context)
- Slack messages (real-time discussions, informal updates)
- JIRA status field (official but may lag)
- Epic statuses (aggregate work view)
Examples:
- "Experiment launched and ramped to 90% with positive early results; next phase focused on holdout analysis."
- "Design review blocked on cross-team dependency; M2 milestone at risk of slipping by 2 weeks."
- "No visible activity this period; project may be paused or transitioning."
- "Per JIRA comment 4/18, project moved to implementation phase with 3 of 5 Epics in progress."
What Shipped
Look in both Slack messages and JIRA comments for past-tense or completion language:
- "deployed to production"
- "shipped feature X"
- "released version Y"
- "merged PR"
- "launched experiment"
- "went live"
- "completed"
Focus on: Concrete deliverables that shipped in the time period
Demos
Look for scheduled or completed presentations:
- "demo scheduled for Friday"
- "demoed to leadership"
- "recorded demo"
- "presentation shared"
- "showcase at all-hands"
Focus on: Any demos that happened or are scheduled soon
Risks
Look for blocking or concerning language:
- "blocked by X"
- "waiting on Team Y"
- "risk of missing deadline"
- "dependency on Z"
- "approval needed"
- "concern about X"
- JIRA comments about blockers or issues
Focus on: Actionable blockers or risks that need attention
Next Milestone
Look for forward-looking milestone language:
- "M2 target: April 28"
- "next milestone is X"
- "deadline for Y is Z"
- "launching by end of month"
- "beta testing in May"
- JIRA issue status transitions (e.g., moving to "In Progress")
Focus on: The immediate next milestone with target date
Error Handling Strategy
For Slack channel errors:
- 404 Not Found: Channel renamed or archived → Note in Errors, continue
- 429 Rate Limit: Wait 30 seconds, retry once → If fails, note in Errors, continue
- 403 Forbidden: Auth issue or no access → Note in Errors, continue
- No channel: Some projects don't have Slack channels → This is normal, skip Slack data
For JIRA issue errors:
- 404 Not Found: Issue doesn't exist or deleted → Note in Errors, continue
- 403 Forbidden: No access to issue → Note in Errors, continue
- Invalid issue key: Parse error from projects.md → Note in Errors, continue
- No roadmap initiative: Some projects don't have JIRA issues yet → This is normal, skip JIRA data
Partial data handling:
- If Slack works but JIRA fails → Use Slack data only, note JIRA error
- If JIRA works but Slack fails → Use JIRA data only, note Slack error
- If both fail → Report in Errors section with both error details
NEVER stop processing all projects due to a single project failure.
Tips
- Parsing projects.md: Look for
### headings for project names, extract metadata from bullets below
- Multiple JIRA issues: A project may have multiple roadmap initiatives - fetch all of them
- Child Epics: Use
query-by-parent to find Epics under each Roadmap Initiative; these show granular work breakdown
- Comment-based status: Recent JIRA comments often have better status info than the status field itself
- Status extraction: Look in comments for "moving to X", "now in Y phase", "unblocked" - more accurate than field
- Epic aggregation: If 3 of 5 child Epics are Done, mention this in executive summary - shows concrete progress
- Date Extraction: Look for various date formats in Slack and JIRA (ISO, natural language, relative)
- Keyword Matching: Use case-insensitive matching for category keywords
- Context Matters: "blocking" might be resolved - look for current vs. past tense
- JIRA Comments: Only fetch comments from the time period, ignore older ones
- Thread Context: Important Slack discussions often in threads, but API may not return thread context
- Sample Activity Selection: Pick items that represent different topics/days/sources (mix Slack + JIRA)
- Milestone Dates: Extract dates even if approximate ("end of month", "next week")
- Empty Categories: It's normal and expected to have "None mentioned" for some categories
- Activity Level: Combine Slack + JIRA count - high activity projects need more attention
- Executive Summary: Should be scan-able - user should understand status in one sentence
- Metadata Accuracy: Link to actual JIRA issues and Slack channels from projects.md
- File updates: When updating projects.md, preserve exact formatting - only modify Status and Child Epics lines
- Batch edits: Update one project section at a time with Edit tool for clarity and error recovery
Output Location
- Final report:
memory/project-activity-YYYY-MM-DD.md
- Intermediate file:
$TMP_DIR/project_summaries.md (deleted after completion)
Related Agents
- weekly-report: Comprehensive weekly summary (1:1s + meetings + all Slack)
- kudos: Extract accomplishments from notes and channels
Performance Notes
- Expected time: ~7-10 minutes for ~15-20 projects (depending on JIRA issue count and Epic count)
- Context window: Stays manageable with immediate extraction and discard pattern
- API calls per project:
- Slack: ~1-3 calls (search + pagination)
- JIRA Roadmap Initiatives: ~1-2 calls per initiative (get-issue + query-by-parent)
- JIRA Epics: ~1 call per Epic (get-issue for comments)
- Total JIRA calls: Can be 5-15+ per project if multiple initiatives and many Epics
- Rate limiting: Should be rare, but handled with retry logic for both Slack and JIRA
- Parsing:
local/projects.md is parsed once at the beginning
- File updates: Step 6 updates projects.md with ~1 Edit call per project section
- Optimization: Immediate extraction and discard pattern keeps context manageable despite many API calls