So I started looking around at the versions and dates of various copies of asynchat.py. Here's what I found:
source version number:date owner Python 1.5.2 1.2:1999/06/18 guido Python CVS 1.2:1999/06/18 guido Zope 1.? 1.7:1999/04/09 amos Zope 2.0 1.9:1999/07/19 amos Medusa 990902 2.24:1999/07/07 rushing
What's apparently been happening is that people have picked up asyncore and asynchat at various time and stuck them in their own CVS repositories without somehow freezing the Id string of the version they originally got from Sam Rushing. It's not clear what the differences are until you compare the actual files. It turns out that the Zope 2.0 and Medusa versions have no content differences, only wildly different version numbers. The Medusa and Python CVS versions only have one difference:
if index > 0: # don't bother reporting the empty string (source of subtle bugs) self.collect_incoming_data (self.ac_in_buffer[:index])
which *may* be what's causing my problems (note the IndexError in my traceback).
My bad. I despise putting RCS identifiers in code I release, but I don't always freeze them before incorporating other people's code in my CVS tree. I will fix this if I can and I promise to try not to repeat this mistake in the future.
--Guido van Rossum (home page: http://www.python.org/~guido/)