pin family scoping in the direction that carries it, and D3b on the window side

The family-scoping fixture asserted that a foreign marker does not
SILENCE the flag, which a family-blind grep satisfies too. The property
that is load-bearing is the other one: a foreign family late on the
thread must not make the flag re-post. Made family-blind, the sweep now
reds.

D3b says a claimed non-member is flagged whether or not it has an open
PR, and the fixtures covered that for the collision flag only — the
window side, which is the flag the 18:11Z correction was about, had no
case at all.
This commit is contained in:
cndgrr 2026-08-04 19:00:48 +00:00
parent 4f852ee152
commit 13605cf4b6

View file

@ -2341,6 +2341,24 @@ foreign_out="$(board_run)"
check "another family's marker never silences the collision flag" 0 \
'issueflow: #284: collision flag — issueflow-reconcile=257' \
printf '%s\n' "$foreign_out"
# The direction that is actually load-bearing, and that the case above cannot
# reach: a foreign family's marker landing AFTER this flag's own must not make
# the flag speak again. Family-blind, "the last marker on the thread" is the
# blocked-parse echo's, which is not this state's marker, and the flag
# re-posts a comment that already stands — the noise D4's dedup exists to
# stop, on the one thread where three families all have something to say.
jq -n --arg b "<!-- issueflow:$(state_marker collision 'issueflow-reconcile=257') -->
this flag's own last word" \
--arg c "<!-- issueflow:blockers-parsed-none-abc123def456 -->
a different family, later on the thread" \
'[{"user": {"login": "sweep-bot"}, "body": $b},
{"user": {"login": "sweep-bot"}, "body": $c}]' \
>"$BOARD/repos_owner_repo_issues_284_comments.json"
later_foreign_out="$(board_run)"
check "a foreign family's LATER marker never makes the flag re-post" 1 "" \
grep -qF 'issueflow: #284: collision flag' <<<"$later_foreign_out"
check "...while every other collision on the board still speaks" 0 "2" \
flag_count collision "$later_foreign_out"
# -- the post-ruling board draws nothing (D5's must-not-flag leg) -----------
# The same issues after triage placed them: the TRIAGE.md triple chained
@ -2419,6 +2437,33 @@ check "a claimed carrier with an open PR draws the ready issue's flag too" 0 \
'issueflow: #284: collision flag — issueflow-reconcile=253' \
printf '%s\n' "$in_flight_out"
# -- D3b's headline case, on the WINDOW side (acceptance criterion) ----------
# The criterion says a `claimed` non-member is flagged whether or not it has
# an open PR, and it is the line the 18:11Z ruling turned on — triage had
# excluded the open-PR case at 18:06Z and corrected it five minutes later.
# The collision fixtures above cover the PR-liveness question for their flag;
# this covers it for the other one. #292's charge against the third state is
# that a non-member competes with gate members for builders, and a non-member
# holding a builder AND a review round is that competition realized.
printf '%s\n' \
'{"data":{"repository":{"pullRequests":{"nodes":[{"number":403,"body":"","closingIssuesReferences":{"nodes":[{"number":402}]}}],"pageInfo":{"hasNextPage":false,"endCursor":null}}}}}' \
>"$BOARD/graphql-open.json"
board_issue 249 blocked,release 'Release 0.6.0 — the board empties into the tag' \
'Blocked by #253.'
board_issue 253 claimed 'issueflow-reconcile — a member holding the window open' '' 1
board_issue 402 claimed 'REVIEWER.md — a non-member with a builder and a round' '' 1
board_assemble 249 253 402
nonmember_pr_out="$(board_run)"
check "a claimed non-member with an open PR still draws the window flag" 0 \
'issueflow: #402: window flag — an unblocked non-member under #249' \
printf '%s\n' "$nonmember_pr_out"
check "...and the gate member beside it, also claimed with a PR, is not" 1 "" \
grep -qF 'issueflow: #253: window flag' <<<"$nonmember_pr_out"
check "...and the live claim is left exactly as it was" 1 "" \
grep -qF 'issue edit' "$BOARD/edits"
check "...one window flag on the board, and only one" 0 "1" \
flag_count window "$nonmember_pr_out"
# -- flagged, resolved, recreated unchanged: silent, and specified ----------
# D4's boundary, asserted rather than left accidental. Nothing is posted at
# the resolution — D1 admits no comment there — so the thread's last word is