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))))))