Skip to content

release: v0.3.0 — per-OS download breakdown badges#58

Merged
cmeans-claude-dev[bot] merged 1 commit into
mainfrom
release/v0.3.0
Apr 30, 2026
Merged

release: v0.3.0 — per-OS download breakdown badges#58
cmeans-claude-dev[bot] merged 1 commit into
mainfrom
release/v0.3.0

Conversation

@cmeans-claude-dev

Copy link
Copy Markdown
Contributor

Summary

Bumps version 0.2.00.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.

Why minor (not patch)

run_pypinfo()'s return type changed from dict[str, int] to a TypedDict carrying both by_installer and by_system aggregates 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 — version 0.2.00.3.0.
  • CHANGELOG.md## [Unreleased] heading replaced with ## [0.3.0] - 2026-04-29; link refs updated ([Unreleased] now points at v0.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

  • feat(collector): per-OS download breakdown badges (feat: per-OS download breakdown badges (v3) #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 gains 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 (ci: add weekly uv lock --upgrade refresh cron #54, 3ed03b9) — scheduled workflow runs uv lock --upgrade every Thursday 12:00 UTC as a backstop for transitive freshness. Skip-gate + test-gate keep it from creating overlapping or broken PRs.

Changed

Backwards-compat verified

  • Hero downloads-Nd-non-ci.json filename / schema / value unchanged for any given pypinfo response.
  • The seven v0.2.0 installer-* files unchanged.
  • _health.json count, counts, window_days keys preserved verbatim.
  • Hero count = sum(by_installer.values()) regardless of system_name.

Test plan

  • uv build (sdist + wheel) — local validation.
  • CI green (lint, typecheck, test 3.11/3.12/3.13, deploy-smoke).
  • On merge: publish.yml extracts [0.3.0] notes from CHANGELOG, builds + uploads to PyPI via trusted publisher, creates GitHub release page.
  • After release: collector run on CT 112 emits 11 files per package per window (already validated pre-merge from feature branch — no regression expected from version bump alone).
  • After release: PyPI pypi-winnow-downloads 0.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

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>
@github-actions github-actions Bot added Awaiting CI Dev complete, waiting for CI/Codecov to pass before QA and removed Awaiting CI Dev complete, waiting for CI/Codecov to pass before QA labels Apr 30, 2026
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@github-actions github-actions Bot added the Ready for QA Dev work complete — QA can begin review label Apr 30, 2026

@cmeans cmeans left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@cmeans cmeans added QA Active QA is actively reviewing; Dev should not push changes and removed Ready for QA Dev work complete — QA can begin review labels Apr 30, 2026

@cmeans cmeans left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

QA round 1 — PASS (no findings)

Clean release PR — minimal-pair version bump (0.2.00.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:
    • .github/workflows/uv-lock-refresh.yml ← PR #54
    • Per-OS badge files (v3 OS distribution feature) ← PR #57
  • ### Changed:
    • uv.lock transitive pins ← PR #55
    • .gitignore .deploy/ ← PR #52
    • .gitignore .claude/settings.local.json ← PR #53

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 artifactsrm -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 resolutionuv 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 → succeeded
  • uv run pytest --cov88 passed at 100% coverage (Required test coverage of 100.0% reached)
  • uv run ruff check src/ tests/ → All checks passed
  • uv run ruff format --check src/ tests/ → 11 files already formatted
  • uv 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.yml extracts [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.

@cmeans

cmeans commented Apr 30, 2026

Copy link
Copy Markdown
Owner

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: Ready for QA → QA Active → Ready for QA Signoff.

@cmeans cmeans added Ready for QA Signoff QA passed — ready for maintainer final review and merge QA Approved Manual QA testing completed and passed and removed QA Active QA is actively reviewing; Dev should not push changes Ready for QA Signoff QA passed — ready for maintainer final review and merge labels Apr 30, 2026
@cmeans-claude-dev cmeans-claude-dev Bot merged commit fdd4fc3 into main Apr 30, 2026
36 checks passed
@cmeans-claude-dev cmeans-claude-dev Bot deleted the release/v0.3.0 branch April 30, 2026 02:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

QA Approved Manual QA testing completed and passed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants