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 check refuses no root-kept symlink at or above a path the shape writes, so a link that dangles or leaves the tree makes execute traceback, or write the shape's files OUTSIDE the assembly, after both leg remotes are pushed #178
(lane openRepoShape-2, 2026-10-09T03:31:15Z) Found by the delta review of the #167 branch at b635473 (its N3); pre-existing on main 7f84ca4 / b18cca9, unchanged by #167, and distinct from #169 (non-canonical leg paths) and #172 (a mount path colliding with a shape directory). Not claimed.
What is wrong. When the plan keeps a source SYMLINK in the assembly root at or above a path the shape materialises (.gitattributes, .github/, contracts/, scripts/), check says plan ok, both legs are created and pushed, and then place() in scripts/shape_materialize.py (:996path.exists() is False for a dangling link; :1007mkdir) either tracebacks or writes through the link:
.gitattributes -> nowhere/attrs (dangling, target dir absent)
Python traceback (FileNotFoundError) after the legs, exit 1, no split branch
same
.github -> tooling/gh with tooling/ sent to a leg
traceback (FileExistsError/FileNotFoundError) after the legs
same
.github -> spec/ci (into a mount, absent in the leg)
traceback after the legs
same
.github -> ../outside-ci (relative, leaves the tree)
"adoption verified", bootstrap 1, and the shape's validate.yml is WRITTEN OUTSIDE the assembly into <work-dir>/outside-ci/
exit 1 with a correct adopt-shape-file-missing, but the file is still written outside
.github -> /abs/dir (absolute)
verified, bootstraps on this machine only; written to /abs/dir
exit 1, correct finding; still written outside
.github -> spec (the mount itself)
verified, bootstrap 1
exit 2 is in submodule 'spec' after the legs (#167's own N1)
Every row leaves both leg remotes behind, so a corrected re-run meets leg-remote-exists. Driver: tools/s_delta.py {main|wt} D4 D5 D6 D6b D7 D7b under the attachments path below.
What would fix it.check evaluates each root-kept symlink against the planned root tree and refuses one that dangles, leaves the tree (relative .. above the root or an absolute target), or enters a leg mount, with a finding naming the link and its target; execute refuses the same before _create_leg_remotes (the same gate #168 added). The materializer must never write through a link that leads out of the assembly. #169's canonical-path check is the natural home for the leg-path half.
Report and drivers: opensoft/brett-wiphandoffs/xFactory/attachments/lane-openRepoShape-2/review167-b635473/ (report.md N3 and section 4c).
CLAIMED — lane openRepoShape-1, session f711ec94-a922-4e5f-8d35-efcfe983caa7@Eagle, 2026-10-09T13:57:48Z, for #178
Logged in lanes/log/openRepoShape-1.md at a3be0da0366718bdfdaf1e9b43c2fbefcc6e4e77.
The three reads (lane-collision-protocol Rule 1):
1. existing `CLAIMED —` comments on opensoft/openRepoShape#178:
none
2. `gh pr list --repo opensoft/openRepoShape --state all --search "#178"`, kept where the row or its body names `#178`:
none
3. `git ls-remote --heads git@github.com:opensoft/openRepoShape` branches naming `178` as a whole token:
none
Activity
brettheap commentedon Oct 9, 2026
CLAIMED — lane openRepoShape-1, session f711ec94-a922-4e5f-8d35-efcfe983caa7@Eagle, 2026-10-09T13:57:48Z, for #178
Logged in
lanes/log/openRepoShape-1.mdata3be0da0366718bdfdaf1e9b43c2fbefcc6e4e77.The three reads (lane-collision-protocol Rule 1):
Merge origin/main 20e13f0 into fix/adopt-root-kept-symlinks: `_entry_…
adopt-project.py: `check` decides a symlink kept AT a shape path by w…
adopt-project.py: the walker's comment gives its example link without…
Merge origin/main 39ac59c into fix/adopt-root-kept-symlinks: #199, #213…
adopt-project.py: the symlink probe reads what `git config` writes as…
shape_materialize.py: the materializer's refusals name each path betw…
adopt-project.py: `check` finds, and `execute` refuses before any leg…
update-shape.py: a path the root holds a symlink or a Windows junctio…
adopt-project.py: a symlink kept AT the copy under `shape/` of a path…
shape_materialize.py: where a symlink leads the shape's copy is #262'…
adopt-project.py: `check` says a symlink that leads the shape's copy …
adopt-project.py and shape_materialize.py: a path that follows more t…
adopt-project.py: `check` reads a symlink's drive-letter target (`C:/…
adopt-project.py: `check` finds what every clone's own `.git` holds w…
1 remaining item
Merge origin/main a2cb7d3 into fix/adopt-root-kept-symlinks: #255's `…
tests/test_adopt_root_symlinks.py: the fixture that switches off the …
adopt-project.py: three docstrings name the second place `check` and …
Merge origin/main 965420b into fix/adopt-root-kept-symlinks: `_entry_…
tests/test_adopt_root_symlinks.py: an empty-target link above `script…
Merge origin/main af01068 into fix/adopt-root-kept-symlinks: `_entry_…
adopt-project.py: `check` follows each declared pin's file, `contract…
tests/test_adopt_root_symlinks.py: `declare()` reads the plan as text…
Merge main b0826e0 (#504's squash for #183 and #178) into fix/adopt-g…
Merge main b0826e0 into fix/adopt-plan-quote-yaml-keywords (#181)
tests.yml and adopt-project.py: the Windows job installs git-filter-r…
docs/release-notes/v1.0.0.md: brought up to main 8beb3d9, so section …
docs/release-notes/v1.0.0.md: brought up to main 3121945, so section …