fix: respect operator-specific scaffolding in mastery+mixed mode

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 <noreply@anthropic.com>
This commit is contained in:
Thomas Hallock 2025-11-18 06:40:23 -06:00
parent 884f279bd4
commit a6472a231b
3 changed files with 25 additions and 17 deletions

View File

@ -48,7 +48,5 @@
"ask": []
},
"enableAllProjectMcpServers": true,
"enabledMcpjsonServers": [
"sqlite"
]
"enabledMcpjsonServers": ["sqlite"]
}

View File

@ -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:', {

View File

@ -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<DisplayRules> = 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<DisplayRules> =
(formState as any).additionDisplayRules || formState.displayRules || {}
const userSubtractionRules: Partial<DisplayRules> =
(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,