Skip to content

Read 0291's fourth reversal condition as a price paid rather than as a trigger - #510

Merged
iderex merged 1 commit into
mainfrom
af01-core/reversal-condition-price-already-paid
Sep 18, 2026
Merged

iderex merged 1 commit into
mainfrom
af01-core/reversal-condition-price-already-paid

Conversation

@iderex

@iderex iderex commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

What changed

docs/decisions/0351-the-condition-that-counts-this-board.md is added. It reads
0291's fourth reversal condition as a price this board has already paid rather
than as a trigger that can fire, and says why the count that condition names has
a floor of one. 0291 gains the Narrowed-by: field 0267 requires in the other
direction, and docs/decisions/README.md gains the index line.

It goes further than 0291 rather than editing it. Rewording what would reverse a
landed record is not one of the edits 0001 allows, and #351's own done-condition
asks for a record for that reason.

The specific failure it prevents

A reader of 0291 meets four reversal conditions and has no way to tell that one
of them cannot happen. Taking it for a trigger means waiting for a state this
board does not produce, which is the failure the condition was written against
arriving through the condition itself. Noticing that it cannot fire means
re-deriving the chain behind #98, the label history and the reason of
2026-08-22 from the tracker, which is an hour of reading that ends where the
record now is.

Evidence

Read on 2026-09-18 at the mainline this branch is cut from,
243f6e1.

The condition, as it stands in the record:

git show origin/main:docs/decisions/0291-the-provider-the-socket-waits-on.md | sed -n '226,232p'
The count of open issues on this board that can be worked without a request
reaches zero. The wait is then the whole of this board's throughput rather than
one milestone's, which is a different price from the one weighed above, and the
choice is retaken against it:

    gh issue list --repo Flowfin/core --state open --limit 500 --json number,labels \
      --jq '[.[] | select([.labels[].name] | map(startswith("blocked-on-")) | any | not)] | length'

What that command answers, and who is in the set:

gh issue list --repo Flowfin/core --state open --limit 500 --json number,labels \
  --jq '[.[] | select([.labels[].name] | map(startswith("blocked-on-")) | any | not)] | length'
8
gh issue list --repo Flowfin/core --state open --limit 500 --json number,title,labels \
  --jq '[.[] | select([.labels[].name] | map(startswith("blocked-on-")) | any | not)] | sort_by(.number) | .[] | "#\(.number) [\([.labels[].name]|join(","))] \(.title)"'
#86 [security,ci,tests] Fuzz the parsers, and replay the seed corpus inside the gating build
#88 [ci,tests] Build and test against the oldest server surface the core claims to support
#94 [ci,release] Build and publish the release artifacts, reproducibly
#98 [documentation,planning] The plan for this repository, in build order, and what it leaves out
#104 [tests] Keep the recorded fixtures honest against a real server
#291 [ci,decision] Decide how the target leg compiles the crypto provider 0243 brings, or which triples leave 0113
#351 [documentation,decision] 0291's fourth reversal condition has one member left, and no state of this board takes it to zero
#385 [documentation,decision] 0039's fourth reversal condition is met by 0272, and the module that carries the reads still gives the absence it rested on

#98's first exit, closing, is downstream of the wait:

gh issue view 98 --repo Flowfin/core --json body --jq .body | grep -A1 'The first release in M11'
The first release in M11 exists and an operator has run the probe against their
own server. Until then this issue stays open as the entry point to the board.

for n in 92 39 27 291; do printf '%s\t' "$n"; gh api "repos/Flowfin/core/issues/$n/comments?per_page=100" --paginate --jq '[.[] | .body | split("\n")[0] | select(startswith("Waiting for:"))] | last'; done
92      Waiting for: Flowfin/core#39
39      Waiting for: Flowfin/core#27
27      Waiting for: Flowfin/core#291
291     Waiting for: act - a pure-Rust crypto provider for `rustls` reaching a release the target leg compiles on every triple in 0113's set (upstream). Unchanged, and re-read below rather than carried over.

Its second exit, a blocked-on- label, was applied and removed twice and argued
shut on the issue itself:

gh api repos/Flowfin/core/issues/98/timeline --paginate --jq '.[] | select(.event=="unlabeled" or .event=="labeled") | "\(.created_at) \(.event) \(.label.name)"'
2026-08-07T22:46:41Z labeled documentation
2026-08-07T22:46:41Z labeled planning
2026-08-17T13:47:25Z labeled blocked-on-issue
2026-08-18T21:09:59Z unlabeled blocked-on-issue
2026-08-22T08:38:19Z labeled blocked-on-issue
2026-08-22T16:14:57Z unlabeled blocked-on-issue

The comment of 2026-08-22T16:14:55Z gives the reason, and the record quotes it
rather than restating it.

The correction this change carries

#351's body derives the count as one with #98 as its only member, and the
decision of 2026-09-18 on that issue restates that figure. The same command
answers eight today, as pasted above. The reading is unchanged by it, because
what the argument needs is the floor and not the number - both of #98's exits
are shut at any count, and eight is no closer to zero than one - but the
difference is real and is written into the record under its own heading rather
than left for a reader to trip over. It was found by running the command before
writing the record rather than by carrying the figure out of the issue.

The guards this ran through

No guard is added or edited, so there is no deliberate violation to show. The
checks that read this register were run at the commit being pushed:

bash .github/decision-records/decision-records.sh check
Records: 68. Fields found: 10.
ok    10 field(s) name a record that exists, name a clause, and are named back

bash .github/doc-paths/doc-paths.sh check
ok    82 document(s), 411 named path(s) resolved, 0 excused as examples

bash .github/invariants/invariants.sh check
Every rule above was applied to its subject and refused nothing.

bash .github/format/format.sh check
Every tracked source file above is written the way the formatter would write it.

The Narrowed-by: field on 0291 is what takes the field count from 8 to 10; it
and the new record's Narrows: line are one pair, and the check reads it in both
directions.

Three files are touched, all inside the docs/decisions scope #351 declares:

git diff --name-only origin/main...HEAD
docs/decisions/0291-the-provider-the-socket-waits-on.md
docs/decisions/0351-the-condition-that-counts-this-board.md
docs/decisions/README.md

No cargo run was made, because nothing this change touches is compiled.

What this does not cover

Who has read this

Nobody other than its author. There is no second reader on this board tonight,
and every reading above is quoted with the command that produced it so it can be
repeated rather than trusted.

Closes #351

…a trigger

0291 ends on four conditions that would retake the choice holding M3 and
everything behind it. Three of them are states of the world outside this
tracker. The fourth counts the open issues on this board that can be worked
without a request and fires when that count reaches zero, and zero is a state no
arrangement of this board's issues produces: #98 is in the set, its
done-condition is the first release and the chain from there arrives at the
issue 0291 was written for, and the only other way out of the count is a
blocked-on label whose removal was argued on #98 itself on 2026-08-22.

0351 records that the condition is read as the price this board has been paying
since 0291 landed rather than as a trigger, that the floor of one is what the
reading rests on rather than any particular count, and that the three conditions
beside it stand. It goes further than 0291 rather than editing it, because
rewording what would reverse a landed record is not one of the edits 0001
allows, and 0291 gains the Narrowed-by field 0267 requires in the other
direction.

The record carries one correction of its own subject. #351 derived the count as
one with #98 its only member, and the decision of 2026-09-18 restates that
figure; the same command answers eight today. The section that says so is in the
record rather than in a message, because the count is the one figure in the
argument that moves and a reader meeting a third number should find the
difference already accounted for.

What this prevents is a reader of 0291 taking the fourth condition for something
that can happen and waiting for it, which is the failure the condition was
written against arriving through the condition itself; and, where the reader
does notice, an hour of re-derivation from the tracker that ends where this
record already is.

Closes #351

Signed-off-by: Nils Lehnen <30603423+iderex@users.noreply.github.com>
@iderex
iderex merged commit 9b26c4a into main Sep 18, 2026
28 checks passed
@iderex
iderex deleted the af01-core/reversal-condition-price-already-paid branch September 18, 2026 13:24
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.

0291's fourth reversal condition has one member left, and no state of this board takes it to zero

1 participant