ci: wire coco-dev-versions and import-specifiers drift checks into ci.yml - #9986
Conversation
….yml Both checks live in test:ci but no GitHub Actions job ran either, so each could silently diverge with zero CI signal -- the same local-only-until-now gap the surrounding drift steps close. Two specifier drifts (JSONbored#9240, JSONbored#9249) already reached main this way while import-specifiers:check stayed local-only. Add a cocoDev path filter (k8s/coco-dev/**, scripts/check-coco-dev-versions*.ts), wire it into validate-code's job-level if, and add the two checks as named steps gated the same way as the surrounding drift checks. Also add a real-tree regression assertion to check-import-specifiers-script.test.ts so the guard is enforced by vitest itself, not the workflow step alone. Closes JSONbored#9649
|
Warning ⏸️ LoopOver review result - manual review recommendedReview updated: 2026-07-31 04:27:36 UTC
Review summary Nits — 6 non-blocking
Decision drivers
Context & advisory signals — never blocks the verdict
Linked issue satisfactionAddressed Review context
Contributor next steps
Signal definitions
🧪 Chat with LoopOverAsk LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.
Full command reference: https://loopover.ai/docs/loopover-commands 🧪 Experimental — new and may change. Decision record
🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.
|
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #9986 +/- ##
=======================================
Coverage 91.88% 91.88%
=======================================
Files 928 928
Lines 113722 113722
Branches 27436 27436
=======================================
Hits 104489 104489
Misses 7936 7936
Partials 1297 1297
Flags with carried forward coverage won't be shown. Click here to find out more. |
Summary
Two checks in
test:ci—coco-dev-versions:checkandimport-specifiers:check— had no GitHub Actions job running them, so each could silently diverge with zero CI signal.import-specifiers:check(#9221) already had this happen twice (#9240, #9249). This wires both intoci.yml.Five prior attempts on this issue
Five different contributors already opened PRs against this exact issue (#9894, #9913, #9927, #9928, #9929) — all closed, none merged. I looked into why before writing this one:
test:cidrift checks are never executed by any GitHub Actions job #9929 were each auto-closed forCI is failing (Superagent Supply Chain Scan), despite each PR's own review explicitly rating that signalNot blocking (Advisory). All three inserted the two new steps right after the existing "Branding drift check" step — a position beforevalidate-code's fiveactions/cache/restore/actions/cache/savesteps. That shifts those steps' position in the job's step array, and Superagent's scanner then flags the unchanged, already-repo-standard cache action as a "newly added risky dependency" — a false positive (a maintainer comment on unrelated PR ci(verifiability): verify our own public claims nightly, as an outsider #9973 describes the identical mechanism, and confirms it doesn't block an owner PR, but a contributor PR's auto-close heuristic acts on the raw "CI failing" signal regardless of the review's own advisory verdict). This PR instead adds both new steps at the very end ofvalidate-code— afterUpload UI bundle stats to Codecov, its current last step — which is after every cache step in the job, so nothing's position shifts.if: cocoDevgate but never addedcocoDevtovalidate-code's own job-levelif:, so a PR touching onlyk8s/coco-dev/**would skip the whole job. This PR addscocoDevinside the job-level condition's innermost parenthesized OR-group (verified the exact paren placement matters: appending it outside the draft-check wrapper instead would silently make a draft PR touching onlyk8s/coco-dev/**skip the draft-check bypass and run the whole heavy job unconditionally —ci-skip-draft-prs.test.tsonly does substring checks, so it wouldn't catch that mistake).What changed
.github/workflows/ci.yml: newcocoDevfilter output (k8s/coco-dev/**,scripts/check-coco-dev-versions*.ts), added tovalidate-code's job-level gate, plus two new named steps at the end of that job, each carrying a comment naming the gap it closes, matching the "Dead source-file check" step's shape as the issue specifies.import-specifiers:check's gate uses the issue's literal condition string verbatim (I confirmed by readingscripts/check-import-specifiers.tsthat itsNODENEXT_ROOTSscan technically also coverspackages/loopover-ui-kit, gated only by the separateuifilter — but the issue's Deliverable 3 points at a byte-precise condition string, and this repo has precedent for exact-match tests on stepif:strings in this file, so I kept the literal text rather than risk an unrequested deviation).test/unit/check-import-specifiers-script.test.ts: a real-tree regression test callingfindImportSpecifierViolations()with no injected fakes, asserting[], citing chore(imports): packages/loopover-ui-kit drifted from #9221's extension convention (introduced by #9239) #9240/chore(imports): test/unit/engine-coverage-script.test.ts drifted from #9221's extension convention (introduced by #9245) #9249 — mirroringcheck-coverage-bolt-on-filenames-script.test.ts:51's exact shape.Validation
npm run actionlint— clean.npm run lint:composite-actions— clean (this PR touches no.github/actions/**content, so it's a no-op check here).npx vitest run test/unit/check-import-specifiers-script.test.ts test/unit/ci-skip-draft-prs.test.ts test/unit/observability-ci.test.ts test/unit/ci-engine-miner-filters.test.ts test/unit/ci-dependency-cache.test.ts— all pass, including the new real-tree test.npm run test:ci— green except two pre-existing failures intest/contract/validate-mcp.test.ts(a stdio MCP contract test hitting its 180s timeout under this run's system load) that are unrelated to this diff — confirmed by stashing this PR's changes and re-running that file alone against the clean tree: it passed (163s, just under the timeout), reproducing the same marginal timing flake with zero relation toci.ymlor the import-specifiers test.Expectation
.github/workflows/**is a hard guardrail path, so this PR will be held for manual review, not auto-merged, regardless of how clean CI comes back — that's the correct, expected outcome for a workflow change here, not a failure signal.Closes #9649