ci: gate canonical standard.mk, and unblock PRs in the repo that hosts it - #11
Merged
Conversation
…s it Two defects found while validating this repo against the process it now documents. **1. Every PR here is unmergeable.** The `main` ruleset requires a status check named `CI passed`, and the only workflow (`mirror.yml`) has no `pull_request` trigger and reports no such check — so the required check can never arrive. The single merge path is an org-admin bypass, which is a required check that gates nothing: this project's own thesis pointed at its own infrastructure. That matters more here than anywhere else, because canonical `standard.mk` lives in this repo, so *every future change to the standard* has to come through a PR that cannot merge. Same shape, and same fix, as just-buildit/.github#4. Self-bootstrapping: `pull_request` workflows run from the merge ref, so the PR adding this check is the first one gated by it. **2. The new README contradicted the standard on where local targets live.** It said repo-only targets "go in `local.mk`", but `standard.mk`'s own comment says "in the Makefile or local.mk", the plan's criterion 1 explicitly permits "config + genuinely local targets" in the Makefile, and the reference adopter puts all 26 of its own targets there and passes every gate. Corrected to say what actually matters: naming them in `LOCAL_TARGETS`. **The CI is not a rubber stamp.** A broken publish here does not fail here — it fails in every adopter at once, the moment they re-vendor, because their `make lint` fetches this file with no cache. So the job checks the three things that would cost that: * the file still fails CLEANLY with the config surface unset (asserting on the message, since a syntax error and a deliberate `$(error)` look alike to make); * every feature group still defines its targets, with all nine flags on (>=38); * its own gates pass on a clean tree AND fail on a sabotaged one — a ghost-check that cannot catch a rule-less `.PHONY` is exactly the failure this standard exists to prevent. Plus, on `main` only, that Pages serves what is committed — the drift gate's question asked from the other side. All four verified locally against the published file before committing: the unset-config case errors naming `TEST_CMD`, all-flags-on lists 40 targets, the clean tree passes both gates, and the sabotaged tree fails naming `ghosty`.
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.
Validating this repo against the process it now documents turned up two defects.
1. Every PR here is unmergeable
The
mainruleset requires a check namedCI passed; the only workflow (mirror.yml) has nopull_requesttrigger and reports no such check, so it can never arrive. The only merge path is an admin bypass — a required check that gates nothing.That matters most here, because canonical
standard.mklives in this repo: every future change to the standard has to arrive through a PR that cannot merge. Same shape and fix as just-buildit/.github#4, and self-bootstrapping —pull_requestruns from the merge ref, so this PR is the first one gated by its own check.2. The README contradicted the standard
It said repo-only targets "go in
local.mk". Butstandard.mk's own comment says "in the Makefile or local.mk", the plan's criterion 1 explicitly permits "config + genuinely local targets" in the Makefile, and the reference adopter keeps all 26 of its own targets there with every gate green. Corrected to say what actually matters: naming them inLOCAL_TARGETS.The gate is not a rubber stamp
A broken publish here doesn't fail here — it fails in every adopter at once, the moment they re-vendor, because their
make lintfetches this file with no cache. So the job checks the three things that would cost that:$(error)look alike to makeghost-checkthat can't catch a rule-less.PHONYis the exact failure this standard exists to preventPlus, on
mainonly: Pages serves what is committed — the drift gate's question asked from the other side.All four verified locally against the published file before committing: the unset-config case errors naming
TEST_CMD; all-flags-on lists 40 targets; the clean tree passes both gates; the sabotaged tree fails namingghosty.