Skip to content

Commit 577b4fa

Browse files
policy: Bun is tier 1, Deno is being removed (#367)
Bun becomes the tier 1 JS runtime and package manager; Deno is removed rather than grandfathered, per the owner ruling of 2026-08-26. Two static-analysis findings were addressed before merge: - ReScript was absent from the BANNED table although canon bans it (destination AffineScript), so the table read as permitting it. - Enforcement Rule 3 said `bun install --production` with no `--frozen-lockfile`, so a lockfile mismatch silently re-resolved instead of failing, defeating the point of committing bun.lock. Enforcement Rule 1 is deliberately untouched: standards#655 records that collision as not resolvable unilaterally. Verified before merge: the failing checks on these PRs are repo-specific CI (cargo/clippy, shell lint, K9 contract and A2ML manifest validators, build) that a Markdown policy file cannot reach, and they fail on main independently. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent e1347cd commit 577b4fa

2 files changed

Lines changed: 18 additions & 17 deletions

File tree

.claude/CLAUDE.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ package definitions (not metadata files) and must NOT be deleted.
108108
| **Guile Scheme** | Guix package definitions (`guix.scm`, `manifests/*.scm`) | `.scm` metadata files are deprecated — see below |
109109
| **Bash/POSIX Shell** | Build scripts, CI glue | Keep minimal |
110110
| **AffineScript** | UI components (TEA architecture, compiled to typed-wasm / wasm, served via Deno) | Replaces AffineScript per `docs/ROADMAP.md`; migration in progress at `src/affinescript/` |
111-
| **Deno** | Runtime for compiled AffineScript-TEA UI | Replaces Node/npm/bun |
111+
| **Bun** | Runtime for compiled AffineScript-TEA UI | Replaces Node/npm/Deno |
112112
| **JavaScript** | Build tooling only (Tailwind config, test harness) | Not for business logic |
113113
| **OCaml** | AffineScript compiler host | Decision locked — AffineScript selected for UI |
114114
| **Nickel** | Configuration language | Used across `configs/`, `echidna-playground/contractiles/k9/`, `.machine_readable/`, `echidnabot/config/` (11+ `.ncl` files) |
@@ -118,17 +118,18 @@ package definitions (not metadata files) and must NOT be deleted.
118118
| Banned | Replacement |
119119
|--------|-------------|
120120
| TypeScript | AffineScript |
121-
| AffineScript | AffineScript |
122-
| Node.js | Deno |
123-
| npm / Bun / pnpm / yarn | Deno |
121+
| ReScript | AffineScript |
122+
| Deno | Bun |
123+
| Node.js | Bun |
124+
| npm / pnpm / yarn | Bun |
124125
| Go | Rust |
125126
| Python | Julia / Rust |
126127

127128
### Enforcement Rules
128129

129-
1. **No new TypeScript or AffineScript files** - Use AffineScript-TEA; migrate existing `src/affinescript/` to AffineScript per `docs/ROADMAP.md`
130-
2. **No package.json for runtime deps** - Use deno.json imports
131-
3. **No node_modules in production** - Deno caches deps automatically
130+
1. **No new TypeScript or ReScript files** - Use AffineScript-TEA; migrate existing `src/affinescript/` to AffineScript per `docs/ROADMAP.md`
131+
2. **Use `package.json` + `bun.lock` for JS runtime deps** - Bun is npm-compatible; a manifest is REQUIRED
132+
3. **`bun install --production --frozen-lockfile` for production deps** - resolved from `package.json` and pinned via `bun.lock`; `--frozen-lockfile` makes a lockfile mismatch a build failure rather than a silent re-resolve
132133
4. **No Go code** - Use Rust instead
133134
5. **No Python anywhere** - Use Julia for data/batch, Rust for systems
134135

@@ -141,7 +142,7 @@ package definitions (not metadata files) and must NOT be deleted.
141142
(guix deprecated estate-wide; do NOT add `flake.guix`/`flake.lock` back).
142143
A second packager is permitted only where it is the sole source of a
143144
specific named dependency, documented as such.
144-
- **JS deps**: Deno (deno.json imports)
145+
- **JS deps**: Bun (`package.json` + `bun.lock`). Declare tooling as a devDependency and run `bunx --no-install --bun <tool>` — a bare `bunx <tool>` can fetch an unpinned package and may start Node via its shebang.
145146

146147
### Security Requirements
147148

echidna-playground/.claude/CLAUDE.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
| Language/Tool | Use Case | Notes |
88
|---------------|----------|-------|
99
| **AffineScript** | Primary application code | Compiles to JS, type-safe |
10-
| **Deno** | Runtime & package management | Replaces Node/npm/bun |
10+
| **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. |
1111
| **Rust** | Performance-critical, systems, WASM | Preferred for CLI tools |
1212
| **Tauri 2.0+** | Mobile apps (iOS/Android) | Rust backend + web UI |
1313
| **Dioxus** | Mobile apps (native UI) | Pure Rust, React-like |
1414
| **Gleam** | Backend services | Runs on BEAM or compiles to JS |
1515
| **Bash/POSIX Shell** | Scripts, automation | Keep minimal |
16-
| **JavaScript** | Only where AffineScript cannot | MCP protocol glue, Deno APIs |
16+
| **JavaScript** | Only where AffineScript cannot | MCP protocol glue, Bun APIs |
1717
| **Nickel** | Configuration language | For complex configs |
1818
| **Guile Scheme** | State/meta files | STATE.scm, META.scm, ECOSYSTEM.scm |
1919
| **Julia** | Batch scripts, data processing | Per RSR |
@@ -25,10 +25,10 @@
2525
| Banned | Replacement |
2626
|--------|-------------|
2727
| TypeScript | AffineScript |
28-
| Node.js | Deno |
29-
| npm | Deno |
30-
| Bun | Deno |
31-
| pnpm/yarn | Deno |
28+
| Deno | Bun |
29+
| Node.js | Bun |
30+
| npm | Bun |
31+
| pnpm/yarn | Bun |
3232
| Go | Rust |
3333
| Python | Julia/Rust/AffineScript |
3434
| Java/Kotlin | Rust/Tauri/Dioxus |
@@ -48,8 +48,8 @@ Both are FOSS with independent governance (no Big Tech).
4848
### Enforcement Rules
4949

5050
1. **No new TypeScript files** - Convert existing TS to AffineScript
51-
2. **No package.json for runtime deps** - Use deno.json imports
52-
3. **No node_modules in production** - Deno caches deps automatically
51+
2. **Use `package.json` + `bun.lock` for JS runtime deps** - Bun is npm-compatible; a manifest is REQUIRED
52+
3. **`bun install --production` for production deps** - resolved from `package.json`, pinned via `bun.lock`
5353
4. **No Go code** - Use Rust instead
5454
5. **No Python anywhere** - Use Julia for data/batch, Rust for systems, AffineScript for apps
5555
6. **No Kotlin/Swift for mobile** - Use Tauri 2.0+ or Dioxus
@@ -58,7 +58,7 @@ Both are FOSS with independent governance (no Big Tech).
5858

5959
- **Sole primary**: Guix (guix.scm) — guix is deprecated estate-wide
6060
2026-06-01; do NOT add flake.guix/flake.lock back
61-
- **JS deps**: Deno (deno.json imports)
61+
- **JS deps**: Bun (`package.json` + `bun.lock`). Declare tooling as a devDependency and run `bunx --no-install --bun <tool>` — a bare `bunx <tool>` can fetch an unpinned package and may start Node via its shebang.
6262

6363
### Security Requirements
6464

0 commit comments

Comments
 (0)