Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 27 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1117,22 +1117,22 @@ directory first — which is what makes the verdict offline.
For an assembly root the rows are **naming** (this standard's own
`contracts/repository-naming.yaml`), **manifest** and **pins** (the project's
OWN `scripts/validate-manifest.py` and `scripts/validate-pins.py` when it
carries them — they are the pinned copies, which is the point — else the
template copies, and the row says which answered), **manifest kinds** (every
`kind:`-bearing manifest in the root against a registry, so a `contracts/*.yaml`
nothing validates is a finding by name rather than a silence, and so is a
`family.yaml` beside `project.yaml`), **shape currency** (`update-shape.py
check`'s per-file verdicts, summarised), **legs** (each one mounted, and its
checked-out commit against the pin, with no fetch), **leg shape files** (each
leg's `AGENTS.md`, `CLAUDE.md` and `.gitignore` against `templates/<role>-root/`
— a comparison and not a gate: no leg file is pinned anywhere), **placement**
(every tracked path of every leg, against the path policy), **agent files**, and
**machine**. A FAMILY holder gets **family**, **manifest kinds**, **shape
currency**, **placement** (`n/a` — a holder has no legs of its own), **members**
and **machine**; a directory that is neither gets what it is CALLED under the
naming policy, what IS in it, and the way in — and a repository the advisory is
not silent about gets the **Triad** row, status `advisory`: the preference said
once and stepped over by the verdict (a leg gets its assembly root).
carries them — the pinned copies — else the template copies, and the row says
which answered), **manifest kinds** (every `kind:`-bearing manifest in the
root against a registry, so a `contracts/*.yaml` nothing validates, or a
`family.yaml` beside `project.yaml`, is a finding by name), **shape currency**
(`update-shape.py check`'s per-file verdicts, summarised), **legs** (each one
mounted, and its checked-out commit against the pin, with no fetch), **leg
shape files** (each leg's `AGENTS.md`, `CLAUDE.md` and `.gitignore` against
`templates/<role>-root/`, a comparison: no leg file is pinned), **placement**
(every tracked path of every leg, against the path policy), **agent files**,
and **machine**. A FAMILY holder gets **family**, **manifest kinds**, **shape
currency**, **placement** (`n/a`: no legs of its own), **agent files**, **members**
and **machine**. Either, mid-merge, gets **merge** first: a `FINDING` naming the
unmerged paths, or a `note` if none is left. A directory that is neither gets what
it is CALLED under the naming policy, what IS in it, the way in and **machine** —
and a repository the advisory is not silent about gets the **Triad** row, status
`advisory`: said once and stepped over by the verdict (a leg gets its root).

Every row is `ok`, `note`, `FINDING` or `n/a` — or `advisory`, the Triad row
alone — and every one that is not `ok` names the exact command that fixes it,
Expand All @@ -1151,22 +1151,22 @@ verdict, and its exit code:
| `COMPLIANT` | 0 | every row ok, and the pin names this standard's commit |
| `COMPLIANT, SHAPE BEHIND (n upstream-changed, m upstream-added)` | 1 | valid, and the standard has moved on |
| `DRIFTED (…)` | 1 | a copy was edited here, or a leg is off its pin |
| `MISPLACED (n paths)` | 1 | a tracked path sits in a leg the path policy puts elsewhere |
| `INVALID (<rows>)` | 1 | a validator went red |
| `MISPLACED (n paths)` | 1 | a tracked path sits in a leg the path policy puts elsewhere, or a submodule in a leg other than the one its `submodules:` record names |
| `INVALID (<rows>)` | 1 | a validator went red, or (`merge`) the index holds an unmerged path |
| `NOT A SHAPE ROOT` | 2 | neither manifest is there — adopt, or scaffold |

Exit 3 is usage or environment — nothing about it is a statement about the
tree you pointed at: no such path, a `shape-doctor.py` not sitting in a
checkout of the standard, or a pin naming a commit **this** checkout does not
carry (`CANNOT ANSWER`). **Drift outranks a red validator**
on the verdict line, deliberately — an edited shape copy is exactly what makes
`validate-pins.py` red, so answering `INVALID (pins)` would send the reader at
the symptom while the fix is `update-shape.py`. The pins row is printed either
way, with its own next command. `MISPLACED` sits between the two: a path in
the wrong leg is a fact about the shape that no validator, pin or manifest
here can see, while a red validator names itself in the table whether or not
it also names the verdict line. `--json` is the same report as one object,
each row carrying its `id`.
carry (`CANNOT ANSWER`). **Drift outranks a red validator** on the verdict
line, deliberately — an edited shape copy is exactly what makes
`validate-pins.py` red, so `INVALID (pins)` would send the reader at the
symptom while the fix is `update-shape.py`; the pins row still prints its own
next command. `MISPLACED` sits between the two: a path in the wrong leg is a
fact about the shape no validator, pin or manifest here can see. **An
unfinished merge outranks all three**, as `INVALID (merge)`: the conflict is
what turns the other rows red, and no fix commits until it is finished.
`--json` is the same report as one object, each row carrying its `id`.

**`placement` is the row that reads what is *inside* the legs.** Brett Heap,
2026-09-10: *"we have to look for code in spec and spec in code"*. It runs the
Expand Down
24 changes: 15 additions & 9 deletions docs/handbook.html
Original file line number Diff line number Diff line change
Expand Up @@ -1452,10 +1452,13 @@ <h2>Is this repository compliant? <code>openRepoShape --doctor</code></h2>
policy), <strong>agent files</strong> and <strong>machine</strong>. A
<a href="#families">family holder</a> gets <strong>family</strong>, <strong>manifest
kinds</strong>, <strong>shape currency</strong>, <strong>placement</strong>
(<code>n/a</code> &mdash; a holder has no legs of its own), <strong>members</strong> and
<strong>machine</strong>; a directory that is neither gets what it is CALLED under the naming
policy, what IS in it, and the way in &mdash; and a repository the advisory is not silent
about gets the <strong>Triad</strong> row, status <code>advisory</code>: the
(<code>n/a</code> &mdash; a holder has no legs of its own), <strong>agent files</strong>,
<strong>members</strong> and <strong>machine</strong>. Either one in the middle of a merge
gets <strong>merge</strong> first: a <code>FINDING</code> naming the unmerged paths, or a
<code>note</code> if nothing is left unmerged. A directory that is neither gets what it is
CALLED under the naming policy, what IS in it, the way in and <strong>machine</strong>
&mdash; and a repository the advisory is not silent about gets the
<strong>Triad</strong> row, status <code>advisory</code>: the
<a href="#confers">preference</a> said once and stepped over by the verdict (a leg gets its
assembly root).</p>
<p>Every row is <code>ok</code>, <code>note</code>, <code>FINDING</code> or
Expand All @@ -1474,8 +1477,8 @@ <h2>Is this repository compliant? <code>openRepoShape --doctor</code></h2>
<tr><td><code>COMPLIANT</code></td><td>0</td><td>every row ok, and the pin names this standard&rsquo;s commit</td></tr>
<tr><td><code>COMPLIANT, SHAPE BEHIND (n upstream-changed, m upstream-added)</code></td><td>1</td><td>valid, and the standard has moved on</td></tr>
<tr><td><code>DRIFTED (&hellip;)</code></td><td>1</td><td>a copy was edited here, or a leg is off its pin</td></tr>
<tr><td><code>MISPLACED (n paths)</code></td><td>1</td><td>a tracked path sits in a leg the path policy puts elsewhere</td></tr>
<tr><td><code>INVALID (&lt;rows&gt;)</code></td><td>1</td><td>a validator went red</td></tr>
<tr><td><code>MISPLACED (n paths)</code></td><td>1</td><td>a tracked path sits in a leg the path policy puts elsewhere, or a submodule in a leg other than the one its <code>submodules:</code> record names</td></tr>
<tr><td><code>INVALID (&lt;rows&gt;)</code></td><td>1</td><td>a validator went red, or (<code>merge</code>) the index holds an unmerged path</td></tr>
<tr><td><code>NOT A SHAPE ROOT</code></td><td>2</td><td>neither manifest is there &mdash; adopt, or scaffold</td></tr>
</tbody>
</table>
Expand All @@ -1489,6 +1492,8 @@ <h2>Is this repository compliant? <code>openRepoShape --doctor</code></h2>
either way, with its own next command. <code>MISPLACED</code> sits between the two: a path in
the wrong leg is a fact about the shape that no validator, pin or manifest here can see, while
a red validator names itself in the table whether or not it also names the verdict line.
<strong>An unfinished merge outranks all three</strong>, as <code>INVALID (merge)</code>: the
conflict is what turns the other rows red, and no fix commits until it is finished.
<code>--json</code> is the same report as one object,
each row carrying its <code>id</code>.</p>

Expand Down Expand Up @@ -1822,9 +1827,10 @@ <h2>For AI assistants</h2>
branch and naming the branch the real run needs, added (#477); the one network
read a project&rsquo;s own validators can make, the <code>gh api</code> recheck of a neutral
product&rsquo;s pin, said where this page and the README had said &ldquo;offline&rdquo;,
added (#411) &mdash; a page cannot name the commit that contains it, and the blob below is
the fact a test checks.
README.md blob 5e311f176503d43a188d9974c7988b396dd0e0e1. Every command, flag, exit code
added (#411); the doctor&rsquo;s <strong>merge</strong> row, and <code>INVALID (merge)</code>
above drift, added (#424) &mdash; a page cannot name the commit that contains it, and the
blob below is the fact a test checks.
README.md blob c09879d13f9a618c5de7afb6d3b555e59888df17. Every command, flag, exit code
and file name on this page is quoted from that README and from AGENTS.md.</p>
</footer>
</main>
Expand Down
Loading
Loading