dom-on wraps Lambda event handlers in JS functions that call callLambda.
callLambda returns a Thunk (TCO), but the wrapper never trampolined it,
so the handler body (swap!, set!, etc.) never executed. Buttons rendered
but clicks had no effect.
Fix: wrap callLambda result in trampoline() so thunks resolve and
side effects (signal mutations, DOM updates) execute.
Also use call-lambda instead of direct invocation for Lambda objects
(Lambda is a plain JS object, not callable as a function).
All 100 Playwright tests pass:
- 6 isomorphic SSR
- 5 reactive navigation (cross-demo)
- 61 geography page loads
- 7 handler response rendering
- 21 demo interaction + health checks
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move defhandler/defquery/defaction/defpage/defrelation from hardcoded
evaluator dispatch to web/web-forms.sx extension module, registered via
register-special-form!. Adapters updated to use definition-form? and
dynamically extended form-name lists.
Fix modifier-key clicks (ctrl-click → new tab) in three click handlers:
bindBoostLink, bindClientRouteClick, and orchestration.sx bind-event.
Add event-modifier-key? primitive (eventModifierKey_p for transpiler).
Fix CSSX SSR: ~cssx/flush no longer drains the collected bucket on the
server, so the shell template correctly emits CSSX rules in <head>.
Add missing server-side DOM stubs (create-text-node, dom-append, etc.)
and SSR passthrough for portal/error-boundary/promise-delayed.
Passive event listeners for touch/wheel/scroll to fix touchpad scrolling.
97/97 Playwright demo tests + 4/4 isomorphic SSR tests pass.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Two fundamental environment bugs fixed:
1. env-set! was used for both binding creation (let, define, params)
and mutation (set!). Binding creation must NOT walk the scope chain
— it should set on the immediate env. Only set! should walk.
Fix: introduce env-bind! for all binding creation. env-set! now
exclusively means "mutate existing binding, walk scope chain".
Changed across spec (eval.sx, cek.sx, render.sx) and all web
adapters (dom, html, sx, async, boot, orchestration, forms).
2. makeLambda/makeComponent/makeMacro/makeIsland used merge(env) to
flatten the closure into a plain object, destroying the prototype
chain. This meant set! inside closures couldn't reach the original
binding — it modified a snapshot copy instead.
Fix: store env directly as closure (no merge). The prototype chain
is preserved, so set! walks up to the original scope.
Tests: 499/516 passing (96.7%), up from 485/516.
Fixed: define self-reference, let scope isolation, set! through
closures, counter-via-closure pattern, recursive functions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>