Skip to content

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

Closed

Description

@brettheap

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(), otherwise known.append. The ok sentence is at :1772-1774.
  • shape-doctor.py:manifest_candidates (:1372): the two top-level manifests and every contracts/*.yaml.
  • shape-doctor.py:ManifestKind.runs_in (:748) and MANIFEST_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:

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:

Activity

  1. brettheap commented on Oct 12, 2026

    @brettheap
    ContributorAuthor

    CLAIMED — lane openRepoShape-3, session 43f4ac63-0116-41de-977d-afc23cdf7fdf@Eagle, 2026-10-12T17:58:40Z, for #439

    Logged in lanes/log/openRepoShape-3.md at 4f6f1335d69949c8ed7f70c776bdd350d90769ae.

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

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

    @brettheap
    ContributorAuthor

    (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.

  3. brettheap commented on Oct 12, 2026

    @brettheap
    ContributorAuthor

    RELEASED — lane openRepoShape-3, session 43f4ac63-0116-41de-977d-afc23cdf7fdf@Eagle, 2026-10-12T19:31:26Z, for #439

  4. added this to the v1.1.0 milestone on Oct 14, 2026
  5. brettheap commented on Oct 14, 2026

    @brettheap
    ContributorAuthor

    CLAIMED — lane openRepoShape-3, session b30e8b49-f249-4668-adb1-1dbfa93c09e1@Eagle, 2026-10-14T16:29:14Z, for #439

    Logged in lanes/log/openRepoShape-3.md at 98d54551d4c9c68340abcfb4926b882e58496586.

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

    1. existing `CLAIMED —` comments on opensoft/openRepoShape#439:
    6:CLAIMED — lane openRepoShape-3, session 43f4ac63-0116-41de-977d-afc23cdf7fdf@Eagle, 2026-10-12T17:58:40Z, for opensoft/openRepoShape#439
    13:1. existing `CLAIMED —` comments on opensoft/openRepoShape#439:
    33:RELEASED — lane openRepoShape-3, session 43f4ac63-0116-41de-977d-afc23cdf7fdf@Eagle, 2026-10-12T19:31:26Z, for opensoft/openRepoShape#439
    2. `gh pr list --repo opensoft/openRepoShape --state all --search "#439"`, kept where the row or its body names `#439`:
       none
    3. `git ls-remote --heads git@github.com:opensoft/openRepoShape` branches naming `439` as a whole token:
       none
    
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

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions