Repository navigation
shape-doctor.py: manifest kinds counts a file that declares a registered kind validated wherever it sits in a root that runs that kind's check, though each check reads only fixed paths, so a contracts/project.yaml in an assembly root, a contracts/family.yaml or contracts/spec-pin.yaml in a family holder, and a contracts/<x>-pin.yaml that no leg or declared descent names are ok and COMPLIANT though nothing reads them #439
Description
Lane: openreposhape-3 (openRepoShape-3)
What happens. #375 (#327) made the row ask whether a kind's check runs on this kind of root (ManifestKind.runs_in). It does not ask whether that check reads the file's path, and each gate reads fixed paths. So every other contracts/*.yaml that declares one of those kinds is still counted validated, and the row says "every declared kind has a registered validator".
Measured on main 45e01f4 with the suite's own fixtures: a scaffolded Atlas root and a holder made by family.py init + add, each COMPLIANT before the change. Each file below was added and committed by itself:
assembly root + contracts/project.yaml (kind: project-manifest, id: "007", nothing else)
ok manifest kinds 6 manifest(s), every declared kind has a registered validator
COMPLIANT (exit 0) detail.validated: [..., "contracts/project.yaml (project-manifest)", ...]
assembly root + contracts/release-pin.yaml (kind: pinned_contract_manifest, commit: not-a-commit)
ok manifest kinds 6 manifest(s), every declared kind has a registered validator
COMPLIANT (exit 0) detail.validated: [..., "contracts/release-pin.yaml (pinned_contract_manifest)", ...]
assembly root + contracts/naming-old.yaml (kind: repository-naming-policy, forms: 7)
ok manifest kinds 6 manifest(s), every declared kind has a registered validator
COMPLIANT (exit 0)
family holder + contracts/family.yaml (kind: family-manifest, one member row with no gitlink, commit: "not-a-commit")
ok manifest kinds 4 manifest(s), every declared kind has a registered validator
COMPLIANT (exit 0) detail.validated: [..., "contracts/family.yaml (family-manifest)", ...]
family holder + contracts/spec-pin.yaml (kind: pinned_contract_manifest, commit: not-a-commit)
ok manifest kinds 4 manifest(s), every declared kind has a registered validator
COMPLIANT (exit 0)
None of these files reaches a gate. detail.registered_elsewhere is absent in all five, because each kind's check does run on that kind of root.
Where.
- shape-doctor.py:
check_manifest_kinds(:1674). The decision is at :1728-1731:elif ctx.kind not in entry.runs_in(), otherwiseknown.append. Theoksentence is at :1772-1774. - shape-doctor.py:
manifest_candidates(:1372): the two top-level manifests and everycontracts/*.yaml. - shape-doctor.py:
ManifestKind.runs_in(:748) andMANIFEST_VALIDATORS(:756-777).
What each gate reads, on the same sha:
| gate | reads |
|---|---|
validate-manifest.py |
project.yaml only (templates/assembly-root/scripts/validate-manifest.py:679) |
validate-family.py |
family.yaml (:78); contracts/shape-pin.yaml, its only pin (:446); contracts/repository-naming.yaml (:785) |
validate-pins.py |
the shape pin (:292); contracts/<role>-pin.yaml for each leg project.yaml declares (:136); contracts/<product lowercased>-pin.yaml for each neutral_product_pins: entry (:523) |
the doctor's naming row |
the standard's own policy, not the root's (shape-doctor.py:1314-1319) |
Why it matters. The row's sentence is a claim about this root, and for these files it is false: no gate reads them. That is #211's claim and #327's again, one level down: the row decides by root kind when it should decide by path. The pin cases are the realistic ones. A neutral pin whose neutral_product_pins: entry was dropped, or a leg pin left in a holder, reads as checked.
Direction: count a file validated only at a path its check reads on this root. Those paths are:
- the root's own manifest;
contracts/shape-pin.yaml;- the declared leg and neutral-product pins;
contracts/repository-naming.yaml.
Report any other file that declares a registered kind apart from validated, and say that no gate reads it. #375 ruled registered_elsewhere a FINDING because a file that declares kind: asserts what it is. The writer should follow that or argue for a note.
The NEXT takes the file out as git holds it (#375's removal_ways), or the human declares it. It never declares a pin itself: AGENTS.md says "Do NOT declare a pin the human has not asked for". It never suggests renaming the file onto a declared path.
What must be kept:
- On an untouched root, every file that is
validatedtoday stays so, and the row stays byte-identical. - shape-doctor.py calls an assembly root whose
project.yamldoes 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's skip, shape-doctor.py reads onlyproject.yamlat a root that also carries afamily.yaml, so an assembly root whosefamily.yamldeclares two unmounted members is COMPLIANT, and itsmanifest kindsrow says that kind has a registered validator, which is never run #211'sfamily_besideand shape-doctor.py:manifest kindscounts a registered kindvalidatedonly on a kind of root that runs its check, so acontracts/family.yamlin an assembly root, or acontracts/project.yamlin a family holder, is a FINDING naming thegit rmthat takes it out instead ofokand COMPLIANT (#327) #375'sregistered_elsewhereare unchanged.
Open PR #358 (#291) adds declared_pins, which is the set this needs. Whichever of the two lands second merges check_manifest_kinds again. The path-classification-policy entry, which the registry covers with this row itself, is outside this issue.
Source. PR #375 (#327), Left out: "a registered kind at a path its check never reads, in a root where that check does run, is still counted validated. Examples are a contracts/project.yaml in an assembly root, a contracts/family.yaml in a holder, and a contracts/<x>-pin.yaml that no leg or declared descent names." PR #375's review also found that "a holder with contracts/family.yaml is still ok, 4 manifests".
Related:
- shape-doctor.py reads only
project.yamlat a root that also carries afamily.yaml, so an assembly root whosefamily.yamldeclares two unmounted members is COMPLIANT, and itsmanifest kindsrow says that kind has a registered validator, which is never run #211 and shape-doctor.py:manifest kindscounts acontracts/*.yamlthat declares a registered kind as validated though that kind's validator never runs on this kind of root, so acontracts/family.yamlin an assembly root, or acontracts/project.yamlin a family holder, isokand COMPLIANT where the same bytes at the root are a FINDING #327 (closed): the same claim at the root's top and by root kind. - PR shape-doctor.py: a family.yaml beside an assembly root's project.yaml is a
manifest kindsFINDING, INVALID (manifest-kinds), naming each member it pins with no gitlink, off its pin or with no 40-hex pin and each gitlink under members/ no row names, so a root its family gate refuses is no longer COMPLIANT, exit 0, with that file counted as validated (#211) #220'sLeft out, which stated the root-kind rule. - shape-doctor.py: the
manifest kindsrow's NEXT for a file that does not load (a conflicted or non-UTF-8contracts/shape-pin.yaml) is "register the kind in shape-doctor.py's MANIFEST_VALIDATORS ... or remove the file from the root", so the one fix the doctor prints for a damaged pin is to delete it #291 and PR shape-doctor.py: themanifest kindsrow puts back a shape or leg pin undercontracts/that does not load with the git commandpin_restorepicks from its own state, shows a copy the shape pin has a row for or a neutral product pin with a read-onlygit diff, and leaves any other file to a person whatever it is called, so its NEXT no longer tells the reader to delete the pin (#291) #358 (open; the same row, for files that do not load). shape-doctor.py: themanifest kindsrow puts back a shape or leg pin undercontracts/that does not load with the git commandpin_restorepicks from its own state, shows a copy the shape pin has a row for or a neutral product pin with a read-onlygit diff, and leaves any other file to a person whatever it is called, so its NEXT no longer tells the reader to delete the pin (#291) #358 already treats "acontracts/release-pin.yamlthat no leg and no product names" as the project's own file.
Activity
brettheap commentedon Oct 12, 2026
CLAIMED — lane openRepoShape-3, session 43f4ac63-0116-41de-977d-afc23cdf7fdf@Eagle, 2026-10-12T17:58:40Z, for #439
Logged in
lanes/log/openRepoShape-3.mdat4f6f1335d69949c8ed7f70c776bdd350d90769ae.The three reads (lane-collision-protocol Rule 1):
brettheap commentedon Oct 12, 2026
(lane openRepoShape-3, 2026-10-12T18:56:46Z) Ruling, Brett Heap 2026-10-12, on how the row reports such a file: a FINDING, as #375 ruled for a kind checked nowhere on the root. The verdict is INVALID, exit 1, and the NEXT takes the file out as git holds it.
brettheap commentedon Oct 12, 2026
RELEASED — lane openRepoShape-3, session 43f4ac63-0116-41de-977d-afc23cdf7fdf@Eagle, 2026-10-12T19:31:26Z, for #439
brettheap commentedon Oct 14, 2026
CLAIMED — lane openRepoShape-3, session b30e8b49-f249-4668-adb1-1dbfa93c09e1@Eagle, 2026-10-14T16:29:14Z, for #439
Logged in
lanes/log/openRepoShape-3.mdat98d54551d4c9c68340abcfb4926b882e58496586.The three reads (lane-collision-protocol Rule 1):
shape-doctor.py: `manifest kinds` never calls a file a gate reads `un…
shape-doctor.py: a wrong `kind:` in a file a gate reads gets a read-o…
shape-doctor.py: `manifest kinds` prints one command for its NEXT, th…