Prepare for a customer cadence call by gathering Jira issues and Slack history into a structured meeting agenda. Use this skill whenever the user mentions cadence prep, meeting prep, prepping the agenda, getting ready for a customer call, building a QBR doc, or any request to prepare for an upcoming customer meeting. Also trigger when the user says 'prep the cadence', 'get ready for the call', 'build the agenda', or references a customer name alongside words like 'call', 'meeting', 'sync', 'cadence', or 'QBR'.
42:T4edb,
Gather context from Jira and Slack, populate a structured agenda using the cadence review template, and save it as a markdown file ready for the SE to review and customize before their customer meeting.
coreweave.atlassian.net/browse/WB-XXX URL. Every Slack reference includes its coreweave.slack.com/archives/ permalink.templates/cadence-review.md structure exactly. All sections are always generated; the SE decides what to present.| Property | Value |
|---|---|
| Output directory | customers/<name>/calls/ |
| Template | templates/cadence-review.md |
| Customer registry | templates/customers.yaml |
| Jira instance | coreweave.atlassian.net |
| Default max results | 200 |
The following credentials must be configured before use:
ATLASSIAN_EMAIL and ATLASSIAN_TOKEN in ~/.fe-skills/.envSLACK_TOKEN and SLACK_COOKIE in ~/.fe-skills/.envVerify Jira connectivity:
uv run --project .claude/skills/jira python .claude/skills/jira/scripts/issues.py list --max-results 1 --pretty
Not all sources are required. If Slack credentials are missing, build the agenda from Jira data alone -- note which sections are incomplete.
Parse the user's request to determine:
templates/customers.yaml keys. Check both the name field and jira_customer_variants for alternative spellings. If ambiguous, ask the user to confirm. If customer not found, follow the Unknown Customer procedure below.--weekly, --biweekly, --monthly, --qbr. If not specified, use the customer's cadence.type from customers.yaml.--dry-run is specified, preview the agenda in chat without saving to disk or publishing to Confluence.--html is specified, also generate a styled HTML version for screen-sharing (in addition to Confluence + local markdown).Read the customer entry from templates/customers.yaml to get: jira_customer, slack_channels, cadence schedule, contacts.
Compute the lookback window from cadence type:
| Cadence Type | Lookback |
|---|---|
| weekly | 7 days |
| biweekly | 14 days |
| monthly | 30 days |
| qbr | 90 days |
Calculate the Unix timestamp for the --oldest parameter: current_time - (lookback_days * 86400).
Run these data-gathering operations:
Open issues:
uv run --project .claude/skills/jira python .claude/skills/jira/scripts/issues.py list \
--customer "<jira_customer>" --with-comments --max-results 200 --pretty
Recently closed (within lookback window or last 30 days, whichever is greater):
uv run --project .claude/skills/jira python .claude/skills/jira/scripts/issues.py search \
--jql "project = WB AND status IN (Done, Closed, Resolved) AND updated >= -30d ORDER BY updated DESC" \
--customer "<jira_customer>" --max-results 50 --pretty
FE-UPDATE status for each open issue:
uv run --project .claude/skills/jira python .claude/skills/jira/scripts/issues.py fe-updates \
--key WB-XXX --pretty
From the gathered data, compute:
https://coreweave.atlassian.net/browse/WB-XXXThis step gathers two data sources from Asana to feed into the meeting agenda. Both are optional -- cadence-prep works without Asana data.
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 the cadence lookback window): feed into "What's New" section as wins to highlight.| # | Action | Owner | Due | Status | Source |If action_tracker_id is "PLACEHOLDER" or not present: skip Asana actions, note "Asana actions not configured -- add action_tracker_id to templates/customers.yaml" in the Action Items section.
uv run --project .claude/skills/asana python .claude/skills/asana/scripts/query.py tasks \
--project-gid <raid_tracker_id> --limit 100 --pretty
Process the response:
| Type | Item | Owner | Status |If raid_tracker_id is "PLACEHOLDER" or not present: skip RAID items, note "RAID log not configured -- add raid_tracker_id to templates/customers.yaml" in the RAID Log section. This is graceful degradation -- cadence-prep works without RAID.
Read channel history for each of the customer's Slack channels (from customers.yaml slack_channels):
uv run --project .claude/skills/slack python .claude/skills/slack/scripts/channels.py history \
--channel <channel_id> --limit 50 --oldest <lookback_timestamp> --pretty
For threads with reply_count > 0, fetch the full thread to get context:
uv run --project .claude/skills/slack python .claude/skills/slack/scripts/threads.py replies \
--channel <channel_id> --ts <thread_ts> --limit 50 --pretty
From the gathered data, produce:
https://coreweave.slack.com/archives/{channel_id}/p{ts_without_dot}Resolve Slack identities: Slack messages contain user IDs in the format <@UXXXXXXXX>. Before writing any output, resolve these to real names using the Slack skill:
uv run --project .claude/skills/slack python .claude/skills/slack/scripts/users.py info --user UXXXXXXXX --pretty
Cache resolved names for the session to avoid repeated lookups. Replace all <@UXXXX> references with the person's display name in the final output.
Handling edge cases:
PLACEHOLDER, skip it and note: "Slack channel ID for [channel name] is a placeholder. Update templates/customers.yaml with the real channel ID."<@UXXXX> rather than guessing.Look for existing cadence docs:
ls -1 customers/<customer>/calls/*.md 2>/dev/null | sort | tail -1
If a previous doc exists, read it and extract:
If no previous doc exists (first run for this customer), note: "First cadence doc for [Customer]. No carry-forward data."
Resolution heuristics:
Gather product updates from the lookback window, then filter by the customer's deployment_type from customers.yaml.
Source 1: W&B Release Notes (docs.wandb.ai)
Fetch SDK and server release notes via WebFetch: