docs(readme): canonicalize shields.io endpoint-badge URL form (#16)#27
Conversation
…16) Line 11's `https://shields.io/endpoint` redirected to the canonical `https://shields.io/badges/endpoint-badge` already used at line 96. Single edit so both refs match. Note: line 8's `https://img.shields.io/endpoint?url=…` is unchanged — that's the actual badge endpoint URL pattern (the shields service that produces the SVG), not a doc link.
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 — clean (one nice-to-have follow-up: #28, pre-existing CHANGELOG ordering issue)
PR closes #16 as designed: the line-11 doc link is canonicalized to match line 96; both now point at https://shields.io/badges/endpoint-badge directly without relying on the /endpoint → /badges/endpoint-badge 301 redirect.
Verification on head 8b3eb772:
| Check | Result |
|---|---|
| Issue #16 scope | matches — issue asks for line 11 to be canonicalized to the form already on line 96 (numbering shifted; on this branch the second occurrence is at line 96). PR does exactly that. |
Redirect chain (curl -sI -L) |
https://shields.io/endpoint → 301 with location: /badges/endpoint-badge → 200. Confirms PR's premise. |
| Diff scope | exactly README.md (+1/-1) + CHANGELOG.md (+4) — matches PR test-plan claim |
Repo-wide grep for shields.io doc-link drift |
only line 11 needed canonicalization; line 8 and the deploy/README badge URL are img.shields.io/endpoint?url=… (the badge service endpoint, not a doc URL) — correctly left alone per PR body. All other matches are img.shields.io/<badge-shape>/… badge URLs or shields.io/ root references; no further drift. |
| CHANGELOG entry | under ### Fixed with Closes #16 — correct Keep-a-Changelog category and reference |
uv run pytest -q |
56 passed, 0 deselected, 0.14s |
uv run ruff check + ruff format --check + uv run mypy src |
clean |
| CI on PR head | all SUCCESS (test 3.11/3.12/3.13, lint, typecheck, on-push, qa-approved) |
Test-plan checkboxes: ticked items 1 + 2 (both verifiable pre-merge).
Follow-up filed: #28 — nice-to-have. Pre-existing ## [Unreleased] ordering issue. Three older entries (deploy/README Tailscale Funnel from #22; README Acknowledgments + License + Install pointer from #15) are visually orphaned: PR #25's new ### Added and ### Changed blocks landed above them, and #27's new ### Fixed block now sits between ### Changed and the orphans, so they appear under ### Fixed. Not introduced by this PR — #27 just made the issue visually obvious. Should be cleaned up before the next release tag so categorization is correct in the rendered CHANGELOG.
No findings. Transitioning label to Ready for QA Signoff.
|
Applying |
Three mechanical edits: - pyproject.toml: version "0.1.0" -> "0.1.1" - CHANGELOG.md: insert `## [0.1.1] - 2026-04-26` directly under the (still empty) `## [Unreleased]` header so all 12 PRs' worth of bullets that have been accumulating since v0.1.0 ship are now categorized under the 0.1.1 release. Updated the link refs at the bottom: [Unreleased] now compares from v0.1.1, and a new [0.1.1] entry compares v0.1.0...v0.1.1. - uv.lock: refreshed by `uv lock` so the locked pypi-winnow-downloads version (0.1.1) matches pyproject.toml. What ships in v0.1.1 (highlights — full changelog under ## [0.1.1]): Library fixes (operator-visible): - collector: _write_health OSError no longer escapes per-package isolation. Disk-full / perm errors now produce structured `winnow-collect: ...; health file write failed: [Errno 28] No space left on device` exit instead of a raw traceback. Closes #32. - collector: stale_threshold_days is now actually consulted — the "warn if previous run is older than N days" feature documented in config.example.yaml since v0.1.0 finally fires. Log-only per the documented v1 contract; degrades silently on first-run / unreadable / malformed / future- timestamped previous _health.json. Closes #33. Documentation: - README acknowledgments / license / BigQuery dataset link refresh (PR #15) - README shields.io URL canonicalization (PR #27, closes #16) - deploy/README.md Tailscale Funnel as alternative HTTPS exposure (PR #22) - deploy/README.md "Pick an approach" table updated to reflect the new Caddy logging shape (in PR #30) CI / project infrastructure (no PyPI consumer impact, but hardens future releases): - Community health files: CONTRIBUTING / CoC / SECURITY / issue templates (PR #20) - .github/dependabot.yml across pip + github-actions + docker ecosystems (PR #21) - Dependabot PR hygiene cascade from cmeans/mcp-synology: PULL_REQUEST_TEMPLATE.md + auto-CHANGELOG workflow (App- token authenticated so required CI re-fires on the bot's HEAD SHA) + dependabot.yml prefix fix (PR #25). Validated end-to-end via the first two real Dependabot bumps PR #23 (codecov-action 5->6) and PR #24 (python 3.13-slim -> 3.14-slim). - deploy-smoke CI job that builds the Dockerfile, smokes the entrypoint, validates compose+Caddyfile against caddy:2 (PR #29, closes #7). Promoted to required status check on the main-protection ruleset 2026-04-26 22:43 (issue #31 closed via operator action). - deploy/caddy/Caddyfile.example gains global error logger + per-site access logger with built-in lumberjack rotation, documents the validate-as-root gotcha (PR #30). Live CT 112 deployment fixed in the same change. - 100% coverage on src/ via real tests (no `# pragma: no cover`), with `fail_under = 100` gate in pyproject.toml so future regressions trip CI (PR #38, closes #37). Verified locally: 71/71 pytest pass, ruff/format/mypy clean, coverage gate green at 100.00%. After this merges: 1. Tag the squash-merge commit as v0.1.1 and push the tag — publish.yml fires and uploads to PyPI via the existing trusted-publisher OIDC flow. 2. Update the live CT 112 deployment to install pypi-winnow-downloads==0.1.1 from PyPI (currently runs a wheel built from main, but pinning to the released version keeps deploy reproducible). 3. Close any post-release follow-ups Chris wants tracked. Co-authored-by: cmeans-claude-dev[bot] <272174644+cmeans-claude-dev[bot]@users.noreply.github.com>
) Documentation-only patch release. v0.1.1 shipped with three CHANGELOG entries miscategorized under `### Fixed` instead of `### Added`: - `deploy/README.md` Tailscale Funnel section (originally added in PR #22) - README `## Acknowledgments` and `## License` sections (PR #15) - README `## Install` pointer to pypinfo's GCP setup (PR #15) The orphaning was introduced when PR #25 added new `### Added` and `### Changed` blocks at the top of the then-active `## [Unreleased]` section without repositioning the entries from earlier PRs. PR #27 later inserted a `### Fixed` block between `### Changed` and the orphans, which is the layout that shipped in v0.1.1. Three mechanical edits: - `pyproject.toml`: version 0.1.1 → 0.1.2 - `CHANGELOG.md`: insert `## [0.1.2] - 2026-04-27` with one `### Fixed` bullet describing the recategorization; move three orphan bullets from `## [0.1.1]` `### Fixed` to `## [0.1.1]` `### Added`; update link refs (Unreleased compares from v0.1.2, new [0.1.2] compares v0.1.1...v0.1.2) - `uv.lock`: refreshed by `uv lock` so locked version (0.1.2) matches pyproject.toml No code, dependency, or runtime behavior changes. Closes #28. Co-authored-by: cmeans-claude-dev[bot] <272174644+cmeans-claude-dev[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
Single-character README fix. Line 11's
https://shields.io/endpointredirected to the canonicalhttps://shields.io/badges/endpoint-badgealready used at line 96. Now both refs match.[shields.io](https://shields.io/endpoint)[shields.io](https://shields.io/badges/endpoint-badge)[endpoint badge](https://shields.io/badges/endpoint-badge)Out of scope: line 8's
https://img.shields.io/endpoint?url=…is the actual badge endpoint URL pattern (the shields service that produces the SVG), not a doc link. Untouched.Test plan
git diff origin/main..shows two files changed (README.md, CHANGELOG.md), 5 insertions, 1 deletionCHANGELOG
## [Unreleased]→### Fixedentry referencing this PR's closes docs(readme): canonicalize shields.io endpoint-badge URL form (line 11) #16Closes #16