- After the completion child answers (or the A6 branch resumes), the post-commit
resume attempt is settled: its failure is already the windows_resume follow-up,
so the parent's atexit net is unregistered and the command's finally does not
replay it. A replay waited again and, on the ZIP route, its RuntimeError reached
main.py's BaseException handler: exit 1 and "/update failed".
- The ZIP and CalledProcessError finally blocks resume only what is still owed and
report a failure as the windows_resume follow-up instead of raising.
- update_finish (historical takeover) records a refused resume as a follow-up and
keeps its exit status (was code = 1), and reports the attempt as handled so the
historical parent does not replay it.
Tests (real processes, refusing SCM resume is the only service seam):
test_zip_update_never_replays_a_refused_resume_after_the_commit_point,
test_refused_gateway_resume_after_commit_is_a_followup_not_exit_1.