Repository navigation
[campaign] TypeScript → AffineScript estate migration (UMBRELLA) #239
Copy link
Copy link
Open
Labels
documentationDocs, prose, diagrams, READMEs, ADRsDocs, prose, diagrams, READMEs, ADRsgovernancePolicy, rulesets, standards, compliance, and their enforcementPolicy, rulesets, standards, compliance, and their enforcementmeta:campaignCoordinated multi-repo push with a defined end stateCoordinated multi-repo push with a defined end statemeta:recurringRecurs on a schedule or by trigger; never finally closedRecurs on a schedule or by trigger; never finally closedmeta:umbrellaParent issue aggregating child issuesParent issue aggregating child issuesmigrationPorting between languages or toolchains (e.g. -> AffineScript)Porting between languages or toolchains (e.g. -> AffineScript)priority:p3Low - nice to haveLow - nice to havescope:estateAffects many or all repos across the estateAffects many or all repos across the estate
Description
Campaign overview
Estate-wide migration of TypeScript to AffineScript, parallel to the completed V→Zig sweep (2026-05-28) but at very different scale.
State: IN-FLIGHT. Multi-session campaign, ~50-80 PRs across ~38 repos.
Scope safety: only hyperpolymath/ repos that are non-fork (owner-only + shared-with-son). Upstream forks (rescript, servers, repos-monorepo, linguist) are carve-outs.
4-layer architecture
LAYER 1 - POLICY & ENFORCEMENT COMPLETE
- hypatia#375 :typescript_detected gains path_allow_prefixes (7 cls)
- hypatia#378 +linguist, +/deps/, +/vscode/ (9 cls)
- standards#235 + docs+ci: mirror hypatia#378 TS carve-out extension (linguist + /deps/ + /vscode/) #238 + reposystem#82 docs + CI gate mirror
- standards#247 ROADMAP campaign section
- hypatia tests: 11 cases across 9 carve-out classes
LAYER 2 - STDLIB BINDING CAPACITY EXPANDING
- Deno.affine: +6 externs via affinescript#504 = statIsFile / statIsDirectory / bytesLength / bytesByteAt / bytesAsciiSlice / importMetaUrl
- json.affine v0.3 (Zig FFI parse), Vscode.affine (55 fns), VscodeLanguageClient.affine
- Gaps tracked: [campaign #239] STEP 4-A — STDLIB FILL II: raw binary I/O (Bytes constructor + LE getters/setters) #326 binary I/O (Bytes new/fill/LE getters+setters), [campaign #239] STEP 4-B — STDLIB FILL III: randomness + time bindings #327 random + perf.now, recursive walk done (chore(deps): bump the actions group with 4 updates #445), Set / general Map, TOML, WebExt / WP-admin / Zotero APIs
LAYER 3 - PHYSICAL FILE PORTS (~285 files / 38 repos)
- STEP 1 phronesis 54L LANDED
- STEP 2 4 ports LANDED (panic-attack#82 + session-sentinel#25 + tropical-resource-typing#15 + nafa-app#23)
- STEP 3 affinescript#504 armed (6 gaps in one PR)
- STEP 4 sub-shape filed: 4-A binary ([campaign #239] STEP 4-A — STDLIB FILL II: raw binary I/O (Bytes constructor + LE getters/setters) #326) + 4-B random ([campaign #239] STEP 4-B — STDLIB FILL III: randomness + time bindings #327) + 4-C per-repo + 4-D cross-campaign
LAYER 4 - PARALLEL DEPENDENCY: AS bindings top-50 roadmap
- Plugin-host APIs needed before plugin-repo ports can land
Step issues
- STEP 1: SEED PORT - phronesis 54L VSCode extension - [campaign #239] STEP 1 — SEED PORT: phronesis 54L VSCode extension → AffineScript #240 CLOSED 2026-05-30
- STEP 2: TAIL BATCH 1 - pure-logic small repos - [campaign #239] STEP 2 — TAIL BATCH 1: pure-logic small repos (≤3 files each) #241 CLOSED 2026-05-30
- STEP 3: STDLIB FILL - gaps surfaced by step 2 - [campaign #239] STEP 3 — STDLIB FILL: discharge gaps surfaced by step 2 #242 (affinescript#504 armed; 6 gaps closed, 2 already-closed, 2 deferred)
- STEP 4-A: STDLIB FILL II - raw binary I/O - [campaign #239] STEP 4-A — STDLIB FILL II: raw binary I/O (Bytes constructor + LE getters/setters) #326 (NEW 2026-05-31, pre-req for raze-tui / ABI-test ports)
- STEP 4-B: STDLIB FILL III - randomness + perf.now - [campaign #239] STEP 4-B — STDLIB FILL III: randomness + time bindings #327 (NEW 2026-05-31, pre-req for property tests)
- STEP 4-C: TAIL BATCH 2 - per-repo 4-9 file mid-tier - [campaign #239] STEP 4 — TAIL BATCH 2: mid-tier pure-logic repos (4-9 files) #243
- STEP 4-D: cross-campaign sequencing - svalinn-rescript route via standards#252
- STEP 5: IDAPTIK DLC port - 52 files - [campaign #239] STEP 5 — IDAPTIK DLC port: 52 files (VM/instruction core) #244
- STEP 6: PLUGIN-HOST BINDINGS - cross-ref AS top-50 - [campaign #239] STEP 6 — PLUGIN-HOST BINDINGS: cross-ref AS top-50 roadmap #245
- STEP 7: PLUGIN REPOS - 5 repos / 70 files (post step 6) - [campaign #239] STEP 7 — PLUGIN REPOS: ~70 files in 5 repos (post step 6) #246
Dependency graph
step 1 LANDED -> step 2 LANDED -> step 3 (~ done) -> step 4-A (#326) + step 4-B (#327) -> step 4-C (#243) -> step 4-D -> step 5
step 6 (host bindings, parallel) -> step 7 (plugin repos)
Cross-references
- GitHub Projects board: https://github.com/users/hyperpolymath/projects/35 (Hyperpolymath Master Roadmap)
- Memory tracker: project_estate_ts_to_affinescript_2026_05_28.md
- 2026-05-31 session: session_2026_05_31_ts_to_as_step3_closure.md
- AS bindings parallel: project_affinescript_bindings_top50_roadmap.md
- V-lang precedent (completed 2026-05-28): project_estate_vlang_remediation_2026_05_28.md
- Layer-1 PRs: hypatia#375, hypatia#378, standards#235, standards#238, standards#247, reposystem#82
Scale summary
- LANDED so far: standards#235, docs+ci: mirror hypatia#378 TS carve-out extension (linguist + /deps/ + /vscode/) #238, docs(ROADMAP): add TS→AffineScript estate migration campaign section #247, reposystem#82, hypatia#375 + hypatia#378, phronesis#19, panic-attack#82, session-sentinel#25, tropical-resource-typing#15, nafa-app#23 + affinescript STEP-3 chore(deps): bump the actions group with 4 updates #445 + secret-scanner: add canonical .gitleaks.toml allowlist (unblocker for re-pinning after #500) #504 (armed).
- Realistic PR count remaining: ~50-70 across 38 repos
- Sessions estimate: 7-13+ (vs V-lang's 1 session for 16 deletion PRs)
- Critical path: STEP 3 ~ done -> STEP 4-A/4-B unlock STEP 4-C -> STEP 5 -> STEPs 6/7 already in parallel
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
documentationDocs, prose, diagrams, READMEs, ADRsDocs, prose, diagrams, READMEs, ADRsgovernancePolicy, rulesets, standards, compliance, and their enforcementPolicy, rulesets, standards, compliance, and their enforcementmeta:campaignCoordinated multi-repo push with a defined end stateCoordinated multi-repo push with a defined end statemeta:recurringRecurs on a schedule or by trigger; never finally closedRecurs on a schedule or by trigger; never finally closedmeta:umbrellaParent issue aggregating child issuesParent issue aggregating child issuesmigrationPorting between languages or toolchains (e.g. -> AffineScript)Porting between languages or toolchains (e.g. -> AffineScript)priority:p3Low - nice to haveLow - nice to havescope:estateAffects many or all repos across the estateAffects many or all repos across the estate
Activity
docs(ROADMAP): add TS→AffineScript estate migration campaign section (#…
feat(vscode): AffineScript port of extension (TS→AS campaign step 1 /…
feat(vscode): AffineScript port of extension (TS→AS campaign step 1 /…
feat(vscode): AffineScript port of extension (TS→AS campaign step 1 /…
feat(stdlib): Deno scripting surface — walk/args/exit/iso/regex/stder…
refactor(scripts): call exit() directly in main() — drop wrapper-defe…
feat(scripts): AffineScript port of check-ts-allowlist (STEP 2 seed, …
feat(scripts): AffineScript port of check-ts-allowlist (TS->AS campai…
feat(scripts+ci): swap governance TS-allowlist check to AffineScript-…
fix(scripts): make check-ts-allowlist.affine compile cleanly (follow-…
6 remaining items
hyperpolymath commentedon May 31, 2026
STEP 4-A/4-B PRs now armed (2026-05-31 PM)
3 sibling PRs queued — file sections are disjoint enough that natural merge order is #504 → #507 → #509 with mechanical rebases (no symbol-level conflicts). After all three land, STEP 4-C (#243 per-repo ports) becomes the critical path — first realistic ports: raze-tui's 6 binary-ABI test files (unblocked by #507), bofig's property/bench files (unblocked by #509), bofig's unit/e2e/aspect files (no extra binding needed).
port(ts->affine): unit/evidence_graph_test → AffineScript (STEP 4-C S…
feat(stdlib): close 6 STEP-3 Deno-ESM gaps surfaced by TS→AS ports (R…
hyperpolymath commentedon Jun 1, 2026
Status update — AS stdlib codegen landed; campaign waypoint shift (2026-06-01) 📌
For the campaign umbrella tracking here:
What landed (sourced):
What this means for the campaign:
lib/codegen_deno.ml+tests/codegen-deno/*).Action: No new mass-port being kicked off from this post — surfacing the status so campaign waypoints stay accurate. Dependent sub-tickets can re-evaluate parking once they verify their specific blockers are in the "now-closed" set above.
🤖 Cross-estate AS-status sweep on 2026-06-01.
hyperpolymath commentedon Aug 25, 2026
🔨 Owner ruling 2026-08-25 — AffineScript governs. This campaign stays LIVE.
This issue was blocked on a genuine contradiction between two canonical documents:
LANGUAGE-POLICY.adoc§1.2 (since 2026-07-29): "TypeScript is permitted under Bun … the former 'use ReScript instead' rule is retired".claude/CLAUDE.md(the file agents read first): bans TypeScript in favour of AffineScript.claude/CLAUDE.mdflagged the conflict against itself on 2026-08-07 and deliberately left it for an owner ruling rather than picking a side.The owner has now ruled: AffineScript governs.
LANGUAGE-POLICY.adoc§1.2 was the error.What this means concretely
The withdrawn text ran the runtime and language questions together. Separating them makes both documents coherent without touching Bun's position.
Why I am recording this here
I triaged this issue as a close-as-stale candidate on the strength of §1.2, and put the question to the owner before acting. Had I not asked, I would have closed a live campaign. Recording the ruling in-thread so the next reader — human or agent — does not repeat that reasoning from the same evidence.
One correction to the record
§1.2 justified retiring the rule by pointing at
ts-blocker.ymlbeing structurally incapable of failing (20 of 20 runs green; never once fired). That measurement is correct and stands. But it is evidence about the gate, not about the rule — a broken enforcement mechanism says nothing about whether the policy it failed to enforce was right. The remedy for a fake gate is to repair it and verify it both ways, not to withdraw the policy.Correction PR: #632
policy: rule the TypeScript/AffineScript conflict — AffineScript gove…
hyperpolymath commentedon Aug 27, 2026
Re-measured 2026-08-27 — 95 files in 9 repos, and 72 of those are deliberate
.ts/.tsxremainingNo
node_modules/vendor/depshits at all — the census is clean.72 of the 95 are
proven's published polyglot bindings —bindings/typescript/src36,bindings/deno/src28,bindings/assemblyscript/src7. That is a deliberate consumer surface, not migration debt.Excluding those: 23 files in 8 repos, largest
metadatastician/stapeln7 andmetadatastician/svalinn5 — both now in the other org.Step status
Closed: #240, #241, #242, #245, #326, #327 — and #243, #244, #246 closed today on measured zero counts.
Recommend: this umbrella is effectively complete at 23 genuine files. Close it or rescope to those 23.
policy: the VSCode TypeScript carve-out's unblock condition is alread…
docs(roadmap): point the Projects board at metadatastician/projects/2
docs(roadmap): point the Projects board at metadatastician/projects/2 (…