planted bug                                  unit     hash    sound  special  exhaust overflow   ranges     fold     text   render  zerodiv   memory   layers that caught it
division split ignores overflow            caught        .        .        .        .   caught        .        .        .        .        .        .   2
split remainder may overflow               caught        .        .        .        .        .        .        .        .        .        .        .   1
x+0.0 -> x on floats                       caught        .   caught   caught        .        .        .        .        .        .        .        .   3
float MAX is reordered                          .        .   caught   caught        .        .        .        .        .   caught        .   caught   4
mod bucket off by one                      caught        .        .   caught   caught        .        .        .        .   caught        .        .   4
ADD range one too small                    caught        .        .        .   caught        .   caught        .        .        .        .        .   3
FLOORMOD range one too small                    .        .   caught        .   caught        .   caught        .        .        .        .        .   3
x*-1 -> x                                  caught        .        .        .   caught   caught        .        .        .   caught        .   caught   5
(x//c1)//c2 as x//(c1+c2)                  caught        .        .        .        .        .        .        .        .        .        .        .   1
MUL range ignores overflow                 caught        .        .        .        .        .   caught        .        .        .        .        .   2
const fold reverses operands                    .        .   caught   caught   caught   caught        .   caught   caught   caught        .   caught   8
inline picks the wrong argument                 .        .        .        .        .        .        .   caught   caught        .        .        .   2
C: float->int cast not saturating               .        .        .        .        .        .        .        .        .   caught        .        .   1
C: floor division uses C's /                    .        .        .        .        .        .        .        .        .   caught   caught   caught   3
C: plain / allowed when divisor may be 0        .        .        .        .        .        .        .        .        .        .   caught        .   1
C: max of floats uses fmaxf                     .        .        .        .        .        .        .        .        .   caught        .   caught   2
text format drops min/max bounds                .        .        .        .        .        .        .        .   caught        .        .        .   1
hash cons key ignores sign of zero         caught   caught   caught   caught        .        .        .   caught        .   caught        .        .   6
AFTER dropped from the renderer's order         .        .        .        .        .        .        .        .        .        .        .   caught   1

layer                                    caught this many of the 19 bugs: {'unit': 9, 'hash': 1, 'sound': 5, 'special': 5, 'exhaust': 5, 'overflow': 3, 'ranges': 3, 'fold': 3, 'text': 3, 'render': 8, 'zerodiv': 2, 'memory': 6}
bugs caught by exactly one layer: ['split remainder may overflow', '(x//c1)//c2 as x//(c1+c2)', 'C: float->int cast not saturating', 'C: plain / allowed when divisor may be 0', 'text format drops min/max bounds', "AFTER dropped from the renderer's order"]
