The badges on the README were outdated — the version badge showed the pre-release version instead of the actual current version.
Root Cause
The badges job in post-merge.yml was running in parallel with the release job (both only depended on detect-type). This meant:
generate_badges.py read __version__ from the checkout, which was the pre-release version
The release job bumped the version in parallel, but badges were already generated with the old version
Even if badges ran after release, the checkout used the trigger commit SHA, not the latest master (which includes the release commit)
Fix
Three changes ensure badges always reflect the actual state:
badges now depends on [detect-type, release] — runs after release has pushed any version bump
if: always() — badges run even if release fails or is skipped (badges should always reflect current state)
push_badges.py fetches latest master and hard-resets before generating badges — belt-and-suspenders to pick up release commits
The checkout also uses ref: master with an explicit git fetch origin master && git reset --hard origin/master step.
Testing
770 tests pass with 100% branch coverage
All lint checks pass (ruff, pyright, bandit, ansible-lint, actionlint)
make workflow-check passes (actionlint + act_runner dry-run)
Closes GRM-52
## Summary
The badges on the README were outdated — the version badge showed the pre-release version instead of the actual current version.
## Root Cause
The `badges` job in `post-merge.yml` was running **in parallel** with the `release` job (both only depended on `detect-type`). This meant:
1. `generate_badges.py` read `__version__` from the checkout, which was the **pre-release** version
2. The release job bumped the version in parallel, but badges were already generated with the old version
3. Even if badges ran after release, the checkout used the trigger commit SHA, not the latest master (which includes the release commit)
## Fix
Three changes ensure badges always reflect the actual state:
1. **`badges` now depends on `[detect-type, release]`** — runs after release has pushed any version bump
2. **`if: always()`** — badges run even if release fails or is skipped (badges should always reflect current state)
3. **`push_badges.py` fetches latest master** and hard-resets before generating badges — belt-and-suspenders to pick up release commits
The checkout also uses `ref: master` with an explicit `git fetch origin master && git reset --hard origin/master` step.
## Testing
- 770 tests pass with 100% branch coverage
- All lint checks pass (ruff, pyright, bandit, ansible-lint, actionlint)
- `make workflow-check` passes (actionlint + act_runner dry-run)
Closes GRM-52
The badges job in post-merge.yml was running in parallel with the
release job, causing the version badge to always show the pre-release
version. Three changes fix this:
1. badges now depends on [detect-type, release] instead of just
[detect-type], so it runs after release has pushed any version bump
2. badges uses `if: always()` so it runs even if release fails or is
skipped — badges should always reflect the current repo state
3. push_badges.py now fetches latest master and hard-resets before
generating badges, ensuring the checkout includes any release
commits that were pushed moments before
The checkout also uses `ref: master` instead of the trigger commit SHA,
with an explicit `git fetch origin master && git reset --hard origin/master`
step as a belt-and-suspenders approach.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
## Automated PR Review
- Architecture compliance: OK
- Best practices: OK
- Security: OK
- Documentation: OK
- Tests: OK
- Commit conventions: OK
No issues found by automated checks.
---
**Manual review required:** Before approving, review every category in
[REVIEW_CHECKLIST.md](REVIEW_CHECKLIST.md) and confirm with:
```bash
python3 scripts/ci/review_pr.py <PR> <owner/repo> \
--event APPROVE --checklist-confirmed \
--body "<substantive review summary>"
```
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
The badges on the README were outdated — the version badge showed the pre-release version instead of the actual current version.
Root Cause
The
badgesjob inpost-merge.ymlwas running in parallel with thereleasejob (both only depended ondetect-type). This meant:generate_badges.pyread__version__from the checkout, which was the pre-release versionFix
Three changes ensure badges always reflect the actual state:
badgesnow depends on[detect-type, release]— runs after release has pushed any version bumpif: always()— badges run even if release fails or is skipped (badges should always reflect current state)push_badges.pyfetches latest master and hard-resets before generating badges — belt-and-suspenders to pick up release commitsThe checkout also uses
ref: masterwith an explicitgit fetch origin master && git reset --hard origin/masterstep.Testing
make workflow-checkpasses (actionlint + act_runner dry-run)Closes GRM-52
Automated PR Review
No issues found by automated checks.
Manual review required: Before approving, review every category in
REVIEW_CHECKLIST.md and confirm with: