Fix #32: gestringifieerde arrays in onboarding-overview output normaliseren #33

Merged
rve merged 1 commits from fix/issue-32-onboarding-schema into main 2026-07-13 07:46:54 +00:00
Owner

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

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)
rve added 1 commit 2026-07-13 07:39:18 +00:00
fix: coerce stringified arrays in onboarding overview output (#32)
All checks were successful
On Pull Request to Main / test (pull_request) Successful in 41s
On Pull Request to Main / publish (pull_request) Successful in 1m15s
On Pull Request to Main / deploy-dev (pull_request) Successful in 3m17s
182fb2357f
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 main 2026-07-13 07:46:54 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rve/learning-platform#33