Repository navigation
scaffold-project.py and family.py init: the dry runs skip the target-exists and folder checks, and any gh repo view failure reads as "does not exist" #609
Description
The scaffold's and family.py init's dry runs should ask target-exists and whether each folder can be made; only gh's not-found should mean absent; and init should ask before it makes its folder.
From the checklist triage of 2026-10-15; Brett Heap approved its recommendations at 2026-10-15T16:49:38Z. One pull request covers the lines below.
Lands after: #573.
Lines
- L2-34: neither dry run asks the target-exists checks, or whether
--work-dirand--local-remote-dircan be made. Where: scaffold-project.py :1595-1614 (main), :1637-1666 (family.py and scaffold-project.py:--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573 c6b32d7); scripts/family.pycmd_init:1742-1753 (family.py and scaffold-project.py:--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573). Effort S; all. On main26c1600: Measured at 26c1600 and at family.py and scaffold-project.py:--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573's head: in all seven cases (four scaffold, threeinit), the dry run exits 0 with--dry-run: nothing was created.; the real runs give two clean refusals and five tracebacks, with no remote made, and family.py and scaffold-project.py:--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573 adds only the remote question. (source) - L2-36: any
gh repo viewfailure reads as "does not exist", in the dry runs and the real runs. Where: scaffold-project.py :150 (main), :176 (family.py and scaffold-project.py:--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573); scripts/family.py :850 (main), :870 (family.py and scaffold-project.py:--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573). Effort S; all. On main26c1600: Measured at family.py and scaffold-project.py:--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573's head with aghansweringHTTP 401: Bad credentials: both dry runs exit 0 withnothing was created, the real scaffold fails atgh repo create(rc 2), and the realinitleaves an emptyinto/Orbit; read, not measured: a transient failure on an existing root during a real run could create the spec and code legs first. (source)
Rides along (backlog; tick it here if the same change covers it)
- L2-35: a real
family.py initmakes<into>/<Family>/before asking about the remote; a refusal leaves it empty. Where: scripts/family.pycmd_init:1753-1754 (family.py and scaffold-project.py:--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573 c6b32d7), :1726-1727 (main). Effort S; all. On main26c1600: Measured at family.py and scaffold-project.py:--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573's head: with the holder's remote holding commits,--dry-runrefusesfamily-remote-existsand leaves nothing, and the real run refuses the same and leaves an emptyinto/Orbit;family.py init --dry-runandscaffold-project.py --dry-runexit 0 without asking whether the remotes already exist #537's own first line names this folder ("the real run refuses, leaving an empty folder"), and family.py and scaffold-project.py:--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573 closesfamily.py init --dry-runandscaffold-project.py --dry-runexit 0 without asking whether the remotes already exist #537 without fixing it (ct459a-D3). (source)
Each line above is marked → this issue on its tracking issue. Tick it there too when this closes.
The lines as written on the tracking issues
L2-34 (P3; scaffold-project.py and family.py, #573 review): neither dry run asks
scaffold-target-existsorfamily-target-exists, or whether--work-diror--local-remote-dircan be made.
- At 0c81423 the scaffold's dry run returns at
scaffold-project.py:1507-1517, before the work root is made and_refuse_existing_treesasks (:1521-1524), and before--local-remote-dir's mkdir (:1535).family.py init --dry-runreturns before_prepare_landing_dir(:1753).- With a file standing there, the dry run exits 0 and the real run raises
FileExistsError. This predates family.py and scaffold-project.py:--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573, which adds the remote question only.- Direction: ask the same checks in the dry run without creating anything, and refuse a file where a folder must go by name.
L2-36 (P3; scaffold-project.py and scripts/family.py, #573 review): any
gh repo viewfailure reads as "the repository does not exist", in the dry run and the real run alike.
scaffold-project.py:168-169andscripts/family.py:870-871at 0c81423:if probe.returncode != 0: return None. With a bad login (HTTP 401 from a stub), the dry run now says nothing exists and exits 0. The real run then fails atgh repo create, andinithas already made the folder by then.- It predates family.py and scaffold-project.py:
--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573, which makes the dry run depend on it.- Direction: treat only gh's not-found answer as absent, and refuse any other failure by name.
L2-35 (P3; scripts/family.py, #573 review): a real
family.py initmakes<into>/<Family>/before it asks whether the holder exists, so a refused run leaves an empty folder for anyone who skipped the dry run.
scripts/family.py:1753-1754at 0c81423:_prepare_landing_dirruns, then_checked_reuse. The folder also remains after agh-not-foundrefusal.- family.py and scaffold-project.py:
--dry-runasks the real run's own question about existing remotes, sofamily-remote-existsandscaffold-remote-existscome at the plan, and a missingghisgh-not-found, not a traceback (#537) #573 makes the dry run ask_checked_reuseand leaves the real run's order as it was, so the empty folder in AT-family N1 stays for a run with no dry run before it.- Direction: ask
_checked_reusefirst in the real run too. It takes no folder, and the dry run already calls it before one exists.
Activity
brettheap commentedon Oct 15, 2026
CLAIMED — lane openRepoShape-2, session 81650e29-c906-4fe8-96c9-55580bfe0c44@Eagle, 2026-10-15T18:25:09Z, for #609
Logged in
lanes/log/openRepoShape-2.mdat1800a7372ac628bd73fef01fc2bd8c6d1a09f10d.The three reads (lane-collision-protocol Rule 1):
scaffold-project.py and family.py: an existing EMPTY working tree or …
scaffold-project.py and family.py: the refusal of an EMPTY working tr…
family.py and shape_materialize.py: `init --into <dir named for the f…
family.py and validate-family.py: where an earlier act left the branc…
validate-family.py and family.py: a gitlink no section of HEAD's `.gi…
shape_materialize.py: an owner gh says is no organisation has no plan…
scaffold-project.py, adopt-project.py and family.py: the Free-plan se…
adopt-project.py: `execute` asks about both leg repositories before i…
adopt-project.py: `execute` asks about both leg repositories, on the …
tests/test_path_guard_hygiene.py and shape-doctor.py: a bare is_file/…