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
family.py add does not ask whether the member's project.yamlid is one the family already pins, so adding a repository renamed at the forge (same id, new name) commits a holder that validate-family.py then refuses as member-duplicate-id #330
What happens.cmd_add compares the new member's repository and project name with the existing rows (family.holding, which #221 made case-blind), mounts it, then reads its project.yamlid, and never compares that id with the rows'. Measured on be2790e: a scaffolded project testorg/Atlas (id atlas) and a bare copy of it as testorg/Atlas2 (same id), both in a local remote directory, added in turn to a family holder:
family.py add --member testorg/Atlas ... committed 63798239159d: .gitmodules, members/Atlas, family.yaml
family.py add --member testorg/Atlas2 ... committed f8fd25fa57e3: .gitmodules, members/Atlas2, family.yaml
validate-family.py --no-members FINDING member-duplicate-id: Atlas2 and Atlas both record id 'atlas': one project is pinned twice. exit 1
Where. scripts/family.py:cmd_add (:823; the id comes from _read_member_project after git submodule add); templates/family-root/scripts/validate-family.py:_check_member_ids_unique (:525), the validator that refuses it afterwards.
Why it matters.add writes a commit its own gate rejects, and the holder then fails CI. The check belongs before the mount: #236 (open, for #203) adds a pre-mount probe that reads project.yaml from a throwaway clone, which is where this refusal fits; placed after the mount today, a refusal would leave exactly the staged mount #203 is about. So implement it after #236 lands.
Source. PR #221, ## Left out, first bullet. Related: #203 (open), #206 (closed).
CLAIMED — lane openRepoShape-3, session b2cc9e59-4dc8-4f43-b01b-81cb99c8b07e@Eagle, 2026-10-12T10:59:53Z, for #330
Logged in lanes/log/openRepoShape-3.md at 6af6ff8743fbc7f6ce68f3fa034574f2a25c0151.
The three reads (lane-collision-protocol Rule 1):
1. existing `CLAIMED —` comments on opensoft/openRepoShape#330:
none
2. `gh pr list --repo opensoft/openRepoShape --state all --search "#330"`, kept where the row or its body names `#330`:
none
3. `git ls-remote --heads git@github.com:opensoft/openRepoShape` branches naming `330` as a whole token:
none
Activity
brettheap commentedon Oct 12, 2026
CLAIMED — lane openRepoShape-3, session b2cc9e59-4dc8-4f43-b01b-81cb99c8b07e@Eagle, 2026-10-12T10:59:53Z, for #330
Logged in
lanes/log/openRepoShape-3.mdat6af6ff8743fbc7f6ce68f3fa034574f2a25c0151.The three reads (lane-collision-protocol Rule 1):
family.py: `bump --dry-run` fetches the member, resolves `--to` and p…
family.py: `add` refuses `member-duplicate-id` before it mounts anyth…
Merge origin/main dd8d0ea into fix/adopt-root-kept-symlinks: #261's `…
family.py: `bump --to` asks `add`'s duplicate-id question, peels an a…