diff --git a/NEXT.md b/NEXT.md
index 4b86eeb..764c6c0 100644
--- a/NEXT.md
+++ b/NEXT.md
@@ -1056,9 +1056,12 @@ header is now cached in the session as well as on disk, so a repeat import (a `C
`import` line) costs nothing, and a header edited mid-session is not picked up until the session restarts — the same
rule a changed `.c` file follows.
-**Opt-in on purpose.** `vendor/raylib/headers` is `?${FLAN_RAYLIB_H}`. "A build needs libraylib linkable and not
+~~**Opt-in on purpose.** `vendor/raylib/headers` is `?${FLAN_RAYLIB_H}`. "A build needs libraylib linkable and not
raylib-devel installed" is a property chosen deliberately, and requiring a header would take it from everyone to give
-the check to whoever has one. Unset means off; set-and-wrong is an error naming the path.
+the check to whoever has one. Unset means off; set-and-wrong is an error naming the path.~~ — no longer so, and what
+dissolved the argument was the commit rather than a change of mind about the property: `vendor/raylib/raylib-5.5.h` is
+tracked, `headers` names that path with no `${...}` in front of it, `FLAN_RAYLIB_H` is gone, and the check runs on
+every build. The `?` marker still means what it says here; this package is simply not using it any more.
Worth knowing before touching it:
diff --git a/plan.org b/plan.org
index 17d9c0c..dc66e7d 100644
--- a/plan.org
+++ b/plan.org
@@ -702,6 +702,9 @@ nses-of-symbols and middleware. Treat "speaks nREPL" as milestone 7a and "an
editor client that is pleasant" as a separate milestone 7b. In the dev runtime:
- eval string in package; compile form/file with source locations
- completion, arglist, describe, find-definition
+- macroexpand, one step or to the fixpoint — the compiler builds the macro into a
+ shared object and dlopens it to run the expansion, which is the same route a
+ file's own macros take
- backtrace + restarts; interrupt
** Emacs client
diff --git a/web/index.html b/web/index.html
index 9660bf7..b43e46b 100644
--- a/web/index.html
+++ b/web/index.html
@@ -442,8 +442,9 @@ that overflows (INT64_MIN / -1, whose true quotient is one past the
the type), and a float-to-integer cast whose value does not fit. All three now signal
ArithError, the way a bad index signals BoundsError.
;; The divisor goes through a global so that constant folding cannot
-;; answer it before the backend does.
+;; Three integer operations have no right answer. Each used to be a bare SIGFPE
+;; or an undefined value; each signals ArithError now. The divisor goes through
+;; a global so that constant folding cannot answer it before the backend does.
(defvar zero i32 0)
(defn main [] ()
@@ -461,6 +462,14 @@ $ flan run cast.flan
cast.flan:7:17: this value does not fit the integer type it is cast to, which
holds [-2147483648 2147483647]
+;; A float-to-integer cast whose value does not fit. The condition it violated
+;; is reported as the range the destination type can hold, which is the same
+;; shape BoundsError uses for a slice: the violated condition, written out.
+(defvar big f64 1e30)
+
+(defn main [] ()
+ (println (i32 big)))
+
A Lisp that stops naming the file and the line beats one that dies with
SIGFPE, and a program that genuinely does not care installs a handler once at
startup and never thinks about it again. Float division is deliberately left alone: IEEE