SafeBind capture-path test harness
Four variants of the same quote form. The consent language, the /partners link and
the form fields are byte-identical across all four — the only thing that
differs is what happens to the DOM on submit. That is deliberate: it is the only way a difference
in capture can be attributed to the thing that changed.
Pick a variant
Each card says what it does to the DOM and what the cert should do in response.
/form/
Hidden on submit
- DOM
- Consent control is hidden (
display:none) and stays in the DOM. - Churn
- None. One form, one DOM, first paint to submit.
- Exercises
- Hidden control → no terminal signal.
Cert should stay pending — nothing tells the SDK the control went away.
Open /form//form/removed/
Removed on submit
- DOM
- Consent control is removed from the DOM entirely.
- Churn
- None until submit, then the form detaches.
- Exercises
- Terminal signal on detach.
Should produce a fast seal. This is the only difference from /form/.
/spa/
Re-rendered away
- DOM
- Steps genuinely mount and unmount; the consent step is re-rendered away on submit.
- Churn
- Real.
pushStaterouting, nodes leave the document. - Exercises
- Consent control removed by re-render, not by an explicit teardown.
Should hold, then seal after a quiet window.
Open /spa//spa/remount/
Unmount, then remount unticked
- DOM
- Consent step unmounts on submit, then remounts 1.5s later with the box unticked.
- Churn
- Real, twice. This is the production shape.
- Exercises
- A remount reading as the control being attached again.
The hold must not seal. If it seals, that is the bug.
Open /spa/remount/Why the SPA variants matter most
Every seal-latency number we have comes from one account whose SDK re-initialises mid-funnel and
breaks batch sequencing — fast-finalize has been attempted 3 times in production and
succeeded 0 times. A single-page harness cannot reproduce that by construction. The two
/spa/ variants can.
Reading a run
Every variant prints a diagnostics panel after submit: the variant name, the submit timestamp,
whether the box was ticked, whether the SDK loaded, the journey token and the
cert URL. Check the journey token first — t.js caches one in
localStorage for 8 minutes, and every variant clears it on load so each run mints
its own. If two variants ever report the same token, you are reading one cert's evidence while
looking at another's, and the run is void.