Thanks for the suggestions, they helped me find the problem - extensions!
When there is an extension, the current depth is incremented and a new search invoked. When that search returned, any cutoff value was being stored at the extended depth. By changing this so that the non-extended depth is stored in the ttable, the >= comparison works, and my ecm/sac/wac test suites don't get lower scores than when just using >.
I still think this is not quite right however. When you think about it, modifying the current depth for an extension is kind of a "trick" to get the search to go deeper than it otherwise would. If I had two plies, both extended, my current scheme would be incorrect below the second extended search. What I think I really want to use is the "nominal" search depth (i.e. as if no extensions had occurred anywhere in the tree).
All of this probably has to be understood in the context of my t-table implementation which is slightly unusual in that I happily admit qsearch results. (Not only that, but I do not force depth=0 at horizon - I allow depth to go as negative as the "below horizon" part of the search takes it. So, all values at depth > 0 in the ttable are above the horizon and all results <= 0 are below it.
I do this partly because I don't have separate routines for main search and q-search but mainly because I have come to the conclusion that putting qsearch values in the ttable should not cause a problem. After all, the "horizon" is just an arbitrary depth where I am effectively saying lets start truncating the search if we can. So to handle this concept, my move generation routine has 2 pieces of information. 1) am i in check and 2) am i above the horizon. If either is true, all moves are generated, otherwise, just the captures. (not currently promotions or checks). I believe that this means that even below the horizon I can be pretty confident that any value in the ttable is accurate, and empirically at least, this seems to be the case.
Now you can all tell me why this is wrong
Regards
Vince