Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions .claude/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
52 changes: 43 additions & 9 deletions LANGUAGE-POLICY.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Loading