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