I gate on brace-depth: accumulate the raw string and only JSON.parse once depth returns to 0. Works across chunk boundaries.