Repository navigation
chore: consolidate Dependabot updates and group codeql-action - #208
Conversation
Supersedes Dependabot PRs #198, #199, #204, #205, #206 and #207. Dependabot tracks github/codeql-action/init, /analyze and /upload-sarif as three separate dependencies and opens one PR each. analyze refuses a config file written by a different init release ("Loaded a configuration file for version '4.37.9', but running version '4.38.1'"), so #204 and #206 each failed CodeQL on their own and neither could merge. - Bump github/codeql-action/{init,analyze,upload-sarif} 4.37.9 -> 4.38.1 - Bump astral-sh/setup-uv 10.0.1 -> 10.2.0 - Bump hypothesis 6.167.1 -> 6.168.0, ruff 0.16.6 -> 0.16.7, mutmut 3.7.0 -> 3.8.0 (uv.lock identical to Dependabot's) - Group github/codeql-action* in dependabot.yml so future bumps land as one PR - Add TestCodeQLActionVersionLockstep: fails the test job, naming the mismatched steps, if codeql-action steps are pinned to >1 commit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0156bCnW5thBLFaLt7Nvg6d4
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Advanced Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (9)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthroughThe pull request updates ChangesWorkflow action updates
Priority: ➖ Normal Estimated code review effort: 2 (Simple) | ~10 minutes Change: Other Suggested reviewers: Merge Risk: ⚪ Minimal · up to The dependency and workflow updates appear mergeable after normal checks; no concrete issue requiring a pre-merge fix remains. Security Architecture ReviewSecurity architecture risk: 🔵 Low · up to The update strengthens protection against incompatible CodeQL action versions without showing a new route to privileged execution. The updated third-party actions still warrant normal dependency scrutiny. Retained concerns Security review detailsSecurity Blast Radius
Trust Boundaries and Controls
Resilience and Maintainability Implications
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 75.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 4 functions across 1 files. (8 skipped: 8 unsupported.)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
* test(mutation): gate nightly mutation runs on untriaged survivors `mutmut run` (3.7.0, pinned) exits 0 however many mutants survive, so mutation.yml was green whatever it found, and the two accepted survivors lived in a pyproject.toml comment nothing checked. Running the audit locally showed the cost: a third survivor in the shared TLV walker had gone untriaged and unkilled. - scripts/check_mutmut_survivors.py fails the job on any undetected mutant not accepted in scripts/mutmut_survivors.txt, on a stale entry, and on a scoped file with no checked mutant at all; unknown statuses fail closed. Verified against a real run: passes with the record, fails on both survivors without it. - tests/test_tlv.py kills the third survivor (a caller's min_option_length discarded when the length counts its header). - tests/conftest.py clears every package-level functools cache before each test, and loads the Hypothesis profiles for every selection. mutmut 3 forks each mutant from a parent that already ran the suite, so a warm cache could hide a mutant; and mutmut's test selection never imported test_fuzz.py, where the profiles were registered. - fuzz.yml/mutation.yml key concurrency on the event, so the cron can't cancel the manual runs CONTRIBUTING.md's new release checklist needs. - tests/test_workflows.py guards each of these, plus every fuzz harness being run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CEQCZGyuvpMyZwUbDucF3G * docs(mutation): describe mutmut 3.8.0, which master now pins #208 bumped mutmut 3.7.0 -> 3.8.0 after the survivor gate was written. Re-verified on 3.8.0: `mutmut run` still exits 0 with mutants surviving, the status vocabulary is unchanged, and the two triaged survivors keep their names, so the gate passes as before. One behaviour did change: 3.8.0 recurses into decorated classes, so @DataClass methods are mutated again. The earlier "correction" of pyproject.toml's comment would have made it false, so the wording now says only that decorated functions (the @lru_cache parsers) are never mutated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CEQCZGyuvpMyZwUbDucF3G * fix(mutation): let the triage record accept only `survived` mutants An allowlisted mutant whose status turned into `no tests`, `suspicious` or a status a newer mutmut introduces was still subtracted from the undetected set, so the gate passed despite promising to fail closed (CodeRabbit, #213). The record exists to accept equivalent survivors, so it now suppresses status `survived` and nothing else; any other undetected status is reported once, allowlisted or not. Implemented and reviewed by independent sub-agents, per .claude/skills/steward/SKILL.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CEQCZGyuvpMyZwUbDucF3G --------- Co-authored-by: Claude <noreply@anthropic.com>
Summary
Supersedes all six open Dependabot PRs — #198, #199, #204, #205, #206, #207 — and fixes the reason two of them could never go green.
Dependabot tracks
github/codeql-action/init,/analyzeand/upload-sarifas three separate dependencies, so it opened one PR per sub-action.analyzerefuses a config file written by a differentinitrelease. From #204'sAnalyze (python)job:#206 fails the same way in reverse. Neither could merge on its own, so the bump was stuck until both landed together.
What's included
github/codeql-action/{init,analyze,upload-sarif}4.37.9 → 4.38.1 (1c5b675…). Covers ci: bump github/codeql-action/analyze from 4.37.9 to 4.38.1 #204, ci: bump github/codeql-action/init from 4.37.9 to 4.38.1 #206 and ci: bump github/codeql-action/upload-sarif from 4.37.9 to 4.38.1 #207.astral-sh/setup-uv10.0.1 → 10.2.0 (c18668a…) in all 11 steps. Covers ci: bump astral-sh/setup-uv from 10.0.1 to 10.2.0 #205.hypothesis6.167.1 → 6.168.0 andruff0.16.6 → 0.16.7 (chore: bump the dev-dependencies group with 2 updates #198), plusmutmut3.7.0 → 3.8.0 (chore: bump mutmut from 3.7.0 to 3.8.0 #199).uv.lockwas regenerated withuv lock --upgrade-package. Every sha256 added matches the union of the Dependabot lockfile diffs, with nothing extra..github/dependabot.yml: newcodeql-actiongroup (github/codeql-action*) undergithub-actions, so future bumps arrive as one PR.tests/test_workflows.py: newTestCodeQLActionVersionLockstep. It fails the ordinary test job and names the mismatched steps whenevergithub/codeql-action/*steps across all workflows are pinned to more than one commit. It also asserts thatcodeql.yml's init and analyze steps are both found, so it can't pass on zero matches. A synthetic split-bump case shows the check can fail. Run against ci: bump github/codeql-action/analyze from 4.37.9 to 4.38.1 #204's exact split state, it fails withpinned to 2 different commits: {'cdf488f…': ['codeql.yml: init'], '1c5b675…': ['codeql.yml: analyze', 'scorecard.yml: upload-sarif']}.CHANGELOG.mdentry under## [Unreleased].Verification
uv run ruff checkanduv run ruff format --checkare clean (ruff 0.16.7)uv run mypyis clean (strict)uv run pytestpasses locally (1164 passed, 99.95% coverage on 3.12)CHANGELOG.mdhas an entry under## [Unreleased]uv lock --checkis consistent;dependabot.ymlparses as valid YAMLNotes
mutation.yml. The first nightly run after merge is the real check for it.🤖 Generated with Claude Code
https://claude.ai/code/session_0156bCnW5thBLFaLt7Nvg6d4
Generated by Claude Code
Summary by CodeRabbit
Chores
Tests