basquetWi + New ticket
pluto PLUTO-735

Segment error boundaries drop the client error payload PLUTO-83 added

Done normal unassigned

11 of 12 route-segment error.tsx boundaries render <ErrorCard kind="error" digest={error.digest} reset={reset} /> and never forward error.message/name/stack. ErrorCard (src/components/error-card.tsx:94) forwards whatever it is given into logClientError, and client-log-actions.ts:45 writes those into the first-class appEvents errorName/errorMessage/errorStack columns - so every error caught by a SEGMENT boundary persists a row with all three columns null and digest null, which is exactly the opaque {path, digest:null} shape PLUTO-83 existed to eliminate. Only src/app/error.tsx forwards them; PLUTO-83 fixed the root boundary and the card and missed the segments, so this is drift, not an original omission. Measured on a live alert: appEvents 6e774408-ee52-4ad8-b4ab-398a3f799c72, clientError:error on /practicas/nueva 2026-09-10T20:30:19Z, appVersion 2.23.80, detail={path,digest:null,referrer} and nothing else - the user's actual failure is unrecoverable. Affected: (protected)/ admin, administrar, alumnos, equipo-academico, informes, mi-cursada, mi-cursada/[id], notificaciones, perfil, practicas, practicas/[id]. Scope: forward the three props in all 11, matching src/app/error.tsx exactly; add a guard test walking src/app for error.tsx files that asserts each forwards all three, mutation-checked by reverting one file. Do NOT copy the STALE_ACTION_PATTERN reload block into the segments - that is a separate defect, tracked as the follow-up below. FOLLOW-UP (do not fold in): the stale-Server-Action auto-reload exists only in root error.tsx and global-error.tsx, but a segment boundary catches first, so a stale action thrown inside /practicas or /admin shows the card and never reloads. If a post-fix row on this path carries errorMessage matching /Server Action .* was not found/, that is the confirmed cause of this incident and the reload gap becomes its own WI.

Sub-tickets

No sub-tickets.
+ Add sub-ticket

Activity

  • wi-cli-venus created · 5w ago
  • wi-cli-venus statusChanged · 5w ago
    Shipped 9b1ee04. 11 segment boundaries under (protected) now forward error.message/name/stack to ErrorCard; guard test src/lib/error-boundary-payload.test.ts walks src/app for error.tsx + global-error.tsx and asserts each reads all three off the caught error, with a >=12-file floor so an empty walk cannot pass vacuously. 14 tests pass, mutation-checked by reverting perfil/error.tsx alone (exactly that one case fails). tsc --noEmit and eslint clean on the touched files. COVERAGE STATEMENT on the alert that triggered this: the 2026-09-10T20:30 /practicas/nueva incident is NOT resolved and its cause is unrecoverable - that payload was never persisted. What is observed: three clientError:error rows 3s apart, one actorUserId, one user in 7 days on that path, and no server-side error on that path in the Vercel runtime-log window (error/fatal, 90m) - so one user retrying a client-side crash, not a broad pattern. Not exercised: any reproduction of the crash itself. Next occurrence will carry message/name/stack. FOLLOW-UP not folded in: the stale-Server-Action auto-reload exists only in root error.tsx and global-error.tsx, but a segment boundary catches first, so a stale action thrown inside /practicas or /admin shows the card and never reloads - if a post-fix row here carries an errorMessage matching /Server Action .* was not found/, that is the confirmed cause and earns its own WI.
  • wi-cli-venus completed · 5w ago
    Shipped 9b1ee04.
task
5w ago by wi-cli-venus
5w ago
2026-09-10 20:39