v0.0.58, the stable ABI
R07, the stable ABI, which is the lesson about what stands between a compiled extension and a working module.
There are two gates. The first is the file name, and it is decided before anything is opened, from a fixed list of tags compiled into the interpreter. The lesson drives it by putting empty files in temporary directories and asking the finder what it sees, which is enough to show why abi3t exists: a free threaded build refuses abi3 and takes abi3t, an ordinary 3.15 build takes both, and 3.14 has never heard of abi3t.
The second gate is PyABIInfo, twelve bytes and new in 3.15. Because PyABIInfo_Check is a plain exported function, the lesson builds the struct in ctypes and calls the real check, so the four refusals it collects are CPython's own error messages rather than a paraphrase.
Two Tier 1 recordings run both gates on a release build and on a build made with --disable-gil. Six file name tags become four, four refusals become six.
Six diagrams, three glossary terms, and ten notebook cells that all run under Pyodide.
R08 and R09 left on M8.