v2.8.0
Highlights
Full bundles cut nearly in half (~534 → ~309 KB gz)
Since 2.7.0 the full bundles had been shipping two copies of the core runtime
and multilingual parser: the bundled reactivity/realtime plugins resolved
@hyperfixi/core to its prebuilt library dist (which embeds a second copy of
@lokascript/semantic) alongside the bundle's own source graph. A rollup alias
now folds everything onto one graph:
hyperfixi.js: ~534 → ~309 KB gzhyperfixi-hx-v4.js: ~540 → ~321 KB gz
(Re-measured 2026-07-20 on the release tree: the ~10 KB over the July-14 dedupe
figures is semantic-content growth from the pick-text-range/vocab arcs, single-copy
verified.)
Same features, same pre-installed plugins (verified by the plugin-install,
reactive-features, and full bundle-compatibility suites). CI size ceilings are
ratcheted down to catch any re-duplication.
fetch … with { … } options in all 24 languages (#662)
fetch request options — braced bodies and naked named-arg forms (method:,
headers:, body:, …) — are now captured by the semantic parser in every
supported language. Previously the options clause was silently dropped in most
non-English languages (78 residual coverage firings, now 0), so a translated
fetch compiled but issued a bare GET. ~100 new locked tests.
Event modifiers in all 24 languages (#673)
Event-modifier phrases — once, debounce(N), throttle(N) and their
translated forms — now flow from every language's event-handler head to the
runtime (69 residual firings → 0). Handler heads like
on click debounced at 500ms (and the SOV/VSO equivalents) behave identically
in all 24 languages.
"Unknown command: compound" fixed on semantic-path bundles (#675)
Multi-command handler bodies could throw Unknown command: compound at runtime
on the full bundle (hyperfixi.js, hyperfixi-hx-v4.js) — core's per-segment
semantic adapter surfaced a compound parse as a single command literally named
compound. The adapter now defers non-command parses to the traditional
parser. Surfaced by the first honest run of the bundle-compatibility suite;
the gallery fetch-data example now passes on all 8 bundles with real
assertions.
Foreign→English canonical validity: 3059/3059 (#697–#736)
Every authored foreign translation now renders English that the canonical
hyperscript.org parser accepts — both canonical-validity allowlists are empty.
The burndown (90.7% → 100%) closed dozens of per-language rendering bugs
(possessive glue, event-source leaks, value-literal bindings, ambiguous-sense
vocabulary) and finished with full pick <text-range> support in all 24
languages (#733/#734/#736). A new R4 canonical-validity ratchet (#727) makes
this a ninth --regression gate signal so it cannot silently regress.
New package: @lokascript/htmx-adapter (#735)
Multilingual adapter for upstream htmx v4 — a canonicalizing extension that
lets localized attribute vocabularies drive an unmodified htmx build.
trigger / fire fixed in the hybrid bundles (#748)
trigger (and its alias fire) silently did nothing in the shipped
hyperfixi-hybrid-complete.js and hyperfixi-hx.js bundles — advertised in
the bundle manifest but missing from the inline runtime. Both now dispatch
exactly like send, and a manifest↔runtime consistency test pins every
advertised command to a real implementation.
Correctness & validation
- Vocab consistency gate in CI — cross-surface dictionary/profile/renderer
disagreements are now validated in CI: 0 unwaived, every waiver probe-cited. - Input coverage is total — every semantic
parseInternalstage is
instrumented (--diagnose-coverage); all residual firings are attributed to
named families. A pattern can no longer score confidence 1.0 while silently
dropping a trailing clause without that being measured. - Fidelity floors held — the nine-signal multilingual ratchet
(parse-rate, degenerate, R0-recall, R0-precision, multiset-recall, R1 roles,
R2 execution, R3 values, R4 canonical validity) holds the high-water marks:
fidelity 1.000 on all 3,696 corpus rows across 24 languages,
avgRoleFidelity ≈ 0.992, avgValueRecall ≈ 0.997, canonical validity
3059/3059.
Publish-pipeline hardening
- Reproducible installs in the publish workflow (
npm ci+ lockfile sync,
#672). pre-publish-checkis now an honest gate (#674):set -o pipefailon
tee-masked steps, real exit codes end-to-end, export validation after bundle
builds, complete BUILD_ORDER (including private deps), and a final verdict
step that always runs. Size limits reset to measured reality as
anti-regression ceilings.- Version bumps land on
mainvia a release token with PR fallback (#674). - Pre-release audit (#745–#750): export validation is strict end-to-end and
runs inside the publish workflow itself alongside a bare-Node core import
check; CI size limits actually fail (with hx-v4 and hybrid-hx covered);
three export maps that claimed never-built files (types-browser, behaviors,
testing-framework) were fixed the first time the honest gate ran.
Documented bundle sizes now match reality
Every size figure is re-measured on the release artifacts (README, CLAUDE.md,
docs/BROWSER_BUNDLES.md); the full-bundle numbers reflect the dedupe above:
| Bundle | Actual (gzip) | 2.7.x |
|---|---|---|
hyperfixi-lite.js |
1.9 KB | 1.9 KB |
hyperfixi-hybrid-complete.js |
7.7 KB | 7.7 KB |
hyperfixi-hx.js |
18 KB | 18 KB |
hyperfixi-multilingual.js |
97 KB | 97 KB |
hyperfixi-hx-v4.js |
~321 KB | ~540 KB |
hyperfixi.js (full) |
~309 KB | ~534 KB |
The slim bundles (lite / lite-plus / hybrid-complete / hybrid-hx) remain the
recommended starting point, and @hyperfixi/vite-plugin still emits the
minimal bundle automatically.
Multilingual correctness fixes
go to url "/page"no longer drops the URL (#680) — the destination was
silently lost in every language (the English reference itself was affected,
which masked it); navigation now receives the real URL in all 24 languages.- Broken event listeners fixed in six languages (#681) — the de/fr/id/it/
pl/zh dictionaries renderedmousedown/mouseupas words the parser could
not resolve (a listener that never fires — id even boundkeydown). A new
V3c vocabulary check now verifies every dictionary event word round-trips on
the parse side.
Full changelog: auto-generated PR list below (or
https://github.com/codetalcott/hyperfixi/compare/v2.7.2...v2.8.0).