Skip to content

Commit a8d84d7

Browse files
Merge branch 'main' into docs/bindings-roadmap-top50
Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
2 parents cf7db9f + 17579dc commit a8d84d7

39 files changed

Lines changed: 2975 additions & 221 deletions

.github/workflows/spark-theatre-gate.yml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,17 @@ on:
1313
permissions:
1414
contents: read
1515

16-
# Actions concurrency pool. Applied only to read-only check workflows
17-
# (no publish/mutation), so cancelling a superseded run is always safe.
18-
concurrency:
19-
group: ${{ github.workflow }}-${{ github.ref }}
20-
cancel-in-progress: true
16+
# Note: NO workflow-level `concurrency:` block here. The reusable
17+
# workflow in standards already declares concurrency on the same key
18+
# (`${{ github.workflow }}-${{ github.ref }}` — which resolves to the
19+
# CALLER'S workflow name in reusables). Stacking both blocks causes
20+
# GitHub to reject the workflow at run-creation time with a
21+
# `startup_failure`, so no `check_run` is ever emitted and every PR's
22+
# required `spark-theatre-gate / SPARK Theatre Gate` context stays
23+
# unsatisfied. Empirically: PR #379 (2026-05-27) added this block; all
24+
# 410+ runs since have been `startup_failure`, blocking auto-merge
25+
# across the repo and forcing a 14-PR admin-merge sweep on
26+
# 2026-05-28. See hypatia#376 BP008 for the class-level detector.
2127

2228
jobs:
2329
spark-theatre-gate:

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ this project aims to follow [Semantic Versioning](https://semver.org/spec/v2.0.0
2020

2121
### Added
2222

23+
- feat(stdlib/Http): RSR rewire — surface `hpm-http-rsr` Zig FFI (10 server-side externs: listen / port / free / accept / method / path / header / body / respond / request-free) + opaque `HpmHttpServer` + `HpmHttpRequest` types; native-only (#425)
24+
- feat(stdlib/json): v0.3 — RSR rewire to `hpm-json-rsr` Zig FFI (11 externs + opaque `HpmJsonValue` + `parse` / `to_json`), Deno-ESM lowering via `__as_hpmJson*` shims (#421)
2325
- feat(parser): trailing-comma in fn params and expr lists (Refs gitbot-fleet#148) (#370)
2426
- feat(lexer): underscore-prefix idents `_key`/`_unused` (Refs gitbot-fleet#148) (#373)
2527
- feat(parser): record-update spread at start `#{ ..base, f: v }` (Refs gitbot-fleet#148) (#376)

affinescript-pixijs/ffi/zig/src/main.zig

Lines changed: 0 additions & 27 deletions
This file was deleted.

affinescript-pixijs/package.json

Lines changed: 0 additions & 31 deletions
This file was deleted.

affinescript-pixijs/src/abi/Pixi.idr

Lines changed: 0 additions & 61 deletions
This file was deleted.

affinescript-pixijs/src/pixi.as

Lines changed: 0 additions & 36 deletions
This file was deleted.

docs/alib-roadmap.adoc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,10 @@ edge-case requirements.
135135
|Mechanical comparison; ensures cross-language portability of code written against the aLib surface.
136136

137137
|10
138-
|*Conformance module* — `stdlib/alib.affine` re-exporting the 20 ops under their aLib names
139-
|``
138+
|*Conformance module* — `stdlib/alib.affine` re-exporting the 22 ops under their aLib names (was "20"; current aggregate.json v0.1.0 has 22 across 6 categories: 5 arithmetic, 6 comparison, 3 logical, 3 string, 4 collection, 1 conditional)
139+
|``
140140
|T1
141-
|Single import point for consumers wanting the *aLib surface* rather than the *AffineScript-idiomatic surface*.
141+
|Single import point for consumers wanting the *aLib surface* rather than the *AffineScript-idiomatic surface*. Landed 2026-05-28.
142142
|===
143143

144144
== Tier 2 — Conformance runner & infrastructure
@@ -153,9 +153,9 @@ aLib's "method" actually testable for our language.
153153

154154
|11
155155
|*`aggregate.json` schema loader* — parse aLib's v1.1.0 schema in AffineScript (or via build tool)
156-
|``
156+
|``
157157
|T2
158-
|First step; feeds every later runner item.
158+
|First step; feeds every later runner item. Landed 2026-05-28 as `stdlib/AlibSchema.affine` (Approach A — AffineScript-side parser over the `hpm_json_*` lazy-handle FFI from `stdlib/json.affine`). Public entry points: `parse_schema(src) -> Result<AlibSchema, String>`, `load_schema(path)`, `load_estate_schema()`. Captures `name` / `category` / `signature_string` / `semantics.purpose` / `test_cases[]` (with `description` + `input_count`) per op — sufficient for the #12 dispatch loop.
159159

160160
|12
161161
|*Test-vector executor* — iterate `operations[].test_cases[]`, dispatch to the corresponding `alib.affine` op, compare output

docs/bindings-roadmap.adoc

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,33 +49,33 @@ no further significant ReScript → AffineScript work is tractable.
4949

5050
|1
5151
|*PixiJS core* (Application, Container, Sprite, Graphics, Text, Ticker, FederatedEvent)
52-
|`◐` scaffold
53-
|`affinescript-pixijs`
54-
|idaptik `src/bindings/Pixi.res`; all 215 `src/app/*.res` files depend on this. Currently 1 `.as` stub + 1 Idris2 ABI + 1 Zig FFI; needs full PixiJS 8.x surface.
52+
|`◑` partial (Application / Container / Sprite / Graphics / Text / Texture / Ticker landed; FederatedEvent + extensive accessor coverage deferred)
53+
|`stdlib/Pixi.affine` (eventual home: `affinescript-pixijs` as a separate repo per the SNIFs/typed-wasm precedent)
54+
|idaptik `src/bindings/Pixi.res`; all 215 `src/app/*.res` files depend on this. Restarted 2026-05-28 — the prior `affinescript-pixijs/` directory used the obsolete `.as` extension + AGPL-3.0-or-later headers + a Zig→C→WASM-import architecture incompatible with the Deno-ESM emitter; it was deleted and the surface rebuilt in `stdlib/Pixi.affine` matching the wasmCall / motion pattern. Test fixture: `tests/codegen-deno/pixi_smoke.{affine,harness.mjs}`. Follow-ups: extensive Container accessors (anchor, scale, pivot, parent, zIndex, eventMode, filters, hitArea); FederatedEvent + on/off pointer-event surface; Point/Rectangle/Circle helper types; sprite atlases.
5555

5656
|2
5757
|*@pixi/sound* (`Sound.from`, play, stop, volume, setVolume, loop)
58-
|`○`
59-
|`affinescript-pixijs` sub-module, or `affinescript-pixi-sound`
60-
|idaptik `src/bindings/PixiSound.res`; BGM + SFX.
58+
|`◐` scaffold (from / play / stop / pause / resume / setVolume / setLoop landed)
59+
|`stdlib/PixiSound.affine` (eventual home: `affinescript-pixijs` sub-module, or `affinescript-pixi-sound`)
60+
|idaptik `src/bindings/PixiSound.res`; BGM + SFX. Initial surface (`pixiSoundFrom` / `pixiSoundPlay` / `pixiSoundStop` / `pixiSoundPause` / `pixiSoundResume` / `pixiSoundSetVolume` / `pixiSoundSetLoop`) lands in `stdlib/` parallel to Motion / Http / Sqlite / Crypto; consumer provides `globalThis.__as_pixi_sound` (the `Sound` named export from `@pixi/sound`) at module-init time. Test fixture: `tests/codegen-deno/pixisound_smoke.{affine,harness.mjs}`. Follow-ups: `Sound.add` (multi-source registry), sprite atlases, async load (await + onload), `pauseAll` / `stopAll` / `resumeAll`, the `sound` singleton's filter pipeline.
6161

6262
|3
6363
|*@pixi/ui* (Button, FancyButton, Switch, Slider, Input, ScrollBox)
64-
|`○`
65-
|`affinescript-pixijs` sub-module
66-
|idaptik `src/bindings/PixiUI.res`; all HUD / menu code.
64+
|`◐` scaffold
65+
|`stdlib/PixiUI.affine` (eventual home: `affinescript-pixijs` sub-module)
66+
|idaptik `src/bindings/PixiUI.res`; all HUD / menu code. MVP surface (Button / FancyButton / Slider / Switch — `new` + primary callback + `AsContainer` upcast) lives in `stdlib/` alongside Pixi / PixiSound; consumer provides `globalThis.__as_pixi_ui` at module-init time. Test fixture: `tests/codegen-deno/pixiui_smoke.{affine,harness.mjs}`. Deferred follow-ups: Input (text-entry + focus + value), ScrollBox (scroll position + viewport), full event surface (onHover / onOut / onDown / onUp), FancyButton textures-per-state accessors, Slider min/max/step accessors.
6767

6868
|4
6969
|*motion* (animate, animateMini, tween, ease, spring)
70-
|`○`
71-
|`affinescript-motion`
72-
|idaptik `src/bindings/Motion.res`; player + UI transitions.
70+
|`●` usable
71+
|`stdlib/Motion.affine` (eventual home: `affinescript-motion`)
72+
|idaptik `src/bindings/Motion.res`; player + UI transitions. Full surface (`motionAnimate` / `motionAwait` / `motionCancel` / `motionAnimateMini` / `motionTween` / `motionSpring` / `motionEase`) lives in `stdlib/` parallel to Http / Sqlite / Crypto; consumer provides `globalThis.__as_motion` at module-init time. Test fixture: `tests/codegen-deno/motion_smoke.{affine,harness.mjs}` exercises every extern. Remaining follow-ups (out of scope for `●`): typed keyframe shapes, typed transform-property surface, migration to a dedicated `affinescript-motion` package.
7373

7474
|5
7575
|*WASM-exports calling pattern* — invoke individual `exports.fn_name(args)` from a `WasmExports` value
76-
|`◐` host-side; AS-side `○`
77-
|`stdlib/Deno.affine` extension or new `stdlib/wasm.affine`
78-
|`stdlib/Deno.affine` already exposes `wasmInstance(bytes) -> WasmExports` + the type, but no surface to *call* exports. idaptik `vm/wasm` is blocked here; ~30 per-Zig-fn extern fns needed, or one generic `wasm_call(exports, name, args) -> Float`. *Smallest scope, highest leverage — recommended kickoff.*
76+
|`●` usable (Option A landed)
77+
|`stdlib/Deno.affine`
78+
|`wasmCall(exports: WasmExports, name: String, args: [Float]) -> Float` lowers to `Number(exports[name](...args))` on `--deno-esm`. AS-side surface + docstring example landed in `stdlib/Deno.affine`; round-trip exercised by `tests/codegen-deno/wasm_call.{affine,harness.mjs}` against a hand-built 41-byte wasm module exporting `add(i32, i32) -> i32`. *Option A (generic) — typed per-Zig-fn shims can layer on top per-consumer if needed.* Closes #414 via host-side #422 + AS-side this PR.
7979

8080
|6
8181
|*Phoenix Channels / WebSocket* (Socket connect/disconnect, Channel join/leave/push, presence)
@@ -390,10 +390,12 @@ Build, test, and cross-language surface.
390390
bindings, four (#1, #2, #3, and #4 by extension) are PixiJS-ecosystem.
391391
Investing in `affinescript-pixijs` unblocks the largest single chunk
392392
of idaptik's 215-file `src/app/` tree.
393-
. *WASM-exports calling is a one-day fix with high leverage.* Item #5
394-
— adding `extern fn wasm_export_call(exports: WasmExports, name: String, args: [Float]) -> Float`
395-
to `stdlib/Deno.affine` (or 30 per-Zig-fn externs) unblocks idaptik
396-
`vm/wasm` *and* every future WASM-host consumer in the estate.
393+
. *WASM-exports calling LANDED.* Item #5 — `wasmCall(exports, name, args) -> Float`
394+
in `stdlib/Deno.affine` ships the generic Option A surface; idaptik
395+
`vm/wasm` and every future WASM-host consumer in the estate can now
396+
call individual exports without a per-fn extern. Typed per-Zig-fn
397+
shims can layer on top per-consumer where the discipline is worth
398+
the brittleness.
397399
. *DOM is closest to done* — issue #255 (for-in / while wasm codegen)
398400
is the blocker, not the binding surface itself. That's a codegen bug,
399401
not a binding gap; classified separately so it doesn't get re-scoped

docs/stdlib-roadmap.adoc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,16 @@ checker accepts code that the runtime can't execute.
100100
|Same site as #1; the pilot reverted from `++` to `Cons` calls.
101101

102102
|3
103-
|*`for x in xs` codegen* — wasm codegen for `for-in` (issue #255)
104-
|`◯` blocked-by-#255
103+
|*`for x in xs` codegen* — wasm codegen for `for-in` (closed as #257)
104+
|`●`
105105
|N/A (codegen)
106-
|Stdlib-adjacent: any iteration over a `list` triggers this. *Not a stdlib gap — a codegen bug.* Listed so it doesn't get re-scoped as stdlib work.
106+
|Stdlib-adjacent: any iteration over a `list` triggers this. *Not a stdlib gap — a codegen bug.* Closed by PR #257 (2026-05-19).
107107

108108
|4
109109
|*`while` + `mut` codegen* — same codegen surface as #3
110-
|`◯` blocked-by-#255-adjacent
110+
|`●`
111111
|N/A (codegen)
112-
|Same disposition as #3.
112+
|Same disposition as #3 — closed by PR #257.
113113

114114
|5
115115
|*Cross-file `use` resolvability* — `use stdlib::Option` works from a single-file standalone check

0 commit comments

Comments
 (0)