Tux Racer parent-relative static candidates — 2026-10-28

Candidate repair based on 032f75ff582aa635ff78baf71febbd0e9a77bd78 (production tool integrated at ac4fdeb31c20d5bd869f201c9c051ad5bc663ca6). Original tool SHA-256: 567a716c33e97d9c8547a02c77ff10dc1839308afb45c3fe9848effb60a3134d.

literal_sources previously classified every literal containing .. as unknown, even when its script-directory candidate was retained. It now normalizes each root/script-directory candidate lexically with a component stack. A candidate that attempts to escape the extraction root is discarded immediately. When all candidates escape, the expression stays explicitly unknown with a reason; when an in-root candidate exists lexically but none is in the inventory, the audit rejects it as missing. Candidate lookup uses inventory names and never opens or stats literal targets. Existing extraction symlink/path guards are unchanged.

Absolute, drive, backslash, computed/substitution and unsupported Tcl forms keep their prior unknown behavior. In particular, $tux_data_dir is never inferred. Lexical candidate presence does not establish runtime resolution: runtime CWD, Tcl interpretation and runtime filesystem/symlink semantics remain unknown.

Eight focused tests passed once, invoking the exact changed production function first. They cover existing and missing parent targets, nested normalization and both candidate bases, root escape without target reads, absolute/drive/backslash forms, computed expressions, non-following of an unlisted symlink, and a rejecting mutation restoring the historical parent exclusion. The mutation silently makes both existing and missing parent literals unknown; the test oracle rejects it. Command: python3 test/test-tuxracer-parent-relative-static-closure-repair-oct28.py.

Only the changed literal_sources audit was run on the retained original inventory/extraction. The six previously checked literals remain checked. courses/common/tux_moonwalk.tcl -> ../common/tux_walk.tcl adds exactly one checked candidate: tuxracer-win32-0.61a/courses/common/tux_walk.tcl. Counts change from 6 checked / 2 unknown to 7 checked / 1 unknown. The remaining unknown is "$tux_data_dir/courses/common/courseinit.tcl".

Reuse the prior six-method integrated acceptance and real-original 158-file, CRC and direct-import evidence by exact pins in /home/user/wine-assembly/scratch/usage-watch/tuxracer-integrated-original-media-validation-oct28/receipt.json. No archive hash/census, extraction or full recipe replay was performed here. This is static candidate analysis only; dynamic Tcl, runtime and gameplay are unqualified. Independent acceptance is required before integration.

Task-owned command/output, source/input pins, resource measurements, publication and cleanup are bound by /tmp/tuxracer-parent-relative-static-closure-repair-oct28/receipt.json. The oversized shared messageboard is coordinator-owned for publication; use the sibling publication-note.txt. No main push or runtime/Boat operation occurred.