Fixed
- Recording against a drifted app state is now refused, not silently mis-recorded. Re-running a roster after the app moved on — a submitted form's button now
disabled, a spent one-time action, a control now under an overlay — slipped the live safeguard (it drove the target with a DOMel.click(), which punches through disabled/covered elements, so the real coordinate-click hit nothing or the overlay = random clicks). The safeguard now refuses ([not-actionable], exit 2) on adisabled/aria-disabled/pointer-events:none/ covered target, routing you to reset the app to a fresh state. Occlusion is viewport-guarded. - Audit driving matches real typing.
fillnow sets via the native input setter and dispatchesinput+change+blur, so a submit gated on change/blur/controlled-state enables during the audit too — theform-flowpreset is no longer false-refused.
Tests: 576 unit + a 22-case real-Chromium battery (premise, verdicts, audit before/after, form-flow regression, rec.mjs E2E).