From 93a96755f3d36f600b386d4d14eca261cfc4fffc Mon Sep 17 00:00:00 2001 From: Nicolas Maman Date: Fri, 18 Sep 2026 00:40:41 -0300 Subject: [PATCH 1/5] ci: pin aeb past the orchestrator token wall, and Aether 0.681.0 with it The fan-out orchestrator is one generated main file, and aetherc lexes a main file into a fixed 50,000-token array. aeb v0.297's generator spent ~360 tokens per node, so this tree's 137 nodes sat at 49,412 and the 138th (#140, tests/min_size) failed the whole fan-out with "source file exceeds maximum token limit" naming no file. aeb main (9bfd8e88, aeb#15) emits the per-node bookkeeping once; the same tree is 7,227 tokens. Every aeb since v0.302 compiles its own aeb-main against bldr, which needs std.zip (0.667), std.strarr (0.675) and os.arch() (0.681), so the Aether pin moves to 0.681.0 in the same commit. Nothing in the 0.646-0.681 notes removes or changes anything this tree uses; the matrix on this commit is the verification. --- .github/workflows/ci.yml | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a9d891f..152553d7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -154,7 +154,18 @@ jobs: # `extern lrint(x: float) -> long` (unspellable libm prototype: an # ERROR on macOS/iOS where long is long long). Migrating those 30 to # math.lrint remains follow-up, not done here. - AETHER_REF: ${{ vars.AETHER_REF || 'v0.645.0' }} + # v0.681.0 (2026-09-17). Forced by the aeb move below, not chosen: + # every aeb since v0.302 compiles its own `aeb-main` against + # `bldr`, which imports std.zip (0.667), std.strarr (0.675) and + # calls os.arch() (0.681), so `make install` of that aeb needs + # this on PATH. Scanned the 0.646-0.681 notes: additive stdlib + # (std.zip, std.strarr, std.cbor, std.resp, fs.find_ext & co.), + # a 4.5x faster type-check (0.666), @c_callback emitted weak + # (0.677, two TUs sharing one callback no longer collide at + # link), -fPIC on --emit=lib objects (0.680). No grammar or + # removed-API change this tree touches. The matrix run on this + # bump is the verification. + AETHER_REF: ${{ vars.AETHER_REF || 'v0.681.0' }} # v0.297 (2026-09-06), bumped alongside the aether v0.645.0 move and # verified building the whole fan-out under it (full matrix green). # Strict forward move from v0.296. aeb is not implicated in any of the @@ -166,7 +177,18 @@ jobs: # `Undefined function 'bldr.build'`). v0.282 itself carried b1bfa5e # (encode_name ae-escapes a dot-prefixed fan-out root so `.all.ae` # links). v0.297 carries all of that, so this is a strict move forward. - AEB_REF: ${{ vars.AEB_REF || 'v0.297' }} + # + # 9bfd8e88 (2026-09-18, main after aeb#15; becomes the next tag + # when one is cut — install.sh takes a SHA). Carries the fix this + # tree needed: the fan-out orchestrator is one generated main + # file, and aetherc lexes a main file into a fixed 50,000-token + # array. The old generator spent ~360 tokens per node, so 137 + # nodes sat at 49,412 and the 138th (#140, tests/min_size) failed + # the whole fan-out with "source file exceeds maximum token limit" + # naming no file. The generator now emits the per-node bookkeeping + # once: the same tree is 7,227 tokens. aether#2059 asks for the + # compiler-side cap to go too. + AEB_REF: ${{ vars.AEB_REF || '9bfd8e88952cce71456fcb8329363cf872a20cc9' }} run: | curl -fsSL https://raw.githubusercontent.com/aether-lang-dev/aether/main/get.sh \ | PREFIX="$HOME/.local" sh From 05fbbdae7471f97401a19fdc57ed547440496844 Mon Sep 17 00:00:00 2001 From: Nicolas Maman Date: Fri, 18 Sep 2026 01:13:06 -0300 Subject: [PATCH 2/5] LisMusic: player_position_ms / player_duration_ms, so they do not collide with std.audio Under Aether 0.681 a local function whose name matches an imported C symbol is E1001: audio_position_ms / audio_duration_ms are std.audio's own externs. Renamed; nothing outside lis_audio.ae called them. --- apps/LisMusic/lis_audio.ae | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/LisMusic/lis_audio.ae b/apps/LisMusic/lis_audio.ae index daeb0a17..90bc718c 100644 --- a/apps/LisMusic/lis_audio.ae +++ b/apps/LisMusic/lis_audio.ae @@ -26,7 +26,7 @@ extern malloc(size: int) -> ptr exports ( Player, mk_player, close_audio, play_local, play_net, start_play, stop_play, is_playing, cur_title, cur_author, set_voice, trans_time, seek_frac, - audio_position_ms, audio_duration_ms + player_position_ms, player_duration_ms ) struct Player { @@ -125,11 +125,11 @@ seek_frac(p: *Player, frac: float) { } // Live position / duration in ms (for the seek slider + time labels). -audio_position_ms(p: *Player) -> long { +player_position_ms(p: *Player) -> long { if p.src == null { return 0 } return audio.position_ms(p.src) } -audio_duration_ms(p: *Player) -> long { +player_duration_ms(p: *Player) -> long { if p.src == null { return 0 } return audio.duration_ms(p.src) } From 8bd8d0631865919a523775cc4bcb1b34cac060db Mon Sep 17 00:00:00 2001 From: Nicolas Maman Date: Fri, 18 Sep 2026 01:14:12 -0300 Subject: [PATCH 3/5] ci.sh: keep make's own failure lines out of the fan-out diagnostic Under the parallel scheduler every failing node costs one 'make: *** [bldr.mk:N: label] Error 1', printed before aeb's per-node 'FAILED (see )' dump. A change that broke every node (the 0.681 bump) filled the 60-line budget with make lines and the actual compiler diagnostic never reached the CI log. --- ci.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ci.sh b/ci.sh index 294a6541..7c8d76a2 100755 --- a/ci.sh +++ b/ci.sh @@ -427,8 +427,14 @@ else # error names the missing symbol on the lines AFTER the match, so print # trailing context or the actual cause is lost (that is how an undefined # symbol reached CI as four unattributed line numbers). + # + # And not make's own lines: under the parallel scheduler every node that + # fails costs one `make: *** [bldr.mk:N: label] Error 1`, printed BEFORE + # aeb's per-node "FAILED (see )" dump, so a change that breaks every + # node (a compiler bump) filled the 60 lines with 60 make lines and the + # actual diagnostic never reached the CI log (#147). grep -nEi -A6 "error|failed|undefined|cannot |no such file" /tmp/ci_build_all.log \ - | grep -viE "^[0-9]+[:-] *build: " | head -60 | sed 's/^/ /' + | grep -viE "^[0-9]+[:-] *build: |make: \*\*\*" | head -60 | sed 's/^/ /' echo " --- last 60 lines ---" tail -60 /tmp/ci_build_all.log | sed 's/^/ /' FAIL=$((FAIL + 1)) From 756e4ab125574a06475506daf9d643978bb61249 Mon Sep 17 00:00:00 2001 From: Nicolas Maman Date: Fri, 18 Sep 2026 04:05:15 -0300 Subject: [PATCH 4/5] ci: pin Aether 0.683.0, the release carrying the E0200 container fix 0.667-0.682 reject every ui.vstack(10) { } in every app: E0200 discriminated a block setter from a container by 'the module also defines a builder', and ui/module.ae has four builders beside ~50 _ctx-first containers. aether#2060 (in 0.683.0) also requires the callee to yield no value. All 260 .ae sources here type-check under it. --- .github/workflows/ci.yml | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 152553d7..1d178b80 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -154,18 +154,31 @@ jobs: # `extern lrint(x: float) -> long` (unspellable libm prototype: an # ERROR on macOS/iOS where long is long long). Migrating those 30 to # math.lrint remains follow-up, not done here. - # v0.681.0 (2026-09-17). Forced by the aeb move below, not chosen: + # v0.683.0 (2026-09-18). Forced by the aeb move below, not chosen: # every aeb since v0.302 compiles its own `aeb-main` against # `bldr`, which imports std.zip (0.667), std.strarr (0.675) and # calls os.arch() (0.681), so `make install` of that aeb needs - # this on PATH. Scanned the 0.646-0.681 notes: additive stdlib - # (std.zip, std.strarr, std.cbor, std.resp, fs.find_ext & co.), - # a 4.5x faster type-check (0.666), @c_callback emitted weak - # (0.677, two TUs sharing one callback no longer collide at - # link), -fPIC on --emit=lib objects (0.680). No grammar or - # removed-API change this tree touches. The matrix run on this - # bump is the verification. - AETHER_REF: ${{ vars.AETHER_REF || 'v0.681.0' }} + # at least 0.681 on PATH. Scanned the 0.646-0.681 notes: additive + # stdlib (std.zip, std.strarr, std.cbor, std.resp, fs.find_ext & + # co.), a 4.5x faster type-check (0.666), @c_callback emitted + # weak (0.677, two TUs sharing one callback no longer collide at + # link), -fPIC on --emit=lib objects (0.680). + # + # WHY NOT 0.681 OR 0.682: 0.667 added E0200, "block setter called + # as a node builder", discriminating by "the callee's module also + # defines a builder". ui/module.ae has four builders (window, + # render_to, record, nav_page) beside ~50 _ctx-first containers, + # so under 0.667-0.682 every `ui.vstack(10) { ... }` in every app + # is a compile error and the whole fan-out is red (#147's first + # run; the diagnostic was buried under make's own lines, see the + # ci.sh fix in the same PR). 0.683.0 carries aether#2060: the rule + # also requires the callee to yield no value, which is what + # separates a container (returns the handle its block runs + # inside) from a setter. All 260 .ae sources here type-check + # under it. The one genuine casualty of the move was LisMusic's + # audio_position_ms/audio_duration_ms colliding with std.audio's + # (E1001), renamed in the same PR. + AETHER_REF: ${{ vars.AETHER_REF || 'v0.683.0' }} # v0.297 (2026-09-06), bumped alongside the aether v0.645.0 move and # verified building the whole fan-out under it (full matrix green). # Strict forward move from v0.296. aeb is not implicated in any of the From 87303564c84927b97705594d9b00eea636f570e9 Mon Sep 17 00:00:00 2001 From: Nicolas Maman Date: Fri, 18 Sep 2026 05:42:40 -0300 Subject: [PATCH 5/5] ci: pin Aether 0.684.0, the release carrying the closure-return fix Under 0.682-0.683 table_demo aborts at startup on macOS and Linux: the table cell callback returns string.from_int(p.kb) on one path and p.name on the other, was typed by its first return (ptr) and so never copied the literal out, while its -> string caller (owning since #2054) freed it. aether#2070, in 0.684.0, makes any string-typed return site classify the closure as string-returning. --- .github/workflows/ci.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d178b80..5e2d8d90 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -154,7 +154,7 @@ jobs: # `extern lrint(x: float) -> long` (unspellable libm prototype: an # ERROR on macOS/iOS where long is long long). Migrating those 30 to # math.lrint remains follow-up, not done here. - # v0.683.0 (2026-09-18). Forced by the aeb move below, not chosen: + # v0.684.0 (2026-09-18). Forced by the aeb move below, not chosen: # every aeb since v0.302 compiles its own `aeb-main` against # `bldr`, which imports std.zip (0.667), std.strarr (0.675) and # calls os.arch() (0.681), so `make install` of that aeb needs @@ -178,7 +178,19 @@ jobs: # under it. The one genuine casualty of the move was LisMusic's # audio_position_ms/audio_duration_ms colliding with std.audio's # (E1001), renamed in the same PR. - AETHER_REF: ${{ vars.AETHER_REF || 'v0.683.0' }} + # + # WHY NOT 0.683: under 0.682-0.683 table_demo aborts at startup on + # macOS AND Linux (free(): invalid pointer). 0.682's #2054 made a + # `-> string` function that returns `cb(...)` through a bare fn + # own its result, on the promise that a string-returning closure + # copies out whatever it returns. The table's cell callback returns + # string.from_int(p.kb) on one path (declared `-> ptr`) and p.name + # on the other, was typed by its FIRST return, and so was not a + # string closure: the literal reached the caller uncopied and was + # free()d. Reproduced natively on Windows (STATUS_HEAP_CORRUPTION) + # and root-caused with gdb; 0.684.0 carries aether#2070 (any + # string-typed return site makes the closure a string closure). + AETHER_REF: ${{ vars.AETHER_REF || 'v0.684.0' }} # v0.297 (2026-09-06), bumped alongside the aether v0.645.0 move and # verified building the whole fan-out under it (full matrix green). # Strict forward move from v0.296. aeb is not implicated in any of the