Het fast-tier model (Haiku) geeft de tool-velden key_points en topics_covered soms terug als JSON-gecodeerde string ("[\"…\"]") in plaats van een echte array — precies de Zod-fouten uit het issue (expected array … invalid_type op beide velden). Dezelfde faalklasse waar quizQuestionsSchema al een z.preprocess-guard voor heeft; het onboarding-schema miste die.
Fix (twee lagen)
Schema-normalisatie (onboardingOverviewSchema): strings die op [ beginnen worden vóór validatie terug-geparsed naar arrays; een bullet-/regellijst als string wordt als fallback gesplitst; >5 kernpunten worden afgekapt op 5 i.p.v. de gebruiker te laten stranden. Écht foute output (te weinig punten, niet-JSON-strings, verkeerde types) faalt nog steeds.
Prompt-side nudge: de tool-beschrijvingen stellen nu expliciet "must be a JSON array — never a string".
Geen datamigratie nodig: de validatiefout trad op vóór het cachen, dus er staan geen kapotte rijen in onboarding_overviews.
Verificatie
5 regressietests die de exacte #32-payloadvormen reproduceren (gestringifieerde arrays, bullet-string, overage, én afwijzing van echt foute output) — npm test139/139, eslint schoon.
Handmatige check na deploy: open een thema op /onboarding-track — de overview hoort nu te renderen (en bij een nieuwe generatie-fout blijft de nette foutmelding staan).
Closes #32
## Root cause
Het fast-tier model (Haiku) geeft de tool-velden `key_points` en `topics_covered` soms terug als **JSON-gecodeerde string** (`"[\"…\"]"`) in plaats van een echte array — precies de Zod-fouten uit het issue (`expected array … invalid_type` op beide velden). Dezelfde faalklasse waar `quizQuestionsSchema` al een `z.preprocess`-guard voor heeft; het onboarding-schema miste die.
## Fix (twee lagen)
1. **Schema-normalisatie** (`onboardingOverviewSchema`): strings die op `[` beginnen worden vóór validatie terug-geparsed naar arrays; een bullet-/regellijst als string wordt als fallback gesplitst; >5 kernpunten worden afgekapt op 5 i.p.v. de gebruiker te laten stranden. Écht foute output (te weinig punten, niet-JSON-strings, verkeerde types) faalt nog steeds.
2. **Prompt-side nudge**: de tool-beschrijvingen stellen nu expliciet "must be a JSON array — never a string".
Geen datamigratie nodig: de validatiefout trad op vóór het cachen, dus er staan geen kapotte rijen in `onboarding_overviews`.
## Verificatie
- **5 regressietests** die de exacte #32-payloadvormen reproduceren (gestringifieerde arrays, bullet-string, overage, én afwijzing van echt foute output) — `npm test` **139/139**, eslint schoon.
- Handmatige check na deploy: open een thema op `/onboarding-track` — de overview hoort nu te renderen (en bij een nieuwe generatie-fout blijft de nette foutmelding staan).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Opening an onboarding theme could fail with "LLM output failed schema
validation": the fast-tier model occasionally emits the key_points and
topics_covered tool fields as JSON-encoded strings instead of real
arrays. Same failure class the quiz schema already guards against with
z.preprocess.
- onboardingOverviewSchema: parse "[...]" strings back to arrays before
validation; split a bullet/newline string of key points as a fallback;
keep the first 5 key points on overage instead of failing the user.
Genuinely bad output (too few points, non-JSON strings, wrong types)
still fails validation.
- emit_onboarding_overview tool: descriptions now state the fields must
be JSON arrays, never strings (prompt-side nudge).
- 5 regression tests reproducing the exact #32 payload shapes
(npm test 139/139).
Closes#32
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
rve
merged commit e73700763d into main2026-07-13 07:46:54 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #32
Root cause
Het fast-tier model (Haiku) geeft de tool-velden
key_pointsentopics_coveredsoms terug als JSON-gecodeerde string ("[\"…\"]") in plaats van een echte array — precies de Zod-fouten uit het issue (expected array … invalid_typeop beide velden). Dezelfde faalklasse waarquizQuestionsSchemaal eenz.preprocess-guard voor heeft; het onboarding-schema miste die.Fix (twee lagen)
onboardingOverviewSchema): strings die op[beginnen worden vóór validatie terug-geparsed naar arrays; een bullet-/regellijst als string wordt als fallback gesplitst; >5 kernpunten worden afgekapt op 5 i.p.v. de gebruiker te laten stranden. Écht foute output (te weinig punten, niet-JSON-strings, verkeerde types) faalt nog steeds.Geen datamigratie nodig: de validatiefout trad op vóór het cachen, dus er staan geen kapotte rijen in
onboarding_overviews.Verificatie
npm test139/139, eslint schoon./onboarding-track— de overview hoort nu te renderen (en bij een nieuwe generatie-fout blijft de nette foutmelding staan).🤖 Generated with Claude Code