Repository navigation
fix(ci): three stale action pins, a closed-issue citation, and two guards to catch both recurring - #15347
Conversation
…n, and guard against both recurring (#15332, #15333, #15252) - Bump the two composite-action `actions/cache@v4` pins and one `actions/checkout@v4` workflow pin to the versions already standard everywhere else in the repo (#15332). - Add repo_tests/workflow_action_version_regression_test.py: fails when a tag-pinned action drifts below the version used elsewhere in the repo, and requires every SHA-pinned action to carry a readable `# vX.Y.Z` comment (#15332 AC4, scoped to the low-cost mechanism the issue itself suggested). - Repoint code-quality.yml's four `GH#7105` mypy-suppression citations at #15345 — #7105 is closed and tracked wiring mypy in, not the errors it surfaced (#15333 AC3). - Add repo_tests/workflow_closed_reference_guard_test.py: fails when a workflow comment cites a closed issue as live tracking justification, resolving state via `gh` and skipping visibly (not silently) when it is unavailable (#15333 AC4). Building it surfaced two more pre-existing instances of the same defect (code-quality.yml:258 citing closed #5263, ssot-coverage.yml:172 citing closed #14371); both need a domain judgment call outside this fix's scope, so they are recorded as an exempt pair pointing at #15346 rather than silently passed. - #15252's dead integration-test step was already retired by #15315 (c580893) before this change; verified against the current base, no further action needed here.
✅ SSOT Configuration Compliance: Passing🎉 No new hardcoded values of either class — Known backlog in |
|
Review pass — no blocking defects. Two non-blocking findings fixed on the branch ( 1. 2. The 3. Open risk closed: Both registered runners carry Also confirmed and left alone: the SHA-comment cross-check correctly excludes SHA pins from the version comparison, and |
…ue-15332-ci-actions
Thinking Path
Ground-truthed all three issues against the current tree before touching anything, since the task warned the bodies might be stale:
uses:in.github/workflows/*.ymland.github/actions/*/action.yml. The issue's table was accurate: exactly three stale tag pins (actions/cache@v4× 2 in composite actions,actions/checkout@v4in one workflow), all other tag-pinned actions already consistent. All 44 SHA-pinned occurrences already carry a# vX.Y.Zcomment, so the "low-cost improvement" the issue asked for (comment convention + a guard that reads it) was already half-built — I only needed to add the guard.#7105is closed and cited 4× incode-quality.ymlto justify live mypy suppressions. No open issue tracks the 1281+4133 backlog, so I filed one (tech-debt(ci): code-quality.yml attributes 4133+1281 pre-existing mypy errors to closed #7105 #15345) and repointed the citations at it. AC1 (CONVENTIONS_DENYLISTsecret) is out of scope per the task and untouched.ci.ymlaround the cited line 358 and found the dead step had already been retired byc580893246(PR test(ci): wire 17 uncollected infra/libs tests into CI and name the second edit in the concurrency guard (#15051, #15302) #15315, closing test(ci): 28 tests under autobot-infrastructure/shared/tests and libs/ run in no workflow, and ci.yml's integration step points at a path that does not exist #15051), with the#734citation replaced by an accurate retirement record. The issue itself has a comment confirming 4 of 5 ACs met; AC5 (a general dead-path guard) is explicitly its own remaining scope, not part of this task. No code change needed here — verified only.#Nmention that resolves to CLOSED" and it produced 234 false positives out of 293 resolvable references — most workflow comments cite closed issues historically ("fixed by", "RETIRED", "see #N for why"), not as live justification. Narrowed to the actual shared shape of both known defects:tracked (in|by|for|as) #N. That surfaced two more real instances (code-quality.yml:258→ closed discovery(slm/infra): 59 pre-existing datetime.utcnow().isoformat() / + Z sites in autobot-slm-backend, autobot-slm-agent, autobot-infrastructure #5263,ssot-coverage.yml:172→ closed tech-debt: three separate hardcoded-value detectors have drifted (pipeline-scripts, autobot-infrastructure, pre-commit hook) #14371) which need a domain judgment call outside this PR's scope, so I filed ci(workflows): two more comments cite closed issues as live justification (#5263, #14371) #15346 and exempted them explicitly (with the tracking issue recorded), rather than either silently ignoring them or guessing at a fix.What Changed
.github/actions/setup-python-suite/action.yml:155actions/cache@v4→@v6.github/actions/setup-python-ci/action.yml:176actions/cache@v4→@v6.github/workflows/auto-merge-base-into-parked-branches.yml:79actions/checkout@v4→@v7.github/workflows/code-quality.yml:500,503,511,516GH#7105→GH#15345(new issue tracking the actual mypy backlog; #7105 tracked wiring mypy in, not the errors it found)repo_tests/workflow_action_version_regression_test.py(new)# vX.Y.Zcomment. Deliberately does not cross-check SHA-pinned versions against each other —docker/login-action,docker/build-push-action, andsigstore/cosign-installerare genuinely pinned to different releases in different workflows today, pre-dating this change, and resolving that is out of scope.repo_tests/workflow_closed_reference_guard_test.py(new)tracked ... #Ncitation resolves (viagh api graphql, batched) to a closed issue/PR. Skips visibly viapytest.skipwhenghis unavailable or unauthenticated. Vacuity floor of 3 distinct citations. Carries a two-entry, reasoned exemption for the newly discovered #5263/#14371 citations, pointing at #15346.New issues filed: #15345 (mypy suppression backlog, replaces #7105 as the citation target), #15346 (two more closed-citation instances found while building the guard, out of this PR's scope to fix).
Verification
python3 -m pytest repo_tests/ -q -k "workflow or action_version or closed_reference or ci_"→ 315 passedworkflow_closed_reference_guard_test.pyrun twice: once withghonPATH(resolves live, both tests pass, zero violations after the two documented exemptions), once withghremoved fromPATH(main test SKIPPED with a visible reason, vacuity-floor test still passes independently)black --check,isort --check-only,flake8clean on both new files; both files well under the 30-line function cap (largest is 27 lines) and the 600-line file-size ceilingyaml.safe_loadafter the editsgit pushsucceeded through the local pre-push pytest gate (ran exactly these two new test files)gh issue viewthat ci: mypy is installed but never invoked — silent-tuple bug from #7078 would have been caught #7105, discovery(slm/infra): 59 pre-existing datetime.utcnow().isoformat() / + Z sites in autobot-slm-backend, autobot-slm-agent, autobot-infrastructure #5263, tech-debt: three separate hardcoded-value detectors have drifted (pipeline-scripts, autobot-infrastructure, pre-commit hook) #14371 are CLOSED and security(deps): chromadb 1.5.9 carries 4 known advisories — the entire Python dependency backlog #15052, bug(test): the backend conftest Redis stand-in blocks every integration test from the real Redis the marker suite provides #14932, ci: a merge to Dev_new_gui can land with no required context on the head it merges #15107 are OPEN, matching the guard's live resolutionWhat the issues claimed that turned out false / already resolved
Model Used
Claude Sonnet 5 (model ID: claude-sonnet-5)
Refs #15332 — the three named Node-20 pins are fixed and the SHA-comment invariant is now enforced, but cross-checking SHA-pinned versions against each other is deliberately out of scope (three actions are pinned to genuinely different releases today; picking a canonical one needs an owner decision). Also Refs #15333, #15252.