I also really dislike compacting though, and perhaps that is the catalyst for why i never burn unexpected amounts. In my Claude.md i have instructions to wrap up work around 150k tokens, from there i usually have enough of a window of tokens to decide what to do with the work done that session.
sometimes thats a simple ya, in those situations i use the remaining usage to have claude update .claude/ with relevant changes, if i've got more wiggle room for tokens, i might even craft up my next plan which is usually TDD style, and i have it write the failing tests before ending the session and passing the handoff.md which is the finished plan to a fresh context window.
This is probably not the best way for rapidly getting stuff done, but i think its one of the best ways to be effective with less usage at your disposal.