Thanks sindy, it is indeed firewall related. Discovery fixed using this single rule:
/ip firewall filter
add action=accept chain=input comment=CAPsMAN in-interface-list=!all port=5246,5247 protocol=udp
These are the log entries during discovery (firewall log=on), hence the 'any' port selection.
21:14:47 system,info CAP configuration changed by admin
21:14:47 firewall,info input: in:(unknown) out:(none), proto UDP, 192.168.4.1:5246->192.168.4.1:53881, len 57
21:14:49 caps,info CAP selected CAPsMAN MikroTik (::ffff:192.168.4.1:5246)
21:14:51 caps,info CAP connected to MikroTik (::ffff:192.168.4.1:5246)
21:14:51 caps,info [::ffff:192.168.4.1:53881,Join,[64:D1:54:33:D7:D0]] joined, provides radio(s): 64:D1:54:33:D7:D6,64:D1:54:33:D7:D5
21:14:51 caps,info CAP joined MikroTik (::ffff:192.168.4.1:5246)
21:14:51 firewall,info input: in:(unknown) out:(none), proto UDP, 192.168.4.1:44094->192.168.4.1:5247, len 52
21:14:54 caps,info MikroTik-1: selected channel 2412/20-Ce/gn(20dBm)
21:14:57 caps,info MikroTik-2: selected channel 5180/20-Ceee/ac/P(23dBm)
21:15:01 firewall,info input: in:(unknown) out:(none), proto UDP, 192.168.4.1:44094->192.168.4.1:5247, len 52
21:15:11 firewall,info input: in:(unknown) out:(none), proto UDP, 192.168.4.1:44094->192.168.4.1:5247, len 52