Skip to content

scaffold-project.py: --pin 007@<commit> exits 0 and scaffolds a root whose own validate-pins.py refuses entry 7, because neutral_product_pins: entries (and the pin file's product:) are written bare #516

Closed

Description

@brettheap

Lane: openreposhape-2 (openRepoShape-2)

(lane openRepoShape-2, 2026-10-13T13:55Z) Filed on Brett Heap's word: his answer "File as v1.0.0 issue" to this lane's question on L2-11, 2026-10-13T13:52Z. It replaces checklist item L2-11 on #459, its parent. The adopt side is #514, fixed in PR #515.

The state. A person scaffolds with scaffold-project.py --pin <product>@<commit> --pin-source <clone>, and YAML reads the product name as a number: 007, 2026 or 1.5.

What happens. This was probed on main 631f087 with local bare remotes and a stub gh.

  • The scaffold accepts 007 and exits 0.
  • project.yaml gets neutral_product_pins: then - 007 (scaffold-project.py:1259-1260). The project's YAML reader reads that back as [7].
  • In a recursive clone of the root, validate-manifest.py --root . says manifest ok. validate-pins.py --root . exits 1 with FINDING neutral-pin-entry-malformed: project.yaml neutral_product_pins entry 7 is not a non-empty product name. The root's validate.yml runs it, so the new project's first CI run is red.
  • The neutral pin template writes product: {{PIN_PRODUCT}} bare (templates/assembly-root/contracts/neutral-product-pin.yaml:30), so contracts/007-pin.yaml says product: 007, which also reads back as 7.
    • No reader compares that field today (validate-pins.py reads source_repository), so it fails nothing yet.
    • Both the scaffold and adopt render this template.
  • The openGlass control passes both validators.

Why v1.0.0. Brett Heap's word. A scaffold that exits 0 makes a root that its own validator refuses. Only a product name that reads as a number reaches it, but --pin accepts one.

Fix direction.

How to test.

  • For 007, 2026, 1.5 and openGlass, scaffold with --pin <name>@<commit> --pin-source <a local clone> into local bare remotes.
  • In a recursive clone of the root, assert:
    • validate-pins.py --root . and validate-manifest.py --root . exit 0;
    • neutral_product_pins: reads back as the text given;
    • contracts/<name>-pin.yaml's product: reads back as the text given.
  • The first three cases are red on main.
  • The pin template is shared, so adopt's --pin tests run too.

Evidence: in opensoft/brett-wip, handoffs/xFactory/attachments/lane-openRepoShape-2/impl514-adopt-neutral-pins-quoted/tools/scaffold-pin.sh and tools/w514-scaffold-probe-631f087.log. See also PR #515's body, "The scaffold side".

Related:

Activity

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

    @brettheap
    ContributorAuthor

    CLAIMED — lane openRepoShape-2, session 81650e29-c906-4fe8-96c9-55580bfe0c44@Eagle, 2026-10-13T13:56:25Z, for #516

    Logged in lanes/log/openRepoShape-2.md at 40c738aebc102d5065e89a43b5751d1bf0dee157.

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

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