Skip to content

refactor: migrate all banned Python to Deno (language policy) - #59

Closed
hyperpolymath wants to merge 3 commits into
mainfrom
claude/complete-issue-standards-Wamwv
Closed

hyperpolymath wants to merge 3 commits into
mainfrom
claude/complete-issue-standards-Wamwv

Conversation

@hyperpolymath

Copy link
Copy Markdown
Collaborator

Summary

Eliminates the 4 remaining non-SaltStack Python files in the repo — the ones tripping the Check for Banned Languages (language-policy.yml) and antipattern-check (rsr-antipattern.yml) CI gates — by porting each to Deno, an allowed runtime per the estate language policy.

Was (Python) Now (Deno) Notes
a2ml/scripts/contractiles-a2ml-tool.py …-tool.js JSON emit is byte-identical to the old json.dumps(sort_keys=True, indent=2) output — verified against tests/contractiles/expected/*.json. 3 shell wrappers + a2ml docs now call deno run.
avow-protocol/.../examples/python/stamp_example.py examples/deno/stamp_example.js ctypes → Deno.dlopen FFI; zig FFI README updated.
consent-aware-http/.../python/{aibdp_middleware,example_server}.py + README/reqs …/deno/ (aibdp_middleware.js, example_server.js on Deno.serve) Manifest moved, README ported, nodejs cross-link fixed.

Verification done in-sandbox (no Deno available here, Node used as a shim):

  • a2ml port: all 4 emit outputs byte-identical to committed expected fixtures; validate returns rc 0 on valid / rc 1 on invalid fixtures.
  • node --check passes on all 4 new JS files.
  • find with both CI banned-language filters now returns no Python.

Test plan

  • Check for Banned Languages and antipattern-check now pass (no .py outside SaltStack)
  • cd a2ml && bash scripts/contractiles-a2ml-test.sh (requires deno) — emit diffs clean, invalid fixtures fail as expected
  • deno run --allow-read --allow-net consent-aware-http/examples/reference-implementations/deno/example_server.js then the three curl checks
  • deno run --allow-read --allow-ffi avow-protocol/avow-lib/examples/deno/stamp_example.js (after zig build)

Note: this is a separate change from the merged CODEOWNERS policy (#58); it reuses the same working branch.

https://claude.ai/code/session_01GTo7dz32ZgxuHXefv8BGqn


Generated by Claude Code

claude added 3 commits May 15, 2026 11:24
Codify the CODEOWNERS standard for hyperpolymath repos: solo-owned
repos carry no catch-all `*` or `/.github/workflows/` lines (silences
the Dependabot review_requested notification flood); path lines are
kept only for genuine co-owners; co-owner removal needs explicit
confirmation. Includes the standards#55 per-repo decision matrix
(idaptik retained as the sole Rule 2/3 case), canonical CODEOWNERS
templates, README wiring, and an ADR record in META.a2ml.

https://claude.ai/code/session_01GTo7dz32ZgxuHXefv8BGqn
Removes the 4 remaining non-SaltStack Python files (which were failing
the language-policy + rsr-antipattern CI banned-language gates) by
porting each to Deno, an allowed runtime:

- a2ml/scripts/contractiles-a2ml-tool.py -> .js (Deno). JSON emit output
  is byte-identical to the previous json.dumps(sort_keys, indent=2)
  form; verified against tests/contractiles/expected/*.json. The three
  shell wrappers and the a2ml docs now invoke `deno run`.
- avow-protocol stamp_example.py -> examples/deno/stamp_example.js using
  Deno FFI (Deno.dlopen) instead of ctypes; zig FFI README updated.
- consent-aware-http python/ reference impl -> deno/ (aibdp_middleware.js
  + example_server.js on Deno.serve), manifest moved, README ported,
  nodejs cross-link fixed.

No banned Python remains; new JS passes node --check.

https://claude.ai/code/session_01GTo7dz32ZgxuHXefv8BGqn
The Deno port carried over literal fake credential strings from the
former Python example; replace them with obviously-inert EXAMPLE-*
placeholders so gitleaks does not flag the example.

https://claude.ai/code/session_01GTo7dz32ZgxuHXefv8BGqn

Copy link
Copy Markdown
Collaborator Author

Closing in favour of #60, which delivers the identical net change as a single clean commit off main.

Rationale: gitleaks-action scans each commit in the PR range. An intermediate commit here re-added pre-existing fake token/signature example literals, so a follow-up placeholder commit could not clear the finding. #60 carries the inert EXAMPLE-* placeholders from its only commit, so no commit ever contains the strings. The pre-existing ReScript/Hypatia failures are unrelated estate debt and out of scope for the Python removal.


Generated by Claude Code

hyperpolymath added a commit that referenced this pull request May 15, 2026
) (#60)

## Summary

Clean-history replacement for #59 (closed). Eliminates the 4 remaining
non-SaltStack Python files — the ones tripping the `Check for Banned
Languages` / `antipattern-check` banned-language CI gates — by porting
each to **Deno**, an allowed runtime.

Delivered as a **single commit off `main`** so that no commit anywhere
in this PR's history introduces the example credential-like strings. (On
#59, an intermediate commit re-added pre-existing fake
`token`/`signature` example literals; `gitleaks-action` scans
per-commit, so a follow-up fix couldn't clear it. This branch carries
the inert `EXAMPLE-*` placeholders from the first and only commit.)

| Was (Python) | Now (Deno) | Notes |
|---|---|---|
| `a2ml/scripts/contractiles-a2ml-tool.py` | `…-tool.js` | JSON emit
**byte-identical** to old `json.dumps(sort_keys=True, indent=2)` —
verified against `tests/contractiles/expected/*.json`. Wrappers + a2ml
docs call `deno run`. |
| `avow-protocol/.../examples/python/stamp_example.py` |
`examples/deno/stamp_example.js` | `ctypes` → `Deno.dlopen`; fake
literals → inert `EXAMPLE-*`; zig FFI README updated. |
| `consent-aware-http/.../python/{aibdp_middleware,example_server}.py`
(+README/reqs) | `…/deno/` on `Deno.serve` | manifest moved, README
ported, nodejs cross-link fixed. |

Verified in-sandbox (Node shim; no Deno here): byte-identical emit,
correct validate exit codes, `node --check` clean on all 4 files, no
Python remains under either CI banned-language filter.

CODEOWNERS policy (#58) is **not** included here — it already merged to
`main`.

## Test plan

- [ ] `gitleaks` passes (no fake secrets in any commit)
- [ ] `Check for Banned Languages` / `antipattern-check` no longer fail
on Python (pre-existing ReScript `.res` debt is separate/out of scope)
- [ ] `cd a2ml && bash scripts/contractiles-a2ml-test.sh` (needs `deno`)
- [ ] `deno run --allow-read --allow-net
consent-aware-http/examples/reference-implementations/deno/example_server.js`
+ the curl checks

https://claude.ai/code/session_01GTo7dz32ZgxuHXefv8BGqn

---
_Generated by [Claude
Code](https://claude.ai/code/session_01GTo7dz32ZgxuHXefv8BGqn)_

Co-authored-by: Claude <noreply@anthropic.com>
hyperpolymath added a commit that referenced this pull request May 27, 2026
… Lean" debunked

The audit-time "72 Coq + 315 Lean markers across 6638 proof files" line
conflates pre-triage figures with Phase-1 outcomes. The right shape:
- 72 Coq Axioms — already classified via absolute-zero#58 + #59 (52
  §(c) + 17 §(a)-backlog + 3 §(b)).
- 52 Lean axioms + 7 Idris2 postulates + 124 Lean sorries (canonical
  count via check-trusted-base.sh).

"315 Lean" was debunked during Phase 1 — no source reproduces it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
hyperpolymath added a commit that referenced this pull request Sep 4, 2026
…sh + awk (#730)

## What this is

`Scan for hand-authored JavaScript/TypeScript` is a **required** context
on the
`Optimus-Branch` ruleset, and `governance-reusable.yml` runs it on
**every**
estate repo. Until now that meant installing a Deno runtime on every
runner to
execute `check-ts-allowlist.deno.js`, an artifact compiled from an
AffineScript
source. The estate has retired Deno, so the gate is reimplemented in the
shell
the workflow already runs in.

This is the follow-up to #729, which cleared the three reds and deleted
the
`deno-ci` workflow pair.

## Behavioural equivalence, not "the new one passes"

The gate is required and estate-wide, so equivalence was established
**before**
the old implementation was removed:

* The existing 18-case corpus was pointed at **both** targets at once —
`.deno.js` and `.sh` — giving **36 assertions, 36 passes, identical
verdicts
  on every case**.
* Only then was the Deno target dropped. The corpus now runs **18/18**
against
  the shell gate alone.
* Proven fallible, not merely green: breaking the `deno-*` directory
rule fails
exactly `directory starting 'deno-' allowed` and nothing else; restoring
it
  returns 18/18.

`shellcheck -S style` is clean on both the gate and its test.

## What was deleted, and why together

| Deleted | Why |
|---|---|
| `scripts/check-ts-allowlist.deno.js` | the artifact the workflow ran |
| `scripts/check-ts-allowlist.affine` | its source — its only output and
only build recipe are both gone in this PR, so keeping it would leave an
unbuildable orphan that still looked live |
| `check-ts-allowlist-drift` Justfile recipe | compiled with
`--deno-esm`; sole consumer of the `.affine` |
| the workflow's `source/compile drift (informational)` step |
`continue-on-error: true`, emitting only `::warning::` — it could not
fail, so it is deleted rather than ported |

## The lockfile, which is the risky part

`actions.lock` is enforced at workflow **load** time — a stale lock
kills every
consumer with `jobs=0` and no annotation, which is the exact failure
#729
existed to fix. Removing the `setup-deno` steps changes the pin set, so
the lock
moves here.

It was hand-edited **deliberately**. `gh actions-lock` in bare *update*
mode —
the mode `scripts/update-actions-lock.sh` itself calls — was tried first
and
rejected. On this tree it exited **0** reporting `All 42 workflows
valid` while:

1. prepending `# This workflow is managed by gh actions-lock.` at line 1
of all
42 workflows, above the SPDX header and **duplicating** the banner
already on
   line 2;
2. rewriting `uses: ./.github/actions/signed-push` to the invalid
`uses: $/…` spelling that `update-actions-lock.sh`'s own comments warn
about;
3. and **leaving both genuinely-stale `setup-deno` rows in place** — the
exact
   drift it was run to fix.

The verifier is trustworthy even though the updater is not, so the four
removed
regions are witnessed rather than reasoned:
`scripts/check-actions-lock-gate.sh` → `"valid": true`, rc=0, **zero
`stale`
findings**, and no workflow byte mutated. Lock rows for the `deno-ci`
pair
deleted in #729 are pruned at the same time.

## Debt

Measured from the probes recorded in `Debtfile.a2ml`, not assumed:

| Entry | Was | Now | Ceiling |
|---|---|---|---|
| `deno-residue` | 4 | **0** | 4 — kept as an entry at 0; debt leaves by
reaching zero, not by deletion |
| `deno-artefacts` | 3 | **2** | lowered 3 → 2 |

**No ceiling was raised.** `deno-artefacts` stops at 2, not 0: the
survivors are

`docs/migrations/npm-to-deno-template/{INVENTORY-2026-05-30,MIGRATION}.adoc`,
a
migration recipe still pointing repos at the retired runtime. Deleting
them is
on-plan, but a docs deletion bundled into a PR that rewrites a required
context
makes rollback coarser — it is a separate one-line follow-up.

## Witnesses

* `check-ts-allowlist-test.sh` → 18/18 (36/36 across both targets
beforehand)
* `scripts/run-shell-test-suite.sh` → **all 35 test files pass**
* `scripts/check-actions-lock-gate.sh` → `valid: true`, rc=0, 0 stale
* `run-debtfile.sh --write` → 0 breached; `check-debtfile-structure.sh`
→ OK
* `check-debt-ratchet.sh origin/main` → OK, `deno-artefacts` LOWERED
* `just --evaluate` parses; `asciidoctor --failure-level=WARN` clean
* all three commits signed (`%G?` = `G`)


---

## Follow-up noted, deliberately NOT in this PR

The sibling step `Check language-policy invariants` uses the same
local-first
fallback **without** the `GITHUB_REPOSITORY` guard added here, so a
consumer repo
carrying its own `tools/policy/check-language-policy.sh` would have that
copy
preferred over the canonical one. Tightening it could flip verdicts on
consumers
that already do this, so it needs its own PR with a census first —
widening a
required gate silently is exactly what this PR is trying not to do.


---

## Correction before merge: `.deno.js` is retained as a compatibility
shim

The first version of this PR **deleted**
`scripts/check-ts-allowlist.deno.js`.
That would have broken **269 repos** on merge. Measured, not estimated.

`governance-reusable.yml` checks out standards' `scripts/` at floating
`ref: main`, while each consumer pins the **workflow YAML** at a fixed
SHA. The
two halves move at different speeds, so deleting a file under `scripts/`
breaks
every consumer whose pinned YAML still names it — with **no red on the
deleting
PR**. The breakage lands on other repos, later.

Measured 2026-09-04 against the live pin census (1626 rows):

| cohort | distinct repos |
|---|---|
| pin a governance SHA running `deno run … check-ts-allowlist.deno.js` |
**269** |
| pin a `.ts`-era SHA | 0 (three such SHAs exist, no live consumers) |
| dead / unreachable governance SHA | 59 |

So `.deno.js` and `.affine` are restored **byte-identical to main**. The
new
`scripts/check-ts-allowlist.sh` is the gate; the shim is dead weight
that stays
until consumers have moved off it.

**Deno is not gone.** The owner ruled removal; retention is forced by
the
measurement above. This PR **defers** that ruling to the repin campaign
(task #59) — it does not satisfy it. Retirement is three-phase and this
is
phase 1:

1. land the replacement **and keep the old file as a shim** ← this PR
2. repin consumers to a post-#730 SHA (campaign, task #59)
3. delete the shim only when a pin census returns **zero** reachable
pins
   naming `.deno.js`

### Paying for the shim without raising a ceiling

Restoring `.deno.js` puts `deno-artefacts` at 3 against a ceiling of 2.
Rather
than raise the ceiling, this PR deletes
`docs/migrations/npm-to-deno-template/`
— a live recipe pointing repos **at** the retired runtime, and already
dead:
both inbound links named `MIGRATION.md` after the `.adoc` rename, so
they had
been dangling. Those two references are updated rather than left broken.

Note `origin/main` measures 3 on that probe **today** — it is over its
own
ceiling and nobody sees it, because the Debt ratchet is `if:
pull_request`, so
main drifts unmeasured. This PR incidentally fixes that.

Result: `deno-artefacts` 3 → 1, `deno-residue` 4 → 1,
`gate-scripts-without-tests`
31 → 30. **Three ceilings lowered, none raised.** The single remaining
`deno-residue` hit is a *comment* inside the shim, not a live
invocation.

### Witnesses

- `scripts/check-ts-allowlist.sh` → green **with the shim present** (the
new gate
  must not flag its own shim)
- `scripts/tests/check-ts-allowlist-test.sh` → 18 pass / 0 fail
- `scripts/run-debtfile.sh` → 0 breached, 2 paid down, 1 resolved
- `scripts/check-debtfile-structure.sh` → OK (7 entries)
- `scripts/check-debt-ratchet.sh origin/main` → OK, three LOWERED
- `scripts/build-registry.sh --check` → registry + topology in sync
- `tests/test_governance_reusable_shape.sh` → 14 pass / 0 fail
- commit `9fba1ede`, signature `%G?` = `G`
hyperpolymath added a commit that referenced this pull request Sep 22, 2026
Owner ruling 2026-09-22: "should be no deno, it's deprecated in standards,
and rsr-template-repo, and we are all bun and bunx now."

docs/JS-RUNTIME-POLICY.adoc:101 is the canonical .gitignore block, described
in its own heading as the "template source of truth" propagated to every repo
via rsr-template-repo and v3-templater. It still read:

  # npm-avoidant (standards#67): estate JS-runtime policy is Bun>Deno>pnpm>npm.

That is the pre-ban ordering, and it was the last live text in this repo that
blessed Deno rather than banning it. Now Bun>pnpm>npm. Comment-only: no
.gitignore behaviour changes, and propagating the corrected block to the
estate's tracked .gitignore files is separate, reportable work.

Both ordering tables (LANGUAGE-POLICY.adoc:36, docs/JS-RUNTIME-POLICY.adoc:53)
already said BANNED and are unchanged. LANGUAGE-POLICY.adoc:45 ("Use Deno
instead") and the two .claude/CLAUDE.md hits are historical quotation inside
dated "what this replaced" sections — correct as history, left alone.

.githooks/validate-lint-format.sh: `nickel typecheck` ran unconditionally, so
a .ncl importing a GITIGNORED build artefact was a permanently-red gate that
no edit could satisfy — the vacuous-gate class inverted. An unresolved-import
failure is now a LOUD skip naming the file; every other typecheck error still
fails. Mutants: genuine type error rc=1, unresolved import rc=0 (and it says
"A SKIP, not a pass"), misformatted rc=1, clean rc=0. Byte-identical to the
rsr-template-repo copy (cmp verified).

NOT deleting scripts/check-ts-allowlist.deno.js, despite it having no live
invocation at HEAD. Consumers pin the WORKFLOW YAML, but that YAML checked out
the helper scripts/ at floating `ref: main` and then ran the .deno.js — so a
caller pinned to any SHA before 99220ab executes old YAML against TODAY's
scripts/. 11 of the last 12 governance-reusable revisions invoke it 3x each.
.machine_readable/Debtfile.a2ml:91 records it as "RETAINED DELIBERATELY as a
compatibility shim, not as residue" and measured 269 affected repos on
2026-09-04. Retirement is three-phase — shim (done) -> repin consumers
(task #59, OPEN) -> delete — and phase 2 is unfinished. Phase B pinned the
helper checkout, which fixes this going forward but not for pins already
distributed. Deleting it now would break every one of those callers.

Regression suites after the change: exemption-ratchet 14/0,
check-actions-lock-gate 11/0, check-ts-allowlist 18/0,
governance-reusable-contract PASS.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ji1bq3TypfycfUPAR7hSxR
hyperpolymath pushed a commit that referenced this pull request Oct 24, 2026
…1249

`governance / Debt ratchet` has been red on every pull request since #1249
because `.machine_readable/Debtfile.a2ml` still measured the 2026-08-07
Deno ban that #1249 (ruled 2026-10-14) reversed. LANGUAGE-POLICY.adoc §1.3
now reads "Deno is not banned": Bun 1, Deno 2, pnpm 3, npm 4.

`deno-residue` measured 3 against a ceiling of 1. The three are live,
load-bearing uses of `denoland/setup-deno` at governance-reusable.yml:1845,
js-runtimes-reusable.yml:121 and self-test.yml:65 — the JS-runtimes matrix's
`runtime == 'deno'` leg and the self-test's "needs all three runtimes". The
entry's own description calls them "two workflow retirement notes plus one
comment inside the shim", which is not what the probe matches, and demands
"Must reach 0", which the ruling forbids. The ceiling was unreachable.

`deno-artefacts` was written for the same ban; its remaining artefact is the
`check-ts-allowlist.deno.js` compatibility shim, which leaves when consumers
repin (task #59), not when Deno is retired.

Both entries are retired by declaration as the file's own rule requires. The
condition they measured is no longer debt.

Prose that repeated the ban is corrected in the same commit, so the plan does
not contradict the Debtfile:

* HANDOVER.adoc — the three lines claiming Deno is retired now say Deno is
  permitted at tier 2 behind Bun; "Deno first" stays wrong, for a different
  reason. The link-rot bullet claimed every link must resolve; the
  repository-wide guard actually reports 443 broken internal links (285 under
  docs/), measured 2026-10-24 from a checkout named `standards`, with the
  checkout-name caveat and the measure-before-and-after rule recorded.
* README.adoc — line 69 (the live definition of the _Golden_ reading) is
  rewritten in place. The triage rows #706, #919 and #923, the P2.3 packet row
  and the D354 contradictions row keep their recorded text and each carry a
  dated withdrawal note rather than a rewritten history.

Not done: `scripts/check-ts-allowlist.deno.js` is untouched (task #59); no
entry was re-scoped to `deno.json`; no `count` or `ceiling` was hand-edited.

Debt-exception: deno-residue — retired, Deno is tier 2 since #1249
Debt-exception: deno-artefacts — retired, Deno is tier 2 since #1249

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
hyperpolymath added a commit that referenced this pull request Oct 24, 2026
…#1328)

Closes the last three rule-coverage gaps in the K9 conformance suite
(#1058, ruling D173).

## The gap, stated precisely

Twenty of the contract's 23 rules have a control in `fixtures/invalid/`.
The other three cannot, and `tools/README.adoc` already said why — no
fixture can make a verifier appear, a broken contract cannot be
committed, a missing file cannot be a file. Those reasons are sound.
What was actually missing:

- **`K9-N002` was never asserted to fire at all.** It fired four times
during #1058 (`Record`, then `Any`, then twice more) and nothing proved
it still could.
- **`K9-E000` was never asserted either.**
- **`K9-C001`'s three verdicts were exercised, but not its
consequence.**

## What this adds

`--self-test` goes from **37 → 44 assertions**.

**`K9-N002`** — the self-test points the validator at a generated broken
contract and asserts the rule fires, that L2 then makes **no** `K9-N001`
claim about the component (a broken contract must not be reported as the
component's defect), and that the file still fails. With no toolchain it
asserts the mirror image: skipped, never passed.

This needs the contract path to be overridable, so `K9_CONTRACT` is
added as a **test seam**. No lane sets it, and the self-test asserts the
default still resolves to the canonical contract so the seam cannot be
left open.

**`K9-E000`** — a missing path is asserted to raise it and exit
non-zero. "File not found" is the one finding a gate can emit while
checking nothing at all; a runner that mistook it for a pass would
report an empty corpus as conforming.

**`K9-C001`** — §9.4 makes `signature` a Hunt precondition, so a refused
signature must exit non-zero with verdict `fail`. An error finding that
left the status at 0 would let a host read that precondition as
advisory.

## Mutation-tested

Each new control was verified to be able to fail:

| Mutation | Result |
|---|---|
| Drop the `./` prefix for dash-leading names | 3 assertions fail |
| Downgrade the refused-signature `err` to `warn` | 2 fail (`exits
non-zero`, `verdict is fail`) |
| Turn the no-nickel `K9-N002` skip into an `err` | 3 fail |

The dash-name case turned out to be **already covered** at L1, so the
duplicate assertion I first wrote is removed rather than kept as
padding.

## Verification

`k9-conformance` run
[`40043217758`](https://github.com/hyperpolymath/standards/actions/runs/40043217758)
on `8a8eeb7`: **success**, all 16 steps.

The log and artifact hosts are unreachable from here, so the
Nickel-present branch of the `K9-N002` control is established by chain
rather than by reading it:

1. `Install Nickel` appends to `$GITHUB_PATH`, which applies to every
later step in the job;
2. `Validator self-test` is step 9, after it — so `nickel_bin` returns 0
and the Nickel branch is the one taken;
3. `assertions()` in `scripts/lib/k9-grid.jq` turns any `FAIL` line into
a non-advisory `fail` item, which makes `state` **red**, and the `Gate`
step exits 1 on red;
4. the job succeeded ⟹ no `FAIL` line ⟹ those assertions passed.

Locally: self-test 44/44, fixtures `6 positive, 21 negative, 0
failures`, corpus hook `12 conforming, 0 grandfathered, 2 routed`, exit
0.

## Also

Fixes a pre-existing dangling cross-ref: `MIGRATION-1058.adoc` cited
`§7.5`, but §7 ends at 7.4 and `detect_level` is specified in `§7.3`.
---

## WO-8 — the two pre-existing reds this branch carried

`governance / Debt ratchet` has been red on **every** pull request since
#1249, so it was red here too and was not caused by this branch (the
other open PR branch fails it identically; the job is
`pull_request`-only, which is why it never shows on `main`). It is the
sibling of the ratchet that watches the K9 contract-debt ledger, so it
is squarely part of this work's foundation. It is now **green** —
confirmed in CI on this PR, not just locally.

`governance / Exemption ratchet`, which is the job that actually watches
`.machine_readable/k9-contract-debt.txt`, was already passing and still
is.

### `deno-residue` and `deno-artefacts` retired (commit 97282e2)

`deno-residue` measured 3 against a ceiling of 1. The three matches are
live, load-bearing uses of `denoland/setup-deno` —
`governance-reusable.yml:1845`, `js-runtimes-reusable.yml:121`,
`self-test.yml:65`. They are the JS-runtimes matrix's `runtime ==
'deno'` leg and the self-test's "needs all three runtimes", and
`governance / JS runtimes — deno` is **passing** on this PR, which is
the leg they exist to serve. The entry's description called them "two
workflow retirement notes plus one comment inside the shim" and demanded
"Must reach 0". Neither is true, and `LANGUAGE-POLICY.adoc` §1.3 now
reads, verbatim, *"RULED 2026-10-14 by the owner. Deno is not banned."*
— Bun 1, Deno 2, pnpm 3, npm 4. The ceiling was unreachable by ruling.

Both entries are retired by declaration, with a `Debt-exception:`
trailer each, which is the path the file's own header and
`check-debt-ratchet.sh:113` provide. Neither was re-scoped to
`deno.json`; `scripts/check-ts-allowlist.deno.js` is untouched (task
#59); no `count` or `ceiling` was hand-edited to force a pass.

### `todo-fixme-markers` re-baselined (commit d968578)

Running the measure locally to find the breach above exposed a second
one: `todo-fixme-markers 84 > ceiling 83`. `debt-measure` has failed
**every Monday since 2026-09-21** — five consecutive `failure` runs.
#1302's machine measure wrote 83/83, but a full checkout measures 84,
and measured 84 at every one of the last 21 commits on `main` (checked
revision by revision). The ceiling sat below the measurement, so the
weekly run could never pass.

Raised to the measured 84 by declaration, which is what #1302's own
commit message directs: *"A ceiling that needs to RISE is not done here
— raise it in a human PR with a `Debt-exception:` trailer."*
Self-correcting either way — if the runner's 83 is the true figure, the
next `--write` run reports PAID and lowers the ceiling straight back.

**Open, and not resolved:** why the runner measured 83. It is not binary
detection (`git grep` with and without `-I` both give 84) and the
workflow uses a plain full `actions/checkout`. A runner that disagrees
with the tree by one file will keep writing ceilings the tree cannot
meet.

### Every `Deno` hit in the two prose files, with its disposition

`HANDOVER.adoc`

| Line | Disposition |
|---|---|
| 216–218 | **Rewritten.** Claimed Deno and A2ML were both retired. Now:
A2ML is retired; "Deno first" is still wrong, but because Bun is tier 1
— Deno is permitted at tier 2. |
| 238 | **Rewritten.** Worker prompt: "Deno and A2ML are retired" → A2ML
retired, Deno tier 2 behind Bun since #1249. |
| 296–298 | **Rewritten.** Reviewer prompt: same correction, plus "'no
Deno' would be wrong too". |

`README.adoc`

| Line | Disposition |
|---|---|
| 69 | **Rewritten in place** (a live definition of the _Golden_
reading, not history): "Deno and Python banned" → "Python banned, Deno
permitted at tier 2 since #1249". |
| 238–242 | **Corrected.** "both are gone" → the A2ML sub-project is
gone, Deno is not; the defect is naming it as *the* runtime over Bun. |
| 307 | **Corrected.** "a banned `deno.lock`" → no longer banned; the
residue is implementation-in-canon, not the runtime. |
| 462 `#658` | **Kept.** Recorded triage title; the Deno→Bun migration
is historical fact. |
| 481 `#704` | **Kept.** A filename, no policy claim. |
| 483 `#706` | **Title kept, note added.** The `deno 59` half is
withdrawn; the python half stands. |
| 507 `#905`, 511 `#909`, 517 `#916`, 525 `#925`, 526 `#926`, 550
`#967`, 555 `#976` | **Kept.** Recorded titles describing defects that
still stand — inconsistent pins, a vendored harness, a shim 11 revisions
still invoke, a probe aimed at the wrong runtime. None asserts a ban. |
| 520 `#919` | **Title kept, note added.** The retirement it sizes was
cancelled by #1249; the count stays useful. |
| 523 `#923` | **Title kept, note added.** Superseded — a third date now
governs. |
| 694, 994 | **Kept.** Both report that another repo's agent files say
"use Deno"; that is a live defect there, and the fix is regeneration,
not a ban. |
| 901 `P2.3` | **Text kept, note added.** The `Deno` clauses in the task
and its acceptance line are withdrawn; the `A2ML-REPO-TEMPLATE` and
`1-formats/templates` clauses stand. |
| 957 `P6.3` | **Kept.** "delete the Deno text in governance" is a
packet instruction about a specific block, unaffected by the ruling. |
| 1031 `D354` | **Text kept, note added.** D354b (Deno residue false
positives) is superseded; D354a stands. |

Also corrected while in the file: `HANDOVER.adoc` claimed the
repository-wide link-rot guard reports two findings. Measured 2026-10-24
it reports **443** (285 under `docs/`), from a checkout named
`standards` — which is what CI has, since the guard prunes `9-archive/`
only under that basename and reports 684 otherwise. The bullet now
carries the figure, the caveat and the measure-before-and-after rule.

### Acceptance block, run verbatim

```
$ bash scripts/run-debtfile.sh .machine_readable/Debtfile.a2ml
Debtfile: 5 holding · 0 paid-down · 0 resolved · 0 breached · 0 expired · 0 broken-probe
✅ Debtfile run passed (no ceiling breached, no probe broken, no acceptance expired)     exit 0

$ bash scripts/check-debtfile-structure.sh
✅ Debtfile structure OK (5 entries).                                                    exit 0

$ bash scripts/check-debt-ratchet.sh c6d7860
  OK (declared)  todo-fixme-markers: 83 -> 84  [Debt-exception present]
  OK (declared)  deno-residue: removed  [Debt-exception present]
  OK (declared)  deno-artefacts: removed  [Debt-exception present]
Debt ratchet: OK.                                                                        exit 0

$ bash scripts/link-rot-guard.sh docs/reorg/2026-10-14-tidy
all internal links resolve                                                               exit 0

$ grep -n -i 'deno' docs/reorg/2026-10-14-tidy/{HANDOVER,README}.adoc
no line asserts that Deno is retired or banned (table above)
```

On the PR: **`governance / Debt ratchet` pass** (run 40045493004).
`governance / Exemption ratchet` pass. K9 self-test still 44/44 with 0
FAIL and 0 SKIP.

The one remaining red, `governance / Validate Hypatia Baseline`, is red
on `main` since #1300 and is blocked on `hyperpolymath/hypatia` #927 or
#928 merging, then a two-line `hypatia-ref` pin bump. Not fixable from
this repository.

---------

Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
Co-authored-by: arena-agent <arena-agent@users.noreply.github.com>
Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants