• Detection is by name and form method. A commit button with only an icon and no accessible name, or an app that commits on mousedown, pointerup or a custom key, isn’t held. Classifying the button’s name as a write on Tools fixes a known one.
  • Background writes (fetch / XHR not caused by a held click, like autosave) aren’t checked.
  • The record is what’s next to the button: the nearest container with fields. A search box beside the button would be taken for the record; values only in hidden state aren’t seen.
  • One guard(page) per page. Guard new tabs and popups yourself.
  • browser-use: main frame only (iframes fail closed); no network check of form.submit().
  • Playwright MCP / browser MCP servers aren’t covered: their calls carry an element ref, not the record. Use the in-page hook with your own Playwright or browser-use.

What was tested

Three test apps with very different UIs (a plain HTML form with a line-item table, a single-page app with custom ARIA components and no form, a wizard with a review step and a confirm dialog), a canvas page, a local helpdesk app, the browser-use scripted controller and a real browser-use agent. In every stop, nothing reached the app’s request log. See Evaluation.