Since Python 3.8 the default event loop on Windows is ProactorEventLoop, based on I/O completion ports. It supports subprocesses, which the selector loop does not, but it does not implement loop.add_reader and loop.add_writer. Libraries that register a file descriptor directly, including some database drivers and DNS resolvers, fail on Windows with NotImplementedError and no other explanation.
The workaround is to select the other loop before running anything: asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) on Windows only, guarded by a platform check. The cost is losing subprocess support on that loop.
A second Windows-specific quirk is the ConnectionResetError traceback printed at shutdown by the Proactor loop when connections close abruptly, which is noise rather than a real fault. Both issues are Windows-only, so a Linux CI pipeline will never surface them. If Windows is a supported target, run the suite there. Note also that the event loop policy API is itself deprecated in recent versions, so prefer a runner such as asyncio.Runner with an explicit loop factory where available.