Skip to content

restart:247 and lanes:311 carry the same BSD-incompatible grep -v 'pattern' -- file shape PR #53 fixes at skills/restart/SKILL.md:58, and the hygiene checker's own text-split can't see it #54

Closed

Description

@brettheap

Lane: openrepotools-3 (openRepoTools-3)

PR #53 (issue #34, Copilot review 5202775204) fixed skills/restart/SKILL.md:58's lread fence — grep -v 'not fetching; reading origin/' -- "$ln_err_file" puts the PATTERN before --, so a non-permuting getopt (BSD's, every macOS shell) reads the pattern as the first OPERAND and then reads -- itself as a second one, a FILENAME. Verified here, no macOS runner needed, by setting POSIXLY_CORRECT=1, which turns off GNU grep's own permutation and reproduces the exact BSD shape:

$ POSIXLY_CORRECT=1 grep -v 'not fetching; reading origin/' -- /tmp/x
grep: --: No such file or directory
/tmp/x:<the file's own content, now prefixed with its name>

That PR's own description names this as "the third site of the shape lanes and restart took at 29d3417" — and the other two sites are still live, untouched by that PR because its diff only ever reached SKILL.md's copy:

  • restart:247 — grep -v 'not fetching; reading origin/' -- "$lc_err_file" >&2 || :
  • lanes:311 — grep -v 'not fetching; reading origin/' -- "$local_err_file" >&2 || :

Both are byte-identical to the line #53 just fixed, and both are shipped commands a person runs directly (not only a skill's embedded fence), so this is live on every macOS workstation today: any OTHER line on that stderr stream — "this workstation's session records could not be read", say — reaches the person prefixed with a temp filename and preceded by a spurious grep: --: No such file or directory, instead of the clean forwarding the fence exists to do.

Why test_no_shipped_bash_ends_its_options_after_an_operand did not catch it, even though both files are in ALL_BASH: _end_of_options_after_an_operand (tests/test_repo_hygiene.py:2193) splits each line on a bare re.split(r"[|;&()]|\$\(|", line)before tokenizing — not quote-aware. The pattern text itself contains a; ('not fetching; reading origin/'), so the split cuts the command in two before the tokenizer ever sees the --, and neither half is left holding both an operand and the --that follows it. Confirmed:python3 -m pytest tests/test_repo_hygiene.py -k test_no_shipped_bash_ends_its_options_after_an_operand -qis 11 passed on unmodifiedmain, restartandlanes` included. A checker that calls a real defect clean is worse than no checker, because it is the one thing a reviewer trusts instead of reading the line.

Ask:

  1. restart:247 and lanes:311: the same one-word fix /restart's lread fence keeps a read's stderr and drops only the known no-fetch notice; two module comments now point at the lists instead of restating a stale file count (#34) #53 applied — grep -v -e 'not fetching; reading origin/' -- "$file".
  2. _end_of_options_after_an_operand: make the per-line split quote-aware (tokenize the whole line first, e.g. with something like the existing _shell_tokens, then split THAT token stream on the separator tokens, rather than regex-splitting the raw text) so a pattern argument containing ;, &, |, ( or ) can no longer hide this shape from the checker. A fixture built from this exact line, asserted red before the split fix and green after, belongs beside it.

🤖 Generated with Claude Code

Activity

  1. brettheap commented on Sep 14, 2026

    @brettheap
    ContributorAuthor

    CLAIMED — lane openRepoTools-3, session 4135b2c9-34a6-47e3-a156-5adebb632fae@Eagle, 2026-09-14T21:10:30Z, for #54

    Logged in lanes/log/openRepoTools-3.md at 608cba001ed517ca7eea606bc81dcf1cdb699241.

    The three reads (lane-collision-protocol Rule 1):

    1. existing `CLAIMED —` comments on opensoft/openRepoTools#54:
       none
    2. `gh pr list --repo opensoft/openRepoTools --state all --search "#54"`, kept where the row or its body names `#54`:
       none
    3. `git ls-remote --heads git@github.com:opensoft/openRepoTools` branches naming `54` as a whole token:
       none
    
  2. brettheap commented on Oct 13, 2026

    @brettheap
    ContributorAuthor

    TAKEOVERopenRepoTools-3 — lane openRepoTools-5, session 0d83dca2-c18c-4bb0-99ce-896e6cafea02@Eagle, 2026-10-13T18:21:00Z, for #54

    Logged in lanes/log/openRepoTools-5.md at 83f1db25f1504e8eaa3036287895883b7542fdbe (takeover of the stale claim held by lane openRepoTools-3).

    The three reads (lane-collision-protocol Rule 1):

    1. existing `CLAIMED —` comments on opensoft/openRepoTools#54:
    6:CLAIMED — lane openRepoTools-3, session 4135b2c9-34a6-47e3-a156-5adebb632fae@Eagle, 2026-09-14T21:10:30Z, for opensoft/openRepoTools#54
    13:1. existing `CLAIMED —` comments on opensoft/openRepoTools#54:
    2. `gh pr list --repo opensoft/openRepoTools --state all --search "#54"`, kept where the row or its body names `#54`:
       none
    3. `git ls-remote --heads git@github.com:opensoft/openRepoTools` branches naming `54` as a whole token:
       none
    
  3. brettheap commented on Oct 13, 2026

    @brettheap
    ContributorAuthor

    RELEASED — lane openRepoTools-3, session 83619980-06bb-4469-ae73-2a8c5e61981a@Eagle, 2026-10-13T18:22:05Z, for #54 — Brett Heap 2026-10-11 gave #28-#89 to lane openRepoTools-5 (its RULED line of 16:19:19Z); lane 3 holds no live work on this number

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions