Skip to content

AGENTS.md, README and scaffold-project.py --help say nothing of the scaffold's two path-collision refusals (scaffold-leg-path-collides, scaffold-pin-collides) or that spec, code and shape cannot be pinned, so a human or agent can learn of them only by hitting them #288

Closed

Description

@brettheap

Lane: openreposhape-4 (openRepoShape-4)

Found by this lane's adversarial review of the #241 fix branch (fix/scaffold-pin-product-collisions, PR #256, head a25c2e1; its nit N4), verified on main 39ac59c (the leg-path half by running the refusal, the docs half by grep), and re-checked by grep on main c3a9645 after #256 landed: neither refusal code appears in AGENTS.md, README.md or docs/cli.md, --pin's help still ends "Repeatable." (scaffold-project.py:315), and --spec-path / --code-path still have no help= (:296-297). The other line numbers below are on 39ac59c. It is a docs gap and changes no behaviour. Not claimed.

What is wrong. Two refusals protect the scaffold from dying after both legs are pushed, and neither is in a document:

What a reader has today, on 39ac59c:

# $U: a clean checkout at 39ac59c; $C a local clone of a stand-in neutral product; gh is a shim that logs and exits 97 (never called).
python3 $U/scaffold-project.py --org testorg --project Northwind --elected-by 'Test Human' --elected-on 2026-09-02 \
    --local-remote-dir $R/remotes --pin-source $C --work-dir $R/work --spec-path contracts --dry-run
#   exit 2   REFUSED scaffold-leg-path-collides: --spec-path 'contracts' contains `contracts/spec-pin.yaml` and 3 more. The shape writes them into the assembly root before the legs are mounted, ...
#            Remediation: nothing was created, ... a path the shape writes into the assembly root (`README.md`, `project.yaml`, `contracts/spec-pin.yaml`, ... `contracts/shape-pin.yaml`). The defaults `spec` and `code` pass.
# the same flags with `--pin spec@$SHA --dry-run` on 39ac59c: exit 0, "pin  opensoft/spec @ ab07fa7e6048 ... -> contracts/spec-pin.yaml"; #256 turns that into scaffold-pin-collides.

Both refusals fire at the plan, before the typed yes and before anything is created, so no work is lost. What is missing is the explanation: AGENTS.md section 2 tells an agent "If it refuses, read the refusal: each one names what to run instead" (AGENTS.md:87), and these two name nothing to run, because the remedy is to pass a different value. An agent briefed from AGENTS.md alone cannot say beforehand that --pin code@... or a repeated --pin will be refused, and the scaffold-pin-collides sentence #256 writes ("name the product for the repository it pins") assumes a typo: for a repository genuinely named code, spec or shape nothing can pin it, and the refusal never says outright that those three names are reserved.

Why. Neither change touched a .md file: git diff b538015^ b538015 --stat lists adopt-project.py, scaffold-project.py, scripts/shape_materialize.py and one test file, and a25c2e1 changes scaffold-project.py and adds one test file. docs/cli.md is generated from --help (scripts/render-cli-reference.py), so a flag with no help= has no reference line either. The two refusals themselves are at scaffold-project.py:434-473 (leg paths, on 39ac59c) and :476-498 (pins, on a25c2e1; on main since c3a9645).

What it should do. One docs change for both, with the decisions left to the author:

  1. Where the text goes. One sentence or short list in AGENTS.md's "Scaffolding a project that DECLARES descent" (a product whose name lowercases to spec, code or shape, or the same product twice, is refused before anything is created; the shape writes those pin files itself and one file holds one pin) and one for the leg paths (a leg path may not be, hold or lie inside a path the shape writes; the defaults pass). Whether README's neutral-pin paragraph needs the same line.
  2. --help. "Repeatable." could read "Repeatable, once per product", and --spec-path / --code-path could say what they are and name the refusal. docs/cli.md must then be regenerated (tests/test_cli_reference.py fails otherwise).
  3. Whether the scaffold-pin-collides remediation should name spec, code and shape outright as reserved, as the leg-path one lists the paths. scaffold-project.py: a --pin whose file the shape writes itself (spec, code, shape, any case, owner or not) or another --pin writes (openGlass and OpenGlass, or one product twice) is refused before anything is created, under --dry-run alike, so --pin spec@<sha> no longer plans and then makes three repositories to die in the materializer, and a repeated pin is no longer dropped without a word (#241) #256 has landed, so it is taken here.
  4. Both refusals are on main now (b538015 and c3a9645), so one change documents both and the AGENTS.md section is edited once.

How to test. There is no behaviour to test. tests/test_cli_reference.py covers docs/cli.md against --help. If AGENTS.md is edited, grep -n "scaffold-pin-collides\|scaffold-leg-path-collides" AGENTS.md README.md docs/cli.md should find each code once, and the codes must be spelled as the tool prints them (run both refusals and compare).

Related: #197 (PR #234, the leg-path refusal, landed as b538015), #241 (PR #256, the pin refusal, landed as c3a9645).

Activity

  1. brettheap commented on Oct 12, 2026

    @brettheap
    ContributorAuthor

    CLAIMED — lane openRepoShape-4, session 3431c370-df80-4c11-a041-41bce42d8b38@Eagle, 2026-10-12T00:41:09Z, for #288

    Logged in lanes/log/openRepoShape-4.md at 9288d5ac5127aa06eb6c372fa213e53bf19c7e7f.

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

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

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions