diff --git a/plans/agent-briefings/sx-gate-loop.md b/plans/agent-briefings/sx-gate-loop.md index f767dc6d..8fd5f450 100644 --- a/plans/agent-briefings/sx-gate-loop.md +++ b/plans/agent-briefings/sx-gate-loop.md @@ -47,7 +47,9 @@ Pin each confirmed-and-fixed finding with a minimal repro. Add suites to - [x] K18 [W7] — `expt` overflow now float-promotes (no 63-bit wrap) - [x] K20 [W7] — `contains?` now supports dict key membership - [x] K09/K11/K39 [W5] — longhand `unquote-splicing`, guard sentinel gensym, `do` IIFE-head -- [ ] K49 [W8] — render depth/cycle guard (infinite recursive component) +- [x] K49 [W8] — five void elements (area/base/embed/param/track) renderable + (spec side; native regen drift → see Blocked). NB: the depth/cycle guard + is K16 [W8], still OPEN — not a W14 pin target until its fix lands - [ ] crit-2 [W1] — signal-return frame key (verify the pin is non-vacuous) - [ ] C1/C1b [W3] — HTTP-mode concurrency fixes, pin - [ ] S4 [conformance] — housekeeping repro, pin @@ -77,6 +79,18 @@ Pin each confirmed-and-fixed finding with a minimal repro. Add suites to ## Progress log (newest first) +- 2026-07-03 — **K49 void-elements pin (item A.4) + regen-drift DISCOVERY**. + Corrected the checklist label first: K49 is "five void elements + unrenderable" (core.md:335), not the depth guard (that's K16, OPEN). Added + suite `gate-K49-void-elements-renderable` (3 tests): spec `HTML_TAGS` + contains all five; `(render-to-html '(base :href "x") (make-env))` → + ``; all five render self-closing. Runner-env gotchas: + `current-env`/`symbol` are not bound in run_tests — use `(make-env)` and + literal quoted forms. **Discovery:** the first draft pinned via the + runner's native `render-html` and FAILED — `hosts/ocaml/lib/sx_render.ml` + (generated) was never regenerated after dc7aa709's spec fix, so the native + render path still errors on the five tags. Recorded under Blocked; live + evidence for F13 (regen-diff gate). 264 passed / 0 failed. Test-only. - 2026-07-03 — **K09/K11/K39 W5 special-form pins (item A.3)**. Three suites added to `spec/tests/test-gate-pins.sx`: `gate-K09-longhand-unquote-splicing` (R7RS longhand `(unquote-splicing X)` now splices, incl. empty-list case; @@ -102,4 +116,15 @@ Pin each confirmed-and-fixed finding with a minimal repro. Add suites to promotion). Verified 4/4 green under the OCaml run_tests kernel. Test-only. ## Blocked -- (none) +- **K49 native path — sx_render.ml regen drift** (found 2026-07-03 while + pinning A.4): dc7aa709 fixed HTML_TAGS in `spec/render.sx` but never re-ran + `hosts/ocaml/bootstrap_render.py`, so the generated + `hosts/ocaml/lib/sx_render.ml` still carries a stale `html_tags_list` + without area/base/embed/param/track. The runner's native `render-html` + convenience (and any native fast-path render) therefore STILL throws + `Undefined symbol: base` — dc7aa709's "verified on the native binary" claim + did not cover this path. Fix = regen (hosts lane, semantics-adjacent — out + of scope for this test-only loop). This is a live instance of **F13** + (regen-diff CI gate, section-B/D territory): a regen-diff check would have + caught it at commit time. The K49 pin covers the spec side only; when the + regen lands, extend the suite with `render-html`-path assertions. diff --git a/spec/tests/test-gate-pins.sx b/spec/tests/test-gate-pins.sx index 306f44db..30fc3191 100644 --- a/spec/tests/test-gate-pins.sx +++ b/spec/tests/test-gate-pins.sx @@ -119,3 +119,45 @@ (deftest "do with a single IIFE form returns its value" (assert= (do ((fn () 42))) 42))) + +;; -------------------------------------------------------------------------- +;; K49 [W8, med] Five void elements (area base embed param track) were in +;; VOID_ELEMENTS but missing from HTML_TAGS — render fell through to +;; function-call dispatch: (render-to-html '(base :href "x")) threw +;; "Undefined symbol: base". dc7aa709 fixed the SPEC registry +;; (spec/render.sx). NB: the generated OCaml render library +;; (hosts/ocaml/lib/sx_render.ml, bootstrap_render.py output) still carries +;; a STALE html_tags_list without these five — the runner's native +;; `render-html` convenience therefore still errors. That regen drift is +;; W14 item F13 (regen-diff gate); this suite pins the spec side only. +;; -------------------------------------------------------------------------- +(defsuite + "gate-K49-void-elements-renderable" + (deftest + "spec HTML_TAGS registry contains all five void elements" + (for-each + (fn + (t) + (assert (contains? HTML_TAGS t) (str "HTML_TAGS missing " t))) + (list "area" "base" "embed" "param" "track"))) + (deftest + "spec render-to-html renders base self-closing with attr" + (assert-equal + "" + (render-to-html (quote (base :href "x")) (make-env)))) + (deftest + "spec render-to-html renders all five as self-closing voids" + (for-each + (fn + (form) + (let + ((html (render-to-html form (make-env)))) + (assert + (string-contains? html "/>") + (str (first form) " not self-closing: " html)))) + (list + (quote (area)) + (quote (base)) + (quote (embed)) + (quote (param)) + (quote (track))))))