PORTING.md Tier 1 item 5. The spy half of the watch was already built — the pushed table, the buffer, the inline ghost text. What was missing is spy-num, which is the part that item calls least obvious and most valuable, and it is what this is. A slot keeps count, min, max, last and mean. Each answers a question you can ask without building a query: n is the first thing wrong when a loop is wrong, the range is what one sample can never show you, last is what the scalar watch would have given you, and the mean is a running sum divided at read time because a mean accumulated as a mean drifts. A small ring of the last N samples was the other candidate and loses — N out of 91,200 is a sample of the tail of the loop rather than of the loop, and past five numbers every richer answer is a UI for building a query. The write path does no formatting, which is the feature rather than an optimisation: a snprintf per sample at thousands a frame is a HUD that costs more than the game. A sample is a load, five compares and the slot's seqlock; the listener thread renders once per editor tick. The window is since the editor's last tick, and that is a deliberate divergence from watch.clj, where the stats are cumulative until reset-spies!. Cumulative min and max reach the session's extremes within seconds of play and then never move again, so the two most useful of the five go dead exactly when you start interacting with the thing you are debugging — and this tool exists to show you a number while you drag the mouse. Reset is its own message and never a side effect of reading, because a destructive read makes looking change what is there and anything that polls would shorten the window under the editor that owns it. It bumps one epoch counter and clears no slot; a slot clears itself on its next sample, so the reader never writes the table. Ghost text needed one character. The call regexp allowed one hyphenated segment, so watch-num-i64 backtracked to failure and a numeric watch got no inline value while appearing normally in the buffer. dune test is green, run twice. HANDOFF-f3.md carries the reasoning, the two small gaps left behind it, and what did not work on the way.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%