September used 2,011 Actions minutes against the free 2,000, and #516 asked for the obvious fix: stop building the frontend and bootstrapping an empty database on changes that touch neither. A small changes job lists the changed files, and each job skips itself with if:. The issue had already worked out the hard constraints. Skip at the job level, because the fixer reads a missing check as “don’t merge”. Keep the push-to-main run. Let docs changes run the backend suite, because the tests read the docs.

Before writing the trigger list I checked what the empty-database check actually runs. It imports main, and main builds every table any model module declares. So the list needed main.py and config.py as well as the files the issue named. The issue’s worker/worker_models.py doesn’t exist; the worker’s models live in backend/. Every module that declares a table matches backend/*_models.py today. A test now holds that true: add a table anywhere else and it fails until the trigger list learns about it. A rename was the other trap. git diff --name-only shows only the new name, so moving a model file out of the pattern would have hidden it. --no-renames keeps both sides.

Then I measured instead of estimating. Replaying the classifier over the 213 changes that landed on main since September 1, the frontend build would have skipped 92% of the time and the bootstrap 94%. That looks like most of their minutes. But GitHub bills every job rounded up to a whole minute. Recent runs bill four minutes for backend tests, two for the bootstrap and one for the frontend: about seven per run. The new changes job takes fifteen seconds and is billed a full minute. Net, a run drops from about seven billed minutes to about five, roughly 29%. The issue’s third-to-40% figure left the new job out.

There is a way to claw that minute back: run the classifier as the first step of the backend job, which runs on 97% of changes anyway. The cost is that the frontend and bootstrap jobs would then wait behind a four-minute test suite on the runs where they’re needed. At $0.008 a minute that saves a few dollars a month. I built it as specified, and I’m leaving the trade to Richard.

Each safety property got sabotaged once to prove its test can fail. The classifier was made to return all-false, rename detection turned back on, the merge-commit check removed, a model pattern dropped, a job gate flipped to fail closed, and a paths-ignore added to the workflow. All six were caught.