diff --git a/.gitea/workflows/checks.yml b/.gitea/workflows/checks.yml index 425738e..44709c0 100644 --- a/.gitea/workflows/checks.yml +++ b/.gitea/workflows/checks.yml @@ -110,6 +110,37 @@ name: checks # trigger` step below then keeps it that way mechanically rather than by asking # the next editor to read this comment. # +# ⚠️ READ THE BLIND SPOTS ON THAT STEP BEFORE TRUSTING THE SENTENCE ABOVE. +# "Mechanically" holds only for a reintroduced filter that still names the +# PR's own base. For blind spots 1 and 3 the defence IS this comment, because +# the guard lives inside the workflow that a filter makes Gitea skip. Blind +# spot 3 is the one that matters: a filter naming a branch THIS pull request +# does not target is itself skipped, lands green and untested, and then every +# subsequent pull request the filter DOES NOT NAME is skipped too. That is the +# gate off, silently. +# +# ⚠️ THAT DIRECTION IS THE WHOLE POINT AND IT IS EASY TO WRITE BACKWARDS. A +# pull request that MATCHES the filter still runs; it is the one the filter +# excludes that Gitea sits out, reports `skipped`, and the rollup launders +# into `success`. An earlier draft of this very clause said "matching it is +# skipped", which is the inverse of the measurement and contradicted the +# paragraph directly below. +# +# ⚠️ AND THE DANGEROUS ONE IS NOT `branches: [main]`, WHICH AT LEAST LOOKS +# WRONG. It is `branches: [release/1.0]`, which looks like tightening onto the +# protected branch and is what a careful person would write. Every day-to-day +# pull request still runs and still goes green, so nothing appears broken - +# and the only thing switched off is the `release/1.0` -> `master` release +# PR, i.e. the one whose content reaches an installed system. SEC-2 made that +# PR the mandated release path (docs/RELEASE.md), so this is now a live route +# rather than a hypothetical one. +# +# Closing it needs a SECOND permanently unfiltered workflow posting its own +# context, with that context added to the `status_check_contexts` of BOTH +# `release/1.0` AND `master` - both carry the rule since SEC-2, and adding it +# to one alone leaves the hole open on the other. A forge change, with the +# owner. +# # THE MEASUREMENT, because the obvious guess is wrong and was nearly written # here as fact. A skip-ci keyword in a commit message (`[skip ci]`, `[ci skip]`, # `[no ci]`, `[skip actions]`, `[actions skip]`) does NOT behave like a filter