basquetWi + New ticket
mars MARS-412

Log native HTML5 validation hints as friction events (any user-facing feedback = logged; native constraint-validation currently bypasses the toast/checkRequired path)

Done normal unassigned

Elazar directive 2026-07-07 (clarifies the friction/toast logging criterion): the criterion for what gets logged is ANY app feedback shown to the user. That EXPLICITLY includes native HTML5 constraint-validation hints (required-field 'Please fill out this field', pattern mismatch, min/max, type=email, etc.) — those are user-facing feedback and today BYPASS the JS toast/notify() + checkRequired friction path entirely (the browser renders them natively, no JS fires), so they are an uncaptured coverage gap even post-MARS-408. Goal: every native validation hint the browser shows also produces a friction-tier appEvents write (info/warn), same as a validation toast. Known capture point: a capture-phase global 'invalid' event listener (document.addEventListener('invalid', h, true)) catches every native constraint-validation failure without touching each form; solo picks the actual approach. Log-only, security-inert, reversible, independent of the MARS-411 column contract. Fleet-wide criterion (pluto/venus mirror); this is the Mars leg. Relates MARS-408 (friction telemetry), MARS-69 (UX friction epic).

Sub-tickets

No sub-tickets.
+ Add sub-ticket

Activity

  • wi-cli-venus created · 2026-07-07
  • wi-cli-venus commented · 2026-07-07
    Scope grew (coder-mars, pre-build): Mars's shipped MARS-408 friction path (postFriction, use-action-form.ts) does a keepalive fetch to /api/log-toast — a 'log'-leading adblock-baity endpoint → ERR_BLOCKED_BY_CLIENT silently swallowed for any adblock user (same hole venus hit; curl never reproduces). So MARS-408 friction telemetry has been silently adblock-blind since it shipped (UX-pain digest undercounts adblock users). MARS-412 pass now also: (1) rename endpoint to neutral /api/internal/ux-beacon, (2) client write via navigator.sendBeacon, (3) route BOTH MARS-408 validation logs and new native-'invalid' logs through the one un-blockable endpoint, (4) server sink awaited in-request + prove row lands. Touches shipped MARS-408 client path (flagged in coverage note). Still Class-S/reversible/security-inert. Post-compact.
  • wi-cli-venus commented · 2026-07-07
    Elazar decision 2026-07-07: fleet-wide telemetry transport moves to SERVER ACTIONS (adblock-immune — posts to page URL, no /api path for filter lists to match), replacing the /api/log-toast rename approach. Timing: venus converts NOW; Mars + Pluto AFTER Fri Jul-10 when the Anthropic token cap resets. MARS-412 HELD until post-10th, then built on the server-action write path: route both MARS-408 validation logs and new native-'invalid' logs through a server action instead of keepalive fetch; keep sendBeacon only for any caller that must fire during page unload/navigation (server actions can't fire on unload).
  • wi-cli-venus completed · 5w ago
    Shipped under MARS-419, different WI number, same acceptance criteria. src/components/native-validation-boundary.tsx: capture-phase global 'invalid' listener mounted once at src/app/layout.tsx, routes every native HTML5 constraint-validation failure through logFeedback() -> feedbackTier() (closed info/warn mapping, feedback-core.ts:126-128), category='toast' (feedback-actions.ts:95, sole writer of that category fleet-wide). Scope-growth item (1) also resolved: /api/log-toast is retired (confirmed dead, comment-only references in ux-pain-digest.ts); feedback-actions.ts is the live replacement.
task
2026-07-07 by wi-cli-venus
5w ago
2026-09-11 10:40