fix: add seed and prngAlgorithm fields to all Zod schema versions (V1-V4)
**Problem**: Seeds were being saved to the database but lost when loading because Zod schemas didn't include seed/prngAlgorithm fields. Zod strips unknown fields during parsing, so even though extractConfigFields() included the seed and the database had the seed, parseAdditionConfig() was removing it. **Root Cause**: The migration from summary showed seed was being extracted and saved, but server logs showed `hasSavedSeed: false, savedSeed: undefined`. Database query confirmed seed WAS in the JSON (seed: 1977890241), but migrateAdditionConfig() → additionConfigSchema.safeParse() was stripping it. **Fix**: Added seed and prngAlgorithm as optional fields to ALL schema versions: - V1: Added to additionConfigV1Schema - V2: Added to additionConfigV2Schema - V3: Added to additionConfigV3BaseSchema (inherited by Smart/Manual modes) - V4: Added to additionConfigV4BaseSchema (inherited by Smart/Manual/Mastery modes) **Impact**: Seeds will now persist correctly through the full save/load cycle. Users can reload the page and see the exact same problems. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
0f3ec369bf
commit
1782f427f1
|
|
@ -50,6 +50,10 @@ export const additionConfigV1Schema = z.object({
|
||||||
.int()
|
.int()
|
||||||
.min(WORKSHEET_LIMITS.FONT_SIZE.MIN)
|
.min(WORKSHEET_LIMITS.FONT_SIZE.MIN)
|
||||||
.max(WORKSHEET_LIMITS.FONT_SIZE.MAX),
|
.max(WORKSHEET_LIMITS.FONT_SIZE.MAX),
|
||||||
|
|
||||||
|
// Problem reproducibility (CRITICAL for sharing worksheets)
|
||||||
|
seed: z.number().int().min(0).optional(),
|
||||||
|
prngAlgorithm: z.string().optional(),
|
||||||
})
|
})
|
||||||
|
|
||||||
export type AdditionConfigV1 = z.infer<typeof additionConfigV1Schema>
|
export type AdditionConfigV1 = z.infer<typeof additionConfigV1Schema>
|
||||||
|
|
@ -139,6 +143,10 @@ export const additionConfigV2Schema = z.object({
|
||||||
.min(WORKSHEET_LIMITS.FONT_SIZE.MIN)
|
.min(WORKSHEET_LIMITS.FONT_SIZE.MIN)
|
||||||
.max(WORKSHEET_LIMITS.FONT_SIZE.MAX),
|
.max(WORKSHEET_LIMITS.FONT_SIZE.MAX),
|
||||||
showTenFramesForAll: z.boolean(),
|
showTenFramesForAll: z.boolean(),
|
||||||
|
|
||||||
|
// Problem reproducibility (CRITICAL for sharing worksheets)
|
||||||
|
seed: z.number().int().min(0).optional(),
|
||||||
|
prngAlgorithm: z.string().optional(),
|
||||||
})
|
})
|
||||||
|
|
||||||
export type AdditionConfigV2 = z.infer<typeof additionConfigV2Schema>
|
export type AdditionConfigV2 = z.infer<typeof additionConfigV2Schema>
|
||||||
|
|
@ -168,6 +176,10 @@ const additionConfigV3BaseSchema = z.object({
|
||||||
pAnyStart: z.number().min(0).max(1),
|
pAnyStart: z.number().min(0).max(1),
|
||||||
pAllStart: z.number().min(0).max(1),
|
pAllStart: z.number().min(0).max(1),
|
||||||
interpolate: z.boolean(),
|
interpolate: z.boolean(),
|
||||||
|
|
||||||
|
// Problem reproducibility (CRITICAL for sharing worksheets)
|
||||||
|
seed: z.number().int().min(0).optional(),
|
||||||
|
prngAlgorithm: z.string().optional(),
|
||||||
})
|
})
|
||||||
|
|
||||||
// Smart Difficulty Mode
|
// Smart Difficulty Mode
|
||||||
|
|
@ -314,6 +326,10 @@ const additionConfigV4BaseSchema = z.object({
|
||||||
pAnyStart: z.number().min(0).max(1),
|
pAnyStart: z.number().min(0).max(1),
|
||||||
pAllStart: z.number().min(0).max(1),
|
pAllStart: z.number().min(0).max(1),
|
||||||
interpolate: z.boolean(),
|
interpolate: z.boolean(),
|
||||||
|
|
||||||
|
// Problem reproducibility (CRITICAL for sharing worksheets)
|
||||||
|
seed: z.number().int().min(0).optional(),
|
||||||
|
prngAlgorithm: z.string().optional(),
|
||||||
})
|
})
|
||||||
|
|
||||||
// Smart Difficulty Mode for V4
|
// Smart Difficulty Mode for V4
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue