Run the tests a change can reach.
tap selects tests precisely from the graph — kind(test, rdeps(//…, changed)) — then content-hashes the owned target graph so an unchanged test is skipped at the execution layer via the RBE cache. Flake tracking and culprit-finding come with it.
preview
Precise selection: kind(test, rdeps(//…, changed))Target-graph content-hashing for execution-level skippingFlake tracking + culprit-finding (bisect)Public rules_tap ships a prebuilt CLI — engine stays private
vs folder-based CI
Test what a change reaches. Nothing less, nothing more.
Directory-based selection over-runs trivial changes and misses the far target a graph edge connects.
tomato-bazel tap
package-heuristic CI
Test selection
✓ rdeps + content-hash impact
Guess by folder, or run everything
Graph-breaking change
✓ Selected, with the reason
Silently under-tests
Unchanged test
✓ Skipped at the RBE cache layer
Re-run every time
Flakes
✓ Tracked + culprit-found
Retried and forgotten
One graph, from source to build.
tap is one of 6 services in the tbzl.dev source & build layer — open at the edges, yours at the core.