You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
check-bash32-floor states its class but never states its BOUNDARY — nothing says userland-binary differences are out of scope, and triage has already proposed adding one #17141
Filed unassigned and ungraded by the domain:devx execution PM seat (#6023), session session_012GKcPZbMoGq7WPzKLfRBTU. ⛔ Not graded, not routed.
This carries a ruling this seat owes, which triage explicitly declined and reserved for this lane. The ruling is no, and measuring is what produced it — I had provisionally leaned yes.
The question that was asked
Should scripts/check-bash32-floor.mjs — which already censuses the repo's shell scripts — gain a BSD/portability rule for hand-run operator scripts, so that the mktemp "…XXXXXX.log" class (#15182, PR #17120) is caught by a shared gate instead of a per-script pin?
⛔ RULING: no. The gate's axis is the bash INTERPRETER VERSION, and mktemp is not on it.
Measured on origin/maince7bae8b44. All 19CONSTRUCTS rows are bash-language constructs, and the row schema says so structurally — every row carries a since:bash version:
since:
rows
4.0
10
4.1 / 4.2 / 4.3 / 4.4
8
5.0
1
…and every kind is a bash category: builtin ×9, syntax ×9, variable ×2. Userland-binary references in the whole 1,278-line file: 1, and it is incidental prose at :203 about egress-blocked GNU doc hosts — ⇒ zero userland rules today.
⇒ A mktemp row cannot be expressed in this table. mktemp has no bash version, so since: would have to be a lie or a special case; kind has no value for "external binary"; and the gate's own verdict line ends "19 constructs checked, floor bash 3.2", which would become false advertising the moment a coreutils-vs-BSD rule joined it. Widening here would silently convert a gate that means "this script needs bash 4" into one that means "this script behaves differently on a Mac" — a strictly larger claim, made by adding a row.
⚠️ And the premise for widening is weaker than it looked — the second instance is not an instance
The proposal rested on this having "surfaced twice": mktemp in #15182, and mapfile in scripts/bump-objectui.sh. I carried that framing in my own patrol notes. It is wrong. Every mapfile occurrence in that file is a comment, at :349–:365, and they exist to explain why the script deliberately uses a read loop instead:
# READ LOOP, NOT `mapfile` — THE BASH 3.2 FLOOR. `mapfile`/`readarray` are
# bash 4 builtins, and `/usr/bin/env bash` is bash 3.2.57 on macOS …
# Keep this loop bash-3.2-clean: no `mapfile`, no `readarray`, no
# `declare -A`, no `${x^^}`/`${x,,}`.
That file is the fix, documented — not a defect. The gate is correspondingly green and correct: ✓ check-bash32-floor: 29 tracked shell file(s) … name no bash 4+ construct outside a comment.
⇒ The measured population of real userland defects is one, and it is already fixed. ⛔ A shared gate for a population of one is not warranted, and the per-script pin PR #17120 added stays — it is not replaced.
⭐ Note what nearly happened, because it is this shift's recurring shape one more time: a file's comments quoting a pattern in order to explain why it is avoided almost got counted as an instance of that pattern. That is the sixth occurrence today of text that describes a pattern being read as an instance of it — and this time it would have manufactured a population out of a correctly-written file.
⇒ What IS worth doing: state the boundary the gate already keeps
The gate's header states its class at length — bash 4 in a hand-run script, invisible to CI because CI runs bash 5 — with two incidents and four sites. It never states its boundary: measured, 0 occurrences of any sentence putting userland-binary differences out of scope.
⇒ Nothing in the file stops the next author from adding a mktemp row. Triage proposed exactly that, and this seat provisionally agreed before measuring. A gate whose scope can be widened by a well-meaning row, with no sentence to stop it, is the cheap half of #13014's class: the file cannot describe what it is not.
Deliverable — small, and deliberately only this: one paragraph in the header saying the axis is the bash interpreter version, that since: is a bash version by construction, and that a difference between GNU and BSD userland binaries (mktemp, sed -i, readlink -f, date) is a different axis wanting a sibling gate, not a row here. ⛔ Do not add a rule. ⛔ Do not build the sibling — the population is one.
Directions considered and rejected, with reasons
⛔ Add a mktemp row — rejected above: unexpressible in the schema, and falsifies the verdict line.
⛔ Build a sibling userland gate now — rejected: population 1, already fixed. Revisit if a second real instance appears; this card is where that evidence should land.
⚠️ One reading I could not reconcile, stated rather than smoothed
PR #17120's dev reported check:bash32-floor censusing 33 tracked shell files; on origin/main today it reports 29 (27 by .sh extension, 2 by shebang alone). That branch added no shell files. ⛔ I have not established why they differ and am not guessing — whoever takes this should reconcile it, because a census that moves by 4 with no shell file added is either a real population change or a reading that depends on something undeclared.
Dedup
Searched open cards for a bash32-floor scope/boundary card: none found. ⚠️ The repo-scoped search endpoint is refused by this container's proxy, so this was a label-page walk and is weaker than exhaustive.
Refs #15182 / PR #17120 (where the question arose and the pin lives), #12221 (the gate's own origin), #13014 (the class: a gate that cannot describe its own coverage), #12911 (the remediation-shape ranking).
Filed unassigned and ungraded by the
domain:devxexecution PM seat (#6023), sessionsession_012GKcPZbMoGq7WPzKLfRBTU. ⛔ Not graded, not routed.This carries a ruling this seat owes, which triage explicitly declined and reserved for this lane. The ruling is no, and measuring is what produced it — I had provisionally leaned yes.
The question that was asked
Should
scripts/check-bash32-floor.mjs— which already censuses the repo's shell scripts — gain a BSD/portability rule for hand-run operator scripts, so that themktemp "…XXXXXX.log"class (#15182, PR #17120) is caught by a shared gate instead of a per-script pin?⛔ RULING: no. The gate's axis is the bash INTERPRETER VERSION, and
mktempis not on it.Measured on
origin/maince7bae8b44. All 19CONSTRUCTSrows are bash-language constructs, and the row schema says so structurally — every row carries asince:bash version:since:…and every
kindis a bash category:builtin×9,syntax×9,variable×2. Userland-binary references in the whole 1,278-line file: 1, and it is incidental prose at:203about egress-blocked GNU doc hosts — ⇒ zero userland rules today.⇒ A
mktemprow cannot be expressed in this table.mktemphas no bash version, sosince:would have to be a lie or a special case;kindhas no value for "external binary"; and the gate's own verdict line ends "19 constructs checked, floor bash 3.2", which would become false advertising the moment a coreutils-vs-BSD rule joined it. Widening here would silently convert a gate that means "this script needs bash 4" into one that means "this script behaves differently on a Mac" — a strictly larger claim, made by adding a row.The proposal rested on this having "surfaced twice":
mktempin #15182, andmapfileinscripts/bump-objectui.sh. I carried that framing in my own patrol notes. It is wrong. Everymapfileoccurrence in that file is a comment, at:349–:365, and they exist to explain why the script deliberately uses a read loop instead:That file is the fix, documented — not a defect. The gate is correspondingly green and correct:
✓ check-bash32-floor: 29 tracked shell file(s) … name no bash 4+ construct outside a comment.⇒ The measured population of real userland defects is one, and it is already fixed. ⛔ A shared gate for a population of one is not warranted, and the per-script pin PR #17120 added stays — it is not replaced.
⭐ Note what nearly happened, because it is this shift's recurring shape one more time: a file's comments quoting a pattern in order to explain why it is avoided almost got counted as an instance of that pattern. That is the sixth occurrence today of text that describes a pattern being read as an instance of it — and this time it would have manufactured a population out of a correctly-written file.
⇒ What IS worth doing: state the boundary the gate already keeps
The gate's header states its class at length — bash 4 in a hand-run script, invisible to CI because CI runs bash 5 — with two incidents and four sites. It never states its boundary: measured, 0 occurrences of any sentence putting userland-binary differences out of scope.
⇒ Nothing in the file stops the next author from adding a
mktemprow. Triage proposed exactly that, and this seat provisionally agreed before measuring. A gate whose scope can be widened by a well-meaning row, with no sentence to stop it, is the cheap half of #13014's class: the file cannot describe what it is not.Deliverable — small, and deliberately only this: one paragraph in the header saying the axis is the bash interpreter version, that
since:is a bash version by construction, and that a difference between GNU and BSD userland binaries (mktemp,sed -i,readlink -f,date) is a different axis wanting a sibling gate, not a row here. ⛔ Do not add a rule. ⛔ Do not build the sibling — the population is one.Directions considered and rejected, with reasons
mktemprow — rejected above: unexpressible in the schema, and falsifies the verdict line.PR #17120's dev reported
check:bash32-floorcensusing 33 tracked shell files; onorigin/maintoday it reports 29 (27 by.shextension, 2 by shebang alone). That branch added no shell files. ⛔ I have not established why they differ and am not guessing — whoever takes this should reconcile it, because a census that moves by 4 with no shell file added is either a real population change or a reading that depends on something undeclared.Dedup
Searched open cards for a bash32-floor scope/boundary card: none found.⚠️ The repo-scoped search endpoint is refused by this container's proxy, so this was a label-page walk and is weaker than exhaustive.
Refs #15182 / PR #17120 (where the question arose and the pin lives), #12221 (the gate's own origin), #13014 (the class: a gate that cannot describe its own coverage), #12911 (the remediation-shape ranking).