Add close-sprint skill and sprint-stats skill + first draft of reports for Sprints 1 and 2.
## Summary
Add a `sprint-stats` skill that generates per-sprint statistics reports for AI Marketing Initiative milestones. Each report ships in three formats (`.md`, `.html`, `.pdf`); HTML/PDF use a Drupal.org-themed template (NotoSans + ZTGatha fonts, bluecheese colour palette, Drupal shield + wordmark in the header banner).
- Skill: `skills/sprint-stats/SKILL.md`
- Runnable script: `scripts/run-sprint-stats.sh`
- First-draft reports for **Sprint 1** and **Sprint 2** were generated and reviewed locally on 2026-05-09 to validate the skill end-to-end.
`reports/` is git-ignored — reports are point-in-time artefacts. Regenerate with `./scripts/run-sprint-stats.sh <milestone-iid>`.
> ⚠️ **First draft.** Both the report format and the **Developer / Responsible Person** column are first-pass. The Developer column is derived from a best-effort heuristic (state-label author, issue closer, etc.) and **will be wrong** in some cases — especially `drupalbot`-attributed rows and `(unassigned)` rows. We expect to replace it with a dedicated **Responsible person** field on AI Marketing Initiative issues; until then, the column is a starting point that should be reviewed and corrected by hand.
## Work Track
AI Marketing
## Context / Background
Sprint 2 had no parent ticket tracking the meta work of summarising it. Sprint reviews currently read straight off the GitLab milestone board, which doesn't surface "who did what" cleanly and isn't reviewable in retro form. This issue covers the tooling (skill + script) so any sprint can be summarised on demand.
The "Retro of AI Marketing Sprint 1" issue (#3586448) sits in Sprint 2 by the same logic — it's *about* Sprint 1 but the *work* is happening during Sprint 2.
## Tasks
- [x] Add a skill for closing a sprint.
- [x] Add `skills/sprint-stats/SKILL.md` documenting prerequisites, state buckets, and the developer-attribution heuristic.
- [x] Add `scripts/run-sprint-stats.sh`. Takes the milestone IID as its first argument (`./scripts/run-sprint-stats.sh 2`). Always emits `.md`; emits `.html` if `python3-markdown-it` is installed; emits `.pdf` if a Chromium-class browser is also on `$PATH`. PDF is rendered via headless Chrome's `--print-to-pdf` against the HTML.
- [x] Pre-fetch Drupal.org brand assets (NotoSans + ZTGatha fonts, Drupal shield + wordmark SVGs) into a local cache so headless Chrome doesn't need network access at PDF-render time.
- [x] Validate end-to-end on Sprint 1 (closed) and Sprint 2 (in flight) — both produce a 3-format report with **Headline**, **Aggregate Statistics**, and **Detail** sections. Aggregate columns show counts and percentages: `[number] ([percent])`.
- [x] Git-ignore `reports/` — generated artefacts are reproducible from the script and shouldn't churn the repo history.
- [x] Review the **Responsible Person** column with the team — flag rows where the heuristic is wrong, especially `drupalbot`-attributed rows (drupalbot auto-applies `state::accepted` on issue creation and is the closer for many MR-merge-driven closes) and `(unassigned)` rows (issues with no developer signal at all).
- [x] (out of scope for now, separate issue) Decide whether to introduce a custom **Responsible person** field on AI Marketing Initiative issues. Would short-circuit the heuristic in future sprints and let the same field power both the report and any future workflow rules.
## Acceptance Criteria
- [x] `skills/sprint-stats/SKILL.md` exists and documents the State buckets and Developer heuristic.
- [x] `scripts/run-sprint-stats.sh` runs from the repo root with the milestone IID as positional argument and produces `.md`, `.html`, and `.pdf` artefacts.
- [x] HTML and PDF artefacts apply the Drupal.org bluecheese theme (NotoSans/ZTGatha fonts, navy header banner with Drupal shield + wordmark, brand colour palette on tables and headings).
- [x] `reports/` is git-ignored.
## Possible follow-up tasks (out of scope)
- [ ] Heuristic limitations (drupalbot noise, unassigned bucket, assignee ≠ doer) are explicitly called out in the SKILL's "Refinement notes" so the next iteration has a clear starting point.
## AI Usage
- [x] AI Assisted Issue — This issue was generated with AI assistance, but was reviewed and refined by the creator.
---
*Drafted with the assistance of AI (Claude Code / Opus 4.7).*
issue