Py_INCREF and Py_DECREF are the real macros threaded through every function in the CPython C API, and getting them wrong in a C extension is the single most common source of use-after-free and double-free bugs reported against third-party Python packages. The reference-cycle blind spot you're demonstrating is exactly why CPython layers a separate generational cycle detector (the gc module) on top of refcounting.