Skip to content

feat(json): JSON-POLICY (D306) + report-only ijson-jcs gate - #1189

Merged
hyperpolymath merged 3 commits into
mainfrom
feat/ijson-jcs-gate
Oct 7, 2026
Merged

hyperpolymath merged 3 commits into
mainfrom
feat/ijson-jcs-gate

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented Oct 7, 2026 •

Copy link
Copy Markdown
Owner

Summary

Implements owner ruling D306 (standards#787): every estate .json/.jsonl is I-JSON (RFC 7493) + JCS (RFC 8785) canonical, extensions unchanged. This is task 3b, authorised by D314.

  • 3-practice/JSON-POLICY.adoc:
    • Rule J-1 (.json) and Rule J-2 (.jsonl, one canonical record per line).
    • The tool-demanded JSONC carve-out (devcontainer.json, .vscode/*.json, whose comments carry SPDX).
    • A §0 measurement of this repo.
    • §5, the measured conformance of hyperpolymath/ijson-jcs itself.
    • §6, what is deliberately not ruled.
  • scripts/check-ijson-jcs.sh: a report-only gate. It lists non-canonical and invalid files plus a summary, then exits 0. --enforce exits 1 on any finding. A missing tool or path exits 2, so a gate that cannot look does not pass.
  • scripts/tests/check-ijson-jcs-test.sh: 31 controls proving the gate can fail.
  • .github/workflows/ijson-jcs.yml: installs ijson-jcs at a pinned commit, runs the test, then the scan.
  • .github/workflows/self-test.yml: installs the same pinned ijson-jcs. The shared "Repo self-tests" job runs every scripts/tests/*.sh fail-closed, and on 8c981268 the new test exited 2 there for want of the binary (every control red). The tool is installed rather than the test skipped: a skip is not a pass.

No issue: D306 is the authorising ruling.

Type of change

  • 🐛 Bug fix (not a fix)
  • ✨ New feature (non-breaking change that adds functionality): a new policy and gate; report-only, so nothing that passes today fails
  • 💥 Breaking change (no; the gate exits 0 on findings)
  • 🕳️ Soundness fix (no)
  • 📖 Documentation: 3-practice/JSON-POLICY.adoc
  • 🧹 Refactor / tech debt (no)
  • ⚡ Performance (no)
  • 🔧 Build / CI / tooling: new workflow and script

📌 New pins

Head SHA: cdcfbb1d3e3304cf23e952ba859d0b3b61fcffcd

  • actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 (v7.0.1). This pin is already used estate-wide. It gets a new actions.lock entry under .github/workflows/ijson-jcs.yml, added by hand, because gh actions-lock fix mode corrupts local refs.
  • hyperpolymath/ijson-jcs at 0fdeea716fd558e9807362acf6f8202d56d8d88f, installed with cargo install --git … --rev … --locked, since the tool has no releases. Its Cargo.lock is committed at that rev. The same pin is used in self-test.yml; a run: step adds no uses:, so actions.lock is unchanged by that commit.

How has this been verified?

  • bash scripts/tests/check-ijson-jcs-test.sh reported passed 31, failed 0. It covers canonical, unsorted, pretty-printed, no-final-newline, two-final-newlines, duplicate-key and truncated .json; canonical, second-line-unsorted, whitespace, no-final-newline, blank-line and unparseable .jsonl; the JSONC carve-out; nested directories; node_modules/.git exclusion; an empty tree; and exit 2 for a missing path or binary.
  • Mutants: four sed mutants of the checker, each bash -n-clean and different from the original, all turned the suite red:
    • line comparison disabled: 3 FAIL;
    • final-newline check disabled: 1 FAIL;
    • .jsonl dispatch broken: 3 FAIL;
    • the .json final-newline tail check disabled: 2 FAIL (exactly the two new controls). It exists because ijson-jcs check itself accepts a .json with no final newline.
  • scripts/check-ijson-jcs.sh . on this branch reported 62 file(s) checked, 0 canonical, 62 not canonical, 0 invalid with rc=0. 62 equals git ls-files '*.json' '*.jsonl' | wc -l.
  • bash .githooks/validate-actions-lock.sh: ✅. scripts/check-lock-sync.sh: "actions.lock is in sync". actionlint .github/workflows/ijson-jcs.yml: rc=0. scripts/check-allowed-actions.sh: 0 not covered. scripts/check-workflow-duplicate-keys.sh: 60 clean.
  • gh actions-lock --no-fix: the only finding naming the new workflow is the sha-as-ref warning every SHA pin in this repo carries. Its one error (signed-push-smoke.yml, local-action) is already on main.
  • scripts/check-inline-python.sh exits 1 on main too: a stale ledger line for rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.../comprehensive-quality.yml. That is unrelated to this PR and was not touched.
  • .githooks/docstring-scan.sh --worktree: 7/7 functions documented (100%); 1/1 after the second commit.
  • Tool conformance (§5 of the policy): ijson-jcs@0fdeea71:
    • its own cargo test passes, 38 + 11 + 3;
    • RFC 8785 Appendix B number vectors: 23 of 24 pass.
    • The failure is 43143ff3c1cb0959: the expected output is 1424953923781206.2, the tool emits …206.3. Both strings round-trip; ECMAScript breaks the tie toward the exact value.
    • NaN, Infinity and 1e400 exit 2.
    • A wrong-expectation control ([1e+23] vs [1e23]) was correctly reported as a mismatch.

Horizon: one repository (standards at 9f68971b plus this commit), one tool build (0fdeea71), and 24 Appendix B vectors. The estate-wide conformance count was not measured.

Checklist

  • My commits are signed: git log --format=%G? reports G on 83abfa4a, 8c981268 and cdcfbb1d.
  • I ran the project's own checks/tests locally and they pass, except check-inline-python.sh, whose pre-existing failure on main is described above.
  • New files carry the correct SPDX: the scripts and workflow are MPL-2.0; the policy prose is CC-BY-SA-4.0. No existing file was relicensed.
  • Docs are updated, and no public claim overstates the code: the policy says "report-only" and "not yet blocking" wherever it names the gate, and states the tool's 23/24.
  • No soundness hole introduced. The gate is report-only by design. Exit 2 on a missing tool or path stops a mis-installed tool from reporting a pass.

Notes for reviewers

  • Report-only is deliberate. Nothing in this repo conforms yet (0/62). Making the gate blocking, here or in the reusable estate gates, is a separate owner decision, after conversion.
  • No JSON was reformatted. Per AGENTS.md §2a, files are converted per repo after checking their consumers, not swept.
  • The ijson-jcs Appendix B failure and a suggested --lines mode are appended to dev-notes/inbox/findings.md, together with the tool's missing-newline acceptance (D273: findings, not issues). That file is local; the dev-notes vault push is currently blocked.

🤖 Generated with Claude Code

https://claude.ai/code/session_01D6JVLvmCeSFGcY6jSNesbL

Adds 3-practice/JSON-POLICY.adoc: J-1 (I-JSON + JCS for .json), J-2
(one canonical record per line for .jsonl), the tool-demanded JSONC
carve-out, and the measured conformance of ijson-jcs@0fdeea71
(RFC 8785 Appendix B numbers: 23/24).

scripts/check-ijson-jcs.sh reports non-canonical/invalid files and
exits 0; --enforce exits 1; a missing tool or path exits 2.
scripts/tests/check-ijson-jcs-test.sh (28 controls) proves it can
fail; three mutants (line compare, final newline, .jsonl dispatch)
each turn it red. Wired as .github/workflows/ijson-jcs.yml with a
hand-added actions.lock entry (checkout only).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D6JVLvmCeSFGcY6jSNesbL
@coderabbitai

coderabbitai Bot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 56 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 2803dcd5-c40b-491d-b341-a36326339927
📥 Commits

Reviewing files that changed from the base of the PR and between 9f68971 and cdcfbb1.

⛔ Files ignored due to path filters (1)
  • .github/workflows/actions.lock is excluded by !**/*.lock
📒 Files selected for processing (5)
  • .github/workflows/ijson-jcs.yml
  • .github/workflows/self-test.yml
  • 3-practice/JSON-POLICY.adoc
  • scripts/check-ijson-jcs.sh
  • scripts/tests/check-ijson-jcs-test.sh
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

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

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

K9 contract conformance

run https://github.com/hyperpolymath/standards/actions/runs/37584463836

K9 normative contract typecheck

k9_contract.ncl typechecks

K9 contract self-test

== the bash mirrors cannot drift from the normative contract ==
ok   leash_levels mirrors k9_contract.ncl
ok   core_capabilities mirrors k9_contract.ncl
ok   contract_version mirrors k9_contract.ncl
ok   schema_major mirrors k9_contract.ncl
== capability arithmetic (§8) ==
ok   capability_ok fs.read accepted
ok   capability_ok rollback.apply accepted
ok   capability_ok x-acme.gpu.alloc accepted
ok   capability_ok x-acme rejected
ok   capability_ok x-.gpu rejected
ok   capability_ok fs.delete rejected
ok   capability_ok  rejected
== the extractor ==
ok   extracts pedigree.security.leash
ok   extracts pedigree.component_type
ok   extracts pedigree.metadata.name
ok   pedigree leash is not reported as top-level leash
ok   required_capabilities for a quiet component
ok   required_capabilities follows allow_network
== the envelope strip keeps line numbers (§3.6) ==
ok   line 1 becomes a comment
ok   line count is preserved
ok   schema_version stays on line 5
== L3: signature presence is not verification (§10) ==
ok   no verifier -> K9-C001 is SKIPPED, never a pass
ok   the skip states presence does not authorise 'Hunt
ok   verifier accepts -> verdict 'Verified, no K9-C001 finding
ok   verifier refuses -> K9-C001 error, verdict 'Rejected
== the fixture runner's attribution cannot be fooled by a filename ==
ok   every extracted finding is well-formed rule+layer
ok   the rule that really fired is attributed
ok   a rule named only in the filename is NOT attributed
ok   K9-C001 is present as a skipped finding
ok   and that same finding is NOT extractable as a rejection
== no Nickel reserved word is used as an identifier ==
ok   the contract and all 27 fixtures avoid Nickel's reserved words

self-test: all assertions passed

K9 conformance fixtures

== positive controls (must pass) ==
ok   extension-capability.k9.ncl
ok   extension-fields.k9.ncl
ok   hunt-fully-granted.k9.ncl
ok   kennel-data.k9.ncl
ok   library-base.ncl
ok   yard-typed-config.k9.ncl

== negative controls (must fail, by the named rule) ==
ok   L0-K9-E001-bad-magic.k9.ncl (rejected by K9-E001 at L0)
ok   L0-K9-E002-nul-byte.k9.ncl (rejected by K9-E002 at L0)
ok   L0-K9-E003-crlf.k9.ncl (rejected by K9-E003 at L0)
ok   L0-K9-E004-no-spdx.k9.ncl (rejected by K9-E004 at L0)
ok   L0-K9-E005-unclaimed-body.k9.ncl (rejected by K9-E005 at L0)
ok   L0-K9-S012-library-with-pedigree.ncl (rejected by K9-S012 at L0)
ok   L0-K9-S014-stray-leash.ncl (rejected by K9-S014 at L0)
ok   L1-K9-S001-no-pedigree.k9.ncl (rejected by K9-S001 at L1)
ok   L1-K9-S002-wrong-major.k9.ncl (rejected by K9-S002 at L1)
ok   L1-K9-S003-todo-component-type.k9.ncl (rejected by K9-S003 at L1)
ok   L1-K9-S004-unknown-leash.k9.ncl (rejected by K9-S004 at L1)
ok   L1-K9-S005-missing-name.k9.ncl (rejected by K9-S005 at L1)
ok   L1-K9-S006-unknown-capability.k9.ncl (rejected by K9-S006 at L1)
ok   L1-K9-S007-ungranted-flag.k9.ncl (rejected by K9-S007 at L1)
ok   L1-K9-S008-hunt-signature-not-required.k9.ncl (rejected by K9-S008 at L1)
ok   L1-K9-S009-hunt-no-signature-block.k9.ncl (rejected by K9-S009 at L1)
ok   L1-K9-S010-hunt-empty-side-effects.k9.ncl (rejected by K9-S010 at L1)
ok   L1-K9-S011-recipes-at-yard.k9.ncl (rejected by K9-S011 at L1)
ok   L1-K9-S013-dangling-import.k9.ncl (rejected by K9-S013 at L1)
ok   L2-K9-N001-two-segment-version.k9.ncl (rejected by K9-N001 at L2)
ok   L2-K9-N001-wrong-field-type.k9.ncl (rejected by K9-N001 at L2)

fixtures: 6 positive, 21 negative (0 needing nickel), 0 failure(s)

K9 corpus conformance (L2)

[validate-k9] debt rhodium-standard-repositories/rsr-compliance-checklist.k9.ncl (fail) — K9-N001 K9-S004 K9-S005 K9-S014 (grandfathered; touching it makes it blocking)
[validate-k9] 14 conforming, 1 grandfathered (layer all, contract v1.0.0)

ijson-jcs check accepts a .json with no final newline, so the gate
let one pass that J-1 rejects. classify_json now checks the tail
byte. Two new controls (no newline, two newlines); a mutant that
disables the tail check turns exactly the first one red.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D6JVLvmCeSFGcY6jSNesbL
@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

K9 contract conformance

run https://github.com/hyperpolymath/standards/actions/runs/37584740324

K9 normative contract typecheck

k9_contract.ncl typechecks

K9 contract self-test

== the bash mirrors cannot drift from the normative contract ==
ok   leash_levels mirrors k9_contract.ncl
ok   core_capabilities mirrors k9_contract.ncl
ok   contract_version mirrors k9_contract.ncl
ok   schema_major mirrors k9_contract.ncl
== capability arithmetic (§8) ==
ok   capability_ok fs.read accepted
ok   capability_ok rollback.apply accepted
ok   capability_ok x-acme.gpu.alloc accepted
ok   capability_ok x-acme rejected
ok   capability_ok x-.gpu rejected
ok   capability_ok fs.delete rejected
ok   capability_ok  rejected
== the extractor ==
ok   extracts pedigree.security.leash
ok   extracts pedigree.component_type
ok   extracts pedigree.metadata.name
ok   pedigree leash is not reported as top-level leash
ok   required_capabilities for a quiet component
ok   required_capabilities follows allow_network
== the envelope strip keeps line numbers (§3.6) ==
ok   line 1 becomes a comment
ok   line count is preserved
ok   schema_version stays on line 5
== L3: signature presence is not verification (§10) ==
ok   no verifier -> K9-C001 is SKIPPED, never a pass
ok   the skip states presence does not authorise 'Hunt
ok   verifier accepts -> verdict 'Verified, no K9-C001 finding
ok   verifier refuses -> K9-C001 error, verdict 'Rejected
== the fixture runner's attribution cannot be fooled by a filename ==
ok   every extracted finding is well-formed rule+layer
ok   the rule that really fired is attributed
ok   a rule named only in the filename is NOT attributed
ok   K9-C001 is present as a skipped finding
ok   and that same finding is NOT extractable as a rejection
== no Nickel reserved word is used as an identifier ==
ok   the contract and all 27 fixtures avoid Nickel's reserved words

self-test: all assertions passed

K9 conformance fixtures

== positive controls (must pass) ==
ok   extension-capability.k9.ncl
ok   extension-fields.k9.ncl
ok   hunt-fully-granted.k9.ncl
ok   kennel-data.k9.ncl
ok   library-base.ncl
ok   yard-typed-config.k9.ncl

== negative controls (must fail, by the named rule) ==
ok   L0-K9-E001-bad-magic.k9.ncl (rejected by K9-E001 at L0)
ok   L0-K9-E002-nul-byte.k9.ncl (rejected by K9-E002 at L0)
ok   L0-K9-E003-crlf.k9.ncl (rejected by K9-E003 at L0)
ok   L0-K9-E004-no-spdx.k9.ncl (rejected by K9-E004 at L0)
ok   L0-K9-E005-unclaimed-body.k9.ncl (rejected by K9-E005 at L0)
ok   L0-K9-S012-library-with-pedigree.ncl (rejected by K9-S012 at L0)
ok   L0-K9-S014-stray-leash.ncl (rejected by K9-S014 at L0)
ok   L1-K9-S001-no-pedigree.k9.ncl (rejected by K9-S001 at L1)
ok   L1-K9-S002-wrong-major.k9.ncl (rejected by K9-S002 at L1)
ok   L1-K9-S003-todo-component-type.k9.ncl (rejected by K9-S003 at L1)
ok   L1-K9-S004-unknown-leash.k9.ncl (rejected by K9-S004 at L1)
ok   L1-K9-S005-missing-name.k9.ncl (rejected by K9-S005 at L1)
ok   L1-K9-S006-unknown-capability.k9.ncl (rejected by K9-S006 at L1)
ok   L1-K9-S007-ungranted-flag.k9.ncl (rejected by K9-S007 at L1)
ok   L1-K9-S008-hunt-signature-not-required.k9.ncl (rejected by K9-S008 at L1)
ok   L1-K9-S009-hunt-no-signature-block.k9.ncl (rejected by K9-S009 at L1)
ok   L1-K9-S010-hunt-empty-side-effects.k9.ncl (rejected by K9-S010 at L1)
ok   L1-K9-S011-recipes-at-yard.k9.ncl (rejected by K9-S011 at L1)
ok   L1-K9-S013-dangling-import.k9.ncl (rejected by K9-S013 at L1)
ok   L2-K9-N001-two-segment-version.k9.ncl (rejected by K9-N001 at L2)
ok   L2-K9-N001-wrong-field-type.k9.ncl (rejected by K9-N001 at L2)

fixtures: 6 positive, 21 negative (0 needing nickel), 0 failure(s)

K9 corpus conformance (L2)

[validate-k9] debt rhodium-standard-repositories/rsr-compliance-checklist.k9.ncl (fail) — K9-N001 K9-S004 K9-S005 K9-S014 (grandfathered; touching it makes it blocking)
[validate-k9] 14 conforming, 1 grandfathered (layer all, contract v1.0.0)

The shared suite runs every scripts/tests/*.sh fail-closed, and the new
ijson-jcs test exits 2 without the binary, so Repo self-tests went red.
Install it at the same pin as ijson-jcs.yml.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D6JVLvmCeSFGcY6jSNesbL
@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

K9 contract conformance

run https://github.com/hyperpolymath/standards/actions/runs/37585352810

K9 normative contract typecheck

k9_contract.ncl typechecks

K9 contract self-test

== the bash mirrors cannot drift from the normative contract ==
ok   leash_levels mirrors k9_contract.ncl
ok   core_capabilities mirrors k9_contract.ncl
ok   contract_version mirrors k9_contract.ncl
ok   schema_major mirrors k9_contract.ncl
== capability arithmetic (§8) ==
ok   capability_ok fs.read accepted
ok   capability_ok rollback.apply accepted
ok   capability_ok x-acme.gpu.alloc accepted
ok   capability_ok x-acme rejected
ok   capability_ok x-.gpu rejected
ok   capability_ok fs.delete rejected
ok   capability_ok  rejected
== the extractor ==
ok   extracts pedigree.security.leash
ok   extracts pedigree.component_type
ok   extracts pedigree.metadata.name
ok   pedigree leash is not reported as top-level leash
ok   required_capabilities for a quiet component
ok   required_capabilities follows allow_network
== the envelope strip keeps line numbers (§3.6) ==
ok   line 1 becomes a comment
ok   line count is preserved
ok   schema_version stays on line 5
== L3: signature presence is not verification (§10) ==
ok   no verifier -> K9-C001 is SKIPPED, never a pass
ok   the skip states presence does not authorise 'Hunt
ok   verifier accepts -> verdict 'Verified, no K9-C001 finding
ok   verifier refuses -> K9-C001 error, verdict 'Rejected
== the fixture runner's attribution cannot be fooled by a filename ==
ok   every extracted finding is well-formed rule+layer
ok   the rule that really fired is attributed
ok   a rule named only in the filename is NOT attributed
ok   K9-C001 is present as a skipped finding
ok   and that same finding is NOT extractable as a rejection
== no Nickel reserved word is used as an identifier ==
ok   the contract and all 27 fixtures avoid Nickel's reserved words

self-test: all assertions passed

K9 conformance fixtures

== positive controls (must pass) ==
ok   extension-capability.k9.ncl
ok   extension-fields.k9.ncl
ok   hunt-fully-granted.k9.ncl
ok   kennel-data.k9.ncl
ok   library-base.ncl
ok   yard-typed-config.k9.ncl

== negative controls (must fail, by the named rule) ==
ok   L0-K9-E001-bad-magic.k9.ncl (rejected by K9-E001 at L0)
ok   L0-K9-E002-nul-byte.k9.ncl (rejected by K9-E002 at L0)
ok   L0-K9-E003-crlf.k9.ncl (rejected by K9-E003 at L0)
ok   L0-K9-E004-no-spdx.k9.ncl (rejected by K9-E004 at L0)
ok   L0-K9-E005-unclaimed-body.k9.ncl (rejected by K9-E005 at L0)
ok   L0-K9-S012-library-with-pedigree.ncl (rejected by K9-S012 at L0)
ok   L0-K9-S014-stray-leash.ncl (rejected by K9-S014 at L0)
ok   L1-K9-S001-no-pedigree.k9.ncl (rejected by K9-S001 at L1)
ok   L1-K9-S002-wrong-major.k9.ncl (rejected by K9-S002 at L1)
ok   L1-K9-S003-todo-component-type.k9.ncl (rejected by K9-S003 at L1)
ok   L1-K9-S004-unknown-leash.k9.ncl (rejected by K9-S004 at L1)
ok   L1-K9-S005-missing-name.k9.ncl (rejected by K9-S005 at L1)
ok   L1-K9-S006-unknown-capability.k9.ncl (rejected by K9-S006 at L1)
ok   L1-K9-S007-ungranted-flag.k9.ncl (rejected by K9-S007 at L1)
ok   L1-K9-S008-hunt-signature-not-required.k9.ncl (rejected by K9-S008 at L1)
ok   L1-K9-S009-hunt-no-signature-block.k9.ncl (rejected by K9-S009 at L1)
ok   L1-K9-S010-hunt-empty-side-effects.k9.ncl (rejected by K9-S010 at L1)
ok   L1-K9-S011-recipes-at-yard.k9.ncl (rejected by K9-S011 at L1)
ok   L1-K9-S013-dangling-import.k9.ncl (rejected by K9-S013 at L1)
ok   L2-K9-N001-two-segment-version.k9.ncl (rejected by K9-N001 at L2)
ok   L2-K9-N001-wrong-field-type.k9.ncl (rejected by K9-N001 at L2)

fixtures: 6 positive, 21 negative (0 needing nickel), 0 failure(s)

K9 corpus conformance (L2)

[validate-k9] debt rhodium-standard-repositories/rsr-compliance-checklist.k9.ncl (fail) — K9-N001 K9-S004 K9-S005 K9-S014 (grandfathered; touching it makes it blocking)
[validate-k9] 14 conforming, 1 grandfathered (layer all, contract v1.0.0)

@sonarqubecloud

sonarqubecloud Bot commented Oct 7, 2026

Copy link
Copy Markdown

hyperpolymath added a commit to hyperpolymath/rsr-template-repo that referenced this pull request Oct 7, 2026
…230)

## Summary

Brings the template in line with three owner rulings recorded on
`hyperpolymath/standards#787`:
- **Deno is retired** (2026-08-26, standards#655);
- **JSON is I-JSON + JCS** (D306);
- **UUIDv8, KYAML `.kyaml`, descriptiles as deed clauses, contractiles
as k9 verb directories** (D305, D307, D312).

The template scaffolds every new repo, so text here that contradicts a
ruling gets copied into every repo made from it.

## 📌 New pins

Head SHA: **`0509dbfec1c8e60aff47b3de1b06406dda18fd57`**.

No action, lockfile or container pin is added or changed.
`oven-sh/setup-bun@v2.2.0` appears only inside **commented-out** blocks
of `e2e.yml.template`. Its comment says `actions.lock` resolves it when
the template is instantiated. It is not a live `uses:`.

## Changes

**Deno**
- `release.yml`: removed the `deno.json` branch, and removed `deno.json`
from the "Expected one of" message.
- `e2e.yml.template`: the DENO/E2E block and the Playwright block now
use Bun (`bun install --frozen-lockfile`, `bun test`, `bunx
playwright`).
- `runtime-policy.yml`, `workflow-linter.yml` and
`scripts/check-action-pinning.js` ordering comments now read "Bun > pnpm
> npm; Deno retired".
  - The runtime-policy **Deno detector is kept**: it is what flags Deno.
- Raising its `::warning` to an error is logged as a finding, not done
here.
- `.clinerules`, `.cursorrules`, `.windsurfrules`: "Deno grandfathered"
and "TypeScript IS PERMITTED" are replaced by "Deno retired, migrate to
Bun; TypeScript and ReScript migrate to AffineScript".
- `.machine_readable/arrival-pack/arrival-pack.ncl`: the language-policy
source of CLAUDE.md, corrected the same way. CLAUDE.md was regenerated
with `generate.sh`.
- `.github/pull_request_template.md`: the "banned language" checkbox
read "(no , no npm/bun, no Go/Python)": a word was missing and it banned
Bun. It now names the banned set. The SPDX header is untouched.

**JSON (D306)**
- Canonicalised with `ijson-jcs fix` (pinned `0fdeea71`), the four
template-owned files only:
  - `.github/rulesets/Immutable-Tags.json`
  - `www/.well-known/aibdp.json`
  - `www/tests/controls/aibdp-bad-status.control.json`
  - `www/tests/controls/aibdp-enforce-430.control.json`
- Deliberately **not** touched:
- `base.json`, `branch-floor.json`, `require-linear-history.json`,
`require-signed-commits.json`: byte-identical copies of
`standards/config/rulesets`, said to be sourced verbatim. Canonicalise
upstream first.
- `www/schemas/aibdp-schema-v0.2.json`: vendored unmodified from
consent-aware-web.
- `.github/labels.json`, `.github/label-classifier.json`: generated ("do
not edit") by generators in another repo. Logged as a finding.
- the two `devcontainer.json` files: tool-demanded JSONC whose comments
carry SPDX headers.

**CLAUDE.md and the deed**
- In the hand-authored block below the generated region (owner marker
kept):
- UUIDv7 → **UUIDv8** (ADR-008, D305). Deed literals stay `#u5`, and
existing IDs are not rewritten.
- KYAML: `.kyaml` for estate config, `.yml` only where a tool demands
it. Workflows wait for the lock-coverage shim (D280, D307).
- JSON cites `standards/3-practice/JSON-POLICY.adoc`. That file lands
with hyperpolymath/standards#1189 and does not exist on standards `main`
until that PR merges.
- The required-templates list (Intentfile, Mustfile, …) is replaced by
descriptiles-as-deed-clauses and contractiles-as-k9-verb-directories
(D312).
- `rsr-template-repo_chora.deed` `:contractiles_required` now lists the
retired names' real directories: `("Mustfile" "Trustfile" "Intentfile")`
→ `.machine_readable/contractiles/{must,trust,intend}/`.
- The deed has **no `(contractiles …)` attestation clause yet**.
CLAUDE.md names it as the D312 target and does not claim it exists.

**Left as it is, on purpose:** `.github/copilot-instructions.md` keeps
the narrow TypeScript carve-out that
`standards/3-practice/LANGUAGE-POLICY.adoc` §1.2 still states.
Reconciling it with the Bun-only ruling is pending in standards.

## RSR Quality Checklist

### Required

- [x] Tests pass. `www/tests/check-aibdp.sh` gives rc=0, and its output
is byte-identical before and after the JSON change; both planted
controls are still rejected.
- [x] Formatted. The canonicalised files pass `ijson-jcs check` (rc=0 on
all four), and `jq -S` shows the same data before and after.
- [x] Linter is clean, no new warnings. `actionlint` on the three edited
workflows reports two shellcheck warnings (`release.yml` SC2046,
`workflow-linter.yml` SC2034). Both are present on `main` unchanged;
this PR adds none.
- [x] No banned language patterns. This PR removes them.
- [ ] `unsafe` blocks: not applicable, no Rust touched.
- [ ] Banned functions: not applicable, no proof or ML code touched.
- [x] SPDX headers present. No new files; every modified file keeps its
existing header.
- [x] No secrets, credentials or `.env` files.

### As Applicable

- [ ] Deed `(status)`/`(maturity)`: no project state change. Only
`:contractiles_required` changed, as above.
- [ ] Deed `(ecosystem)`: no integration change.
- [ ] Deed `(meta)` / `docs/decisions/`: no new decision. This applies
rulings already recorded on standards#787.
- [ ] ROADMAP: no milestone change.
- [x] Documentation updated: CLAUDE.md, the rules files, and the PR
template.
- [ ] TOPOLOGY.md: no architecture change.
- [ ] CHANGELOG: not updated; the template has no release cut pending.
- [ ] Dependencies: none added.
- [ ] ABI/FFI: not touched.

## Testing

- `bash .machine_readable/arrival-pack/verify.sh` → `OK: CLAUDE.md
arrival pack is in sync with the deed.` Run before the change (baseline)
and after regeneration. Run with nickel 1.16.0.
- `bash scripts/validate-template.sh` → `Validation PASSED`, 0 errors.
The 7 warnings are placeholders and SPDX headers on files this PR does
not touch.
- `ijson-jcs check` → rc=0 on the four canonicalised files.
- `standards/.githooks/docstring-scan.sh --worktree` → no functions
touched.
- A grep for `deno` in `release.yml` returns nothing.
- Not run locally: `deed-validate` runs a remote action
(`deed-ecosystem/validate-action`). CI is the check for the deed edit,
which reuses the multi-line string-list form already used by
`:machine_readable_required`.

## Screenshots

Not applicable.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01D6JVLvmCeSFGcY6jSNesbL


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Updated runtime guidance to prioritize Bun, allow pnpm when required
by tooling, and retain npm as a last resort. Existing Deno projects are
directed to migrate to Bun.
* TypeScript and ReScript are no longer permitted; projects using them
are directed to migrate to AffineScript. Use plain JavaScript where
JavaScript is needed.
* Clarified file-format and identifier rules, including exceptions for
formats required by tools.
* **Build and workflow support**
* Deno-based builds are no longer recognized. Updated workflow examples
use Bun for setup, installation, and tests.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@hyperpolymath
hyperpolymath merged commit d5a7cfa into main Oct 7, 2026
67 of 68 checks passed
@hyperpolymath
hyperpolymath deleted the feat/ijson-jcs-gate branch October 7, 2026 07:12
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