Repository navigation
Description
Goal: the doctor's pins and shape currency rows say only what update-shape.py check says of the same root, and count every state check counts.
Filed by lane openRepoShape-5 on Brett Heap's word of 2026-10-16T12:17:02Z ("#458's update-shape/bump-leg (~22)"), from two lines on #458: 6158353941 (lane 4's known limits from #512's verification V512m). Lane 4 judged both OPEN on main 95780dd (#473 comment 6215386495); lane 5 re-measured both on main 879d804, with one root.
Lands after: nothing. shape-doctor.py is not a pinned copy, so no project re-pins. No open PR touches it.
The measured root (one adopted-style root, scaffolded with local bare remotes, both lines at once): the pin carries a row shape/Makefile with no file at that path while Makefile is at the root (a merged-away collision copy, #502), and .gitignore is a symlink to .gitignore.real holding the same bytes. validate-pins.py reports one finding, shape-copy-missing for shape/Makefile, and none for the link. The doctor then prints, in pins: ... shape/Makefile (merged into Makefile) is a collision copy the root merged away, so \update-shape.py check` reports it `merged-away`, and the `apply` it prints drops its pin row in the re-pin commit: the step the `shape currency` row names too. update-shape.py checkon the same root printsmerged-away 1 copy-is-link 1 unchanged 10, REFUSAL AHEAD: `apply` will refuse while these are unresolved — .gitignore, and a NEXT line whose apply, pasted, exits 2 update-rewrite-symlink`, writing nothing.
Lines (path:line at main 879d804)
- The
pinsrow keeps the gate as its NEXT only for a pin or a manifest kept as a link, not for a pinned copy kept as one.with_merged_away_rows(shape-doctor.py:2408-2464) asksus.linked_record(ctx.root, us.root_kind(ctx.root))(:2446), which looks atcontracts/shape-pin.yamland the manifest only (update-shape.py:1209-1233). A pinned COPY kept as a link beside merged-away rows therefore gets thecheckNEXT and the clause above, thoughcheckcalls that copycopy-is-link(a conflict) and itsapplyis refused. By reading, the same holds for anupstream-removedor anunmappedrow beside merged-away ones (all three are inupdate-shape.CONFLICTS, :327); only the link was run. (Tracking: update-shape.py and bump-leg.py, keeping a project's shape copies and leg pins current #458's 6158353941, first line.) - The
shape currencyreason counts the five original states plusmerged-awayonly.shape-doctor.py:4135-4140fixesstates = (UNCHANGED, UPSTREAM_CHANGED, LOCALLY_MODIFIED, BOTH, UPSTREAM_ADDED)and addsMERGED_AWAYwhen counted, whileupdate-shape.ORDER(:328-331) also holdsALREADY_AT_TARGET,UPSTREAM_REMOVED,UNMAPPED,COPY_MISSINGandCOPY_IS_LINK. Measured on the root above: the row prints10 unchanged / 0 upstream-changed / 0 locally-modified / 0 both / 0 upstream-added / 1 merged-awayand names.gitignore, shape/Makefile, eleven rows counted and twelve present, wherecheckprintsmerged-away 1 copy-is-link 1 unchanged 10. (Tracking: update-shape.py and bump-leg.py, keeping a project's shape copies and leg pins current #458's 6158353941, second line; pre-existing for those states.)
Direction
pins: askcheck's own question: the rowsus.prepareclassifies (theshape currencyrow already calls it), and keep the gate as the NEXT, with the sentence aboutapplyleft out, when any row that is notmerged-awayis a conflict (row.is_conflict), naming it ("checkwill also say REFUSAL AHEAD over ..."). Or word the clause as conditional oncheck's verdict. Test with a link (pytest.mark.skipifwhere symlinks are off, as the file's neighbours).shape currency: count every state inus.ORDERthat is non-zero, keeping the five that print even at zero, so a root without these states reads byte-for-byte as it did and the tests that hold today's text stay green;detail["counts"]already carries them all.
Overlaps: none with open PRs; #634 and #639 do not touch shape-doctor.py, and lane 5's other branches do not either. Lane 3 is filing #460's shape-doctor lines into v1.1.0 issues (#473 comment); check them for a shared region before starting.
Mark each line → this issue on #458, and tick it there when this closes.
🤖 Generated with Claude Code
Activity
brettheap commentedon Oct 16, 2026
CLAIMED — lane openRepoShape-3, session b30e8b49-f249-4668-adb1-1dbfa93c09e1@Eagle, 2026-10-16T13:22:04Z, for #676
Logged in
lanes/log/openRepoShape-3.mdat2a85bf1c54266a64e7564b4255db9c4173919ace.The three reads (lane-collision-protocol Rule 1):