Skip to content

ci: follow standards to metadatastician; port the template's CI - #15

Merged
hyperpolymath merged 3 commits into
mainfrom
claude/zealous-wozniak-2nherb
Oct 27, 2026
Merged

hyperpolymath merged 3 commits into
mainfrom
claude/zealous-wozniak-2nherb

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Summary

hyperpolymath/standards moved to metadatastician/standards. Four workflows stopped loading because of it: Governance, Rust CI, Hypatia and Secret Scanner (workflow was not found; see #14).

This PR ports rsr-template-repo's CI from 60cedf1 (the canary state) to 8034fc9, its last green main commit. Template main has been red since a run of direct file renames on 2026-10-26, which are not ported here.

Changes

  • Method. A three-way apply of the template's own diff over .github, scripts, tests, .machine_readable, verification, build/container and the K9 records. Then the mint's self-name pass, run exactly as repo-init.just defines it. Conflicts were resolved toward the template, except estate-rules.yml, which keeps this repository's own tests.
  • Workflows.
    • Governance, Secret Scanner, Rust CI, Hypatia, Scorecard and Mirror now run self-contained, checking out metadatastician/standards@8e48b1c.
    • New: squabble.yml, proven-tests.yml and fork-governance.yml.
    • Deed and K9 validation move into Dogfood Gate, so deed-validate.yml and k9-validate.yml go, as the template did in #247.
  • Config.
    • Container config is now KYAML. It was rendered with this repo's values and canonicalised by kyaml-format.sh, and its parsed data is byte-identical to before.
    • deploy.k9.ncl is re-rendered at K9 contract v1.0.0. coordination.k9.ncl and session/custom-checks.k9.ncl gain component_type.
    • The aibdp schema is JCS-canonical.
    • CLAUDE.md is regenerated by the arrival pack, plus the template's hand-written Proofs section.
    • actions.lock is the template's lock plus proofs.yml.
  • This repo's tests.
    • actions_lock_sha_refs_test.sh lost its subject: governance no longer calls a standards reusable. It now checks every SHA-keyed record in the lock against an exact table (tag, owner and repo IDs), keeps all its negative controls, and refuses any reusable call into the moved repository. Planted regressions fail it as intended.
    • ffi_strings_test.sh and container_kyaml_test.sh join mint-verbatim.txt. They are token fixtures, which the placeholder gate otherwise rejects.
  • Not ported. The template's generator tests (the use-this-template mint, the template-pin resolver and the e2e mint tests) exercise build/just/repo-init.just, and this port does not bring the generator.

Known gap, by owner decision

The self-contained governance runs one policy step. The reusable it replaces ran 19 jobs, among them UUID v8 conformance, licence consistency, actions-lockfile verify, the debt and exemption ratchets and the JS runtime checks. They come back when the owner makes metadatastician/standards callable from hyperpolymath; the template has the same gap.

Template defects found on the way (not fixed here)

  • container-init renders the container KYAML without reformatting it. A freshly minted child therefore fails "Converted YAML stays KYAML".
  • mint-verbatim.txt omits tests/ffi_strings_test.sh and tests/workflows/container_kyaml_test.sh. A fresh child fails the placeholder gate.
  • Template main has been red since the 2026-10-26 renames, for example LICENSE to LICENSE.adoc and CODEOWNERS to CODEOWNERS.adoc.

RSR Quality Checklist

Required

  • Tests pass (just test or equivalent)
  • Code is formatted (just fmt or equivalent)
  • Linter is clean (no new warnings or errors)
  • No banned language patterns (no Python, Go, TypeScript, Deno or ReScript; JavaScript runs on Bun)
  • No unsafe blocks without // SAFETY: comments
  • No banned functions (believe_me, unsafeCoerce, Obj.magic, Admitted, sorry)
  • SPDX license headers present on all new/modified source files
  • No secrets, credentials, or .env files included

As Applicable

  • Documentation updated for user-facing changes
  • CHANGELOG or release notes updated

Testing

Run locally, with yq 4.53.3 sha256-verified as CI installs it:

  • Every tests/workflows/*.sh and tests/shape/*.sh passes.
  • check-lock-sync.sh reports the lock in sync and transitively closed.
  • The deed and K9 hooks pass against metadatastician/standards@8e48b1c: 15 K9 files, 0 failing.
  • kyaml-format.sh --check passes on all three container files.
  • check-ijson-jcs.sh --enforce: 12 of 12 files canonical.
  • check-required-contexts.sh, check-no-placeholders.sh, check-root-shape.sh, the repository-map determinism test and check-adoc-renders.sh all pass.
  • validate-template.sh: 0 errors. check-agda.sh: all proofs and the 8 rejections pass.

Generated by Claude Code

hyperpolymath/standards moved to metadatastician/standards. A reusable
`uses:` does not follow the rename, and a hyperpolymath repository cannot
call a reusable in metadatastician's repository (rsr-template-repo#253
measured it: every caller failed at startup). Governance, Rust CI,
Hypatia and Secret Scanner had stopped loading ("workflow was not found").

Ports rsr-template-repo's CI from 60cedf1 to 8034fc9, its last green main
commit, by a three-way apply of the template's own diff over .github,
scripts, tests, .machine_readable, verification, build/container and the
K9 records, then the mint's self-name pass, as a mint would:
- self-contained workflows checking out metadatastician/standards@8e48b1c;
- squabble, proven-tests and fork-governance workflows; deed and K9
  validation move into Dogfood Gate;
- KYAML container config (data unchanged, rendered with this repo's
  values and canonicalised by kyaml-format.sh), K9 contract v1.0.0
  records, a JCS-canonical aibdp schema;
- CLAUDE.md regenerated by the arrival pack; the template's lock plus
  proofs.yml.

Not ported: the generator tests (use-this-template mint, template-pin
resolver, e2e mint tests), which exercise repo-init.just. Known gap: the
self-contained governance runs one policy step where the reusable ran 19
jobs (UUID v8 conformance, licence consistency, lockfile verify, ratchets,
JS runtimes); they return when standards is callable again.

tests/workflows/actions_lock_sha_refs_test.sh now checks every SHA-keyed
record in the lock against an exact table, keeps all its negative
controls, and refuses any reusable call into the moved repository.
ffi_strings_test.sh and container_kyaml_test.sh join mint-verbatim.txt:
they are token fixtures the placeholder gate otherwise rejects.

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

coderabbitai Bot commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 123 files, which is 23 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

Run configuration
Commits

Reviewing files that changed from the base of the PR and between 37a2f99 and 2d5f150.

Files ignored due to path filters: 1
  • .github/workflows/actions.lock is excluded by !**/*.lock
Files selected for processing: 123
  • .github/actions/squabble/README.adoc
  • .github/actions/squabble/action.yml
  • .github/actions/squabble/install.sh
  • .github/actions/squabble/run.sh
  • .github/hooks/pre-push
  • .github/hooks/scan-secrets.sh
  • .github/hooks/validate-deed.sh
  • .github/hooks/validate-k9.sh
  • .github/label-classifier.json
  • .github/labels.json
  • .github/rulesets/README.adoc
  • .github/rulesets/base.json
  • .github/rulesets/branch-floor.json
  • .github/rulesets/require-linear-history.json
  • .github/rulesets/require-signed-commits.json
  • .github/workflows/README.adoc
  • .github/workflows/codeql.yml
  • .github/workflows/deed-validate.yml
  • .github/workflows/dependabot-automerge.yml
  • .github/workflows/docker-build.yml
  • .github/workflows/dogfood-gate.yml
  • .github/workflows/eclexiaiser-validate.yml
  • .github/workflows/empty-linter.yml
  • .github/workflows/estate-rules.yml
  • .github/workflows/fork-governance.yml
  • .github/workflows/governance.yml
  • .github/workflows/groove-check.yml
  • .github/workflows/hypatia-scan.yml
  • .github/workflows/k9-validate.yml
  • .github/workflows/label-triage.yml
  • .github/workflows/labels.yml
  • .github/workflows/main-estate-audit.yml
  • .github/workflows/mirror.yml
  • .github/workflows/proven-tests.yml
  • .github/workflows/quality.yml
  • .github/workflows/release.yml
  • .github/workflows/rust-ci.yml
  • .github/workflows/scorecard.yml
  • .github/workflows/secret-scanner.yml
  • .github/workflows/security-policy.yml
  • .github/workflows/squabble.yml
  • .github/workflows/static-analysis-gate.yml
  • .github/workflows/workflow-linter.yml
  • .machine_readable/arrival-pack/arrival-pack.ncl
  • .machine_readable/arrival-pack/claude-md.k9.ncl
  • .machine_readable/arrival-pack/extract.sh
  • .machine_readable/coaptation/coapt.k9.ncl
  • .machine_readable/coaptation/core/Coaptation.idr
  • .machine_readable/coaptation/receipts/latest.toml
  • .machine_readable/contractiles/README.adoc
  • .machine_readable/contractiles/adjust/adjust.k9.ncl
  • .machine_readable/contractiles/bust/bust.k9.ncl
  • .machine_readable/contractiles/dust/dust.k9.ncl
  • .machine_readable/contractiles/intend/intend.k9.ncl
  • .machine_readable/contractiles/must/must.k9.ncl
  • .machine_readable/contractiles/trust/trust.k9.ncl
  • .machine_readable/mint-verbatim.txt
  • .machine_readable/required-contexts-allow.txt
  • .machine_readable/root-allow.txt
  • .machine_readable/scripts/maintenance/maint-assault.sh
  • .machine_readable/self-validating/README.adoc
  • .machine_readable/self-validating/examples/setup-repo.k9.ncl.in
  • .machine_readable/self-validating/methodology-guard.k9.ncl
  • .machine_readable/self-validating/template-hunt.k9.ncl.in
  • .machine_readable/self-validating/template-kennel.k9.ncl.in
  • .machine_readable/self-validating/template-yard.k9.ncl.in
  • .machine_readable/testing/adversarial-content.k9.ncl
  • CHANGELOG.adoc
  • CLAUDE.md
  • benches/baseline.json
  • benches/template_bench.sh
  • build/container/README.adoc
  • build/container/compose.example.yaml
  • build/container/compose.yaml
  • build/container/stapeln/.gatekeeper.yaml
  • build/container/stapeln/deploy.k9.ncl
  • build/just/container.just
  • coordination.k9.ncl
  • docs/architecture/REPOSITORY-MAP.adoc
  • scripts/bench-stats.jq
  • scripts/check-bench-regression.sh
  • scripts/check-escape-hatches.sh
  • scripts/check-ijson-jcs.sh
  • scripts/check-lock-sync.sh
  • scripts/check-no-placeholders.sh
  • scripts/check-required-contexts.sh
  • scripts/check-variant-drift.sh
  • scripts/compute-bench-baseline.sh
  • scripts/emit-aggregate-inputs.sh
  • scripts/gen-repo-map.sh
  • scripts/ijson-jcs-cli.js
  • scripts/kyaml-format.sh
  • scripts/merge-actions-lock.rs
  • scripts/prune-dependabot-ecosystems.rs
  • scripts/rsr-campaign.sh
  • scripts/run-proven-suite.sh
  • scripts/strip-instruction-blocks.rs
  • scripts/sweep-wellknown.sh
  • session/custom-checks.k9.ncl
  • src/interface/ffi/src/main.zig
  • tests/ffi_strings_test.sh
  • tests/proven_suite_test.sh
  • tests/run_proven_suite_test.sh
  • tests/workflows/actions_lock_sha_refs_test.sh
  • tests/workflows/check_ijson_jcs_test.sh
  • tests/workflows/check_lock_sync_test.sh
  • tests/workflows/container_kyaml_test.sh
  • tests/workflows/dependabot_automerge_test.sh
  • tests/workflows/dogfood_badge_test.sh
  • tests/workflows/governance_policy_test.sh
  • tests/workflows/kyaml_format_test.sh
  • tests/workflows/kyaml_ratchet_test.sh
  • tests/workflows/mint_cleanup_test.sh
  • tests/workflows/runtime_policy_fold_test.sh
  • tests/workflows/squabble_gate_test.sh
  • verification/proofs/README.adoc
  • verification/proofs/idris2/ABI/Compliance.idr
  • verification/proofs/idris2/ABI/Foreign.idr
  • verification/proofs/idris2/ABI/Layout.idr
  • verification/proofs/idris2/ABI/Platform.idr
  • verification/proofs/idris2/ABI/Pointers.idr
  • verification/proofs/idris2/Types.idr
  • www/schemas/aibdp-schema-v0.2.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · 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.

Copy link
Copy Markdown
Owner Author

SonarCloud Code Analysis failed: "B Security Rating on New Code (required ≥ A)".


Generated by Claude Code

The proven-tests workflow's bench lane needs benches/baseline.json, which
the port left behind: it sits outside the paths ported in d8878e5. Ported
from rsr-template-repo 60cedf1..8034fc9 with template_bench.sh, the same
three-way apply. run-proven-suite.sh --bench now passes locally, both
bench lanes included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LiQzWJdcPfRU6YMDGRG8Xi
@hyperpolymath
hyperpolymath marked this pull request as ready for review October 27, 2026 01:33
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-27T01:41:00.968960Z c7a003d Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

The proven suite's FFI lane failed: tests/ffi_strings_test.sh names the
template's functions by filling `{{project}}` with test_project, so it only
works while main.zig still carries the token. In a minted repository the
functions are resource_algebra_*, and the appended tests named nothing.
The test now reads the export prefix from `export fn <prefix>_init()` after
filling the tokens and maps it to test_project, failing loudly when no
prefix is found. Checked on this tree and on the template's tokenised
main.zig: all six functions the tests call resolve.

src/interface/ffi/src/main.zig takes the template's 8034fc9 version (the
ownership docs and the string tests the lane exercises), with the mint's
values filled in as before.

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

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
B Security Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c7a003d9c0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread build/just/container.just
Comment on lines +97 to +103
for (const [ctx, relWf] of mapped.entries()) {
const fullWf = join(root, relWf);
if (!existsSync(fullWf)) {
fail(`required context '${ctx}' maps to missing workflow '${relWf}'`);
continue;
}
const doc = Bun.YAML.parse(readFileSync(fullWf, "utf8"));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Verify that the mapped workflow emits the named context

For each mapping, this gate only parses the workflow trigger; it never checks that a job whose check-run name is ctx actually exists and can run. If scan / gitleaks is renamed or its job is removed while secret-scanner.yml remains PR-triggered, this script still exits successfully even though the required context can never be produced, leaving affected PRs stranded behind branch protection. Inspect the workflow's jobs and match the effective job/check name as part of this loop.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed. Fixed in #16: each mapped context now also needs a job whose check-run name (name:, or the job id) equals it. A renamed-job mutant and a no-jobs mutant now fail squabble_gate_test.sh.


Generated by Claude Code

Comment on lines +144 to +150
for p in &out {
if p.is_dir() {
return Err(format!(
"{} is a directory; pass files (e.g. `git ls-files | {} -`)",
p.display(),
"strip-instruction-blocks"
));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Update repo-init to pass files to the stripping tool

The rewritten tool now explicitly rejects directory arguments, but build/just/repo-init.just still invokes strip-instruction-blocks . under set -e. Consequently every non-template just repo-init reaches this check with . as a directory, receives exit 2, and aborts before completing the mint; the new file-list mode needs to be wired into that caller.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed. Fixed in #16, which replaces build/just/repo-init.just with the template's at 8034fc9, verbatim. That copy pipes the mint's file list to strip-instruction-blocks -.


Generated by Claude Code

Comment on lines +20 to +23
# Read by build/just/repo-init.just (mint_files) and by
# scripts/check-no-placeholders.sh. One repository-relative path per line; `#`
# starts a comment. A listed path that does not exist stops the mint: a stale
# entry is a hole, not a no-op.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Make repo-init honor the verbatim manifest

Despite this declaration, repo-wide search shows that only scripts/check-no-placeholders.sh reads this manifest; build/just/repo-init.just still runs its placeholder and self-name rewrites over every text file and retains its old hard-coded exemptions. On a mint, listed fixtures such as julia_library_test.sh and self_name_pass_test.sh are therefore rewritten even though the new checker subsequently exempts them, reproducing the broken-child behavior this manifest is intended to prevent. Load one validated file list in repo-init and exclude it from every rewrite and completeness pass.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed. The port kept the older generator. #16 brings the template's 8034fc9 repo-init.just, which loads .machine_readable/mint-verbatim.txt as VERBATIM_LIST and excludes it from the rewrite and completeness passes.


Generated by Claude Code

Comment thread scripts/gen-repo-map.sh
Comment on lines +36 to 38
MODE=index
if [ "${1:-}" = "--worktree" ]; then MODE=worktree; shift; fi
REPO_ROOT="${1:-.}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use worktree mode when generating a freshly minted map

The new mode is specifically required before a child's first commit, but build/just/repo-init.just still calls gen-repo-map.sh ., which leaves MODE=index. At that point the index still contains paths repo-init removed and omits newly created paths, so the generated repository map is stale immediately and the child's Estate Rules freshness check fails after the first commit. Pass --worktree from the mint-time caller.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed. Fixed by the same generator update in #16: the mint now calls gen-repo-map.sh --worktree ..


Generated by Claude Code

Comment thread .github/workflows/main-estate-audit.yml
Comment on lines +70 to +72
CONFIG=".gitleaks-estate.toml"
if [ -f .gitleaks.toml ]; then
CONFIG=".gitleaks.toml"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep the estate rules when loading repository secret rules

On pull-request runs, the checkout contains contributor-controlled content, so adding .gitleaks.toml makes these lines discard the staged estate baseline and pass only that local file to --config. In Gitleaks 8.18.4, --config has highest precedence and the default rules are used only when no config is supplied; inheritance must be explicitly configured with [extend] (Gitleaks 8.18.4 documentation). A minimal local rule set can therefore make scan / gitleaks pass while generic credentials are missed; keep the trusted baseline mandatory and merge validated repository additions into it instead of replacing it.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed. Fixed in #16: the estate baseline now runs in all three passes, and a repository .gitleaks.toml adds a second pass but can never replace the baseline.

Tested with pinned gitleaks 8.18.4: a planted key plus a local config that allowlists every path exits 1 with the new step and 0 with the old selection. The template carries the same code, so I'm leaving this thread open for the owner.


Generated by Claude Code

@coderabbitai

coderabbitai Bot commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

Add Carrot credits or activate Agent usage billing to use Autofix

@hyperpolymath
hyperpolymath merged commit b11b3bc into main Oct 27, 2026
47 of 48 checks passed
@hyperpolymath
hyperpolymath deleted the claude/zealous-wozniak-2nherb branch October 27, 2026 01:42
hyperpolymath pushed a commit that referenced this pull request Oct 27, 2026
main's b11b3bc has the same tree as #15's head 2d5f150, so conflicts
resolve to this branch. The CHANGELOG keeps #15's entry as merged and
records the review fixes in their own entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LiQzWJdcPfRU6YMDGRG8Xi
hyperpolymath added a commit that referenced this pull request Oct 27, 2026
## Summary

Follow-up to #15,
which merged while its Codex review was still being answered. This PR
fixes the five findings that were real defects. The other two are
answered below.

## Changes

- **`build/just/repo-init.just`.** Codex threads: the
`strip-instruction-blocks` P1, the mint-verbatim P1 and the
`gen-repo-map` P2.
- #15 ported the template's mint scripts but kept the older generator,
the template's `0afa6c9` copy.
- That generator called `strip-instruction-blocks .`, which the new tool
rejects with exit 2. It also ignored `mint-verbatim.txt` and mapped the
index instead of the worktree.
- The generator is now the template's at `8034fc9`, verbatim, which is
how `mint-verbatim.txt` says a child carries it. It feeds the tool a
file list, honours the manifest and passes `gen-repo-map.sh --worktree`.
- **`secret-scanner.yml`.** Codex thread: P1, security.
- Before, a repository `.gitleaks.toml` replaced the estate baseline in
all three passes, so a pull request could add a permissive local config
and pass.
  - Now the baseline always runs, and a local config adds a second pass.
- **`scripts/check-required-contexts.sh`.** Codex thread: P2.
- A mapped context now also needs a job whose check-run name (`name:`,
or the job id) is exactly that context.
- `squabble_gate_test.sh` names its fixture jobs after the context, so
each mutant still fails only for its own defect. Two mutants are new: a
renamed job and a workflow with no jobs.
- **`main-estate-audit.yml`.** Codex thread: P2.
- At the pinned `bf7dd95`, cicd-suite's `spdx-license-check` enforces
only a root licence file. When the repository has no SPDX line at all,
it emits a `::warning::`; its exit is commented out "until adoption".
- The inlined step already enforced the same thing. It now carries the
warning too, so it mirrors that gate exactly. Per-file SPDX enforcement
does not exist upstream, and adding it is a licence-policy decision for
the owner, so it is not added here.
- **CHANGELOG.** A new entry. #15's entry stays as merged.

**Not changed: `container.just` deploy rendering (Codex P2).**
- `container-init` is a one-shot: it fills tokens, then renames
`deploy.k9.ncl.in`.
- In this repository it has already run, and every container file is
rendered. Re-running it changes no file, `deploy.k9.ncl` included, which
takes the recipe's "already exists, not overwritten" branch.
- So shipping the `.in` here would only reintroduce a token file into a
minted child.

## RSR Quality Checklist

### Required

- [ ] Tests pass (`just test` or equivalent). Not run in full: `just
test` and `just quality` stop locally at the idris2 and zig steps,
because neither toolchain is installed here. CI provisions both. Every
suite this PR touches passes; see Testing.
- [x] Code is formatted (`just fmt` or equivalent)
- [x] Linter is clean (no new warnings or errors)
- [x] No banned language patterns (no Python, Go, TypeScript, Deno or
ReScript; JavaScript runs on Bun)
- [x] No `unsafe` blocks without `// SAFETY:` comments
- [x] No banned functions (`believe_me`, `unsafeCoerce`, `Obj.magic`,
`Admitted`, `sorry`)
- [x] SPDX license headers present on all new/modified source files
- [x] No secrets, credentials, or `.env` files included

### As Applicable

- [x] `CHANGELOG` or release notes updated

## Testing

- **Gitleaks 8.18.4,** sha256-verified as the workflow pins it, run
through the workflow's own working-tree step:
- Planted AWS-shaped key plus a local `.gitleaks.toml` that allowlists
every path: the new step exits 1. The old selection, which used only the
local config, exits 0.
  - Clean tree, with and without the local config: the new step exits 0.
- **Required contexts:** a renamed-job fixture fails the new gate (exit
1) and passed the old one (exit 0).
- `squabble_gate_test.sh` reports 81 passed and 0 failed.
- `mint_cleanup_test.sh`, `archetype_lock_merge_test.sh`,
`repo_map_determinism_test.sh`, `run_proven_suite_test.sh`,
`validate_workflows_test.sh` and `actions_lock_sha_refs_test.sh` pass,
the last with yq 4.53.3.
- `check-no-placeholders.sh` passes, `just --list` parses with the new
generator, and `gen-repo-map.sh --worktree` leaves the map unchanged.

---
_Generated by [Claude
Code](https://claude.ai/code/session_01LiQzWJdcPfRU6YMDGRG8Xi)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
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.

2 participants