HS: parser+compiler — toggle for-in lookahead, throttled/debounced modifiers (-2 skips)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 51s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 51s
parser.sx parse-toggle-cmd: when seeing 'toggle .foo for', peek the following two tokens. If they are '<ident> in', it is a for-in loop and toggle does NOT consume 'for' as a duration clause. Restores the trailing for-in to the command list. parser.sx parse-on (handler modifiers): recognize 'throttled at <ms>' and 'debounced at <ms>' as handler modifiers. Captured as :throttle / :debounce kwargs in the on-form parts list. compiler.sx emit-on: pre-extract :throttle / :debounce from parts via new _strip-throttle-debounce helper before scan-on, then wrap the built handler with (hs-throttle! handler ms) or (hs-debounce! handler ms). runtime.sx: hs-throttle! — closure with __hs-last-fire timestamp, fires immediately and drops events arriving within ms of the last fire. hs-debounce! — closure with __hs-timer, clears any pending timer and schedules a new setTimeout(handler, ms) so only the last burst event fires. Both formerly-architectural skips now pass: - "toggle does not consume a following for-in loop" - "throttled at <time> drops events within the window" Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -3,22 +3,25 @@
|
||||
Live tally for `plans/hs-conformance-to-100.md`. Update after every cluster commit.
|
||||
|
||||
```
|
||||
Baseline: 1213/1496 (81.1%)
|
||||
Merged: 1494/1494 (100.0%) on counted tests; 2 documented skips
|
||||
Worktree: all landed
|
||||
Skipped: 2 — 'until event keyword works' (async event dispatch needs the
|
||||
kernel suspended outside K.eval), 'throttled at <time> drops events
|
||||
within the window' (parser doesn't implement the throttled modifier;
|
||||
emits malformed SX). Both documented in tests/hs-run-filtered.js.
|
||||
Note: step limit raised 200k→1M in 225fa2e8 revealed 70 previously-masked passes
|
||||
Note: full-suite run via tests/hs-run-batched.js — fresh-kernel-per-batch
|
||||
bypasses the JIT cache saturation that hits a single-process run after
|
||||
~500 tests. Sequential at batch=200: 10m47s, 1494/1494.
|
||||
Note: hs-f loop totals — T9, F2, F3, F9, hs-null-error! self-guard, T6 @attr
|
||||
observer (parser+compiler+runtime), batched runner, def/default/empty
|
||||
suites no-step-limit, deadline tuning.
|
||||
Baseline: 1213/1496 (81.1%) initial scrape
|
||||
Snapshot: 1496/1514 upstream sync 2026-05-08 (+18 new upstream tests)
|
||||
Conformance: 1496/1496 (100.0%) on counted tests; 18 documented architectural skips
|
||||
Wall: 26m17s sequential (8 batches × 200) via tests/hs-run-batched.js
|
||||
Target: 1514/1514 — clear the 18 skip list (in progress)
|
||||
Note: full-suite single-process is unreliable due to JIT cache saturation;
|
||||
use hs-run-batched.js (fresh kernel per batch) for deterministic numbers.
|
||||
```
|
||||
|
||||
## Skip list (18 — work to do)
|
||||
|
||||
| Skip | Reason | Estimated work |
|
||||
|------|--------|----------------|
|
||||
| **Tokenizer-stream API (13)** — `matchToken`, `matchTokenType`, `matchOpToken`, `matchAnyToken*`, `peekToken`, `consumeUntil`, `consumeUntilWhitespace`, `pushFollow`/`popFollow`, `pushFollows`/`popFollows`, `clearFollows`/`restoreFollows`, `lastMatch`, `lastWhitespace` | Upstream exposes a streaming token API on `_hyperscript.internals.tokenizer`. Our `hs-tokenize` returns a flat list; parser holds stream state internally as closures. | Wrap `hs-tokenize` output in a token-stream object exposed as a primitive. ~1-2 days, mostly mechanical. |
|
||||
| **Template-component scope (2)** — `component reads a feature-level set from an enclosing div on first load`, `component reads enclosing scope set by a sibling init on first load` | Upstream supports `<script type="text/hyperscript-template" component="...">` — HTML-template-based custom elements. Our `defcomp` is SX-only; no template-component bootstrap. | Add a `<script type="text/hyperscript-template">` registrar alongside the existing script-tag scanner. ~1 day. |
|
||||
| **Toggle parser ambiguity (1)** — `toggle does not consume a following for-in loop` | Parser greedily consumes `for x in [...]` as `toggle .foo for <duration>`. Need lookahead to distinguish `for <num>ms/s` (duration) from `for <ident> in <expr>` (iteration). | Targeted parser fix in `parse-toggle`. ~2-4 hours. |
|
||||
| **Throttled-at modifier (1)** — `throttled at <time> drops events within the window` | Parser doesn't recognize `throttled at <duration>` as a handler modifier. Currently emits malformed SX (handler body is the literal `throttled` symbol; time expression dangles outside closure). | Parser support + runtime `hs-throttle!` wrapper. ~4 hours. |
|
||||
| **Async event dispatch (1)** — `until event keyword works` | `repeat until event click from #x` suspends the OCaml kernel waiting for a click that the sync test runner can't dispatch (kernel busy, JS event loop blocked). | Architectural — requires either yielding to the JS event loop between iterations, or a different test-runner shape that can interleave event injection. ~2-3 days. |
|
||||
|
||||
## Cluster ledger
|
||||
|
||||
### Bucket A — runtime fixes
|
||||
|
||||
Reference in New Issue
Block a user