diff --git a/NEXT.md b/NEXT.md index c096840..70ec092 100644 --- a/NEXT.md +++ b/NEXT.md @@ -1,3 +1,41 @@ +## Picked up first, 2026-09-13 + +Three things, in order. The first two are one line each and unblock a real game. + +**1. `DrawTexturePro` is not bound, and it is the one true blocker for `siam-farmer`.** See `PORTING.md`, written +against both the Clojure implementation and the WIP Common Lisp port. Every tile in both goes through it; +`DrawTextureRec` does not scale and `DrawTextureEx` takes no source rect, so the renderer **cannot be written at all** +in a default build. It is reachable only through the opt-in `FLAN_RAYLIB_H` import, which `vendor/raylib/headers` +deliberately keeps optional. One `declare-c` line. + +**2. `Key` has no `left-shift`.** Both implementations use shift+1..5 to pick the tilemap. One enum member. + +**3. An out-of-bounds index should signal a condition, not `exit(134)`.** `PORTING.md`'s own first recommendation +after the binding lines. The game indexes grids straight from mouse coordinates — `game.lisp` had to add an +`in-bounds-p` to survive it — and today a trap ends the process *and* the `flan dev` session with it. `flan_rt.c`'s +`flan_bounds_fail` should go through the condition machinery, which would make it a break loop with a restart instead +of a dead session. Note this interacts with the merged one-process build: killing the program now kills the compiler. + +**What `PORTING.md` says NOT to build, with evidence:** escaping closures (one capture site, fixed by one parameter), +`Handle`/pools, `Result`/`try`, `handler-case`, `loop`/`recur` and tail calls, user allocators, structural typing — +**none has a customer in that code**. And **generics is not the blocker** there either: the element-changing maps are +five-line load-time loops. That last one hangs on a design decision the report states flatly — whether the game's +state holds fixed arrays or `Vec`s. + +**raylib 6.0 is not urgent:** all seven struct layouts on the game's path and every enum value it touches are +byte-identical between 5.5 and the vendored 6.0. + +### Left mid-flight when the session ended + +Both lanes committed their main work and died on trailing polish; both are merged and the suite is green. + +- **`pause` marking from Emacs was not built.** `DISCUSS.md` item 9 has the design, and the decisions are settled: the + instrumentation travels as a *separate field* applied by the daemon **after** parsing (splicing text would shift + every source location after it), and the mark **sticks** until the form is evaluated plainly. The watch lane got as + far as deciding to splice into the `Ast` rather than the forms. +- **Ghost text** for the watch window — values shown inline at the code they belong to — is noted and not designed. +- `tools/unit-return.py` is re-runnable; run it over any `.flan` file a lane wrote before the conversion landed. + # Where this is ## Start here — next session