From 5d7d1ee10fd7fa84a9d901ef2818bd0add395b86 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Tue, 25 Aug 2026 11:08:50 +0100 Subject: [PATCH] =?UTF-8?q?policy:=20rule=20the=20TypeScript/AffineScript?= =?UTF-8?q?=20conflict=20=E2=80=94=20AffineScript=20governs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner ruling 2026-08-25. LANGUAGE-POLICY.adoc §1.2 has said "TypeScript is permitted under Bun" since 2026-07-29 while .claude/CLAUDE.md bans TypeScript in favour of AffineScript. .claude/CLAUDE.md flagged the contradiction against itself on 2026-08-07 and deliberately left it for an owner ruling. This is that ruling: AffineScript governs, and §1.2 was the error. The fix separates two questions the withdrawn text ran together: runtime -- Bun, tier 1, UNCHANGED (§1 ordering stands) language -- AffineScript for new application code; TypeScript only where AffineScript cannot reach, the same narrow transitional carve-out JavaScript holds ReScript's ban is uncontested; its migration destination is AffineScript. Also names the reasoning error, because it recurs. §1.2 retired the rule on the strength of ts-blocker.yml being structurally incapable of failing (20 of 20 runs green, never once fired). That measurement is correct and is retained. But it is evidence about the GATE, not about the RULE: a broken enforcement mechanism establishes that enforcement was broken and nothing about whether the policy was right. Reading the instrument as the answer is the error class AGENTS.md §5 documents. The remedy for a gate that cannot fail is to repair it and verify it both ways, not to withdraw the policy. Unblocks the #239 campaign family (#243, #244, #246) and #252's destination question, all of which were stalled on this contradiction. Co-Authored-By: Claude Opus 5 --- .claude/CLAUDE.md | 18 ++++++++++----- LANGUAGE-POLICY.adoc | 52 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index b1d1c9e6..a09b2ffa 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -112,11 +112,19 @@ for the canonical statement. > ruling and agent behaviour had diverged: agents were being instructed to migrate > *away* from the estate's first-choice runtime. > -> **Still unresolved, deliberately left alone:** the table below bans TypeScript in -> favour of AffineScript, while `LANGUAGE-POLICY.adoc` §1.2 states "TypeScript is -> *permitted under Bun*". Those two cannot both be right. The AffineScript -> direction is a substantive architectural position rather than an oversight, so -> it is flagged here for an owner ruling instead of being changed. +> **RESOLVED 2026-08-25 — this file governs.** The contradiction previously +> flagged here (this table bans TypeScript in favour of AffineScript, while +> `LANGUAGE-POLICY.adoc` §1.2 stated "TypeScript is *permitted under Bun*") has +> been ruled by the owner: **AffineScript governs.** `LANGUAGE-POLICY.adoc` §1.2 +> was the error and has been rewritten to match. +> +> The distinction that keeps both documents coherent: **Bun is the runtime, tier 1 +> and unchanged; AffineScript is the language for new application code.** Those +> were run together in the withdrawn text. TypeScript is permitted only where +> AffineScript cannot reach — the same narrow, transitional carve-out JavaScript +> holds below. +> +> ReScript's ban is uncontested, and its migration destination is **AffineScript**. ### BANNED - Do Not Use diff --git a/LANGUAGE-POLICY.adoc b/LANGUAGE-POLICY.adoc index 8b4de0b9..6f4c4b6a 100644 --- a/LANGUAGE-POLICY.adoc +++ b/LANGUAGE-POLICY.adoc @@ -50,15 +50,49 @@ second-choice one. **The ordering above supersedes it.** === 1.2 TypeScript -TypeScript is *permitted under Bun*, which executes `.ts` directly. The former -"use ReScript instead" rule is *retired*: ReScript is itself no longer used in -this estate, so the gate enforcing it referred to a dead alternative. - -CAUTION: `ts-blocker.yml` (also 55 repositories) purported to enforce that -retired rule and was structurally incapable of failing — it diffed against -`HEAD~1` on a depth-1 checkout, where that ref does not exist, and swallowed the -error. Measured: *20 of 20 runs green; it has never once fired.* A gate that -cannot fail is worse than no gate, because it is read as evidence. +RULED 2026-08-25 by the owner. *AffineScript is the estate's language for new +application code.* TypeScript is not. + +Separate the two questions this section previously ran together: + +Runtime:: *Bun* remains tier 1 and unchanged — see the ordering in §1. Where +`.ts` is executed at all, it is executed by Bun. +Language:: *AffineScript* is the target for new application code (AffineScript → +typed-wasm). TypeScript is permitted *only where AffineScript cannot reach* — +the same narrow carve-out JavaScript holds for MCP protocol glue and runtime +APIs, and transitional by intent. + +ReScript remains banned (§3), uncontested. Its migration destination is +*AffineScript*. + +==== Why the previous text was withdrawn + +Between 2026-07-29 and 2026-08-25 this section read "TypeScript is _permitted +under Bun_" and declared the "use ReScript instead" rule _retired_. That put it +in direct contradiction with `.claude/CLAUDE.md`, which bans TypeScript in +favour of AffineScript and is *the file agents read first*. The contradiction was +self-flagged there on 2026-08-07 and deliberately left for an owner ruling. This +is that ruling. + +The reasoning that produced the retirement is worth naming, because it is a +recurring error class rather than a one-off: + +CAUTION: `ts-blocker.yml` (55 repositories) purported to enforce the rule and was +structurally incapable of failing — it diffed against `HEAD~1` on a depth-1 +checkout, where that ref does not exist, and swallowed the error. Measured: *20 +of 20 runs green; it has never once fired.* That measurement is correct and still +stands. A gate that cannot fail is worse than no gate, because it is read as +evidence. + +But that is evidence about *the gate*, not about *the rule*. A broken enforcement +mechanism establishes that enforcement was broken; it establishes nothing about +whether the policy it failed to enforce was right. Retiring the rule on the +strength of the gate's failure read the instrument as the answer — the error +class this estate documents in `AGENTS.md` §5. + +The correct remedy for a gate that cannot fail is to *repair or replace the +gate*, and to verify it both ways: that it passes on clean input and fails on a +deliberately planted violation. Not to withdraw the policy. == 2. Package management