2026-10-08 UTC; archive directory: /tmp/tasklab-00-20261007 (from frozen chapter 00)
sha256sum /tmp/tasklab-00-20261007/python3.12_3.12.3.orig.tar.xz /tmp/tasklab-00-20261007/python3.12_3.12.3-1ubuntu0.17.debian.tar.xz
exit=0; source-archives.sha256 values match chapter 00 descriptor.
dpkg-source -x /tmp/tasklab-00-20261007/python3.12_3.12.3-1ubuntu0.17.dsc /tmp/tasklab38-src > /tmp/tasklab38-extract.stdout 2> /tmp/tasklab38-extract.stderr
exit=0; original raw output copied to dpkg-source.stdout/stderr. The four source-files.sha256 values were compared with tar xOf original upstream archive: identical per file. Unchecked files must not be inferred identical.
From examples/python-language:
PYTHONPATH=src /usr/bin/python3.12 experiments/38_implementation.py --source /tmp/tasklab38-src > evidence/38/20261008-source/stdout.log 2> evidence/38/20261008-source/stderr.log
exit=0; dis count_words and real CPython source hashes/symbols match, GIL held at two probes, Py_GIL_DISABLED config unset. This does not verify dynamic GIL status on a free-threaded interpreter.
PYTHONPATH=src /usr/bin/python3.12 benchmarks/36_measure.py --samples 2 --iterations 20000 > evidence/38/20261008-source/workload.stdout 2> evidence/38/20261008-source/workload.stderr
exit=0; same four modes/CPU workload on ordinary build, 2 samples/mode; no free-threaded comparison.
PYTHONPATH=src /usr/bin/python3.12 -m unittest discover -s tests -v > evidence/38/20261008-source/tests.stdout 2> evidence/38/20261008-source/tests.stderr
exit=0; 96 cumulative tests OK.
From repository root with initially nonexistent output dir:
PATH=/opt/cloudcli/node/bin:$PATH sh examples/python-language/tools/build_selected_pages.sh /tmp/tasklab38-pages-Ayk5cm > examples/python-language/evidence/38/20261008-source/hexo-mini.stdout 2> examples/python-language/evidence/38/20261008-source/hexo-mini.stderr
exit=0; 39 pages/nav/SVG verified; article SHA/figure assertion exit=0 (pages.log, pages.sha256).
In /tmp/tasklab38-free-threaded after downloading Python.org Python-3.13.9.tar.xz (SHA-256 in free-binaries.sha256):
tar -xf Python-3.13.9.tar.xz
cd Python-3.13.9
./configure --disable-gil --prefix=/tmp/tasklab38-free-threaded/install > ../configure.stdout 2> ../configure.stderr
exit=0; make -j4 > ../make.stdout 2> ../make.stderr; exit=0. Raw output copied as free-configure.* and free-make.*; free-download.stderr records actual transfer. v3.13.9 annotated tag object 8f61118196ba00747076def18ea7ad2c43a1dc05 peels to commit 8183fa5e3f78ca6ab862de7fb8b14f3d929421e0 (free-tag-*.json).
gcc -shared -fPIC -I./Include -I. -o /tmp/tasklab38-free-threaded/legacyprobe.cpython-313t-x86_64-linux-gnu.so /home/admin/workspace/my-blogs/examples/python-language/experiments/38_legacyprobe.c > ../extension-build.stdout 2> ../extension-build.stderr
exit=0. In separate free-threaded process, PYTHONPATH includes source package and legacyprobe directory; sys._is_gil_enabled: False at start, False after _json and tasklab imports, True after legacyprobe import; RuntimeWarning retained in free-runtime.stderr. exit=0. `PYTHON_GIL=1 ./python -c ...` reports runtime True, exit=0 (free-gil-on.stdout).
PYTHONPATH=/home/admin/workspace/my-blogs/examples/python-language/src ./python - <<'PY' > ../workload-gil.stdout 2> ../workload-gil.stderr
import sys,runpy,json
print(json.dumps({'stage':'before_benchmark','gil_enabled':sys._is_gil_enabled()}))
sys.argv=['36_measure.py','--samples','2','--iterations','20000']
runpy.run_path('/home/admin/workspace/my-blogs/examples/python-language/benchmarks/36_measure.py',run_name='__main__')
print(json.dumps({'stage':'after_benchmark','gil_enabled':sys._is_gil_enabled()}))
PY
exit=0; actual benchmark samples and GIL False before/after saved in free-workload.stdout, stderr empty. Same input & task count, different CPython version/build/toolchain and missing extensions; no isolated speedup claim.
Free-threaded focused tests: `./python -m unittest discover -s /home/admin/workspace/my-blogs/examples/python-language/tests -p 'test_async*.py' -v` exit=0 (8); `-p 'test_thread_runner.py'` exit=0 (2); first `-p 'test_process_runner.py'` exit=1 (string-specific assertion), fixed test assertion `-p 'test_process_runner.py'` exit=0 (2). Raw streams all saved free-*-tests.*. Ordinary 3.12 full suite after test refinement exit=0 (96; normal-after-free-tests.*).
Free-threaded complete suite attempted with `./python -m unittest discover -s /home/admin/workspace/my-blogs/examples/python-language/tests -v`: exit=1, 88 tests, 4 import errors + 1 failure caused by unavailable `_sqlite3` (free-full-tests.*). Full SQLite integration with this build and all third-party extension combinations NOT_RUN; full-site build NOT_RUN.
After updating chapter 38 article and its SVG: PATH=/opt/cloudcli/node/bin:$PATH sh examples/python-language/tools/build_selected_pages.sh /tmp/tasklab38-free-pages-UFmO04 > examples/python-language/evidence/38/20261008-source/hexo-free-update.stdout 2> examples/python-language/evidence/38/20261008-source/hexo-free-update.stderr
exit=0; 39 chapter pages and SVG verified; updated article includes 3.13.9, legacyprobe and frozen source commit, separate assertion exit=0 (free-page.log); pages.sha256 updated to newest actual HTML/SVG.
