Repository navigation
fix(k9-hook): exempt the 9-archive district from validation and the debt ledger - #1218
Conversation
…ebt ledger The archive district is frozen history: the LAST COPY of dead upstream trees, kept because the standards-map note says "ARCHIVE, do not delete". Running the K9 gate over it is a choice between two bad outcomes: fail the archive for upstream nonconformance this estate cannot fix, or grow the shrink-only debt ledger with entries no one can ever discharge. Neither is what the ledger is for. So 9-archive/* is treated exactly like the validator fixtures: not validated, not ledgered. A grandfathered file moved here stops accruing debt rather than carrying it into the archive, which is the point of archiving it. Behaviour is unchanged today (no 9-archive/ exists yet); this is the prerequisite for the district move that follows. Refs: standards#1058, docs/CONTRACTILE-SPEC.adoc
K9 contract conformancerun https://github.com/hyperpolymath/standards/actions/runs/37981657890 K9 normative contract typecheckK9 contract self-testK9 conformance fixturesK9 corpus conformance (L2) |
… (1 of 5, git renames, no content change) Move the rhodium-standard-repositories tree into the new 9-archive/ district as pure git renames: no content change, no reformatting, no SPDX edits. This is one of several commits that together perform the move; it is split only because the GitHub API will not carry 8.5 MB of file contents in a single mutation. The commits are mechanical slices of one operation and are meant to be read as a unit. Why the tree moves at all: it is the LAST COPY of a dead upstream. hyperpolymath/rhodium-standard-repositories 404s, and 8 of its 10 satellites have no external home. Earlier revisions of standards-map.toml called it a vendored copy to extract and DELETE; that was wrong, and the map now records it as "ARCHIVE, do not delete". actions-allowlist/ deliberately stays behind at the old path: allowed-actions.json is fetched by raw URL from allowlist-preflight-reusable.yml and governance-reusable.yml, so relocating it is a breaking change to consumers outside this repo. It keeps its own residual map entry and needs a separate deprecation/redirect plan. The map, the baseline and every live pointer are updated in the final commit of this series. Intermediate commits transiently fail GATE D by construction, because the map still points at the pre-move paths; the head commit is green. Refs: standards#1058.
… (2 of 5, git renames, no content change) Move the rhodium-standard-repositories tree into the new 9-archive/ district as pure git renames: no content change, no reformatting, no SPDX edits. This is one of several commits that together perform the move; it is split only because the GitHub API will not carry 8.5 MB of file contents in a single mutation. The commits are mechanical slices of one operation and are meant to be read as a unit. Why the tree moves at all: it is the LAST COPY of a dead upstream. hyperpolymath/rhodium-standard-repositories 404s, and 8 of its 10 satellites have no external home. Earlier revisions of standards-map.toml called it a vendored copy to extract and DELETE; that was wrong, and the map now records it as "ARCHIVE, do not delete". actions-allowlist/ deliberately stays behind at the old path: allowed-actions.json is fetched by raw URL from allowlist-preflight-reusable.yml and governance-reusable.yml, so relocating it is a breaking change to consumers outside this repo. It keeps its own residual map entry and needs a separate deprecation/redirect plan. The map, the baseline and every live pointer are updated in the final commit of this series. Intermediate commits transiently fail GATE D by construction, because the map still points at the pre-move paths; the head commit is green. Refs: standards#1058.
… (3 of 5, git renames, no content change) Move the rhodium-standard-repositories tree into the new 9-archive/ district as pure git renames: no content change, no reformatting, no SPDX edits. This is one of several commits that together perform the move; it is split only because the GitHub API will not carry 8.5 MB of file contents in a single mutation. The commits are mechanical slices of one operation and are meant to be read as a unit. Why the tree moves at all: it is the LAST COPY of a dead upstream. hyperpolymath/rhodium-standard-repositories 404s, and 8 of its 10 satellites have no external home. Earlier revisions of standards-map.toml called it a vendored copy to extract and DELETE; that was wrong, and the map now records it as "ARCHIVE, do not delete". actions-allowlist/ deliberately stays behind at the old path: allowed-actions.json is fetched by raw URL from allowlist-preflight-reusable.yml and governance-reusable.yml, so relocating it is a breaking change to consumers outside this repo. It keeps its own residual map entry and needs a separate deprecation/redirect plan. The map, the baseline and every live pointer are updated in the final commit of this series. Intermediate commits transiently fail GATE D by construction, because the map still points at the pre-move paths; the head commit is green. Refs: standards#1058.
… (4 of 5, git renames, no content change) Move the rhodium-standard-repositories tree into the new 9-archive/ district as pure git renames: no content change, no reformatting, no SPDX edits. This is one of several commits that together perform the move; it is split only because the GitHub API will not carry 8.5 MB of file contents in a single mutation. The commits are mechanical slices of one operation and are meant to be read as a unit. Why the tree moves at all: it is the LAST COPY of a dead upstream. hyperpolymath/rhodium-standard-repositories 404s, and 8 of its 10 satellites have no external home. Earlier revisions of standards-map.toml called it a vendored copy to extract and DELETE; that was wrong, and the map now records it as "ARCHIVE, do not delete". actions-allowlist/ deliberately stays behind at the old path: allowed-actions.json is fetched by raw URL from allowlist-preflight-reusable.yml and governance-reusable.yml, so relocating it is a breaking change to consumers outside this repo. It keeps its own residual map entry and needs a separate deprecation/redirect plan. The map, the baseline and every live pointer are updated in the final commit of this series. Intermediate commits transiently fail GATE D by construction, because the map still points at the pre-move paths; the head commit is green. Refs: standards#1058.
K9 contract conformancerun https://github.com/hyperpolymath/standards/actions/runs/37983691694 K9 normative contract typecheckK9 contract self-test |
… (5 of 5, git renames, no content change) Move the rhodium-standard-repositories tree into the new 9-archive/ district as pure git renames: no content change, no reformatting, no SPDX edits. This is one of several commits that together perform the move; it is split only because the GitHub API will not carry 8.5 MB of file contents in a single mutation. The commits are mechanical slices of one operation and are meant to be read as a unit. Why the tree moves at all: it is the LAST COPY of a dead upstream. hyperpolymath/rhodium-standard-repositories 404s, and 8 of its 10 satellites have no external home. Earlier revisions of standards-map.toml called it a vendored copy to extract and DELETE; that was wrong, and the map now records it as "ARCHIVE, do not delete". actions-allowlist/ deliberately stays behind at the old path: allowed-actions.json is fetched by raw URL from allowlist-preflight-reusable.yml and governance-reusable.yml, so relocating it is a breaking change to consumers outside this repo. It keeps its own residual map entry and needs a separate deprecation/redirect plan. The map, the baseline and every live pointer are updated in the final commit of this series. Intermediate commits transiently fail GATE D by construction, because the map still points at the pre-move paths; the head commit is green. Refs: standards#1058.
K9 contract conformancerun https://github.com/hyperpolymath/standards/actions/runs/37983734103 K9 normative contract typecheckK9 contract self-testK9 conformance fixturesK9 corpus conformance (L2) |
…ive district
Follow the moved paths everywhere something live depends on them, and record
the district in standards-map.toml. This is the commit that makes the tree
consistent; the five rename commits before it are inert without it.
standards-map.toml (GATE D now passes, entry_count 124 -> 126):
- new entry 9-archive/ district root, frozen,
canonical=false. Required by GATE D assertion 2: a new top-level path must
be mapped. Frozen because editing archived content to satisfy a gate would
falsify the record.
- new entry 9-archive/rhodium-standard-repositories archive-vendored, 1135
files, deprecated. Same "ARCHIVE, do not delete" note, with the stale
sentence "NOT moved wholesale" corrected now that the move has happened.
- new entry rhodium-standard-repositories residual, 2 files,
published-interface. Records why actions-allowlist/ stayed and that it
needs its own deprecation/redirect plan.
- moved REORGANIZATION-PLAN.adoc -> 9-archive/REORGANIZATION-PLAN.adoc
(its target already said 9-archive; only `from` was stale).
Live pointers followed:
.hypatia-baseline.json 31 file keys rewritten, 189 entries
retained, valid JSON, none lost. The
two `note` fields mentioning the tree
are prose and were left alone.
.machine_readable/inline-python-allow.txt 6 entries repathed; every entry
verified to resolve to a real file.
.machine_readable/k9-contract-debt.txt dropped rsr-compliance-checklist
.k9.ncl: the hook now skips the
district, so a ledger entry it can
never discharge would be permanent.
.machine_readable/Debtfile.a2ml probe repathed. This one mattered:
the old `git ls-files
'rhodium-standard-repositories'`
silently returned 0 and the debt item
would have counted zero. Measured
after the fix: 40 unpinned `uses:`
refs across 91 workflow files.
scripts/link-rot-guard.sh prune target is now the district root
$ROOT/9-archive, not the tree inside
it, so later archives are covered with
no further edit.
scripts/rsr-selfaudit.sh, scripts/tests/governance-reusable-contract-test.sh,
scripts/tests/wave0-false-green-test.sh (lines 14 and 48)
paths repathed; all three pass.
coordination.k9 protected section: the old entry's
reason now explains it is a residual
published interface; a 9-archive/
entry records it as frozen archive.
.machine_readable/rsr-profile.a2ml comment corrected: finding F4 said
"VENDORED, to be deleted"; upstream
404s, so it is ARCHIVED, do not delete.
doc pointers repathed where the target actually exists: PALIMPSEST.adoc,
3-practice/LICENCE-POLICY.adoc, 3-practice/SECURITY-ADVISORIES.adoc,
1-formats/k9/spec/MIGRATION-1058.adoc, 1-formats/k9/tools/k9-validate.sh,
foundations-readiness-grades/FOUNDATIONS-READINESS-GRADES.a2ml.
Deliberately NOT changed (justified in the PR body):
canon.lock (pinned), frozen audits/affirmations/scorecards, external
github.com and raw.githubusercontent.com URLs, actions-allowlist and the
scripts that consume it, and .githooks/validate-sha-pins.sh whose vendored
substring match still matches the new paths. TOPOLOGY.adoc is a self-declared
frozen snapshot of commit 6d19ce0 and was left alone despite AGENTS.adoc
conflicting with the task brief on this point.
Refs: standards#1058.
|
Add Carrot credits or activate Agent usage billing to use Autofix |
|
Open the task to resolve the delivery issue or retry. |
K9 contract conformancerun https://github.com/hyperpolymath/standards/actions/runs/37983810083 K9 normative contract typecheckK9 contract self-testK9 conformance fixturesK9 corpus conformance (L2) |
|
|
@coderabbitai full review Requesting an explicit full review: the incremental review could not be The part worth reviewing is the 17 reference updates and standards-map.toml |
|



Summary
One-line change to
.githooks/validate-k9.sh:is_fixture()gains a9-archive/*) return 0 ;;case, so the archive district is neither validatednor held to the K9 debt ledger.
This is PR A of two, and it is the prerequisite for the district move in
PR B. It is deliberately minimal: one file, +9/−0, no other change.
Note on stacking: this session is fixed to a single branch, so both PRs open
from
arena/2ae9b9a8-standards. PR B will be opened againstmainafter itscommit lands and will show A+B until A merges, at which point its diff reduces
to B alone.
What changed, and what stayed
Changed:
.githooks/validate-k9.sh— onecasearm plus an eight-linecomment.
Stayed, and why:
1-formats/k9/tools/fixtures/*— untouched. The archive is exempted for thesame reason as the fixtures and sits beside it, it does not replace it.
conforming-while-listed → stale). Unchanged; the archive simply never enters
the list.
1-formats/k9/tools/k9-validate.sh. The hook owns no rules and still ownsnone — this is policy about which files block a commit, which is exactly
what the hook's header says it is for.
Why the district is exempt
9-archive/is frozen history: the LAST COPY of dead upstream trees, keptbecause the standards-map note says "ARCHIVE, do not delete". Its contents are
a historical record, not code this estate maintains.
Validating it is a choice between two bad outcomes: fail the archive for
upstream nonconformance this estate cannot fix, or grow the shrink-only debt
ledger with entries no one can ever discharge. Neither is what the ledger is
for — it exists so that debt shrinks, and an entry that cannot shrink is a
permanent licence by another name.
A grandfathered file moved here stops accruing debt rather than carrying it
into the archive. That is the point of archiving it.
Verification — diffed against a captured baseline, not eyeballed
A 95-row baseline was captured on pristine
mainbefore any edit(Step 0): 4 gates, 10
validate-*.shhooks in whole-repo mode, K9 atK9_VALIDATE_LAYER=all, and the per-file exit code of all 80 test filesdiscovered by
scripts/run-shell-test-suite.sh.scripts/check-standards-map.shscripts/check-canonical-names.sh origin/mainscripts/check-inline-python.shscripts/link-rot-guard.shBROKEN, see below).githooks/validate-k9.sh(L1)K9_VALIDATE_LAYER=all(L2)validate-bot-directives / codeql / gitleaks / lint-format / permissionsvalidate-actions-lock / sha-pins / spdx-workflows / spdxdiffof the tworc.tsvcaptures: empty. All 95 rows match.Behaviour proof.
9-archive/does not exist yet, so the new arm is latent— an untested latent change is how gates rot, so it was tested with planted
files staged via
git add -N(the hook collects fromgit ls-files, so anuntracked file would have made the test vacuous):
.k9at9-archive/planted.k9rc=0, zero mentionsplanted-control/planted.k9rc=1,K9-E004 K9-E005The control failing is what makes the first row mean something: the hook does
catch this file, so the skip is a real behaviour change and not a no-op.
bash -nclean.Anomalies, and what I could not check
link-rot-guard.shfails onmainalready with 441BROKENlines,overwhelmingly
docs/proofs/spec-templates/**→../archetypes/*.md(nonexistent). Pre-existing, untouched here; PR B changes this script's
prune path, so the count is the number to hold constant, not to fix.
yq(mikefarah v4),nickel,gitleaksand Ruby are unobtainable here — their only distribution isGitHub release assets, and
release-assets.githubusercontent.comis notreachable. 24 of the 95 rows are therefore tool-blind: 13 test files fail
on missing
yq, 3 on missing Ruby, 1 ongitleaks, 1 on the JCS tool.The differential proves this PR changed nothing; it does not prove the
gates are green. CI on the real runner is the authority.
shellcheckhere; the hook passedbash -nonly.nickelabsent, L2 cannot be doing semantic work inmy sandbox, so the L2
rc=0is weaker than CI's.New pins: none.
Out of scope — filed separately, not bundled
validate-k9.shtouched-file check:printf … | grep -qxFunderpipefailgives SIGPIPE false negatives on large change lists (~12–14% measured).
Needs a here-string plus a regression test.
actions-allowlist/deprecation and redirect plan.standards-map.tomlstaleness after the A2ML retirement;03-STANDARDS-REORG.mdreferenced but absent.
coordination.k9does not parse under its own ABNF.