Skip to content

v2.8.0

Choose a tag to compare

@github-actions github-actions released this 21 Jul 14:21
· 476 commits to main since this release

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 gz
  • hyperfixi-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 parseInternal stage 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-check is now an honest gate (#674): set -o pipefail on
    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 main via 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 rendered mousedown/mouseup as words the parser could
    not resolve (a listener that never fires — id even bound keydown). 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).