fix(canary): accept null events from manage response

Backend serializes `Events []Event` as JSON `null` when the slice is nil
(Go's zero value for slices). Spec §8.4 shows it as an array — stale spec,
verified actual behavior with `curl http://localhost:22784/api/m/<uuid>`
returning `"events": null` on a freshly-created token with no triggers.

Zod schema was `events: z.array(eventResponseSchema)` — failed to parse the
null, threw PARSE_ERROR, manage page rendered "CANNOT REACH ARCHIVE" instead
of the empty dossier.

Fixed: `.nullish().transform(v => v ?? [])` — accepts null/undefined and
normalizes to []. Manage page's `events.length === 0` empty-state check
("No events recorded yet") now reachable; consumers always see an array.

Caught by memory rule feedback_verify_data_shapes.md: trust reality > spec.
I trusted §8.4's example object during Phase 14 schema design instead of
hitting the live endpoint. Same kind of drift as the four Phase-14 spec-vs-code
divergences cleared at the time — this one slipped through because
TokenManagePage was never end-to-end exercised pre-UI.
This commit is contained in:
CarterPerez-dev 2026-05-17 17:58:13 -04:00
parent 915d471b8d
commit 44927b245c
1 changed files with 4 additions and 1 deletions

View File

@ -47,7 +47,10 @@ export type ManagePage = z.infer<typeof managePageSchema>
export const manageResponseSchema = z.object({
token: manageTokenViewSchema,
events: z.array(eventResponseSchema),
events: z
.array(eventResponseSchema)
.nullish()
.transform((v) => v ?? []),
events_total: z.number().int().nonnegative(),
events_silenced_active: z.number().int().nonnegative(),
page: managePageSchema,