Mike,
I went through your solver's derivation and it seems to check out. One thing worth noting is that your solver is not getting the biggest "bang for its buck" out the ALS. As your solver output does not give all of the deductions, I'm sure where the first instance it misses something is exactly, but in Step 23 and Step 24 you have:
Mike Barker wrote:Almost Locked Set: xz-rule with A=2 cells: r3c17, r12c8|r3c9 => r2c7<>8
Mike Barker wrote:Almost Locked Set: xy-rule with A=1 cells: r3c1, r3c7|r12c8, r35679c9 => r1c9<>4
From this, I concluded that in Step 23, r1c9<>4 is not one of the hidden deductions. However, it can be deduced from precisely the same set as was used in Step 23. This is because the 5 cells in that step contain 5 candidates and hence is a locked set. Therefore, we may conclude r2c7<>8 (which you concluded from the xz-rule) as well as r1c9<>4 and r12c9<>9. Naturally, these extra deductions do not come from the xz-rule, but from aeb's subset principle (see
http://forum.enjoysudoku.com/viewtopic.php?t=3479&highlight=subset+principle). One of the beauties of the principle is that it does not only apply when the cells form a locked set, but even almost locked sets (or worse). For instance, one could now replace the deduction in Step 24 with r8c8<>9 (from the same ALS) which will create locked 9's in box 9 which will lead to r3c9<>9.
I'm sure there are other places where it might be useful, I just can't say exactly where since I don't know precisely what your solver deduced at each step. As I am not a programmer, it is not clear to me whether or not this would be difficult to add to a solver, but given the relative ease with which I can find the deductions (having been given the appropriate sets), I can't imagine it being so bad.
[Edit: I don't know why I didn't see this before, but you use the exact same locked set in the two VWXYZ steps (Steps 20 and 21). So you can, starting from just after Step 19, make all of the deductions at once from that one locked set, namely: r3c46<>6, r3c6<>5, r1c9<>4, r2c7<>8, r12c9<>9. Not bad.]