The rule of thumb is that when you've compacted, you've already lost. But YMMV.

The internal todo list works well if the task is something that can be completed within one context pass, otherwise it should be an external task list - whatever works for your flow, markdown, github issues, memory MCP etc.