Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ Format follows [Keep a Changelog](https://keepachangelog.com/). Versions follow

### Added

- **QA workflow and PR label state machine** (PR #19): `.github/workflows/qa-gate.yml`, `pr-labels.yml`, `pr-labels-ci.yml`, `sync-labels.yml`, and `.github/labels.yml` define a full state machine for PR review — `Awaiting CI` → `Ready for QA` → `QA Active` → `Ready for QA Signoff` / `QA Failed` → `QA Approved` — with a required `QA Gate` status check that gates merge until the maintainer applies `QA Approved`. Documented in `CLAUDE.md` § "PR & Label Workflow". Brings this repo in line with the `cmeans/mcp-*` conventions.
- **Stricter `_get_current_version` fallback assertion** (closes #32): `TestVersionHelpers::test_get_current_version_falls_back_on_metadata_failure` now asserts exact equality with `cli.__version__` instead of `isinstance(..., str)`. The old assertion would have passed for any string, silently missing a regression that returned a wrong value from the `except` branch. Mirrors the exact-value assertion already used for `_resolve_version`'s `"0.0.0"` fallback in `TestResolveVersion`.
- **Test coverage push to 100% on pure-logic modules**: 188 new tests bring every pure-logic module (`__init__.py`, `blocklist.py`, `cli.py`, `clickbait.py`, `config.py`, `scheduler.py`, `state.py`) to 100% line coverage. Overall coverage rose from 44% to 64% — the gap is almost entirely `browser.py` / `diagnostics.py`, which are Playwright automation and are intentionally left at their natural (low) coverage. `pyproject.toml` now enforces `fail_under = 60` in `[tool.coverage.report]` as a regression guard, and `.coverage` / `coverage.xml` / `htmlcov/` are gitignored.
- **Test coverage push to 100% on pure-logic modules**: 188 new tests bring every pure-logic module (`__init__.py`, `blocklist.py`, `cli.py`, `clickbait.py`, `config.py`, `scheduler.py`, `state.py`) to 100% line coverage. Overall coverage rose from 44% to 64% — the gap is almost entirely `browser.py` / `diagnostics.py`, which are Playwright automation and are intentionally left at their natural (low) coverage. `pyproject.toml` now enforces `fail_under = 60` in `[tool.coverage.report]` as a regression guard, and `.coverage` / `coverage.xml` / `htmlcov/` are gitignored. As part of this push, every `# pragma: no cover` directive was removed per the project's hard-rule policy — excluded lines must either be covered by a real test, deleted as dead code, or refactored, never hidden from the coverage counter.
- **Codecov coverage reporting** in CI: `pytest-cov>=7.0` added as a dev dependency, `[tool.coverage.*]` configuration added to `pyproject.toml`, and a `codecov/codecov-action@v5` upload step now runs on the Ubuntu CI job. A Codecov badge is displayed in the README.
- README status badges (PyPI version, supported Python versions, license, CI, download count) and `.github/FUNDING.yml` for GitHub Sponsors — brings the project in line with the `cmeans/mcp-*` repo conventions.

Expand All @@ -23,6 +24,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com/). Versions follow

- **Stale `python -m yt_dont_recommend` examples in the package module docstring** (closes #31): replaced every example in `src/yt_dont_recommend/__init__.py` with the `yt-dont-recommend` console-script form (the package has no `__main__.py`, so the `python -m` form never worked), and added the now-required `--blocklist` flag to each example. The same doc-drift affected `CLAUDE.md` § "End-to-End Test Cycle", which referenced a non-existent top-level `yt_dont_recommend.py` — updated to use the console-script form as well. Also corrected a stale `License: MIT` line in the module docstring to `License: Apache-2.0` to match the main-branch license switch.
- **Scheduler catch-up spawn storm** (closes #17): after the host woke from sleep (or otherwise missed multiple consecutive scheduled slots), the heartbeat loop would spawn one full blocklist+clickbait run per missed slot back-to-back, resulting in three or more overlapping browser sessions fighting over the same Chromium profile. Stale missed slots are now coalesced into a single catch-up run.
- **`workflow_run` event registration for `pr-labels-ci.yml`** (PRs #24–#28): literal GitHub Actions template-expression syntax inside shell comments in `run:` blocks was being substituted by the runner at queue time, which failed parsing and silently prevented the workflow from registering with the `workflow_run` trigger at all — the label automation never fired. Took five iterations to diagnose and escape correctly. The workflow now registers cleanly (visible under `gh api repos/.../actions/workflows`) and dispatches on completion of the source workflow.
- PyPI badges for Python versions and License now render correctly. `pyproject.toml` now declares Trove classifiers (Python 3.10–3.13, `License :: OSI Approved :: Apache Software License`) and a string license field, which is what `shields.io/pypi/pyversions` and `shields.io/pypi/l` read.

## [0.4.2] - 2026-03-19
Expand Down
Loading