Repository navigation
[campaign] AffineScript top-50 framework bindings roadmap (UMBRELLA) #446
Description
Activity
- addedmajorMajor issue — significant scope, broader impact than a feature/bugMajor issue — significant scope, broader impact than a feature/bugbindingsABI, FFI, WASM, and cross-language interop surfacesABI, FFI, WASM, and cross-language interop surfaces
on May 30, 2026 - added a commit that references this issue
on May 30, 2026 - addeddocumentationDocs, prose, diagrams, READMEs, ADRsDocs, prose, diagrams, READMEs, ADRs
on May 30, 2026 documentationlabel applied to this umbrella.STEP 1 status: shipped
The umbrella's STEP 1 deliverable ("Land canonical roadmap doc —
docs/bindings-roadmap.adoc") is already on disk at https://github.com/hyperpolymath/affinescript/blob/main/docs/bindings-roadmap.adoc (454 lines, compiled 2026-05-28 from the idaptik PR #107 pilot + estate-wide binding-need inventory + general-purpose modern-language binding patterns).The doc carries:
- Reading guide for the
○ / ◐ / ◑ / ●status vocabulary - All 50 bindings organised by tier with status + notes
- Cross-references to ROADMAP.adoc and ECOSYSTEM.adoc as the canonical bindings-side companion view
- Compiled-from-which-source provenance lines
STEPs 2-5 (tier sub-issues #450-#454, kickoff pick, parallel tier execution, cross-campaign coordination) remain open as the umbrella's ongoing work scope. Tier 1 #5 (WASM-exports calling pattern) shipped as #455 / PR #467.
This umbrella stays open per its multi-tier scope.
- Reading guide for the
- added 5 commits that reference this issue
on May 30, 2026 Campaign status update — 2026-05-31
Shipped since the umbrella body (2026-05-30 → 2026-05-31)
Tier 1 # Item Status #5 WASM-exports calling pattern (Option B) ✅ MERGED PR #467 ( stdlib/Deno.affineWasmValue+wasm_export_call+ 8 codegen entries)#1 PixiJS core — Container 8.x transform-and-event expansion 🟡 PR #502 auto-merge armed — 11 new externs ( scale/pivot/rotation/alpha/zIndex/sortableChildren/eventMode/cursor+on/off+ Spriteanchor)— Zig C-ABI FFI patterns doc (bindings #19) 🟡 PR #474 auto-merge armed — docs/specs/zig-ffi-patterns.adoc, recipe for binding new Zig exports +bindings-roadmap.adocrow #19 promoted to●Follow-up sub-issues filed (from #455 deferred scope)
Closed #455 (Tier 1 #5 kickoff) deferred 4 items per the owner's Option-B scope breakdown. Now tracked separately:
Sub-issue Scope #497 Zig FFI implementation for wasm_export_calldispatch (native/linear-memory wasm host)#498 Idris2 ABI proof-carrier doc for WasmValue+wasm_export_call#500 examples/wasm-exports-demo.affineend-to-end usage demo#501 wasm_export_callZig-FFI smoke-test (paired with #497)Where the campaign sits
- ✅ STEP 1 (canonical roadmap doc) — landed PR Docs/bindings roadmap top50 #441
- ✅ STEP 2 (per-tier sub-issues [#446 STEP 2] Tier 1 — idaptik blockers (10 bindings) #450–[#446 STEP 2] Tier 5 — tooling / interop (10 bindings) #454) — filed
- ✅ STEP 3 (kickoff: WASM-exports) — shipped via feat(stdlib): WasmValue + wasm_export_call typed wasm-exports binding (closes #455) #467 + 4 follow-ups ([#446 Tier 1 #5 follow-up] Zig FFI implementation for wasm_export_call dispatch #497/[#446 Tier 1 #5 follow-up] Idris2 ABI proof-carrier doc for wasm_export_call #498/[#446 Tier 1 #5 follow-up] examples/wasm-exports-demo.affine — end-to-end usage demo #500/[#446 Tier 1 #5 follow-up] wasm_export_call Zig-FFI smoke-test #501) filed
- 🔄 STEP 4 (parallel tier execution) — Tier 1 ci: Bump actions/setup-node from 4.0.2 to 6.3.0 #1 expansion in flight (feat(stdlib): PixiJS 8.x Container transform-and-event surface (bindings #1) #502); doc-side STEP 4-adjacent Roadmap tracking + Zig-FFI doc (#19) + hex/base64 encoding (#25) + Int-division codegen fix (#478) #474 in flight
- ⏳ STEP 5 (cross-campaign coordination) — passive; consumers can start picking sub-issues as bandwidth allows
Remaining Tier 1 surface (per
bindings-roadmap.adoc)After #502 lands:
- Row ci: Bump actions/setup-node from 4.0.2 to 6.3.0 #1 (PixiJS) — still
◑partial; deferred: typedFederatedPointerEventaccessors,parentread accessor with Option-null handling, Point/Rectangle/Circle helper types, sprite atlases, filters, hitArea - Row ci: Bump dtolnay/rust-toolchain from f7ccc83f9ed1e5b9c81d8a67d7ad1a747e22a561 to efa25f7f19611383d5b0ccf2d1c8914531636bf9 #2 (@pixi/sound) —
◐scaffold; deferred: multi-source registry, async load, pauseAll/stopAll, filter pipeline - Row ci: Bump softprops/action-gh-release from 2.5.0 to 2.6.1 #3 (@pixi/ui) —
◐scaffold; deferred: Input, ScrollBox, full event surface, FancyButton textures-per-state, Slider accessors - Row ci: Bump trufflesecurity/trufflehog from 3.92.5 to 3.94.1 #6 (Phoenix Channels / WebSocket) —
○nothing built - Row ci: Bump github/codeql-action from 4.31.10 to 4.35.1 #7 (DOM) —
●/◯blocked-by-wasm codegen:for-in/whileloop bodies never execute in compiled programs (pre-existing, untested) #255 (codegen bug, not binding gap) - Row ci: Bump dtolnay/rust-toolchain from efa25f7f19611383d5b0ccf2d1c8914531636bf9 to 3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 #8 (WebGL/Canvas2D) —
○nothing built - Row ci: Bump actions/checkout from 4.1.1 to 6.0.2 #9 (IPC/postMessage) —
○nothing built - Row ci: Bump erlef/setup-beam from 1.17.5 to 1.24.0 #10 (Ajv coverage audit) —
◑partial; audit pending
Umbrella stays OPEN per its multi-tier scope.
- added a commit that references this issue
on May 31, 2026 Update — IPC binding shipped (Tier 1 #9)
PR #506 auto-merge armed 2026-05-31 —
stdlib/Ipc.affinelands the first concrete IPC / structuredClone surface.What ships
- 2 extern types (
MessageChannel,MessagePort) - 9 extern fns covering channel construction, port handoff, post + onmessage, start/close lifecycle, generic
targetPostMessage(Worker / iframe.contentWindow / self-from-worker), andstructuredCloneValuedeep-copy - No consumer init required —
MessageChannel,MessagePort, andstructuredCloneare standard web-platform globals (Deno, Node 16+, browsers, Web Workers) - Test fixture
tests/codegen-deno/ipc_smoke.{affine,harness.mjs}exercises port-pair round-trip with handler-identity preservation acrosson()calls + structuredClone reference-distinctness across nested arrays and objects
Row #9 status:
○→◑. Deferred items captured in the row note (transfer-list, BroadcastChannel, typedMessageEventaccessors, Worker constructors — Tier 3 #25).Tier 1 status board (updated)
# Item Status Pointer 1 PixiJS core ◑(Container 8.x transform-and-event surface expansion in flight)#502 2 @pixi/sound ◐Deferred follow-ups exist 3 @pixi/ui ◐Deferred follow-ups exist 4 motion ●Done 5 WASM-exports calling pattern ●#467 ✅; 4 follow-ups #497/#498/#500/#501 6 Phoenix Channels / WebSocket ○— 7 DOM ●/◯blocked-by-#255Codegen bug, not binding gap 8 WebGL / Canvas2D ○— 9 IPC / structuredClone ◑(this update)#506 10 Ajv coverage audit ◑Pending In-flight PRs touching the campaign
- Roadmap tracking + Zig-FFI doc (#19) + hex/base64 encoding (#25) + Int-division codegen fix (#478) #474 — Zig-FFI patterns doc (bindings refactor(manhattan-recovery): scope recovery + complete grammar refactor + rip dependent-type creep #19) + adjacent value (hex/base64 stdlib feat: migrate file extension from .as to .affine for GitHub Linguist … #25 + Int-div fix codegen: integer
/lowers to floating-point division on the JS-family backends #478) —auto-merge SQUASHarmed 07:01Z - feat(stdlib): PixiJS 8.x Container transform-and-event surface (bindings #1) #502 — PixiJS 8.x Container transform-and-event surface (Tier 1 ci: Bump actions/setup-node from 4.0.2 to 6.3.0 #1 expansion, 11 new externs) —
auto-merge SQUASHarmed - feat(stdlib): Ipc.affine — MessageChannel + structuredClone (bindings #9) #506 — IPC binding (this update, Tier 1 ci: Bump actions/checkout from 4.1.1 to 6.0.2 #9) —
auto-merge SQUASHarmed
All three are CI-queued due to estate-wide queue saturation; each will auto-merge as checks complete.
- 2 extern types (
hyperpolymath commented
on May 31, 2026 OwnerAuthorMore actionsSTEP-3 progress landed via PR #474 (merge commit
fb7e855)The bindings campaign advanced — umbrella stays open per its multi-tier scope (STEP 4 parallel execution + STEP 5 cross-campaign coordination are long-running by design).
What landed this session
- bindings refactor(manhattan-recovery): scope recovery + complete grammar refactor + rip dependent-type creep #19 (Zig FFI canonical patterns) → shipped as
docs/specs/zig-ffi-patterns.adoc; roadmap row ◐ → ●. The authoring recipe (per-backend host contract: wasm(import "env" …)vs Deno-ESM same-named host symbol), DOC-DEDUP-scoped against SPEC §2.10 / STDLIB-EXTERN-AUDIT / codegen-environment. Unblocks the RSR-convergence rewires ci: Bump trufflesecurity/trufflehog from 3.94.1 to 3.94.2 #11 / ci: Bump webfactory/ssh-agent from 0.9.1 to 0.10.0 #12 / feat: migrate file extension from .as to .affine for GitHub Linguist … #16. - Tracking section de-staled in
docs/bindings-roadmap.adoc(and the sibling stdlib/alib docs) — the(TBD)placeholders now point at the live umbrella ([campaign] AffineScript top-50 framework bindings roadmap (UMBRELLA) #446) + tier issues ([#446 STEP 2] Tier 1 — idaptik blockers (10 bindings) #450–[#446 STEP 2] Tier 5 — tooling / interop (10 bindings) #454) + kickoff ([#446 Tier 1 #5] WASM-exports calling pattern (recommended kickoff) #455).
Roadmap state now
Tier-1/2 item Status #5 WASM-exports calling pattern ● (shipped #455/#467) #19 Zig FFI canonical patterns ● (this PR) #1–#4 PixiJS/motion, #6–#10, #11–#18, #20 per docs/bindings-roadmap.adocrows (unchanged)Remaining (STEP 4/5)
Tiers 1–5 binding work continues demand-driven; the cross-campaign hand-offs to standards #252/#254/#239 STEP-4 are unchanged. No action needed on this umbrella beyond its ongoing tracking.
Session record:
docs/history/BINDINGS-STDLIB-CODEGEN-2026-05-31.{adoc,a2ml}.
Generated by Claude Code
- bindings refactor(manhattan-recovery): scope recovery + complete grammar refactor + rip dependent-type creep #19 (Zig FFI canonical patterns) → shipped as
- added 4 commits that reference this issue
on May 31, 2026 All three in-flight PRs MERGED 2026-05-31 ✅
PR Item Commit Mechanism #474 Zig-FFI patterns doc (bindings #19) + hex/base64 (stdlib #25) + Int-div fix (#478) fb7e855Owner admin-merge 07:22Z #502 PixiJS 8.x Container transform-and-event surface (Tier 1 #1, 11 externs) 44a0685Admin-merge 07:33Z after local verify clean (6 baseline-red governance checks pre-existing on main, per #467precedent)#506 Ipc.affine — MessageChannel + structuredClone (Tier 1 #9) 7ada658Admin-merge 07:33Z, same rationale Local verification before admin-merge
For #502 and #506, rebased onto current main (post-#474), then ran on each branch:
dune build bin/main.exe— clean (only expected parser warnings)dune runtest --force— 354 tests passtools/run_codegen_deno_tests.sh— all 18 harnesses pass (including the newpixi_smokeaccessors-flow +ipc_smoke)
Baseline-red governance checks
These 6 checks were FAILURE on the predecessor PR #467 (which also merged) and remain pre-existing red on main; they're not regressions from #502/#506:
governance / Language / package anti-pattern policygovernance / Guix primary / Nix fallback policygovernance / Security policy checksgovernance / Code quality + docsgovernance / Workflow security lintergovernance / Licence consistency
The other 21 checks (build, lint, all scan checks, Hypatia, etc.) are expected to pass per the additive shape of the changes; they remained QUEUED at admin-merge time due to estate-wide CI saturation.
Tier 1 status board after this session
# Item Status 1 PixiJS core ◑(Container 8.x transform-and-event surface landed)2 @pixi/sound ◐3 @pixi/ui ◐4 motion ●5 WASM-exports calling pattern ●(+ 4 deferred sub-issues #497/#498/#500/#501)6 Phoenix Channels / WebSocket ○7 DOM ●/◯blocked-by-#2558 WebGL / Canvas2D ○9 IPC / structuredClone ◑(MessageChannel + MessagePort + structuredClone landed)10 Ajv coverage audit ◑(audited; consumer-complete-but-narrow, expand on demand)Umbrella stays OPEN per its multi-tier scope; Tier 1 forward-progress sweep complete for this session.
- added a commit that references this issue
on May 31, 2026 Status update — AS stdlib codegen landed; campaign waypoint shift (2026-06-01) 📌
For the campaign umbrella tracking here:
What landed (sourced):
- affinescript#522 (2026-06-01) — Sqlite.affine codegen foundation; first stdlib extern with full Deno-ESM lowering + tests end-to-end.
- affinescript#504 (2026-06-01) — 6 Deno-ESM stdlib externs (stat helpers, byte ops, importMetaUrl) + wildcard-let codegen fix; closes 6 of 10 STEP-3 gaps in standards#242.
- affinescript#463 (2026-05-30) — non-ASCII Unicode escape emit in Deno-ESM.
- affinescript#421 — stdlib/json v0.3 via hpm-json-rsr Zig FFI.
What this means for the campaign:
- Stdlib extern → Deno-ESM lowering pattern is repeatable and tested (
lib/codegen_deno.ml+tests/codegen-deno/*). - STEP 3 / STEP 4 / megaport STEP 8 prerequisites partially closed (stdlib-extern side).
- Not yet sufficient for user-module codegen / hand-port → runtime replacement on its own; user-module emit + remaining stdlib primitives (affinescript#160 Http.fetch / stdlib: Dict / Map primitive (keyed associative container) #162 Dict/Map / etc.) remain the keystone gaps.
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.
- addedmeta:umbrellaParent issue aggregating child issuesParent issue aggregating child issuesmeta:campaignCoordinated multi-repo push with a defined end stateCoordinated multi-repo push with a defined end stateand removed
on Aug 26, 2026 - addedpriority:p3Low - nice to haveLow - nice to havescope:estateAffects many or all repos across the estateAffects many or all repos across the estatefeeds: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
Campaign overview
Land the AffineScript top-50 framework bindings roadmap. Compiled 2026-05-28 during post-PR-#107 (idaptik dlc-reversible pilot) planning, five tiers × 10 bindings. Drives the framework-binding development arc going upstream from idaptik into
hyperpolymath/affinescript+affinescript-pixijs+ new packages.State: planning UMBRELLA. List captured in memory (
project_affinescript_bindings_top50_roadmap); this issue lands it canonically + opens per-binding tracking once tier-issues are filed.Why this matters now
This roadmap is the shared Layer-4 dependency for THREE estate campaigns:
hyperpolymath/standards#252ReScript→AffineScript — STEP 4 (feat(parser): CORE-01 pt2 — &mut e exclusive-borrow surface (zero conflict delta) #269 stdlib gap-fill) depends on Belt/Js/RescriptCore equivalentshyperpolymath/standards#254JS→AffineScript — STEP 4 (feat(stdlib): ESC-03 — Dict/Map keyed container (stdlib/dict.affine) #274 binding-gap discharge) directly references this roadmaphyperpolymath/standards#239TS→AffineScript — STEP 6 (ESC-01: AffineScript has no raw/FFI escape — %%raw port target (Refs 229) #245 plugin-host bindings) is the same axisWithout this roadmap landing, all three campaigns' STEP-4 work is unscheduled.
Current state of binding packages (2026-05-28 inventory)
stdlib/Deno.affinestdlib/Vscode.affine,VscodeLanguageClient.affinestdlib/Http.affine,Crypto.affine,Network.affine,Sqlite.affine,Grammy.affine,Ajv.affineaffinescript-domfor-in/whilebug blocks runtimeaffinescript-pixijs.asfile + 1 Idris2 ABI + 1 Zig FFI; NOT functional. Largest single unblocker for idaptikaffinescript-viteaffinescript-teaaffinescript-deno-testThe 50 bindings (tier summaries)
Tier 1 — idaptik blockers (10): PixiJS core + sound + UI; motion; WASM-exports calling pattern; Phoenix Channels / WebSocket; DOM (unblock affinescript#255); WebGL/Canvas2D; IPC/postMessage for Gossamer; Ajv coverage audit.
Tier 2 — estate near-term (10): GitHub API (rewire to hpm-github-api-rsr); Anthropic API; HTTP coverage; raw WebSocket; SQLite coverage; Crypto rewire to hpm-crypto-rsr; Tauri 2.0; Dioxus; Zig FFI canonical patterns doc; Grammy coverage.
Tier 3 — broadly useful (10): Web Audio; Gamepad; Pointer/Touch/Keyboard/IME; IndexedDB; Workers; Streams (Fetch); Storage / Cache; Notifications; Geolocation/sensors; MediaDevices.
Tier 4 — backend/cloud (10): Postgres; Redis; S3/object-storage; GraphQL client; OpenTelemetry; OpenAI; Cloudflare API (not Workers, banned); Stripe; Supabase; Slack + Discord APIs.
Tier 5 — tooling/interop (10): Idris2 ABIs; Rust FFI; OCaml interop; Just integration; Vite plugin pattern; esbuild/Rollup plugin; Playwright; Testing coverage; VSCode coverage; generic LSP.
Recommended kickoff
wasm_export_call); unblocks idaptik vm/wasm AND every future WASM-host integration. Estimated < 1 day.Step plan (deferred — file as sibling issues when work begins)
docs/bindings-roadmap.adoc(this issue's deliverable)Excluded by policy
Cross-references
hyperpolymath/standards#252,#253,#254,#239project_affinescript_bindings_top50_roadmap.mdhyperpolymath/idaptik#107(MERGED)