Skip to content

The release fan-out's future map is not a last owner, so dropping it saves nothing (2026-09-17)

Index: Known gaps

Status (re-verified 2026-10-09 at 456989f): NEGATIVE_RESULT. A negative result: dropping futures saves nothing because results_by_key holds the same objects. abicheck/workflows/release_members.py still exists.

Checked while looking for lifetime wins after the encoder/archive work above, and recorded as a negative result so it is not "fixed" speculatively later.

workflows/release_members.py's parallel fan-out builds futures = {executor.submit(...): key for key in matched_keys} and keeps the whole mapping alive until the with ThreadPoolExecutor(...) block exits. That looks like per-member results being retained for the length of the run, and it is a real retention — but not of the results. results_by_key[key] = future.result() stores the same object the completed Future holds in its own _result slot, so the dict and the future are two references to one result. Releasing the future frees the Future wrapper and nothing else; the per-library result dict stays owned by results_by_key, which the function returns.

So the available saving here is a few hundred bytes per member, not a member's worth of findings, and any patch that deletes futures as they complete while claiming a memory reduction would be measuring its own wrapper objects. A real reduction on this path has to shrink or stream what results_by_key holds — the per-library result payloads themselves — which is a change to what the release fan-out returns to its caller, not a lifetime tweak inside the loop.