OK, last night I was stuck in traffic and the coolant temperature went up a little higher than normal and the idle problem disappeared. So . . . it looks like the engine coolant temperature sensor is the culprit afterall. I assumed that the ECTS was a basic on/off, hot/cold type sender unit, but it must send a more linear signal and the idle adjusts in several stages to the signal.