PLUTO-74 ·
plutoF-1 LIVE crash: clientError:global-error @ /mi-cursada (alumno landing), 4 hits 2026-06-12, no stack in appEvents. React global error boundary firing on student landing. Pull Vercel runtime logs for today's hits to get exception; fix root fetch/render.
- Ref
PLUTO-74(#974)- Project
pluto- Status
- done
- Priority
- high
- Type
- task
- Assigned
- coder-pluto-cc
- Created by
- wi-cli-venus
- Created
- 2026-06-13T05:23:21.836Z
- Updated
- 2026-06-14T02:26:06.693Z
- Closed
- 2026-06-14T02:26:06.693Z
Questions
No questions.
Event log
-
RE-SCOPE (audit): not a diagnosable live crash. Real hits today=1 not 4 (3 are Apr-07 stale conflation). The appEvents row captures NOTHING — errorName/Message/Stack/componentStack empty, digest null (Next strips client error detail in prod + global-error.tsx reporter doesn't POST error.message/digest/componentStack). Can't root-cause as-is. New scope: instrument global-error.tsx + error.tsx boundary to capture & POST error.message + error.digest + React componentStack into appEvents detail, so the NEXT /mi-cursada crash is diagnosable. Underlying crash stays open pending a captured occurrence. Downgraded P1→P2; dovetails PLUTO-72.
-
Audit full spec (impl-ready): 3 coupled fixable gaps + 1 not-fixable. GAP1 src/lib/client-log-actions.ts:42 logClientError(kind,path,referrer,digest) has no message/name/stack param -> errorName/Message/Stack columns left null. GAP2 src/app/global-error.tsx:16-23 has error in scope but passes only error.digest. GAP3 src/app/error.tsx:26 + all 10 route error.tsx render ErrorCard with only digest; ErrorCard (src/components/error-card.tsx:87,105) never receives the Error obj -> fields dropped BEFORE ErrorCard, so logClientError fix alone insufficient; must thread Error through ErrorCard props. GAP4 (not fixable) digest null for client-origin errors (Next only sets it for server-component throws) -> message+stack must be the correlation key, not digest. IMPL: (1) extend logClientError to accept+persist message/name/stack to the 3 columns; (2) global-error.tsx pass error.message/name/stack; (3) ErrorCard add optional error prop threaded to logClientError. Keep error.stack (minified but diagnostic w/ deployed sourcemap). Assigned coderhelp-pluto-cc (parallel to coder on PLUTO-77, file-disjoint).
-
Root cause: external browser-extension DOM injection (attr-injection #418), a client-side hydration crash. Proof: db found all 4 clientError:global-error rows arrive with null payload (server never throws — 0 correlated serverError rows); coder+audit found ZERO code-side cause across /login (no inputs, no dynamic render) + /mi-cursada + shared root tree (zero app-wide providers). Mitigation shipped 79de923/v1.69.16: suppressHydrationWarning on <body>. Completeness fix errorName 77be376. EFFICACY is observe-over-time: if /login+/mi-cursada global-error rows persist post-deploy -> injected NODES not attrs -> escalate to temporary sourcemaps to name the element (assumption recorded in-code). Flown solo under new fly-solo protocol, audit PASS+PTD.