fix(ci): resolve the four standing CI/CD failures at their roots - #29
Merged
Conversation
Each of these had been red on main on every push. Fixed at source rather
than suppressed.
1. 🟡 Estate rules — "Root shape allowlist" rejected flake.nix
flake.nix is debris from the 07-21 sweep and contradicts the 2026-05-18
ruling that the estate is Guix-primary with the Nix fallback retired. The
file even documents itself as "the Nix fallback tier". Removed; guix.scm
remains under build/, so the Guix-only policy gate is unaffected.
scripts/check-root-shape.sh now reports PASS (45 entries, 46 permitted).
2. 🟡 OpenSSF best-practices — unfilled {{PLACEHOLDER}} tokens
.github/SECURITY.md still carried its "delete this block before
publishing" template header and advertised a PGP key that does not exist
({{PGP_KEY_URL}}, {{PGP_FINGERPRINT}}). Removed the instruction block and
the PGP table/import snippet; reporting by email is stated plainly rather
than pointing at a key nobody can fetch.
STATE.a2ml and ECOSYSTEM.a2ml were verbatim copies of rsr-template-repo's
own manifests: they declared `project = "rsr-template-repo"`, the
template's purpose, and phase/maturity of maintenance/production. They now
describe Haec (design/experimental, 0.1.0) and its actual pipeline
position. This is the template self-name leak, which also misdirects
tooling that keys off these files.
3. 🟡 RSR self-use (dogfooding) — two actions that do not exist
hyperpolymath/a2ml-validate-action and hyperpolymath/k9-validate-action
both 404, so those steps failed at "Set up job" on every push and could
never have validated anything. An unresolvable action also breaks
Dependabot's github_actions updater, which is why that job failed too.
Replaced with inline checks of the envelope contract that genuinely
exists: non-empty, valid UTF-8, an SPDX header, and for K9 the magic
first line ('K9!' for .k9, '# K9!' for .k9.ncl so `nickel typecheck`
still parses). Scope is stated in the workflow: these do NOT parse the
A2ML grammar or typecheck Nickel. That still needs the real validators.
4. Six .a2ml manifests had no SPDX header
Added, both for REUSE compliance and so the new check in (3) is
meaningful rather than vacuous.
Verified locally: root-shape PASS, placeholder check PASS, A2ML and K9
envelope checks PASS, and every workflow parses with at least one live job.
Not changed: CLADE.a2ml still declares canonical-name "rsr-template-repo"
with the template's registry UUID and clade prefix. Those are assigned by
gv-clade-index; inventing replacements would corrupt that registry, so it
needs a real assignment.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Every one of these was red on
mainon every push. Fixed at source, not suppressed.flake.nixnot on the root allowlist{{PLACEHOLDER}}tokens in 3 required filesuses:actions that 404github_actions1.
flake.nix— the soleestate-rulesblockerscripts/check-root-shape.shreported exactly one offender.flake.nixis debrisfrom the 07-21 sweep and contradicts the 2026-05-18 ruling that the estate is
Guix-primary with the Nix fallback retired — the file even documents itself as
"the Nix fallback tier". Removed.
build/guix.scmis untouched, so🔴 Gate: Guix-only package policyis unaffected (it only checks for the presenceof
*.scm).Now:
PASS: root matches allowlist (45 entries, 46 permitted).If you would rather keep it, the alternative is
git mv flake.nix build/— say theword and I will swap the approach.
2. Placeholder tokens
.github/SECURITY.mdstill carried its own "TEMPLATE INSTRUCTIONS (deletethis block before publishing)" header, and advertised a PGP key that does not
exist (
{{PGP_KEY_URL}},{{PGP_FINGERPRINT}}). Both removed — pointing usersat an unfetchable key is worse than saying plainly that there isn't one.
STATE.a2ml/ECOSYSTEM.a2mlwere verbatim copies ofrsr-template-repo'smanifests:
project = "rsr-template-repo", the template's purpose, andphase = maintenance/maturity = production. They now describe Haec(
0.1.0, design/experimental) and its real pipeline position(workbench → haec → trope-checker).
This is the template self-name leak — it misdirects any tooling that keys
off these files.
3. Two actions that do not exist
They failed at "Set up job" on every push, so they never validated anything —
continue-on-error: truemerely hid that they were inert. An unresolvable actionalso breaks Dependabot's
github_actionsupdater, which is why that job wasfailing as well: one root cause, two symptoms.
Replaced with inline checks of the envelope contract that genuinely exists:
SPDX-License-Identifierpresent;K9!for.k9,# K9!for.k9.nclsonickel typecheckstill parses the file.Their limits are stated in the workflow itself: they do not parse the A2ML
grammar or typecheck Nickel. That still needs the real validators. This is a
smaller claim than the 404'd actions implied, but unlike them it actually runs.
Also added SPDX headers to 6
.a2mlmanifests that had none — REUSEcompliance, and it stops the new check being vacuous.
Verified locally
Deliberately not changed
CLADE.a2mlstill declarescanonical-name = "rsr-template-repo"with thetemplate's registry UUID (
a5ea1382-…), clade prefixrm, and forge URLs pointingat the template. Those are assigned by
gv-clade-index; inventing replacementswould corrupt that registry, so Haec needs a real clade assignment. Flagging
rather than guessing.
🤖 Generated with Claude Code