Repository navigation
Description
A hand-written adoption plan that checked plan ok before #635 should not end check in a refusal with no line and no remedy. adopt-project.py plan --org @x should name --org again. check should name one bad tracking_branch once. Each is something that worked on main or in v1.0.1 and that a v1.1.0 change broke.
From lane 4's checklist triage of 2026-10-16 (T5a), approved by Brett Heap at 2026-10-16T13:36:07Z ("approve all triage recommendations"). One pull request covers the lines below.
Parent: #459. Milestone: v1.1.0 (regressions of v1.1.0 changes: lane 3's exception 1 in #473, issuecomment-6216697223, "something that works on main or in v1.0.1 and that a v1.1.0 change breaks"). L4-151 and L4-152 come from #635 (da48256); L4-127 comes from #644 (cd5ffa2, #455).
Lands after:
- lane 2's Pinned shape copies: one bump, so AGENTS-shape.md is true of every root, the scaffold's chain WARNING offers only its own sources and spells
--pin-source, the root's not-used note spells it too, and THE LOCKSTEP RULE'sbumpruns (#610) #634 (ready): it editsscripts/repo_shape.pyandscripts/shape_materialize.py, both files this issue changes. - lane 2's the chain WARNING offers
--link-sourceto callers that do not take it (validate-manifest.py, setup's step (4)), and the naming gate prints--link-sourcevalues raw #661 (filed, v1.1.0): it editstemplates/assembly-root/scripts/validate-manifest.py, which L4-127's fix may touch. - If the remediation text of L4-152 is changed in
family.pytoo (see below), lane 5's family.py:add's refusal of a member's own gitlink held only under another spelling of its row's path moves it back to that path in the index alone, so the printed remedy no longer takes the member's gitlink away from its row (#646) #670, lane 2's scaffold-project.py and family.py:scaffold-bad-idandfamily-bad-idname an id derived from--projector--familyas derived and say to change that flag, so--project North_Windno longer says--id 'north_wind' must matchand sends the person to an--idthe naming policy then refuses (#659) #671 and lane 4's ownscripts/family.pypull requests, which edit that file. - repo_shape.py's YAML reader: Unicode spaces are stripped from text YAML keeps, the empty block key and
k: {?: 1}still read, and three texts about the reader are one word out of date (what #635 left) #715 lands after this issue: it changes the same reader and the same pinned file.
Effort: M: line numbers on the new refusals, a remedy for the refusal, a flag named where the reader refuses a rendered manifest, one row or one dropped sentence. Platform: all.
Files: scripts/repo_shape.py (a pinned shape copy, re-pinned, in load_yaml and the reader's new refusal), scripts/shape_materialize.py (manifest_invalid's YamlError branch, and FINDING_PLACEHOLDER), and templates/assembly-root/scripts/validate-manifest.py (a pinned shape copy) if L4-127's fix belongs there. The pull request re-pins repo_shape.py once, with v1.1.0's other bumps.
Lane openRepoShape-4 claims it at filing; see its CLAIMED comment.
Why this is P2, and why it is v1.1.0. L4-151 is the line a real user can meet. AGENTS.md's adoption step 2 (AGENTS.md:134-135) tells the agent to add a resolution: line to every question it answers, "saying why". A reason such as `adopt-project.py` reads it opens with a backtick, and a plan that checked plan ok before #635 now makes check exit 2 with no line and no remedy. Line numbers are at c6122e8 (#639); main has moved since.
Lines
- L4-151 (P2: a regression from repo_shape.py: a plain scalar opening with an indicator, an empty flow entry and a single pair in a flow sequence are refused, so
k: ]is not the text],pins: [,a]not['a']andk: [a: b]not the string'a: b'(#392, #393) #635,da48256): a hand-written adoption plan whoseresolution:opens with a backtick makesadopt-project.py checkexit 2 with no line and no remedy, where the same line double-quoted givesplan ok, and main read the unquoted one asplan ok(R392 O4). The mechanism: before repo_shape.py: a plain scalar opening with an indicator, an empty flow entry and a single pair in a flow sequence are refused, sok: ]is not the text],pins: [,a]not['a']andk: [a: b]not the string'a: b'(#392, #393) #635,_scalarrefused only&,*and!as a first character (da48256^:scripts/repo_shape.py:482), so aresolution:opening with a backtick read as text. repo_shape.py: a plain scalar opening with an indicator, an empty flow entry and a single pair in a flow sequence are refused, sok: ]is not the text],pins: [,a]not['a']andk: [a: b]not the string'a: b'(#392, #393) #635 addedif text[0] in "]},@`%" or text in ("?", ":"): raise _indicator_refusal(text)(da48256:scripts/repo_shape.py:536), andload_yaml(scripts/repo_shape.py:994onc6122e8) turns it intoREFUSED yaml-unparsable: <path>: <words>, which names the file but no line (repo_shape.py:_scalarreturns a BLOCK plain scalar that opens with]or}as text, sok: ],k: }and- ]read as the strings']'and'}', where YAML forbids a plain scalar to open with a flow indicator and PyYAML refuses, and the same fall-through readsk: ,,k: @a, `k:aandk: %a` #393 leftline N:optional), and carries no remediation (a re-run onda48256gives aRefusalwith an emptyremediation). Probed for this issue, on the reader alone, withparse_yaml("resolution: `adopt-project.py` reads it\n"): v1.0.1 andda48256^give{'resolution': '`adopt-project.py` reads it'};da48256raisesYamlError: a plain scalar cannot open with a backtick, which is reserved in YAML. (source) - L4-152 (a regression from repo_shape.py: a plain scalar opening with an indicator, an empty flow entry and a single pair in a flow sequence are refused, so
k: ]is not the text],pins: [,a]not['a']andk: [a: b]not the string'a: b'(#392, #393) #635: the adopt half): the whole-manifestYamlErrorbranch names no flag, and its remediation says the words are the validator's own.manifest_invalid'sYamlErrorcase (scripts/shape_materialize.py:4029-4031atda48256;:4255onc6122e8) says "the manifest this run would write is a file the project's own YAML reader refuses: <the reader's words>" with no value named. ItsMANIFEST_INVALID_REMEDIATION(:4106-4109atda48256;:4332onc6122e8) says "the words after each value are the validator's own", when no value is named and the words are the reader's.--org @xreaches it becauseSAFE_ARG_REadmits an@in an--org. GitHub owners cannot begin with@, so this is a typo path such as--org @opensoft. Measured:adopt-project.py plan --org @xstill exits 2adopt-manifest-invalidbut no longer names--org(main said--org is '@x', which the project's own validate-manifest.py refuses: ...). Before repo_shape.py: a plain scalar opening with an indicator, an empty flow entry and a single pair in a flow sequence are refused, sok: ]is not the text],pins: [,a]not['a']andk: [a: b]not the string'a: b'(#392, #393) #635 the reader readorg: @xas'@x', so the project's validator refused the value andplannamed it (probed: v1.0.1 andda48256^give{'org': '@x'};da48256raisesYamlError: a plain scalar cannot open with @, which is reserved in YAML).family.py init --org @x --family Orbit [--dry-run], which exited 0 on main and planned@x/Orbit, now exits 2family-manifest-invalidbefore anything is created: that half is an IMPROVEMENT, and it is not part of the fix. If the fix rewordsMANIFEST_INVALID_REMEDIATION,scripts/family.pyrepeats the same words (:2277and:2324onc6122e8) and its text moves with it (R392 O5). (source) - L4-127 (a regression from bootstrap.py and validate-manifest.py: a branch holding a NUL or a lone surrogate is a finding and step (a) does not hand it to git, so
tracking_branch: "a\ud83db"or a leg'sbranch: "a\x00b"no longer endsmake bootstrapin a subprocess traceback under amanifest ok(#455) #644,cd5ffa2, assembly-root bootstrap.py: a lone surrogate or NUL intracking_branch(or a leg'sbranch:) endsmake bootstrapin a subprocess traceback in step (a), andvalidate-manifest.pysaysmanifest ok, so no tool names it #455; cosmetic):adopt-project.py checknames one badtracking_branchtwice since bootstrap.py and validate-manifest.py: a branch holding a NUL or a lone surrogate is a finding and step (a) does not hand it to git, sotracking_branch: "a\ud83db"or a leg'sbranch: "a\x00b"no longer endsmake bootstrapin a subprocess traceback under amanifest ok(#455) #644, the second time with no plan key. The plan'stracking_branch: "a\ud83db"or"a\x00b"gives no traceback either way. On main (4cf5fb0): exit 1,FINDING unsafe-value: tracking_branch is 'a\ud83db', which is not a value this tool will put on a git or gh command line. On the head: exit 1, that finding plusFINDING plan-manifest-invalid: the manifest this run would write is one the project's own validate-manifest.py refuses: manifest-tracking-branch: …. bootstrap.py and validate-manifest.py: a branch holding a NUL or a lone surrogate is a finding and step (a) does not hand it to git, sotracking_branch: "a\ud83db"or a leg'sbranch: "a\x00b"no longer endsmake bootstrapin a subprocess traceback under amanifest ok(#455) #644 added_branch_finding("manifest-tracking-branch", ...)(templates/assembly-root/scripts/validate-manifest.py:558on main), andcheckalso runs the project's own validator.FINDING_PLACEHOLDER(scripts/shape_materialize.py:4177) has nomanifest-tracking-branchrow. A row ("manifest-tracking-branch": "TRACKING_BRANCH"), or dropping the validator's sentence whereunsafe-valuealready fired, would tidy it (R455 O2, K455's second). (source)
What is expected
- L4-151. The refusal names the line (
line N:) and says what to do (double-quote a value that opens with a backtick, or reword it), whether the reader keeps refusing the backtick or not. The question of whether to keep refusing is not asked here: YAML reserves the backtick, and repo_shape.py: a plain scalar opening with an indicator, an empty flow entry and a single pair in a flow sequence are refused, sok: ]is not the text],pins: [,a]not['a']andk: [a: b]not the string'a: b'(#392, #393) #635 meant to refuse it. What is wrong is that the refusal gives a person nothing to act on, where the plan used to pass. A test checks a plan whoseresolution:opens with a backtick throughcheck: exit 2, a line number and a remedy in the output, andplan okfor the double-quoted twin. - L4-152.
plan --org @xnames--orgagain, in the words it had on main. The remediation stops saying "the words after each value are the validator's own" where no value is named.family.py init --org @x's refusal stays. - L4-127. One finding for one bad
tracking_branch: amanifest-tracking-branchrow inFINDING_PLACEHOLDER, or the validator's sentence dropped whereunsafe-valuealready fired.
Not a duplicate: no issue numbered #650 to #700 cites L4-127, L4-151 or L4-152 (read at 13:17Z). #635 closed #392 and #393; #644 closed #455.
Each line above is a line of #459's checklist comment (issuecomment-6214812326) or, for L4-127, #457's (issuecomment-6214598072). Tick them there too when this closes.
Lane: openreposhape-4 (openRepoShape-4)
Activity
brettheap commentedon Oct 16, 2026
CLAIMED — lane openRepoShape-4, session 11c6c0ef-495a-4a05-94cf-811b7b0a1012@Eagle, 2026-10-16T13:57:06Z, for #708
Logged in
lanes/log/openRepoShape-4.mdata2379c8154393bedb2347f94c5f2857e3112a041.The three reads (lane-collision-protocol Rule 1):
repo_shape.py: a flow-mapping entry whose key opens with an indicator…
Merge main 64ec47c (#747, #817) into l3-733-ignored-sections
Merge origin/main (64ec47c) into l3-563-docs
docs/release-notes/v1.1.0.md: RV630's pre-review of the B2 stage, #747'…
Merge main bad05d2 into fix/712-validate-pins-contracts
family.py init: where the holder's own YAML reader refuses the manife…