Skip to content

shape-doctor.py calls an assembly root whose project.yaml does not parse (a merge conflict) NOT A SHAPE ROOT, exit 2, and its NEXT line tells the reader to adopt that assembly root in place while the Triad row calls it a single repository #205

Closed

Description

@brettheap

Lane: openreposhape-4 (openRepoShape-4)

Found by this lane's probe of main e4decfb on 2026-10-11, re-verified on main e4decfb today. Not claimed.

What is wrong. Context.__init__ in shape-doctor.py decides the root's kind through _declares, which reads the manifest through _read, and _read turns every Refusal from load_yaml (yaml-unparsable, yaml-unreadable) into None. So a project.yaml that EXISTS but does not parse, such as one carrying merge-conflict markers from a shape-update branch, is treated exactly like a missing one: the root is NOT_A_ROOT, the the way in row tells the reader to ADOPT the repository in place, the Triad advisory calls an assembly root with two mounted legs "a single repository", and the verdict is NOT A SHAPE ROOT, exit 2. The project's own validate-manifest.py names the real fault on the same file.

# Atlas scaffolded into local bare remotes and cloned --recurse-submodules to $C
python3 shape-doctor.py --root $C          # COMPLIANT   exit 0
# wrap project.yaml's `shape:` block `commit:` line in conflict markers:
#   <<<<<<< HEAD / the line / ======= / a second commit: line / >>>>>>> shape/update-1111
python3 shape-doctor.py --root $C          # exit 2
#   n/a       what is here  ..., a .gitmodules, a contracts/ directory, a spec/ directory, a code/ directory, ...,
#                           a manifest file that declares neither `kind: project-manifest` nor `kind: family-manifest`
#   n/a       the way in    this is a git repository with no shape manifest: it is ADOPTED in place ...
#             NEXT          python3 .../adopt-project.py plan --source .../Atlas --project Atlas
#   advisory  Triad         This is a single repository. ...
#   NOT A SHAPE ROOT   (exit 2)
(cd $C && python3 scripts/validate-manifest.py)
#   exit 2   REFUSED yaml-unparsable: .../project.yaml: line 77: merge keys are not supported

What the docs promise. AGENTS.md, "Checking a repository's compliance", item 5: "NOT A SHAPE ROOT is a question for the human, not a task. There is no project.yaml and no family.yaml. The two ways in are adopt-project.py plan ... and setup.sh ..." Here there IS a project.yaml, and the doctor's own what is here row says so. Item 3: "A FINDING names its fix, and you run THAT"; the fix this report names is an adoption, an act that extracts two new leg repositories from a repository that already has them.

What would fix it. In Context.__init__, tell "absent" from "present but unreadable": when project.yaml or family.yaml exists and load_yaml refuses, keep the root a PROJECT (or a FAMILY, by filename) with manifest = None and the refusal kept, so the manifest row reports the YAML refusal as a FINDING and the verdict is INVALID (manifest), exit 1. check_the_way_in and check_triad_advisory should not fire while a manifest file exists. PR #193 noted that "the doctor has no yaml-unparsable test to mirror"; this would add one.

Activity

  1. brettheap commented on Oct 11, 2026

    @brettheap
    ContributorAuthor

    CLAIMED — lane openRepoShape-4, session fc41839d-ea5c-40d3-9ebe-5136287407f7@Eagle, 2026-10-11T16:15:24Z, for #205

    Logged in lanes/log/openRepoShape-4.md at 4ccaefbe0236a7e17fed5672e7bb80cfa47e3996.

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

    1. existing `CLAIMED —` comments on opensoft/openRepoShape#205:
       none
    2. `gh pr list --repo opensoft/openRepoShape --state all --search "#205"`, kept where the row or its body names `#205`:
       none
    3. `git ls-remote --heads git@github.com:opensoft/openRepoShape` branches naming `205` as a whole token:
       none
    
  2. brettheap commented on Oct 11, 2026

    @brettheap
    ContributorAuthor

    (lane openRepoShape-4, 2026-10-11T18:56:02Z) Still held by this lane after the team04a profile switch (new session 83338f75-6338-4d51-9749-89179ecaf55f). Branch fix/doctor-unparsable-manifest is at 50aa967: 9f2e6c0 (the fix: a project.yaml or family.yaml that is there and does not load is INVALID (manifest) or INVALID (family), exit 1, quoting load_yaml's own refusal and naming the project's validator, never NOT A SHAPE ROOT) plus 50aa967 (tests only: family.yaml broken three ways, --json parity, no adopt-project.py advice, the machine row unchanged). Targeted set 300 passed over the committed bytes. An adversarial review is running; the pull request follows it.

    Landing note for lane 3: this branch conflicts with fix/doctor-reads-family-yaml (#211) in shape-doctor.py, four hunks all inside check_manifest_kinds; the resolution looks mechanical (keep both sides), and the review is checking it.

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

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions