Repository navigation
fix: derive the preflight matrix from every CI workflow - #984
thekevinbot wants to merge 3 commits into
Conversation
preflight reads one workflow file, `.github/workflows/conventions.yml`, which #861 deleted when it split that file into one workflow per domain. `just preflight` -- the command AGENTS.md mandates before every push -- has been dying with FileNotFoundError ever since. These assert the shape the fix needs: parse_gate_matrix takes the set of workflow documents rather than one, and the CLI globs the workflow directory (sorted, so the report does not depend on readdir order). skip-changelog: internals/ is not a published package root Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KcNqe44kvgP5mBRr9LjQcE
#861 split conventions.yml into one workflow per domain, but preflight still opened that single deleted file, so `just preflight` raised FileNotFoundError instead of running a gate. parse_gate_matrix now folds the callers across every document, and the CLI globs .github/workflows for them. Documents that call the reusable workflow nowhere -- release, docs, the gate itself -- contribute nothing rather than raising on a missing `jobs:` key. Restores all 8 scan roots and 40 pairs. skip-changelog: internals/ is not a published package root Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KcNqe44kvgP5mBRr9LjQcE
|
Closing as a duplicate of #983, which is the earlier PR and tracked by the earlier issue (#973, filed an hour before mine). I hit the same #983 is the better patch, independent of who was first. Its tests read the repo's real workflow files at the integration and e2e tiers, and it wires One thing from here worth folding in if it isn't already covered: the #981 closed as a duplicate of #973. #932's docs PR (#985) is unaffected and now sits directly on Generated by Claude Code |
Fixes #981
just preflight— the command AGENTS.md mandates before every push — has been dying withFileNotFoundErrorsince #861. It hard-coded.github/workflows/conventions.yml, which that PR deleted when it split the eight caller jobs across six per-domain workflows.It is local-only tooling, so no gate went red. Its own unit test was the thing that should have caught it and didn't:
test_defaults_to_the_ci_workflow_and_mainasserted the default equals the literal stale path, pinning the wrong value instead of checking a file exists there.What changed
parse_gate_matrixnow takes the set of workflow documents rather than one, and the CLI globs.github/workflows/*.yml(sorted, so the matrix and the failure report don't depend on readdir order). A document that calls the reusable workflow nowhere — release, docs, the gate itself — contributes nothing rather than raising on a missingjobs:key.The derivation is now reshuffle-proof in a way the old one wasn't: a lane added in a new per-domain file is a pair
preflightruns, with no constant to update.Restores all 8 scan roots / 40 pairs (37 run + 3 artifact-skips).
Manual verification
All eight roots present:
python-sdk,rust-python-binding,typescript-sdk,rust-napi-binding,rust,internals-checks,internals-distcheck,plugins-embeddings.Red/green
test:andfix:are separate commits in that order. CI was not observed red, because the red commit was pushed before this PR existed and every workflow here ispull_request-triggered — so nothing ran on it. The 16 failing tests were confirmed locally at8aa77d6(16 failed, 42 passed), failing on the absent multi-document API rather than incidentally.Gates run locally
internals/checksunit suite: 313 passed, coverage 100.00% (floor 100)unit mutation(diff-scoped,--base origin/main): 0 survivors / 9 mutants. One survived the first pass —ReplaceContinueWithBreakatmatrix.py:90— because my fixture refactor had moved the non-caller job to the end of its document, makingcontinueandbreakindistinguishable. Killed with a new assertion that puts a caller on both sides of it, not by weakening anything.unit colocated-test,unit lint: passE2E Verification
packages/pythonchangepackages/tschangepackages/rustchangepackages/python/e2e-attestation.jsonrefreshed ifpackages/pythonchanged — N/Apackages/ts/e2e-attestation.jsonrefreshed ifpackages/tschanged — N/Acd internals/checks && uvx testing-conventions e2e attest 'uv run python -m pytest tests/e2e -x -q'internals/checksis the package this PR changes; its receipt is refreshed as the last commit touching the package, ande2e verify --scope internals/checks/srcexits 0.Changelog / Migrations
internals/is not a published package root, and every commit carries askip-changelog:reasonNo
PARITY.mdchange — no SDK public API touched.🤖 Generated with Claude Code
https://claude.ai/code/session_01KcNqe44kvgP5mBRr9LjQcE
Generated by Claude Code