Skip to content

BuildNot yet confirmed elsewhere1 publisher3 min readPublished

One boolean on the click step decides whether the agent's browser launches at all

Webhands refuses any recipe containing a write-marked click until the caller resends it with confirm:true. That check runs before Cloudflare provisions a browser, so no mutation ever gets caught half-executed.

The Engineer · Build desk

How we use AISend a correction

Illustration accompanying One boolean on the click step decides whether the agent's browser launches at all
Generated illustration

What happened

  • A developer published Webhands, a computer-use agent that logs into dashboards with no usable API, drives them in a real headless browser, and refuses any write action without explicit confirmation.
  • Its exported Step type is a union of four actions, and only click carries an optional write boolean, which makes that one flag the entire read-versus-write classification scheme.
  • A recipe containing a write step returns ok:false with the error "recipe contains a write step; resend with confirm:true to execute", and the caller must resend the identical recipe to proceed.
  • It runs on Cloudflare Workers with Browser Rendering, dropping to a dry mode that returns the plan it would have executed whenever the BROWSER binding is absent.

Why it matters

  • constraint Approval granularity is the whole recipe, not the button, so anyone who wants per-mutation sign-off has to split write clicks across separate recipes rather than batching them.
  • exposure Correctness now rests on whoever writes the recipe: mislabel a destructive button as a read and it executes with no prompt, which makes this a labelling review problem rather than a browser containment problem.
  • decision Because dry mode returns a plan without a paid binding, the spend on Cloudflare Browser Rendering can be deferred until recipes are already authored and tested.
  • capability Every run hands back a base64 screenshot of what the browser saw plus the ordered log of actions taken, which is the evidence an operator needs when a mutation is disputed after the fact.

The gate is a static predicate over a JSON document, not a runtime interceptor. `hasWriteStep` walks the recipe and returns true if any step is a click marked `write: true`; when `confirm` is absent, the handler returns an error and never opens the browser [10]. The ordering is the part worth copying. The refusal lands before the browser is provisioned, so there is no window in which a write step has partially executed and then gets caught [12].

That is a different boundary from the one people usually reach for. Sandboxing isolates the process from the host, but the authority here sits elsewhere: in the logged-in session. The author's framing is that handing an agent a real browser session gives it everything the logged-in human can do, including issuing a refund or canceling an order [3]. Filesystem containment does not extend to refund authority.

The arithmetic on the gate is worth spelling out, because it sets the granularity. The check is one boolean AND evaluated once over the whole recipe [9]. Confirmations required per run is therefore one, regardless of how many write clicks the recipe holds: six write-marked clicks and one write-marked click both unlock on the same `confirm: true` [21]. A confirmed mutation costs exactly two requests carrying the identical body, since you resend the same recipe to execute it [22] - the first refused before any browser starts, the second doing the work.

There is a hole in the classification. It is visible in the type union. `goto` is treated as inherently safe, and the author states that the only action which can change state is a click [6][7]. Any mutation reachable by navigating to a URL sits outside the gate by construction [23]. Plenty of dashboards put a confirm-by-link somewhere in the flow.

For this model to transfer to your stack, two things have to be true. Every state change you care about must be behind a click on a selector you enumerated, and recipes have to be reviewed like code, because the flag is a field in a request body rather than a property of the button it points at [19].

The degrade paths are the best engineering in the writeup. With no Anthropic key set, the prompt-based extractor returns the raw text slice instead of failing, so the pipeline still runs in development [15]. When the key is present it calls the Messages API with a Claude Haiku model, asks for JSON only, strips code fences, and parses, and on a parse failure it returns the unparsed text rather than discarding the result [16]. When the BROWSER binding exists but Browser Rendering is over quota or unprovisioned, the launch is wrapped so it becomes a clean error instead of a crash [18]. Three places where the obvious implementation throws and this one hands back something you can inspect.

If I were adopting it, I would start on the extraction path that takes no model at all: a list of `fields` with CSS selectors, scraped directly [14]. A stale selector fails loudly, while a Haiku extraction that drifts one field fails quietly, and quiet failures in a pipeline that also holds a refund button are the ones that cost money.

What to watch

  • Whether the write flag moves server-side into a per-dashboard selector allowlist, so recipe authors stop being the trust boundary.
  • Whether per-step confirmation tokens appear, which would stop one confirm:true from approving a multi-write batch wholesale.
  • Whether callers actually check the returned mode field, since a dry result looks like a success and executes nothing.

Clarity's read

What the record supports and how the coverage leans. The claims behind it follow.

Reality

Evidence42
Adoption
Insufficient
Hype gap+16
Incentives55
Confidence38
Why these scores

Claim ledger

Ranked by verification strength, evidence, and original report placement.

  1. [1]

    Webhands is a computer-use agent that operates dashboards in a real headless browser, returns clean structured data, and refuses any write action unless the caller explicitly confirms it.

    ReportedSupportedSource: Webhands author, writing on dev.toView cited source
  2. [2]

    The author's stated motivation is tools with no usable API: seller centers, supplier portals and 3PL dashboards where the only way to get the data is to log in and click through the UI like a human.

    ReportedSupportedView cited source
  3. [3]

    The author writes that the moment you hand an agent a real browser session you have given it the power to do everything the logged-in human can do, including issuing a refund, confirming a shipment or canceling an order.

    ReportedSupportedSource: Webhands authorView cited source

Sources

1 independent publisher whose own reporting we read for this story.

  1. dev.to

    1 article · August 29, 2026

    Read freely, confirm before writing: a safety model for computer-use agents

Share your take

Let Clarity write the post for you.

Signed-in readers get a short post drafted on this story in the register they choose — narrative, analytical, or a direct position — editable to the last word before it goes anywhere. The share buttons at the top of this story work without an account.

Topics and entities

Follow any of these and your For You feed starts watching them — no settings page required.

Topics

Loading related stories