The frontend wraps canvas.onDrawForeground again whenever its DOM widgets mount, and the wrapper calls the highlighter's hook, which then called the wrapper. The hook now keeps every function it replaced and goes one level down per call, so each runs once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>