release: v0.3.0 — per-OS download breakdown badges#58
Conversation
Bumps version 0.2.0 → 0.3.0 and promotes the [Unreleased] section to [0.3.0] - 2026-04-29. One feature PR plus three small chore PRs land in this release; full bullets in CHANGELOG.md. Minor bump (rather than patch) is justified because run_pypinfo's return type changed from `dict[str, int]` to a TypedDict carrying both `by_installer` and `by_system` aggregates in PR #57 — same kind of internal-contract evolution that drove the 0.1.x → 0.2.0 jump. The feature surface is also new (3 new badge files per package per window), making 0.3.0 the right semantic line. ### Added - feat(collector): per-OS download breakdown badges (#57, d7688ce). Three additional badge files per package per window (`os-linux-Nd-non-ci.json`, `os-macos-Nd-non-ci.json`, `os-windows-Nd-non-ci.json`); pypinfo group-by extends from `ci installer` to `ci installer system`; `_health.json` per-package successful entries gain a `counts_by_system` field. Hero count and the seven v0.2.0 `installer-*` files unchanged in filename, schema, and value. Already verified end-to-end on the live CT 112 deploy with real production data (11 files per package across all 4 dogfood packages). - ci: add weekly uv lock --upgrade refresh cron (#54, 3ed03b9). New scheduled workflow runs `uv lock --upgrade` every Thursday 12:00 UTC as a backstop for transitive freshness; skip-gate defers when a prior `dependencies` + `python` PR is open; test gate blocks PR creation if the new lockfile breaks the suite. ### Changed - chore(deps): refresh uv.lock transitive pins (#55, 92ec030). Routine `uv lock --upgrade` resolve. No `pyproject.toml` range changes. - chore(.gitignore): ignore .deploy/ for private operator tooling (#52, 5bae606). Maintainer-shaped deploy scripts stay out of public history. - chore(.gitignore): ignore .claude/settings.local.json (#53, 2bd764a). Per-machine Claude Code permission overrides. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
cmeans
left a comment
There was a problem hiding this comment.
QA round 1 — PASS (no findings)
Clean release PR — minimal-pair version bump (0.2.0 → 0.3.0 in pyproject.toml) + CHANGELOG section stamp (## [Unreleased] → ## [0.3.0] - 2026-04-29) + new link reference. No content changes — the section was already accumulated across PRs #52, #53, #54, #55, #57.
Verifications
Section accounting — all 5 shipped PRs accounted for in the v0.3.0 section:
### Added:### Changed:
KaC ordering preserved (Added → Changed); no orphaned entries.
CHANGELOG link refs — [Unreleased] updated to v0.3.0...HEAD; new [0.3.0] reference added pointing at v0.2.0...v0.3.0; older refs preserved verbatim. After this PR merges, the document has no ## [Unreleased] heading at the top — the first post-release PR introduces it (consistent with the v0.2.0 release pattern and project convention).
Auto-release-page extractor pre-test — pre-running the live awk script from publish.yml against this branch's CHANGELOG with VERSION=0.3.0 produces a 12-line non-empty body (2 ### Added bullets + 3 ### Changed bullets + their headings, leading/trailing blank lines trimmed). Build-job gate passes; release job will get clean release notes when the v0.3.0 tag is pushed.
Build artifacts — rm -rf dist/ && uv build produces both:
pypi_winnow_downloads-0.3.0.tar.gz(184,899 bytes)pypi_winnow_downloads-0.3.0-py3-none-any.whl(19,509 bytes)
Version resolution — uv run python -c "from pypi_winnow_downloads import __version__; print(__version__)" → 0.3.0 ✓
Test suite + style on release-branch HEAD 88ba81b:
uv sync --frozen --extra dev→ succeededuv run pytest --cov→ 88 passed at 100% coverage (Required test coverage of 100.0% reached)uv run ruff check src/ tests/→ All checks passeduv run ruff format --check src/ tests/→ 11 files already formatteduv run mypy src/pypi_winnow_downloads/→ Success: no issues found in 5 source files- CI: 8 pass / 3 expected-skip (
changelog,on-label,on-unlabel) / 1 pending QA Gate ✓
Backwards-compat invariants — already verified during PR #57 QA (test_collect_one_v0_2_0_files_unchanged_alongside_os_files, test_health_json_preserves_v0_2_0_fields, etc.); no code change in this release PR, so they carry forward.
Test plan checkboxes 3-5
- On merge:
publish.ymlextracts[0.3.0]notes from CHANGELOG, builds + uploads to PyPI via trusted publisher, creates GitHub release page — pre-tested via the awk extractor above; will fire on tag push. - Collector run on CT 112 emits 11 files per package per window — already validated pre-merge from #57's feature branch per PR body. Version bump alone introduces no regression risk.
- PyPI page renders correctly — post-publish verification by maintainer.
Labels: Ready for QA → QA Active → Ready for QA Signoff. Awaiting maintainer QA Approved.
|
Audit trail: applying Ready for QA Signoff — minimal-pair version bump 0.2.0→0.3.0, all 5 shipping PRs (#52/#53/#54/#55/#57) accounted for in the [0.3.0] section with KaC ordering preserved, link refs correctly updated, awk extractor produces 12-line non-empty body for v0.3.0, uv build produces 0.3.0 sdist + wheel, version resolves to 0.3.0, 88/88 pytest at 100% coverage, ruff/format/mypy clean, CI fully green. Workflow: |
Summary
Bumps version
0.2.0→0.3.0and promotes the[Unreleased]section to[0.3.0] - 2026-04-29. One feature PR plus three small chore PRs land in this release.Why minor (not patch)
run_pypinfo()'s return type changed fromdict[str, int]to a TypedDict carrying bothby_installerandby_systemaggregates in #57 — same kind of internal-contract evolution that drove the 0.1.x → 0.2.0 jump. The feature surface is also new (3 new shields.io endpoint badge files per package per window: linux / macos / windows), making 0.3.0 the right semantic line.What's in the diff
pyproject.toml— version0.2.0→0.3.0.CHANGELOG.md—## [Unreleased]heading replaced with## [0.3.0] - 2026-04-29; link refs updated ([Unreleased]now points atv0.3.0...HEAD; new[0.3.0]ref). Section content untouched — already accumulated across the four PRs that landed since v0.2.0.What's shipping (already on main)
Added
d7688ce) — three additional badge files per package per window (os-linux-Nd-non-ci.json,os-macos-Nd-non-ci.json,os-windows-Nd-non-ci.json); pypinfo group-by extends fromci installertoci installer system;_health.jsongains acounts_by_systemfield. Hero count and the seven v0.2.0installer-*files unchanged in filename, schema, and value. Already verified end-to-end on the live CT 112 deploy with real production data (11 files per package across all 4 dogfood packages).3ed03b9) — scheduled workflow runsuv lock --upgradeevery Thursday 12:00 UTC as a backstop for transitive freshness. Skip-gate + test-gate keep it from creating overlapping or broken PRs.Changed
92ec030) — routineuv lock --upgraderesolve. Nopyproject.tomlrange changes.5bae606) — maintainer-shaped deploy scripts stay out of public history.2bd764a) — per-machine Claude Code permission overrides.Backwards-compat verified
downloads-Nd-non-ci.jsonfilename / schema / value unchanged for any given pypinfo response.installer-*files unchanged._health.jsoncount,counts,window_dayskeys preserved verbatim.sum(by_installer.values())regardless ofsystem_name.Test plan
uv build(sdist + wheel) — local validation.publish.ymlextracts[0.3.0]notes from CHANGELOG, builds + uploads to PyPI via trusted publisher, creates GitHub release page.pypi-winnow-downloads0.3.0 page renders correctly.Release framing
Target tag:
v0.3.0— minor bump per SemVer. Additive feature; no breaking changes to v0.2.0 contracts.🤖 Generated with Claude Code