potiuk opened a new pull request, #248:
URL: https://github.com/apache/airflow-steward/pull/248

   ## Summary
   
   Adds a new skill + tool pair, `security-tracker-stats-dashboard`, that
   renders a self-contained HTML dashboard of `<tracker>` repository
   statistics. Generalised from the in-tree airflow-s implementation
   that has been driving the security team's monthly review cadence.
   
   Output: line / area charts (no bars, `connectgaps: true`) covering
   
   - **Lifecycle bands** (stacked) — `open_untriaged` / `open_triaged`
     / `open_pr_merged` / `fixed_released` / `closed_other`, evaluated
     per-bucket via configurable predicates.
   - **Backlog** — opened-in-bucket vs. untriaged-at-bucket-end.
   - **Cumulative opened vs. closed**.
   - **Mean time to triage** (hours).
   - **Mean time to first response** (hours).
   - **Mean time createdAt -> PR opened** (days, requires `<upstream>`).
   - **Mean time PR-open -> PR-merged** (days, requires `<upstream>`).
   - **Mean time PR-merged -> advisory announced** (days, requires
     `<upstream>`).
   
   Vertical annotations on every chart mark the project-configurable
   milestones (e.g. "skill adoption", "team handover").
   
   ## Why it's useful
   
   Steward adopters today don't have a built-in way to see how their
   tracker is trending over time. The reference dashboard is what
   gave the airflow-s team a clear "the new skill suite has cut median
   time-to-triage from ~5d to <4h" data point, and it surfaced
   backlog pressure that drove process tweaks. Making it
   project-configurable means any adopter can get the same visibility
   without re-implementing the data-plane.
   
   The tool is read-only on GitHub. Both the slash-command path (the
   skill) and the script path (`run.sh`) run the same fetch + render
   pipeline.
   
   ## Config schema
   
   ```yaml
   buckets: monthly                  # monthly | quarterly
   start: null                       # null = first tracker createdAt
   upstream_repo: apache/airflow     # null -> omit PR charts
   milestones:                       # vertical annotations
     - date: 2026-04-20
       label: skill adoption
   scope_labels: [airflow, providers, chart]
   categories: [...]                 # first-match-wins predicates
   triage:
     keywords: [...]
     bot_prefixes: [...]
   ```
   
   Load order (highest priority last):
   
   1. `tools/security-tracker-stats-dashboard/default-config.yaml`.
   2. `$TRACKER_STATS_CONFIG` overlay (deep-merged; lists REPLACED).
   3. Env-var quick overrides: `TRACKER_STATS_BUCKETS`,
      `TRACKER_STATS_START`, `TRACKER_STATS_UPSTREAM_REPO`.
   
   Predicate keys: `state`, `state_reason`, `any_label`, `all_labels`,
   `not_label`, `not_any_label`, `no_scope_label`, `has_scope_label`,
   `pr_merged_by_snapshot`, plus `any_of` / `all_of` combinators.
   Documented in `tools/security-tracker-stats-dashboard/README.md` and inline
   in `default-config.yaml`.
   
   ## Defaults reproduce the airflow-s reference byte-for-byte
   
   The shipped `default-config.yaml` reproduces the airflow-s
   implementation exactly. With the same cache, the new renderer
   emits a dashboard whose chart data series are identical to the
   existing one (per-bucket counts, cumulative series, mean-time
   values, etc.). Differences in the emitted HTML are limited to
   variable rename (`months` -> `buckets`) and the title text.
   
   ## Files
   
   ```
   tools/security-tracker-stats-dashboard/
   ├── README.md                 (overview + config schema)
   ├── default-config.yaml       (framework defaults)
   ├── render.py                 (renderer; reads config)
   ├── fetch_issues.py
   ├── fetch_roster.py
   ├── fetch_bodies.py
   ├── fetch_events.py
   ├── fetch_prs.py
   └── run.sh
   
   .claude/skills/security-tracker-stats-dashboard/
   └── SKILL.md                  (placeholder-convention header,
                                  adopter-override + snapshot-drift
                                  sections, prerequisites, inputs,
                                  how-to-invoke, golden rules)
   
   projects/_template/
   └── security-tracker-stats.md          (adopter template doc)
   ```
   
   ## Security family integration
   
   The skill is named `security-tracker-stats-dashboard` and lives under
   the `security-*` family prefix, so it joins the security-issue family
   that adopters already opt into via the `families: security` lock-file
   entry. No `setup-steward` changes are needed — `adopt` and `upgrade`
   already pick up any `security-*` skill the snapshot ships.
   
   Adopters' existing `.gitignore` pattern `/.claude/skills/security-*`
   already excludes the symlink the snapshot creates, so no gitignore
   edit is required either.
   
   ## Adopter migration note
   
   Adopters who previously committed a local copy at
   `<adopter-repo>/.claude/skills/security-tracker-stats-dashboard/` will,
   after running `/setup-steward upgrade`, get the framework version
   symlinked in. They should `git rm -r` the committed local copy in
   favour of the symlink; the gitignore already excludes the resulting
   dangling symlink. The airflow-s adopter has been verified to render
   identically before and after the swap.
   
   ## Test plan
   
   - [x] Refactored renderer reproduces the airflow-s reference
         output's chart data series byte-for-byte.
   - [x] `TRACKER_STATS_BUCKETS=quarterly` renders a valid quarterly
         dashboard with 13 buckets (2023-Q2 through 2026-Q2).
   - [x] `milestones: []` overlay removes all vertical lines.
   - [x] `upstream_repo: null` overlay omits the three PR-driven
         charts without crashing.
   - [x] PyYAML-absent fallback parses `default-config.yaml`
         correctly.
   - [ ] Reviewer to sanity-check the SKILL.md against the
         framework's other skill files for cross-link correctness.
   
   🤖 Generated with [Claude Code](https://claude.com/claude-code)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to