Skip to content

policy: rule the TypeScript/AffineScript conflict — AffineScript governs - #632

Merged
hyperpolymath merged 1 commit into
mainfrom
fix/language-policy-affinescript-ruling
Aug 25, 2026
Merged

policy: rule the TypeScript/AffineScript conflict — AffineScript governs#632
hyperpolymath merged 1 commit into
mainfrom
fix/language-policy-affinescript-ruling

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

The conflict

Two canonical documents disagreed, and one of them said so out loud.

LANGUAGE-POLICY.adoc §1.2, since 2026-07-29:

TypeScript is permitted under Bun, which executes .ts directly. The former "use ReScript instead" rule is retired.

.claude/CLAUDE.md, the file agents read first:

AffineScript — Primary application code. Replaces ReScript across the estate (RS/TS/JS → AffineScript → typed-wasm).

.claude/CLAUDE.md flagged this against itself on 2026-08-07:

Still unresolved, deliberately left alone: … 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.

That was the right call at the time. Owner ruling 2026-08-25: AffineScript governs. §1.2 is the error.

The fix

The withdrawn text ran two separate questions together. Separating them makes both documents coherent:

Runtime Bun, tier 1, unchanged — the §1 ordering stands untouched
Language AffineScript for new application code; TypeScript only where AffineScript cannot reach — the same narrow, transitional carve-out JavaScript already holds for MCP glue and runtime APIs

ReScript's ban is uncontested. Its migration destination is AffineScript.

Why this also names a reasoning error

§1.2 justified retiring the rule like this:

ts-blocker.yml … 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 is retained in the rewrite. A gate that cannot fail really is worse than no gate.

But it 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 ("An observation is bounded by the instrument. Do not read the bound as the answer"). Worth recording explicitly, since it happened inside the standards repo and the same shape will recur.

The correct remedy for a fake gate is to repair or replace it and verify it both ways — passes on clean input, fails on a planted violation. Not to withdraw the policy.

What this unblocks

The #239 campaign family was stalled entirely on this contradiction. With the ruling recorded, these stay open and live rather than being closed as stale:

Changes

  • LANGUAGE-POLICY.adoc §1.2 — rewritten; adds a "Why the previous text was withdrawn" subsection preserving the ts-blocker.yml measurement
  • .claude/CLAUDE.md — the self-flagged contradiction note replaced with the recorded ruling

Verified: the old claim returns 0 grep hits; the "Still unresolved" flag returns 0; AsciiDoc section structure intact (== 1, === 1.1, === 1.2, == 2, == 3, == 4 all present and in order).

🤖 Generated with Claude Code

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 <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@gitar-bot

gitar-bot Bot commented Aug 25, 2026

Copy link
Copy Markdown

Important

You are using the Gitar free plan. Upgrade to unlock code review, CI analysis, auto-apply, custom automations, and more.

Gitar

@hyperpolymath
hyperpolymath merged commit d5fe075 into main Aug 25, 2026
17 of 18 checks passed
@hyperpolymath
hyperpolymath deleted the fix/language-policy-affinescript-ruling branch August 25, 2026 14:58
hyperpolymath added a commit to hyperpolymath/panll that referenced this pull request Aug 25, 2026
`.claude/CLAUDE.md:74` read:

> `- **NEVER use TypeScript** — ReScript only`

**ReScript is itself banned estate-wide** (`LANGUAGE-POLICY.adoc` §3),
so this line directed agents at a banned language. Corrected per the
owner ruling of 2026-08-25 (hyperpolymath/standards#632): AffineScript
governs, and the migration path is RS/TS/JS → AffineScript → typed-wasm.

This file is what agents read first, so a wrong rule here propagates
into every session.

Tracked by hyperpolymath/standards#281.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant