Skip to content

Commit 7f3681a

Browse files
chore: migrate language policy from ReScript to AffineScript estate-wide (#35)
## Summary Migrate the estate language policy from "TypeScript → ReScript" to "TypeScript / ReScript → AffineScript → typed-wasm" across CI rules, contractile rules, agent-facing policy docs, templates, and a stale migration guide. This is the wider sweep promised in PR #34's body, now landed. ## Per-user directive (2026-04-30) > "yes 1 yes 2 yes 3 yes and drop 4 change .res is out all .ts to .affine now 5 affinescript-config-present replaces" ## What changed ### CI rule workflows | File | Change | |---|---| | `.github/workflows/ts-blocker.yml` | Renamed concept to "TypeScript / JavaScript / ReScript Blocker"; added `.res` to forbidden patterns; replaced "Use ReScript instead" / "ReScript policy enforced" with "Use AffineScript instead" / "AffineScript policy enforced"; dropped the `.res.js$` JS exclusion (no longer needed once `.res` is banned). | | `.github/workflows/rsr-antipattern.yml` | Added a new "Check for ReScript" step blocking `.res` files; added a new "Check for rescript.json" step; updated all "use ReScript instead" messages to "use AffineScript instead"; allowed-list now `AffineScript, Deno, WASM, Rust, OCaml, Haskell, Guile/Scheme`. | | `.github/workflows/language-policy.yml` | Added a new "Check for ReScript files" step; updated "Use ReScript instead" / "Rewrite in Rust/ReScript" → AffineScript; switched `.scm` references to `.a2ml` in the Required Files check (per the `.a2ml`-canonical rule confirmed in PR #33); added `affine` to SPDX-header file extensions. | | `a2ml/actions/validate/.github/workflows/ts-blocker.yml` | Same shape as top-level. | | `a2ml/actions/validate/.github/workflows/rsr-antipattern.yml` | Same shape as top-level. | | `consent-aware-http/.github/workflows/ts-blocker.yml` | Same shape as top-level. | ### Canonical machine-readable rule | File | Change | |---|---| | `hypatia-rules/rsr-self-compliance.a2ml` | `@forbidden_files`: updated `.ts` reason to point at AffineScript; added new `**/*.res` entry. (Supersedes PR #34's narrower one-line fix; that PR can be closed in favour of this one.) | ### Contractile rules | File | Change | |---|---| | `.machine_readable/contractiles/must/Mustfile.a2ml` | Renamed `rescript-json-present` → `affinescript-config-present` (checks for `affinescript.toml` or `dune-project` instead of `rescript.json`); updated `no-unsafe-coerce` to scan `.affine` (not `.res`) since `.res` is now banned and AffineScript has no equivalent escape hatch by design; added new `no-rescript` rule mirroring `no-typescript`; updated `no-typescript` and `no-python` replacement messages to AffineScript. | ### Agent-facing policy | File | Change | |---|---| | `.claude/CLAUDE.md` | Allowed-languages table: ReScript row → AffineScript row; ReScript-as-fallback note in JS row → AffineScript-as-fallback. Banned-languages table: TypeScript replacement is now AffineScript; new ReScript row added (banned 2026-04-30). Mobile section + enforcement rules updated. Note paragraph at end now mentions four banned categories (Python, V-lang, ATS2, ReScript). | | `consent-aware-http/.claude/CLAUDE.md` | Same shape (sub-project copy). | | `ai-instruction/sonnet.md` | Language-policy hard-rule line now lists AffineScript first; ReScript added to no-list. | ### Tier / Replacement docs | File | Change | |---|---| | `0-ai-gatekeeper-protocol/RSR_OUTLINE.adoc` | Tier-1 list: ReScript → AffineScript; "TypeScript/JavaScript (use ReScript)" → "TypeScript/JavaScript/ReScript (use AffineScript)". | | `0-ai-gatekeeper-protocol/repo-guardian-fs/RSR_OUTLINE.adoc` | Same. | | `consent-aware-http/RSR_OUTLINE.adoc` | Same. | ### Templates | File | Change | |---|---| | `a2ml-templates/META.a2ml.template` | `code-style` common-values comment: `rescript` → `affinescript`. | | `a2ml-templates/AGENTIC.a2ml.template` | `languages` allowed list: drop `rescript`, add `affinescript`. `banned` list: add `rescript`. | ### Roadmap / migration | File | Change | |---|---| | `agentic-a2ml/docs/ROADMAP.adoc` | "ReScript template (Tier 1)" → "AffineScript template (Tier 1)" in the templates phase. | | `consent-aware-http/.migration/PYTHON_TO_RUST_RESCRIPT.md` | DELETED. | | `consent-aware-http/.migration/PYTHON_TO_RUST_AFFINESCRIPT.adoc` | NEW. Rewritten content: Python → Rust(+SPARK) / AffineScript directly (no ReScript hop); also converted from `.md` → `.adoc` per the doc-format rule (PR `rsr-template-repo#28`). | ## Files deliberately *not* changed (legitimate ReScript references) - `.machine_readable/bot_exclusion_registry.a2ml` — references `hyperpolymath/rescript` (the ReScript compiler fork repo). Legitimate. - `.gitignore` lines for ReScript build artifacts — kept as transitional defence; existing repos still have `.res` build output to ignore until migrations complete. - `Dustfile.a2ml` `no-tracked-rescript-build` — language-agnostic build hygiene rule. - `consent-aware-http/SCOPE.adoc:54` — factual statement about an existing impl. - `0-ai-gatekeeper-protocol/repo-guardian-fs/README.adoc` — names of real ReScript libraries that some downstream repos still consume. - `agentic-a2ml/examples/web-project-deno.json` — example showing how to set up ReScript+Deno; left as-is for transitional reference. Could add a parallel AffineScript example in a follow-up if desired. ## Relationship to other open PRs - **PR #33** (`.scm` → `.a2ml` + `17 → @required_workflows` + `.md` → `.adoc` for REQUIRED-FILES) — independent doc-drift fixes. No conflict. - **PR #34** (`.scm` → `.a2ml` + ReScript → AffineScript in `@forbidden_files` reason) — *superseded by this PR*. Close #34 in favour of this one. The `.ts` reason update is included here, plus the `.res` ban it didn't have. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e87a048 commit 7f3681a

19 files changed

Lines changed: 193 additions & 109 deletions

File tree

.claude/CLAUDE.md

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ for the canonical statement.
3232

3333
| Language/Tool | Use Case | Notes |
3434
|---------------|----------|-------|
35-
| **ReScript** | Primary application code | Compiles to JS, type-safe |
35+
| **AffineScript** | Primary application code | Compiles to typed-wasm; affine/linear types. Replaces ReScript across the estate (RS/TS/JS → AffineScript → typed-wasm). |
3636
| **Deno** | Runtime & package management | Replaces Node/npm/bun |
3737
| **Rust/SPARK** | Performance-critical, systems, WASM, CLI tools, safety-critical | "Rust" always means "Rust/SPARK" per terminology note above. Preferred over Ada where reachable. |
3838
| **Zig** | FFI layer (hyperpolymath ABI/FFI standard), memory-safe systems where Rust/SPARK is overkill | Also the migration target for V-lang |
@@ -43,7 +43,7 @@ for the canonical statement.
4343
| **Elixir** | Backend services, distributed systems | BEAM, Phoenix, OTP |
4444
| **Haskell** | Type-heavy tools, registry validation | Scaffoldia CLI |
4545
| **Bash/POSIX Shell** | Scripts, automation | Keep minimal |
46-
| **JavaScript** | Only where ReScript cannot | MCP protocol glue, Deno APIs |
46+
| **JavaScript** | Only where AffineScript cannot | MCP protocol glue, Deno APIs (transitional; prefer .affine where possible) |
4747
| **Nickel** | Configuration language | For complex configs |
4848
| **A2ML** | State/meta files | STATE.a2ml, META.a2ml, etc. (TOML-like format) |
4949
| **Julia** | Batch scripts, data processing | Per RSR |
@@ -54,13 +54,14 @@ for the canonical statement.
5454

5555
| Banned | Replacement | Notes |
5656
|--------|-------------|-------|
57-
| TypeScript | ReScript | |
57+
| TypeScript | AffineScript | RS/TS/JS → AffineScript → typed-wasm. |
58+
| **ReScript** | AffineScript | Banned in new code as of 2026-04-30. Existing `.res` files migrate to `.affine` directly (do not pass through ReScript). |
5859
| Node.js | Deno | |
5960
| npm | Deno | |
6061
| Bun | Deno | |
6162
| pnpm/yarn | Deno | |
6263
| Go | Rust/SPARK | |
63-
| **Python** | ReScript/Rust/SPARK/Julia | Fully banned, no exceptions (SaltStack exception removed 2026-01-03) |
64+
| **Python** | AffineScript/Rust/SPARK/Julia | Fully banned, no exceptions (SaltStack exception removed 2026-01-03) |
6465
| Java/Kotlin | Rust/SPARK, Tauri, Dioxus | |
6566
| Swift | Tauri/Dioxus | |
6667
| React Native | Tauri/Dioxus | |
@@ -70,7 +71,8 @@ for the canonical statement.
7071
| **Makefiles** | Mustfile/justfile | |
7172

7273
**NOTE:** Python is fully banned. V-lang is fully banned (2026-04-10). ATS2 is
73-
fully banned in favour of Idris2 + Rust/SPARK. All three bans are enforced by
74+
fully banned in favour of Idris2 + Rust/SPARK. ReScript is fully banned in new
75+
code as of 2026-04-30 (use AffineScript). All four bans are enforced by
7476
`.github/workflows/language-policy.yml`.
7577

7678
### Build System
@@ -87,14 +89,14 @@ See: https://github.com/hyperpolymath/mustfile
8789

8890
**No exceptions for Kotlin/Swift** - use Rust-first approach:
8991

90-
1. **Tauri 2.0+** - Web UI (ReScript) + Rust backend, MIT/Apache-2.0
92+
1. **Tauri 2.0+** - Web UI (AffineScript → typed-wasm) + Rust backend, MIT/Apache-2.0
9193
2. **Dioxus** - Pure Rust native UI, MIT/Apache-2.0
9294

9395
Both are FOSS with independent governance (no Big Tech).
9496

9597
### Enforcement Rules
9698

97-
1. **No new TypeScript files** - Convert existing TS to ReScript
99+
1. **No new TypeScript or ReScript files** - Convert existing TS/RS to AffineScript directly (`.affine`); ReScript is no longer the destination
98100
2. **No package.json for runtime deps** - Use deno.json imports
99101
3. **No node_modules in production** - Deno caches deps automatically
100102
4. **No Go code** - Use Rust instead

.github/workflows/language-policy.yml

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,23 @@ jobs:
2121
- name: Check for TypeScript files
2222
run: |
2323
if find . -name "*.ts" -o -name "*.tsx" | grep -v node_modules | grep -v ".d.ts" | head -1 | grep -q .; then
24-
echo "::error::TypeScript files found. Use ReScript instead."
24+
echo "::error::TypeScript files found. Use AffineScript instead."
2525
find . -name "*.ts" -o -name "*.tsx" | grep -v node_modules | grep -v ".d.ts"
2626
exit 1
2727
fi
2828
echo "✓ No TypeScript files found"
2929
30+
- name: Check for ReScript files
31+
run: |
32+
# Estate policy: RS/TS/JS -> AffineScript -> typed-wasm.
33+
# ReScript (.res) is no longer the TS replacement.
34+
if find . -name "*.res" | grep -v node_modules | head -1 | grep -q .; then
35+
echo "::error::ReScript files found. Use AffineScript instead."
36+
find . -name "*.res" | grep -v node_modules
37+
exit 1
38+
fi
39+
echo "✓ No ReScript files found"
40+
3041
- name: Check for Go files
3142
run: |
3243
if find . -name "*.go" | head -1 | grep -q .; then
@@ -41,7 +52,7 @@ jobs:
4152
# Allow Python only in ansible/ directories or for Ansible-specific files
4253
PYTHON_FILES=$(find . -name "*.py" | grep -v __pycache__ | grep -v ".venv" | grep -v "ansible" | grep -v "molecule" || true)
4354
if [ -n "$PYTHON_FILES" ]; then
44-
echo "::error::Python files found outside Ansible context. Rewrite in Rust/ReScript."
55+
echo "::error::Python files found outside Ansible context. Rewrite in Rust/AffineScript."
4556
echo "$PYTHON_FILES"
4657
exit 1
4758
fi
@@ -139,11 +150,12 @@ jobs:
139150
echo "::warning::.machine_readable/ directory not found"
140151
else
141152
echo "✓ .machine_readable/ directory exists"
142-
for scm in STATE META ECOSYSTEM AGENTIC NEUROSYM PLAYBOOK; do
143-
if [ ! -f ".machine_readable/${scm}.scm" ]; then
144-
echo "::warning::Missing .machine_readable/${scm}.scm"
153+
# Per estate policy: .a2ml is canonical; .scm is reserved for Guix.
154+
for a2ml in STATE META ECOSYSTEM AGENTIC NEUROSYM PLAYBOOK; do
155+
if [ ! -f ".machine_readable/6a2/${a2ml}.a2ml" ] && [ ! -f ".machine_readable/${a2ml}.a2ml" ]; then
156+
echo "::warning::Missing .machine_readable/6a2/${a2ml}.a2ml (or top-level fallback)"
145157
else
146-
echo "✓ .machine_readable/${scm}.scm exists"
158+
echo "✓ ${a2ml}.a2ml present"
147159
fi
148160
done
149161
fi
@@ -159,7 +171,7 @@ jobs:
159171
- name: Check SPDX headers
160172
run: |
161173
MISSING_SPDX=0
162-
for ext in rs res js jsx mjs ts tsx py go java kt swift sh bash; do
174+
for ext in rs affine js jsx mjs ts tsx py go java kt swift sh bash; do
163175
while IFS= read -r file; do
164176
if [ -n "$file" ] && ! head -5 "$file" | grep -q "SPDX-License-Identifier"; then
165177
echo "::warning::Missing SPDX header: $file"

.github/workflows/rsr-antipattern.yml

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
# SPDX-License-Identifier: PMPL-1.0
22
# RSR Anti-Pattern CI Check
3-
# SPDX-License-Identifier: PMPL-1.0
43
#
5-
# Enforces: No TypeScript, No Go, No Python (except SaltStack), No npm
6-
# Allows: ReScript, Deno, WASM, Rust, OCaml, Haskell, Guile/Scheme
4+
# Enforces: No TypeScript, No ReScript, No Go, No Python (except SaltStack), No npm
5+
# Allows: AffineScript, Deno, WASM, Rust, OCaml, Haskell, Guile/Scheme
76

87
name: RSR Anti-Pattern Check
98

@@ -28,15 +27,27 @@ jobs:
2827
- name: Check for TypeScript
2928
run: |
3029
# Exclude bindings/deno/ - those are Deno FFI files using Deno.dlopen, not plain TypeScript
31-
# Exclude .d.ts files - those are TypeScript type declarations for ReScript FFI
30+
# Exclude .d.ts files - generated type declarations for FFI
3231
TS_FILES=$(find . \( -name "*.ts" -o -name "*.tsx" \) | grep -v node_modules | grep -v 'bindings/deno' | grep -v '\.d\.ts$' || true)
3332
if [ -n "$TS_FILES" ]; then
34-
echo "❌ TypeScript files detected - use ReScript instead"
33+
echo "❌ TypeScript files detected - use AffineScript instead"
3534
echo "$TS_FILES"
3635
exit 1
3736
fi
3837
echo "✅ No TypeScript files (Deno FFI bindings excluded)"
3938
39+
- name: Check for ReScript
40+
run: |
41+
# Estate policy: RS/TS/JS -> AffineScript -> typed-wasm. ReScript (.res)
42+
# is no longer used as the TS replacement; new code uses .affine instead.
43+
RES_FILES=$(find . -name "*.res" | grep -v node_modules || true)
44+
if [ -n "$RES_FILES" ]; then
45+
echo "❌ ReScript files detected - use AffineScript instead"
46+
echo "$RES_FILES"
47+
exit 1
48+
fi
49+
echo "✅ No ReScript files"
50+
4051
- name: Check for Go
4152
run: |
4253
if find . -name "*.go" | grep -q .; then
@@ -67,11 +78,19 @@ jobs:
6778
- name: Check for tsconfig
6879
run: |
6980
if [ -f "tsconfig.json" ]; then
70-
echo "❌ tsconfig.json detected - use ReScript instead"
81+
echo "❌ tsconfig.json detected - use AffineScript instead"
7182
exit 1
7283
fi
7384
echo "✅ No tsconfig.json"
7485
86+
- name: Check for rescript.json
87+
run: |
88+
if [ -f "rescript.json" ] || [ -f "bsconfig.json" ]; then
89+
echo "❌ rescript.json/bsconfig.json detected - use AffineScript config instead"
90+
exit 1
91+
fi
92+
echo "✅ No rescript.json/bsconfig.json"
93+
7594
- name: Verify Deno presence (if package.json exists)
7695
run: |
7796
if [ -f "package.json" ]; then
@@ -86,8 +105,8 @@ jobs:
86105
echo "╔════════════════════════════════════════════════════════════╗"
87106
echo "║ RSR Anti-Pattern Check Passed ✅ ║"
88107
echo "║ ║"
89-
echo "║ Allowed: ReScript, Deno, WASM, Rust, OCaml, Haskell, ║"
108+
echo "║ Allowed: AffineScript, Deno, WASM, Rust, OCaml, Haskell, ║"
90109
echo "║ Guile/Scheme, SaltStack (Python) ║"
91110
echo "║ ║"
92-
echo "║ Blocked: TypeScript, Go, npm, Python (non-Salt) ║"
111+
echo "║ Blocked: TypeScript, ReScript, Go, npm, Python (non-Salt)║"
93112
echo "╚════════════════════════════════════════════════════════════╝"

.github/workflows/ts-blocker.yml

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# SPDX-License-Identifier: PMPL-1.0-or-later
2-
name: TypeScript/JavaScript Blocker
2+
name: TypeScript / JavaScript / ReScript Blocker
33
on: [push, pull_request]
44

55
permissions:
@@ -12,15 +12,20 @@ jobs:
1212
contents: read
1313
steps:
1414
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
15-
- name: Block new TypeScript/JavaScript
15+
- name: Block new TypeScript / JavaScript / ReScript
1616
run: |
17+
# Estate language policy: RS/TS/JS -> AffineScript -> typed-wasm.
18+
# ReScript (.res) is also banned now that AffineScript is the destination
19+
# — no longer used as the TS replacement.
1720
NEW_TS=$(git diff --name-only --diff-filter=A HEAD~1 2>/dev/null | grep -E '\.(ts|tsx)$' | grep -v '\.gen\.' || true)
18-
NEW_JS=$(git diff --name-only --diff-filter=A HEAD~1 2>/dev/null | grep -E '\.(js|jsx)$' | grep -v '\.res\.js$' | grep -v '\.gen\.' | grep -v 'node_modules' || true)
19-
20-
if [ -n "$NEW_TS" ] || [ -n "$NEW_JS" ]; then
21-
echo "❌ New TS/JS files detected. Use ReScript instead."
22-
[ -n "$NEW_TS" ] && echo "$NEW_TS"
23-
[ -n "$NEW_JS" ] && echo "$NEW_JS"
21+
NEW_JS=$(git diff --name-only --diff-filter=A HEAD~1 2>/dev/null | grep -E '\.(js|jsx)$' | grep -v '\.gen\.' | grep -v 'node_modules' || true)
22+
NEW_RES=$(git diff --name-only --diff-filter=A HEAD~1 2>/dev/null | grep -E '\.res$' || true)
23+
24+
if [ -n "$NEW_TS" ] || [ -n "$NEW_JS" ] || [ -n "$NEW_RES" ]; then
25+
echo "❌ New TS/JS/ReScript files detected. Use AffineScript instead."
26+
[ -n "$NEW_TS" ] && echo "$NEW_TS"
27+
[ -n "$NEW_JS" ] && echo "$NEW_JS"
28+
[ -n "$NEW_RES" ] && echo "$NEW_RES"
2429
exit 1
2530
fi
26-
echo "✅ ReScript policy enforced"
31+
echo "✅ AffineScript policy enforced"

.machine_readable/contractiles/must/Mustfile.a2ml

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ These are hard requirements — CI and pre-commit hooks fail if any check fails.
6868

6969
## Web Client
7070

71-
### rescript-json-present
72-
- description: ReScript config exists for web client
73-
- run: test -f client/web/rescript.json
71+
### affinescript-config-present
72+
- description: AffineScript config exists for web client (replaces former rescript-json-present)
73+
- run: test -f client/web/affinescript.toml || test -f client/web/dune-project
7474
- severity: warning
7575

7676
### web-entry-point
@@ -98,8 +98,8 @@ These are hard requirements — CI and pre-commit hooks fail if any check fails.
9898
- severity: critical
9999

100100
### no-unsafe-coerce
101-
- description: No unsafeCoerce in ReScript/Haskell code
102-
- run: test -z "$(find . \( -name '*.res' -o -name '*.hs' \) -not -path '*/deps/*' -not -path '*/node_modules/*' -exec grep -l 'unsafeCoerce\|Obj.magic' {} \; 2>/dev/null)"
101+
- description: No unsafeCoerce / Obj.magic in source (legacy ReScript/Haskell patterns; AffineScript has no equivalent escape hatch by design)
102+
- run: test -z "$(find . \( -name '*.affine' -o -name '*.hs' \) -not -path '*/deps/*' -not -path '*/node_modules/*' -exec grep -l 'unsafeCoerce\|Obj.magic' {} \; 2>/dev/null)"
103103
- severity: critical
104104

105105
## Container Policy
@@ -117,12 +117,17 @@ These are hard requirements — CI and pre-commit hooks fail if any check fails.
117117
## Language Policy
118118

119119
### no-typescript
120-
- description: No TypeScript files (use ReScript)
120+
- description: No TypeScript files (use AffineScript)
121121
- run: test -z "$(find . -name '*.ts' -not -name '*.d.ts' -not -path '*/deps/*' -not -path '*/node_modules/*' 2>/dev/null)"
122122
- severity: warning
123123

124+
### no-rescript
125+
- description: No ReScript files (use AffineScript)
126+
- run: test -z "$(find . -name '*.res' -not -path '*/deps/*' -not -path '*/node_modules/*' 2>/dev/null)"
127+
- severity: warning
128+
124129
### no-python
125-
- description: No Python files (use Julia/Rust/ReScript)
130+
- description: No Python files (use Julia/Rust/AffineScript)
126131
- run: test -z "$(find . -name '*.py' -not -path '*/deps/*' -not -path '*/node_modules/*' 2>/dev/null)"
127132
- severity: warning
128133

0-ai-gatekeeper-protocol/RSR_OUTLINE.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ project/
146146

147147
=== Language Tiers
148148

149-
* **Tier 1** (Gold): Rust, Elixir, Zig, Ada, Haskell, ReScript
149+
* **Tier 1** (Gold): Rust(+SPARK), Elixir, Zig, Ada, Haskell, AffineScript
150150
* **Tier 2** (Silver): Nickel, Racket, Guile Scheme, Nix
151151
* **Infrastructure**: Guix channels, derivations
152152

@@ -166,7 +166,7 @@ project/
166166
=== Prohibited
167167

168168
* Python outside `salt/` directory
169-
* TypeScript/JavaScript (use ReScript)
169+
* TypeScript/JavaScript/ReScript (use AffineScript)
170170
* CUE (use Guile/Nickel)
171171
* `Dockerfile` (use `Containerfile`)
172172

0-ai-gatekeeper-protocol/repo-guardian-fs/RSR_OUTLINE.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ project/
146146

147147
=== Language Tiers
148148

149-
* **Tier 1** (Gold): Rust, Elixir, Zig, Ada, Haskell, ReScript
149+
* **Tier 1** (Gold): Rust(+SPARK), Elixir, Zig, Ada, Haskell, AffineScript
150150
* **Tier 2** (Silver): Nickel, Racket, Guile Scheme, Nix
151151
* **Infrastructure**: Guix channels, derivations
152152

@@ -166,7 +166,7 @@ project/
166166
=== Prohibited
167167

168168
* Python outside `salt/` directory
169-
* TypeScript/JavaScript (use ReScript)
169+
* TypeScript/JavaScript/ReScript (use AffineScript)
170170
* CUE (use Guile/Nickel)
171171
* `Dockerfile` (use `Containerfile`)
172172

a2ml-templates/AGENTIC.a2ml.template

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ documentation = "inline"
5757
# ── Language Constraints ──────────────────────────────────────────────────
5858
[agentic-config.constraints]
5959
# languages: Languages the agent is allowed to write in this project.
60-
languages = ["rescript", "rust", "gleam", "{{PRIMARY_LANGUAGE}}"]
60+
languages = ["affinescript", "rust", "gleam", "{{PRIMARY_LANGUAGE}}"]
6161

6262
# banned: Languages the agent must NEVER use, even if asked.
63-
banned = ["typescript", "go", "python", "makefile"]
63+
banned = ["typescript", "rescript", "go", "python", "makefile"]
6464

6565
# ── Project-Specific Overrides ────────────────────────────────────────────
6666
[agentic-config.project-specific]

a2ml-templates/META.a2ml.template

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ name = "{{PROJECT_NAME}}"
2727
# ── Development Practices ──────────────────────────────────────────────────
2828
[project-meta.development-practices]
2929
# code-style: Which language's conventions to follow.
30-
# Common values: rescript, rust, gleam, elixir, idris2
30+
# Common values: affinescript, rust, gleam, elixir, idris2
3131
code-style = "{{CODE_STYLE}}"
3232

3333
# security: Which security framework is used.

0 commit comments

Comments
 (0)