From c57ca6a24f3c91d45266431519b64f43e99af5fe Mon Sep 17 00:00:00 2001
From: Joseph Ferano
Date: Mon, 14 Sep 2026 10:20:34 +0700
Subject: [PATCH] The renderer's own output, spelled the way the renderer
spells it
The renderer check greps a line out of NEXT.md, and NEXT.md is a scratch document
that gets rewritten. The line went, the grep went empty, and the empty-needle guard
did its job and said so -- into a report nobody was reading. Behind that noise the
page was genuinely wrong: the colon-to-dot sweep rewrote every field label in the
corpus and lib/render.ml writes .field today, so the inspector block on the page had
been showing {:x 1.5 :y 0} for a renderer that prints {.x 1.5 .y 0}. test_repl.ml's
fixtures are the authority and they are dots throughout, with an enum member still a
colon; the page now matches. The anchor moves to test/programs/raylib-imported.flan,
which dune test builds and runs, so it cannot quietly stop saying it.
The LLVM excerpt beside it moved too: a --dev main pushes a condition frame before
anything else now, which shifted the SSA numbering by one. The three quoted lines are
what flan emit --dev prints today, with the frame push marked as elided rather than
silently dropped.
---
web/examples/quotes.sh | 10 +++++++++-
web/index.html | 13 +++++++------
2 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/web/examples/quotes.sh b/web/examples/quotes.sh
index ee3126a..6e0b97d 100644
--- a/web/examples/quotes.sh
+++ b/web/examples/quotes.sh
@@ -99,7 +99,15 @@ want "shim wrapper" "$("$FLAN" shim "$here/shimdemo.flan" | grep 'GetMousePositi
want "raylib binding" "$(grep -F 'unload-texture' "$root/vendor/raylib/raylib.flan")"
want "agent declare" "$(grep -F 'flan_agent_poll' "$root/vendor/agent/agent.flan" | head -1)"
want "conditions.org" "$(grep -F 'Innermost frame offering the name wins' "$root/conditions.org")"
-want "renderer" "$(grep -F ':r 17 :g 34 :b 51 :a 68' "$root/NEXT.md")"
+# The value renderer, anchored in the test corpus rather than in NEXT.md. It
+# used to grep NEXT.md for this line, and NEXT.md is a rolling scratch document:
+# the line was rewritten out of it, the grep went empty, and the check spent
+# weeks reporting "whatever this quotes has moved" while the page really had
+# gone stale -- the colon-to-dot sweep rewrote every field label in the corpus
+# and left the renderer's own output on this page spelled the old way. An anchor
+# has to be somewhere that cannot quietly stop saying the thing, and the corpus
+# is such a place, because `dune test` builds and runs it.
+want "renderer" "$(grep -oF '{.r 17 .g 34 .b 51 .a 68}' "$root/test/programs/raylib-imported.flan" | head -1)"
# The Emacs bindings, from the keymap rather than from any prose about it.
for k in "C-c C-c" "C-c C-k" "C-x C-e" "C-c C-b" "C-c C-v" "C-c C-x"; do
diff --git a/web/index.html b/web/index.html
index b43e46b..1b77603 100644
--- a/web/index.html
+++ b/web/index.html
@@ -1569,9 +1569,10 @@ function that is current.
define {} @"flan.main"(ptr %xfer) {
entry:
- %t7 = alloca %slice
- %t1 = load ptr, ptr @"flan.cell.work"
- %t2 = call i32 %t1(i32 3, ptr %xfer)
+ ;; the frame push, elided — see conditions, above
+ %t8 = alloca %slice
+ %t2 = load ptr, ptr @"flan.cell.work"
+ %t3 = call i32 %t2(i32 3, ptr %xfer)
The call site loads the cell rather than naming @"flan.work"
directly. The signature carries ptr %xfer — the transfer channel from
@@ -1666,10 +1667,10 @@ there, in the thunk. What comes back looks like this:
big 18446744073709551615
col :blue
-(.pos b) (V {:x 1.5 :y 0})
-b (Blob {:id 7 :name "sandy \"quoted\"" :pos (V {:x 1.5 :y 0}) :tags [ 0 42 0]})
+(.pos b) (V {.x 1.5 .y 0})
+b (Blob {.id 7 .name "sandy \"quoted\"" .pos (V {.x 1.5 .y 0}) .tags [ 0 42 0]})
(slice (.tags b) 0 3) [ 0 42 0]
-(rl/get-color 0x11223344) (rl/Color {:r 17 :g 34 :b 51 :a 68})
+(rl/get-color 0x11223344) (rl/Color {.r 17 .g 34 .b 51 .a 68})
sim/grid [ [ 0 0 0 0 0 0 0 0 ...] [ 0 ... ] ...]
A pointer is never followed; it renders as <ptr>. Following one