IMHO there is a bug in zyncoder.c setting up MCP23017 pullups?
// enable pullups on the unused pins (high two bits on each bank)
reg = 0x60;
wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_GPPUA, reg);
wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_GPPUB, reg);
0x60 is 0110 0000b, but looking on schematics two MSB-s are unused - port bits 6 and 7, so IMHO correct value must be 0xC0 (1100 0000b)? But this isn’t real issue, please read further.
Second and real problem - inputs connected to encoders don’t use pullups at all, when those corresponding register bits bits are zeros. So MCP23017 generates spurious interrupts all the time (tested with zyncoder_test program). I think that real and correct value will be reg = 0xFF , so all pullups must be enabled (according to Microchip datasheet, paragraph 3.5.7 - pullup configuration register).