Repository navigation
feat(deed): bun port of deed_lint + reusable deed-conformance gate - #1164
Merged
Merged
Conversation
deed_lint.js is a zero-dependency bun port of deed_lint.py (53 unit tests incl. the 14-case self-test corpus and all 19 fixtures). deed-conformance.yml now runs the bun linter, gains a workflow_call trigger (optional require-files input) so other repos can lint their .deed files with the linter at this workflow's own commit, and carries a python/bun parity step that fails on any byte of output difference. deed_lint.py stays: a2ml_to_deed.py imports it in-process. actions.lock: add oven-sh/setup-bun@0c5077e5 (v2.2.0, already locked for ci-pipeline.yml) to the deed-conformance workflow entry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01P48P9ErT8UFFeDUfEQiYV7
Contributor
|
Note Currently processing new changes in this PR. This may take a few minutes, please wait... ⚙️ Run configuration
⛔ Files ignored due to path filters (1)
📒 Files selected for processing (4)
✨ Finishing Touches 💡 1📝 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. Comment |
Contributor
K9 contract conformancerun https://github.com/hyperpolymath/standards/actions/runs/37474747511 K9 normative contract typecheckK9 contract self-testK9 conformance fixtures |
|
Closed
3 tasks
Contributor
|
Add Carrot credits or activate Agent usage billing to use Autopilot |
Contributor
|
❌ Failed to create Coding Agent finishing-touch task. Please try again. |
6 of 13 tasks
hyperpolymath
added a commit
that referenced
this pull request
Oct 6, 2026
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 --> ## Summary #1164 moved `deed-conformance.yml` from python to bun, which removed its inline-python steps. The workflow stayed listed in the shrink-only ledger `.machine_readable/inline-python-allow.txt`. `scripts/tests/check-inline-python-test.sh` fails on a stale entry, so `Repo self-tests` went red on main after #1164. This PR deletes that one ledger line. No issue. This is a follow-up to #1164. ## Type of change - [x] 🐛 Bug fix (non-breaking change that fixes an issue). It removes a stale ledger entry. - [ ] ✨ New feature: does not apply, no new behaviour. - [ ] 💥 Breaking change: does not apply. - [ ] 🕳️ Soundness fix: does not apply. - [ ] 📖 Documentation: does not apply. - [ ] 🧹 Refactor / tech debt: does not apply. - [ ] ⚡ Performance: does not apply. - [x] 🔧 Build / CI / tooling. It changes a CI ledger. ## 📌 New pins Head SHA: **14e738256ed5cde44cb2d2928fa8a0203dadfc2f** This PR adds or changes no pins: no `uses:` SHAs, no `actions.lock` entries, no lockfiles, no container digests. ## How has this been verified? - `bash scripts/tests/check-inline-python-test.sh` on this branch → **24 passed, 0 failed**. On main, the stale entry made this test fail. - `Repo self-tests` will **still be red** after this PR. Three tests were already failing on main before #1164: build-registry, build-scorecards and kyaml-format. Their failure counts are identical on a clean main worktree. This PR does not touch them, and they are tracked separately. ## Checklist - [x] My commits are **signed**: `git log --format=%G?` shows `G` on 14e7382. - [x] I ran the project's own checks locally. The inline-python ledger test passes; the three pre-existing failures are described above. - [ ] New files carry SPDX: does not apply. No new files; one line is deleted from an existing ledger. - [x] Docs are updated and no claim overstates. No documentation describes this ledger entry. - [x] No soundness hole: the ledger only shrinks, and the test still rejects any growth. ## Notes for reviewers This is a one-line deletion. The ledger format is `path:count`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01P48P9ErT8UFFeDUfEQiYV7 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
hyperpolymath
added a commit
that referenced
this pull request
Oct 7, 2026
main already carries the bun port (44a0de4, #1164); keep this branch's lexValue split of deed_lint.js. 53/53 tests pass; output identical to main's linter on 41 deed files and fixtures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014BxjiTAaTZCHVWn2U5NWhL
4 of 13 tasks
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.



Summary
Ports the DEED validator
1-formats/deed/tools/deed_lint.pyto bun (deed_lint.js, zero dependencies) and makesdeed-conformance.ymla reusable gate (workflow_call). Other estate repos can then lint their.deedfiles without Python, which the estate bans. This is the shim echidna needs before its.a2ml→.deedrename (standards#837 lane).deed_lint.jsfollows the grammarspec/abnf/deed.abnfv1.0.0 and prints exactly what the Python prints (OK <file>/FAIL <file>: line N: <msg>, rc=1 on any failure).deed-conformance.ymlchanges:bun test, the fixture corpus, a python/bun parity step, and a lint of every committed deed.job.workflow_sha(sparse,persist-credentials: false), so a caller pinned to a standards SHA gets exactly that linter.require-filesmakes a zero-deed caller fail instead of pass.deed_lint.pystays, becausea2ml_to_deed.pyimports it in-process. The parity step fails on any byte of difference between the two outputs over every committed.deed, invalid fixtures included, so the two cannot drift while both exist.No issue to close (campaign: standards#837).
Type of change
1-formats/deed/tools/README.adoc)📌 New pins
1c99565112d054520374bfac2bf53ff44e4a8e9coven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6(v2.2.0). Already inactions.lockforci-pipeline.yml; this PR only adds it to thedeed-conformance.ymlworkflow entry.actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1(v7.0.1). Unchanged; now used twice in the workflow.How has this been verified?
bun test 1-formats/deed/tools/→ 53 pass / 0 fail, 84 expect() calls.bun deed_lint.js --self-test→SELF-TEST OK.--fixtures fixtures→FIXTURES OK(9 valid pass, 10 invalid fail).find) → allOK, rc=0.true/falserule 4, and removing the schema-version-once rule 3..githooks/validate-actions-lock.sh→ ✅ 26/26.scripts/check-lock-sync.sh→ rc=0.gh actions-lock --no-narrow --no-migrate-local-actions --no-interactive). Its only deed-related difference was the one setup-bun line, applied by hand.gh actions-lock --no-fix --verify→ 1 error, insigned-push-smoke.yml(a local-path action). It is present on main and unrelated to this PR; 0 errors are indeed-conformance.yml.lintjob on 1c0ff6d) the parity step passed: byte-identical, 20 lines each over every committed deed.lexValueas a Complex Method. 1c99565 splits it intolexHashForm/lexList/lexQuoted/lexIntegerToken. Tests, self-test and fixtures are unchanged, and output over all 20 committed deeds is byte-identical before and after.Checklist
git commit -S)..jsfiles as not checked (no pinned bun lint gate exists), which is a skip, not a pass.MPL-2.0on both.jsfiles); no existing file was relicensed.Pre-existing reds (deferred, AGENTS.md §5c item 3)
Each of these is red on
maincfc3a92 as well and is not touched by this PR:governance / Debt ratchet→ Debt ratchet red on every PR since #820 — run-debtfile.sh --write emits a file check-debtfile-structure.sh rejects #955Registry + topology in sync,Call CI Pipeline / Haskell,Call CI Pipeline / Pipeline report→ Two unowned reds on #1160: self-ci Haskell job builds at root with no cabal.project; registry drift on main #1161K9-SVC contractile validation→ K9-SVC red on main: valid fixture extension-fields.k9.ncl breaks the K9.Component contract #1165governance / Allowlist Preflight→ Cross-cutting governance reds surfaced by the actions.lock cure — 9 classes across 17 PRs (incl. a live gate for the retired A2ML) #994governance / Validate Hypatia Baseline→ 21 baseline acks lapse on 2026-10-22 and 17 point at closed issues #975scan / Hypatia Neurosymbolic Analysis→ governance: the Hypatia scanner pin predates the consumer fixes it scans for — compiled-in suppression cannot cure a caller's gate failure #1014Notes for reviewers
Rulings taken in the port, where the JS deliberately differs from the Python:
)with no trailing newline. The Python crashes there (L246-250) instead of reporting.str.isdigitalso accepts Unicode digits; the ABNF saysDIGIT= %x30-39).--fixtureswith no DIR exits 2 (usage error)._SELF_TESTand its unreachable encode check were not ported.None of these changes the output for any committed file; the parity step proves that in CI.
🤖 Generated with Claude Code
https://claude.ai/code/session_01P48P9ErT8UFFeDUfEQiYV7