Skip to content

Describe the two legs the gate section left out [#326] - #327

Merged
iderex merged 1 commit into
mainfrom
the-two-legs-the-gate-section-omits-326
Sep 16, 2026
Merged

iderex merged 1 commit into
mainfrom
the-two-legs-the-gate-section-omits-326

Conversation

@iderex

@iderex iderex commented Sep 16, 2026

Copy link
Copy Markdown
Contributor

The issue this belongs to

Closes #326

What changed

CONTRIBUTING.md's ## What the gate runs, and what each thing refuses gains an entry for coverage and one for mutation, written in the shape the other legs there are written in: what it refuses, the register where there is one, and the script that holds the rules and the fixtures that prove them.

Adding mutation moves the counted sentence in the same section from three runs that report and refuse nothing to four, and that sentence now also says that the number is a hand count over the entries in this section which no command derives.

What failure it prevents

Neither word appeared anywhere in the file. coverage triggers on every pull request and judges, so a contributor meeting a red coverage had nothing in the document to read about what it wanted - in the section whose whole subject is what each check refuses.

The section opens by warning that its own list goes stale the day a check is added and hands the reader the command that exposes it. The omission therefore stood beside its own diagnosis. It was found by running that command and comparing its output against the legs described below it; nothing reported it.

Evidence

At the base, f597da1aa1d6fb52084689cd34e03ed158ea2389, neither word was in the file:

grep -c -i 'coverage' CONTRIBUTING.md ; echo "exit=$?"
0
exit=1

grep -c -i 'mutation' CONTRIBUTING.md ; echo "exit=$?"
0
exit=1

while both legs were in the tree with a workflow and a script beside it:

git ls-tree -r --name-only origin/main -- .github | grep -E 'coverage|mutation'
.github/coverage/coverage.sh
.github/coverage/pinned-surface
.github/mutation/mutation.sh
.github/workflows/coverage.yml
.github/workflows/mutation.yml

coverage is a check a pull request meets, and its own header says the check verb judges. Read from a clean checkout standing at that commit:

echo "HEAD=$(git rev-parse HEAD) dirty=$(git status --porcelain | wc -l)"
HEAD=f597da1aa1d6fb52084689cd34e03ed158ea2389 dirty=0

sed -n '41,46p' .github/workflows/coverage.yml
on:
  pull_request:
    branches: ["**"]
    types: [opened, synchronize, reopened]
  push:
    branches: [main]

sed -n '33,35p' .github/coverage/coverage.sh
# Verbs:
#   selftest   run every fixture and prove each rule bites
#   check      apply the rules, print the register, measure, and judge

gh api repos/Flowfin/core/commits/main/check-runs --jq '.check_runs[] | select(.name=="coverage") | "\(.name) \(.conclusion)"'
coverage success

mutation gates nothing, which is what the new entry says of it and what the script says of itself:

sed -n '592p' .github/mutation/mutation.sh
  say "This leg gates nothing. A falling score obliges an issue and never a red gate, which is what taking the question off the merge path costs and what paying it looks like."

When it drifted. Both legs landed on 2026-08-27 and the document was opened five times after that without either arriving:

for f in coverage.yml mutation.yml; do git log origin/main --diff-filter=A --format="%h %ad $f" --date=short -- .github/workflows/$f; done
2103858 2026-08-27 coverage.yml
00559cd 2026-08-27 mutation.yml

git log origin/main --format='%h %ad %s' --date=short -5 -- CONTRIBUTING.md
3774826 2026-09-05 State the decision and not why the record exists, for records from now on [#304]
7587fa7 2026-09-05 Measure on the runner which of 0113's triples it can compile C for (#291) (#302)
2939128 2026-09-02 Say publicly why a finding that is not fixed does not apply (#89)
a1fc0ef 2026-09-02 Give a record that narrows one clause of another a shape, and check it (#267)
724407c 2026-09-02 Report a workflow standing red on the default branch (#90)

At the head being pushed, every check-run name reporting on main appears in the file:

git rev-parse HEAD
4396ab1

flat=$(tr '\n' ' ' < CONTRIBUTING.md | tr -s ' ')
gh api repos/Flowfin/core/commits/main/check-runs --jq '.check_runs[].name' \
  | sort -u \
  | while read -r n; do printf '%s' "$flat" | grep -qF "$n" \
      || echo "NOT DESCRIBED: $n"; done
(no output)

The wraps are collapsed first because a check-run name the document wraps mid-name is not a missing entry. Without that step the same loop reports Scorecard analysis as absent, and it is present at line 304 of the base.

bash .github/doc-paths/doc-paths.sh check | tail -1
Every path these documents name resolves against the tracked set.

What a guard here refuses, and the proof it bites

This change adds and edits no guard. It is prose in one document, which is the subject of the section below.

What this does not cover

No mechanism. Nothing in this tree compares the legs this document describes against the legs the tree carries. That is what let two of them land unmentioned and stay that way for twenty days, and a third that lands tomorrow is refused by nothing. This change writes the two entries and no check, and the loop pasted above is a command somebody chose to run rather than anything the gate does.

The count in that section is still a hand count. It says so now, which is the honest version rather than the fixed one: whether a leg reports and refuses nothing is a property of a script, no reading of the tree derives it, and the number will move again the next time a leg of that kind arrives.

Whether mutation belongs in that count at all is a judgement about the sentence's subject. Its issue admitted either answer. This change takes the reading that a leg described in this section which gates nothing is a member, and a reader who disagrees is disagreeing with that sentence rather than with a measurement.

The bar the coverage leg pins is deliberately not pasted into the document, so this change does not put a second copy of that number anywhere. Whether the bar, the pinned surface or the weekly cadence are the right ones is #84's and #85's and is not reopened here.

No code changed and no test was added, because what changed is prose and no code path. The rest of CONTRIBUTING.md is not audited: I compared the check-run names on main against the legs the section describes and read no further than that section and the paragraph above it.

Who has read it

Nobody other than me. There is no second reader on this board tonight, and the evidence above stands in place of one rather than the question being left open.

CONTRIBUTING.md's section on what the gate runs and what each thing refuses
walked every leg but two. Neither the word coverage nor the word mutation
appeared anywhere in the file, and both legs landed on 2026-08-27:

    grep -c -i 'coverage' CONTRIBUTING.md ; echo "exit=$?"
    0
    exit=1

    grep -c -i 'mutation' CONTRIBUTING.md ; echo "exit=$?"
    0
    exit=1

coverage is the one that costs a contributor something. It triggers on
pull_request and on a push to main, its check verb judges rather than reports,
and a red one sent a reader to a document with nothing in it about what the
check wanted. The section's own opening sentence warns that its list goes stale
the day a check is added and hands over the command that exposes it, so the
omission stood beside its own diagnosis for twenty days while the document was
opened five times.

Both entries are written in the shape the others there are written in: what it
refuses, the register where there is one, and the script holding the rules and
the fixtures. Two things are deliberately not restated. The coverage bar is not
pasted here, because a number in a document drifts against the script that
declares it and this file already carries that rule. And neither entry claims
the leg does something this tree does not: coverage judges, mutation gates
nothing, and the second is a placement decided in #85 rather than a gap.

Adding mutation moves a count in the same section, which said three runs report
and refuse nothing. It says four now, and it says in the same breath that the
number is a hand count over the entries in this section which no command
derives - so it is right about what is described here and says nothing about
what the tree carries. That is the second time the number has moved for the
same reason, and the sentence now records both.

It was found by running the command the section already hands the reader and
comparing its output against the legs described below it. Nothing reported it,
and nothing in this tree compares the two, so the next leg that lands
unmentioned is refused by nothing.

    flat=$(tr '\n' ' ' < CONTRIBUTING.md | tr -s ' ')
    gh api repos/Flowfin/core/commits/main/check-runs --jq '.check_runs[].name' \
      | sort -u \
      | while read -r n; do printf '%s' "$flat" | grep -qF "$n" \
          || echo "NOT DESCRIBED: $n"; done
    (no output)

The line wraps are collapsed first because a check-run name the document wraps
mid-name is not a missing entry, and reading the file without that step reports
"Scorecard analysis" as absent while it is there.

    bash .github/doc-paths/doc-paths.sh check | tail -1
    Every path these documents name resolves against the tracked set.

What this does not prevent: nothing in this tree compares the legs this document
describes against the legs the tree carries. Two landed unmentioned and stayed
that way for twenty days, and a third that lands tomorrow is refused by nothing.
This change writes the two entries and no check.

Closes #326

Signed-off-by: Nils Lehnen <30603423+iderex@users.noreply.github.com>
@iderex
iderex merged commit 32a3020 into main Sep 16, 2026
28 checks passed
@iderex
iderex deleted the the-two-legs-the-gate-section-omits-326 branch September 16, 2026 15:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Two legs of the gate are absent from the section that says what the gate runs

1 participant