From d2054681c45089501714fd7d0cbf82111860e480 Mon Sep 17 00:00:00 2001 From: hyperpolymath-recon Date: Sat, 19 Sep 2026 19:27:05 +0000 Subject: [PATCH 1/4] =?UTF-8?q?fix(profile):=20rsr-profile.a2ml=20comment?= =?UTF-8?q?=20dialect=20=E2=80=94=20//=20to=20#=20(record=20dialect)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The a2ml record dialect uses # comments; this file carried 102 line and 106 inline // comments, which RecordDialect.parse/1 rejects — so the canon's own profile was unreadable and every scorecard ran profile=false (the law not subject to the law). Conversion is string-aware and comment-aware (quotes inside comments do not open strings; no // inside a quoted value was touched). Acceptance (measured with hypatia 2026-09-19): RecordDialect.parse OK, scorecard flips profile=true — canon 68.53%, the 15-criterion governance remediation list. No [canon] hash values changed here; those move with the MINOR (canon.lock same-commit protocol). --- .machine_readable/rsr-profile.a2ml | 214 ++++++++++++++--------------- 1 file changed, 107 insertions(+), 107 deletions(-) diff --git a/.machine_readable/rsr-profile.a2ml b/.machine_readable/rsr-profile.a2ml index 1d51880a0..f9929e05e 100644 --- a/.machine_readable/rsr-profile.a2ml +++ b/.machine_readable/rsr-profile.a2ml @@ -1,128 +1,128 @@ -// SPDX-License-Identifier: MPL-2.0 -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// -// rsr-profile.a2ml — the CANON's own capability declaration. -// -// --------------------------------------------------------------------------- -// WHY THE CANON NEEDS ONE, AND WHY IT DID NOT HAVE ONE -// -// Before this file, `find . -name "rsr-profile*"` in this repo returned -// NOTHING. The repository that ships scripts/check-rsr-profile.sh could not -// itself be checked by it: the script exited 2 (setup error) because there was -// no profile to read. THE LAW WAS NOT SUBJECT TO THE LAW. -// -// The reason was not backlog. It was structural. rsr-criteria-v2.a2ml's -// applicable-set rule is: -// -// A criterion is APPLICABLE iff its `gate` is `universal` OR the repo's -// rsr-profile declares the gating capability. -// -// template-capability-gates.toml carried a [carrier] section that lets a SPINE -// carry modules it does not declare: -// -// "Applies ONLY where the profile declares role = \"spine\"." -// -// There was NO equivalent for the canon. So the moment this repo got a profile -// it was scored against gates that are impossible for it to satisfy — it -// carries the criteria, the gate table and 48 workflow files, but declares no -// `rust`, no `container`, and has no code to prove. Compliance was unreachable -// BY CONSTRUCTION. -// -// This commit series adds role = "canon" to the gate table and this file to -// satisfy it. The role is the smallest change that makes the canon scorable. -// -// Dialect note: authored in the a2ml record dialect to match the shape -// rsr-template-repo ships, because check-rsr-profile.sh's parser accepts it. -// The .a2ml -> .deed conversion is estate task #64 and is deliberately NOT -// attempted here; see docs/AUDIT.adoc — finding F3 records that the law is -// authored in a superseded dialect while DEED is itself an unratified DRAFT. -// --------------------------------------------------------------------------- +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# rsr-profile.a2ml — the CANON's own capability declaration. +# +# --------------------------------------------------------------------------- +# WHY THE CANON NEEDS ONE, AND WHY IT DID NOT HAVE ONE +# +# Before this file, `find . -name "rsr-profile*"` in this repo returned +# NOTHING. The repository that ships scripts/check-rsr-profile.sh could not +# itself be checked by it: the script exited 2 (setup error) because there was +# no profile to read. THE LAW WAS NOT SUBJECT TO THE LAW. +# +# The reason was not backlog. It was structural. rsr-criteria-v2.a2ml's +# applicable-set rule is: +# +# A criterion is APPLICABLE iff its `gate` is `universal` OR the repo's +# rsr-profile declares the gating capability. +# +# template-capability-gates.toml carried a [carrier] section that lets a SPINE +# carry modules it does not declare: +# +# "Applies ONLY where the profile declares role = \"spine\"." +# +# There was NO equivalent for the canon. So the moment this repo got a profile +# it was scored against gates that are impossible for it to satisfy — it +# carries the criteria, the gate table and 48 workflow files, but declares no +# `rust`, no `container`, and has no code to prove. Compliance was unreachable +# BY CONSTRUCTION. +# +# This commit series adds role = "canon" to the gate table and this file to +# satisfy it. The role is the smallest change that makes the canon scorable. +# +# Dialect note: authored in the a2ml record dialect to match the shape +# rsr-template-repo ships, because check-rsr-profile.sh's parser accepts it. +# The .a2ml -> .deed conversion is estate task #64 and is deliberately NOT +# attempted here; see docs/AUDIT.adoc — finding F3 records that the law is +# authored in a superseded dialect while DEED is itself an unratified DRAFT. +# --------------------------------------------------------------------------- [rsr-profile] version = "1.0.0" spec = "rsr-criteria-v2" declares-against = "2.0.0" -// Role in the estate pipeline. The gate table's [canon] section keys on this -// value, exactly as [carrier] keys on role = "spine". +# Role in the estate pipeline. The gate table's [canon] section keys on this +# value, exactly as [carrier] keys on role = "spine". role = "canon" -// --------------------------------------------------------------------------- -// WHAT THE CANON ACTUALLY IS -// -// Honest declaration. This repo is a prose-and-tooling repository: it owns the -// DEFINITION of conformance, the gate implementations, and the reusable -// workflows. It is NOT an instance of the things it governs. -// -// Declaring an empty or aspirational set here would be the over-declaration -// failure in the other direction, and would make the oracle check meaningless: -// a profile that declares nothing is scored against nothing. -// --------------------------------------------------------------------------- +# --------------------------------------------------------------------------- +# WHAT THE CANON ACTUALLY IS +# +# Honest declaration. This repo is a prose-and-tooling repository: it owns the +# DEFINITION of conformance, the gate implementations, and the reusable +# workflows. It is NOT an instance of the things it governs. +# +# Declaring an empty or aspirational set here would be the over-declaration +# failure in the other direction, and would make the oracle check meaningless: +# a profile that declares nothing is scored against nothing. +# --------------------------------------------------------------------------- capabilities = [ - "bash", // scripts/ — 107 files; the gate implementations (check-*.sh) - "docs-site", // .github/workflows/casket-pages.yml + pages.yml - "governance-tier", // 0-canon/constitution/ + docs/{AUDIT,AFFIRMATION}.adoc + GOVERNANCE + MAINTAINERS - "reproducible-build", // guix.scm — a real Guix manifest, pins the canon's own tooling + "bash", # scripts/ — 107 files; the gate implementations (check-*.sh) + "docs-site", # .github/workflows/casket-pages.yml + pages.yml + "governance-tier", # 0-canon/constitution/ + docs/{AUDIT,AFFIRMATION}.adoc + GOVERNANCE + MAINTAINERS + "reproducible-build", # guix.scm — a real Guix manifest, pins the canon's own tooling ] -// --------------------------------------------------------------------------- -// THE BOUND BUDGET — the join that makes this a versioned artefact rather than -// a directory that changes. Read by scripts/check-canon-lockstep.sh. -// -// Each value MUST equal the matching hash in canon.lock [canon.artifacts]. -// --------------------------------------------------------------------------- +# --------------------------------------------------------------------------- +# THE BOUND BUDGET — the join that makes this a versioned artefact rather than +# a directory that changes. Read by scripts/check-canon-lockstep.sh. +# +# Each value MUST equal the matching hash in canon.lock [canon.artifacts]. +# --------------------------------------------------------------------------- [canon] version = "2.0.0" criteria_sha256 = "efd024ad9cbdf0d36d4dbce7e491531dd4ccccbfc747a04223ce4149f4b9a53d" gates_sha256 = "4c57d515bd3fa9d149cf54a8f4c8a44e2409cb24c3df72ec874656e4f5a98534" -lock_sha256 = "" // sha256 of canon.lock itself; filled at release +lock_sha256 = "" # sha256 of canon.lock itself; filled at release [notes] -// Capabilities deliberately NOT declared, with reasons — the same discipline -// rsr-template-repo applies in its own [notes] block. Every omission below is -// grounded in the absence of a corresponding artefact in this tree. +# Capabilities deliberately NOT declared, with reasons — the same discipline +# rsr-template-repo applies in its own [notes] block. Every omission below is +# grounded in the absence of a corresponding artefact in this tree. omitted-rationale = "The canon defines conformance; it is not an instance of it. Declaring a capability the canon lacks would make the oracle score it against a module it does not carry — the over-scaffolding failure the v2.0 capability model exists to prevent." -// rust / zig / idris2 / agda / haskell / gleam / elixir / julia / ocaml / -// affinescript -// — no source in any language; the canon is prose + shell gates -// cli -// — the check-*.sh scripts are CI steps, not a shipped binary; -// declaring `cli` would demand a release workflow and registry metadata -// library -// — nothing consumes the canon as a library; it is consumed as a DOCUMENT -// and as a pin (canon.lock), which is not the `library` capability -// ffi / abi -// — no C-ABI seam and no formally specified ABI; the interface directory -// is absent from this tree -// api-service -// — no network daemon; the reusable workflows RUN on GitHub's runners, -// they are not served BY this repo -// container -// — the canon ships no Containerfile and no image -// published-package -// — the canon publishes SPECS, not packages. Its release artefact is -// canon.lock + a tag, which is not a registry publication. -// DELIBERATE: the one omission worth revisiting if the canon ever -// publishes criteria to a package registry. -// formal-proofs -// — criterion 5.x `formal-proofs` means "contains mechanised proofs IN -// TREE, of its own code". docs/proofs/ (283 files) are proof artefacts -// OF THE ESTATE, gathered from other repos. Different thing entirely. -// → this is precisely a [canon] carrier path -// mobile / web-ui -// — no UI -// benchmarks -// — benches/ contains no suite -// plugin -// — not hosted in a third-party extension host +# rust / zig / idris2 / agda / haskell / gleam / elixir / julia / ocaml / +# affinescript +# — no source in any language; the canon is prose + shell gates +# cli +# — the check-*.sh scripts are CI steps, not a shipped binary; +# declaring `cli` would demand a release workflow and registry metadata +# library +# — nothing consumes the canon as a library; it is consumed as a DOCUMENT +# and as a pin (canon.lock), which is not the `library` capability +# ffi / abi +# — no C-ABI seam and no formally specified ABI; the interface directory +# is absent from this tree +# api-service +# — no network daemon; the reusable workflows RUN on GitHub's runners, +# they are not served BY this repo +# container +# — the canon ships no Containerfile and no image +# published-package +# — the canon publishes SPECS, not packages. Its release artefact is +# canon.lock + a tag, which is not a registry publication. +# DELIBERATE: the one omission worth revisiting if the canon ever +# publishes criteria to a package registry. +# formal-proofs +# — criterion 5.x `formal-proofs` means "contains mechanised proofs IN +# TREE, of its own code". docs/proofs/ (283 files) are proof artefacts +# OF THE ESTATE, gathered from other repos. Different thing entirely. +# → this is precisely a [canon] carrier path +# mobile / web-ui +# — no UI +# benchmarks +# — benches/ contains no suite +# plugin +# — not hosted in a third-party extension host -// ── Things the canon carries that NO capability gates, and therefore must be -// named in the gate table's [canon] section rather than declared here ────── -// the criteria themselves (0-canon/rsr/rsr-criteria-v2.a2ml) -// the gate table (.machine_readable/template-capability-gates.toml) -// the applicability policy (0-canon/TEMPLATE-APPLICABILITY-POLICY.adoc) -// the reusable workflows (.github/workflows/*-reusable.yml) -// docs/proofs/ — proof artefacts of the estate, not proofs of this repo -// rhodium-standard-repositories/ — VENDORED, to be deleted (finding F4) +# ── Things the canon carries that NO capability gates, and therefore must be +# named in the gate table's [canon] section rather than declared here ────── +# the criteria themselves (0-canon/rsr/rsr-criteria-v2.a2ml) +# the gate table (.machine_readable/template-capability-gates.toml) +# the applicability policy (0-canon/TEMPLATE-APPLICABILITY-POLICY.adoc) +# the reusable workflows (.github/workflows/*-reusable.yml) +# docs/proofs/ — proof artefacts of the estate, not proofs of this repo +# rhodium-standard-repositories/ — VENDORED, to be deleted (finding F4) From 57813caa649a55a5f8bd3fdec90ec3edacafa9fe Mon Sep 17 00:00:00 2001 From: hyperpolymath-recon Date: Sat, 19 Sep 2026 19:25:52 +0000 Subject: [PATCH 2/4] =?UTF-8?q?feat(canon):=20MINOR=202.1.0-draft=20?= =?UTF-8?q?=E2=80=94=20julia-gated=20criteria=205.2.3-5.2.6=20+=20gate=20r?= =?UTF-8?q?ows=20+=20policy=20mirror?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner ruling 2026-09-19: approved. Non-regressive by construction: all four criteria gate on julia, so no repo that does not declare julia has its applicable set change. - rsr-criteria-v2.a2ml: version 2.1.0-draft, rows 5.2.3 (julia-package, silver), 5.2.4 (julia-ci, bronze), 5.2.5 (julia-aqua, gold), 5.2.6 (julia-docs, silver); detect ids named for the oracle's next increment. - template-capability-gates.toml: 0.3.0; Project.toml, test/, the two julia workflows gate on julia. (The julia-library preset pre-exists — verified, no preset change.) - TEMPLATE-APPLICABILITY-POLICY.adoc: human mirror synced (gate row, archetype presets, plugin/deno/canon taxonomy rows, SSOT note). canon.lock + canon-profile hash updates land in the follow-up commit of this PR, per the [canon.artifacts] same-commit protocol. --- .../template-capability-gates.toml | 10 +++++++++- 0-canon/TEMPLATE-APPLICABILITY-POLICY.adoc | 17 +++++++++++++++++ 0-canon/rsr/rsr-criteria-v2.a2ml | 19 +++++++++++++++++-- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/.machine_readable/template-capability-gates.toml b/.machine_readable/template-capability-gates.toml index de111b2f1..81e3e3a53 100644 --- a/.machine_readable/template-capability-gates.toml +++ b/.machine_readable/template-capability-gates.toml @@ -10,7 +10,7 @@ # Arrays are kept single-line so the checker can parse them with grep. [meta] -version = "0.2.0" +version = "0.3.0" policy = "0-canon/TEMPLATE-APPLICABILITY-POLICY.adoc" [capabilities] @@ -39,6 +39,14 @@ paths = ["README.adoc", "EXPLAINME.adoc|docs/EXPLAINME.adoc", "LICENSE", "SECURI "Cargo.lock" = "rust" "src/**/*.rs" = "rust" ".github/workflows/rust-ci.yml" = "rust" +# Julia library modules (the julia-library archetype's overlay; the +# #634 reference variant measured 2026-08-25: the language-specific +# delta is exactly these files). test/ (singular) is the Julia +# convention; rust uses tests/ and is ungated here by design. +"Project.toml" = "julia" +"test/" = "julia" +".github/workflows/julia-ci.yml" = "julia" +".github/workflows/julia-docs.yml" = "julia" "src/interface/ffi/" = "ffi" "abi.ipkg" = "abi" "src/interface/abi/|src/interface/Abi/" = "abi" diff --git a/0-canon/TEMPLATE-APPLICABILITY-POLICY.adoc b/0-canon/TEMPLATE-APPLICABILITY-POLICY.adoc index 4a46e1455..699ace259 100644 --- a/0-canon/TEMPLATE-APPLICABILITY-POLICY.adoc +++ b/0-canon/TEMPLATE-APPLICABILITY-POLICY.adoc @@ -55,6 +55,13 @@ capability set drives everything else. | it contains source in that language *as its own code* (not merely consumes a tool written in it). | `bash` | it ships non-trivial shell scripts (almost universal; rarely gating). +.2+| Host / runtime +| `plugin` | code hosted inside a third-party extension host (WordPress, Zotero, a userscript manager): the host owns the runtime and packaging rules, so host-mandated files are exempt from the usual language gates the way interop-target bindings are. +| `deno` | it contains Deno source or a `deno.json` (criterion 4.3.1 gates on it). + +| Role +| `canon` | the ROLE of `hyperpolymath/standards` itself: a prose-and-tooling repo that owns the criteria, the gate table and the reusable workflows. Scored via the gate table's `[canon]` carrier section, not by declaring the gated capabilities. + .5+| Interface / seam | `cli` | it ships a command-line binary. | `library` | it is consumed/published as a library. @@ -86,6 +93,11 @@ for humans. == The gate table (module → capability) +NOTE: `.machine_readable/template-capability-gates.toml` is the SSOT; this +table is its human mirror. When they disagree, the machine file wins and +this document carries a sync defect (first measured 2026-09-19: the +archetype presets and the `julia`/`plugin`/`deno`/`canon` rows lagged). + *Universal baseline* (gate = ∅; always carried): `README.adoc`, `EXPLAINME.adoc`, `LICENSE`, `SECURITY.md`, `CONTRIBUTING.md`, @@ -101,6 +113,7 @@ and the SPDX licence invariant (`LICENCE-POLICY.adoc`). | Template module / path | Gating capability | `Cargo.toml`, `Cargo.lock`, `src/**/*.rs`, `.github/workflows/rust-ci.yml` | `rust` +| `Project.toml`, `test/`, `.github/workflows/julia-ci.yml`, `.github/workflows/julia-docs.yml` | `julia` | `src/interface/ffi/**` (Zig) | `ffi` | `abi.ipkg`, `src/interface/Abi/**` (Idris2), `src/interface/generated/**` | `abi` | `verification/proofs/**`, proof-CI | `formal-proofs` @@ -129,6 +142,10 @@ directly instead. Each expands to a base capability set: | `formal-proof-lib` | `agda` *or* `idris2`, `formal-proofs`, `library` | `docs-site` | `docs-site` | `affinescript-app` | `affinescript`, `web-ui` +| `julia-library` | `julia`, `library`, `docs-site`, `published-package` +| `wordpress-plugin` | `plugin`, `web-ui` +| `zotero-plugin` | `plugin` +| `userscript` | `plugin` |=== A profile may `add` or `remove` individual capabilities on top of its preset diff --git a/0-canon/rsr/rsr-criteria-v2.a2ml b/0-canon/rsr/rsr-criteria-v2.a2ml index bbb9cb3d6..6fe48c666 100644 --- a/0-canon/rsr/rsr-criteria-v2.a2ml +++ b/0-canon/rsr/rsr-criteria-v2.a2ml @@ -18,13 +18,24 @@ [meta] spec = "rhodium-standard-repositories" -version = "2.0.0-draft" +version = "2.1.0-draft" status = "draft" # draft | stable ; MUST NOT be cited as ratified until §Ratification passes supersedes = "1.0.0" -date = "2026-07-03" +date = "2026-09-19" authority = "RSR-SPEC-v2.adoc" normative-oracle = "hypatia:rsr-conformance" # the ONE checker; all others are non-normative (see [oracle]) dialect = "a2ml-record" # dogfoods a2ml/RECORD-DIALECT-SPEC.adoc +# +# 2.1.0-draft (2026-09-19): ADDITIVE MINOR (rule-minor: may add criteria +# or capability gates; must not make a previously-conforming repo +# non-conforming at the same tier). Adds the julia-gated criteria +# 5.2.3-5.2.6. Rationale: the capability vocabulary named `julia` with +# no criteria to gate on, so a repo declaring `julia` + `library` was +# scored with nothing language-shaped at all - the 33-repo .jl estate +# was invisible to the oracle by construction. All four criteria gate +# on `julia`, so no repo that does not declare `julia` has its +# applicable set change: the MINOR's non-regression obligation holds +# by the gate itself. Owner ruling 2026-09-19: approved. [versioning] # Fixes the v1.0 "immutable forever" model, which estate reality already broke. @@ -167,6 +178,10 @@ criteria = [ { id = "5.1.6", name = "no-node-npm", desc = "No Node/npm/bun runtime deps (use Deno)", tier = "bronze", gate = "universal", detect = "cicd_rules/nodejs_detected", template_ref = ".github/workflows/runtime-policy.yml" }, { id = "5.2.1", name = "spark-ready", desc = "Rust projects designed to admit SPARK/Ada modules", tier = "rhodium", gate = "rust", detect = "manual", template_ref = "-" }, { id = "5.2.2", name = "proofs-clean", desc = "No believe_me / sorry / Admitted in load-bearing proofs", tier = "gold", gate = "formal-proofs", detect = "proof_obligation/no_holes", template_ref = "verification/" }, + { id = "5.2.3", name = "julia-package", desc = "Project.toml: stable uuid (derived or assigned, never regenerated), [compat] closure incl. the julia floor and bounds for every extra, licence consistent with LICENSE", tier = "silver", gate = "julia", detect = "rsr-conformance/julia_package", template_ref = "archetypes/julia-library/overlay/Project.toml.in" }, + { id = "5.2.4", name = "julia-ci", desc = "Julia CI workflow with a version matrix that includes the [compat] julia floor, running Pkg.test()", tier = "bronze", gate = "julia", detect = "rsr-conformance/julia_ci", template_ref = "archetypes/julia-library/overlay/.github/workflows/julia-ci.yml.in" }, + { id = "5.2.5", name = "julia-aqua", desc = "Aqua in [extras]+[targets] and green in CI (package-shape / compat / ambiguity gate); Aqua.test_all failure blocks", tier = "gold", gate = "julia", detect = "rsr-conformance/julia_aqua", template_ref = "archetypes/julia-library/overlay/test/runtests.jl" }, + { id = "5.2.6", name = "julia-docs", desc = "Documenter build wired for a julia repo that declares docs-site (docs/Project.toml + docs/make.jl + docs/src/ + build workflow); declared docs-site without a build is a VESTIGIAL-class defect the gate must catch", tier = "silver", gate = "julia", detect = "rsr-conformance/julia_docs", template_ref = "archetypes/julia-library/overlay/.github/workflows/julia-docs.yml.in" }, ] [[category]] From 984b91baff1b38060625eb1f711181e8d648580e Mon Sep 17 00:00:00 2001 From: hyperpolymath-recon Date: Sat, 19 Sep 2026 19:27:48 +0000 Subject: [PATCH 3/4] =?UTF-8?q?release(canon):=20canon-v2.1.0=20=E2=80=94?= =?UTF-8?q?=20lockstep=20release=20for=20the=20julia=20MINOR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [canon.artifacts] same-commit protocol: - version 2.0.4 -> 2.1.0 (MINOR, additive; rule-minor holds by the julia gate) - criteria/gates/applicability sha256 rewritten; Gate A assertion [1] PASS - dated note appended, newest-first - canon rsr-profile [canon] block: the stale 2.0.0-era pins (which no script checked — recorded here so they are not discovered stale again) now track canon.lock: version, criteria_sha256, gates_sha256. Gate A at this commit: [1] PASS, [2] PASS, [3] spine adoption lands in the spine repo first (see branch recon-2026-09-19/canon-2.1.0-adoption there), [4]/[5] informational per the lockstep script's release ordering (the canon is below Gold on its honest 15-criterion governance list — pre-existing). --- .machine_readable/rsr-profile.a2ml | 8 ++++---- canon.lock | 33 ++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/.machine_readable/rsr-profile.a2ml b/.machine_readable/rsr-profile.a2ml index f9929e05e..d17190165 100644 --- a/.machine_readable/rsr-profile.a2ml +++ b/.machine_readable/rsr-profile.a2ml @@ -41,7 +41,7 @@ [rsr-profile] version = "1.0.0" spec = "rsr-criteria-v2" -declares-against = "2.0.0" +declares-against = "2.1.0" # Role in the estate pipeline. The gate table's [canon] section keys on this # value, exactly as [carrier] keys on role = "spine". @@ -73,9 +73,9 @@ capabilities = [ # --------------------------------------------------------------------------- [canon] -version = "2.0.0" -criteria_sha256 = "efd024ad9cbdf0d36d4dbce7e491531dd4ccccbfc747a04223ce4149f4b9a53d" -gates_sha256 = "4c57d515bd3fa9d149cf54a8f4c8a44e2409cb24c3df72ec874656e4f5a98534" +version = "2.1.0" +criteria_sha256 = "6a5aa8857bd0d0d58ef48827938ca17c251b6b854dacf59d306388d61694d82a" +gates_sha256 = "e70efd2f53c9445e30da4baf770366f04a4a84ffd844a01426e587e565b53e6a" lock_sha256 = "" # sha256 of canon.lock itself; filled at release [notes] diff --git a/canon.lock b/canon.lock index a61a7d81f..e9e2a81fe 100644 --- a/canon.lock +++ b/canon.lock @@ -115,6 +115,27 @@ # --------------------------------------------------------------------------- # +# 2026-09-19 - MINOR 2.0.4 -> 2.1.0. THE JULIA-GATED CRITERIA. +# +# Additive MINOR (rule-minor): four new criteria 5.2.3-5.2.6, all gated on +# the julia capability, plus the four gate-table rows that make the +# julia-library archetype's overlay modules checkable. Non-regression holds +# by construction: a repo that does not declare `julia` has the new criteria +# scored `na` - applicable set, denominator, score and tier unchanged. +# +# Three artefacts change: criteria (new rows + version line), gates (0.3.0, +# four julia rows), applicability (human mirror sync: gate row, archetype +# presets, plugin/deno/canon taxonomy rows, SSOT note). Their sha256 values +# are rewritten below, in this commit, per the [canon.artifacts] protocol. +# +# ORDER (Gate A, spine-adopts-then-canon-releases): the spine's adoption +# commit (its .machine_readable/rsr-profile.a2ml [canon] block bumped to +# 2.1.0 with the two new hashes) must land BEFORE this one merges; between +# the two landings the spine's reverse-direction lockstep job is red by +# design - that is the ordering rule doing its job, not a defect. +# +# Owner ruling 2026-09-19: MINOR approved. +# # 2026-09-17 - PATCH 2.0.3 -> 2.0.4. THE 3-PRACTICE DISTRICT. # # Twenty-three paths move under 3-practice/. Twenty-two of them need no law @@ -180,16 +201,16 @@ # A released major is immutable. Bumping `version` to a new MAJOR means the # prior major's criteria file is copied to 0-canon/rsr/archive/ and pinned # there; a freeze guard fails any PR that mutates a frozen major. -version = "2.0.4" +version = "2.1.0" spec_family = "rhodium-standard-repositories" status = "draft" # draft | stable -released = "2026-09-17" +released = "2026-09-19" authority = "0-canon/constitution/ESTATE-CONSTITUTION.adoc" # The full git ref that realises this canon. A tag alone is not sufficient # (tags move); a commit alone is not sufficient (it has no version). Both. commit = "0000000000000000000000000000000000000000" # ← fill at release -tag = "canon-v2.0.4" +tag = "canon-v2.1.0" # --------------------------------------------------------------------------- # THE ARTEFACT SET — the files that ARE the canon. @@ -202,15 +223,15 @@ tag = "canon-v2.0.4" [canon.artifacts] criteria = { path = "0-canon/rsr/rsr-criteria-v2.a2ml", # relocated from the vendored copy - sha256 = "37cb5f679b414f6ee99c6bb62c460fd5349ff7d50cc1dab25b1e1a8e8d3c7bb9", + sha256 = "6a5aa8857bd0d0d58ef48827938ca17c251b6b854dacf59d306388d61694d82a", slot = "criteria", normative = true } gates = { path = ".machine_readable/template-capability-gates.toml", # from .machine_readable/ - sha256 = "b65ce75438c42d01bedf0325b9a97f1a575064866158b4340d7427fca911dd1b", + sha256 = "e70efd2f53c9445e30da4baf770366f04a4a84ffd844a01426e587e565b53e6a", slot = "gates", normative = true } applicability = { path = "0-canon/TEMPLATE-APPLICABILITY-POLICY.adoc", - sha256 = "f99543732675f53e25b40d042a1dd1ec4c9cfe7c31d71def18a202b419c26414", + sha256 = "1c5caa467769a85cd173d9bf680f1836d3fc18859acfeb5dd8cd4163b0572662", slot = "applicability", normative = true } lifecycle = { path = "0-canon/rsr/SCAFFOLD-LIFECYCLE.adoc", From 4cd507cce8aff05e4e2b9a4011b92935e9acd490 Mon Sep 17 00:00:00 2001 From: hyperpolymath-recon Date: Sat, 19 Sep 2026 19:30:20 +0000 Subject: [PATCH 4/4] =?UTF-8?q?release(canon):=20canon-v2.1.1=20=E2=80=94?= =?UTF-8?q?=20ADR-0003=20ratification=20(lifecycle=20artefact=20flip)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Scaffold Lifecycle status draft -> accepted, owner ruling 2026-09-19 (ADR-0003; the companion spine-side flip lands in rsr-template-repo recon-2026-09-19/adr0003-ratify). PATCH per [canon.artifacts] protocol: editorial status change, no criteria-set change; lifecycle sha256 rewritten in this commit; dated note appended newest-first. --- 0-canon/rsr/SCAFFOLD-LIFECYCLE.adoc | 6 +++--- canon.lock | 14 +++++++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/0-canon/rsr/SCAFFOLD-LIFECYCLE.adoc b/0-canon/rsr/SCAFFOLD-LIFECYCLE.adoc index 5211a5caf..19e3623e9 100644 --- a/0-canon/rsr/SCAFFOLD-LIFECYCLE.adoc +++ b/0-canon/rsr/SCAFFOLD-LIFECYCLE.adoc @@ -5,9 +5,9 @@ Jonathan D.A. Jewell :toc: :sectnums: -*Status: draft* (companion to `RSR-SPEC-v2.adoc`; the decision record is -`hyperpolymath/rsr-template-repo` ADR-0003, _Forge and Sustain lifecycle_). -MUST NOT be cited as ratified until the owner accepts ADR-0003. +*Status: accepted* (ratified by owner ruling 2026-09-19; companion to +`RSR-SPEC-v2.adoc`; the decision record is `hyperpolymath/rsr-template-repo` +ADR-0003, _Forge and Sustain lifecycle_). == Purpose diff --git a/canon.lock b/canon.lock index e9e2a81fe..7b14c6e94 100644 --- a/canon.lock +++ b/canon.lock @@ -115,6 +115,14 @@ # --------------------------------------------------------------------------- # +# 2026-09-19 - PATCH 2.1.0 -> 2.1.1. ADR-0003 RATIFIED. +# +# SCAFFOLD-LIFECYCLE.adoc flips Status: draft -> accepted (owner ruling +# 2026-09-19; the decision record is rsr-template-repo ADR-0003, flipped +# to Accepted in the same release train). PATCH: editorial status change, +# no criteria-set change. The lifecycle artefact hash is rewritten below +# in this commit per the [canon.artifacts] protocol. +# # 2026-09-19 - MINOR 2.0.4 -> 2.1.0. THE JULIA-GATED CRITERIA. # # Additive MINOR (rule-minor): four new criteria 5.2.3-5.2.6, all gated on @@ -201,7 +209,7 @@ # A released major is immutable. Bumping `version` to a new MAJOR means the # prior major's criteria file is copied to 0-canon/rsr/archive/ and pinned # there; a freeze guard fails any PR that mutates a frozen major. -version = "2.1.0" +version = "2.1.1" spec_family = "rhodium-standard-repositories" status = "draft" # draft | stable released = "2026-09-19" @@ -210,7 +218,7 @@ authority = "0-canon/constitution/ESTATE-CONSTITUTION.adoc" # The full git ref that realises this canon. A tag alone is not sufficient # (tags move); a commit alone is not sufficient (it has no version). Both. commit = "0000000000000000000000000000000000000000" # ← fill at release -tag = "canon-v2.1.0" +tag = "canon-v2.1.1" # --------------------------------------------------------------------------- # THE ARTEFACT SET — the files that ARE the canon. @@ -235,7 +243,7 @@ applicability = { path = "0-canon/TEMPLATE-APPLICABILITY-POLICY.adoc", slot = "applicability", normative = true } lifecycle = { path = "0-canon/rsr/SCAFFOLD-LIFECYCLE.adoc", - sha256 = "2ef660ee2acef29148b697097ca1f676ee791a4b83aebb7d7794f461bcf6d048", + sha256 = "2f405c9ed18e36c067b402cb303b45505f418cab06d90b9857f180950eee7aea", slot = "lifecycle", normative = true } constitution = { path = "0-canon/constitution/",