Generate 3P (Progress, Plans, Problems) updates for customer engagements. Use when the user mentions 3P, programme update, status update, progress report, or asks 'what's happening with CustomerName'. Trigger for /3p-update with or without a customer name.
Generate concise, data-driven Progress / Plans / Problems updates by synthesizing data from Asana (SE actions), Jira (engineering status), and Slack (customer signals). Supports per-customer and cross-customer portfolio modes.
Refer to .claude/rules/asana.md for Asana conventions and .claude/rules/atlassian.md for Jira/FE-UPDATE conventions.
ASANA_TOKEN in ~/.fe-skills/.env (run /asana-setup if not configured)ATLASSIAN_EMAIL and ATLASSIAN_TOKEN in ~/.fe-skills/.env (run /atlassian-setup if not configured)SLACK_TOKEN and SLACK_COOKIE in ~/.fe-skills/.env (run /slack-setup if not configured)templates/customers.yamlNot all sources are required. The skill produces output from whatever sources are available and notes gaps.
| Mode | Trigger | Output |
|---|---|---|
| Per-customer | /3p-update GResearch | Single customer 3P with detailed citations |
| Cross-customer (portfolio) | /3p-update (no name) | All customers summary with cross-cutting themes |
| Flag | Effect |
|---|---|
--confluence | Also publish the 3P as a Confluence page |
--confluence flagRead templates/customers.yaml to resolve customer data.
name (case-insensitive)action_tracker_id is not "PLACEHOLDER"If per-customer mode and the customer is not found in the registry, tell the user and stop.
For each customer in scope, gather data from all available sources. Skip sources that are not configured (PLACEHOLDER GIDs/IDs) and note the gap in the output.
uv run --project .claude/skills/asana python .claude/skills/asana/scripts/query.py tasks \
--project-gid <action_tracker_id> --limit 100 --pretty
Process the response:
completed_at within range): feed into Progressdue_on, not completed): feed into Problemsmodified_at > 7 days ago): feed into ProblemsIf action_tracker_id is "PLACEHOLDER": skip Asana, note "Asana not configured" in output.
uv run --project .claude/skills/jira python .claude/skills/jira/scripts/issues.py list \
--customer "<jira_customer>" --max-results 50 --with-comments
Process the response:
Note: FE-UPDATE comments from SEs do NOT count as engineering activity (prevents gaming staleness).
For each channel in the customer's slack_channels where id is not "PLACEHOLDER":
uv run --project .claude/skills/slack python .claude/skills/slack/scripts/channels.py history \
--channel <channel_id> --limit 50 --oldest <7_days_ago_unix_timestamp>
Process the response:
If no Slack channels are configured (all IDs are PLACEHOLDER): skip Slack, note "Slack channels not configured" in output.
Read all gathered data and produce the 3P output.
Tone guidance:
[emoji] [CustomerName] -- [date]
**Progress**
[1-3 sentences: what happened this week. Cite Jira issues resolved, Asana tasks completed, positive Slack signals.]
**Plans**
[1-3 sentences: what's coming next. Cite Asana tasks in To Do/In Progress with upcoming due dates.]
**Problems**
[1-3 sentences: what's blocked or at risk. Cite overdue Asana tasks, stale Jira issues, negative Slack signals. If nothing: "No blockers identified."]
Emoji selection:
[clipboard emoji] SE Portfolio Update -- [date]
[For each customer with data:]
**[CustomerName]**
- Progress: [1 sentence]
- Plans: [1 sentence]
- Problems: [1 sentence or "None"]
[End with:]
**Cross-cutting**
- [Any themes across customers: common blockers, shared wins, resource constraints]
Default: Print the 3P text to the user as Slack-ready output (copy-paste into Slack).
If --confluence flag is set:
Convert the 3P text to simple HTML (paragraphs, bold, links) and create a Confluence page:
uv run --project .claude/skills/confluence python .claude/skills/confluence/scripts/pages.py create \
--space "~PERSONAL_SPACE" --title "3P Update -- [CustomerName] -- [date]" \
--body "<html-content>"
Print both the text output and the Confluence page URL.
Show the 3P update text. Include a brief footer noting:
--confluence was used, include the page link/customer-snapshot).| Problem | Fix |
|---|---|
| No Asana data | Check action_tracker_id in templates/customers.yaml, run /asana-setup |
| No Jira data | Check jira_customer name spelling in templates/customers.yaml |
| No Slack data | Check slack_channels[].id is not "PLACEHOLDER" |
| Confluence publish fails | Check Confluence credentials via /credential-status |
| Empty 3P sections | Normal if no recent activity; skill notes "No significant updates this period" |
| Customer not found | Add the customer to templates/customers.yaml with required fields |
| Source | Skill | Feeds into | Key fields |
|---|---|---|---|
| Asana tasks | .claude/skills/asana/scripts/query.py tasks | Progress, Plans, Problems | completed_at, due_on, modified_at, memberships (section) |
| Jira issues | .claude/skills/jira/scripts/issues.py list | Progress, Problems | status, priority, updated, comments |
| Slack messages | .claude/skills/slack/scripts/channels.py history | Progress, Problems | text, ts, user |
| Customer registry | templates/customers.yaml | All (customer lookup) | action_tracker_id, jira_customer, slack_channels |
/asana -- Base skill for Asana task queries and mutations/jira -- Base skill for Jira issue queries and FE-UPDATE management/slack -- Base skill for Slack channel history and search/confluence -- Publishing target for --confluence flag/customer-snapshot -- Full intelligence dashboard (deeper analysis than 3P)/cadence-prep -- Meeting prep (complementary to 3P -- agenda vs status update)