c0667439ec
TUI server shutdown stamps ended_at/end_reason='tui_shutdown' on sessions whose agent keeps running; every rotation then aborts at publish_compression_child's liveness check forever (the #88197 wedge; the amplification half was fixed by #88411). Class fix: is_automatic_end_reason() in hermes_state_common owns the "accidental infrastructure cleanup vs deliberate boundary" taxonomy. publish_compression_child clears automatic stamps in its own transaction and proceeds (parent re-closes with its TRUE boundary, end_reason='compression'); the #88411 pre-flush guard no longer aborts on stamps the publish can heal. Deliberate boundaries (compression, session_reset, explicit close) still fail closed at both sites. TEST REPIN (deliberate contract change): test_ended_parent_aborts_before_the_prepublish_flush pinned "tui_shutdown stamp => rotation aborts and parent must not grow" — the abort it required IS the #88197 wedge. Repinned as two tests: - test_automatic_stamp_no_longer_wedges_rotation: automatic stamp => rotation COMMITS (no abort loop, so no growth-by-abort is possible); - test_deliberately_ended_parent_aborts_before_the_prepublish_flush: session_reset (deliberate boundary) => still aborts BEFORE the #47202 flush, preserving #88411's no-growth contract where an abort remains correct. The class invariant "no aborted rotation grows the parent" holds everywhere: automatic stamps no longer produce aborts, deliberate boundaries still abort pre-flush.