No answer is cut any more. `browser_read_text` stopped at 6000 characters with a line asking for a larger `max_chars`, `browser_evaluate` and the browser listing became `{"truncated": true, "preview": ...}` above the same number, and `browser_snapshot` dropped elements from the end. `max_chars` is gone from both tools, with `DEFAULT_MAX_CHARS`, `json_capped` and `capped_elements`; a caller who wants less narrows the selector. The limits `clean.py` applies to the HTML stay.
`browser_read_text` right after `browser_navigate`, on a page that replaces itself, failed with "Failed to find execution context" 9 times in 10: it counted, then evaluated on the first match, and the page moved on between the two. It now finds and reads in one call, with the selector still resolved by the engine.
The floor moves to invisible-playwright 0.35.0 (invisible-core 41.36.0): a read caught by a navigation is made again on the page that took its place, and a navigation the previous page's own redirect beats answers at once, naming where the browser went, instead of after the 45 s timeout. `browser_navigate`'s description says what that answer means.
The docs' tool-cost figures are measured again on 0.72.0 with their own published method: 17 tools, 9,207 characters of description, 3,497 tokens of complete definitions, median 189 per tool.