Go back to basics.
Set room thermostat to hottest, tank thermostat to hottest, open up all
TRVs to the max and make sure programmer says HW off and CH off.
Get yourself a multimeter and identify the Call for Heat input on the
boiler. This should be simple, the incoming connections will be Live,
Neutral, Earth and Call for Heat.
Activate the HW using the Override facility on the programmer. Call for
Heat input on boiler should now become live. Boiler should fire, pump
should start, Mid-position valve should be in HW only position which is
"at rest", i.e. there should be a significant resistance when
trying to move the lever on the valve by hand.
If you get no Call for Heat signal, either the programmer or the wiring
in between is knackered.
If the boiler doesn't fire or the pump doesn't circulate, you have
a boiler / PCB problem.
If you get CH instead of HW, or if you get CH and HW, then your mid
position valve is knackered. (feel the pipes coming from the mid
position valve to confirm which position the valve's in).
Turn off HW and activate CH.
As above, you should get a Call for Heat signal, boiler should fire,
pump should start. This time the Mid-position valve should be fully
activated, i.e. there should be no resistance at all when trying to
move the lever on the valve by hand.
Other results can be interpreted as above.
If the valve is not fully activated then it is knackered. You will most
likely get HW instead or a combination of CH and HW.
Turn on both CH and HW.
Results will be as far CH only but the mid-position valve will now be
in a central position and both pipes from the valve will become warm.
If all these results check out okay, then your boiler and associated
plumbing and valves etc is working fine, and the problem is with the
programmer. Easy!