Repository navigation
setup-project.py: step (3) passes an unwritable parent or a missing drive, and step (4) shows a chain the plan verifies as [declared-unverified] #608
Description
Setup's step (3) should ask for a writable parent and an existing drive, step (4) should pass --pin-source as --link-source, and step (5) should say "refused" for a plan it printed.
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: #569.
Lines
- L2-25: setup step (4) gets no
--link-sourcefrom--pin-source, so a chain the plan verifies shows[declared-unverified]. Where: setup-project.pynaming_declarations(:1936-1957),check_names(:1964) at setup-project.py: paste lines quote each path, the scaffold's NEXT STEPS wait for step (7), step (3) refuses a file above the clone,-- --dry-runends at the plan, step (4) hears passed pins, and the upstream guard ignores case (#538) #569 0b6228f. Effort S; all. On main26c1600: Measured at setup-project.py: paste lines quote each path, the scaffold's NEXT STEPS wait for step (7), step (3) refuses a file above the clone,-- --dry-runends at the plan, step (4) hears passed pins, and the upstream guard ignores case (#538) #569's head: step (4) is given['--pins=openXglass', '--referent-chain=openXglass,openGlass']and printsCHAIN openXglass → openGlass [declared-unverified]with a WARNING; the same call with a bare--link-source <pin source>prints none, and the scaffold's plan verifies the chain; this exists only once setup-project.py: paste lines quote each path, the scaffold's NEXT STEPS wait for step (7), step (3) refuses a file above the clone,-- --dry-runends at the plan, step (4) hears passed pins, and the upstream guard ignores case (#538) #569 lands, being the rest of Tracking: setup, scaffold, family and the shared helpers, creating projects and families #459.b10. (source) - L2-26: setup step (3) passes an unwritable parent or a missing Windows drive; three repositories are created, then refused. Where: setup-project.py
nearest_entry(:1829-1838),refuse_a_file_above(:1858-1872) at setup-project.py: paste lines quote each path, the scaffold's NEXT STEPS wait for step (7), step (3) refuses a file above the clone,-- --dry-runends at the plan, step (4) hears passed pins, and the upstream guard ignores case (#538) #569 0b6228f. Effort S; all (the drive case: Windows). On main26c1600: Measured in-process at setup-project.py: paste lines quote each path, the scaffold's NEXT STEPS wait for step (7), step (3) refuses a file above the clone,-- --dry-runends at the plan, step (4) hears passed pins, and the upstream guard ignores case (#538) #569's head:refuse_a_file_above('<ro>/work/Atlas')returns with<ro>at mode 555 (os.accessW_OK is False), so step (3) passes; the full run that creates three repositories is the setup-project.py: paste lines quote each path, the scaffold's NEXT STEPS wait for step (7), step (3) refuses a file above the clone,-- --dry-runends at the plan, step (4) hears passed pins, and the upstream guard ignores case (#538) #569 review's probe (review569-c71eadb/tools/probe_step3.py); the drive case was read only; main has no check above the clone at all, and the setup-project.py: its paste lines, the step (3), (4) and (7) checks, and the upstream-org guard #538 line covers only a file in the way. (source)
Rides along (backlog; tick it here if the same change covers it)
- L2-27:
passed_valuestakes a following word that starts with-as--pin's value, against its docstring. Where: setup-project.pypassed_values(:1908-1923; the append at :1921) at setup-project.py: paste lines quote each path, the scaffold's NEXT STEPS wait for step (7), step (3) refuses a file above the clone,-- --dry-runends at the plan, step (4) hears passed pins, and the upstream guard ignores case (#538) #569 0b6228f. Effort S; all. On main26c1600: Measured in-process at setup-project.py: paste lines quote each path, the scaffold's NEXT STEPS wait for step (7), step (3) refuses a file above the clone,-- --dry-runends at the plan, step (4) hears passed pins, and the upstream guard ignores case (#538) #569's head:passed_values(['--pin', '--referent-chain', 'x'], '--pin')returns['--referent-chain'], and step (4) is given--pins=--referent-chain; the scaffold's plan refuses next, so only a message is wrong. (source) - L2-37: setup step (5) says "the plan could not be produced" after a plan that printed and was then refused. Where: setup-project.py
plan_and_confirm:1887 (main), :2053 (setup-project.py: paste lines quote each path, the scaffold's NEXT STEPS wait for step (7), step (3) refuses a file above the clone,-- --dry-runends at the plan, step (4) hears passed pins, and the upstream guard ignores case (#538) #569). Effort S; all. On main26c1600: The text is the same at main, setup-project.py: paste lines quote each path, the scaffold's NEXT STEPS wait for step (7), step (3) refuses a file above the clone,-- --dry-runends at the plan, step (4) hears passed pins, and the upstream guard ignores case (#538) #569 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, and with 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 the dry run prints the plan before_reusable_remotesrefuses (scaffold-project.py :1637-1647 at c6b32d7), so the wording is wrong for that case; read, not run. (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-25 (P3; setup-project.py, #569 review): step (4) is not given the passthrough's
--pin-sourceas the naming validator's--link-source, so a chain the scaffold verifies shows[declared-unverified]there.
naming_declarations(setup-project.py:1936-1957at c71eadb) passes--pinsand--referent-chainonly, andcheck_namesruns the validator (:1964-1973). The scaffold reads the same--pin-sourcefor each chain link.review569-c71eadb/tools/logs/probe-step4.log, cases 6 and 7: a link tree that verifies the chain gives[declared-unverified]and a WARNING in step (4), while the plan verifies it. A link tree that breaks the chain gives "unverified" in step (4) andbrokenin the plan. The domain-descendant classification matched the plan in all 12 cases, which is what setup-project.py: its paste lines, the step (3), (4) and (7) checks, and the upstream-org guard #538's line asks.- Direction: pass the passthrough's
--pin-sourceto the validator as a bare--link-source.
L2-26 (P3; setup-project.py, #569 review): step (3) passes a parent folder the user cannot write and a Windows drive that is not there, so all three repositories are created before step (7) refuses.
nearest_entryreturns None for a missing drive (setup-project.py:1829-1838at c71eadb), andrefuse_a_file_abovelets None pass (:1868). It asks only that what it finds is a folder, not that the user can write there. The setup-project.py: its paste lines, the step (3), (4) and (7) checks, and the upstream-org guard #538 line on this checklist covers a file standing in the way, not these two.- Probed: with
--into <ro>/workand<ro>at mode 555, step (3) passes and all three repositories are created; step (7) then refusescould not be made a folder (Permission denied)and prints the finish-by-hand lines (review569-c71eadb/tools/probe_step3.py). The missing drive is read from the code and was not run (no Windows here).- Direction: in step (3), make and remove a folder at the nearest existing parent before the plan, and refuse a path whose drive does not exist.
L2-27 (nit; setup-project.py, #569 review): step (4) reports from a
--pinthat the scaffold then refuses at the plan, becausepassed_valuestakes a following word that starts with-as the value.
passed_values(setup-project.py:1908-1923at c71eadb, thevalues.append(words[index + 1])at:1921). Its docstring says a value never starts with-in the second spelling, because argparse reads such a word as a flag.- Examples:
--pin openGlass(no commit),--pin a,b@<sha>,--pin --referent-chain x. Step (4) prints its naming report, and the plan then refuses; nothing is created.- Direction: leave a following word that starts with
-out of the values, as the docstring says.
L2-37 (nit; setup-project.py, #573 review): step (5) says "the plan could not be produced (see above)" after a plan that was printed and then refused.
setup-project.py:1886-1887at 0c81423:raise Refusal("the plan could not be produced (see above).", ...). After 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 the plan's dry run refuses an existing remote after it has printed the plan. This is setup-project.py: paste lines quote each path, the scaffold's NEXT STEPS wait for step (7), step (3) refuses a file above the clone,-- --dry-runends at the plan, step (4) hears passed pins, and the upstream guard ignores case (#538) #569's file.- Direction: say the plan was refused when it was printed, and keep the present words for a plan that was not.
Activity
brettheap commentedon Oct 15, 2026
CLAIMED — lane openRepoShape-2, session 81650e29-c906-4fe8-96c9-55580bfe0c44@Eagle, 2026-10-15T18:24:22Z, for #608
Logged in
lanes/log/openRepoShape-2.mdat47f5feba1c74c3a13573cab932dece696b4e714d.The three reads (lane-collision-protocol Rule 1):
Merge main 55faad2 into fix/608-setup-step-checks, so the step-(4) ch…
setup-project.py: step (5) says a refusal that did not repeat did not…
setup-project.py: step (4) leaves an empty --pin-source to the plan, …
tests/conftest.py: the empty --pin-source helper says the validator's…
setup-project.py: a project name typed at the prompt is checked as `-…
tests/test_path_guard_hygiene.py and shape-doctor.py: a bare is_file/…