f20bbfa40d
Closes the #99758 review P1 (andrexibiza): with a generation claim in play, `interrupt()` called `_admit_hard_cancel()` BEFORE the claim was validated at the final mutation edge, and the production `CompressionCommitFence.cancel_before_commit()` irreversibly sets `_cancelled = True` whenever no commit has started. So a watchdog abort that ultimately DECLINED (real progress landed in the window, claim went stale) had already killed the recovered turn's legitimate pending compression commit — `begin_commit()` refuses a cancelled fence forever. Generation authority covered interrupt publication but not the compression-fence mutation that preceded it. Split hard-cancel admission into two halves: - `_wait_for_compression_commit()` runs pre-claim and is NON-mutating: it only blocks when `commit_in_flight` is true (the started-commit branch of the production fence waits for `finish_commit` without cancelling), so the interrupt still publishes only after an in-flight SessionDB mutation has finished — exactly as before. - `_cancel_pending_compression_commit()` runs AFTER `_consume_claim_and_publish_first_state()` survives, so the destructive pending-commit cancellation can never outlive a stale claim. If a commit crossed its boundary in between, it is no longer fence-cancellable and completes on its own. Regression coverage (both use the real `CompressionCommitFence`): - `test_declined_abort_does_not_cancel_pending_compression_commit`: parks the interrupt at the claim-reservation release, lands real progress (G+1), lets the interrupt decline, then proves `fence.begin_commit()` still admits. Red on the pre-fix tree (mutation-checked: the fence was left cancelled). - `test_declined_abort_parks_and_leaves_fence_operational`: the in-flight-commit window variant — activity lands while the interrupt waits on a started commit; the interrupt declines and a fresh `begin_commit()` still admits afterwards. - The round-6 witness (`...resumes_inside_interrupt_publication`) now models an in-flight commit (`commit_in_flight = True`) so its park point stays inside the pre-claim wait, matching the new admission shape. Also updates the `interrupt()` docstring for the deferred destructive cancellation.