Skip to content

D994 — CI path filters are a tested table, and nothing runs twice

Decision. Which slow CI jobs a PR runs is decided by scripts/ci-filters.sh, a table fed with the changed paths and pinned by internal/repodocs/ci_filters_test.go, not by regex inline in ci.yml. web skips _test.go files and the packages bin/cartographer cannot import (internal/{changelog,repodocs,testkbs,webui/gen}, compared with go list -deps by the test); demo-edge is a job of its own for the demo Worker and its Terraform; the docs workflow ignores web/e2e/**; every Makefile target is run by a workflow or declared local in a test.

Why. Every Go change ran Playwright on two runners although the browser suite drives only the binary, a Worker-only PR skipped its tests, and A filter nobody tests drifts silently; a test that compares the exclusion list with the import graph breaks when a package starts or stops reaching the binary.

Alternatives rejected. Keeping the regex inline in ci.yml: not testable without GitHub. Excluding all of internal/ tests and Go from windows too: cmd/ and the platform packages carry the platform code, so windows is kept and only pinned. Limiting privacy to push on main: a branch pushed without a PR would go unscanned. Splitting the release-please action in two so the release PR gets one CI run: WP3 moved to #999.

Consequences. A new internal/ package that the binary does not import must be added to not_in_binary in the script, or the test fails with that instruction. Narrowing never removes a check from main, where every job runs.