A kind is a stable id per error, so a test can assert which error this is without matching on prose and a message can be reworded without breaking anything. The reader's fourteen refusals all have one; in the checker they go on the errors a test names and the handful that are common enough to be worth classifying. Not a hundred of them, because jank has a hundred from being mature and the number is not the feature. The notes are the part that could not be said before. A duplicate definition now points at the second and notes the first; a duplicate parameter and a duplicate field do the same; an unknown field, an unknown struct and a non-exhaustive match all note the declaration and list what is actually there, so the reader's next move arrives with the question instead of after it. The reader's unclosed bracket is the clearest case — the error sits on the bracket, because that is where the fix goes, and the note sits where the file ran out, because that is the surprise. No message text changed, so every existing needle still means what it meant. The new assertions are on kinds and on note positions, which is the house rule about asserting the reason, made stable.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%