Skip to content

Say what these two empty registers are worth, not what the tree used to lack - #407

Merged
iderex merged 1 commit into
mainfrom
the-emptiness-these-two-registers-explain-406
Sep 17, 2026
Merged

iderex merged 1 commit into
mainfrom
the-emptiness-these-two-registers-explain-406

Conversation

@iderex

@iderex iderex commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

The issue this belongs to

Closes #406

What changed

The paragraph in .github/lint/excluded-lints and
.github/thread-detector/suppressions that explains why each register is empty now
gives a reading of this tree, anchored to a commit, instead of an absence of code.
Each also says what it claimed before, and the two say it differently, because the
lint sentence drifted and the detector sentence never held.

Both registers stay empty. No rule, fixture, threshold, expression or setting of
either leg changes, and neither script's parser sees anything new: every added line
is a comment.

What failure it prevents

An empty debt register reading as worthless. Both files say of themselves that a
line in them is a debt rather than a dispensation, so what their emptiness is
evidence of is the thing a reader takes away. Empty beside "there is almost no code
here yet" is something a reader discounts. Empty over 17,200 lines of code that the
analyser found nothing to excuse in, and over seventeen files that take a lock or
share an atomic that the detector found nothing to suppress in, is a statement
about the gate. Both files were giving that statement away.

This is a correction and the failure has already happened. What was wrong is the
reason each paragraph gives. How it was found: by re-reading the paragraph in each
register against the tree it describes, after the same class of stale claim was
repaired in #404.

Evidence

Read at a194071f3207d3903f6b40e27feef80aa1ad3d9a, which is the base of this
branch, and the head being pushed is 51a2d01.

The two paragraphs as they stood.

git rev-parse origin/main
a194071f3207d3903f6b40e27feef80aa1ad3d9a
git show a194071f:./.github/lint/excluded-lints | sed -n '12,14p'
# THIS REGISTER IS EMPTY OF ENTRIES TODAY, AND THAT IS A FACT ABOUT THE TREE
# RATHER THAN ABOUT THE RULE. There is almost no code here yet, so nothing has
# had a chance to need an exclusion. The refusal above is proven by the fixtures
git show a194071f:./.github/thread-detector/suppressions | sed -n '19,21p'
# THIS REGISTER IS EMPTY OF ENTRIES TODAY, AND THAT IS A FACT ABOUT THE TREE
# RATHER THAN ABOUT THE RULE. The suite this leg runs holds no code that takes a
# lock or shares a value across threads yet, so nothing has had a chance to need

Every number written into the two files.

git ls-tree -r --name-only a194071f src/ | wc -l
46
git ls-tree -r --name-only a194071f src/ | xargs -I{} git show "a194071f:{}" | grep -vE '^\s*(//.*)?$' | wc -l
17200
git grep -lE 'Mutex|RwLock|Arc<|thread::spawn|AtomicU|AtomicBool' a194071f -- src/ tests/ | wc -l
17
git ls-tree -r --name-only 3b236ce src/ | wc -l
9
git ls-tree -r --name-only 3b236ce src/ | xargs -I{} git show "3b236ce:{}" | wc -l
238

The 17,200 drops blank lines and whole-line comments, so it counts lines that are
neither. It is a floor for what the analyser read, not a measure of it.

That each register is still empty, which is the half of each sentence that
survives.

grep -v '^#' .github/lint/excluded-lints | grep -c . ; echo "exit=$?"
0
exit=1
grep -v '^#' .github/thread-detector/suppressions | grep -c . ; echo "exit=$?"
0
exit=1

That both legs are green at the commit the two readings are anchored to, which
is what makes an empty register a statement rather than a silence.

gh api repos/Flowfin/core/commits/a194071f3207d3903f6b40e27feef80aa1ad3d9a/check-runs --jq '.check_runs[] | select(.name=="thread-detector" or .name=="lint") | "\(.name) \(.status) \(.conclusion)"'
lint completed success
thread-detector completed success

The lint sentence was true and drifted.

git log -S'There is almost no code here yet' --format='%h %ad %s' --date=short a194071f -- .github/lint/excluded-lints
3b236ce 2026-08-25 Analyse the tree with the language's own analyser (#17)

Nine files and 238 lines at that commit, counted above, against 46 files today.

The detector sentence never held.

git log -S'lock or shares a value across threads yet' --format='%h %ad %s' --date=short a194071f -- .github/thread-detector/suppressions
bb128ae 2026-08-26 Run the suite under a thread detector, and prove the detector is on (#117) (#197)
git show bb128ae^:src/measurement/mod.rs | grep -nE 'AtomicU64|Mutex' | head -5
31:use core::sync::atomic::{AtomicU64, Ordering};
259:    next_id: AtomicU64,
286:            next_id: AtomicU64::new(1),
403:    use std::sync::Mutex;
413:        state: Mutex<ControlledState>,
git show bb128ae --stat --format='' | grep -c 'src/measurement/mod.rs' ; echo "exit=$?"
0
exit=1

The first of those is the commit BEFORE the paragraph landed, and the third shows
that the change writing the paragraph did not open that file.

The sibling whose form the two now take.

git show a194071f:./.github/codeql/excluded-rules | sed -n '12,14p'
# THIS REGISTER IS EMPTY OF ENTRIES TODAY, AND THAT IS A FACT ABOUT THE TREE
# RATHER THAN ABOUT THE RULE. The analysis reports nothing against this tree at
# the commit this landed on, so nothing has had a chance to need an exclusion.

Both register parsers still hold, run at this head.

bash .github/lint/lint.sh selftest | tail -1
Every fixture held. The rules the gate applies are the rules these fixtures ran.
bash .github/thread-detector/thread-detector.sh selftest | tail -1
Every fixture held. The rules the gate applies are the rules these fixtures ran.

The paths this change touches.

git diff --name-only origin/main...HEAD
.github/lint/excluded-lints
.github/thread-detector/suppressions

The means. The change is prose inside the comment header of two register
files, in the format those files already are. It adds no language, no runtime and
no dependency.

What this does not cover

  • Whether either register should hold an entry. Nothing here runs either
    analyser looking for one, and both registers are still empty after this change.
  • .github/codeql/excluded-rules and .github/format/unformatted-paths. They
    carry the same paragraph. The first is already anchored and the second's reason
    still holds today; both are read in Two debt registers explain their emptiness by an absence of code the tree no longer has, and one of the two never had it #406 and neither is edited here.
  • Any rule, fixture, threshold, expression or setting of either leg. No run
    behaves differently because of this change. Nothing here adds or edits a guard,
    so this pull request has no section showing one bite.
  • The same sentence in
    docs/decisions/0113-the-target-triples-the-gate-compiles-for.md.
    It is prose
    in a landed record, and whether such a sentence going false because the tree
    moved is inside 0269's subject is the decision 0001 says no check reads a decision record and pastes five workflow files, and a check over docs/decisions/ has run since 2026-09-02 #380 is waiting on. I moved none
    of it.
  • Any other claim in either file. I read the paragraph that explains the
    emptiness. That is a sweep of one paragraph rather than of the two files.
  • The other legs' verdicts. I ran the two selftest verbs above on this
    machine and nothing else. Whether the rest of the gate passes is what this pull
    request's own runs report, and I have not predicted them here.

Who has read it

Nobody other than the author has read this change. 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.

…to lack

.github/lint/excluded-lints and .github/thread-detector/suppressions each say
they hold no entry and give a reason: that there is almost no code here, and that
the suite holds nothing that takes a lock or shares a value across threads. Both
registers are still empty and both refusals still hold; the reasons are what have
gone. Read at a194071, src/ carries 46 files and
17,200 lines that are neither blank nor a whole-line comment, and seventeen files
under src/ and tests/ take a lock, hold an atomic or spawn a thread.

Each paragraph now gives the reading the tree answers with, anchored to a commit
the way .github/codeql/excluded-rules already anchors its own, so the next file
to land does not make either of them wrong again. Each also says what it claimed
before, and the two say it differently because the two defects are different. The
lint sentence was true on 2026-08-25, when src/ held nine files and 238 lines, and
drifted. The detector sentence never held: at the commit before the one that
wrote it, src/measurement/mod.rs already declared a shared AtomicU64 and its test
module already took a Mutex, and the change that wrote the paragraph did not open
that file. Those are different defects and a register header is the only place the
distinction survives, so it is named rather than flattened into the other one.

It prevents an empty debt register reading as worthless. Each file says of itself
that a line in it is a debt rather than a dispensation, so what its emptiness is
evidence of matters. Empty beside "there is almost no code here" is something a
reader discounts; empty over 17,200 lines is a statement about the gate, and both
files were giving that statement away. Found by re-reading the paragraph in each
register against the tree it describes.

No rule, fixture, threshold or setting of either leg changes, and both registers
stay empty.

Closes #406

Signed-off-by: Nils Lehnen <30603423+iderex@users.noreply.github.com>
@iderex
iderex merged commit 28537c6 into main Sep 17, 2026
28 checks passed
@iderex
iderex deleted the the-emptiness-these-two-registers-explain-406 branch September 17, 2026 17:08
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 debt registers explain their emptiness by an absence of code the tree no longer has, and one of the two never had it

1 participant