Remove the sd-sub-borrow skill as it was redundant with the existing
"Two-digit with ones place borrowing" skill which naturally covers
problems like 52-17, 43-18, etc.
The skill was problematic because:
- digitRange: { min: 1, max: 1 } constrained both operands to single digits
- But the description "13-7, 15-8" implied 2-digit minus 1-digit
- This contradiction made it impossible to generate appropriate problems
- Students were seeing either 0% or 100% of the intended pattern
Rather than fix the complex asymmetric digit range logic, we're removing
the skill entirely. The progression now flows:
- sd-sub-no-borrow (single-digit without borrowing)
- td-sub-no-borrow (two-digit without borrowing)
- td-sub-ones-borrow (two-digit with ones place borrowing)
This provides a cleaner, more natural progression.
Changes:
- Remove sd-sub-borrow skill definition from skills.ts
- Remove 'sd-sub-borrow' from SkillId type union
- Update td-sub-no-borrow prerequisites to reference sd-sub-no-borrow
- Remove sd-sub-borrow from skillMigration.ts mapping
- Remove generateTeensMinusSingles() function from problemGenerator.ts
- Revert generateOnesOnlyBorrow() to standard logic
Also includes previous fixes:
- Fix AllSkillsModal tab button types to prevent modal closing
- Add operator-specific display rules for mixed mode
- Add borrowNotation and borrowingHints to displayRules schema
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
210 lines
6.2 KiB
TypeScript
210 lines
6.2 KiB
TypeScript
// Script to generate multi-digit (>2 digits) worksheet examples for the blog post
|
|
// Shows how scaffolding adapts to different digit ranges
|
|
|
|
import fs from 'fs'
|
|
import path from 'path'
|
|
import { generateWorksheetPreview } from '../src/app/create/worksheets/addition/generatePreview'
|
|
|
|
// Output directory
|
|
const outputDir = path.join(process.cwd(), 'public', 'blog', 'multi-digit-examples')
|
|
|
|
// Ensure output directory exists
|
|
if (!fs.existsSync(outputDir)) {
|
|
fs.mkdirSync(outputDir, { recursive: true })
|
|
}
|
|
|
|
// Generate examples showing different digit ranges and adaptive scaffolding
|
|
const examples = [
|
|
{
|
|
name: 'two-digit-addition',
|
|
filename: 'two-digit.svg',
|
|
description: '2-digit addition (baseline)',
|
|
config: {
|
|
operator: 'addition' as const,
|
|
pAllStart: 0.0,
|
|
pAnyStart: 0.5,
|
|
digitRange: { min: 2, max: 2 },
|
|
mode: 'manual' as const,
|
|
displayRules: {
|
|
carryBoxes: 'always' as const,
|
|
answerBoxes: 'always' as const,
|
|
placeValueColors: 'never' as const,
|
|
tenFrames: 'never' as const,
|
|
problemNumbers: 'always' as const,
|
|
cellBorders: 'always' as const,
|
|
borrowNotation: 'never' as const,
|
|
borrowingHints: 'never' as const,
|
|
},
|
|
showBorrowNotation: false,
|
|
showBorrowingHints: false,
|
|
showCarryBoxes: true,
|
|
},
|
|
},
|
|
{
|
|
name: 'three-digit-with-colors',
|
|
filename: 'three-digit-colors.svg',
|
|
description: '3-digit addition with place value colors',
|
|
config: {
|
|
operator: 'addition' as const,
|
|
pAllStart: 0.0,
|
|
pAnyStart: 0.5,
|
|
digitRange: { min: 3, max: 3 },
|
|
mode: 'manual' as const,
|
|
displayRules: {
|
|
carryBoxes: 'always' as const,
|
|
answerBoxes: 'always' as const,
|
|
placeValueColors: 'always' as const,
|
|
tenFrames: 'never' as const,
|
|
problemNumbers: 'always' as const,
|
|
cellBorders: 'always' as const,
|
|
borrowNotation: 'never' as const,
|
|
borrowingHints: 'never' as const,
|
|
},
|
|
showBorrowNotation: false,
|
|
showBorrowingHints: false,
|
|
showCarryBoxes: true,
|
|
showPlaceValueColors: true,
|
|
},
|
|
},
|
|
{
|
|
name: 'four-digit-addition',
|
|
filename: 'four-digit.svg',
|
|
description: '4-digit addition with adaptive scaffolding',
|
|
config: {
|
|
operator: 'addition' as const,
|
|
pAllStart: 0.0,
|
|
pAnyStart: 0.6,
|
|
digitRange: { min: 4, max: 4 },
|
|
mode: 'manual' as const,
|
|
displayRules: {
|
|
carryBoxes: 'always' as const,
|
|
answerBoxes: 'always' as const,
|
|
placeValueColors: 'always' as const,
|
|
tenFrames: 'never' as const,
|
|
problemNumbers: 'always' as const,
|
|
cellBorders: 'always' as const,
|
|
borrowNotation: 'never' as const,
|
|
borrowingHints: 'never' as const,
|
|
},
|
|
showBorrowNotation: false,
|
|
showBorrowingHints: false,
|
|
showCarryBoxes: true,
|
|
showPlaceValueColors: true,
|
|
},
|
|
},
|
|
{
|
|
name: 'five-digit-addition',
|
|
filename: 'five-digit.svg',
|
|
description: '5-digit addition (maximum complexity)',
|
|
config: {
|
|
operator: 'addition' as const,
|
|
pAllStart: 0.3,
|
|
pAnyStart: 0.8,
|
|
digitRange: { min: 5, max: 5 },
|
|
mode: 'manual' as const,
|
|
displayRules: {
|
|
carryBoxes: 'always' as const,
|
|
answerBoxes: 'always' as const,
|
|
placeValueColors: 'always' as const,
|
|
tenFrames: 'never' as const,
|
|
problemNumbers: 'always' as const,
|
|
cellBorders: 'always' as const,
|
|
borrowNotation: 'never' as const,
|
|
borrowingHints: 'never' as const,
|
|
},
|
|
showBorrowNotation: false,
|
|
showBorrowingHints: false,
|
|
showCarryBoxes: true,
|
|
showPlaceValueColors: true,
|
|
},
|
|
},
|
|
{
|
|
name: 'mixed-digit-range',
|
|
filename: 'mixed-range.svg',
|
|
description: 'Mixed problem sizes (2-4 digits)',
|
|
config: {
|
|
operator: 'addition' as const,
|
|
pAllStart: 0.0,
|
|
pAnyStart: 0.5,
|
|
digitRange: { min: 2, max: 4 },
|
|
mode: 'manual' as const,
|
|
displayRules: {
|
|
carryBoxes: 'always' as const,
|
|
answerBoxes: 'always' as const,
|
|
placeValueColors: 'always' as const,
|
|
tenFrames: 'never' as const,
|
|
problemNumbers: 'always' as const,
|
|
cellBorders: 'always' as const,
|
|
borrowNotation: 'never' as const,
|
|
borrowingHints: 'never' as const,
|
|
},
|
|
showBorrowNotation: false,
|
|
showBorrowingHints: false,
|
|
showCarryBoxes: true,
|
|
showPlaceValueColors: true,
|
|
},
|
|
},
|
|
{
|
|
name: 'three-digit-subtraction',
|
|
filename: 'three-digit-subtraction.svg',
|
|
description: '3-digit subtraction with borrowing',
|
|
config: {
|
|
operator: 'subtraction' as const,
|
|
pAllStart: 0.0,
|
|
pAnyStart: 0.8,
|
|
digitRange: { min: 3, max: 3 },
|
|
mode: 'manual' as const,
|
|
displayRules: {
|
|
carryBoxes: 'never' as const,
|
|
answerBoxes: 'always' as const,
|
|
placeValueColors: 'always' as const,
|
|
tenFrames: 'never' as const,
|
|
problemNumbers: 'always' as const,
|
|
cellBorders: 'always' as const,
|
|
borrowNotation: 'never' as const,
|
|
borrowingHints: 'never' as const,
|
|
},
|
|
showBorrowNotation: true,
|
|
showBorrowingHints: false,
|
|
},
|
|
},
|
|
] as const
|
|
|
|
console.log('Generating multi-digit example worksheets...\n')
|
|
|
|
for (const example of examples) {
|
|
console.log(`Generating ${example.description}...`)
|
|
|
|
const config = {
|
|
...example.config,
|
|
problemsPerPage: 4,
|
|
pages: 1,
|
|
cols: 2,
|
|
seed: 54321, // Fixed seed for consistent examples
|
|
}
|
|
|
|
try {
|
|
const result = generateWorksheetPreview(config)
|
|
|
|
if (!result.success || !result.pages || result.pages.length === 0) {
|
|
console.error(`Failed to generate ${example.name}:`, result.error)
|
|
console.error(`Details:`, result.details)
|
|
continue
|
|
}
|
|
|
|
// Get the first page's SVG
|
|
const svg = result.pages[0]
|
|
|
|
// Save to file
|
|
const outputPath = path.join(outputDir, example.filename)
|
|
fs.writeFileSync(outputPath, svg, 'utf-8')
|
|
|
|
console.log(` ✓ Saved to ${outputPath}`)
|
|
} catch (error) {
|
|
console.error(` ✗ Error generating ${example.name}:`, error)
|
|
}
|
|
}
|
|
|
|
console.log('\nDone! Multi-digit example worksheets generated.')
|
|
console.log(`\nFiles saved to: ${outputDir}`)
|