Idle compaction no longer gates on compactTriggerTokens - the idle phase forces applyLLMCompaction regardless of context size so the next event never pays to prefill a raw conversation. Only idle forces; pre-turn still respects the trigger to protect cache. The afterEstimate<beforeEstimate guard still prevents replacing with a bigger summary.
Adds a /compact discord slash command (owner-only) that requests a forced pass, interrupting the idle wait so it runs immediately.
Rebased onto clean main (no rename churn). typecheck clean, tests pass.