From ea704e49c9bdff06915b7c9da3950533bf0b4f48 Mon Sep 17 00:00:00 2001 From: Brett Heap <1513478+brettheap@users.noreply.github.com> Date: Mon, 12 Oct 2026 11:48:31 +0000 Subject: [PATCH] single-repository.yaml: openRepoShape records that it stays a single repository, as Brett Heap decided on 2026-10-11, so the Triad advisory is no longer said here (#337) openRepoShape is not a Triad (no `project.yaml`, no `family.yaml`), so the doctor gave its own checkout an `advisory` row, and `adopt-project.py plan` and `check` a `triad` line, saying the Triad is the preferred shape to every session that began work here. Brett Heap decided on 2026-10-11 that this repository stays a single repository. The standard provides for saying so in one file at the root, and this is that file. The record confers nothing: no gate, no floor, no grant, no clearance eligibility and no review difference, and this repository is reviewed exactly as it was. The Triad advisory is its only reader; nothing else reads it, and nothing here writes it for anybody else. - `single-repository.yaml` at the root is `templates/single-repository/ single-repository.yaml` with the template's header and field comments untouched, `schema_version: 1`, `kind: single-repository-record`, and the three values Brett Heap chose: `decided_by: "Brett Heap"`, `decided_on: "2026-10-11"` and his `reason:` sentence, that openRepoShape is the standard itself, its rules and the tools that apply them change together in one reviewed commit, and every project pins one commit of it. - The optional `revisit_on:` line and the one comment line above it are deleted, as the template says to when there is nothing to revisit; he chose none. - It validates against `contracts/single-repository-record.yaml` through the only reader there is: `shape_advisory.read_record` answers `silences` with no field notes, and `shape_advisory.read` answers `recorded-single`. - `shape-doctor.py --root .` therefore gives no `advisory` row for this checkout, and its `what is here` row names a single-repository.yaml. The other rows and the verdict are as they were. - `tests/test_shape_advisory.py` gains `test_this_repository_records_that_it_ stays_single`: this root's record is of the right kind with every field its schema asks for, and the doctor gives this checkout no `advisory` row. It fails on main (`absent`) and passes here, and it pins no value of the record, so Brett Heap amending his decision changes the file and not the test. Unchanged: `scripts/shape_advisory.py`, `shape-doctor.py`, `adopt-project.py`, `scaffold-project.py`, the schema and the template are not touched, so the advisory is said exactly as before in every repository that has not recorded staying single, and `docs/cli.md`, README.md and AGENTS.md need no change (README's Layout block does not list every root file, and is at its cap). Left out: README's Layout block does not name this root file; nothing requires it and the cap leaves no line for it. `adopt-project.py plan` over a repository carrying a record puts it to the person as the `ambiguous-top-level-yaml` question, as it does any root `*.yaml`; a path-policy rule for the record, which a conversion would have to drop or keep, is a separate change. Lane: openreposhape-3 (openRepoShape-3) Co-Authored-By: Claude Sonnet 5.5 --- single-repository.yaml | 37 ++++++++++++++++++++++++++++++++++++ tests/test_shape_advisory.py | 36 +++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 single-repository.yaml diff --git a/single-repository.yaml b/single-repository.yaml new file mode 100644 index 00000000..52a12760 --- /dev/null +++ b/single-repository.yaml @@ -0,0 +1,37 @@ +schema_version: 1 +kind: single-repository-record + +# =========================================================================== +# single-repository.yaml — this project STAYS A SINGLE REPOSITORY, recorded. +# +# OPTIONAL, AND NEVER OWED. The Triad — an assembly root with a spec leg and +# a code leg — is the PREFERRED project shape (openxFactory +# `prefer-triad-project-shape`, ratified by Brett Heap on 2026-10-06), and a +# person starting work here is told so once. This file is how a project that +# has DECIDED to stay in one repository says so, once, and stops meeting that +# advisory. A project that writes nothing owes nothing and is reviewed +# identically. +# +# IT CONFERS NOTHING. No gate, no floor, no grant, no clearance eligibility, +# no lifecycle state and no review difference. Its only reader is +# openRepoShape's Triad advisory; no review lane, required check, validator, +# floor, council or merge gate reads it. +# +# HOW TO USE IT. Copy this file to the repository's ROOT as +# `single-repository.yaml`, replace every value in double braces below, and +# commit it like any other change. `revisit_on:` is optional — delete its line if +# there is nothing to revisit. The schema is openRepoShape's +# `contracts/single-repository-record.yaml`. Converting to the Triad later is +# `adopt-project.py`, run by a person deciding for the project; nothing +# converts on this file's account, and nothing reads `revisit_on:` but people. +# =========================================================================== + +# The person who decided, for this project, that it stays single. +decided_by: "Brett Heap" + +# The day they decided it, as YYYY-MM-DD. +decided_on: "2026-10-11" + +# Why, in a sentence: a configuration repository, an aggregation, a vendored +# fork, a project too small to split. +reason: "openRepoShape is the standard itself: its rules (README, AGENTS.md, contracts) and the tools that apply them change together in one reviewed commit, and every project pins one commit of it." diff --git a/tests/test_shape_advisory.py b/tests/test_shape_advisory.py index 211df69e..64183f99 100644 --- a/tests/test_shape_advisory.py +++ b/tests/test_shape_advisory.py @@ -21,6 +21,9 @@ * a `single-repository.yaml` that does not parse, or declares another kind, silences nothing and is REPORTED beside the advisory, failing nothing; + * this repository is one of them: its own root carries the record Brett + Heap decided on 2026-10-11 (#337), so the standard's own checkout is not + advised either; * it writes nothing, records nothing, and is read by the three tools and by no validator, template script or workflow. @@ -661,6 +664,39 @@ def test_the_schema_the_template_and_the_module_agree(): assert shape_advisory.field_problems(parse_yaml(filled)) == [] +def test_this_repository_records_that_it_stays_single(quiet_env): + """#337: openRepoShape is not a Triad and says so, once, in its own root. + + Brett Heap decided on 2026-10-11 that this repository stays a single + repository, so the doctor gave every session that began work in this + checkout the advisory about the standard itself. The record is the + standard's own `single-repository.yaml`: it must be there, of the right + kind and with every field its schema asks for, and the doctor must not + give the advisory about it. + + ASKED OF THE DISK, as the doctor asks, and of two readers: `read_record` + for the file alone, which cannot depend on what this checkout is called + or where it sits, and the doctor's own rows for what a person actually + meets. The second asks for no `advisory` row rather than for no + `triad-advisory` row at all, because a checkout cloned under a leg's name + is sent to its assembly root instead and that row is not the advisory. + Nothing here pins a value of the record: the day Brett Heap amends his + decision, the file changes and this test does not. + """ + state, silences_nothing, notes = shape_advisory.read_record(REPO) + assert state == shape_advisory.RECORD_SILENCES, ( + f"this repository's root has no {RECORD} of the right kind: " + f"{state}, {silences_nothing}") + assert notes == [], ( + f"this repository's {RECORD} departs from " + f"{shape_advisory.RECORD_SCHEMA}: {notes}") + + _, rows, _ = doctor_json(REPO, quiet_env) + assert all(row["status"] != "advisory" for row in rows.values()), ( + "the doctor still gives this repository the Triad advisory: " + f"{rows.get(ROW)}") + + @pytest.mark.parametrize("field, value, problem", [ ("decided_on", "06/10/2026", "not an ISO date"), ("decided_on", "2026-02-30", "not an ISO date"),