Repository navigation
ci: run the Tools suites that read product source on every change, and filter only the leg that does not - #2451
Merged
Merged
Conversation
…d filter only the leg that does not `tools-python.yml` carried a `Tools/**` path filter, so a change touching no Python never ran it. Its own header already argued against that, in detail: the core Tools/ suites assert on the CONTENTS of app and package files, `test_home_i18n.py` reads TodayScreen.kt, AppModel.swift and the xcstrings catalogues, and a Swift-only commit had already broken it once while the filter kept the job from running, leaving main red until an unrelated contributor touching Tools/ tripped over it in their own PR (#1691). The filter was reinstated underneath that paragraph anyway, for a reason that was sound on its own terms: a Windows runner billed at twice a Linux minute should not run on the many pull requests that touch no Python. It then cost the same thing a second time. On 2026-09-24 an Android-only commit changed the hero label padding that `test_home_i18n.py` asserts on, this job did not run, and main carried a red suite through nine merges until a commit that happened to touch Tools/ finally tripped it. One of those nine was an outside contributor's. So the two legs are split rather than the argument had a third time: tools-python.yml UNFILTERED. Runs the Tools/linux-capture decoders AND the core Tools/ suites, and the core suites read product source, so no path list can describe its inputs. Ubuntu, about 25 seconds, every PR and every push. tools-python-windows.yml FILTERED on Tools/linux-capture/**. Runs ONLY the linux-capture tests, a second time under legacy Windows console encodings, and those read nothing outside their own package. The cost argument is true here and is answered here. Job names are unchanged, `linux-capture` and `windows-capture`, so the check names are too. `test_core_tools_filter_covers_every_governance_tool_path` pinned the old filter exactly, so it is repinned to the new shape rather than dropped: the core workflow must carry NO path filter and must still run the core Tools/ step, and the Windows workflow must carry exactly the linux-capture filter and must NOT run the core step. Reinstating `Tools/**` on the core leg now reds it, which is what the last two rounds of this lacked. Parity governance is left alone. Its filter is deliberate, there is a test asserting it excludes product globs, and it already carries a daily schedule on main for exactly the staleness a filter cannot see. Three documents described this and two of them were already describing the state this restores, not the state that shipped. CONTRIBUTING.md's check table said `linux-capture` runs on "every PR", and docs/CONTRIBUTING.md said `source-hygiene`, `tools-python` and `i18n-coverage` "have no path filter, so all three run on everything". Both were false under the filter: contributors were told a gate covered them while it was silent. They are true again now. AGENTS.md was the one that was accurate, "active, path-filtered", and it is updated, along with a row for the new Windows workflow that its table had never carried. CONTRIBUTING.md's table gains the `windows-capture` check it had never listed either. Core Tools suite 130 tests, no failures. Governance acceptance 49 tests, no failures.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
tools-python.ymlcarried aTools/**path filter, so a change touching no Python never ran it.The workflow already argued against its own filter
Its header says, verbatim:
And the
on:block directly below it re-addedpaths: ['Tools/**'].The reason it was re-added was sound on its own terms: a Windows runner billed at twice a Linux minute should not run on the many pull requests that touch no Python. The remedy was not, because it silenced the Linux leg too, and the Linux leg is the one that reads product source.
It then cost the same thing a second time. On 2026-09-24 an Android-only commit changed the hero label padding
test_home_i18n.pyasserts on, this job did not run, and main carried a red suite through nine merges until a commit that happened to touchTools/finally tripped it. One of those nine was an outside contributor's.The split
pathsis workflow-level, not job-level, so one filter had to serve two jobs with different inputs. They are now two workflows:tools-python.ymlTools/linux-capturedecoders and the coreTools/suitestools-python-windows.ymlTools/linux-capturetests, under legacy Windows console encodingsTools/linux-capture/**: those tests read nothing outside their own package, so the cost argument is true here, and answered here.Job names are unchanged,
linux-captureandwindows-capture, so the check names are too.The test that pinned the old filter
test_core_tools_filter_covers_every_governance_tool_pathasserted the old paths exactly. Repinned to the new shape rather than dropped:Tools/stepReinstating
Tools/**on the core leg now turns it red, verified by doing so. That is what both previous rounds of this lacked: the header said what should be true and nothing enforced it.Parity governance is deliberately untouched
Its filter is intentional, a test asserts it excludes product globs, and it already carries a daily schedule on main for exactly the authority staleness a path filter cannot see. I had earlier described it as silently skipped; that was wrong, and the schedule is why.
The documentation was already describing the state this restores
Two contributor-facing docs asserted the unfiltered behaviour while the filter was in place:
CONTRIBUTING.mdcheck table:linux-capture… every PRdocs/CONTRIBUTING.md:source-hygiene,tools-pythonandi18n-coveragehave no path filter, so all three run on everythingBoth were false under the filter. That is worse than the header contradiction, because contributors were told a gate covered their change while it was silently skipped. Both are true again now, with no edit needed.
AGENTS.mdwas the one that was accurate ("active, path-filtered") and is updated, plus a row for the new Windows workflow its table never carried.CONTRIBUTING.md's table gains thewindows-capturecheck it never listed either. Yesterday a staleAGENTS.mdworkflow row sent three contributors chasing the wrong thing, which is why these were checked rather than left.Testing
Core Tools suite 130 tests, no failures. Governance acceptance 49 tests, no failures. The repin mutation-tested by reinstating the filter.