Every change to WAI added an entry at the head of wai/CHANGELOG.md, and every new module appended to the hand-kept lists of .github/workflows/wai-conformance.yml. So any two branches conflicted on those lines and had to merge one after another. This moves both into files a change adds. - Changelog entries: a change adds wai/changes/<yyyy-mm-dd>-<slug>.md holding the entry text. scripts/changelog-assemble.py renders the entries into CHANGELOG.md's Unreleased section for a release, in a stable order. scripts/check-changelog-fragment.py, run by repo-checks on every pull request, fails a pull request that changes wai/ and adds or edits no entry file directly in wai/changes/ (a release passes, and so does a commit with the trailer line "Changelog: none"). A pull request opened before the check reached main passes as it is; one opened after it that adds its entry to the head of Unreleased fails and is told where the entry goes. wai breaking reads breaking changes from entry files too. - The conformance workflow: each per-module verifier step is a file in .github/wai-conformance/verifiers/, each corpus a file in corpora/, and the integer-kernel tests carry a tag line. scripts/wai-conformance-lists.py derives every list the workflow kept by hand (WAI_FEATURES, the union --bin and --test lists, the features-alone lists, the kernel and corpus steps) from those files when the workflow runs. Its `selftest --exact` holds the derived lists to the hand lists of the commit before this one, and its dry-run prints every command each job runs: the dry-runs before and after this change differ only in the gate's path list, which gains the two paths this change adds. - What stays shared, and how to insert there, is written in wai/CONTRIBUTING.md and wai/changes/README.md: wai-rs Cargo.toml features and [[test]] entries, lib.rs, registry rows, wai/.gitattributes and the live corpus table take an insert beside the related entry, never at the end. Co-Authored-By: Claude Opus 5.5 <[email protected]>
5.2 KiB
open-standards — Rules for Claude
This is the Transaction-Science open-standards monorepo (Apache-2.0 code + CC-BY spec text). The standards live here as subdirectories, not separate repos — including wai, jouleclaw, jcp, mesh, sandbox, map, aac (access), sense, openpay, smart-byte, eoc, arl, joulecontract, joule-code, joule-ui, joule-os, joulehook, jouledesk, jouletable, and proof. A change to any one standard is a commit in this one repo.
Sovereign git & CI (canonical — READ FIRST)
Canonical git home is the sovereign Forgejo forge at https://git.transaction.science/Transaction-Science/open-standards. GitHub and Codeberg are downstream mirrors that update automatically on every commit — push only to the forge (origin on dev already points there; GitHub is preserved as the github-backup remote). Never treat GitHub as the source of truth: no "View on GitHub" as canonical, and no github.com in any standard's README, install snippet, or public site copy — name git.transaction.science.
- This is a fast-moving, multi-worktree repo;
mainmoves under you. Land work by cherry-picking onto a fresh worktree offorigin/main, build-verify, then rebase/retry the push (the forge auto-mirrors on success). - CI is Forgejo Actions (GitHub-Actions-compatible) on self-hosted runners: use
runs-on: macos/linux— neverubuntu-22.04,windows-2022,namespace-*, or bareself-hosted. Publish releases via the Forgejo release API, notgh release. A repo needs its Actions unit enabled before workflows run. - Buildable targets (all on live self-hosted runners): macOS aarch64 + x86_64 (
runs-on: macos), Linux x86_64 (runs-on: linux) and arm64 (runs-on: linux-arm64— a native arm64 Linux VM on the Apple Silicon dev Mac; arm64 guest on an arm64 host is virtualization, not emulation), Windows x86_64 (runs-on: windows). Windows-arm64 is the only gap — the same VM trick would close it (needs a licence/ISO). Linux-arm64 builds withCC=gcc-14+REMOTE_SERVER_TARGET=aarch64-unknown-linux-gnu; the x86_64 leg uses clang.
Dev-machine push/upload specifics (LAN push-routing, credential, release-asset upload) are in the global operator notes (~/.claude/CLAUDE.md).
Add files of your own; insert beside the entry you build on
Many sessions' branches are open at once, and every line two of them append to is a conflict that serialises their merges. A change adds files of its own where the tree lets it (its changelog entry, and its lists in wai-conformance.yml), and inserts beside the entry it builds on in a file that stays shared:
- WAI's changelog: one new file per change,
wai/changes/<yyyy-mm-dd>-<slug>.md, holding the entry exactly aswai/CHANGELOG.mdwould (wai/changes/README.md). Never edit the head ofwai/CHANGELOG.md; a release renders the files into it (scripts/changelog-assemble.py --write). The repository checks fail a pull request that changeswai/, adds or edits no entry file directly inwai/changes/, and has no commit message whose trailer block holds the lineChangelog: none, exactly (a release, which renders the files and removes them, passes); one opened since the check reached main (the merge that brought it in) that adds its entry to the head ofwai/CHANGELOG.mdinstead fails too. wai-conformance.yml: a new step of the independent verifiers is a file of.github/wai-conformance/verifiers/, a new cargo-class corpus a file of.github/wai-conformance/corpora/, and a new fast-integer-kernel test tags itself (// wai-conformance: int-kernels). The workflow's feature lists, test lists, steps and corpora, and the paths its gate runs on, are derived from them; add no line to the workflow for them, unless a step's# paths:names a file under none of the trigger's paths (checknames it).python3 scripts/wai-conformance-lists.py dry-runprints what runs;wai/CONTRIBUTING.mdstates the header keys.- Files still shared (
wai/wai-rs/Cargo.toml's features and targets,[[test]]entries included,wai/wai-rs/src/lib.rs'smodlines, the tables ofcodecs/registry.rs,wai/.gitattributes, and the corpus table ofwai/live-conformance/README.mdwith the verifier commands under it) are grouped by topic, not sorted: insert beside the entry yours builds on, never at the end, and never re-sort. A corpus whose bytes must never be converted gives its own directory a.gitattributes(* -text), aswai/pin-conformance/andwai/live-conformance/scene/do, rather than a line inwai/.gitattributes. Generated files (wai/registry/capabilities.json,wai/REGISTRY.md's table,wai/vocab/v2.*) are sorted by the export: regenerate them, never merge them by hand.
Framing rules (public surfaces)
- Describe every standard on its own terms — ingest open/private efforts into permissive-licensed Rust; no competitive / SWOT framing, no comparisons, no us-vs-them. Copy is self-referential only.
- Don't manufacture cross-project dependencies; shared neutral primitives ≠ "X is built on Y." Verify before asserting a link.
- No vanity metrics (crate/test counts, LOC, "N+ adapters") — describe the shape, not the size.