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