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
{{ message }}
Repository navigation
validate-family.py: git-not-runnable takes any OSError around the whole member check, so a holder whose members/<P> this user cannot enter is told to put git on PATH, and the two pinned validators count a missing git by two rules #928
Goal: the two pinned validators share one rule for "git could not be started", and a member directory this user cannot enter is never reported as a missing git.
Filed by lane openRepoShape-3, from its triage of #459 at the v1.1.1 release commit 5017830. It is #459's line U018 (lane 4's line on the two git-not-runnable wrappers), one pull request's worth. #430 covers the .exists() guard itself; this issue is the wrapper's rule.
Two git-not-runnable rules (U018)
State._git_runs in templates/family-root/scripts/validate-family.py:289-292 turns any OSError into git-not-runnable ("put git on PATH and run this again"). It wraps all of _check_member_tree (:1075-1078), whose first line is (member / ".git").exists() (:946). templates/assembly-root/scripts/validate-pins.py:570-616 counts only an OSError whose filename is git, or a nameless FileNotFoundError or PermissionError, around the git calls alone. #575 (#539) did not unify them, and scripts/repo_shape.py holds no shared rule.
What happens. On Python 3.12 and 3.13, exists() raises PermissionError for a members/<P> this user cannot enter, so with git on PATH the holder is refused git-not-runnable and told to put git on PATH. Windows' nameless [WinError 193] (a git that cannot be executed) is counted by one rule and not the other; that is read from CPython, not run on Windows.
Evidence. The lines above at 5017830.
Direction. Move validate-pins.py's filename rule into scripts/repo_shape.py, have both validators use it, and wrap only the git calls in validate-family.py. All three are pinned copies, so it rides with the next re-pin.
CLAIMED — lane openRepoShape-4, session 11c6c0ef-495a-4a05-94cf-811b7b0a1012@Eagle, 2026-10-18T17:02:22Z, for #928
Logged in lanes/log/openRepoShape-4.md at c0c7d22324d99cc9f36c50b4c301f87f499a411d.
The three reads (lane-collision-protocol Rule 1):
1. existing `CLAIMED —` comments on opensoft/openRepoShape#928:
none
2. `gh pr list --repo opensoft/openRepoShape --state all --search "#928"`, kept where the row or its body names `#928`:
none
3. `git ls-remote --heads git@github.com:opensoft/openRepoShape` branches naming `928` as a whole token:
none
Activity
brettheap commentedon Oct 18, 2026
CLAIMED — lane openRepoShape-4, session 11c6c0ef-495a-4a05-94cf-811b7b0a1012@Eagle, 2026-10-18T17:02:22Z, for #928
Logged in
lanes/log/openRepoShape-4.mdatc0c7d22324d99cc9f36c50b4c301f87f499a411d.The three reads (lane-collision-protocol Rule 1):
Merge #956's restacked head 0b1413f into #983, so #928's change stand…
Merge #956's round-2 head 741dc4d into #983: `_check_member_checkout`…
Merge #956's final head f3a2c74 into #983: the first of three merges …
Merge #956's squash 3864b18 into #983, keeping #983's side of validat…
validate-family.py, validate-pins.py and both bootstrap.py copies: a …