feat(deed): conformance lane — grammar-faithful validator + spec-driven translator (campaign #837) - #849
Conversation
…en translator (campaign #837) tools/deed_lint.py: stdlib-only validator for deed.anbf v1.0.0 — header, single form with full-consumption, head whitelist, :schema-version exactly once, #t/#f only, #u5 name bodies, four-escape strings, SP/line-end/comment separators only (tabs invalid), estate-first filename dispatch with stem side conditions. Embedded 14-case corpus + fixtures/valid+invalid dirs, --self-test and --fixtures modes. tools/a2ml_to_deed.py: implements the mappings in 1-formats/deed/ mappings/ and ONLY those (P-2a table-closed fail on untabled fields). P-1 uuid re-derive-and-compare, refuse-to-emit without --beholding-chora, booleans → #t/#f, enums → symbols against closed sets, SPDX passthrough, and a lint post-condition: an invalid deed cannot be written. Modes: full/clade/agentic/neurosym/playbook translation, state-scan (family-3 ruling paperwork classifier), scorecard-scan (family-5 census + leak TSV). Reference: full six-instance translation of rsr-template-repo passes the lane end-to-end (uuid oracle: uuid5(URL, github.com/hyperpolymath/ rsr-template-repo) == a5ea1382-…, verified). Live estate recon extended the tables exactly as designed via PRs #846/#847/#848. CI: deed-conformance.yml gates self-test → fixtures → every committed *.deed on pushes/PRs touching the grammar, tools, or deeds. Refs #837
|
Warning Review limit reachedNext included review available in 19 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Advanced Run ID: 📒 Files selected for processing (19)
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. Comment |
|
| @@ -0,0 +1,551 @@ | |||
| #!/usr/bin/env python3 | |||
| @@ -0,0 +1,437 @@ | |||
| #!/usr/bin/env python3 | |||
…l.sh + catalog truth (R-H3) (#854) **Completes your own R-H3 ruling: the A2ML retirement, minus the corpse.** Your hook comments (2026-09-15, R-H3) already removed the A2ML manifests gate from `pre-commit`/`pre-push` and documented exactly why: A2ML no longer exists as a format; `validate-a2ml.sh` greps manifest syntax the live s-expression `.deed` grammar doesn't have; it passed **0 of 222** tracked files, blocking every commit through the hook; repairing the regex would turn all 222 red at once. R-H2 says a grammar-faithful validator returns once wired — and the live implementations exist (dual-accept `deed-ecosystem/validate-action`, pushed today; the #849 conformance-lane validator). What was left behind: - **`.githooks/validate-a2ml.sh` — deleted.** Unwired dead code since R-H3 (verified: no reference in `install.sh`, `uninstall.sh`, `hooks/`, `setup.sh`, `Justfile`). - **`CICD-WORKFLOW-CATALOG.md` lines 179–180** still advertised "A2ML/K9 validation" / "full validation: A2ML, K9, …" — corrected to the post-R-H3 reality with the ruling referenced. Deliberately untouched: prose mentions in `.machine_readable/scorecards/*.a2ml` and `1-formats/deed/README.adoc` ("Fact 1 — the only runnable gate cannot read a deed") — those are historical record of *why* R-H3 happened, not live plumbing. The 223 `.a2ml` data files remain under the #64 extension-migration campaign (validator scans both extensions until it completes). Companion PR in rsr-template-repo replaces its pinned pre-commit provider (`hyperpolymath/a2ml-pre-commit` — now deleted upstream, so the config is broken plumbing) with a local dual-accept hook. Co-authored-by: hyperpolymath <hyperpolymath@users.noreply.github.com>




The campaign's tooling half arrives alongside the merged spec half (#840–#848). One property defines the lane: nothing invalid ever lands — emission is gated by validation, and CI gates the repo.
deed_lint.py— the validatorStdlib-only, written against
spec/abnf/deed.anbfv1.0.0 (current until the canonical-file ruling):estate-deed|repo-deed|estate-atlas-deed|praxis-deed;:schema-versionSTRING exactly onceestate_chora.deedcan never parse as repo-deed; dots in stems preserved — final-suffix split only)#t/#f; baretrue/false/yes/norejected as values (they lex as symbols — the grammar's note is enforced here as a value-level semantic)#u5"name"literals (body is the RFC 4122 §4.3 NAME input)\" \\ \n \t);\r/\uXXXXparse errors; raw control bytes rejected--self-test) mirrored tofixtures/valid|invalid+ one REAL translated deed (rsr-template-repo_chora.deed)It has already caught two real things: my own mapping spec's
:present true/#u5"<hex>"errors (fixed in #841 before merge) and a validator-side guard bug (empty clauses rejected against grammar).a2ml_to_deed.py— the translatorImplements the specs in
1-formats/deed/mappings/— and ONLY those. It cannot invent mappings:uuid5(URL, "github.com/hyperpolymath/rsr-template-repo") == a5ea1382-a34c-5334-8a46-a2ebe904c810--beholding-chora(no invented identifiers)#t/#f; enums→symbols against closed sets; slot doctrine (""/()) for missing-but-tabled fields; SPDX passthrough[axis-3-audit-rules](docs(deed): family-2 table extension — axis-3-audit-rules populated, ADR array format #846),[methodology](docs(deed): family-4 extension — [methodology] tabled; D4-1 comment-canon doctrine #847),[rsr-repo-skeleton](docs(deed): family-4 completion — PLAYBOOK [rsr-repo-skeleton] tabled #848) → review → table extended → translate. Exactly the frame's prescriptionModes:
full(six instance files → one deed), per-family (clade|agentic|neurosym|playbook, meta/ecosystem merge via full),state-scan(family-3 classification report — the ruling's paperwork, no translation),scorecard-scan(family-5 census + absolute-path leak TSV).Findings delivered, not silently fixed
.machine_readable/CLADE.a2mllacksprimary-name— CLADE-006 territory; flagged, not patched (reported on DEED conversion campaign — tracking & acceptance criteria (.a2ml → .deed) #837)CI
deed-conformance.yml: self-test → fixtures → lint every committed*.deed, triggered on grammar/tools/deed changes. checkout pinned by SHA,persist-credentials: false.Refs #837; does not close it (campaign still open: conversion wave, remaining rulings).