The owner watched the helper browser get opened, used and never closed. Measured
before touching anything, with the real model on a task that needs both
browsers: six runs out of six left support open at the end, and in the owner's
own sessions one conversation of 247 steps used it 29 times and never closed it.
Three origins, none of them the model:
-
The server's instructions never reached it. They are the one place the
two-browser contract is written - whatsupportis for, and that whoever
opens it closes it - and the loop sent the system prompt and the tool
descriptions and nothing else. The link keeps what the server says at
initialize, and one function builds the system message from this build's
prompt plus those instructions, refreshed at the start of every run, so a
restored transcript and a fresh one carry the same current text. It was
assembled by hand in two places and had the instructions in neither. -
The end-of-turn sentence forbade the very call that closes the helper: "reply
with the answer and do NOT call any more tools", at the exact moment the
close should happen. The order is in the sentence now - closesupportif
you opened it and nothing more needs it, then answer, then no more tools -
without exception vocabulary, because an exception is what a model reaches
for. -
The API cuts every tool description at 1024 characters, and
browser_open
was 1996: the model read it ending mid-word inside the paragraph about
profiles, and the one sentence about closing was past the cut.
browser_click_atwas over too. Both fit now, the contract comes first, and
what was cut moved into comments for a reader of the source.
Measured after, same bench, same task, same model, six runs: support closed
before the answer in six, left open at the end in none. Every sequence ends
with browser_close support.
Gates: every description under the limit and identical to what the loop sends,
executed against the real server; browser_open names browser_close in its
first half; the loop puts the instructions in the one system message and
replaces them run to run; the brain hands the link's instructions to the loop;
the end-of-turn sentence closes before it answers and carries no loophole.