Skip to content

validate-family.py member-duplicate runs only with the members checked and compares project: exactly, so --no-members passes a family.yaml that names one row twice, and rows IRRS and irrs with distinct ids pass, though members/IRRS and members/irrs are one directory on macOS and Windows #331

Closed

Description

@brettheap

Lane: openreposhape-3 (openRepoShape-3)

What happens. member-duplicate is raised in _member_project_name, which only _check_member calls, and _check_members returns before that loop under --no-members. _check_member_ids_unique (#221) runs before the return, but it compares project in projects exactly as well. Measured on be2790e with a family holder from family.py init, a hand-written family.yaml of two rows, and --no-members:

two rows `project: IRRS` (repositories InkRouter/IRRS twice)   ->  family ok: Fam (fam), 2 member(s)    exit 0
rows `IRRS` and `irrs` with different ids                       ->  family ok: Fam (fam), 2 member(s)    exit 0

With members checked the comparison is if project in seen, exact (read from the code; not run with two mounted members).

Where. templates/family-root/scripts/validate-family.py:_member_project_name (:215-228), _check_members (the --no-members return), _check_member_ids_unique (:525).

Why it matters. --no-members is the run a private family's CI falls back to when its members cannot be checked out, so a duplicate row passes the one gate that runs. family.py add now refuses a case variant, so only a hand edit makes such rows. The file is one of the copies a holder pins, so a change is a shape update. Direction: move member-duplicate ahead of the --no-members return, like member-duplicate-id, and compare project: case-folded.

Source. PR #221, ## Left out, second and third bullets.

Activity

  1. brettheap commented on Oct 12, 2026

    @brettheap
    ContributorAuthor

    CLAIMED — lane openRepoShape-4, session 3431c370-df80-4c11-a041-41bce42d8b38@Eagle, 2026-10-12T11:07:57Z, for #331

    Logged in lanes/log/openRepoShape-4.md at 1804d5716abfd6a345c672b1cd9a264837f59cfa.

    The three reads (lane-collision-protocol Rule 1):

    1. existing `CLAIMED —` comments on opensoft/openRepoShape#331:
       none
    2. `gh pr list --repo opensoft/openRepoShape --state all --search "#331"`, kept where the row or its body names `#331`:
       none
    3. `git ls-remote --heads git@github.com:opensoft/openRepoShape` branches naming `331` as a whole token:
       none
    
  2. added a commit that references this issue on Oct 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions