Skip to content

release(canon): 2.0.2 — the law stops naming the hyphenated path (PATCH) - #818

Merged
hyperpolymath merged 1 commit into
mainfrom
chore/r-a-2.0.2-patch-release
Sep 17, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
chore/r-a-2.0.2-patch-release

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Ruling R-A settles the machine tree's spelling as .machine_readable/. The canon's two normative artefacts still named machine-readable/, so the law told every repository to use a spelling the estate majority does not. This corrects the law.

Why PATCH — the criteria's own rule, not my judgement

rsr-criteria-v2.a2ml [versioning].rule-patch:

A PATCH bump is editorial (wording, detection-rule id corrections, template_ref fixes) with no criteria-set change.

That is exactly this change and nothing more: wording in desc/freeze-mechanism/applicable-set/report prose, and eight of the fifteen changed strings are template_ref values.

The strongest evidence it is not a criteria-set change: the gates already resolved both spellings. Their paths array carries "machine-readable/descriptiles/|.machine_readable/descriptiles/", and | means satisfied if ANY alternative exists — so the only behavioural difference is which spelling appears first in a list. Nothing that conformed stops conforming; MINOR is for additions and there are none.

The identifier is not a path

key = "machine-readable-substrate" keeps its name. It is a criterion key, not a location; renaming it would be a criteria-set change, not errata. Asserted in the edit script — after the pass the file holds 15 .machine_readable/ paths and exactly two surviving machine-readable strings: that key, and the file's own title line.

Appendix E had never been written

[versioning].errata says corrections "are recorded in RSR-SPEC-v2.adoc Appendix E (Errata) and shipped as PATCH bumps". The spec has Appendix A and Appendix B. The rule named a section that did not exist, so this release creates what it points at. Same file, same pass: its SSOT footer still pointed at spec/rsr-criteria-v2.a2ml, dead since #815 moved the law into 0-canon/rsr/.

Sequence

Gate A fails this until the spine re-adopts. The two merge together — spine first, then this, seconds apart.

Witnesses

lock hashes vs artefacts on disk   both match (sha256sum)
check-canon-lockstep.sh            rc=0  GATE A PASSED
check-standards-map.sh             rc=0  GATE D PASSED
check-rsr-profile.sh               rc=0
check-allowed-actions.sh           rc=0  35 uses: refs, 0 uncovered
validate-a2ml.sh                   rc=1  33 errors — IDENTICAL to the
                                   pre-release baseline, so these edits added none

…CH, per [versioning].rule-patch)

Ruling R-A settles the machine tree's spelling as `.machine_readable/`. The
canon's two normative artefacts still named `machine-readable/`, so the law told
every repository to use the spelling the estate majority does not use. This
corrects the law.

WHY PATCH — the criteria's own rule, not my judgement

`rsr-criteria-v2.a2ml` `[versioning].rule-patch` reads:

    A PATCH bump is editorial (wording, detection-rule id corrections,
    template_ref fixes) with no criteria-set change.

This change is *exactly* those three things and nothing else:

  * wording — path strings inside `desc`/`freeze-mechanism`/`applicable-set`/
    `report` prose, and template_ref values;
  * template_ref fixes — eight of the fifteen changed strings ARE template_ref
    values (`machine-readable/descriptiles/STATE.a2ml` and siblings);
  * detection-rule id corrections — none needed; no id changed.

No criterion is added, removed, re-tiered or re-gated. Nothing that was
conforming becomes non-conforming, and nothing that failed now passes.

The strongest evidence it is not a criteria-set change: **the gates already
resolved both spellings.** Their paths array carries

    "machine-readable/descriptiles/|.machine_readable/descriptiles/"

and '|' means a path is satisfied if ANY alternative exists. So the only
behavioural difference is which spelling appears first in a list. That is why
this is PATCH and not MINOR: MINOR is for additions, and there are none.

THE IDENTIFIER IS NOT A PATH, AND IS UNTOUCHED

    key = "machine-readable-substrate"

keeps its name. It is a criterion key, not a location. Renaming it would be a
criteria-set change, not errata. On the spine side of this same rename, exactly
this assumption — that the word is the path — silently corrupted six files
including a check-root-shape test and a lineage audit. The census is asserted
in the edit script: after the pass the file contains 15 `.machine_readable/`
paths, and the only two surviving `machine-readable` strings are this key and
one line of prose ("RSR v2.0 machine-readable criteria", the file's own title).

WHAT CHANGED

  rsr-criteria-v2.a2ml   15 path tokens, in the freeze-mechanism and
                         applicable-set rules, the oracle's report prose,
                         criteria 3.1.1 (descriptiles-dir, desc) and 3.2.2
                         (rsr-profile, desc AND template_ref), and the eight
                         per-criterion template_ref values 3.1.2-3.1.9
  template-capability-gates.toml  two paths alternatives reordered so the
                         canonical spelling is listed first; one comment
  canon.lock             version 2.0.1 -> 2.0.2, tag canon-v2.0.1 ->
                         canon-v2.0.2, criteria sha256 and gates sha256
                         rewritten, a dated note recording the category
                         argument above
  RSR-SPEC-v2.adoc       Appendix E: Errata, added

APPENDIX E HAD NEVER BEEN WRITTEN

`[versioning].errata` says corrections "are recorded in RSR-SPEC-v2.adoc
Appendix E (Errata) and shipped as PATCH bumps". The spec has Appendix A and
Appendix B. The rule named a section that did not exist, so this release both
satisfies the rule and creates what it points at. The first entry is this
change.

Same file, same pass: its own SSOT footer still pointed at
`spec/rsr-criteria-v2.a2ml`, a path that stopped existing when #815 moved the
law into 0-canon/rsr/. Corrected.

NEW PINNED IDENTITY

    criteria   efd024ad9cbdf0d36d4dbce7e491531dd4ccccbfc747a04223ce4149f4b9a53d
            -> 7804d77127001ed50263f0783d8a11f7211e72cb5e9f6443f2acde4b08d9ab1e
    gates      8b1a77669c9ab78e9081669dbb2ab141d8af29700affc327f3dcde99f3dcd243
            -> 6a8b9b420519dccdd2c586da06a9a302bdbbb3dc917f49e4a7b308882471d68a

SEQUENCE — THIS MAY NOT MERGE FIRST

[canon].order is spine-adopts-then-canon-releases, and Gate A enforces it. The
spine must re-adopt both hashes and go green against them before this lands.
Until it does, Gate A fails here on assertion 3, by design.

WITNESSES

  lock hashes vs artefacts on disk      both match, verified by sha256sum
  check-canon-lockstep.sh               rc=0  GATE A PASSED
  check-standards-map.sh                rc=0  GATE D PASSED
  check-rsr-profile.sh                  rc=0  profile matches declared capabilities
  check-allowed-actions.sh              rc=0  35 uses: refs, 0 uncovered
  .githooks/validate-a2ml.sh            rc=1  33 errors — IDENTICAL to the
                                        pre-release baseline, so the criteria
                                        edits introduced none

Note on method: the first attempt at this edit expected
`machine-readable/rsr-profile.a2ml` twice and found three. The third was a
`template_ref` on a line whose visible head was identical, and a `grep -n`
that truncated at 165 characters had hidden it. The count assertion refused to
write. Enumerate tokens with `grep -o`, never ask whether a line looks right.

(cherry picked from commit 3c88d3fe7fef781fc4c248137ff9cff40a35b5a2)
@coderabbitai

coderabbitai Bot commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 8fd8e5c2-9938-4f25-8a82-b78f8943e867

📥 Commits

Reviewing files that changed from the base of the PR and between 56e217b and 269c901.

⛔ Files ignored due to path filters (1)
  • canon.lock is excluded by !**/*.lock
📒 Files selected for processing (3)
  • .machine_readable/template-capability-gates.toml
  • 0-canon/rsr/RSR-SPEC-v2.adoc
  • 0-canon/rsr/rsr-criteria-v2.a2ml

📝 Summary

Summary by CodeRabbit

  • Documentation
    • Updated RSR specifications and criteria to use .machine_readable/ as the canonical path.
    • Added an errata appendix documenting the canonical spelling and related path references.
    • Clarified that both .machine_readable/ and machine-readable/ spellings remain accepted.
    • Confirmed that conformance behaviour, criterion keys, scoring, and weighting remain unchanged.
  • Maintenance
    • Reordered path alternatives so canonical spellings appear first.

Walkthrough

The change makes .machine_readable/ the canonical machine-tree spelling across criteria and specification references. Capability gates still resolve both spellings. The specification records the rename and corrects its SSOT path.

Changes

Canonical machine-tree paths

Layer / File(s) Summary
Criteria path references
0-canon/rsr/rsr-criteria-v2.a2ml
Freeze, scoring, descriptor, and profile references now use .machine_readable/ paths.
Specification and gate alignment
0-canon/rsr/RSR-SPEC-v2.adoc, .machine_readable/template-capability-gates.toml
The specification SSOT path is corrected. Appendix E records the rename and preserved fallback resolution. Gate alternatives and comments reflect the canonical spelling.

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Other

Suggested reviewers: joshuajewell

✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

A rabbit checks the dotted tree,
Where canonical paths now agree.
Old paths still hop through the gate,
While errata records their fate.
The scorecards bloom in folders neat.

Comment @coderabbitai help to get the list of available commands.

@hyperpolymath
hyperpolymath merged commit cdec573 into main Sep 17, 2026
24 of 29 checks passed
@hyperpolymath
hyperpolymath deleted the chore/r-a-2.0.2-patch-release branch September 17, 2026 19:21
hyperpolymath added a commit that referenced this pull request Sep 17, 2026
## What

`main` is **POISON** by this repo's own `scripts/lock-selfcheck.sh`,
added in #821. The gate went red on its own merge commit, and the cause
predates it:

```
.github/workflows/governance-reusable.yml
  uses  denoland/setup-deno@22d081f
  lock keys for this workflow: actions/cache … actions/checkout … editorconfig-checker/… erlef/setup-beam …
```

The ref is used but not keyed. It arrived with `cdec573` (#818, the
2.0.2 release) and no lock regeneration rode along.

## Why it matters

GitHub resolves a reusable's action refs against the **callee** repo's
`actions.lock` **at the pinned SHA**. An unkeyed ref kills every caller
at workflow startup with **zero jobs**, conclusion `failure` (not
`startup_failure`), and no reason carried in either REST or GraphQL —
the run page is the only place that states one. A required context that
dies this way never reports at all, so the gate reads as **absent**
rather than failing and the branch looks clean. `main` is not currently
a safe thing to pin to.

## Why this fix is deterministic

The lockfile validator requires **key-SHA == the digest written inline
in the workflow**, so the correct entry has exactly one possible value
and needs no resolution, network, or judgement. This reproduces what `gh
actions-lock` + `scripts/relock-sha-keys.sh` would key, with no other
entry moved.

## Verification

```
scripts/lock-selfcheck.sh 176d1f7   -> VERDICT: POISON — 1 ref used but NOT keyed   (rc=1)
scripts/lock-selfcheck.sh 46ef434   -> VERDICT: SELF-CONSISTENT                     (rc=0)
```

Diff is one added line in `.github/workflows/actions.lock` — the key,
inserted in the file's alphabetical convention.

## Not fixed here

`lock-selfcheck.sh` also reports **6 workflows with no lock entry at
all** (`apply-workflow-pins.yml`, `pages-archive.yml`,
`propagate-hooks.yml`, `security-gate-pr-target.yml`,
`settings-drift-detect.yml`, `tag-ruleset-canon.yml` — 18 refs). The
gate states this is a separate question from the verdict and does not
count it. Left alone deliberately: an empty `[]` entry is not obviously
the intended answer for a workflow that may not be a reusable.

## Related

`uses ⊆ actions.lock` is red on `main` with the same root cause (it
shells out to `update-actions-lock.sh --verify-local`). Expect it to
clear with this change; if it does not, it is a second defect, not the
same one.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant