Repository navigation
In the no-estate sweep, park skips a root that has no Speckit git overlay instead of counting it as a refusal #6
Description
Lane: openreposhape-2 (openRepoShape-2)
Ruling: opensoft/openRepoShape#92 (comment) — Brett Heap, 2026-09-10, verbatim: "rule on the #92 open item: skip roots without the overlay."
What is wrong today
openRepoShape #91/#93 (landed there as d090a7a, carved here by its #94 and living in this repository since PR #1) made bare park — no <Name>, no --repo, no estate around the cwd — park EVERY estate under the projects directory, in name order, continuing past a refusal.
On Eagle that sweep exits 1 and always will: four roots (MedxEHR, MedxGlass, openDox, openXdox) carry no Speckit git overlay, so each one's own make park refuses with exit 2 —
make park needs the Speckit worktree overlay; install it with: setup-openspeckit
— which the sweep counts as a refusal. A root that was never given the overlay is not a park that FAILED; it is a park there was never anything to run. Counting it as a failure makes the one summary line that matters unreadable: a person who has one genuinely refused estate cannot see it among four roots that were never park-able.
The semantics to implement
-
The sweep only. In
park_every_estate/run_one_estate, before runningmake parkin a standalone root, test the overlay THE SAME WAY THE MAKEFILE TESTS IT —-x <root>/.specify/extensions/git/scripts/bash/park.sh, which istemplates/assembly-root/Makefile's owntest -x $(PARK) || … exit 2withOVERLAY_MISSING. Absent: print ONE line in that estate's report block —SKIPPED (no Speckit overlay; install it with: setup-openspeckit)— count it under a new
skippedtally, run nothing there, and do not let it touch the exit code. A family holder is run as it is today: its owntemplates/family-root/Makefilehas no such test, it fans out to the members withsiblings.py --make, and a member's own refusal is the holder's to report — so members are NOT pre-checked here, and the code says so in a comment. -
Explicit is unchanged.
park <Name>,park --repo <owner/name>and the walk-up inside an estate keep today's behaviour: the Makefile's exit 2 refusal is relayed, verbatim, namingsetup-openspeckit. A person who NAMES a root gets the refusal; only the sweep, which named nothing, skips. -
The summary gains the skipped count, and only when there is one, so the Crash-consistent lane worktree recovery: canonical inventory and RUNNING → SWAPPING → SWAPPED lifecycle #91 line is untouched on a workstation where every estate has the overlay:
park: 3 estate(s) parked, 0 refused or with findings, 4 skipped (no overlay)The exit code is computed over NON-SKIPPED estates only: 0 when every non-skipped estate parked, 1 when any refused or was left with findings — which is Crash-consistent lane worktree recovery: canonical inventory and RUNNING → SWAPPING → SWAPPED lifecycle #91's rule with the skipped ones simply not counted. If EVERY estate was skipped: exit 0, and a line that says so and names the installer.
-
--dry-runprintswould skip (no Speckit overlay; install it with: setup-openspeckit)for such a root, and creates nothing. -
The documents. README.md's and AGENTS.md's bare-
parksentences (from Crash-consistent lane worktree recovery: canonical inventory and RUNNING → SWAPPING → SWAPPED lifecycle #91) gain the skip clause, and so does the header comment inpark. The byte-identical shared estate resolver betweenparkandresumeis NOT touched —test_the_two_verbs_carry_the_same_estate_resolver_byte_for_byteholds that still, and this change belongs above it, in park-everything's own section.
resume does not change: the ruling is park-only, and resume's bare form still refuses.
Tests
In tests/test_park_resume_commands.py, in the #91 section's style: a sweep over two roots WITH the overlay stub and two WITHOUT (both parked, both SKIPPED, exit 0, the summary line); the all-skipped case (exit 0, and it says so); a skipped root beside a REAL refusal (exit 1, both lines); --dry-run says would skip; explicit park <Name> on an overlay-less root still exits non-zero with the Makefile's own refusal; a family holder in the sweep is still RUN and never pre-checked. The existing #91 sweep tests get the overlay stub their standalone roots now need, which is the fixture telling the truth about what a park-able root is.
Where this lands
Here, in opensoft/openRepoTools — the command's home since openRepoShape #94 — never in openRepoShape. workBenches re-vendors park afterwards.
Activity
brettheap commentedon Sep 10, 2026
CLAIMED — lane openreposhape-2 (openRepoShape-2), session 8fa66b30-4cf5-4b80-b40c-ac3640cf45ab, 2026-09-10T21:03Z, for the whole of this issue, branch
feat/park-skips-roots-without-overlay, based onfe00a63ae7502461a042ebb5723ffc1909a25349(origin/main).Brett Heap's word is the RULING linked above (opensoft/openRepoShape#92, 2026-09-10, "rule on the #92 open item: skip roots without the overlay"), relayed to this repository by this lane. Do not merge without his word; this claim covers authoring, the pull request and the review round only.
Reads before claiming:
gh issue list --repo opensoft/openRepoTools --state all: Bump the pinned openRepoShape submodule to 0fa73b7, past the park/resume carve #2 and The --help sentence naming what --install places beside this file reads like it's missing a word #3, both CLOSED and unrelated (a pin bump and a --help wording fix). No open issue, and none about the sweep.gh pr list --repo opensoft/openRepoTools --state all:parkandresumemove here from openRepoShape, with their ownopenRepoTools --install, their own suite, and the openRepoShape commit they were verified against pinned as a submodule (opensoft/openRepoShape#92) #1, openRepoTools --help: fix the sentence naming what --install places beside this file #4 and Bump the pinned openRepoShape submodule to 0fa73b7, past the park/resume carve #5, all MERGED. Nothing open, so nothing else is touchingpark.git ls-remote --heads origin:mainonly, atfe00a63— no other lane has a branch here.parkwhole (the sweep'sall_estate_dirs,park_every_estate,run_one_estate,refuse),resume(unchanged — the ruling is park-only),tests/test_park_resume_commands.py,tests/conftest.py,tests/test_repo_hygiene.py, README.md, AGENTS.md, and the pinnedupstream/openRepoShape/templates/{assembly-root,family-root}/Makefile— the assembly root'stest -x $(PARK) || … exit 2is the test this change copies, and the family holder'ssiblings.py --make parkis why a holder is never pre-checked.brettheap commentedon Sep 10, 2026
PR OPEN, NOT MERGED — lane openreposhape-2 (openRepoShape-2), session 8fa66b30, 2026-09-10T21:18Z: #7, head
7053d362ac02f670904bee1b3c531af13dc28288, based onfe00a63.All five checks green on that head (tests, tests-macos, tests-windows, tests-no-submodule, SonarCloud);
Sourcery reviewreportsskipping. 140 -> 147 tests. Reviews: Copilot approval recommended, one nit — the sweep's kind test was!= familyand is now= standalone, so a kind nobody has invented yet is RUN and answered by its own Makefile rather than silently skipped (7053d36, replied on the thread). Codex declined (usage limits) and Sourcery's own review is rate-limited for ~3h, so only Copilot has read the diff.shellcheckis not installed on this machine and CI does not run it;bash -n parkpasses everywhere, including the macOS job's bash 3.2.Awaiting Brett Heap's word to merge. workBenches re-vendors
parkafterwards.