Skip to content

the Free-plan hint's reads: a public reused holder gets the "private" NOTE and hint, an unread root is taken as the run's visibility, and an unread plan is silent #660

Closed

Description

@brettheap

Both creating tools and family.py init should read the visibility of the repository the validate workflow runs in, say so when they cannot, and not take the run's own --visibility for it.

From the checklist triage of 2026-10-15, batch 3; Brett Heap approved its recommendations at 2026-10-16T12:14:51Z. One pull request covers the lines below.

Lands after: #621. Its _root_visibility and ROOT_VISIBILITY_UNREAD are the model, and it leaves scaffold-project.py's reused-root fallback and family.py alone.

Decision applied: DB4 (option 1) and DB11 (option 1). D5(b) of the morning triage is the same rule for the root: the hint goes by the root.

Lines

Line numbers are at the commits named; main has moved since.

  • L2-58: family.py init --reuse-empty-repo goes by --visibility, the run's, and never asks the reused holder's own visibility, so a public holder gets the "private" NOTE and the Free-plan hint. Where: scripts/family.py _finish_holder_remote (:1335-1357; args.visibility in ("private", "internal") at :1347, free_plan_secret_hint at :1353-1356), --visibility default private (:5730-5731), _checked_reuse (:1246) asks only whether the repository is empty, the manifest's visibility: is filled from args.visibility (:1167; templates/family-root/family.yaml:46); family.py has no gh repo view --json visibility call. Effort S; all. On main 396c0ff4: with a stub gh that knows testorg/Orbit as empty and PUBLIC, init --reuse-empty-repo --no-push exits 0 and prints "testorg/Orbit is private and its members will be too" and "testorg/Orbit and its members are private, so org-level ... resolve to EMPTY"; the stub's call log holds no visibility question (probe out58.txt).

Rides along (backlog; tick it here if the same change covers it)

  • L2-57: a reused root whose visibility cannot be read is taken as the run's visibility, so a public root can get the Free-plan hint. Where: scaffold-project.py _create_remotes (remote_visibility(...) or args.visibility, :1188), _reused_leg_visibility (return seen or args.visibility, :1227), _leg_visibility (return reused_visibility or "private", :1052), _private_leg_note (:1230-1277; the root gate at :1271-1274). Effort S-M; all. On main 396c0ff4: a stub gh that knows testorg/Atlas as empty and PUBLIC and answers repo view --json visibility with HTTP 502 makes --reuse-empty-repo --no-push exit 0 and print "testorg/Atlas-spec and testorg/Atlas-code are private, so org-level ... resolve to EMPTY"; with the read working the same run prints no hint (probe out57fail.txt, out57ok.txt). After adopt-project.py and scaffold-project.py: the Free-plan secrets hint goes by the assembly root's own visibility on GitHub and names the root as its reason, so a public source adopted with private legs is no longer told its organisation secrets resolve to EMPTY (#602) #621 the same run says "testorg/Atlas is private" (its subject becomes the root), which is just as false.
  • L2-59: free_plan_secret_hint returns None for a plan it cannot read, exactly as for a paid plan. Where: scripts/repo_shape.py free_plan_secret_hint (:1028-1056; the docstring at :1041-1043 chooses silence over a guess; .plan.name read at :1045-1055); callers scaffold-project.py:1272, adopt-project.py:7812, scripts/family.py:1353; README.md:628-631 says "the creating tools check and say so". Effort M; all. Read, not measured: whether a non-owner's token reads plan is unmeasured (DB4). repo_shape.py is a pinned shape copy, so the plan reader goes in scripts/shape_materialize.py (free, other or unread) and FREE_PLAN_HINT's text stays; adopt-project.py and scaffold-project.py: the Free-plan secrets hint goes by the assembly root's own visibility on GitHub and names the root as its reason, so a public source adopted with private legs is no longer told its organisation secrets resolve to EMPTY (#602) #621 says it leaves the plan read alone by design.
  • L2-71: family.py init's Free-plan hint says "<holder> and its members are private", which names members that do not exist at init and that init does not make. Where: scripts/family.py _finish_holder_remote (the hint's subject at :1353-1354, the NOTE's "and its members will be too" at :1348-1349); scripts/repo_shape.py :1013-1014, :1019-1020. Effort S; all. On main 4cf5fb07: with a stub gh that answers plan free for any organisation, family.py init --org testorg --family Orbit --no-push --work-dir <d> exits 0 and prints "testorg/Orbit and its members are private, so org-level". No member exists yet at that point. DB11: decide the NOTE's "and its members will be too" (:1348-1349) in the same edit.

Not a duplicate: only #602 mentions the hint, and it is L2-17 and L2-44 (the subject), not the reads.

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-58 (P3; scripts/family.py, #602 follow-up): family.py init --reuse-empty-repo goes by --visibility, the run's, and never asks the reused holder's own visibility, so a public holder gets the "private" NOTE and the Free-plan hint.

— #459, comment

L2-57 (P3; scaffold-project.py, #602 review): a reused root whose visibility cannot be read is taken as the run's visibility, so a public root can get the Free-plan hint.

— #459, comment

L2-59 (P3; scripts/repo_shape.py, #602 review): free_plan_secret_hint returns None for a plan it cannot read, exactly as for a paid plan, so a closed root on an organisation whose plan does not read back as free gets neither the hint nor a word.

— #459, comment

L2-71 (nit; scripts/family.py, #621 fix round): family.py init's Free-plan hint says "<holder> and its members are private", which names members that do not exist at init and that init does not make.

— #459, comment

Activity

  1. added this to the v1.1.0 milestone on Oct 16, 2026
  2. brettheap commented on Oct 16, 2026

    @brettheap
    ContributorAuthor

    CLAIMED — lane openRepoShape-2, session 81650e29-c906-4fe8-96c9-55580bfe0c44@Eagle, 2026-10-16T12:44:28Z, for #660

    Logged in lanes/log/openRepoShape-2.md at d214009d0aa6e509231a19b1a7e3cdae3e6b2436.

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

    1. existing `CLAIMED —` comments on opensoft/openRepoShape#660:
       none
    2. `gh pr list --repo opensoft/openRepoShape --state all --search "#660"`, kept where the row or its body names `#660`:
       none
    3. `git ls-remote --heads git@github.com:opensoft/openRepoShape` branches naming `660` as a whole token:
       none
    
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

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions