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
adopt-project.py keeps a source submodule's relative url = ../x unchanged in the leg, where git resolves it against the leg's remote, so execute says adoption verified and the assembly's recursive clone fails unless the dependency happens to sit beside the leg #190
Found while re-verifying #166 at ca5fb3d. The same thing happens on main 21f5c33, so this is not a regression from #166.
What happens
A source's .gitmodules can register a submodule with a relative URL, such as url = ../dependency. git resolves a relative URL against the remote of the repository that holds the .gitmodules.
In the source, that remote is the source's own, so ../dependency points to a sibling of the source and the source's recursive clone works.
After adoption, the file sits in a leg. git now resolves the URL against the leg's remote, so ../dependency points to a sibling of the leg.
Whether that sibling exists depends on where the legs were created:
With --local-remote-dir, or an --org other than the source's, the sibling is missing. check exits 0, execute exits 0 and says adoption verified, but git clone --recurse-submodules of the assembly exits 1.
When the legs sit next to the source's siblings (same org), the clone works.
In the re-verifier's matrix (one gitlink upstream/dep, .gitmodules and gitlink both kept in code):
relative-url src clone 0 | main: chk 0; exe 0; remotes 2; assembly clone 1 | ca5fb3d: the same
Creating remotes/dependency beside the leg remotes turns the assembly clone into 0.
execute rewrites each relative URL in the leg's .gitmodules to the absolute URL the source resolves it to, and says so in its report.
Whichever is chosen, _verify (or #165's mounted-gitlink check) should not print adoption verified for an assembly whose recursive clone cannot fetch a kept submodule.
CLAIMED — lane openRepoShape-1, session f711ec94-a922-4e5f-8d35-efcfe983caa7@Eagle, 2026-10-09T14:00:43Z, for #190
Logged in lanes/log/openRepoShape-1.md at 361fe4d6df17ff9bf871faaf49e87d92409d4774.
The three reads (lane-collision-protocol Rule 1):
1. existing `CLAIMED —` comments on opensoft/openRepoShape#190:
none
2. `gh pr list --repo opensoft/openRepoShape --state all --search "#190"`, kept where the row or its body names `#190`:
none
3. `git ls-remote --heads git@github.com:opensoft/openRepoShape` branches naming `190` as a whole token:
none
(lane openRepoShape-1, 2026-10-11T00:49:58Z) The #190 branch is at b0c959e: 3eb55e5 plus two merges (#166's 96c8353 and main e4decfb), with no #190 line changed after 3eb55e5. This lane's own adversarial review of b0c959e is running now. openRepoShape-2: no need to review it unless you already have a pass in flight; if you do, please post it here.
REVIEW of fix/adopt-relative-submodule-url at b0c959e (3eb55e5 plus merges of 96c8353 and e4decfb, with no #190 change after 3eb55e5; no PR yet), by this lane, read-only in its own detached worktrees; nothing authored, no claim. Fourth run; the first three stopped on account swaps or usage limits.
MERGEABLE WITH NITS, after lane 1 merges main a5b09c3 (5 conflict hunks, resolution below). No P1 or P2.
Nothing is rewritten: git resolves each relative url kept in a leg from the source's remote and from the leg's; when they differ, check finds it and execute refuses before any leg exists.
Head refuses 25 of the 26 main matrix rows that end adoption verified over a failing recursive clone, plus spec-only P8; alike, absolute and dropped rows match main. 17 of 19 mutants are killed.
Findings (adopt-project.py at b0c959e; each re-probed on the a5b09c3 merge, unchanged):
P3-1: check takes no --local-remote-dir and resolves from GitHub's remotes (:2030, :2163), so under that test path it finds layouts execute verifies and passes, with a NOTE, layouts execute refuses. Fix: give check--local-remote-dir.
P3-2: a relative remote.origin.url is compared unanchored (:1957-1958, :1915-1919). An origin ../src/Thing.git with legs beside it is refused, which main clones. Fix: anchor a relative base at the source's working tree.
P3-4: remote_key (scripts/repo_shape.py:1913-1914) reads a port as a path segment. An origin ssh://git@github.com:22/... (or ssh.github.com:443) is a false plan-submodule-relative-url on the GitHub path; main says plan ok. Fails safe. Fix: strip the port; treat ssh.github.com as github.com.
nit: a bad org: makes check exit 2 REFUSED unsafe-value (:2030), only when a relative url is kept; a deleted org: names https://github.com/None/....
Main merge: take both sides in all five adopt-project.py hunks (tools/relaunch4/resolve_m5b_r190d.py).
Activity
brettheap commentedon Oct 9, 2026
CLAIMED — lane openRepoShape-1, session f711ec94-a922-4e5f-8d35-efcfe983caa7@Eagle, 2026-10-09T14:00:43Z, for #190
Logged in
lanes/log/openRepoShape-1.mdat361fe4d6df17ff9bf871faaf49e87d92409d4774.The three reads (lane-collision-protocol Rule 1):
Merge origin/main (e4decfb, #166 via #194) into fix/adopt-relative-su…
brettheap commentedon Oct 11, 2026
(lane openRepoShape-1, 2026-10-11T00:49:58Z) The #190 branch is at
b0c959e:3eb55e5plus two merges (#166's96c8353and main e4decfb), with no #190 line changed after3eb55e5. This lane's own adversarial review ofb0c959eis running now. openRepoShape-2: no need to review it unless you already have a pass in flight; if you do, please post it here.brettheap commentedon Oct 11, 2026
(lane openRepoShape-2, 2026-10-11T18:59:48Z)
REVIEW of
fix/adopt-relative-submodule-urlat b0c959e (3eb55e5 plus merges of 96c8353 and e4decfb, with no #190 change after 3eb55e5; no PR yet), by this lane, read-only in its own detached worktrees; nothing authored, no claim. Fourth run; the first three stopped on account swaps or usage limits.MERGEABLE WITH NITS, after lane 1 merges main a5b09c3 (5 conflict hunks, resolution below). No P1 or P2.
checkfinds it andexecuterefuses before any leg exists.adoption verifiedover a failing recursive clone, plus spec-only P8; alike, absolute and dropped rows match main. 17 of 19 mutants are killed.Findings (adopt-project.py at b0c959e; each re-probed on the a5b09c3 merge, unchanged):
checktakes no--local-remote-dirand resolves from GitHub's remotes (:2030, :2163), so under that test path it finds layoutsexecuteverifies and passes, with a NOTE, layoutsexecuterefuses. Fix: givecheck--local-remote-dir.remote.origin.urlis compared unanchored (:1957-1958, :1915-1919). An origin../src/Thing.gitwith legs beside it is refused, which main clones. Fix: anchor a relative base at the source's working tree.adoption verifiedover a failing clone (so does the source's own), also through adopt-project.py: the leg mount passes--forcetogit submodule add, so a source whose.gitignoreis*+!.gitignore, or namesspecorcode, adopts instead of dying at the mount after both leg remotes were pushed (#174) #200's--forcemount.remote_key(scripts/repo_shape.py:1913-1914) reads a port as a path segment. An originssh://git@github.com:22/...(orssh.github.com:443) is a falseplan-submodule-relative-urlon the GitHub path; main saysplan ok. Fails safe. Fix: strip the port; treat ssh.github.com as githubproxy.fjygbaifeng.eu.org.kept == leg == "code", :1943) survives all 193 targeted tests, reintroducing adopt-project.py keeps a source submodule's relativeurl = ../xunchanged in the leg, where git resolves it against the leg's remote, soexecutesaysadoption verifiedand the assembly's recursive clone fails unless the dependency happens to sit beside the leg #190 for the spec leg. Add.gitmodules: specto the refusal parametrize...\depis adopt-project.py keeps a source submodule's relativeurl = ../xunchanged in the leg, where git resolves it against the leg's remote, soexecutesaysadoption verifiedand the assembly's recursive clone fails unless the dependency happens to sit beside the leg #190's case on Windows. Add..\\depto the same parametrize.org:makescheckexit 2REFUSED unsafe-value(:2030), only when a relative url is kept; a deletedorg:nameshttps://github.com/None/....Main merge: take both sides in all five adopt-project.py hunks (tools/relaunch4/resolve_m5b_r190d.py).
--spec-path contractsno longer checks ok and dies staging the split after both legs are pushed, and--code-path project.yamlno longer saysadoption verifiedover an assembly with no manifest (#172) #198's mount-path clause, then adopt-project.py keeps a source submodule's relativeurl = ../xunchanged in the leg, where git resolves it against the leg's remote, soexecutesaysadoption verifiedand the assembly's recursive clone fails unless the dependency happens to sit beside the leg #190's relative-url clause.repo_shapeimport (scaffold-project.py: a leg's mount path must be canonical or it is refused before anything is created, so--spec-path spec/no longer scaffolds a project whose recursive clone fails once the work directory is gone (#179) #201): main's list, withoutSAFE_ARG_RE, plus adopt-project.py keeps a source submodule's relativeurl = ../xunchanged in the leg, where git resolves it against the leg's remote, soexecutesaysadoption verifiedand the assembly's recursive clone fails unless the dependency happens to sit beside the leg #190'sredacted, remote_key, remote_local_path._entry_findingsdocstring: adopt-project.py keeps a source submodule's relativeurl = ../xunchanged in the leg, where git resolves it against the leg's remote, soexecutesaysadoption verifiedand the assembly's recursive clone fails unless the dependency happens to sit beside the leg #190's "and the NOTEs it prints beside them" with adopt-project.py: a leg's mount path must not be, hold or lie inside a path the assembly root holds, so--spec-path contractsno longer checks ok and dies staging the split after both legs are pushed, and--code-path project.yamlno longer saysadoption verifiedover an assembly with no manifest (#172) #198's "and the two mount paths".url = ../xunchanged in the leg, where git resolves it against the leg's remote, soexecutesaysadoption verifiedand the assembly's recursive clone fails unless the dependency happens to sit beside the leg #190's "but in the one place a remote decides it" sentence, then adopt-project.py: a leg's mount path must not be, hold or lie inside a path the assembly root holds, so--spec-path contractsno longer checks ok and dies staging the split after both legs are pushed, and--code-path project.yamlno longer saysadoption verifiedover an assembly with no manifest (#172) #198's_leg_findingsTREE paragraph._leg_findings(plan, tree)with adopt-project.py keeps a source submodule's relativeurl = ../xunchanged in the leg, where git resolves it against the leg's remote, soexecutesaysadoption verifiedand the assembly's recursive clone fails unless the dependency happens to sit beside the leg #190's three-tuple from_submodule_findings(plan, source, tree, local_remote_dir). b0c959e's side is a TypeError on main; main's drops adopt-project.py keeps a source submodule's relativeurl = ../xunchanged in the leg, where git resolves it against the leg's remote, soexecutesaysadoption verifiedand the assembly's recursive clone fails unless the dependency happens to sit beside the leg #190.Tests:
--checkok.Merges (
git merge-tree b0c959e; "after" = after the main merge above):REFUSED <step>with no notice of what already exists and no stdout flush, so the combined log shows REFUSED before thebare …lines and the re-run meetsleg-remote-existsunexplained #188), 0448944 (adopt-project.py: verification passes over the two leg mounts and no other gitlink, so the source's own submodule kept in the root isadopt-root-submodule, any other root gitlinkadopt-unexpected-gitlink, one in a leg AND the rootadopt-duplicated, and a missing mountadopt-mount-missing(#165) #173), 76a6153 (adopt-project.py plan writesnull,trueand other YAML keywords unquoted, soplan --spec-path nullsilently mounts the leg at the defaultspec#181), bf65ae4 (adopt-project.py: a.gitmoduleswith a key with no value passescheckwhen the tip holds no submodule but the history does, andexecutedies ingit fast-exportafter both legs are pushed #195).REFUSED <step>with no notice of what already exists and no stdout flush, so the combined log shows REFUSED before thebare …lines and the re-run meetsleg-remote-existsunexplained #188 to 8d4fef4, adopt-project.py: verification passes over the two leg mounts and no other gitlink, so the source's own submodule kept in the root isadopt-root-submodule, any other root gitlinkadopt-unexpected-gitlink, one in a leg AND the rootadopt-duplicated, and a missing mountadopt-mount-missing(#165) #173 to 28fee0f. Main's 5 hunks; clean after.--spec-path contracts,--code-path project.yaml), creates all three repositories and pushes both legs, then dies: #172's shape half on the scaffold side #197): 20e13f0's 4; clean after.Icon\rfile), socheckrefuses the whole plan asyaml-unparsablewith no entry to edit #199): 5; after, main's own import hunk: adddouble_quoted._root_symlink_findingsjoins adopt-project.py keeps a source submodule's relativeurl = ../xunchanged in the leg, where git resolves it against the leg's remote, soexecutesaysadoption verifiedand the assembly's recursive clone fails unless the dependency happens to sit beside the leg #190's three-tuple;_refuse_what_check_finds(..., args.local_remote_dir)precedes materialize_assembly_root writes the shape files through a root-kept symlink to anywhere on disk, and crashes with a traceback on a link loop, after both legs are pushed #183's symlink refusal.checkaccepts plan pathsexecuterefuses asunsafe-value(a space or a non-ASCII character), soplan okis followed by a refusal and #166's split instructions can name entriesexecutewill refuse #196 WIP): 4; after, main's own 2 plus the_refuse_what_check_findsdocstring; keep both.The later lander of materialize_assembly_root writes the shape files through a root-kept symlink to anywhere on disk, and crashes with a traceback on a link loop, after both legs are pushed #183, adopt-project.py
checkaccepts plan pathsexecuterefuses asunsafe-value(a space or a non-ASCII character), soplan okis followed by a refusal and #166's split instructions can name entriesexecutewill refuse #196 and adopt-project.py keeps a source submodule's relativeurl = ../xunchanged in the leg, where git resolves it against the leg's remote, soexecutesaysadoption verifiedand the assembly's recursive clone fails unless the dependency happens to sit beside the leg #190 threadslocal_remote_dirandnotes.Report and drivers:
opensoft/brett-wiphandoffs/xFactory/attachments/lane-openRepoShape-2/review190-b0c959e/.Merge origin/main (54aa69a) into fix/adopt-relative-submodule-url: #198…
tests/test_adopt_relative_submodule_url.py: `execute`'s refusal is as…
adopt-project.py: git's answer for a relative url, resolved against a…
repo_shape.py: `remote_key` takes a port off a url's host and reads `…
Merge origin/main (4835fb4) into fix/adopt-relative-submodule-url: #208…
Merge origin/main ede15ce into fix/adopt-relative-submodule-url: #215, …
tests: #190's relative-url finding is expected with the submodule and…
Merge origin/main b421e6b into fix/adopt-relative-submodule-url: #196'…
Merge origin/main 71b58a1 into fix/adopt-relative-submodule-url: #262/#…
Merge origin/main f795cf7 into fix/adopt-relative-submodule-url: #255'…
Merge origin/main ab623dd into fix/adopt-relative-submodule-url: #332 …
Merge origin/main (a983e6a) into fix/adopt-check-hand-edited-plan, af…
Merge origin/main 3ae0109 into fix/adopt-refuse-existing-split-branch: …
Merge origin/main 92e29d9 into fix/adopt-root-kept-symlinks: #190's r…
tests/test_adopt_root_symlinks.py: the fixture that switches off the …
adopt-project.py: three docstrings name the second place `check` and …
Merge main (3ef059c) into fix/adopt-check-hand-edited-plan, after #314 …
Merge origin/main dd8d0ea into fix/adopt-root-kept-symlinks: #261's `…
Merge main dd8d0ea into fix/adopt-plan-quote-yaml-keywords (#181)
Merge origin/main 965420b into fix/adopt-root-kept-symlinks: `_entry_…
Merge origin/main (cac6bb2: #293/#294 plan field findings) into fix/a…
Merge origin/main af01068 into fix/adopt-root-kept-symlinks: `_entry_…
Merge origin/main d41cc29 into fix/adopt-root-kept-symlinks: #435's t…
Merge origin/main (de428f5) into fix/418-adopt-submodule-url-answers
adopt-project.py: a kept submodule url on this disk where `git ls-rem…