The refusal for a frame whose body has been redefined underneath it did not fire because four of its five hand-offs were never written. `Emit.fninfo` has been storing `slot_fingerprint` in the last `i32` of every `%fninfo` all along; `flan_dev.c` called that field `spare`, there was no accessor for it, the agent never snapshotted it, the backtrace line never carried it, and `Dev.locals` compared slot counts and nothing else. The handoff note's "every piece is written and the refusal does not happen" was a guess, and the first step it suggested — printing both sides of the comparison — could not have found it, because there was no comparison. So: `spare` becomes `slotsig` and gets `flan_dev_frame_slotsig`; the agent snapshots it beside the slot count and puts it on the backtrace line *before* the location, since the name is the one field that can contain a space and has to stay last; `Dev.backtrace` parses it; `Dev.locals` compares it against `Emit.slot_fingerprint` of the body this session holds and refuses by name when they differ. No change to `emit.ml` — the value was already there. The mechanism itself is right and stays. `slot_fingerprint` hashes every slot's name together with the spelling of its type, so a rename that keeps the count and the types — exactly the case this exists for — changes it. The count check stays in front of it because its message is the more specific one. The fingerprint stays off the wire. A hash is not something an editor can act on, and the refusal says the fact in words: this frame's body was redefined since it was entered, so its names no longer describe its values. `test_dev.ml` gains the inverse and the control. A body that drops a `let` is refused on the count, and `main` — untouched by the redefinition of `look` — must still answer, which is the assertion that would catch a fingerprint that never matched anything and made the verb useless while turning the suite green.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%