Skip to content

Commit 1fff9e1

Browse files
docs+ci: standards-side Layer-1 mirror for RS/npm/JS bans (batch — standards#260/#261/#263) (#285)
## Summary Standards-side mirror of `hypatia#391` (Layer-1 path_allow_prefixes batch for ReScript / npm / Unnecessarily-JS bans). Parallels the v1.3.0 TS Layer-1 batch (`standards#235 + #238 + #247`) for the three sibling estate campaigns. Single batched PR per the seam finding (three campaigns' Layer-1 work is non-conflicting and shares structural overlap). ## Files changed | File | Change | |---|---| | `rhodium-standard-repositories/.github/workflows/language-policy.yml` | +3 blocking grep chains: NEW_RS (8-class), NEW_NPM_LOCK (6-class), NEW_JS (8-class) | | `.claude/CLAUDE.md` | +3 exemption tables (ReScript / npm / JavaScript), mirroring the existing TypeScript table | | `rhodium-standard-repositories/spec/LANGUAGE-POLICY.adoc` | ReScript moved Allowed→Banned (stale entry removed); Node/npm extended with 6-class carve-outs; JavaScript (Unnecessarily-) added with 8-class carve-outs; v1.4.0 amendment | ## Doc-truth fix The `LANGUAGE-POLICY.adoc` had a stale "ReScript — Primary application code" line in the Allowed table that conflicted with the 2026-04-30 ban (correctly documented in `.claude/CLAUDE.md` and enforced via hypatia, but never updated in the spec). This PR closes that drift; AffineScript is now correctly listed as primary. ## JS ship-mode decision Umbrella#254 STEP 1's design question (WARNING vs HARD-BLOCK) is resolved in this PR as **HARD-BLOCK + extensive carve-outs** (matching the hypatia#391 rule shape). Per-PR exemptions still available via inline pragma. ## Test plan - [ ] CI green on this PR (the new grep chains don't fire on this PR's diff — only `.adoc` + `.yml` + `.md` modified, no .res/.js/package-lock.json added) - [ ] After merge, an estate-wide language-policy run validates the chains against real repos (will be a separate audit) - [ ] Cross-link from hypatia#391 (already done) ## Cross-references - hypatia#391 (Layer-1 rule batch) — paired PR - Refs #260 (RS STEP 1) - Refs #261 (npm STEP 1) - Refs #263 (JS STEP 1) - Refs #252 (RS umbrella) - Refs #253 (npm umbrella) - Refs #254 (JS umbrella) - Pattern: standards#235 + #238 + #247 (TS Layer-1) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent bfef9ad commit 1fff9e1

3 files changed

Lines changed: 269 additions & 6 deletions

File tree

.claude/CLAUDE.md

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,53 @@ Existing pre-2026-04-30 `.ts`/`.tsx` outside these carve-outs is grandfathered w
144144
| `**/deps/**` | vendored package-manager dep | Elixir Mix vendored-dep directory (also adopted by other tools). Exemplar: `tma-mark2/deps/phoenix_live_view/assets/js/phoenix_live_view/*.ts` ships Phoenix LiveView's authored TS. | Never — vendored upstream. |
145145
| `**/vscode/**` (covers `editors/vscode/`, `extensions/vscode/`, `clients/vscode/`) | editor-host extension | VSCode extension entry points target the `vscode` extension-host API. Five estate repos (`universal-language-server-plugin`, `reposystem`, `proof-burrower`, `phronesis`, `bofj-kitt`) have a single `vscode/extension.ts`. | When AffineScript ships the VSCode-extension API binding (top-50 roadmap, unshipped). |
146146

147-
Adding to this list requires explicit user approval and an unblock condition (except the structural classes above, which are estate-wide policy). The detection rule and its `path_allow_prefixes` field are the single source of truth; this table mirrors that for human readability.
147+
Adding to this list requires explicit user approval and an unblock condition (except the structural classes above, which are estate-wide policy). The detection rule and its `path_allow_prefixes` field are the single source of truth; this table mirrors that for human readability.
148+
149+
### ReScript Exemptions (Approved)
150+
151+
The hyperpolymath "no new ReScript" policy (banned 2026-05-25) has the following approved exemptions, encoded as `path_allow_prefixes` on the hypatia rules `cicd_rules/rescript_detected` (matches `*.res`) and `cicd_rules/rescript_interface_detected` (matches `*.resi`).
152+
153+
Existing pre-2026-05-25 `.res`/`.resi` outside these carve-outs is grandfathered while in-flight migration proceeds (~3,996 files across ~80 repos as of 2026-05-30; see project tracker `project_estate_rescript_to_affinescript_2026_05_28.md` and umbrella `hyperpolymath/standards#252`). New `.res`/`.resi` files in non-carve-out paths are blocked.
154+
155+
| Path / Pattern | Class | Rationale | Unblock condition |
156+
|---|---|---|---|
157+
| `**/bsconfig.json`, `**/*.config.res` | tooling | Build orchestration, not application code. | When AffineScript ships native equivalents. |
158+
| `rescript/**`, `servers/**`, `repos-monorepo/**`, `linguist/**` | upstream fork | Not estate-authored — vendored upstream code (ReScript compiler, third-party MCP servers, mass aggregator, GitHub linguist samples). | Never — upstream fork. |
159+
| `hyperpolymath-archive/**` | archived | GitHub-archived repos cannot accept PRs; ReScript is dormant. | Never — archived. |
160+
| `**/deps/**`, `**/node_modules/**` | vendored package-manager dep | Mix-style vendored deps and Node-style node_modules. | Never — vendored upstream. |
161+
| `**/vscode/**` (covers `editors/vscode/`, `extensions/vscode/`, `clients/vscode/`) | editor-host extension | VSCode extension entry points target the `vscode` extension-host API. | When AffineScript ships the VSCode-extension API binding (top-50 roadmap, unshipped). |
162+
| `**/lib/js/**`, `**/lib/es6/**`, `**/lib/bs/**` | compiled output | bsc (the ReScript compiler) emits to these paths. They are not source. | Never — compiler output, not source. |
163+
| `affinescript-deno-test/**`, `affinescript-cli/**` | bootstrap shim | Bootstrap the AffineScript toolchain itself. | When AffineScript self-hosts these. |
164+
| `avow-protocol/telegram-bot/avow-telegram-bot/**` | PERMANENT | Mirrors TS Telegraf carve-out for any `.res` file in the same directory. | Never. |
165+
166+
### npm Exemptions (Approved)
167+
168+
The hyperpolymath "npm banned" policy (2026-05-25) has the following approved exemptions on the hypatia rule `cicd_rules/nodejs_detected` (matches `package-lock.json`).
169+
170+
In-flight migration tracked under `hyperpolymath/standards#253` (172 manifests across the estate; see `project_estate_npm_to_deno_2026_05_28.md`).
171+
172+
| Path / Pattern | Class | Rationale | Unblock condition |
173+
|---|---|---|---|
174+
| `**/vscode/**` | VSCode extension host-required | VSCode extension toolchain runs under Node; lockfile is contractually required by the host. | When AffineScript ships the VSCode-extension API binding. |
175+
| `affinescript-deno-test/**`, `affinescript-cli/**` | bootstrap shim | Bootstrap the AffineScript toolchain itself. | When AffineScript self-hosts these. |
176+
| `rescript/**`, `servers/**`, `repos-monorepo/**`, `linguist/**` | upstream fork | Not estate-authored — vendored upstream code. | Never — upstream fork. |
177+
| `hyperpolymath-archive/**` | archived | Archived repos cannot accept PRs. | Never — archived. |
178+
| `**/deps/**`, `**/node_modules/**` | vendored package-manager dep | Vendored deps. | Never — vendored upstream. |
179+
| `**/example/**`, `**/examples/**`, `**/test-fixtures/**`, `**/fixtures/**` | example/test fixture | Demonstrates an npm consumer (e.g., showing how a library is used from a Node project) without making the repo itself an npm consumer. | Never — fixture, not own toolchain. |
180+
181+
### JavaScript Exemptions (Approved)
182+
183+
The hyperpolymath "Unnecessarily-JavaScript banned" policy (2026-05-25) has the following approved exemptions on the hypatia rules `cicd_rules/javascript_detected` (matches `*.js`) and `cicd_rules/javascript_jsx_detected` (matches `*.jsx`).
184+
185+
Distinct from TS/RS policy: JavaScript is *allowed* where AffineScript cannot reach. The rule targets the gap between current AS bindings and current JS usage — JS that COULD be AS today but isn't. In-flight migration tracked under `hyperpolymath/standards#254` (1,609 files across the estate; see `project_estate_unnecessary_js_2026_05_28.md`). Ship mode: HARD-BLOCK + extensive carve-outs (umbrella#254 STEP 1 design question resolved 2026-05-30). Per-PR exemption via inline pragma `// hypatia: allow cicd_rules/javascript_detected -- <reason>`.
186+
187+
| Path / Pattern | Class | Rationale | Unblock condition |
188+
|---|---|---|---|
189+
| `mcp-bridge/**`, `**/plugins/**` | host-required by ecosystem | MCP servers and plugin entry points where JS is the host contract (the host loads .js, not .affine). | When AS plugin-host bindings ship (top-50 roadmap). |
190+
| `**/*.config.js`, `**/*.config.cjs`, `**/*.config.mjs` | tooling configs | Build orchestration. | When AS ships native equivalents. |
191+
| `affinescript-deno-test/**`, `affinescript-cli/**` | bootstrap shim | Bootstrap the AffineScript toolchain itself. | When AS self-hosts these. |
192+
| `rescript/**`, `servers/**`, `repos-monorepo/**`, `linguist/**` | upstream fork | Not estate-authored — vendored upstream code (linguist samples are ML training data). | Never — upstream fork. |
193+
| `hyperpolymath-archive/**` | archived | Archived repos cannot accept PRs. | Never — archived. |
194+
| `**/deps/**`, `**/node_modules/**` | vendored package-manager dep | Vendored deps. | Never — vendored upstream. |
195+
| `**/out/**`, `**/lib/js/**`, `**/.deno/**` | compiled output | AS / RS / Deno-cache compile output. | Never — compiler output, not source. |
196+
| `**/vscode/**`, `**/extensions/vscode/**` | editor-host extension entry | VSCode extension entry points (often shipped as compiled `.js` even when authored as `.ts`). | When AS VSCode-extension API binding ships (top-50 roadmap). |

rhodium-standard-repositories/.github/workflows/language-policy.yml

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,108 @@ jobs:
7878
exit 1
7979
fi
8080
81+
# Block new ReScript files (banned 2026-05-25, replacement: AffineScript).
82+
# Carve-outs (parallel to hypatia cicd_rules/rescript_detected +
83+
# rescript_interface_detected path_allow_prefixes — 8 classes):
84+
# bsconfig.json + *.config.res tooling
85+
# rescript/ + servers/ + repos-monorepo/ + linguist/ upstream forks
86+
# hyperpolymath-archive/ archived repos
87+
# **/deps/ + **/node_modules/ vendored package-manager deps
88+
# **/vscode/ VSCode extension entry points (blocked on AS bindings)
89+
# **/lib/js/ + **/lib/es6/ + **/lib/bs/ bsc compilation output
90+
# affinescript-deno-test/ + affinescript-cli/ bootstrap shims
91+
# avow-protocol/telegram-bot/avow-telegram-bot/ Telegraf carve-out
92+
NEW_RS=$(git diff --name-only --diff-filter=A HEAD~1 2>/dev/null \
93+
| grep -E '\.resi?$' \
94+
| grep -vE '(^|/)bsconfig\.json$' \
95+
| grep -vE '\.config\.res$' \
96+
| grep -vE '^(rescript|servers|repos-monorepo|linguist|hyperpolymath-archive)/' \
97+
| grep -vE '/deps/' \
98+
| grep -vE '/node_modules/' \
99+
| grep -vE '/vscode/' \
100+
| grep -vE '/lib/(js|es6|bs)/' \
101+
| grep -vE '^(affinescript-deno-test|affinescript-cli)/' \
102+
| grep -vE '^avow-protocol/telegram-bot/avow-telegram-bot/' \
103+
|| true)
104+
if [ -n "$NEW_RS" ]; then
105+
echo "❌ New ReScript files detected (banned 2026-05-25). Use AffineScript instead."
106+
echo "$NEW_RS"
107+
echo ""
108+
echo "In-flight migration tracked under hyperpolymath/standards#252."
109+
echo "If this file belongs to a carve-out class, add it via"
110+
echo "the hypatia rule's path_allow_prefixes — see standards/.claude/CLAUDE.md"
111+
echo "§ReScript Exemptions (Approved)."
112+
exit 1
113+
fi
114+
115+
# Block new package-lock.json (npm banned 2026-05-25, replacement: Deno).
116+
# Carve-outs (parallel to hypatia cicd_rules/nodejs_detected
117+
# path_allow_prefixes — 6 classes):
118+
# **/vscode/ VSCode extension host-required toolchain
119+
# affinescript-deno-test/ + affinescript-cli/ bootstrap shims
120+
# rescript/ + servers/ + repos-monorepo/ + linguist/ upstream forks
121+
# hyperpolymath-archive/ archived repos
122+
# **/deps/ + **/node_modules/ vendored package-manager deps
123+
# **/example/ + **/examples/ + **/test-fixtures/ + **/fixtures/
124+
NEW_NPM_LOCK=$(git diff --name-only --diff-filter=A HEAD~1 2>/dev/null \
125+
| grep -E '(^|/)package-lock\.json$' \
126+
| grep -vE '/vscode/' \
127+
| grep -vE '^(affinescript-deno-test|affinescript-cli)/' \
128+
| grep -vE '^(rescript|servers|repos-monorepo|linguist|hyperpolymath-archive)/' \
129+
| grep -vE '/deps/' \
130+
| grep -vE '/node_modules/' \
131+
| grep -vE '/(example|examples|test-fixtures|fixtures)/' \
132+
|| true)
133+
if [ -n "$NEW_NPM_LOCK" ]; then
134+
echo "❌ New package-lock.json files detected (npm banned 2026-05-25). Use Deno instead."
135+
echo "$NEW_NPM_LOCK"
136+
echo ""
137+
echo "In-flight migration tracked under hyperpolymath/standards#253."
138+
echo "If this lockfile belongs to a carve-out class (vscode extension,"
139+
echo "bootstrap shim, example fixture, etc.), add it via the hypatia rule's"
140+
echo "path_allow_prefixes — see standards/.claude/CLAUDE.md §npm Exemptions."
141+
exit 1
142+
fi
143+
144+
# Block new "Unnecessarily-JavaScript" .js / .jsx files (banned in NEW
145+
# code as of 2026-05-25, where AffineScript bindings exist; replacement:
146+
# AffineScript). Existing JS grandfathered while in-flight migration
147+
# proceeds.
148+
# Carve-outs (parallel to hypatia cicd_rules/javascript_detected +
149+
# javascript_jsx_detected path_allow_prefixes — 8 classes):
150+
# mcp-bridge/ + **/plugins/ host-required (JS is the host contract)
151+
# *.config.js / *.config.cjs / *.config.mjs tooling configs
152+
# affinescript-deno-test/ + affinescript-cli/ bootstrap shims
153+
# rescript/ + servers/ + repos-monorepo/ + linguist/ upstream forks
154+
# hyperpolymath-archive/ archived repos
155+
# **/deps/ + **/node_modules/ vendored package-manager deps
156+
# **/out/ + **/lib/js/ + **/.deno/ AS / RS compile output
157+
# **/vscode/ + **/extensions/vscode/ editor-host extension entry
158+
NEW_JS=$(git diff --name-only --diff-filter=A HEAD~1 2>/dev/null \
159+
| grep -E '\.jsx?$' \
160+
| grep -vE '^mcp-bridge/' \
161+
| grep -vE '/plugins/' \
162+
| grep -vE '\.config\.(js|cjs|mjs)$' \
163+
| grep -vE '^(affinescript-deno-test|affinescript-cli)/' \
164+
| grep -vE '^(rescript|servers|repos-monorepo|linguist|hyperpolymath-archive)/' \
165+
| grep -vE '/deps/' \
166+
| grep -vE '/node_modules/' \
167+
| grep -vE '/(out|lib/js|\.deno)/' \
168+
| grep -vE '/vscode/' \
169+
| grep -vE '/extensions/vscode/' \
170+
|| true)
171+
if [ -n "$NEW_JS" ]; then
172+
echo "❌ New 'Unnecessarily-JavaScript' files detected (banned 2026-05-25 in NEW code)."
173+
echo "Use AffineScript where bindings exist."
174+
echo "$NEW_JS"
175+
echo ""
176+
echo "In-flight migration tracked under hyperpolymath/standards#254."
177+
echo "If this file belongs to a carve-out class (MCP server, plugin host,"
178+
echo "tooling config, etc.), add it via the hypatia rule's"
179+
echo "path_allow_prefixes — see standards/.claude/CLAUDE.md §JavaScript Exemptions."
180+
echo "For an ad-hoc exemption use inline pragma:"
181+
echo " // hypatia: allow cicd_rules/javascript_detected -- <reason>"
182+
exit 1
183+
fi
184+
81185
echo "✅ Language policy check passed"

rhodium-standard-repositories/spec/LANGUAGE-POLICY.adoc

Lines changed: 115 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@ NOTE: For full rationale and migration guides, see the link:{source-repo}[CCCP r
4343
|===
4444
| Language | Use Case | Notes
4545

46-
| *ReScript*
47-
| Primary application code
48-
| Compiles to JS, OCaml type safety
46+
| *AffineScript*
47+
| Primary application code (front-end + AS-reachable backend)
48+
| Compiles to typed-wasm; affine/linear types. Estate-wide go-forward
49+
language for the RS/TS/JS → AffineScript → typed-wasm path. See
50+
hyperpolymath/affinescript for the toolchain.
4951

5052
| *Rust/SPARK*
5153
| Systems, performance, WASM, CLI tools, safety-critical (preferred over Ada where reachable)
@@ -157,13 +159,91 @@ NOTE: For full rationale and migration guides, see the link:{source-repo}[CCCP r
157159
the underlying technical objection; AffineScript provides affine/linear
158160
types plus typed-wasm output.
159161

162+
| *ReScript*
163+
| AffineScript
164+
| Banned in NEW code 2026-05-25. Existing `.res`/`.resi` is
165+
grandfathered while in-flight migration to AffineScript proceeds
166+
(~3,996 files across ~80 repos; tracker
167+
`project_estate_rescript_to_affinescript_2026_05_28.md`; umbrella
168+
hyperpolymath/standards#252; STEPS #260/#264/#267/#269/#272/#276/#278/#279/#280).
169+
Detection: hypatia rules `cicd_rules/rescript_detected` (matches
170+
`*.res`) and `cicd_rules/rescript_interface_detected` (matches
171+
`*.resi`) with `path_allow_prefixes` covering eight carve-out
172+
classes:
173+
(1) `bsconfig.json`, `*.config.res` tooling configs;
174+
(2) `rescript/`, `servers/`, `repos-monorepo/`, `linguist/`
175+
upstream forks not estate-authored;
176+
(3) `hyperpolymath-archive/**` archived repos;
177+
(4) `**/deps/**`, `**/node_modules/**` vendored package-manager
178+
deps;
179+
(5) `**/vscode/**` editor-host extensions (blocked on AS
180+
VSCode-extension API binding);
181+
(6) `**/lib/js/**`, `**/lib/es6/**`, `**/lib/bs/**` bsc compilation
182+
output (not source);
183+
(7) `affinescript-deno-test/`, `affinescript-cli/` bootstrap shims;
184+
(8) `avow-protocol/telegram-bot/avow-telegram-bot/**` Telegraf
185+
carve-out (PERMANENT exemption mirror of TS class 3).
186+
Existing `.res` migrates to `.affine` directly (do not pass through
187+
ReScript-to-TS first).
188+
160189
| *Node.js*
161190
| Deno
162-
| Insecure by default
191+
| Insecure by default. Detection via hypatia
192+
`cicd_rules/nodejs_detected` (matches `package-lock.json`) with
193+
`path_allow_prefixes` covering six carve-out classes:
194+
(1) `**/vscode/**` VSCode extension host-required toolchain
195+
(extension toolchain runs under Node; lockfile contractually
196+
required by the host);
197+
(2) `affinescript-deno-test/`, `affinescript-cli/` bootstrap shims;
198+
(3) `rescript/`, `servers/`, `repos-monorepo/`, `linguist/` upstream
199+
forks;
200+
(4) `hyperpolymath-archive/**` archived repos;
201+
(5) `**/deps/**`, `**/node_modules/**` vendored package-manager
202+
deps;
203+
(6) `**/example/**`, `**/examples/**`, `**/test-fixtures/**`,
204+
`**/fixtures/**` example/test fixtures (demonstrate npm consumer
205+
without making the repo itself an npm consumer).
206+
In-flight migration tracked under hyperpolymath/standards#253
207+
(172 `package.json` manifests; tracker
208+
`project_estate_npm_to_deno_2026_05_28.md`; STEPS
209+
#261/#262/#265/#268/#270/#273/#275).
163210

164211
| *npm/Bun/pnpm/yarn*
165212
| Deno
166-
| Supply chain risks
213+
| Supply chain risks. Same six carve-outs as Node.js above (the
214+
detection rule keys on `package-lock.json` which is npm's lockfile
215+
format; other lockfiles like `pnpm-lock.yaml` are caught by the
216+
same path-allow logic where present).
217+
218+
| *JavaScript (Unnecessarily-)*
219+
| AffineScript
220+
| Banned in NEW code 2026-05-25 where AffineScript bindings exist.
221+
Distinct from TS/RS policy: JavaScript is *allowed* where AS cannot
222+
reach (MCP servers, plugin entry points where JS is the host
223+
contract). The rule targets the gap between current AS bindings and
224+
current JS usage — JS that COULD be AS today but isn't. Existing JS
225+
grandfathered while in-flight migration proceeds (1,609 `.js`/`.jsx`
226+
files; tracker `project_estate_unnecessary_js_2026_05_28.md`;
227+
umbrella hyperpolymath/standards#254; STEPS
228+
#263/#266/#271/#274/#277). Detection: hypatia rules
229+
`cicd_rules/javascript_detected` (matches `*.js`) and
230+
`cicd_rules/javascript_jsx_detected` (matches `*.jsx`) with
231+
`path_allow_prefixes` covering eight carve-out classes:
232+
(1) `mcp-bridge/`, `**/plugins/**` host-required (JS is the host
233+
contract);
234+
(2) `**/*.config.{js,cjs,mjs}` tooling configs;
235+
(3) `affinescript-deno-test/`, `affinescript-cli/` bootstrap shims;
236+
(4) `rescript/`, `servers/`, `repos-monorepo/`, `linguist/` upstream
237+
forks;
238+
(5) `hyperpolymath-archive/**` archived repos;
239+
(6) `**/deps/**`, `**/node_modules/**` vendored deps;
240+
(7) `**/out/**`, `**/lib/js/**`, `**/.deno/**` compiled output
241+
(AS / RS / Deno-cache, not source);
242+
(8) `**/vscode/**`, `**/extensions/vscode/**` editor-host extension
243+
entry (often shipped as compiled `.js` even when authored as `.ts`).
244+
Ship mode: HARD-BLOCK + extensive carve-outs (umbrella#254 STEP 1
245+
design question resolved 2026-05-30 in favour of HARD-BLOCK; WARNING
246+
mode preserved as per-PR inline-pragma suppression).
167247

168248
| *Go*
169249
| Rust/SPARK
@@ -452,6 +532,36 @@ not prose alone.
452532

453533
== Amendments
454534

535+
=== v1.4.0 — 2026-05-30 (Jonathan D.A. Jewell)
536+
537+
Codified the *ReScript / npm / Unnecessarily-JavaScript Layer-1 policy
538+
batch* paralleling the v1.3.0 TS Layer-1.
539+
540+
* ReScript moved from Allowed → Banned table with full carve-out class
541+
detail (eight classes, mirroring hypatia#391 `rescript_detected` +
542+
`rescript_interface_detected` `path_allow_prefixes`). Removed the
543+
stale "Primary application code" line that conflicted with the
544+
2026-04-30 ban; AffineScript now correctly listed as primary.
545+
* Node.js / npm Banned entries extended with the six carve-out classes
546+
from hypatia#391 `nodejs_detected`.
547+
* JavaScript (Unnecessarily-) added as a Banned entry with eight
548+
carve-out classes from hypatia#391 `javascript_detected` +
549+
`javascript_jsx_detected`. Ship-mode design question (umbrella#254
550+
STEP 1) resolved in favour of HARD-BLOCK + extensive carve-outs.
551+
552+
This amendment closes the doc-vs-policy drift across all three
553+
campaigns. Trackers:
554+
555+
* RS: `project_estate_rescript_to_affinescript_2026_05_28.md` —
556+
umbrella hyperpolymath/standards#252
557+
* npm: `project_estate_npm_to_deno_2026_05_28.md` — umbrella
558+
hyperpolymath/standards#253
559+
* JS: `project_estate_unnecessary_js_2026_05_28.md` — umbrella
560+
hyperpolymath/standards#254
561+
562+
Detection rule landing: hypatia#391 (Layer-1 batch — single PR for
563+
all three campaigns per the batch-seam finding).
564+
455565
=== v1.3.0 — 2026-05-28 (Jonathan D.A. Jewell)
456566

457567
Codified the *TypeScript → AffineScript migration state*: in-flight, not

0 commit comments

Comments
 (0)