Skip to content

shape-doctor.py: with contracts/shape-pin.yaml and a pinned copy both conflicted, the NEXT takes the taken side's copies whole, so pasting it drops a person's --accept-local edit to the copy and the doctor then says COMPLIANT #485

Closed

Description

@brettheap

Lane: openreposhape-2 (openRepoShape-2)

(lane openRepoShape-2, 2026-10-12T22:22Z) Found by this lane's re-verify of #358 (at a5563c3), and filed on Brett Heap's word ("file L2-5 as a v1.0.0 issue", 2026-10-12). It replaces checklist item L2-5 on #460, its parent.

The state. A merge leaves contracts/shape-pin.yaml and a pinned copy both conflicted. Two ordinary flows reach it:

  • an update-shape.py apply --branch shape/update-<sha> pull request, beside a branch where a person edited the same copy and kept the edit with apply --accept-local (the exit the doctor's own shape currency row names for a locally modified copy, and AGENTS.md's both exit), when the update author merges main or the person's branch into the update branch;
  • two applies to different targets.

What the doctor says. The shape currency row's NEXT, and since #358 the manifest kinds row's too, is git -C <root> checkout --ours -- <copy> contracts/shape-pin.yaml (shape-doctor.py:2364-2407 at #358's a5563c3; on main the same command comes from #267's static copy lists, decff87).

What pasting it does.

  • With the update side as ours, the copy loses the person's lines, including hunks git had merged cleanly: a naming entry in contracts/repository-naming.yaml, or a project's own target appended to the Makefile. Once the merge is finished, the doctor says COMPLIANT, exit 0. The edit survives only on the other parent.
  • With the person's side as ours, their bytes are kept, the upgrade is dropped, and the doctor flags it (DRIFTED, shape-pin-manifest-disagree).
  • Meanwhile the manifest kinds row's detail.restore calls the copy project (left to a person), while its own NEXT overwrites it.

Why it is in v1.0.0. A pasted NEXT drops a person's edit, and the doctor then verifies the root. #358 fixes the same mechanism for a copy conflicted on its own. Reaching it takes two concurrent branches that each re-pin, editing the same lines of one copy; a Makefile with a project block is the likeliest copy.

Fix direction (from #358's fix round, "Left as it was"):

How to test. The review's probes OD and OD2 build the state with the real update-shape.py. Pin both as tests that are red on main, run every NEXT as pasted, and assert that the person's lines survive and that the doctor does not say COMPLIANT until the copy is merged.

Evidence: handoffs/xFactory/attachments/lane-openRepoShape-2/review358-a5563c3/ (final-report.md, fix-list.md F1 and F2, tools/) in opensoft/brett-wip.

Related: #358 (#291), which narrows this to the copies the taken side's pin lists; #267 (#237), which introduced the restore; #460, the parent.

Activity

  1. added this to the v1.0.0 milestone on Oct 12, 2026
  2. brettheap commented on Oct 12, 2026

    @brettheap
    ContributorAuthor

    CLAIMED — lane openRepoShape-2, session 81650e29-c906-4fe8-96c9-55580bfe0c44@Eagle, 2026-10-12T22:23:35Z, for #485

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

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

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

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions