Repository navigation
Description
adopt should print the Free-plan secrets hint only for a private or internal root, as the scaffold does since #565, and both tools should name the root as the reason.
From the checklist triage of 2026-10-15; Brett Heap approved its recommendations at 2026-10-15T16:49:38Z. One pull request covers the lines below.
Lines
- L2-17: adopt keys the Free-plan secrets hint to the legs' visibility, not the adopted root's, unlike scaffold since scaffold-project.py: a leg
ghsees and git cannot read is refusedscaffold-remote-existswith git's terminal prompt off, and the reuse re-run's visibility lines go by each leg as it stands (#542) #565. Where: adopt-project.py_create_leg_remotes(:7263-7276). Effort S; all. On main26c1600: At 26c1600 adopt-project.py:7263 takesplan.get("visibility", "private"), the legs' visibility (defaultprivate, :9729-9730), and printsfree_plan_secret_hinton it (:7271-7276); scaffold-project.py:1208-1209 prints the hint only when the root is private or internal; and an adopted root keeps its own visibility (templates/assembly-root/project.yaml:59-61); no open PR touches either call. (source)
Rides along (backlog; tick it here if the same change covers it)
- L2-44: the Free-plan hint, now printed only for a closed root, still names the closed legs as the reason. Where: scaffold-project.py:1209-1210; scripts/repo_shape.py:1011-1025. Effort S; all. On main
26c1600: At 26c1600 (scaffold-project.py: a legghsees and git cannot read is refusedscaffold-remote-existswith git's terminal prompt off, and the reuse re-run's visibility lines go by each leg as it stands (#542) #565 is 26c1600) the hint is gated onroot_is_closedbut formatted withf"{who} {are}", the closed legs, so only the "because" names the wrong repository; it follows Tracking: adopt-project.py, converting an existing repository in place #457 L2-17, the adopt half (ct461x459-D5). (source)
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-17 (P3; adopt-project.py, #565 review): adopt keys the Free-plan secrets hint to the two new legs, but the workflow that reads the secrets runs in the adopted root, which keeps its own visibility.
adopt-project.py:7131-7138at fdb0fa5:visibility = plan.get("visibility", "private")decides the NOTE and thefree_plan_secret_hint(...)call. The hint says org secrets "resolve to EMPTY inside the workflow" and offers repository secrets or an upgrade to Team, which holds only when the root is private or internal. A public source adopted with private legs prints it anyway.templates/assembly-root/project.yaml:57-62says the adopted root keeps whatever visibility it had.- scaffold-project.py: a leg
ghsees and git cannot read is refusedscaffold-remote-existswith git's terminal prompt off, and the reuse re-run's visibility lines go by each leg as it stands (#542) #565's fix round (review F1) keys the scaffold's hint to the root's own visibility, so after it the two tools disagree. This one predates scaffold-project.py: a legghsees and git cannot read is refusedscaffold-remote-existswith git's terminal prompt off, and the reuse re-run's visibility lines go by each leg as it stands (#542) #565.- Direction: print the hint only when the adopted root is private or internal, reading its visibility from GitHub as
_leg_visibilitydoes for a reused root (scaffold-project.py:982), and keep the per-leg NOTE.
L2-44 (nit; scaffold-project.py, #565 re-verify): the Free-plan hint is now printed only when the root is closed, but it still names the closed legs as the reason.
scaffold-project.py:1209-1210at 6889d99 passesf"{who} {are}", the closed legs, as the hint's subject.FREE_PLAN_HINT(scripts/repo_shape.py:1011-1025) then reads, for a public run over a reused private root and a reused private code leg, "testorg/Atlas-code is private, so org-level SHAPE_LEGS_APP_ID / SHAPE_LEGS_APP_PRIVATE_KEY resolve to EMPTY". The secrets resolve to EMPTY because the root, testorg/Atlas, is private. The facts the hint states are true; the stated reason is not.- Before scaffold-project.py: a leg
ghsees and git cannot read is refusedscaffold-remote-existswith git's terminal prompt off, and the reuse re-run's visibility lines go by each leg as it stands (#542) #565 a fresh run gave all three repositories one visibility, so naming the legs was harmless. The mixed-visibility re-runs make it show. The rowpublic-flag-over-private-rootpins the leg wording (tests/test_scaffold_reuse_seeded_legs.py:497,:533).adopt-project.py:7138-7140makes the same call with the two legs as the subject. L2-17 on Tracking: adopt-project.py, converting an existing repository in place #457 is the adopt half, so the subject should change in both tools together.- Direction: pass the root (
f"{repositories['assembly']} is") as the subject, and move the pinned test rows with it.
Activity
brettheap commentedon Oct 15, 2026
CLAIMED — lane openRepoShape-2, session 81650e29-c906-4fe8-96c9-55580bfe0c44@Eagle, 2026-10-15T18:22:51Z, for #602
Logged in
lanes/log/openRepoShape-2.mdat4b3df911cb0a5207d9f6889547e234441ae42cdf.The three reads (lane-collision-protocol Rule 1):
Merge origin/main 396c0ff (#570) into fix/602-free-plan-hint-root, so…
tests/test_adopt_free_plan_hint_root.py: a root whose visibility read…
README.md and the handbook: a Free-plan project keeps its CI secrets …
README.md and the handbook: say that a source's own `single-repositor…
Merge origin/main (de92614) into l3-563-docs
README.md, the handbook and the v1.1.0 notes: the adopted repository …