docs(register-check.sh): wildcard semantics misdescribed as "pathname expansion" — * crosses /, so an over-broad allow-list silently under-reports #655
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#655
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
scripts/register-check.sh:25-26misdescribes the wildcard semantics — and the error direction makes the gate under-reportSplit from PR#651 review at @engineer's suggestion rather than widening that PR.
⚠️ Pathname expansion is precisely the mode where
*does NOT cross/. The implementation is bash[[ == ]]pattern matching, where it does.Pinned in the Go port, which mirrors bash deliberately:
🔴 Why the direction matters
An adopter writing
*.mdto allow-list root-level markdown silently allow-lists every.mdin the tree. This is a check: an over-broad allow-list means files that should have been flagged are skipped, and the output is indistinguishable from a clean scan.Under-report, not over-report. A wrong pattern that allow-listed too little would fail loudly on the next run.
Suggested wording — the behaviour rather than the analogy
⚠️ Two clauses in the current header are loose in the same way — "a glob that MATCHES a directory prefix" reads as any pattern happening to match a directory, while the implementation keys on the pattern's trailing slash (
filescan.go:105,strings.HasSuffix(line, "/")). Both are corrected inreusable-register-check.ymlby PR#651; this issue is the bash side.Scope
scripts/register-check.sh:22-26⚠️ My first sweep was unreliable and its own control caught it. A line-based
grep 'pathname expansion'returned 0 in the file where I had just written the phrase, because I had wrapped it across two comment lines. Re-run with comment markers stripped and newlines collapsed, it finds both files. A phrase search over wrapped comment prose needs the unwrap, or it silently under-reports — the same failure direction as the defect this issue is about.⚠️ Low urgency:
#607step 5 deletes this file once all four gates migrate. It matters until then, and for adopters pinned to a release that still ships it.Found by @engineer while running the cross-check @shipwright had flagged as outstanding on PR#651.
*crosses/, so*.mdsilently allow-lists the whole tree #656Staleness pass — LIVE, and PARTLY STALE on the remedy
🔴 REMEDY IS INCOMPLETE — a second wrong description at
:96[[ == ]]is pure string matching, so*does cross/— which is exactly whatfilescan_test.go:21pins.:96asserts the same falsehood in different words, and globstar isirrelevant because it governs pathname expansion, not
[[ == ]].⚠️ Anyone following this tracker fixes
:22-26and leaves:96stating the opposite of thetests. That is the partly-stale failure mode: the fix list inherits an instruction that is
incomplete rather than absent. Widen the remedy to both sites before working it.
AC sweep (operator-requested). Both ACs were satisfied and unticked; ticked now, verified from the substrate rather than from the merge.
📌 AC2 is the shape worth naming: an action AC that did the action, wrote the result inline, and left the box empty. The tick records what you DID, so it was owed the moment the sweep ran. A reader scanning boxes sees unfinished work; a reader scanning prose sees it was done.