W14: pin K49 void-elements spec fix; discover sx_render.ml regen drift (test-only)
K49: area/base/embed/param/track were in VOID_ELEMENTS but missing from
HTML_TAGS — render fell through to "Undefined symbol: base". dc7aa709 fixed
spec/render.sx; add suite gate-K49-void-elements-renderable (3 tests): the
spec registry contains all five, and render-to-html renders each as a
self-closing void. 264 passed / 0 failed under OCaml run_tests.
DISCOVERY (recorded in the briefing's Blocked section): the generated
hosts/ocaml/lib/sx_render.ml was never regenerated after the spec fix — its
stale html_tags_list still lacks the five tags, so the runner's native
render-html path STILL errors. Fix is a bootstrap_render.py regen (hosts
lane, out of scope for this test-only loop). Live evidence for F13
(regen-diff CI gate). Pin covers the spec side only for now.
Also corrects the checklist label: K49 = void elements; the depth/cycle
guard is K16 (OPEN, W8).
Test-only: no semantics edits, no push.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -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] K18 [W7] — `expt` overflow now float-promotes (no 63-bit wrap)
|
||||||
- [x] K20 [W7] — `contains?` now supports dict key membership
|
- [x] K20 [W7] — `contains?` now supports dict key membership
|
||||||
- [x] K09/K11/K39 [W5] — longhand `unquote-splicing`, guard sentinel gensym, `do` IIFE-head
|
- [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)
|
- [ ] crit-2 [W1] — signal-return frame key (verify the pin is non-vacuous)
|
||||||
- [ ] C1/C1b [W3] — HTTP-mode concurrency fixes, pin
|
- [ ] C1/C1b [W3] — HTTP-mode concurrency fixes, pin
|
||||||
- [ ] S4 [conformance] — housekeeping repro, 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)
|
## 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))` →
|
||||||
|
`<base href="x" />`; 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
|
- 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`
|
added to `spec/tests/test-gate-pins.sx`: `gate-K09-longhand-unquote-splicing`
|
||||||
(R7RS longhand `(unquote-splicing X)` now splices, incl. empty-list case;
|
(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.
|
promotion). Verified 4/4 green under the OCaml run_tests kernel. Test-only.
|
||||||
|
|
||||||
## Blocked
|
## 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.
|
||||||
|
|||||||
@@ -119,3 +119,45 @@
|
|||||||
(deftest
|
(deftest
|
||||||
"do with a single IIFE form returns its value"
|
"do with a single IIFE form returns its value"
|
||||||
(assert= (do ((fn () 42))) 42)))
|
(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
|
||||||
|
"<base href=\"x\" />"
|
||||||
|
(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))))))
|
||||||
|
|||||||
Reference in New Issue
Block a user