fix(hooks): make the canonical hookset validator .deed-aware - #802
Conversation
standards could not accept ANY commit through its own pre-commit hook. Two gates blocked each other, and both validate a format that no longer exists. The registry drift guard demanded every commit stage .machine_readable/REGISTRY.a2ml -- a generated, TOML-shaped artefact, i.e. a specimen of the record dialect the owner ruled SUPERSEDED on 2026-09-08. Staging it then tripped the "A2ML manifests" gate, because validate-a2ml.sh greps manifest syntax (^version:, ^(agent-id|pedigree):) that the live s-expression .deed grammar does not have. Measured: validate-a2ml.sh passes 0 of 222 tracked .a2ml files in this repo. Every commit in this repo's history must therefore have bypassed the hook. Repairing the regex is not the cure. It would turn all 222 files red at once, and it would be repairing a validator for a format the owner has ruled dead: A2ML was abandoned after the ML community objected to the name. .deed and .k9 are the live formats. Note the dates. REGISTRY.a2ml and scripts/build-registry.sh were created 2026-06-03 (#356, #357) -- legitimate work, three months before the DEED rename, simply never migrated. But .githooks/validate-a2ml.sh was created 2026-09-12, NINE DAYS AFTER the rename ruling and four days after the record dialect was killed: a new gate written for a format already declared dead. No hook in this repo knows .deed exists (pre-commit a2ml=4 / deed=0). Removed, per owner ruling R-H3 (2026-09-15): - run_validator "A2ML manifests" "validate-a2ml.sh" "staged" - the registry drift guard block Kept deliberately: - the K9 contracts gate. K9 is live. - registry drift coverage, which CI still enforces at .github/workflows/registry-verify.yml:56 (build-registry.sh --check). - REGISTRY.a2ml itself, byte-for-byte (owner ruling R-H4). It is a GENERATED artefact, so reshaping scripts/build-registry.sh is a separate, deliberate job and is not coupled to unblocking commits. A .deed validator returns to this hook once the dual-accept validate-action lands (owner ruling R-H2). Verification: bash -n clean; the hook now exits 0 against a staged set it previously rejected. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Bgpez8mFBcAqYAj8VgEx
The deadlock had a second limb. Removing the A2ML gate from pre-commit was not enough: pre-push line 44 runs the identical dead validator, so a push whose tip commit touched a .a2ml file was still rejected. Found the hard way -- a push whose only change was regenerating .machine_readable/REGISTRY.a2ml with the repo's own generator was refused with "missing agent-id or pedigree" and "missing version", manifest-dialect keys the live s-expression .deed grammar does not have. Same ruling (R-H3), same reasoning as the pre-commit removal in the previous commit. The K9 gate stays: K9 is live. Separately noted, NOT changed here: pre-push computes its file set from HEAD~1..HEAD, so a multi-commit push validates only the TIP commit. That is a latent fake-gate and deserves its own fix. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Bgpez8mFBcAqYAj8VgEx
standards/.githooks/validate-a2ml.sh was a 1,399-byte script that knew only the dead A2ML manifest dialect: it required ^(agent-id|pedigree): and ^version: and had no concept of .deed at all. It is the file that propagate-hooks.yml copies into every repo in both estates. Replace it with the dual-accept validator already merged on deed-ecosystem/validate-action main (f9d999b6): DEED s-expression heads (estate-deed, repo-deed, estate-atlas-deed, praxis-deed) dispatched on the first form per DEED-GRAMMAR-SPEC, :canonical-name and :schema-version, with .a2ml retained as legacy so nothing currently passing starts failing. This makes the PROPAGATION SOURCE safe before the vehicle is repaired. propagate-hooks.yml is currently inert -- its last five runs all failed at "Identify repositories with .githooks" with `Invalid format ' ""'`, a multi-line value written to $GITHUB_OUTPUT with no heredoc delimiter, so the propagate job is skipped every time. Repairing that workflow before this commit would have copied the dead-dialect script over 79 repos that already carry a better one. Verified: - bash -n clean - 4/4 deed-ecosystem conformance/valid fixtures accepted, 0 false rejects - 3/5 conformance/invalid rejected; the 2 version cases are warnings by design and the suite's own test 4 asserts strict promotes them - 14/14 sampled vendored repos (725 .a2ml files) give identical exit codes under the old and new script -- no regression - planted positive: a valid .deed passes under the new script; the old one has zero .deed references and cannot see it at all Refs #798 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Bgpez8mFBcAqYAj8VgEx
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Advanced Run ID: 📒 Files selected for processing (1)
📝 SummarySummary by CodeRabbit
WalkthroughThe validator now scans ChangesValidator expansion
Estimated code review effort: 4 (Complex) | ~45 minutes Change: Bug fix Suggested reviewers: ✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
📝 Generate docstrings
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. A rabbit checks each deed and file Comment |
Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
|



Why
standards/.githooks/validate-a2ml.shis the file that.github/workflows/propagate-hooks.ymlcopies into every repo in bothestates. It was a 1,399-byte script that knew only the dead A2ML manifest
dialect — it required
^(agent-id|pedigree):and^version:, and had zeroreferences to
.deed.This replaces it with the dual-accept validator already merged on
deed-ecosystem/validate-actionmain (f9d999b6).The ordering this fixes
propagate-hooks.ymlis currently inert. Its last five runs all failed at"Identify repositories with .githooks" with:
— a multi-line value written to
$GITHUB_OUTPUTwith no heredoc delimiter. ThePropagate Hook Updatesjob is skipped every time.That makes this PR a prerequisite, not a companion, to any repair of that
workflow. It does
cp -v ./.githooks/* target-repo/.githooks/, so repairing itfirst would have copied this dead-dialect script over the 79 repos that
already carry a better (if also
.deed-blind) 13,737-byte one.Measured, one denominator
245 local repos with a resolvable origin; 150 carry a remote
dogfood-gate.yml.118 of those 150 enforce the dead dialect.
.deed-awarebash .githooks/validate-a2ml.sh(13,737 b, frozen 2026-07-27)a2ml-ecosystem/validate-action@aa4b836b(2026-07-25)…@main(a2ml 20 + deed 5)a2ml-validate-action@Verification
bash -ncleandeed-ecosystem/conformance/validfixtures accepted, 0 false rejectsconformance/invalidrejected. The 2 misses are both version cases andare warnings by design — the ecosystem's own
run-deed-tests.shtest 4asserts "strict promotes the version warning to an error"
.a2mlfiles) return identical exitcodes under the old and new script — no regression
.deedpasses under the new script; the old onehas 0
.deedreferences and cannot see it at all.deedwith no:schema-versionis reported (as awarning, per the design above)
Not changed here
strictstaysfalse. Measured: flipping it turns 8 of 10 sampled reposred, so it is a separate decision, not a free win.
Stacked on #798, which removes this validator's invocation from
pre-commitand
pre-push. Without that, a commit to this repo cannot pass its own hooks.🤖 Generated with Claude Code
https://claude.ai/code/session_0168Bgpez8mFBcAqYAj8VgEx