soroban-abacus-flashcards/PROGRESSIVE_INSTRUCTION_PLA...

8.3 KiB

Progressive Multi-Step Instruction System Plan

Overview

Implement a comprehensive system that coordinates multi-step instructions, bead highlighting, and directional movement indicators to create a step-by-step progressive tutorial experience.

Current System Analysis

1. Bead Highlighting System

  • Location: packages/abacus-react/src/AbacusReact.tsx
  • Interface: BeadHighlight (union of PlaceValueBead | ColumnIndexBead)
  • Current functionality: Static highlighting of beads
  • Limitation: Shows all highlighted beads at once, no progressive revelation

2. Multi-Step Instructions

  • Location: apps/web/src/utils/abacusInstructionGenerator.ts
  • Data: multiStepInstructions: string[]
  • Current functionality: Generates step-by-step text instructions
  • Example (99+1):
    1. "Click earth bead 1 in the hundreds column to add it"
    2. "Remove 9 from ones column (subtracting second part of decomposition)"
    3. "Remove 90 from tens column (subtracting first part of decomposition)"

3. Progressive Display (GuidedAdditionTutorial)

  • Location: apps/web/src/components/GuidedAdditionTutorial.tsx
  • State: multiStepProgress: number (tracks current step)
  • Functionality: Shows current step in bold, dims future steps
  • Limitation: No coordination with bead highlighting

4. Bead Generation Logic

  • Location: apps/web/src/utils/abacusInstructionGenerator.ts:generateBeadHighlights()
  • Current: Generates all beads for entire operation
  • Limitation: No step-by-step bead breakdown

Proposed Solution Architecture

Phase 1: Enhanced Data Structures

1.1 Extended BeadHighlight Interface

export interface StepBeadHighlight extends BeadHighlight {
  stepIndex: number  // Which instruction step this bead belongs to
  direction: 'up' | 'down' | 'activate' | 'deactivate'  // Movement direction
  order?: number     // Order within the step (for multiple beads per step)
}

1.2 Enhanced GeneratedInstruction Interface

export interface GeneratedInstruction {
  // ... existing fields
  multiStepInstructions?: string[]
  stepBeadHighlights?: StepBeadHighlight[]  // NEW: beads grouped by step
  totalSteps?: number                       // NEW: total number of steps
}

1.3 Progressive Instruction State

interface ProgressiveInstructionState {
  currentStep: number
  totalSteps: number
  currentStepBeads: BeadHighlight[]        // Beads for current step only
  completedStepBeads: BeadHighlight[]      // All beads from previous steps
  currentStepInstruction: string
}

Phase 2: Enhanced Instruction Generation

2.1 Modify generateEnhancedStepInstructions()

  • Generate beads per step, not just text instructions
  • Map each bead operation to its corresponding instruction step
  • Determine movement direction for each bead

2.2 New Function: generateStepBeadMapping()

function generateStepBeadMapping(
  startValue: number,
  targetValue: number,
  additions: BeadHighlight[],
  removals: BeadHighlight[],
  decomposition: any,
  multiStepInstructions: string[]
): StepBeadHighlight[]

Phase 3: AbacusReact Component Enhancements

3.1 Add Directional Indicators

  • New Props:

    interface AbacusReactProps {
      // ... existing props
      stepBeadHighlights?: StepBeadHighlight[]
      showDirectionIndicators?: boolean
    }
    
  • Visual Implementation:

    • Arrow overlays on beads (↑ for up/activate, ↓ for down/deactivate)
    • Different highlight colors for different directions
    • Animation hints for movement direction

3.2 Enhanced Bead Styling

interface BeadDirectionStyle extends BeadStyle {
  directionIndicator?: {
    show: boolean
    direction: 'up' | 'down' | 'activate' | 'deactivate'
    color?: string
    size?: number
  }
}

Phase 4: TutorialPlayer Progressive Display

4.1 Add Progressive State Management

interface TutorialPlayerState {
  // ... existing state
  progressiveInstruction: ProgressiveInstructionState | null
}

4.2 Progressive Instruction Logic

  • Track current step within multi-step instructions
  • Update highlighted beads based on current step
  • Show only current step instruction in bold
  • Dim future steps, mark completed steps

4.3 Step Advancement Logic

  • User completes current step → advance to next step
  • Update bead highlights to show next step's beads
  • Maintain previously completed beads in "completed" state

Phase 5: Testing Strategy

5.1 Unit Tests for Step-by-Step Generation

describe('Progressive Instruction Generation', () => {
  test('99+1 generates correct step-bead mapping', () => {
    const instruction = generateAbacusInstructions(99, 100)
    expect(instruction.stepBeadHighlights).toHaveLength(3)

    // Step 0: Add 1 to hundreds
    expect(instruction.stepBeadHighlights[0]).toEqual({
      stepIndex: 0,
      placeValue: 2,
      beadType: 'earth',
      position: 0,
      direction: 'activate'
    })

    // Step 1: Remove 9 from ones (heaven + 4 earth)
    const step1Beads = instruction.stepBeadHighlights.filter(b => b.stepIndex === 1)
    expect(step1Beads).toHaveLength(5) // 1 heaven + 4 earth

    // Step 2: Remove 90 from tens (heaven + 4 earth)
    const step2Beads = instruction.stepBeadHighlights.filter(b => b.stepIndex === 2)
    expect(step2Beads).toHaveLength(5) // 1 heaven + 4 earth
  })

  test('3+98 generates correct step-bead mapping', () => {
    // Test simpler complement case
  })
})

5.2 Integration Tests for Progressive Display

describe('Progressive Tutorial Player', () => {
  test('shows only current step beads', () => {
    // Render tutorial player with 99+1 case
    // Verify only step 0 beads are highlighted initially
    // Advance step, verify step 1 beads appear
  })

  test('direction indicators display correctly', () => {
    // Verify arrows/indicators show correct directions
  })
})

5.3 Visual Regression Tests

  • Storybook stories for each progression state
  • Visual comparisons for direction indicators
  • Progressive highlighting behavior

Implementation Plan

Iteration 1: Data Structure Foundation

  1. Design and implement enhanced interfaces
  2. Modify instruction generator to produce step-bead mapping
  3. Unit tests for step-bead generation
  4. Validate with 99+1 and 3+98 test cases

Iteration 2: AbacusReact Direction Indicators

  1. Add direction indicator props to AbacusReact
  2. Implement visual direction indicators (arrows/styling)
  3. Create Storybook stories for direction indicators
  4. Test various direction combinations

Iteration 3: Progressive TutorialPlayer

  1. Add progressive state management to TutorialPlayer
  2. Implement step advancement logic
  3. Coordinate instruction text with bead highlights
  4. Test tutorial progression flow

Iteration 4: Integration and Polish

  1. Integrate all components in tutorial editor preview
  2. End-to-end testing of complete progressive experience
  3. Performance optimization
  4. Accessibility improvements

Success Criteria

  1. Bead-Instruction Correspondence: Each instruction step highlights only its relevant beads
  2. Direction Clarity: Users can see which direction each bead needs to move
  3. Progressive Revelation: Only current step is active, future steps are dimmed
  4. Pedagogical Alignment: Visual progression matches mathematical decomposition
  5. 99+1 Test Case:
    • Step 1: Show only hundreds bead with "up" indicator
    • Step 2: Show only ones column beads with "down" indicators
    • Step 3: Show only tens column beads with "down" indicators

Technical Considerations

Performance

  • Minimize re-renders during step progression
  • Efficient bead highlight calculations
  • Smooth animations for step transitions

Accessibility

  • Screen reader announcements for step changes
  • Keyboard navigation through steps
  • High contrast direction indicators

Backward Compatibility

  • Maintain existing single-step tutorial functionality
  • Graceful fallback for tutorials without multi-step data
  • Preserve existing AbacusReact API surface

This plan provides a comprehensive roadmap for implementing the progressive multi-step instruction system with proper coordination between pedagogy, visual display, and user interaction.