All notable changes to affinescript will be documented in this file.
This file is generated from conventional commits by the
changelog-reusable.yml
workflow (hyperpolymath/standards#206). Adopt the workflow in this
repo’s CI to keep this file in sync automatically — see
templates/cliff.toml
for the canonical config.
The format follows Keep a Changelog; this project aims to follow Semantic Versioning.
-
--deno-esm/-o FILE.deno.jsis a hard error (E0826). Bun-ESM (--bun-esm/.bun.js) is the only JS-host ESM target. The flag is kept so existing scripts fail loudly (Refs #56)
-
PixiUI: rename extern type
List→UiListsouse PixiUItypechecks against preludeList<T>(kind mismatch). Harness actually importssmokeIdaptikReach/ Assets mock. Smokes compile + run (Refs #760) -
Pixi/UI/Sound idaptik-reached remainder (#760): Graphics circle/stroke/roundRect/path, per-axis Container x/y, parent Option, interactiveChildren, ObservablePoint.set, Texture.WHITE, Assets init/loadBundle, Renderer.resize, FancyButton onPress/onDown/onHover, Slider/Input value,
@pixi/soundsingleton pauseAll/find/play(name). Bun-ESM lowerings + smokes. Unused Pixi.res decls stay out. -
CI gates on
.deed(DEED grammar). Leftover.a2mlis a hard fail.tools/check-deed-gates.sh+.github/workflows/deed-validate.yml. Machine-readable manifests renamed.a2ml→.deed. Repo deed:affinescript_chora.deed(Refs standards #837) -
Aspirational idaptik StartupError fixture compiles with real syntax (
use Console::{log},use Dom::{…}, tuple-list attrs and#{ bg: … }records) on--bun-esm(Refs #56) -
feat(stdlib): Aggregate.affine — SQL group-by + aggregation primitives — db-theory #3 (7 externs) (PR #527)
-
feat(stdlib): Transaction.affine — affine-bounded write-set isolation — db-theory #2 (8 externs) (PR #526)
-
feat(stdlib): Sqlite schema introspection + bulk I/O + error inspection — db-theory #1c (6 externs) (PR #525)
-
feat(res-to-affine): partial-port mode #488 slice 3 —
--partialnow translates array literals ([a, b]) and record literals ({x, y}→Rec #{ x: x, y: y }, with a nominal placeholder type
field-punning expansion) (Refs #488) -
feat(res-to-affine): partial-port mode #488 slice 2 —
--partialnow desugars pipe-first->(a->f(b)→f(a, b), chained left-to-right), and translatesif/elseand blocks withletstatements (Refs #488) -
feat(res-to-affine): partial-port mode (#488) — new
--partialflag renders module-top-level functions as AffineScriptfnskeletons withswitch→matchand best-effort expression translation (literals / idents / calls / binary ops with float-op + identity-equality normalisation // member + qualified access / ternary / variant
tuple + literal patterns); un-translatable forms become() /* TODO *//_ /* TODO */holes. Output deliberately does NOT type-check but parses (verified). Distinct model from--translate(Refs #488) -
feat(res-to-affine): Phase 3 slice 3 —
--translatenow also lowers module-levellet <id> = <literal>(int/float/string/bool) to a typedconst name: T = value;; call /ref(...)/ destructuring bindings are skipped (not compile-time constants); every emitted form verified compilable viamain.exe check.switch→matchand qualified-path resolution remain out of the standalone-type-check scope (Refs #57) -
feat(res-to-affine): Phase 3 slice 2 —
--translatenow also handles record types (→struct) and generics (type params'a→[A]) across aliases / sums / records;mutable/optional-?records, qualified paths, and nested generics are still skipped (never guessed); every emitted form verified compilable viamain.exe check(Refs #57) -
feat(res-to-affine): Phase 3 slice 1 —
--translaterenders fully-structural type declarations (primitive aliases + simple sum types) into compilable AffineScript; conservative (generics / qualified paths / records / non-primitive payloads are skipped, never guessed); walker-only (Refs #57) -
feat(stdlib/Http): RSR rewire — surface
hpm-http-rsrZig FFI (10 server-side externs: listen / port / free / accept / method / path / header / body / respond / request-free) + opaqueHpmHttpServer
HpmHttpRequesttypes; native-only (#425) -
feat(stdlib/json): v0.3 — RSR rewire to
hpm-json-rsrZig FFI (11 externs + opaqueHpmJsonValue+parse/to_json), Deno-ESM lowering via__as_hpmJson*shims (#421) -
feat(parser): trailing-comma in fn params and expr lists (Refs gitbot-fleet#148) (#370)
-
feat(lexer): underscore-prefix idents
_key/_unused(Refs gitbot-fleet#148) (#373) -
feat(parser): record-update spread at start
#{ ..base, f: v }(Refs gitbot-fleet#148) (#376) -
feat(parser): fn-type with effect arrow in type position (Refs gitbot-fleet#148)
-
feat(borrow): CFG-join for ExprHandle + ExprTry catch arms (CORE-01 pt3 Slice C-light, Refs #177) (#358)
-
feat(tw_verify): v2-parse support for affinescript.ownership (ADR-020) (#352)
-
feat(wasi): #180 ADR-015 S6b — sockets on-ramp via net_shutdown
-
feat(stdlib): STDLIB-04e — wire
string_to_intalias + lock pure-extern semantics (Closes #332) (#338) -
feat(stdlib): STDLIB-04b — wire Throws extern
error<T>(Closes #329) (#340) -
feat(wasm): byte-level load/store IR + env_at/arg_at (ADR-015 S5) (#339)
-
fix(vscode-smoke): SKIP cleanly when @hyperpolymath/affine-vscode is unpublished (#381)
-
fix(governance): rename CLAUDE.md TypeScript exemptions heading to match workflow regex
-
fix(stdlib): wire env_at / arg_at surface — codegen lowers via gen_str_at_via_get (ADR-015 S5, #180) (#364)
-
fix(ci): unblock the PR queue — bench/dune + adapter-load
.res-fixture exemption (#361) -
fix(interp): wire missing string_length builtin (Refs #332, #329) (#362)
-
fix(borrow): escape
(*rinside doc-comment examples (unblocks main … (#349) -
fix(interp):
eval_declhandlesFnExtern(#328 build-failure root cause) (#346) -
fix(version): single source of truth via lib/version.ml + tag-time bake (#297) (#300)
-
fix(shim): relicense the JSR shim package to MPL-2.0 (#299)
-
fix(release): scope checksums-job gh calls with –repo to avoid the git probe (#294)
-
docs(claude): refresh language-policy tables for 2026-05-25 estate policy (#363)
-
docs: restore ADR-020 + ADR-021 + coordination ledger (lost in #344 squash) (#350)
-
docs(CLAUDE.md): agent operations notes from parallel-bot session exp… (#348)
-
docs(adr-015): settle the S4 / S5 / S6c numbering drift (#180)
-
docs(adr): CORE-02 / #234 / ADR-016 — truth ledger to “DELIVERED” (#336)
-
docs(tech-debt): split STDLIB-04 into 04a–04e per per-extern audit (Refs #175) (#333)
-
docs(res-to-affine): corpus run + regex precision fixes (Refs #57) (#319)
-
docs: README internal-drift fix + DOC-04/05/06 done-in-tree (Refs #176, Refs #175) (#315)
-
docs: post-#303 catch-up — #297/#300/#301/#302/#304 + repos-monorepo retirement (#305)
-
docs: catch up TECH-DEBT, PACKAGING + STATE.a2ml with the 2026-05-20 JSR publish (#303)
Prior commits to this file’s introduction are recorded in git history
but not formally classified into Keep-a-Changelog sections. To backfill,
run git cliff -o CHANGELOG.md locally using the canonical
cliff.toml
— this is one-shot mechanical work.