Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
269 changes: 265 additions & 4 deletions CHANGELOG.md

Large diffs are not rendered by default.

46 changes: 24 additions & 22 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,28 +146,30 @@ bash tools/embed_stack_soak.sh # embed REPL soak inside a 64 KiB stack rlimit (

## Current state & where the detail lives

- **Latest release: v0.32.0** (2026-07-16) — the desktop-shell release:
lib/ui's gap series (#561–#577, #594), surfaced by DeslanStudio's port —
the toolkit's first real consumer — and closed. The toolkit now owns what
the shell hand-rolled: `handle_key` (#563, keyboard through `dispatch`
instead of trapped inside `app_loop`, priority pinned in one place),
`request_quit` (#564, ending the loop from a callback instead of `exit of
N` skipping `gfx_close`), clickable combobox dropdown items (#577 —
hit-test before closing, select by the click's own y, and exempt popups
from double-click detection), self-measuring `label` w/h + `auto_size`
(#561), `grid.owns_cells` + a configurable row-label gutter (#572),
piano-key release wherever the pointer lands (#570), hover feedback on
checkbox/toggle (#594), and **`menu_bar`** (#565 — owning its popup's
z-order via the `_render_popups` overlay pass + `_find_open_popup_at`,
since rendering above the tree is only half of z-order). Three of the ten
filed issues had already been fixed and were closed with probe output, not
re-fixed. (v0.31.0, 2026-07-14: DAW audio-I/O + live-synthesis — bulk
audio-I/O kernels #602/#603, the live audio-streaming primitive
`audio_stream_*` #612, `waveform_view` selection markers #610/#611.
v0.30.0, 2026-07-13: debugging-and-distribution + first-consumer —
`--step` tape stepper #418, tape format v2 #539, error carets/LSP ranges
#407, `--bundle` #413, entropy-walk cycle detection #571, gfx audio
capture #579 + buffer playback #578, the lib/ui input trio #567–#569.)
- **Latest release: v0.33.0** (2026-07-24) — the silent-wrong-answer release,
plus the primitives the app fleet forced. A sweep of the plausible-but-wrong-
at-rc=0 class: `regex_match` dropping every capture after a non-participating
group (#629), `json_decode` truncating long numbers by 50 orders of magnitude
(#628), four stdlib math functions returning confidently wrong values
(#638–#641), a module's top-level assignment rebinding its *importer's*
global (#673), a comprehension var and a same-named local splitting into two
bindings so later program text changed an earlier statement's result
(#633/#642), `report_value` calling a converging sequence `diverging` (#674),
and an observer LR gate that measured 100% "stable" while the loss was still
falling. Primitives, each requested by a consumer that hit the wall: four
DEFLATE codecs behind `make zlib` (#684 — `.xlsx`/`.gz` readable from
script), tape-captured `clock_unix` (#683), and C-backed `list_index_of` /
`list_contains` / `list_insert_at` / `list_slice` (#543/#544). Plus
`kill -USR1` live observer dumps (#660) and a test runner that fingerprints
its own binary mid-run, bounds every block against a runaway, and derives its
tally from block output after the hand-synced literals were caught
under-reporting by 169 asserts (#654). (v0.32.0, 2026-07-16: the
desktop-shell release — lib/ui's gap series #561–#577/#594, surfaced by
DeslanStudio's port and closed, incl. `menu_bar` #565 and `handle_key` #563.
v0.31.0, 2026-07-14: DAW audio-I/O + live-synthesis — bulk audio-I/O kernels
#602/#603, `audio_stream_*` #612, `waveform_view` markers #610/#611.
v0.30.0, 2026-07-13: debugging-and-distribution — `--step` tape stepper #418,
tape format v2 #539, error carets/LSP ranges #407, `--bundle` #413.)
Unreleased
work on `main`: see CHANGELOG.md `[Unreleased]`. Full version history:
**CHANGELOG.md** (don't re-narrate it here — tools/doc_drift_check.sh
Expand Down
11 changes: 9 additions & 2 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Roadmap

Current version: **0.32.0**
Current version: **0.33.0**

Recently shipped (0.28.0 → 0.32.0, 2026-07-08 → 07-16):
Recently shipped (0.28.0 → 0.33.0, 2026-07-08 → 07-24):

- **0.29.0** — the strategic headline landed: the **deterministic
cooperative task layer on the tape** (#408, seeded scheduler, zero
Expand All @@ -22,6 +22,13 @@ Recently shipped (0.28.0 → 0.32.0, 2026-07-08 → 07-16):
#594) surfaced by DeslanStudio's port and closed, including `menu_bar`
(#565), `handle_key`/`request_quit` (#563/#564), self-measuring `label`
(#561), and `dialog` children + `file_dialog` (#575).
- **0.33.0** — the silent-wrong-answer release plus the primitives the app
fleet forced: the plausible-but-wrong-at-rc=0 sweep (`regex_match` #629,
`json_decode` #628, four stdlib math bugs #638–#641, import top-level scope
#673, the listcomp/local double binding #633/#642, `report_value` #674), the
DEFLATE codecs behind `make zlib` (#684), tape-captured `clock_unix` (#683),
four C-backed list operations (#543/#544), `kill -USR1` live observer dumps
(#660), and the test-runner integrity pass (#681/#648/#654).

Full per-version detail lives in [CHANGELOG.md](CHANGELOG.md) — this file
is forward-looking.
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.32.0
0.33.0
2 changes: 1 addition & 1 deletion docs/llms.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# EigenScript — single-file reference for language models

> EigenScript v0.32.0. A small dynamically-typed language with one distinctive
> EigenScript v0.33.0. A small dynamically-typed language with one distinctive
> feature: an **observer** tracks every value's entropy/trend on each
> assignment, so convergence, stability, and oscillation are first-class. This
> file is the whole surface you need to generate correct `.eigs`. Models
Expand Down
32 changes: 30 additions & 2 deletions tests/test_vm_run_bytecode.eigs
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
# vm_run_bytecode — the self-hosting bootstrap bridge. Assemble a chunk from
# EigenScript values (code bytes + constant pool) and run it on the C VM.
# Opcodes/operands are exactly what compile_ast emits (16-bit operands are
# little-endian); this is what an EigenScript-written compiler will produce.
# Opcodes/operands are exactly what compile_ast emits (operands are
# little-endian, 16-bit except OP_LINE's, which is 32-bit since #630); this is
# what an EigenScript-written compiler will produce.
#
# This file is the ABI contract for external bytecode producers (ouroboros'
# self-hosted codegen, iLambdaAi's vendored copy of it). Changing an opcode's
# NUMBER or its OPERAND WIDTH breaks every one of them silently — a misaligned
# chunk runs as garbage at rc=0 — and their CI cannot see it, because they pin
# a release. So any such change belongs here, in the same PR (#704).

load_file of "lib/test.eigs"

Expand Down Expand Up @@ -153,4 +160,25 @@ catch es348:
assert_eq of [sl348, 1, "SET_LOCAL out-of-range slot raises (#348)"]
assert_eq of [vm_run_bytecode of [[GET_LOCAL,255,255, RETURN], []], null, "GET_LOCAL out-of-range reads null (missing-param semantics)"]

# --- #630/#704: OP_LINE's operand is 32-bit, and that width IS the ABI ---
# #630 widened this operand from 16 to 32 bits. No opcode number changed, so
# nothing here failed — this file emitted no OP_LINE at all — and the break
# only surfaced at the next consumer bump, where ouroboros produced empty
# output for every program and iLambdaAi's grader lost its top rung. Both were
# silent: rc=0, no error, just a chunk executing misaligned garbage.
LINE is 68
# well-formed: OP_LINE <line:32> then 2 + 3. A 4-byte operand keeps the stream
# aligned, so this is 5. Emit three bytes instead and ADD lands on the wrong
# byte — which is exactly what every external producer did on the v0.33.0 bump.
assert_eq of [vm_run_bytecode of [[LINE,7,0,0,0, CONST,0,0, CONST,1,0, ADD, RETURN], [2, 3]], 5, "OP_LINE 32-bit operand keeps the stream aligned"]
# the pre-#630 shape — OP_LINE + 2 operand bytes — must NOT still evaluate to 5.
# It is either verifier-rejected or misaligned garbage; either way the contract
# is that it is no longer the arithmetic the producer intended.
old_shape is vm_run_bytecode of [[LINE,7,0, CONST,0,0, CONST,1,0, ADD, RETURN], [2, 3]]
assert of [old_shape != 5, "pre-#630 16-bit OP_LINE emission no longer silently works"]
# a line number past 65535 — the regime #630 exists for — survives the operand.
assert_eq of [vm_run_bytecode of [[LINE,161,134,1,0, CONST,0,0, RETURN], [99]], 99, "OP_LINE carries a line past 65535 (#630)"]
# truncated 32-bit operand is rejected by the verifier, not read off the end.
assert_eq of [vm_run_bytecode of [[LINE,7,0,0], []], null, "verify: truncated OP_LINE operand rejected"]

test_summary of null
Loading