Repository navigation
ESTATE: total ReScript-surface elimination from all .affine (committed goal; blocked-on #228) #229
Description
Activity
- addedenhancementNew capability or improvement to existing behaviourNew capability or improvement to existing behaviourmajorMajor issue — significant scope, broader impact than a feature/bugMajor issue — significant scope, broader impact than a feature/bug
on May 18, 2026 - added 17 commits that reference this issue
on May 19, 2026 - added a commit that references this issue
on May 27, 2026 Cross-reference (triage 2026-05-27): scope-disambiguated against #230 and #392 — these three are distinct, not consolidatable.
- ESTATE: total ReScript-surface elimination from all .affine (committed goal; blocked-on #228) #229 (this issue) — dialect-syntax cleanup: eliminate ReScript surface (
array<T>,mutable,type rec,%%raw,(~x) =>etc.) from.affinefiles in independent consumer repos (burble, idaptik-dlc-vm, git-scripts, game-server-admin, invariant-path). Blocked-on LANG: type/effect grammar has no module-qualified path —Pkg.Type/Pkg.Effectunrepresentable (estate-wide port blocker; ADR-014) #228. Per the ESTATE: de-vendor embedded affinescript trees (bofj-kitt / proof-burrower / developer-ecosystem) #230 comment, the 3 vendored-tree repos (bofj-kitt / proof-burrower / developer-ecosystem) were reclassified OUT of ESTATE: total ReScript-surface elimination from all .affine (committed goal; blocked-on #228) #229 because their flagged files were vendored copies of the affinescript repo, not consumer drift. ESTATE: total ReScript-surface elimination from all .affine (committed goal; blocked-on #228) #229 will not re-list them. - ESTATE: de-vendor embedded affinescript trees (bofj-kitt / proof-burrower / developer-ecosystem) #230 — de-vendoring: pull stale vendored copies of the affinescript tree OUT of three consumer repos (bofj-kitt, proof-burrower, developer-ecosystem). Supply-chain / vendoring policy concern, not dialect drift. Not blocked by LANG: type/effect grammar has no module-qualified path —
Pkg.Type/Pkg.Effectunrepresentable (estate-wide port blocker; ADR-014) #228. - Extract embedded
affinescript-*subtrees to their own repos (or to developer-ecosystem/) #392 — extraction: push five misplaced subtrees (affinescript-vite/,affinescript-dom/,affinescript-pixijs/,affinescript-tea/,affinescriptiser/) OUT of the affinescript repo itself into their proper homes (developer-ecosystem monorepo or standalone repos). Reverts the 2026-04-22 consolidation mistake. Independent of LANG: type/effect grammar has no module-qualified path —Pkg.Type/Pkg.Effectunrepresentable (estate-wide port blocker; ADR-014) #228.
Directions and target sets are disjoint. Consolidation is not safe.
- ESTATE: total ReScript-surface elimination from all .affine (committed goal; blocked-on #228) #229 (this issue) — dialect-syntax cleanup: eliminate ReScript surface (
Status update — AS stdlib codegen pattern now established (2026-06-01) 📌
For ticket coordinators / anyone tracking this gap:
- affinescript#522 + feat(stdlib): close 6 STEP-3 Deno-ESM gaps surfaced by TS→AS ports (Refs #239, #242) #504 merged 2026-06-01 establish the canonical stdlib extern → Deno-ESM lowering pattern via
lib/codegen_deno.ml. Tests live intests/codegen-deno/*. - affinescript#463 unblocked non-ASCII string emit in Deno-ESM (Unicode escapes, not octal).
- affinescript#421 put stdlib/json on the Zig-FFI rails (hpm-json-rsr).
What this means for the gap tracked in this ticket:
- The codegen pattern is now a known repeatable shape: declare in
stdlib/*.affine→ wire indeno_builtinstable + prelude → smoke-test intests/codegen-deno/*. - This ticket remains open as a tracked gap; no new mass-port is being kicked off from this post.
- Surfacing status so the broader picture stays accurate as more sub-tickets / dependent campaigns reference it.
🤖 Cross-estate AS-status sweep on 2026-06-01.
- affinescript#522 + feat(stdlib): close 6 STEP-3 Deno-ESM gaps surfaced by TS→AS ports (Refs #239, #242) #504 merged 2026-06-01 establish the canonical stdlib extern → Deno-ESM lowering pattern via
Status measured today (2026-09-19) — the block is cleared and two of the five repos are already clean.
blocked-on #228no longer applies: #228 is implemented in full (parser layer in #2415cca379, typecheck slice since landed —strip_module_qualifier,Module_resolution_error,module_quals,UnknownModule, with the four proposed tests intest/test_qualified_paths.ml).ReScript surface remaining in
.affinefiles:Repo .affinefilescarrying ReScript surface burble 36 3 — client/web/src/bindings/PhoenixSocket.affine,client/web/src/app/voice/VoiceEngine.affine,client/web/src/app/voice/VoiceControls.affinegit-scripts 5 2 — ui/src/HarApi.affine,ui/src/App.affinegame-server-admin 2 0 invariant-path 7 0 idaptik-dlc-vm — repository no longer exists under that name (404); the remaining scope needs re-pointing or dropping So the work is now concrete: five files across two repos, plus one stale repo reference in this issue's own scope list. Keeping it open — that is a real residual, not a duplicate.
- addedmeta:umbrellaParent issue aggregating child issuesParent issue aggregating child issuespriority:p1High - schedule nextHigh - schedule nextscope:estateAffects many or all repos across the estateAffects many or all repos across the estatestatus:blockedCannot proceed until a dependency clearsCannot proceed until a dependency clearsfeeds:valence-shellFeeds valence-shell's proofs/engineering (D127): judge progress by what it contributes thereFeeds valence-shell's proofs/engineering (D127): judge progress by what it contributes there
on Sep 30, 2026
Is your feature request related to a problem? Please describe.
A subset of estate
.affinefiles are unfinished ReScript→AffineScript hand-ports:the file declares itself AffineScript (
module …;) but the body still carriesReScript surface syntax. A
.affinefile with ReScript syntax is neither validReScript nor valid AffineScript — it is debt in limbo, and it cannot be
oracle-certified.
Found in the estate dialect-conformance audit (oracle
main.exe checkover 28repos / ~1177
.affineonorigin/main). Confirmed ReScript-surfaceconstructs seen in
.affine:array<T>/option<T>/Dict.t<T>generics,mutablerecord fields,type rec,open Mod,%%raw(\…`),(~x) => …arrow-fn,List(X)(vsList[X]),JSON.t,import … as`.This is a committed goal: total elimination of ReScript surface from every
estate
.affinefile. The end state is that every.affineparses and checkson affinescript
main, with zero ReScript syntax remaining.Describe the solution you'd like
Per-repo, oracle-validated RS→AffineScript completion ports, sequenced after
#228:
Pkg.Type/Pkg.Effectunrepresentable (estate-wide port blocker; ADR-014) #228 (ADR-014, module-qualified type/effect path). The oraclestops at the first parse error. Today only ~22 files fail first on RS
surface — a floor, not the truth: e.g. burble has 19 first-fault-RS files +
16 that fail first on
Externs.Foobut are the same RS port with RSsurface hidden behind the qualified-path fault. Until LANG: type/effect grammar has no module-qualified path —
Pkg.Type/Pkg.Effectunrepresentable (estate-wide port blocker; ADR-014) #228 clearsqualified-path faults, each file's full RS inventory is invisible and a port
cannot be re-validated. LANG: type/effect grammar has no module-qualified path —
Pkg.Type/Pkg.Effectunrepresentable (estate-wide port blocker; ADR-014) #228 landing is what makes a complete andverifiable RS sweep possible.
Pkg.Type/Pkg.Effectunrepresentable (estate-wide port blocker; ADR-014) #228: rebuild oracle, re-run/tmp/affine-audit/audit.sh,produce the true per-file RS construct inventory.
guessed.
array<T>→List[T]is mechanical, butmutablefields,Dict.t,type rec,%%raw,(~x) =>map onto the affine/ownership modeland several are redesigns. Any construct with no clean target is escalated
as its own language-side issue/ADR (bidirectional evidence — same discipline
that produced LANG: type/effect grammar has no module-qualified path —
Pkg.Type/Pkg.Effectunrepresentable (estate-wide port blocker; ADR-014) #228), not patched divergently across N repos.CI does not compile
.affine), squash-merge, noreply author.ReScript ecosystem (
.res);.affine-with-RS is an in-scope unfinishedport — but confirm per repo it is an intended AffineScript target, not a
deliberate interop artefact, before removal (burble's standing caveat).
Describe alternatives considered
cannot be re-validated until LANG: type/effect grammar has no module-qualified path —
Pkg.Type/Pkg.Effectunrepresentable (estate-wide port blocker; ADR-014) #228 (unsound-codemod trap), and treats semanticRS→affine transforms as cosmetic.
zero ReScript surface in any
.affine.Additional context
Pkg.Type/Pkg.Effectunrepresentable (estate-wide port blocker; ADR-014) #228 (type/effect qualified-path grammar, ADR-014).human-gated). RS→affine target forms must equal the LANG: type/effect grammar has no module-qualified path —
Pkg.Type/Pkg.Effectunrepresentable (estate-wide port blocker; ADR-014) #228/STAGE-C canonical..affine, whole-repo RS port). OtherRS-bearing repos surfaced by the audit: idaptik-dlc-vm, git-scripts,
game-server-admin, invariant-path (+ any revealed post-LANG: type/effect grammar has no module-qualified path —
Pkg.Type/Pkg.Effectunrepresentable (estate-wide port blocker; ADR-014) #228 re-audit)./tmp/affine-audit/{results.tsv,drift_lines.txt,audit.sh}.Method: build
bin/main.exe,AFFINESCRIPT_STDLIB=$PWD/stdlib,main.exe check, classify on stdout (Type checking passedvsparse error). Estate repo CI is not an affine oracle — local build only.