From 359d08c4ade6073f37b6f1245f42e16c605112b7 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Wed, 26 Aug 2026 23:24:52 +0100 Subject: [PATCH 1/3] =?UTF-8?q?policy:=20Bun=20is=20tier=201,=20Deno=20is?= =?UTF-8?q?=20being=20removed=20=E2=80=94=20correct=20local=20CLAUDE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner ruling 2026-08-26: "deno is to go and bun is the way we are going, put it first everywhere unless not possible and explain why if not". This file is what an agent reads FIRST and it listed Bun as BANNED with Deno as its replacement. Correcting hyperpolymath/standards (#655) fixes one copy of ~372 - agents read the local one. This is that local copy. ALLOWED **Deno** "Replaces Node/npm/bun" -> **Bun** tier 1 BANNED | Bun | Deno | -> row REMOVED BANNED Node.js / npm / pnpm/yarn -> Deno -> -> Bun rule "No package.json for runtime deps - use deno.json imports" -> Use package.json + bun.lock; a manifest is REQUIRED rule "No node_modules in production" -> bun install --production, pinned via bun.lock pkg JS deps: Deno -> JS deps: Bun (package.json + bun.lock), bunx WHY THE MANIFEST RULE MATTERS MOST. "No package.json for runtime deps" did not express a preference - it told repos not to declare their dependencies at all. hyperpolymath/ubicity imported zod and glob, shipped NO manifest of any kind, and could not build under ANY toolchain. Fixed in ubicity#107; the rule that caused it is fixed here. ALSO REPAIRED - blanking scars from the ReScript purge, which substituted the token with an EMPTY STRING rather than removing the text: | | AffineScript | -> | ReScript | AffineScript | 1. **No new files** ... -> **No new ReScript files** ... | **JavaScript** | Only where cannot | -> Only where AffineScript cannot Restoring the NAME in a policy table does not reintroduce the language. Same root cause as the rm -rf /lib found in wordpress-tools#62. Policy text only - no code, no workflows, no build files. 1 file(s). NOT FOLDED IN: "Fallback: Nix (flake.nix)" is stale (Guix superseded Nix per ADR-2026-STACK-MIGRATION) but that is a separate ruling; flagged, not changed. --- .claude/CLAUDE.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index fcb6c93..51fe243 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -21,7 +21,7 @@ project metadata (a2ml is TOML-flavoured, not Guile Scheme): | Language/Tool | Use Case | Notes | |---------------|----------|-------| | **AffineScript** | Primary application code | Compiles to JS/WASM, linear/affine type system | -| **Deno** | Runtime & package management | Replaces Node/npm/bun | +| **Bun** | JS/TS runtime & package management (tier 1) | Default for all new work. Executes `.ts` directly, no build step. Uses an npm-compatible `package.json` plus `bun.lock` — both are expected, not anti-patterns. | | **Rust** | Performance-critical, systems, WASM | Preferred for CLI tools | | **Tauri 2.0+** | Mobile apps (iOS/Android) | Rust backend + web UI | | **Dioxus** | Mobile apps (native UI) | Pure Rust, React-like | @@ -39,11 +39,10 @@ project metadata (a2ml is TOML-flavoured, not Guile Scheme): | Banned | Replacement | |--------|-------------| | TypeScript | AffineScript | -| AffineScript | AffineScript | -| Node.js | Deno | -| npm | Deno | -| Bun | Deno | -| pnpm/yarn | Deno | +| ReScript | AffineScript | +| Node.js | Bun | +| npm | Bun | +| pnpm/yarn | Bun | | Go | Rust | | Python | Julia/Rust/AffineScript | | Java/Kotlin | Rust/Tauri/Dioxus | @@ -63,9 +62,9 @@ Both are FOSS with independent governance (no Big Tech). ### Enforcement Rules -1. **No new TypeScript or AffineScript files** - Use AffineScript; meaningfully migrate existing TS/JS to AffineScript when touched (per-language `examples/` references may stay) -2. **No package.json for runtime deps** - Use deno.json imports -3. **No node_modules in production** - Deno caches deps automatically +1. **No new TypeScript or ReScript files** - Use AffineScript; meaningfully migrate existing TS/JS to AffineScript when touched (per-language `examples/` references may stay) +2. **Use `package.json` + `bun.lock` for JS runtime deps** - Bun is npm-compatible; a manifest is REQUIRED +3. **`bun install --production` for production deps** - resolved from `package.json`, pinned via `bun.lock` 4. **No Go code** - Use Rust instead 5. **No Python anywhere** - Use Julia for data/batch, Rust for systems, AffineScript for apps 6. **No Kotlin/Swift for mobile** - Use Tauri 2.0+ or Dioxus @@ -75,7 +74,7 @@ Both are FOSS with independent governance (no Big Tech). - **Primary**: Guix (guix.scm) - **Fallback**: Guix (flake.guix) -- **JS deps**: Deno (deno.json imports) +- **JS deps**: Bun (`package.json` + `bun.lock`); `bunx ` for one-off tooling ### Security Requirements From 60cb27747c8261a76d78e71e657f934ea579890a Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:15:33 +0100 Subject: [PATCH 2/3] =?UTF-8?q?policy:=20address=20review=20=E2=80=94=20dr?= =?UTF-8?q?op=20the=20.ts=20contradiction,=20ban=20Deno,=20pin=20bunx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review feedback from codacy-production and coderabbitai on the policy wave. Three substantive points, all accepted: 1. ".ts CONTRADICTION" (codacy, MEDIUM, raised on most of the wave). The Bun row said "Executes .ts directly, no build step" in a file whose BANNED table bans TypeScript. True of Bun, but it reads as licence to write new TypeScript. Reworded to compiled ESM/JS, with an explicit note that Bun's native .ts support does NOT license new TypeScript. 2. "DENO MISSING FROM BANNED" (codacy, raised repeatedly). The wave removed Deno from ALLOWED but never added it to BANNED, so the ruling was only half expressed. Added | Deno | Bun |. 3. "UNPINNED bunx" (coderabbitai, Security & Privacy). A bare `bunx ` can fetch a package outside package.json/bun.lock, and can start Node via a shebang - both contrary to estate SHA-pinning doctrine and the Node ban. Guidance now requires a declared devDependency plus `bunx --no-install --bun `. NOT taken: "a npm-compatible" (LanguageTool is wrong, "an" is correct before a vowel sound); "--frozen-lockfile is redundant" (correct - no change needed, and none made); the Nix->Guix point (real, but a separate ruling, deliberately not folded into a Deno/Bun change). --- .claude/CLAUDE.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 51fe243..00ba56c 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -21,7 +21,7 @@ project metadata (a2ml is TOML-flavoured, not Guile Scheme): | Language/Tool | Use Case | Notes | |---------------|----------|-------| | **AffineScript** | Primary application code | Compiles to JS/WASM, linear/affine type system | -| **Bun** | JS/TS runtime & package management (tier 1) | Default for all new work. Executes `.ts` directly, no build step. Uses an npm-compatible `package.json` plus `bun.lock` — both are expected, not anti-patterns. | +| **Bun** | JS/TS runtime & package management (tier 1) | Default for all new work. Runs compiled ESM/JS directly — no bundler step. Uses an npm-compatible `package.json` plus `bun.lock` — both are expected, not anti-patterns. Bun's native `.ts` execution does **not** license new TypeScript (see BANNED). | | **Rust** | Performance-critical, systems, WASM | Preferred for CLI tools | | **Tauri 2.0+** | Mobile apps (iOS/Android) | Rust backend + web UI | | **Dioxus** | Mobile apps (native UI) | Pure Rust, React-like | @@ -40,6 +40,7 @@ project metadata (a2ml is TOML-flavoured, not Guile Scheme): |--------|-------------| | TypeScript | AffineScript | | ReScript | AffineScript | +| Deno | Bun | | Node.js | Bun | | npm | Bun | | pnpm/yarn | Bun | @@ -74,7 +75,7 @@ Both are FOSS with independent governance (no Big Tech). - **Primary**: Guix (guix.scm) - **Fallback**: Guix (flake.guix) -- **JS deps**: Bun (`package.json` + `bun.lock`); `bunx ` for one-off tooling +- **JS deps**: Bun (`package.json` + `bun.lock`). Declare tooling as a devDependency and run `bunx --no-install --bun ` — a bare `bunx ` can fetch an unpinned package and may start Node via its shebang. ### Security Requirements From bac441f89bb19e0bce06fcc6c7eb4c4d6ef064f3 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:46:39 +0100 Subject: [PATCH 3/3] =?UTF-8?q?policy:=20address=20review=20=E2=80=94=20dr?= =?UTF-8?q?op=20the=20.ts=20contradiction,=20ban=20Deno,=20pin=20bunx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review feedback from codacy-production and coderabbitai on the policy wave. Three substantive points, all accepted: 1. ".ts CONTRADICTION" (codacy, MEDIUM, raised on most of the wave). The Bun row said "Executes .ts directly, no build step" in a file whose BANNED table bans TypeScript. OWNER RULING: TypeScript "should not exist at all", so advertising Bun's TypeScript capability is wrong regardless of whether it is true. Every .ts reference is removed from the row, including "JS/TS" in its label. 2. "DENO MISSING FROM BANNED" (codacy, raised repeatedly). The wave removed Deno from ALLOWED but never added it to BANNED, so the ruling was only half expressed. Added | Deno | Bun |. 3. "UNPINNED bunx" (coderabbitai, Security & Privacy). A bare `bunx ` can fetch a package outside package.json/bun.lock, and can start Node via a shebang - both contrary to estate SHA-pinning doctrine and the Node ban. Guidance now requires a declared devDependency plus `bunx --no-install --bun `. NOT taken: "a npm-compatible" (LanguageTool is wrong, "an" is correct before a vowel sound); "--frozen-lockfile is redundant" (correct - no change needed, and none made); the Nix->Guix point (real, but a separate ruling, deliberately not folded into a Deno/Bun change). --- .claude/CLAUDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 00ba56c..444c283 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -21,7 +21,7 @@ project metadata (a2ml is TOML-flavoured, not Guile Scheme): | Language/Tool | Use Case | Notes | |---------------|----------|-------| | **AffineScript** | Primary application code | Compiles to JS/WASM, linear/affine type system | -| **Bun** | JS/TS runtime & package management (tier 1) | Default for all new work. Runs compiled ESM/JS directly — no bundler step. Uses an npm-compatible `package.json` plus `bun.lock` — both are expected, not anti-patterns. Bun's native `.ts` execution does **not** license new TypeScript (see BANNED). | +| **Bun** | JS runtime & package management (tier 1) | Default for all new work. Runs compiled ESM/JS directly — no bundler step. Uses an npm-compatible `package.json` plus `bun.lock` — both are expected, not anti-patterns. | | **Rust** | Performance-critical, systems, WASM | Preferred for CLI tools | | **Tauri 2.0+** | Mobile apps (iOS/Android) | Rust backend + web UI | | **Dioxus** | Mobile apps (native UI) | Pure Rust, React-like |