Skip to content

Say how much shell this gate is written in by reading the tree, not a count - #411

Merged
iderex merged 1 commit into
mainfrom
the-count-of-shell-legs-this-gate-states-410
Sep 17, 2026
Merged

iderex merged 1 commit into
mainfrom
the-count-of-shell-legs-this-gate-states-410

Conversation

@iderex

@iderex iderex commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

The issue this belongs to

Closes #410

What changed

Three sites said two of this gate's legs are shell scripts: the first sentence of
.github/workflows/shell-analysis.yml, the first paragraph of
.github/shell-analysis/shell-analysis.sh, and the shellcheck row in
docs/gate-parity.md. Two paragraphs further down in the script rested on the
same two - the arrangement "the other two legs use", and "both scripts here read
paths and pull-request bodies". All five sentences now say what the tree holds
instead, which is that most of this gate is written in shell and that the leg
analyses every tracked shell file.

No number replaces the two. Each site hands the reader git ls-files '*.sh' and
says what it claimed, when that stopped being true and how it was found. That is
the answer README.md already takes for its own counts, in its own words: a
number in a file that nothing reads goes stale a second time.

Every added line is a comment or a table cell. No severity, exclusion, rule,
register entry, fixture or setting of this leg moves.

What failure it prevents

A check understating its own reach in the sentence a reader opens it on. The
first paragraph is where somebody decides whether the shell this gate runs is
covered, and two of twenty-two reads as a leg pointed at a named pair. That sends
a reader looking for a gap that is not there, and it would run the other way the
moment a shell file stopped being tracked, because a reader holding the number
two has no reason to ask what the tracked set is.

This is a correction and the failure has already happened. What was wrong: three
files stating a population of two shell legs. How it was found: by reading the
first paragraph of the script against the paragraph forty lines below it, which
already said the authority for what is analysed is the tracked set.

Evidence

Read at 30578fe69978351a9d6610c66fe7fa6d8117a65c, which is the base of this
branch. The head being pushed is 636162d.

The sentences as they stood.

git rev-parse origin/main
30578fe69978351a9d6610c66fe7fa6d8117a65c
git show 30578fe6:./.github/workflows/shell-analysis.yml | sed -n '1,2p'
# The shell this gate runs is analysed (#81). Two of this gate's legs are shell
# scripts, they read paths and pull-request bodies, and until this landed nothing
git show 30578fe6:./.github/shell-analysis/shell-analysis.sh | sed -n '4p'
# Two of this gate's legs are shell scripts and nothing read them for defects. The
git show 30578fe6:./.github/shell-analysis/shell-analysis.sh | sed -n '11,12p'
# refused and why, and the fixtures that prove both of those bite. That is the same
# arrangement the other two legs use: `selftest` and `check` reach the analyser
git show 30578fe6:./.github/shell-analysis/shell-analysis.sh | sed -n '25,26p'
# on whitespace and refused valid work for it. Both scripts here read paths and
# pull-request bodies, which are exactly the inputs that carry a space.
git grep -c "two of this gate's own legs are shell scripts" 30578fe6 -- docs/gate-parity.md
30578fe6:docs/gate-parity.md:1

What the tree holds, and every one of them under one directory.

git ls-tree -r --name-only 30578fe6 | grep -c '\.sh$'
22
git ls-tree -r --name-only 30578fe6 -- .github | grep -c '\.sh$'
22

What the leg is pointed at.

git show 30578fe6:./.github/shell-analysis/shell-analysis.sh | sed -n '49,51p'
# `check` reads the repository through `git ls-files`, so the authority for what is
# analysed is the tracked set. A file present on disk and not added is not a file
# this gate runs.
git show 30578fe6:./.github/shell-analysis/shell-analysis.sh | sed -n '77,80p'
# Every tracked shell file.
shell_files() {
  git ls-files '*.sh'
}

So one header states a population of two and a reach of the whole tracked set,
about the same check, forty lines apart.

It was true for three days.

git log --diff-filter=A --format='%h %aI %s' 30578fe6 -- .github/workflows/shell-analysis.yml
6587b1e 2026-08-22T06:42:15+02:00 Analyse the shell this gate is written in
git ls-tree -r --name-only 6587b1e -- .github | grep '\.sh$'
.github/doc-paths/doc-paths.sh
.github/pr-hygiene/hygiene.sh
.github/shell-analysis/shell-analysis.sh
git log --diff-filter=A --format='%h %aI' 30578fe6 -- .github/lint/lint.sh
3b236ce 2026-08-25T07:35:48+02:00

doc-paths.sh reads paths and hygiene.sh reads pull-request bodies, which is
exactly what the sentence said of them. The fourth arrived three days later, and
no change that added one had a reason to open a comment in another leg.

The claim the script's middle paragraph now makes, checked. It says the
arrangement is every other leg's but one helper that judges nothing:

git grep -l '^selftest()' 30578fe6 -- '.github/**/*.sh' | wc -l
21
for f in $(git ls-tree -r --name-only 30578fe6 -- .github | grep '\.sh$'); do
  git grep -q '^selftest()' 30578fe6 -- "$f" || echo "$f"
done
.github/headless/enter.sh

Nothing is left saying two.

git grep -n -iE "two of (this|the) gate'?s( own)? legs" 636162d -- . ; echo "exit=$?"
exit=1

What ran here

bash .github/doc-paths/doc-paths.sh check | tail -1
Every path these documents name resolves against the tracked set.
bash .github/format/format.sh check | tail -1
Every tracked source file above is written the way the formatter would write it.
bash .github/decision-records/decision-records.sh check | tail -1
Every narrowing these records declare is named from both ends.

The leg this change is about did NOT run on this machine, and this is not a
green tick for it.
shellcheck is not installed here, and the script exits at
its first fixture without it:

bash .github/shell-analysis/shell-analysis.sh check 2>&1 | tail -2
::error::The fixture was refused, but not for the rule this check exists for. What it said:
.github/shell-analysis/shell-analysis.sh: line 152: shellcheck: command not found

Its verdict on this branch comes from the run the pull request triggers. The
change touches only comment lines in that script, so nothing it analyses moves,
but that is a reading of the diff rather than a run of the analyser.

What this does not cover

  • Whether every one of the twenty-two is a leg. Some are invoked by a
    workflow and some by another script. No count replaces the two, so the question
    does not have to be answered to land this, and it is not answered here.
  • The eight waiting rows in docs/gate-parity.md. Two of this board's three waiting labels describe a meaning the vocabulary does not have, and the fourth label is absent #321 and Eight parity rows wait on a register that closed with every entry answered #377 hold what
    those take. The row touched here is a satisfied one and only the clause naming
    the count moves.
  • Any other claim in either shell-analysis file. I read the paragraphs
    carrying the count and the paragraph naming what check is pointed at. That is
    a sweep of one claim rather than of the two files.
  • The same shape in the other legs' headers. A count of the tree typed into a
    script comment is read by nothing here - .github/doc-paths/doc-paths.sh
    prints on every run that a tracked file which is not .md is outside what it
    reads - and how many other sites carry one is a sweep this change does not
    make.
  • A second reader. There was none available for this change, and the evidence
    above stands in place of one.

… count

Closes #410

The shell-analysis workflow file, the script's own header and the parity row
describing that leg each opened by saying two of this gate's legs are shell
scripts. That was the tree on 2026-08-22, the day the leg landed, when it held
those two legs and the analyser beside them. The tree holds twenty-two tracked
shell files now, and `check` reads every one of them through `git ls-files`, so
each of the three understated the reach of the check it introduces by an order of
magnitude in the first sentence a reader meets.

No number replaces the two. A count in a comment here is read by nothing that
could say when it went stale, which is how this one survived nineteen arrivals,
so each site now hands the reader `git ls-files '*.sh'` and says what it claimed,
when that stopped being true and how it was found. The same answer README.md
already takes for its own counts.

What was wrong: three sites stating a population of two shell legs. How it was
found: by reading the first paragraph of the script against the paragraph forty
lines below it, which already said the authority for what is analysed is the
tracked set.

What survives unchanged: the analysed set and the executed set had come apart in
the language the checks are written in, the defect class that made this worth a
leg is an expansion left unquoted, and the inputs these scripts read carry spaces.
No severity, exclusion, rule, register entry, fixture or setting of this leg moves,
and every added line is a comment or prose.

Signed-off-by: Nils Lehnen <30603423+iderex@users.noreply.github.com>
@iderex
iderex merged commit 675a197 into main Sep 17, 2026
28 checks passed
@iderex
iderex deleted the the-count-of-shell-legs-this-gate-states-410 branch September 17, 2026 18:43
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.

Three sites say this gate has two shell legs, and the leg that says it analyses every tracked one of twenty-two

1 participant