From a6472a231be65e9e3e27e5d05a2323ae8451b044 Mon Sep 17 00:00:00 2001 From: Thomas Hallock Date: Tue, 18 Nov 2025 06:40:23 -0600 Subject: [PATCH] fix: respect operator-specific scaffolding in mastery+mixed mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix bug where scaffolding settings (answer boxes, carry boxes, etc.) weren't being respected in mastery+mixed mode (addition+subtraction). **Root cause:** validation.ts was reading from formState.displayRules (general field) instead of formState.additionDisplayRules and formState.subtractionDisplayRules (operator-specific fields). Additionally, it only allowed overriding problemNumbers and cellBorders, ignoring all other scaffolding settings. **Fix:** - Read from operator-specific display rules (additionDisplayRules, subtractionDisplayRules) when they exist - Fall back to general displayRules if operator-specific rules aren't set - Allow ALL display rule fields to override skill's recommendedScaffolding - Add debug logging to trace which rules are being used **Testing:** 1. Set mode to "mastery" with operator "mixed" (addition+subtraction) 2. Change scaffolding setting (e.g., answer boxes from "always" to "never") 3. Verify the preview now respects the custom scaffolding setting Fixes validation.ts:288-318 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- apps/web/.claude/settings.local.json | 4 +-- .../worksheets/hooks/useWorksheetState.ts | 5 ++- .../src/app/create/worksheets/validation.ts | 33 +++++++++++-------- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/apps/web/.claude/settings.local.json b/apps/web/.claude/settings.local.json index a8d3a0c9..fa93b76a 100644 --- a/apps/web/.claude/settings.local.json +++ b/apps/web/.claude/settings.local.json @@ -48,7 +48,5 @@ "ask": [] }, "enableAllProjectMcpServers": true, - "enabledMcpjsonServers": [ - "sqlite" - ] + "enabledMcpjsonServers": ["sqlite"] } diff --git a/apps/web/src/app/create/worksheets/hooks/useWorksheetState.ts b/apps/web/src/app/create/worksheets/hooks/useWorksheetState.ts index 6def36ff..86f1679e 100644 --- a/apps/web/src/app/create/worksheets/hooks/useWorksheetState.ts +++ b/apps/web/src/app/create/worksheets/hooks/useWorksheetState.ts @@ -111,7 +111,10 @@ export function useWorksheetState( if (affectsProblems) { newState.seed = Date.now() % 2147483647 - console.log('[useWorksheetState] Problem settings changed - generated new seed:', newState.seed) + console.log( + '[useWorksheetState] Problem settings changed - generated new seed:', + newState.seed + ) } console.log('[useWorksheetState] New formState:', { diff --git a/apps/web/src/app/create/worksheets/validation.ts b/apps/web/src/app/create/worksheets/validation.ts index cd95423e..dca908a9 100644 --- a/apps/web/src/app/create/worksheets/validation.ts +++ b/apps/web/src/app/create/worksheets/validation.ts @@ -286,29 +286,36 @@ export function validateWorksheetConfig(formState: WorksheetFormState): Validati const subSkill = getSkillById(subSkillId as any) if (addSkill?.recommendedScaffolding && subSkill?.recommendedScaffolding) { - // Merge user's displayRules with skill's recommended scaffolding - // User's displayRules take precedence for problemNumbers and cellBorders (layout options) - const userDisplayRules: Partial = formState.displayRules || {} + // Merge user's operator-specific displayRules with skill's recommended scaffolding + // User's rules (if set) take precedence over skill's recommendations + // Fall back to general displayRules if operator-specific rules don't exist + const userAdditionRules: Partial = + (formState as any).additionDisplayRules || formState.displayRules || {} + const userSubtractionRules: Partial = + (formState as any).subtractionDisplayRules || formState.displayRules || {} + + console.log('[MIXED MODE SCAFFOLDING] User rules:', { + additionRules: userAdditionRules, + subtractionRules: userSubtractionRules, + generalRules: formState.displayRules, + }) config = { ...baseConfig, additionDisplayRules: { ...addSkill.recommendedScaffolding, - // Override layout options with user's choices - problemNumbers: - userDisplayRules.problemNumbers ?? addSkill.recommendedScaffolding.problemNumbers, - cellBorders: - userDisplayRules.cellBorders ?? addSkill.recommendedScaffolding.cellBorders, + ...userAdditionRules, // User's custom rules override skill's recommendations }, subtractionDisplayRules: { ...subSkill.recommendedScaffolding, - // Override layout options with user's choices - problemNumbers: - userDisplayRules.problemNumbers ?? subSkill.recommendedScaffolding.problemNumbers, - cellBorders: - userDisplayRules.cellBorders ?? subSkill.recommendedScaffolding.cellBorders, + ...userSubtractionRules, // User's custom rules override skill's recommendations }, } as any + + console.log('[MIXED MODE SCAFFOLDING] Final config:', { + additionDisplayRules: config.additionDisplayRules, + subtractionDisplayRules: config.subtractionDisplayRules, + }) } else { console.log('[MIXED MODE SCAFFOLDING] Missing recommendedScaffolding', { addSkill: addSkill?.name,