From data-science
Weeknotes and blog post creation for the Black Duck Data Science team — structure, workflow, formatting
How this skill is triggered — by the user, by Claude, or both
Slash command
/data-science:content-creationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**Do not rely solely on the date command.** First check the most recently published weeknote in Confluence to confirm which week has already been written up:
Do not rely solely on the date command. First check the most recently published weeknote in Confluence to confirm which week has already been written up:
Search Confluence: parent = <weeknotes-folder-id> ORDER BY lastmodified DESC LIMIT 1
The week to write is the one after the most recent published weeknote. Only then calculate the Monday date:
date -j -v-$(($(date +%u) - 1))d +%Y-%m-%d # macOS only
Title format: YYYY-MM-DD (Monday's date). Clear ~/WEEKNOTE.md before starting a new week's research.
Four sections (H2 headers only):
## Successes## Failures## Blockers## In-FlightStage 1 — Parallel research (~/WEEKNOTE.md as scratch):
Launch agents in parallel, each writing raw findings to disk immediately:
~/scratch/weeknote-atlassian-YYYY-MM-DD.md~/scratch/weeknote-git-YYYY-MM-DD.md~/scratch/weeknote-workiq-YYYY-MM-DD.mdCritical: agents must write findings verbatim to their scratch files. Do NOT rely on context alone — context gets compressed and data is lost. The scratch files are the source of truth.
Work IQ agent should run four queries, saving each result as it arrives:
Once agents complete, integrate all three scratch files into ~/WEEKNOTE.md (day-by-day, comprehensive, not for publishing). Preserve the scratch files — they survive context compression.
Stage 2 — Day-by-day verification (with user): Ask the user whether they want to walk through each day to confirm, correct, and fill gaps before drafting. This is best practice — particularly useful when the week spans bank holidays, travel, or external events. Reference scratch files to answer questions — do not rely on memory.
Stage 3 — Editorial (publish-ready):
Resolve the user's GitHub identity first — do not assume a username:
gh api user --jq '{login: .login, name: .name}'
Use the returned login for commit author filtering. Then for each team repo:
Commits — search without --author filter first (catches all authors on the branch), then verify authorship:
git -C <repo> fetch --quiet
git -C <repo> log --oneline --all --since=YYYY-MM-DD --until=YYYY-MM-DD
PRs opened, reviewed, or merged — use gh pr list not just git log:
gh pr list --repo <org>/<repo> --state all \
--json number,title,state,url,updatedAt,mergedAt,author \
| jq '.[] | select(.updatedAt >= "YYYY-MM-DD")'
Issues created or transitioned — check separately:
gh issue list --repo <org>/<repo> --state all \
--json number,title,state,url,updatedAt \
| jq '.[] | select(.updatedAt >= "YYYY-MM-DD")'
Which orgs to check is personal config (see user's local config). Do not check personal repos unless the user explicitly asks.
Search for DS project issues created or updated during the week:
project = DS AND updated >= "YYYY-MM-DD" AND updated <= "YYYY-MM-DD" ORDER BY updated DESC
Also check for cross-project activity:
assignee = currentUser() AND updated >= "YYYY-MM-DD" AND project != DS ORDER BY updated DESC
Always hyperlink ticket references — never bare DS-###:
[DS-###](https://blackduck.atlassian.net/browse/DS-###)
When closing a ticket as resolved by another artifact (e.g. a Confluence page), add a comment with the resolving link before transitioning to Done.
* **Topic Name**Primary source (requires network to llm.labs.blackduck.com):
uv run ~/src/service-llm/scripts/manage.py usage-summary --lookback 7 --markdown
Alternative via Service-MCP — standard queries (substitute week's Monday date):
Top-line summary:
SELECT COUNT(*) AS total_requests, COUNT(DISTINCT user_id) AS unique_users,
SUM(total_tokens) AS total_tokens, ROUND(SUM(response_cost),2) AS cost_usd,
SUM(CASE WHEN call_type='acompletion' THEN 1 END) AS chat_requests,
SUM(CASE WHEN call_type='aembedding' THEN 1 END) AS embedding_requests
FROM data_product_staging.llm_gateway.stg_llm_gateway__llm_gateway_usage
WHERE created_at >= 'YYYY-MM-DD' AND created_at < 'YYYY-MM-DD'
By model:
SELECT CAST(model_group AS STRING) AS model, COUNT(*) AS requests,
ROUND(SUM(response_cost),2) AS cost_usd
FROM data_product_staging.llm_gateway.stg_llm_gateway__llm_gateway_usage
WHERE created_at >= 'YYYY-MM-DD' AND created_at < 'YYYY-MM-DD'
GROUP BY CAST(model_group AS STRING) ORDER BY requests DESC LIMIT 10
By team (chat only):
SELECT CAST(team_alias AS STRING) AS team, COUNT(*) AS requests,
ROUND(SUM(response_cost),2) AS cost_usd
FROM data_product_staging.llm_gateway.stg_llm_gateway__llm_gateway_usage
WHERE created_at >= 'YYYY-MM-DD' AND created_at < 'YYYY-MM-DD'
AND call_type='acompletion'
GROUP BY CAST(team_alias AS STRING) ORDER BY cost_usd DESC LIMIT 10
If querying mid-week, flag that totals are incomplete vs a prior full week.
If all sources unavailable: link to the LLM Analytics Dashboard — never fabricate numbers.
Genuine setbacks, named specifically. Apply dry humor. At least one specific, authentic failure per weeknote — no generic placeholders. If something initially felt like a failure but on reflection was handled appropriately, remove it.
[DS-###](https://blackduck.atlassian.net/browse/DS-###)Publish to Confluence under the user's personal weeknotes folder. The DS space ID is 150863953 (key: DS). The user's personal space ID and weeknotes parent folder ID are personal config — ask the user if not already known:
11042819 for ~bolster)841482874)YYYY-MM-DD (Monday's date)markdownDo not include an H1 title or author line in the page body — Confluence renders the page title and author automatically.
Structure: TL;DR, Things we loved reading this month, What was accomplished this month?, What got in the way?, What's next?, Alternative Memes
YAML frontmatter (for local drafting only — strip before publishing to Confluence):
---
title: "Month YYYY Update: [Hook]"
date: YYYY-MM-DD
type: monthly-blog
---
* [Article Title](URL) - Brief description of relevance
* **Major Category**
* Specific achievement with metrics
* Attribution: "Thanks to @Person for specific contribution"
Note: Published version uses + for sub-bullets, not *.
Run via background agent — save all responses verbatim to ~/scratch/weeknote-workiq-YYYY-MM-DD.md as they arrive.
Standard queries (run all four):
Use returned conversationId for follow-up questions on any query. WorkIQ groups by topic — integrate thoughtfully into day-by-day sections. If a query returns no transcript, try asking for meeting chat or follow-up emails instead.
Reliable pattern:
%%{init: {'theme':'neutral'}}%%
gantt
title Chart Title
dateFormat YYYY-MM-DD
axisFormat %m/%y
tickInterval 1month
section Section Name
Task Name : crit, taskid, 2026-01-01, 2026-06-30
Pitfalls: mixed date formats break rendering; milestone tags often fail; don't indent tasks.
Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub bd-vitalstatistix/claude-marketplace --plugin data-science