{
  "generated_by": "education.curriculum_lib",
  "domains": [
    "math",
    "reading-writing",
    "thinking",
    "world-models"
  ],
  "traversal": {
    "math": "constrained",
    "reading-writing": "constrained",
    "thinking": "free-roam",
    "world-models": "free-roam"
  },
  "strands": {
    "math": {
      "counting": "Counting & Number Sense",
      "placevalue": "Place Value",
      "addsub": "Addition & Subtraction",
      "multdiv": "Multiplication & Division",
      "fractions": "Fractions",
      "measure": "Measurement & data (length, time, money, area/perimeter, angle, graphs)",
      "geometry": "Geometry & spatial",
      "numbertheory": "Number Theory",
      "integers": "Integers & Negative Numbers",
      "ratio": "Ratios, Rates & Percents",
      "algebra": "Expressions & Equations"
    },
    "reading-writing": {
      "lc-bg-knowledge": "Background Knowledge (Scarborough LC)",
      "lc-vocabulary": "Vocabulary (Scarborough LC)",
      "lc-lang-structures": "Language Structures (Scarborough LC)",
      "lc-verbal-reasoning": "Verbal Reasoning (Scarborough LC)",
      "lc-literacy-knowledge": "Literacy Knowledge (Scarborough LC)",
      "wr-phon-awareness": "Phonological Awareness (Scarborough WR)",
      "wr-decoding": "Decoding (Scarborough WR)",
      "wr-sight-recognition": "Sight Recognition (Scarborough WR)",
      "wr-encoding": "Encoding / spelling & orthography (author-added; the write-direction sibling of decoding)",
      "writing-composition": "Writing & composition, sentence\u2192paragraph\u2192essay (author-added; The Writing Revolution spine)"
    },
    "thinking": {
      "inquiry": "Inquiry \u2014 asking and framing questions",
      "reasoning": "Reasoning \u2014 explaining, estimating, classifying, comparing, transferring",
      "metacog": "Metacognition \u2014 planning, checking, spotting traps"
    },
    "world-models": {
      "howthings": "How the Town Works (machines, cars, electricity, plumbing)",
      "earthsky": "Water & Weather (Earth & sky systems)",
      "body": "The Human Body",
      "money": "Money & Trade",
      "civics": "How We Decide (laws, government, voting)",
      "geo": "Maps & the World (spatial sense)"
    }
  },
  "nodes": [
    {
      "id": "math.addsub.add-facts-memory-20",
      "domain": "math",
      "strand": "addsub",
      "title": "Know from memory all sums of two one-digit numbers (add/sub facts to 20)",
      "tier": "L4",
      "band": [
        7,
        8
      ],
      "fluency_aim": {
        "metric": "problems_per_min_oral",
        "target": 30,
        "sustain": "2 of 3 separate days, \u22642 errors/min",
        "source": "research/fluency-aims.md \u00a78 (Penelope's live L4 frontier)"
      },
      "gates": {
        "L2": "\u226590% on 10 fresh mixed add/sub-within-20 fact items, untimed",
        "L3": "SM-2 spaced gate on mixed fresh fact items across separate days (understanding gate \u2014 fires BEFORE the L4 rate gate)",
        "L4": "oral (see/say) 1-minute timing, 30-40 problems/min, \u22642 errors; OR printed timed sheet at 2/3 \u00d7 measured write-digits rate (\u224820 DCPM grade-2 band). Aim met on 2 of 3 separate days."
      },
      "requires": [
        "math.addsub.make-a-ten-strategy"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch6",
          "note": "Addition to 20 (within-20 facts)",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch7",
          "note": "Subtraction Within 20"
        },
        {
          "type": "gumball",
          "ref": "generator:fact_mc"
        },
        {
          "type": "activity",
          "ref": "printed 100-fact timed sheet (classic); parent enters DCPM"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch2 \u00a72A Add Fluently Within 20"
        }
      ],
      "sources": [
        "CC 2.OA.2",
        "research/fluency-aims.md \u00a78",
        "research/math-spine.md \u00a72"
      ],
      "notes": "PENELOPE'S LIVE L4 FRONTIER (spine \u00a711.1). Oral aim 30-40 problems/min (pass 30, stretch toward Morningside 70-80 DCPM composite). Written aim = 2/3 \u00d7 MEASURED write-digits rate (~20 DCPM grade-2, VanDerHeyden & Burns) \u2014 lower than it looks BY DESIGN (her hand is slow). Push the ORAL aim; let the written float up with handwriting. L4 gate fires only AFTER L3 understanding gate \u2014 never a shortcut (K2 p.19). 80-100 DCPM is the terminal/adult aim, NOT grade-2 \u2014 do not use it. Confidence: literature-solid (oral) / extrapolated (written number). She's at ~L2 here: 88% add / 93% sub first-try untimed, no rate instrument yet.",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "See/say timed fact cards across the full within-20 set, add and subtract mixed, on the oral 1-minute sheet toward the 30\u201340/min aim. Sort into 'instant' vs 'still deriving' piles each session and drill only the second pile \u2014 spaced, not the whole deck every time.",
          "check": "Rapid-fire: 9 + 6? 15 \u2212 8? 7 + 8? 13 \u2212 6? \u2014 no counting."
        },
        "C": {
          "move": "Only as a fallback anchor, not the drill: when a fact stalls, drop to the two-ten-frame make-a-ten move (7 + 8 \u2192 move 3, 10 + 5) so she DERIVES it, then re-flash it cold. The aim is to retire the counters \u2014 automaticity means the object is gone and the answer is just there.",
          "check": "8 + 7 \u2014 if it's not instant, show the make-a-ten, then say it cold.",
          "down": "math.addsub.make-a-ten-strategy"
        }
      }
    },
    {
      "id": "math.addsub.add-sub-fluency-10",
      "domain": "math",
      "strand": "addsub",
      "title": "Fluency for add & subtract within 10",
      "tier": "L4",
      "band": [
        6,
        7
      ],
      "fluency_aim": {
        "metric": "problems_per_min_oral",
        "target": 25,
        "sustain": "2 of 3 separate days, \u22642 errors/min",
        "source": "research/fluency-aims.md \u00a78 (within-10 facts base for make-a-ten)"
      },
      "gates": {
        "L2": "\u226590% on 10 fresh add/sub-within-10 items, untimed",
        "L3": "SM-2 spaced gate on mixed within-10 items across separate days",
        "L4": "oral 1-minute timing (see/say), problems/min; pass 25, stretch toward the add-facts-20 aim; parent scores"
      },
      "requires": [
        "math.addsub.add-sub-fluency-5",
        "math.addsub.counting-on"
      ],
      "helps": [],
      "resources": [
        {
          "type": "gumball",
          "ref": "generator:fact_mc"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch2 \u00a72A Add Fluently Within 20"
        },
        {
          "type": "activity",
          "ref": "printed within-10 timed sheet"
        }
      ],
      "sources": [
        "CC 1.OA.6",
        "research/fluency-aims.md \u00a78"
      ],
      "notes": "Within-10 (from-memory-ish) is the base for make-a-ten; within-20 stays strategy-based until add-facts-memory-20. Target 25 is an intermediate rung between within-5 (20) and add-facts-20 (30-40). Confidence: literature-solid (rule) / extrapolated (exact interior number).",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "See/say fact cards across the whole within-10 set, add and subtract mixed, lightly timed toward the oral rate. Group by strategy family (doubles, make-10 pairs, +1/+0) so retrieval has hooks rather than being 55 orphan facts.",
          "check": "7 + 2? \u2026 9 \u2212 4? \u2026 6 + 3? \u2014 quick answers."
        },
        "C": {
          "move": "Ten-frame + doubles/near-doubles flash: show 6+6 as two full rows minus, or 7+8 as a double-plus-one, so she has an anchor for the ones she can't yet recall. Flash within-10 dot cards for see/say speed. Mix in subtraction (10 \u2212 6) from the same ten-frame.",
          "check": "Flash \u2014 a full row of 5 and 3 more \u2014 how many?",
          "down": "math.addsub.add-sub-fluency-5"
        }
      }
    },
    {
      "id": "math.addsub.add-sub-fluency-100",
      "domain": "math",
      "strand": "addsub",
      "title": "Fluently add & subtract within 100 (place-value strategies, with renaming)",
      "tier": "L4",
      "band": [
        7,
        8
      ],
      "fluency_aim": {
        "metric": "problems_per_min_oral",
        "target": 10,
        "sustain": "2 of 3 separate days, \u22642 errors/min",
        "source": "research/fluency-aims.md \u00a72a (multidigit is slower; compound-computation rate)"
      },
      "gates": {
        "L2": "\u226590% on 10 fresh within-100 add/sub items incl. renaming/regrouping, untimed",
        "L3": "SM-2 spaced gate on mixed items incl. the non-multiple-of-10 subtraction case, across separate days",
        "L4": "1-minute timing (oral or written); pass ~10 problems/min (compound computation is slower than facts); \u22642 errors; 2 of 3 separate days"
      },
      "requires": [
        "math.addsub.add-sub-within-100"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch17",
          "note": "Addition and Subtraction Within 100",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch2",
          "note": "Addition and Subtraction \u2014 Part 1"
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch3",
          "note": "Addition and Subtraction \u2014 Part 2 (regrouping)"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch2 \u00a72C-2D Add Without/With Renaming"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch3 \u00a73C-3D Subtract Without/With Renaming"
        },
        {
          "type": "beast",
          "ref": "BA 2D ch11 Algorithms (+&\u2212)"
        }
      ],
      "sources": [
        "CC 2.NBT.5",
        "research/fluency-aims.md \u00a72a",
        "research/math-spine.md \u00a75"
      ],
      "notes": "PREREQ RELAXED (adj minor sweep): dropped the over-strong `three-digit-place-value` requirement. Fluency within 100 (2.NBT.5) operates only on 2-digit numbers \u2014 it needs 2-digit place value + the hundred-as-a-unit idea, NOT full 3-digit place value. Two-digit place value is satisfied transitively via `add-sub-within-100` (which requires two-digit-place-value); requiring 3-digit was gating a within-100 skill behind a to-1000 skill and would keep Penelope's within-40/100 edge from surfacing. 'Fluently' = strategy-based, NOT the standard algorithm yet (K3 p.11). THE canonical error: 82-45=43 from subtract-smaller-from-larger (K3 p.7). Full within-100 subtraction (both no-decompose and decompose cases together) lives HERE by design. Rate aim ~10/min: multidigit compound is 40-60 DCPM terminal (\u00a72a) but a 2-digit problem is ~2-4 digits, so problems/min runs low \u2014 pass floor conservative, confidence extrapolated.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write the strategy vertically with the regroup shown honestly \u2014 the little '1' carried into the tens, or the crossed-out/renamed ten in subtraction \u2014 and cross-check with a place-value strategy (45 + 38 = 40+30 + 5+8). The point is fluent strategy use, not yet the silent compact algorithm.",
          "check": "82 \u2212 45 = ? Show the rename. (Watch: it is NOT 43.)"
        },
        "G": {
          "move": "Quick-tens drawing with an explicit trade: circle ten units and redraw them as one ten-line (compose) or slash a ten-line into ten units before removing (decompose). An open number line also works: 45 + 38 \u2192 +30 to 75, +5 to 80, +3 to 83, watching the ten-crossings.",
          "check": "Draw the trade for 28 + 15 \u2014 circle the ten you compose."
        },
        "C": {
          "move": "Blocks for the regroup itself: 47 + 8 \u2192 15 ones, TRADE ten ones for one ten-rod, leaving 5 ones and a new ten (55). Subtraction with renaming 52 \u2212 7 \u2192 you can't take 7 from 2 ones, so UNBUNDLE a ten-rod into 10 units first. The physical trade pre-empts the 82\u221245=43 subtract-smaller-from-larger error.",
          "check": "Subtract 34 \u2212 8 with blocks \u2014 do you need to unbundle a ten? Show it.",
          "down": "math.addsub.add-sub-within-100"
        }
      }
    },
    {
      "id": "math.addsub.add-sub-fluency-1000",
      "domain": "math",
      "strand": "addsub",
      "title": "Fluently add & subtract within 1000 (strategies AND algorithms)",
      "tier": "L4",
      "band": [
        8,
        9
      ],
      "fluency_aim": {
        "metric": "problems_per_min_oral",
        "target": 9,
        "sustain": "2 of 3 separate days, \u22642 errors/min",
        "source": "research/fluency-aims.md \u00a72a (compound within-1000; bridges to the algorithm)"
      },
      "gates": {
        "L2": "\u226590% on 10 fresh within-1000 add/sub items using both strategies and the algorithm, untimed",
        "L3": "SM-2 spaced gate on mixed within-1000 items across separate days",
        "L4": "1-minute timing; pass ~9 problems/min (3-digit compound); \u22642 errors; 2 of 3 separate days"
      },
      "requires": [
        "math.addsub.add-sub-within-1000"
      ],
      "helps": [],
      "resources": [
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch2 \u00a72C Other Add/Sub Strategies"
        },
        {
          "type": "beast",
          "ref": "BA 2D ch11 Algorithms (+&\u2212)"
        }
      ],
      "sources": [
        "CC 3.NBT.2",
        "research/fluency-aims.md \u00a72a",
        "research/math-spine.md \u00a72"
      ],
      "notes": "CC 3.NBT.2 'fluently' bridges strategies (Gr1-3) to the standard algorithm. BA moves this fluency DOWN to Level 2 (\u00a75.C 'Will be included in Beast Academy Grade 2'). Rate aim conservative/extrapolated: 3-digit compound is a few DCPM below within-100. Distinct fluency rung from the compact algorithm.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Practice BOTH a place-value strategy and the standard algorithm on the same problem and confirm they agree \u2014 fluency here means choosing efficiently (e.g. 500 \u2212 198 by adding-up 2 vs the algorithm). Lightly time toward the ~9/min aim; 3-digit compound is slower than facts by design.",
          "check": "Solve 502 \u2212 267 two ways \u2014 a strategy and the algorithm. Same answer?"
        },
        "G": {
          "move": "Bridge picture \u2192 algorithm: line up a quick-place drawing beside the vertical algorithm so each carried/borrowed unit in the written form maps to a traded block/line in the drawing. Once the mapping is solid she can drop the drawing and trust the columns.",
          "check": "For 463 + 279, point to where the carried 1 comes from in the drawing.",
          "down": "math.addsub.add-sub-within-1000"
        }
      }
    },
    {
      "id": "math.addsub.add-sub-fluency-5",
      "domain": "math",
      "strand": "addsub",
      "title": "Fluently add & subtract within 5",
      "tier": "L4",
      "band": [
        5,
        6
      ],
      "fluency_aim": {
        "metric": "problems_per_min_oral",
        "target": 20,
        "sustain": "2 of 3 separate days, \u22642 errors/min",
        "source": "research/fluency-aims.md \u00a78 (first fluency target; VanDerHeyden & Burns grade-band)"
      },
      "gates": {
        "L2": "\u226590% on 10 fresh add/sub-within-5 items, untimed",
        "L3": "SM-2 spaced gate on mixed within-5 items across separate days",
        "L4": "oral 1-minute timing (see/say), problems/min; pass 20, stretch higher; parent scores"
      },
      "requires": [
        "math.addsub.represent-add-sub"
      ],
      "helps": [],
      "resources": [
        {
          "type": "gumball",
          "ref": "generator:fact_mc"
        },
        {
          "type": "activity",
          "ref": "printed within-5 timed sheet (parent enters score)"
        }
      ],
      "sources": [
        "CC K.OA.5",
        "research/fluency-aims.md \u00a78"
      ],
      "notes": "First CC fluency standard. Oral aim avoids the write-digits ceiling. Cora's live L2/L3 zone (66% first-try within-5, still learning). Confidence: literature-solid. Target 20 = pass floor (a small first fluency rung), not the terminal PT range.",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "Move to see/say fact cards (3 + 2, 5 \u2212 1) with no counters, timing gently: she reads the fact and says the answer. Mix add and subtract so she's retrieving, not running one procedure. The oral 1-minute sheet IS this at speed.",
          "check": "4 + 1? \u2026 5 \u2212 2? \u2026 say them fast."
        },
        "C": {
          "move": "Fast subitize/finger work: flash a hand showing 3 fingers, add 2 more, she says 5 WITHOUT recounting from one. Ten-frame flash cards (dots you show for one second) push recognition toward automatic. This is the see-then-say path that becomes the oral rate.",
          "check": "Flash \u2014 three dots and one dot \u2014 how many, quick?",
          "down": "math.addsub.represent-add-sub"
        }
      }
    },
    {
      "id": "math.addsub.add-sub-standard-algorithm",
      "domain": "math",
      "strand": "addsub",
      "title": "Fluently add/subtract multi-digit via the STANDARD (compact) algorithm",
      "tier": "L4",
      "band": [
        8,
        10
      ],
      "fluency_aim": {
        "metric": "digits_per_min_written",
        "target": "= 2/3 \u00d7 her MEASURED digit-writing rate (write-digits node); pending Writing Speed Test",
        "sustain": "2 of 3 separate days, \u22642 errors/min",
        "source": "research/fluency-aims.md \u00a73 (motor-ceiling: written aim = 2/3 \u00d7 measured digit-writing rate) + \u00a72a (multidigit compound)"
      },
      "gates": {
        "L2": "\u226590% on 10 fresh multi-digit add/sub items via the standard (compact) algorithm, untimed",
        "L3": "SM-2 spaced gate on mixed multi-digit items across separate days",
        "L4": "1-minute WRITTEN timing, digits correct/min; pass = 2/3 \u00d7 her measured write-digits rate (\u00a73 motor ceiling); \u22642 errors; 2 of 3 separate days"
      },
      "requires": [
        "math.addsub.add-sub-fluency-1000",
        "math.counting.write-digits"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch3",
          "note": "Addition and Subtraction \u2014 Part 2 (standard algorithm)",
          "record": true
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch2 Addition and Subtraction Within 10,000"
        },
        {
          "type": "beast",
          "ref": "BA 2D ch11 Algorithms (+&\u2212)"
        }
      ],
      "sources": [
        "CC 4.NBT.4",
        "research/fluency-aims.md \u00a73",
        "research/math-spine.md \u00a72",
        "research/math-spine.md \u00a75"
      ],
      "notes": "METRIC FIXED to digits_per_min_written (adj #5): the compact algorithm is executed PURELY ON PAPER \u2014 its fluency is written, not oral. Written aim = 2/3 \u00d7 her MEASURED digit-writing rate (fluency-aims \u00a73 motor-ceiling rule; PENDING a Rocket Math Writing Speed Test \u2014 the number is not frozen, it floats with her handwriting in the 7-9 steep-growth window). requires write-digits (adj #5): you structurally cannot write fast answers faster than you write digits \u2014 the tool-skill ceiling is now enforced by the DAG. The standard algorithm comes LAST on purpose (K3 p.9-11): strategies (Gr1-3) before the compact algorithm (4.NBT.4). Terminal add/sub fluency node. BA-L2 already reaches 4.NBT.4 (\u00a75.A) \u2014 band 8-10 advisory not gating.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "The algorithm IS the symbolic representation: teach the compact right-to-left procedure \u2014 align by place, add each column, carry/borrow the regrouped unit \u2014 as fluent PAPER execution. Rate is written (digits/min), capped at 2/3 of her measured digit-writing speed; drill accuracy first, speed only after the procedure is clean.",
          "check": "Set up and solve 604 \u2212 358 with the standard algorithm, showing the borrow."
        },
        "G": {
          "move": "Expanded-form bridge to the compact form: write the addition in expanded columns first, then collapse it into the single-line carry notation, showing they're the same computation compressed. A place-value chart keeps the digits aligned so a stray digit doesn't slip into the wrong column.",
          "check": "Show 367 + 158 in expanded form, then rewrite it as the compact carry version.",
          "down": "math.addsub.add-sub-fluency-1000"
        },
        "C": {
          "move": "Blocks make their LAST appearance here, only to justify each written step: as she writes '13, carry the 1', she physically trades ten units for a rod \u2014 proving the little carried 1 is a real ten, not a decoration. Retire the blocks once she trusts the notation; the algorithm is meant to run without them.",
          "check": "As you carry the 1 in the tens column, what did that 1 stand for in blocks?"
        }
      }
    },
    {
      "id": "math.addsub.add-sub-within-100",
      "domain": "math",
      "strand": "addsub",
      "title": "Add/subtract within 100 (2-digit \u00b1 1-digit, \u00b1 multiples of 10)",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: add within 100 (2-digit + 1-digit and + multiple of 10) and subtract multiples of 10, using place-value reasoning; explain the tens/ones",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.placevalue.two-digit-place-value",
        "math.addsub.make-a-ten-strategy"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch13",
          "note": "Addition and Subtraction Within 40 (make-the-next-ten regrouping)",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch17",
          "note": "Addition and Subtraction Within 100"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch2 \u00a72B Add Tens or Hundreds"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch3 \u00a73B Subtract Tens or Hundreds"
        },
        {
          "type": "beast",
          "ref": "BA 2A ch3 Addition"
        }
      ],
      "sources": [
        "CC 1.NBT.4",
        "CC 1.NBT.6",
        "research/math-spine.md \u00a75"
      ],
      "notes": "Bridge from within-20 facts to full within-100 fluency. Subtracting multiples of 10 kept separate from full within-100 subtraction (the non-multiple-of-10 case is deferred to Gr2 to prevent the subtract-smaller-from-larger generalization, K3 p.7).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Record the place-value reasoning symbolically: 34 + 20 \u2192 '3 tens + 2 tens = 5 tens, 4 ones stay \u2192 54'; 34 + 5 \u2192 'add ones: 9 ones \u2192 39.' Keep tens and ones lined up in columns so 'add tens to tens, ones to ones' is visible on the page.",
          "check": "63 + 30 = ? and 63 + 4 = ? \u2014 say which digit changes each time."
        },
        "G": {
          "move": "Draw quick-tens (a line = 10, a dot = 1) instead of full blocks: sketch 34, draw 2 more tens-lines for +20. Or use an open number line: mark 34, jump +20 in one arc to 54, then +5 to 59. The jumps mirror the place-value reasoning without full re-drawing.",
          "check": "On an open number line, jump 52 + 30. Where do you land?"
        },
        "C": {
          "move": "Base-ten blocks: build 34 as 3 ten-rods + 4 units. For 34 + 20 add two ten-rods (the ones don't change); for 34 + 5 add five units. Adding a multiple of 10 physically touches only the tens, adding ones only the ones \u2014 the child sees WHY the digits behave differently. Do a make-the-next-ten crossing (38 + 5 \u2192 trade 10 units for a rod).",
          "check": "Build 46, then add 30 with blocks \u2014 which pile grew?",
          "down": "math.placevalue.two-digit-place-value"
        }
      }
    },
    {
      "id": "math.addsub.add-sub-within-1000",
      "domain": "math",
      "strand": "addsub",
      "title": "Add/subtract within 1000; explain strategies (place value)",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: add/subtract within 1000 with models & place-value strategies; add up to four 2-digit numbers; explain WHY the strategy works",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.addsub.add-sub-fluency-100"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch1",
          "note": "Numbers to 1,000",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch2",
          "note": "Addition and Subtraction \u2014 Part 1"
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch3",
          "note": "Addition and Subtraction \u2014 Part 2"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch2 \u00a72A-2B Add/Sub Within 1,000 / 10,000"
        },
        {
          "type": "beast",
          "ref": "BA 2D ch11 Algorithms (+&\u2212)"
        }
      ],
      "sources": [
        "CC 2.NBT.6",
        "CC 2.NBT.7",
        "CC 2.NBT.9",
        "research/math-spine.md \u00a75"
      ],
      "notes": "Recording newly-composed units in separate rows is a legitimate intermediate before the compact algorithm (K3 p.9). Explain-your-strategy (2.NBT.9) is the reasoning item on this node.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write partial-sums / expanded form as a legitimate intermediate before the compact algorithm: 356 + 275 = 500 + 120 + 11 = 631, recording each newly-composed unit on its own line. Then contrast with a subtraction that needs unbundling across the tens AND hundreds.",
          "check": "Use expanded form to add 428 + 145. Show the hundreds, tens, ones lines."
        },
        "G": {
          "move": "Quick-place drawing (square=100, line=10, dot=1) or an open number line with hundred/ten/one jumps: 356 + 130 \u2192 +100, +30. Keep the recording expanded \u2014 356 + 130 = (300+100)+(50+30)+6 \u2014 so she EXPLAINS why the strategy works (the 2.NBT.9 reasoning item), not just gets a number.",
          "check": "Explain with a drawing why 356 + 130 = 486 \u2014 where did each part go?"
        },
        "C": {
          "move": "Add hundred-flats to the block set: build 234 as 2 flats + 3 rods + 4 units. Add/subtract 3-digit numbers by combining or trading at TWO boundaries (ten ones \u2192 a rod, ten rods \u2192 a flat). Trading up one place at a time on real blocks is the concrete model behind 'newly-composed units in separate rows.'",
          "check": "Build 156 + 47 with blocks \u2014 which trades do you make, and in what order?",
          "down": "math.addsub.add-sub-fluency-100"
        }
      }
    },
    {
      "id": "math.addsub.counting-on",
      "domain": "math",
      "strand": "addsub",
      "title": "Count on to add/subtract (Level 2); subtraction as unknown-addend",
      "tier": "L3",
      "band": [
        6,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: solve add/sub within 20 by counting on from the larger addend; solve a take-from problem by counting up (5+?=8)",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.addsub.add-sub-fluency-5",
        "math.counting.compare-numbers-20"
      ],
      "helps": [
        "math.measure.elapsed-time",
        "math.measure.money-coins-bills"
      ],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch6",
          "note": "Addition to 20",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch7",
          "note": "Subtraction Within 20"
        },
        {
          "type": "beast",
          "ref": "BA 2A ch3 Addition"
        },
        {
          "type": "beast",
          "ref": "BA 2B ch4 Subtraction"
        }
      ],
      "sources": [
        "CC 1.OA.4",
        "CC 1.OA.5",
        "research/math-spine.md \u00a75"
      ],
      "notes": "Counting-on is a genuine conceptual leap (first addend embedded in the total, seen as addend AND part, K2 p.14). Counting on for subtraction is EASIER than counting down and is the unknown-addend keystone (K2 p.15) \u2014 'one of the essential understandings for middle school'. helps: count-up powers elapsed-time and count-up-change.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write the count-on as an equation and name the move: 8 + 3, 'start at 8, count 9-10-11.' For take-from, rewrite 8 \u2212 5 as 5 + ? = 8 out loud so the child SEES subtraction as a missing-addend question, not a separate operation.",
          "check": "5 + ? = 8. What number goes in the box?"
        },
        "G": {
          "move": "Draw the number line and draw the hops: for 8 + 3, mark 8, draw three curved hops to 11, label each hop. For 5 + ? = 8, hop up from 5 to 8 and COUNT THE HOPS to find the missing addend. FADE the drawn hops on the last item ('no hop boxes this time, Agent').",
          "check": "Draw hops from 7 up to 10 \u2014 how many hops?"
        },
        "C": {
          "move": "Walk a floor/table number line: stand on the larger addend (8) and take 3 physical steps for +3, landing on 11 \u2014 she never recounts the 8. For subtraction as count-UP, stand on 5, step forward until you reach 8, count the STEPS (3) \u2014 this is easier than counting down and is the unknown-addend idea.",
          "check": "Start on 6, take 4 steps forward \u2014 where do you land?",
          "down": "math.addsub.add-sub-fluency-5"
        },
        "N": {
          "move": "Count-up money and time make this concrete: 'you owe 8\u00a2, you've counted out 5\u00a2, keep going 6-7-8' \u2014 that's counting on. This is the exact skill under making change and finding elapsed time, so say so: same hop, different context.",
          "check": "You need 9 minutes. 6 have passed. Count up \u2014 how many more?"
        }
      }
    },
    {
      "id": "math.addsub.decompose-make-10",
      "domain": "math",
      "strand": "addsub",
      "title": "Decompose numbers \u226410 into pairs; find make-10 partners",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: decompose a number \u226410 into pairs (5 = 2+3 = 4+1), and for any 1-9 name the partner that makes 10",
        "L3": "SM-2 spaced gate across separate days"
      },
      "requires": [
        "math.addsub.represent-add-sub"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math KB ch8",
          "note": "Number Bonds",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch2",
          "note": "Number Bonds"
        },
        {
          "type": "activity",
          "ref": "ten-frame make-10 flash; number bonds"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch2 \u00a72A Add Fluently Within 20"
        }
      ],
      "sources": [
        "CC K.OA.3",
        "CC K.OA.4",
        "research/math-spine.md \u00a75"
      ],
      "notes": "Make-10 partners is one of the three hard prereqs of make-a-ten (K2 p.15-16). Number bonds are the Singapore representation.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Record each partner pair as an equation, emphasizing the make-10 family: 6 + 4 = 10, 4 + 6 = 10, 10 \u2212 6 = 4. Line the ten pairs up as a table so the pattern (0+10, 1+9, 2+8\u2026) is visible \u2014 the child memorizes the SET, not ten isolated facts.",
          "check": "9 + ? = 10. And what is 3 + ? = 10?"
        },
        "G": {
          "move": "Number bond diagram: write 10 in the whole-circle, one part filled (say 6), the other part blank \u2014 she writes the missing part. Then flip it: give her a number and both blank parts to fill several correct ways (10 = 6+4 = 7+3 \u2026).",
          "check": "Fill the number bond: whole is 10, one part is 4, what's the other part?",
          "down": "math.addsub.represent-add-sub"
        },
        "C": {
          "move": "Ten-frame make-ten drill: drop 7 counters onto a ten-frame, ask 'how many empty cells?' \u2014 the 3 empty cells ARE the partner. Repeat fast for every 1\u20139 so 'partner to 10' becomes a look, not a count. Also break a pile of 6 different ways (5+1, 4+2, 3+3) to show a number has many decompositions.",
          "check": "I put 8 counters in the ten-frame \u2014 how many more to fill it?"
        }
      }
    },
    {
      "id": "math.addsub.equal-sign-unknown",
      "domain": "math",
      "strand": "addsub",
      "title": "Meaning of =; true/false equations; find the unknown in any position",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: judge equations true/false (8 = 8, 5+2 = 6 false), and find the unknown in an add/sub equation in any position (?+3=7, 5+?=8, 8-?=3)",
        "L3": "SM-2 spaced gate on mixed positions across separate days"
      },
      "requires": [
        "math.addsub.counting-on"
      ],
      "helps": [],
      "resources": [
        {
          "type": "beast",
          "ref": "BA 2B ch5 Expressions"
        },
        {
          "type": "singapore",
          "ref": "PMUS 2B u1 Finding the Missing Number"
        }
      ],
      "sources": [
        "CC 1.OA.7",
        "CC 1.OA.8",
        "research/math-spine.md \u00a75"
      ],
      "notes": "Equal-sign misconception: '=' means 'the answer comes next', not 'same value as'. CCSSM attacks it early via 5=2+3 (total on LEFT, K2 p.10). Gates the start-unknown word problem. BA 2B ch5 pushes expressions/parentheses (5.OA) at grade 2 \u2014 early is fine.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Present equations with the total on the LEFT and the unknown in every position (? + 3 = 7, 5 + ? = 8, 8 \u2212 ? = 3, 5 = 2 + ?), plus true/false items (8 = 8, 5 + 2 = 6). Read '=' aloud every time as 'is the same as', never 'makes' \u2014 the language carries the concept.",
          "check": "True or false: 5 + 2 = 6. And solve: 8 \u2212 ? = 3."
        },
        "G": {
          "move": "Draw the two sides of a balance/scale as boxes and put the expression in each. For a true/false judgment she shades or crosses. For a missing number she draws counters into the empty pan until both sides match \u2014 the unknown can sit on EITHER side (? + 3 = 7 and 8 = 5 + ?).",
          "check": "Draw both pans for 6 = 2 + 4. Balanced or not?"
        },
        "C": {
          "move": "Pan balance (or a see-saw drawing with real weights): put 3 and 2 counters on one side, 5 on the other \u2014 it balances, so 3 + 2 = 5 AND 5 = 3 + 2. Physically show that '=' means 'same weight on both sides', directly attacking the '= means the answer comes next' error. Add/remove counters to make a false equation tip.",
          "check": "One pan has 4 + 3, the other has 8. Does it balance? Fix it.",
          "down": "math.addsub.counting-on"
        }
      }
    },
    {
      "id": "math.addsub.make-a-ten-strategy",
      "domain": "math",
      "strand": "addsub",
      "title": "Add/sub within 20 via make-a-ten (Level 3) and derived facts; add 3 numbers",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: use make-a-ten to add within 20 (8+6 = 8+2+4); apply commutative/associative; add three numbers with sum \u226420",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.addsub.add-sub-fluency-10",
        "math.addsub.decompose-make-10",
        "math.placevalue.teen-numbers-place"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch6",
          "note": "Addition to 20 (make-ten within 20)",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch13",
          "note": "Addition and Subtraction Within 40 \u2014 lesson 3 Make the Next Ten (Penelope's live chapter)"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch2 \u00a72A Add Fluently Within 20"
        },
        {
          "type": "beast",
          "ref": "BA 2A ch3 Addition"
        },
        {
          "type": "beast",
          "ref": "BA 2C ch8 Strategies (+&\u2212)"
        }
      ],
      "sources": [
        "CC 1.OA.2",
        "CC 1.OA.3",
        "CC 1.OA.6",
        "research/math-spine.md \u00a75"
      ],
      "notes": "Level 3 = Convert to an Easier Problem (make-a-ten / derived facts, K2 p.6). Harder in English than East-Asian languages (irregular teen words, K2 p.16). Requires ALL THREE: within-10 fluency, decompose/make-10 partners, teen-numbers (K2 p.15) \u2014 don't drop any.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write the derived-fact chain: 8 + 6 = 8 + 2 + 4 = 10 + 4 = 14, naming 'I took 2 from the 6 to make 10.' Then show the same move works for 3-addend sums and for commuting to the larger addend first (6 + 8 \u2192 start at 8).",
          "check": "Finish it: 7 + 5 = 7 + 3 + ? = 10 + ? = ?"
        },
        "G": {
          "move": "Number-bond split under the equation: draw 6 splitting into 2 and 4, arrow the 2 up to the 8, write 10, then 10 + 4. The picture makes the decompose-then-recombine visible. This is Dimensions 1B ch13 'Make the Next Ten' \u2014 her actual current page.",
          "check": "8 + 5: draw the bond that splits the 5 to make a ten with the 8."
        },
        "C": {
          "move": "Two ten-frames, the classic bridge: build 8 + 6 as 8 on the first frame, 6 loose, then MOVE 2 of the six over to fill the first frame (now a full ten) leaving 4 \u2014 read it as 10 and 4 = 14. The physical move of two counters IS the make-a-ten step; do it slowly, then let her narrate it.",
          "check": "Show me 9 + 5 on two ten-frames \u2014 how many did you move to make the ten?",
          "down": "math.addsub.decompose-make-10"
        }
      }
    },
    {
      "id": "math.addsub.represent-add-sub",
      "domain": "math",
      "strand": "addsub",
      "title": "Represent & model add/sub within 10 (objects, fingers, drawings, equations)",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: model an add or take-from situation within 10 and write a matching equation; solve by direct modeling (count all)",
        "L3": "SM-2 spaced gate on mixed fresh items across separate days"
      },
      "requires": [
        "math.counting.count-objects-cardinality"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math KB ch8",
          "note": "Number Bonds (part-whole)",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math KB ch9",
          "note": "Addition"
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math KB ch10",
          "note": "Subtraction"
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch3",
          "note": "Addition"
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch4",
          "note": "Subtraction"
        },
        {
          "type": "activity",
          "ref": "story problems with counters"
        },
        {
          "type": "gumball",
          "ref": "generator:fact_mc"
        }
      ],
      "sources": [
        "CC K.OA.1",
        "CC K.OA.2",
        "research/math-spine.md \u00a75"
      ],
      "notes": "Level 1 strategy = Direct Modeling / Count All (K2 p.6). Foundation of the whole add/sub strand.",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "After the counters/picture answer the problem, write the matching equation underneath \u2014 4 + 3 = 7 \u2014 pointing at each part: 'this 4 is your first group, this 3 is the group you added, this 7 is all of them.' Connect each numeral to a pile she can touch.",
          "check": "Write the number sentence that matches 5 apples and 2 more apples."
        },
        "G": {
          "move": "Draw a part-part-whole (number-bond) picture: two circles for the parts, one for the whole, dots inside. The child SEES 4 dots and 3 dots joining into the 7-whole \u2014 the same picture works forward (add) and backward (take-from).",
          "check": "Draw the dots for 6 take away 2 \u2014 how many dots are left?"
        },
        "C": {
          "move": "Set out the story with counters: for 4 + 3, count out a group of 4, then a group of 3, push them together and count ALL from one. For take-from (7 \u2212 2) build 7, physically remove 2, count what's left. Fingers work too.",
          "check": "Show me 5 and 3 more with counters \u2014 how many altogether?",
          "down": "count objects 1-to-1 and say the last number as 'how many'"
        },
        "N": {
          "move": "Pose it as a lived situation before any symbols: 'You had 4 stickers, your friend gave you 3 more.' Have her act it out with real objects, THEN answer. Rotate add-to and take-from stories so 'minus' isn't always 'the ones that leave.'",
          "check": "You have 8 grapes and eat 3. How many grapes now?"
        }
      }
    },
    {
      "id": "math.addsub.wp-change-addend-compare",
      "domain": "math",
      "strand": "addsub",
      "title": "Word problems: Change-Unknown, Addend-Unknown, and basic Compare (difference)",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh word problems, untimed: solve Change-Unknown, Put-Together Addend-Unknown (sub as unknown addend), and Compare Difference-Unknown ('how many more/fewer')",
        "L3": "SM-2 spaced gate on mixed situation types across separate days"
      },
      "requires": [
        "math.addsub.counting-on",
        "math.addsub.wp-result-unknown"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch11",
          "note": "Comparing (subtraction-as-comparison, difference)",
          "record": true
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch4 \u00a74C Comparison Model"
        },
        {
          "type": "beast",
          "ref": "BA 2B ch6 Problem Solving"
        }
      ],
      "sources": [
        "CC 1.OA.1",
        "research/math-spine.md \u00a75"
      ],
      "notes": "Compare is the hardest situation type: the 'difference' isn't physically present (K2 p.12). Change-unknown needs counting-on. Bar-model comparison (Singapore ch4 \u00a74C) makes the difference visible.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write the equation matching the bar, showing subtraction can find a MISSING ADDEND or a DIFFERENCE: 5 + ? = 12, or 8 \u2212 5 = ?. Name why compare uses subtraction even though nothing was 'taken away' \u2014 you're finding the leftover gap between the bars.",
          "check": "Write an equation for: had 6, now has 10 \u2014 how many were added?"
        },
        "G": {
          "move": "The comparison bar model is the key move: draw two bars of different length, one above the other, LEFT-aligned; the extra sticking-out piece is the difference, labeled '?'. For change-unknown draw the start bar and the gap up to the total. This makes the invisible difference visible (Singapore ch4 \u00a74C).",
          "check": "Draw two bars for 8 vs 5 \u2014 mark the piece that shows 'how many more'.",
          "down": "math.addsub.wp-result-unknown"
        },
        "N": {
          "move": "Now the unknown moves off the result: change-unknown ('had 5, got some, now 12 \u2014 how many did she get?'), addend-unknown, and COMPARE ('Ana has 8, Ben has 5, how many more?'). Act out the compare with two lines of objects side by side so the DIFFERENCE \u2014 which isn't physically present \u2014 becomes the un-matched objects.",
          "check": "Ana has 8 stickers, Ben has 5. How many more does Ana have?"
        }
      }
    },
    {
      "id": "math.addsub.wp-result-unknown",
      "domain": "math",
      "strand": "addsub",
      "title": "Word problems: Add-To/Take-From/Put-Together, Result & Total Unknown",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh word problems, untimed: solve Add-To/Take-From Result-Unknown and Put-Together Total-Unknown (both-addends) within 20",
        "L3": "SM-2 spaced gate on mixed situation types across separate days"
      },
      "requires": [
        "math.addsub.represent-add-sub",
        "math.addsub.decompose-make-10"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch11",
          "note": "Comparing \u2014 comparison stories / word problems",
          "record": true
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch4 \u00a74B Part-Whole Model"
        },
        {
          "type": "beast",
          "ref": "BA 2B ch6 Problem Solving"
        }
      ],
      "sources": [
        "CC K.OA.2",
        "CC 1.OA.1",
        "research/math-spine.md \u00a75"
      ],
      "notes": "Easiest situation tier (CCSSM Table 1, K2 p.7). Bar-model / part-whole is the Singapore representation. 'Can add' \u2260 'can model a situation' \u2014 problem types are their own nodes.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Translate the bar into an equation with a box for the unknown (5 + 4 = ? ; 9 \u2212 3 = ?), solve, then write the answer as a full sentence with the label ('There are 9 marbles'). Connect each number in the equation to a bar segment she drew.",
          "check": "Write and solve the equation for 8 apples, eat 2 \u2014 how many left?"
        },
        "G": {
          "move": "Draw the Singapore bar model: for put-together, two labeled part-bars sitting end to end above a whole-bar; the '?' sits on the whole. For take-from, one long bar with a piece crossed off. The bar makes 'which number is the whole' explicit before she picks an operation.",
          "check": "Draw a bar model for: 6 red and 3 blue marbles \u2014 how many marbles?",
          "down": "math.addsub.represent-add-sub"
        },
        "N": {
          "move": "Lead with the story and have her ACT IT OUT with objects before any bar or equation: 'Ben had 5 marbles, won 4 more' (add-to result), 'there were 9, 3 rolled away' (take-from), 'red and blue marbles, 6 total' (put-together). Rotate the three situation types so she reads the ACTION, not a keyword.",
          "check": "There are 7 birds, 4 more land. How many birds now?"
        }
      }
    },
    {
      "id": "math.addsub.wp-start-unknown-two-step",
      "domain": "math",
      "strand": "addsub",
      "title": "Word problems: Start-Unknown, misleading-language Compare, and two-step",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh word problems, untimed: solve Start-Unknown (algebraic), Bigger/Smaller-Unknown Compare with misleading language ('3 more... how many fewer'), and two-step problems within 100",
        "L3": "SM-2 spaced gate on mixed types across separate days"
      },
      "requires": [
        "math.addsub.equal-sign-unknown",
        "math.addsub.wp-change-addend-compare",
        "math.addsub.add-sub-fluency-100"
      ],
      "helps": [],
      "resources": [
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch4 \u00a74D Word Problems"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch2 \u00a72D Word Problems"
        },
        {
          "type": "beast",
          "ref": "BA 2D ch12 Problem Solving"
        }
      ],
      "sources": [
        "CC 2.OA.1",
        "research/math-spine.md \u00a75"
      ],
      "notes": "DELIBERATE DEFERRAL to Grade 2: start-unknown and compare-with-misleading-language ('more' suggests the wrong operation) held to Gr2 even though the arithmetic is within-20 (K2 p.14). Don't optimize the deferral away \u2014 it prevents a specific misconception. Band kept 7-9 to honor it.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write start-unknown as an equation with the unknown FIRST (? \u2212 4 = 6), solve as a missing-start using the inverse. For two-step, write two linked equations and label the intermediate quantity so the second step doesn't lose it. Check the answer back in the story.",
          "check": "Solve for the start: ? \u2212 4 = 6. Then: 12 \u2212 5 = ?, then that answer + 3 = ?"
        },
        "G": {
          "move": "Bar model with the unknown at the START: draw the whole and the known change, leave the start-bar blank, work backward. For two-step, draw the first bar, get an intermediate answer, then a second bar using it. For misleading compare, the bar shows WHO is longer regardless of the word 'more'.",
          "check": "Draw a bar model for: had some, spent 4, has 6 left \u2014 how many at the start?",
          "down": "math.addsub.wp-change-addend-compare"
        },
        "N": {
          "move": "The algebra-flavored tier, deliberately held to Gr2. Start-unknown ('had some, gave away 4, now has 6'), misleading-language compare ('Sam has 3 MORE than Kim, Sam has 9 \u2014 how many does KIM have?' where 'more' points the wrong way), and two-step. Have her restate the problem in her own words and flag the trap word BEFORE choosing an operation.",
          "check": "Sam has 3 more than Kim. Sam has 9. How many does Kim have? (careful \u2014 'more' is a trap here)"
        }
      }
    },
    {
      "id": "math.algebra.dependent-independent-vars",
      "domain": "math",
      "strand": "algebra",
      "title": "Two related quantities: dependent vs independent variable; equations, tables & graphs of a relationship",
      "tier": "L3",
      "band": [
        11,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: for two quantities that change together, name the dependent and independent variable, write an equation (dependent in terms of independent, e.g. d = 65t), and move among equation, table, and graph",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.algebra.expressions-evaluate-write",
        "math.geometry.coordinate-plane",
        "math.ratio.rates-unit-rates"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a75.4 (word problems)",
          "record": true
        }
      ],
      "sources": [
        "CC 6.EE.9",
        "CC 5.OA.3",
        "research/prealgebra-extension.md \u00a74C (A7)"
      ],
      "notes": "6.EE.9: variables for two quantities that change together, write an equation (dependent in terms of independent), analyze with graphs & tables (d = 65t); 5.OA.3 (generate patterns, ordered pairs). DELIBERATELY STOPS SHORT of 'function' \u2014 relationship-between-quantities, NOT function notation/domain/range (grade 8, OUT). The conceptual seed of functions without the machinery. requires coordinate-plane + rates-unit-rates (the y=kx proportional relationship it graphs). Misconception: swapping which variable depends; reading a table as unordered.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "write the dependent variable in terms of the independent one; substitute independent values to generate the table",
          "check": "for c = 3t, which variable depends on which? make the table"
        },
        "G": {
          "move": "fill a table of matched values, plot the ordered pairs on the coordinate plane, and read the pattern (straight line through origin for d = 65t)",
          "check": "table and plot d = 65t for t = 0,1,2,3 \u2014 what shape appears?"
        },
        "N": {
          "move": "distance depends on time at a fixed speed; total cost depends on how many you buy \u2014 one quantity drives the other",
          "check": "at 65 mph, how far in 3 hours? which quantity is the independent one?",
          "down": "math.ratio.rates-unit-rates"
        }
      }
    },
    {
      "id": "math.algebra.expressions-evaluate-write",
      "domain": "math",
      "strand": "algebra",
      "title": "Variables; write & evaluate algebraic expressions; identify parts (term, coefficient, factor)",
      "tier": "L3",
      "band": [
        10,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: write an expression from words ('subtract y from 5' = 5 \u2212 y), read 3x as '3 times x', identify terms/coefficients/factors/sum/product, and evaluate an expression (incl. from a formula like V = s\u00b3) at given values, including signed values",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.algebra.write-evaluate-exponents",
        "math.multdiv.multistep-4ops-patterns",
        "math.integers.integer-add-subtract"
      ],
      "helps": [
        "math.numbertheory.gcf-lcm"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a75.1 Expressions",
          "record": true
        }
      ],
      "sources": [
        "CC 6.EE.2",
        "CC 5.OA.2",
        "research/prealgebra-extension.md \u00a74C (A2)"
      ],
      "notes": "6.EE.2 (a\u2013c): write expressions with letters for numbers, identify sum/term/product/factor/quotient/coefficient, evaluate at values incl. from formulas; 5.OA.2 (write simple expressions). requires integer-add-subtract so evaluation at SIGNED values works. Also absorbs the light 6.EE.3/6.EE.4 equivalent-expression / distributive work, helped by gcf-lcm's 36+8=4(9+2) factoring (per \u00a78 folding note; a separate equivalent-expressions node is the most defensible 43rd node if this feels overloaded \u2014 flagged). Misconception: writing '5 \u2212 y' as 'y \u2212 5' (order); reading 3x as '3 and x' not '3 times x'; treating the letter as a fixed unknown vs a varying quantity.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "translate word phrases to symbols term by term; name the coefficient, the variable, and the constant; substitute and simplify",
          "check": "write 'seven more than triple a number' and evaluate at n = 2"
        },
        "C": {
          "move": "with algebra tiles, an x-tile is an unknown length and a unit tile is 1; build 2x + 3 as two x-tiles and three units; 'evaluate at x=4' means swap each x-tile for a length-4 strip",
          "check": "build 2x + 3 with tiles, then find its value when x = 4"
        },
        "N": {
          "move": "a rule for a real quantity \u2014 cost = 3 \u00d7 (number of tickets); the variable stands for the thing that can change",
          "check": "if each ticket is $3, write the cost for t tickets, then the cost for 5"
        }
      }
    },
    {
      "id": "math.algebra.inequalities-intro",
      "domain": "math",
      "strand": "algebra",
      "title": "Inequalities: write & graph x > c / x < c; solution SETS; simple two-step inequalities",
      "tier": "L3",
      "band": [
        11,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: write x > c / x < c for a constraint, recognize such inequalities have infinitely many solutions, graph the solution set on a number line (open/closed circle), and solve simple px + q > r",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.algebra.one-step-equations",
        "math.integers.compare-order-rationals"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a75.5 Inequalities",
          "record": true
        }
      ],
      "sources": [
        "CC 6.EE.8",
        "CC 7.EE.4b",
        "research/prealgebra-extension.md \u00a74C (A6)"
      ],
      "notes": "6.EE.8: x > c / x < c as a constraint, recognize INFINITELY many solutions, graph on a number line; 7.EE.4b extends to px + q > r. Keep it one-variable; the flip-on-multiply-by-a-negative subtlety is an edge item (noted), NOT a fluency requirement here. Misconception: treating an inequality solution as a single number; open vs closed circle on the graph; forgetting the sign flips when multiplying/dividing by a negative.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "solve like an equation to find the boundary, then decide the direction; the solution is a SET, not one value",
          "check": "solve 2x \u2212 1 < 5 and describe every number that works"
        },
        "G": {
          "move": "graph the solution on a number line: open circle for > / < (not included), closed for \u2265 / \u2264, arrow toward all the values that work",
          "check": "graph x > 3 \u2014 why an open circle and an arrow, not a single dot?"
        },
        "N": {
          "move": "'you must be at least 48 inches to ride' or 'spend under $20' \u2014 real constraints that many values satisfy",
          "check": "if a ride needs height \u2265 48 in, graph who can ride"
        }
      }
    },
    {
      "id": "math.algebra.one-step-equations",
      "domain": "math",
      "strand": "algebra",
      "title": "Solve one-step equations (px = q, x + p = q) by inverse operations; a solution makes it true",
      "tier": "L3",
      "band": [
        10,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: solve x + p = q and px = q for nonnegative rationals by applying the inverse operation to BOTH sides; check a candidate by substitution; explain the solution as the value that makes the equation true",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.algebra.expressions-evaluate-write",
        "math.integers.integer-add-subtract",
        "math.addsub.equal-sign-unknown"
      ],
      "helps": [
        "math.multdiv.mult-div-word-problems"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a75.2 Solving Linear Equations I",
          "record": true
        }
      ],
      "sources": [
        "CC 6.EE.5",
        "CC 6.EE.6",
        "CC 6.EE.7",
        "research/prealgebra-extension.md \u00a74C (A4)"
      ],
      "notes": "6.EE.5: solving = find which value makes the equation true (check by substitution); 6.EE.7: solve x + p = q and px = q for nonnegative rationals. THE load-bearing prereq is the equal-sign-unknown node ('=' as balance, not 'answer comes next') \u2014 the K\u20134 spine flagged this misconception directly. Misconception: 'undoing' with the SAME operation instead of the inverse; applying the inverse to only one side.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "isolate the variable by applying the inverse operation to both sides; substitute the answer back to verify",
          "check": "solve 4x = 20 and check by substitution"
        },
        "C": {
          "move": "the balance/pan-scale model: an equation is a level balance; whatever you remove or add, do to BOTH pans to keep it level; x + 3 = 7 \u2192 take 3 off each pan",
          "check": "model x + 3 = 7 on a balance \u2014 what keeps it level?"
        },
        "N": {
          "move": "'I had some, added 3, now have 7 \u2014 how many did I start with?' \u2014 the unknown is the start, the inverse recovers it",
          "check": "a number times 5 is 35 \u2014 what's the number?",
          "down": "math.addsub.equal-sign-unknown"
        }
      }
    },
    {
      "id": "math.algebra.order-of-operations",
      "domain": "math",
      "strand": "algebra",
      "title": "Order of operations (grouping, exponents, \u00d7\u00f7, +\u2212); GEMS/PEMDAS with nested grouping",
      "tier": "L3",
      "band": [
        10,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: evaluate multi-operation numerical expressions with grouping symbols (parentheses, brackets, braces) and exponents in the conventional order, doing \u00d7\u00f7 left-to-right and +\u2212 left-to-right",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.algebra.write-evaluate-exponents"
      ],
      "helps": [
        "math.algebra.expressions-evaluate-write"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a75.1 (order of operations)",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-4 Exponents (order of operations)"
        }
      ],
      "sources": [
        "CC 5.OA.1",
        "CC 6.EE.2c",
        "research/prealgebra-extension.md \u00a74C (A3)"
      ],
      "notes": "5.OA.1 introduces grouping symbols; 6.EE.2c folds exponents into the conventional order. Teach GEMS (Grouping, Exponents, Mult/div left-to-right, Add/sub left-to-right) to defuse the PEMDAS 'multiply-before-divide' trap. Misconception: doing ALL multiplication before division (they are co-equal, left-to-right); assuming a \u2212 b + c = a \u2212 (b + c).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "apply GEMS as a checklist, resolving \u00d7\u00f7 strictly left-to-right and +\u2212 strictly left-to-right (not P-then-E-then... blindly)",
          "check": "why is 8 \u00f7 2 \u00d7 2 = 8, not 2?"
        },
        "G": {
          "move": "box the innermost grouping first and work outward; underline exponents as the next layer; annotate each step so the order is visible",
          "check": "evaluate 2 + 3 \u00d7 (4 + 1)\u00b2 \u2014 box what you do first"
        }
      }
    },
    {
      "id": "math.algebra.two-step-equations",
      "domain": "math",
      "strand": "algebra",
      "title": "Solve simple two-step equations (px + q = r, p(x + q) = r) \u2014 the FRONTIER equation node",
      "tier": "L3",
      "band": [
        11,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: solve px + q = r and p(x + q) = r for rational p,q,r by undoing operations in the correct order; compare the algebraic solution to an arithmetic one",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.algebra.one-step-equations",
        "math.integers.integer-four-ops"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a75.2\u20135.3 Solving Linear Equations I & II / \u00a75.4 Word Problems",
          "record": true
        }
      ],
      "sources": [
        "CC 7.EE.4a",
        "CC 7.EE.3",
        "research/prealgebra-extension.md \u00a74C (A5)"
      ],
      "notes": "7.EE.4a: solve px + q = r and p(x + q) = r (p,q,r rational) FLUENTLY; compare the algebraic to an arithmetic solution. THE TOP OF THE GRAPH \u2014 stops short of Algebra 1 (no variables-on-both-sides, no general linear, no systems). requires integer-four-ops (fluent signed arithmetic makes the two steps affordable). Misconception: undoing in the wrong order (add/sub before mult/div when isolating); distributing errors in p(x + q).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "undo in reverse order of operations: subtract/add the constant, then divide/multiply; distribute first for p(x + q); verify by substitution",
          "check": "solve 3(x \u2212 2) = 12 two ways (distribute vs divide first)"
        },
        "C": {
          "move": "balance model in two moves: first remove the constant q from both pans, THEN split the remaining pans into p equal parts (undo \u00d7 last)",
          "check": "on a balance, solve 2x + 3 = 11 \u2014 which do you undo first, the +3 or the \u00d72?"
        },
        "N": {
          "move": "'a taxi costs $3 plus $2 a mile; the ride was $11 \u2014 how many miles?' \u2014 the two steps peel off the flat fee then the per-unit rate",
          "check": "set up and solve the taxi problem",
          "down": "math.algebra.one-step-equations"
        }
      }
    },
    {
      "id": "math.algebra.write-evaluate-exponents",
      "domain": "math",
      "strand": "algebra",
      "title": "Exponents: powers, squares & cubes; write/evaluate powers; light square-root intro",
      "tier": "L3",
      "band": [
        9,
        12
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: write and evaluate whole-number powers (2^3 = 8), recognize squares and cubes, and use that \u221a undoes squaring for perfect squares (\u221a49 = 7)",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.multdiv.mult-div-facts-memory-100"
      ],
      "helps": [
        "math.numbertheory.prime-factorization",
        "math.algebra.order-of-operations"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a72.1 Squares / \u00a72.2 Higher Exponents / \u00a79.1 From Squares to Square Roots",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-4 Exponents (perfect squares)"
        },
        {
          "type": "beast",
          "ref": "BA-5 Exponents / Square Roots"
        }
      ],
      "sources": [
        "CC 6.EE.1",
        "CC 5.NBT.2",
        "research/prealgebra-extension.md \u00a74C (A1)"
      ],
      "notes": "6.EE.1: write/evaluate numerical expressions with whole-number exponents; 5.NBT.2 (powers of 10). Squares/cubes/higher powers; 2^3 = 8; light intro that \u221a undoes squaring (perfect squares only, AoPS \u00a79.1). Do NOT push zero/negative exponents (AoPS \u00a72.3\u20132.4) or non-perfect-square roots (\u00a79.2) \u2014 pre-algebra-DEEP, kept as stretch in notes, honoring 'not excessively far.' Misconception: '2^3 = 6' (base\u00d7exponent); '5^2 = 10'; conflating 2^3 and 3^2.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "expand a power as repeated multiplication (2^4 = 2\u00d72\u00d72\u00d72) before evaluating; read \u221a as 'what squares to this?'",
          "check": "evaluate 3^3 by writing it out; find \u221a64"
        },
        "C": {
          "move": "build a square (n rows of n) and a cube (n\u00d7n\u00d7n) with tiles/blocks \u2014 the count IS n\u00b2 and n\u00b3; a perfect square is the one that makes a full square",
          "check": "build 5\u00b2 with tiles \u2014 how many? why is it called 'squared'?"
        },
        "N": {
          "move": "area of a square patch (side\u00b2), volume of a cube box (side\u00b3) \u2014 powers count repeated growth, not repeated addition",
          "check": "a square garden is 6 ft on a side \u2014 how many square feet?"
        }
      }
    },
    {
      "id": "math.counting.compare-numbers-20",
      "domain": "math",
      "strand": "counting",
      "title": "Compare quantities and written numerals (greater/less/equal) within ~20",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: compare two sets by matching+counting and compare two written numerals (>, =, <)",
        "L3": "SM-2 spaced gate across separate days"
      },
      "requires": [
        "math.counting.count-objects-cardinality"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math KA ch6",
          "note": "Comparing Numbers Within 10",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch11",
          "note": "Comparing"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch1 \u00a71C Compare and Order Numbers"
        },
        {
          "type": "beast",
          "ref": "BA 2A ch2 Comparing"
        }
      ],
      "sources": [
        "CC K.CC.6",
        "CC K.CC.7",
        "research/math-spine.md \u00a73"
      ],
      "notes": "'looks like more' \u2260 'is more' \u2014 matching/counting can overturn a visual judgment (K2 p.5). < vs > symbol direction is a separate difficulty (K3 p.6): 'wide part next to the larger number'.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "compare two written numerals directly (no objects): 8 __ 14, 20 __ 12, and read it aloud as a full statement ('fourteen is greater than eight').",
          "check": "write the right symbol: 15 __ 15, then 19 __ 9."
        },
        "G": {
          "move": "draw or shade two bars/ten-frames to the counted heights and compare their lengths; introduce the >, =, < symbols as a hungry mouth whose wide part opens toward the bigger number.",
          "check": "put >, =, or < between 13 and 17 \u2014 which way does the wide part face?"
        },
        "C": {
          "move": "line up two rows of counters and MATCH them one-to-one; the row that sticks out past the other is the greater set \u2014 this can overturn a 'looks like more' visual judgment (a spread-out small set vs a bunched large one).",
          "check": "match these two rows \u2014 which has more, and how do you know it isn't just spread out?",
          "down": "math.counting.count-objects-cardinality"
        },
        "N": {
          "move": "compare real amounts she cares about \u2014 'you have 12 marbles, your sister has 15, who has more and how many more?' \u2014 anchoring greater/less to fairness and quantity in the world.",
          "check": "there are 8 red apples and 11 green apples \u2014 are there more green or more red?"
        }
      }
    },
    {
      "id": "math.counting.count-objects-cardinality",
      "domain": "math",
      "strand": "counting",
      "title": "Count objects 1-to-1; last number = how many (cardinality); count out n",
      "tier": "L3",
      "band": [
        4,
        6
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: count a set 1-to-1 (line/array/circle/scattered), answer 'how many?' with the last number, and count out a requested number of objects",
        "L3": "SM-2 spaced gate on mixed fresh sets across separate days"
      },
      "requires": [
        "math.counting.count-sequence-100"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math KA ch2",
          "note": "Numbers to 5 \u2014 count 1-to-1, cardinality",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math KA ch3",
          "note": "Numbers to 10"
        },
        {
          "type": "activity",
          "ref": "count and hand me N objects (blocks, crackers)"
        },
        {
          "type": "gumball",
          "ref": "generator:fact_mc"
        }
      ],
      "sources": [
        "CC K.CC.4a",
        "CC K.CC.4b",
        "CC K.CC.5",
        "research/math-spine.md \u00a73"
      ],
      "notes": "The 'count IS the answer' error: pre-cardinality child re-counts instead of reporting the last number (K2 p.4). Arrangement difficulty: line\u2192array\u2192circle\u2192scattered \u2014 one node, harder items gate L3.",
      "instrument_gap": false,
      "representations": {
        "G": {
          "move": "circle a pictured group of objects and write the total; vary the arrangement (line -> array -> circle -> scattered) so 'how many' is the count regardless of shape.",
          "check": "how many stars in this scattered group? \u2014 count once and write the number."
        },
        "C": {
          "move": "count a set of physical counters one-to-one, moving each into a 'counted' pile as she says its number; then STOP and ask 'how many?' \u2014 the answer is the last number said, no re-count. Also count OUT a requested number (give me 7 crackers) so cardinality runs both directions.",
          "check": "count these 9 blocks, then without counting again tell me how many there are; now count out 6 for me.",
          "down": "math.counting.count-sequence-100"
        },
        "N": {
          "move": "count real belongings that matter to her \u2014 'how many stickers do you have?', 'set the table: count out one fork for each of the 5 chairs' \u2014 where the last number genuinely answers a real 'how many'.",
          "check": "count out one napkin for every person at dinner \u2014 how many did you need?"
        }
      }
    },
    {
      "id": "math.counting.count-oral-skip",
      "domain": "math",
      "strand": "counting",
      "title": "Skip-count by 2s, 5s, 10s (oral fluency tool skill)",
      "tier": "L4",
      "band": [
        5,
        8
      ],
      "fluency_aim": {
        "metric": "problems_per_min_oral",
        "target": 60,
        "sustain": "2 of 3 separate days, \u22642 errors/min",
        "source": "research/fluency-aims.md \u00a78 (McDowell & Keenan skip-count 60-80/min)"
      },
      "gates": {
        "L2": "\u226590% on 10 fresh oral skip-count prompts (by 2s/5s/10s to 100), untimed",
        "L3": "SM-2 spaced gate across separate days",
        "L4": "oral 1-minute timing: skip-count numbers said/min, parent scores; 60-80/min range, lower number is pass"
      },
      "requires": [
        "math.counting.count-sequence-100"
      ],
      "helps": [
        "math.counting.skip-count-2-5-10"
      ],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch7",
          "note": "Multiplication and Division of 2, 5, and 10 \u2014 count-by foundation",
          "record": true
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch6 \u00a76C Skip Count by 2s, 5s, and 10s"
        },
        {
          "type": "beast",
          "ref": "BA 3A ch2 Skip-Counting"
        },
        {
          "type": "activity",
          "ref": "count nickels/dimes aloud; count by 2s up the stairs"
        }
      ],
      "sources": [
        "CC 2.NBT.2",
        "research/fluency-aims.md \u00a78",
        "research/singapore-beast.md \u00a75.D"
      ],
      "notes": "Oral (see/say) aim sidesteps the write-digits ceiling. Aim range 60-80/min; pass = 60. Feeds multiplication (skip-count \u2192 arithmetic sequences \u2192 \u00d7, BA 3A ch2). Confidence: literature-solid.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "show the skip-count sequence written (5,10,15,...) and have her say-the-next at a timed pace off a see/say sheet; the L4 gate is the 1-minute oral timing at 60-80/min.",
          "check": "read this row out loud as fast as you can: 5, 10, 15, 20, 25, ... keep going to 60."
        },
        "C": {
          "move": "skip-count physical equal groups aloud at pace \u2014 drop nickels one at a time saying 5,10,15,20; step up the stairs two at a time saying 2,4,6,8 \u2014 the object drop sets the rhythm the oral rate rides on.",
          "check": "count these dimes into the jar by 10s as fast as you can with no mistakes \u2014 how high did you get in a minute?",
          "down": "math.counting.count-sequence-100"
        },
        "N": {
          "move": "attach skip-counting to real fast-counting jobs \u2014 'count the shoes by 2s', 'count how much money in nickels' \u2014 so the automaticity has a reason to be fast.",
          "check": "count these 8 pairs of socks by 2s \u2014 how many socks total?"
        }
      }
    },
    {
      "id": "math.counting.count-sequence-100",
      "domain": "math",
      "strand": "counting",
      "title": "Oral count sequence to 100 (by 1s and 10s), count on from any number",
      "tier": "L3",
      "band": [
        4,
        6
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh oral-counting prompts, untimed (say the sequence to 100; count on from a given number; count by 10s)",
        "L3": "SM-2 spaced gate (3+ spaced reps, 4+ lifetime correct) across separate days"
      },
      "requires": [],
      "helps": [
        "math.counting.skip-count-2-5-10"
      ],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math KA ch2",
          "note": "Numbers to 5",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math KA ch3",
          "note": "Numbers to 10"
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math KB ch7",
          "note": "Numbers to 20"
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math KB ch12",
          "note": "Numbers to 100"
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch1",
          "note": "Numbers to 10"
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch5",
          "note": "Numbers to 20"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch1 \u00a71A Count to 1,000"
        },
        {
          "type": "beast",
          "ref": "BA 2A ch2 Comparing"
        },
        {
          "type": "activity",
          "ref": "count stairs / count to 100 aloud on a walk"
        }
      ],
      "sources": [
        "CC K.CC.1",
        "CC K.CC.2",
        "research/math-spine.md \u00a73"
      ],
      "notes": "Counting words are a prereq to using them for counting (K2 p.4). Cora's zone; Penelope past this.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "show the written numeral sequence on a number track/hundred chart and have her point-and-say, connecting the spoken word to the written digits, especially over decade bumps (29->30, 89->90).",
          "check": "what number comes right after 79? after 99?"
        },
        "C": {
          "move": "count real objects up a physical column \u2014 steps on the stairs, beads on a hundred-string, a tower of unifix cubes \u2014 saying each number word as you touch the next one; then start from a given rung (e.g. touch step 37) and count on from there without restarting at 1.",
          "check": "start at 47 and count on to 60 \u2014 touch each step as you say it."
        },
        "N": {
          "move": "make counting a lived count-out-loud on a walk or up the stairs: 'let's see if we reach 100 before the mailbox'; count by 10s while dropping a coin in the jar each ten.",
          "check": "we're on step 68 \u2014 keep going to 80 while we walk.",
          "down": "count small sets 1-to-1 first"
        }
      }
    },
    {
      "id": "math.counting.skip-count-2-5-10",
      "domain": "math",
      "strand": "counting",
      "title": "Skip-count by 2s/5s/10s to 1000; count within 1000 (understanding, not rate)",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: continue a skip-count sequence by 2/5/10/100 from any start within 1000; fill missing terms",
        "L3": "SM-2 spaced gate across separate days"
      },
      "requires": [
        "math.counting.count-sequence-100"
      ],
      "helps": [
        "thinking.reasoning.pattern-rule"
      ],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch7",
          "note": "count-by 2/5/10 (equal-groups \u2192 \u00d7)",
          "record": true
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch6 \u00a76C Skip Count by 2s, 5s, and 10s"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch1 \u00a71B Number Patterns"
        },
        {
          "type": "beast",
          "ref": "BA 3A ch2 Skip-Counting"
        }
      ],
      "sources": [
        "CC 2.NBT.2",
        "research/math-spine.md \u00a73"
      ],
      "notes": "Understanding rung (patterns, missing terms) distinct from the oral-rate rung count-oral-skip. Foundation for multiplication (arithmetic sequences, BA 3A ch2).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "continue and fill the written sequence from any start within 1000 (e.g. 320, 330, __, 350) and name the pattern rule ('add 10 each time'); connect to growing-pattern reasoning.",
          "check": "fill the blanks: 250, __, 270, 280, __ \u2014 what is the rule?",
          "down": "math.counting.count-sequence-100"
        },
        "G": {
          "move": "hop along a number line in equal jumps (by 2s/5s/10s/100s) from any start, drawing the arcs; the landing points ARE the sequence, and a blank landing is a missing term to solve.",
          "check": "draw hops of 5 from 35: land on 35, 40, __, 50 \u2014 what's the blank?"
        },
        "C": {
          "move": "build the skip-count with equal stacks \u2014 lay down towers of 5 cubes and count 5,10,15 as each tower joins; leave a GAP and ask what number the missing tower holds (fill-the-missing-term with a physical stack).",
          "check": "here are stacks of ten: 10, 20, __, 40 \u2014 build and name the missing stack."
        }
      }
    },
    {
      "id": "math.counting.write-digits",
      "domain": "math",
      "strand": "counting",
      "title": "Write digits 0-9 and 1-2 digit numbers (tool skill; fluency ceiling)",
      "tier": "L4",
      "band": [
        5,
        9
      ],
      "fluency_aim": {
        "metric": "digits_per_min_written",
        "target": 40,
        "sustain": "2 of 3 separate days",
        "source": "research/fluency-aims.md \u00a73 (Rocket Math Writing Speed Test)"
      },
      "gates": {
        "L2": "\u226590% legible correct numerals on a fresh 0-20 write-the-numeral sheet, untimed",
        "L3": "SM-2 spaced gate: correct legible numerals across separate days",
        "L4": "Writing Speed Test \u2014 write the (1-2 digit) numbers shown, 1 minute, count boxes; MEASURE the rate; this rate IS the ceiling for every written fact node"
      },
      "requires": [
        "math.counting.count-objects-cardinality"
      ],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "Rocket Math Writing Speed Test (printed timed sheet, parent scores)"
        },
        {
          "type": "packet",
          "ref": "analog-clocks-2026-07-12",
          "note": "part 8 draw/write practice reinforces numeral formation"
        }
      ],
      "sources": [
        "CC K.CC.3",
        "research/fluency-aims.md \u00a73",
        "research/fluency-aims.md \u00a76"
      ],
      "notes": "MOTOR-SPEED CEILING. Target 40 is [EXTRAPOLATED] (K-end ~40 \u2192 grade-1-end ~60, Rocket Math \u00a73a); MEASURE with a real Writing Speed Test per term in the 7-9 steep-growth window \u2014 do NOT freeze the number. Every WRITTEN fact-fluency node requires this and sets its aim at 2/3 of the measured rate. Prefer oral aims to sidestep the ceiling. Confidence: literature-solid method / extrapolated value.",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "write the numerals to dictation from the printed model, then from a spoken/pictured quantity; run the timed Rocket-Math Writing Speed Test to MEASURE her digits-per-minute \u2014 this rate is the ceiling for every written-fact node.",
          "check": "write the numbers I say \u2014 fourteen, forty-one, seven \u2014 watch the teen vs decade order (14 not 41)."
        },
        "C": {
          "move": "form each numeral in a multisensory medium before pencil \u2014 trace the digit in a sand/salt tray or in the air with a big arm motion, following the start-dot and stroke arrows; this builds the motor path (the ceiling this node measures is MOTOR speed).",
          "check": "make a 3 in the sand tray starting from the top dot \u2014 does it curve the right way, not backward?",
          "down": "math.counting.count-objects-cardinality"
        }
      }
    },
    {
      "id": "math.fractions.add-sub-mult-like",
      "domain": "math",
      "strand": "fractions",
      "title": "Add/subtract like-denominator fractions & mixed numbers; multiply fraction \u00d7 whole",
      "tier": "L3",
      "band": [
        8,
        10
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: add/subtract fractions & mixed numbers with like denominators; multiply a fraction by a whole number (5/4 = 5 \u00d7 1/4); decompose a fraction into a sum",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.fractions.fraction-number-line",
        "math.multdiv.mult-div-meaning",
        "math.addsub.wp-result-unknown"
      ],
      "helps": [],
      "resources": [
        {
          "type": "beast",
          "ref": "BA 3D ch10 Fractions"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch7 \u00a77G Fractions of a Set"
        }
      ],
      "sources": [
        "CC 4.NF.3",
        "CC 4.NF.4",
        "research/math-spine.md \u00a77"
      ],
      "notes": "Fraction add/sub reuses the SAME Add-To/Take-From/Put-Together situations as whole numbers (K4 p.4) \u2014 softly requires wp-result-unknown. Multiply fraction\u00d7whole builds on mult-as-equal-groups. a/b = a copies of 1/b is the load-bearing idea.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write the operation on the notation, keeping the like denominator: 2/5 + 1/5 = 3/5 (add the tops, keep the bottom because the pieces are the same size); decompose 5/8 = 1/8+1/8+1/8+1/8+1/8; write 5 \u00d7 1/4 = 5/4. Connect each to the picture so the 'add the tops only' rule is grounded, not a trick.",
          "check": "What is 4/6 \u2212 1/6? Write 3/4 as a sum of one-fourths. What is 3 \u00d7 1/5 written as a single fraction?"
        },
        "G": {
          "move": "Bar/number-line model: shade 1/5, then shade 3 more fifths to show 1/5 + 3/5 = 4/5 as counting same-size pieces along one bar; for subtraction, cross off pieces. For fraction \u00d7 whole, draw 5 copies of a 1/4 segment jumping along a number line to land on 5/4, connecting to repeated equal groups.",
          "check": "On this bar cut into fifths, shade 2/5 then 2/5 more. What's the total? Draw four jumps of 1/3 on a number line \u2014 where do you land?"
        },
        "C": {
          "move": "Fraction tiles again: to add 2/8 + 3/8, physically push together 2 of the 1/8 tiles and 3 of the 1/8 tiles \u2014 you now hold 5 of the same 1/8 piece = 5/8. The denominator is the NAME of the piece (it doesn't change); you're just counting pieces. For 5 \u00d7 1/4, lay out five 1/4 tiles and see 5/4 (past one whole).",
          "check": "Add 3/8 and 2/8 with the eighth-tiles \u2014 how many eighths do you have now? Does the bottom number change?",
          "down": "math.fractions.fraction-number-line"
        },
        "N": {
          "move": "Same Add-To / Take-From stories she already knows, now with fractions: 'You ate 2/8 of the pizza, your brother ate 3/8 \u2014 how much is gone?' 'The bottle had 5/6 of a liter, you poured out 2/6 \u2014 how much is left?' The situation is identical to whole-number add/sub; only the unit is a fraction.",
          "check": "You had 7/8 of a chocolate bar and gave away 3/8. How much do you have left? What operation did you use?"
        }
      }
    },
    {
      "id": "math.fractions.decimal-notation",
      "domain": "math",
      "strand": "fractions",
      "title": "Decimal notation for fractions (denominators 10/100); compare decimals",
      "tier": "L3",
      "band": [
        8,
        10
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: express fractions with denominator 10/100 as decimals; write/read decimal notation; compare two decimals to hundredths",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.fractions.equivalence-compare-4",
        "math.placevalue.big-numbers-round"
      ],
      "helps": [],
      "resources": [
        {
          "type": "singapore",
          "ref": "PMUS 3A u5 Money (Dollars and Cents)"
        }
      ],
      "sources": [
        "CC 4.NF.5",
        "CC 4.NF.6",
        "CC 4.NF.7",
        "research/math-spine.md \u00a77"
      ],
      "notes": "Decimals as denominator-10/100 fractions; ties to money (dollars.cents). MA spends 8 topics here (6.19); we keep one node. Money-notation is the concrete anchor.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Connect fraction\u2194decimal notation by place value: 7/10 = 0.7 (tenths place), 45/100 = 0.45 (hundredths place); 3/10 = 30/100 = 0.30. Write the fraction directly above its decimal so the denominator (10 or 100) names the place. Compare decimals by lining up the decimal points and comparing tenths, then hundredths.",
          "check": "Write 6/10 and 9/100 as decimals. Which is greater, 0.6 or 0.06? Write 0.75 as a fraction over 100."
        },
        "G": {
          "move": "Use a 10\u00d710 hundredths grid (and a 10-strip for tenths): shade 7 of 10 columns to show 7/10 = 0.7; shade 23 small squares to show 23/100 = 0.23. Line two shaded grids side by side to compare 0.3 vs 0.27 by area shaded \u2014 more shaded = bigger, which breaks the 'longer string of digits is bigger' error.",
          "check": "Shade 0.4 on the tenths strip and 0.40 on the hundredths grid \u2014 same amount? Which is bigger, 0.3 or 0.27, and why?",
          "down": "math.fractions.equivalence-compare-4"
        },
        "N": {
          "move": "Money is the concrete anchor: $0.75 is 75/100 of a dollar = 3 quarters; $0.5 = 50\u00a2 = half a dollar = 5/10. Count real coins into dollar-and-cents amounts and write them both as money ($1.25) and as a mixed decimal, so the decimal point is the dollars-cents divider she already knows.",
          "check": "Three quarters is what fraction of a dollar, and how do you write it as a decimal? Write two dollars and five cents as a decimal number."
        }
      }
    },
    {
      "id": "math.fractions.equal-shares",
      "domain": "math",
      "strand": "fractions",
      "title": "Partition shapes into equal shares (halves, thirds, fourths); fair shares",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: partition a shape into 2/3/4 equal shares; name halves/thirds/fourths; recognize that equal shares need not be the same SHAPE (equal area)",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.geometry.compose-decompose-shapes"
      ],
      "helps": [
        "math.measure.money-coins-bills",
        "math.measure.tell-time-5min",
        "thinking.reasoning.self-explanation"
      ],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch15",
          "note": "Fractions (halves, fourths) \u2014 first exposure",
          "record": true
        },
        {
          "type": "packet",
          "ref": "fractions-2026-07-12",
          "note": "parts 1-3: fair shares \u2192 the half \u2192 quarters & thirds"
        },
        {
          "type": "singapore",
          "ref": "PMUS 2B u4 Fractions (Halves and Quarters)"
        },
        {
          "type": "gumball",
          "ref": "generator:fraction_identify"
        }
      ],
      "sources": [
        "CC 1.G.3",
        "CC 2.G.3",
        "research/math-spine.md \u00a77",
        "research/math-spine.md \u00a78"
      ],
      "notes": "'Equal parts' means equal MEASUREMENT, not equal shape (K4 p.7): 1/4 of a square can be 4 differently-shaped equal-area pieces. helps: clock-quarters \u2194 coin-quarters \u2194 fraction-quarters transfer (the ed-packet panel's empirical finding, DESIGN \u00a72). Seed Penelope L0 \u2014 packet built but NOT completed (evidence-inventory).",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "Attach the names to the pictures: two equal parts \u2192 'halves', three \u2192 'thirds', four \u2192 'fourths/quarters'. Write the word under each partitioned figure so the picture and the name sit together. Not yet the a/b symbol \u2014 words first (that's the next node).",
          "check": "This circle is cut into 4 equal parts. What is each part called \u2014 halves, thirds, or fourths?"
        },
        "G": {
          "move": "Draw the packet's pie and bar figures: a straight cut through the center of a pie / through the middle of a bar makes 2 equal parts; add a cut for fourths. Contrast an HONEST equal partition against a distractor where the cut is off-center \u2014 she circles which one is really cut into equal shares. Keep tilted pies OFF the 'is-this-equal' items (a tilted slice looks unequal even when it isn't).",
          "check": "Here are three cut pies. Circle every one that is cut into equal shares \u2014 and cross out the one that only looks fair."
        },
        "C": {
          "move": "Fold a paper strip (or paper circle) in half, then fold again for fourths; open it and trace the crease lines. Then hand her a rectangle of clay/dough and a plastic knife and have her cut a 'fair share' for 3 people \u2014 she keeps re-cutting until every piece would make each customer smile. Physically stack the pieces to prove they match.",
          "check": "Fold this paper strip so two people get a fair share. Now show me the folds \u2014 are the two parts exactly the same amount? How do you know?",
          "down": "math.geometry.compose-decompose-shapes"
        },
        "N": {
          "move": "Run the bakery story from the packet: Shortchange Sam hands out unfair slices and it's her job to catch him. 'Four kids are sharing one brownie \u2014 cut it so nobody complains.' Use a real snack (a graham-cracker rectangle, an orange) and split it fairly at the table; the lived unfairness of a bad cut is the whole lesson.",
          "check": "You and your sister are splitting one cookie. Show me how to break it so it's a fair share \u2014 and tell me why the big-little way isn't fair."
        }
      }
    },
    {
      "id": "math.fractions.equivalence-compare-4",
      "domain": "math",
      "strand": "fractions",
      "title": "Explain fraction equivalence (n\u00d7a/n\u00d7b); compare unlike fractions via benchmarks",
      "tier": "L3",
      "band": [
        8,
        10
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: explain a/b = (n\u00d7a)/(n\u00d7b) and generate equivalents; compare two fractions with unlike numerators AND denominators via common denominator or a benchmark (1/2)",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.fractions.equivalent-compare-3"
      ],
      "helps": [],
      "resources": [
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch7 \u00a77E Equivalent Fractions"
        },
        {
          "type": "singapore",
          "ref": "PMUS 3B u6 Fractions (Equivalent Fractions)"
        },
        {
          "type": "beast",
          "ref": "BA 3D ch10 Fractions"
        }
      ],
      "sources": [
        "CC 4.NF.1",
        "CC 4.NF.2",
        "research/math-spine.md \u00a77"
      ],
      "notes": "Gr4 general equivalence rule + benchmark/common-denominator comparison, split from the Gr3 'recognize' rung (K4 p.8). Gr4 denominators: 2,3,4,5,6,8,10,12,100. BA-L3 already reaches 4.NF.1/4.NF.2 (\u00a75.C).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Generalize to the symbolic rule a/b = (n\u00d7a)/(n\u00d7b) and use it to make a common denominator, then compare. Also teach the benchmark move symbolically: 3/8 < 1/2 because 3/8 < 4/8; 5/6 > 1/2 because 5/6 > 3/6. Write the multiplied form beside the original so the equivalence is explicit, not memorized.",
          "check": "Rewrite 2/3 and 3/4 with the same bottom number, then tell me which is bigger. Is 5/8 more or less than 1/2 \u2014 how do you know without a picture?"
        },
        "G": {
          "move": "Draw a bar split into 3rds with 1/3 shaded; overlay a split that cuts each third into 4, turning it into 12ths with 4/12 shaded \u2014 same shaded length, showing 1/3 = 4/12 = (4\u00d71)/(4\u00d73). For unlike-fraction comparison, draw both fractions against a 1/2 benchmark bar to see which sits above/below one-half.",
          "check": "Cut each third of this bar into 4 smaller parts. What does 1/3 become in twelfths? Which is closer to one-half, 3/8 or 5/8?",
          "down": "math.fractions.equivalent-compare-3"
        }
      }
    },
    {
      "id": "math.fractions.equivalent-compare-3",
      "domain": "math",
      "strand": "fractions",
      "title": "Recognize/generate simple equivalent fractions; compare (same denom / same numer)",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: recognize/generate simple equivalents (1/2 = 2/4, same point); compare same-denominator (more unit fractions = bigger) and same-numerator (bigger denom = smaller pieces) fractions of the SAME whole",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.fractions.fraction-number-line"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2B ch11",
          "note": "Fractions (compare/order)",
          "record": true
        },
        {
          "type": "packet",
          "ref": "fractions-2026-07-12",
          "note": "part 6: bigger-denominator = smaller piece"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch7 \u00a77D-7E Compare/Order & Equivalent Fractions"
        },
        {
          "type": "gumball",
          "ref": "generator:fraction_compare"
        }
      ],
      "sources": [
        "CC 3.NF.3a",
        "CC 3.NF.3b",
        "CC 3.NF.3d",
        "research/math-spine.md \u00a77"
      ],
      "notes": "THE comparison misconception: 1/4 > 1/2 'because a fourth of the big pizza is bigger than a half of the small pizza' \u2014 comparisons valid only for the SAME whole (K4 p.9). Same-numerator (bigger bottom = smaller) is counterintuitive, its own item type. Gr3 = preliminary equivalence (recognize); Gr4 = the general rule.",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "Write the equivalence and comparison statements the pictures show: 1/2 = 2/4; 3/4 > 2/4 (same bottom, more pieces = bigger); 1/3 > 1/4 (same top, bigger bottom = smaller). Have her write the >, <, or = between two fractions after reading it off the shaded figure \u2014 picture first, symbol second.",
          "check": "Fill in >, <, or =:  2/4 __ 3/4 ,  1/3 __ 1/4 . Say the rule you used for each."
        },
        "G": {
          "move": "Draw two same-size bars stacked: split one into halves, one into fourths, shade 1/2 and 2/4 \u2014 the shaded lengths line up, so they're equivalent (same point on the line). For comparison, draw same-numerator pairs (1/3 vs 1/4) of the SAME whole and shade one piece each: more cuts \u2192 skinnier piece. This is the packet's Part 6 skinny-slice figure.",
          "check": "Here are 1/3 and 1/4 shaded on two same-size bars. Which shaded piece is bigger? Why does the bigger bottom number give the smaller piece?"
        },
        "C": {
          "move": "Lay fraction tiles on top of each other: place two 1/4 tiles end-to-end against one 1/2 tile \u2014 they cover the exact same length, so 2/4 = 1/2. For same-numerator comparison, set one 1/3 tile beside one 1/6 tile from the SAME whole and physically feel that the sixth piece is smaller \u2014 bigger bottom number, skinnier piece.",
          "check": "Cover one-half with the smaller tiles. Which tiles make a matching length, and how many did it take? So one-half equals how many fourths?",
          "down": "math.fractions.fraction-number-line"
        },
        "N": {
          "move": "The pizza-whole trap from the node's own misconception: '1/4 of a giant pizza vs 1/2 of a tiny personal pizza \u2014 which is more food?' Use two really different-sized paper pizzas to show that comparing fractions only works when the WHOLE is the same size; then compare fairly with two same-size pizzas.",
          "check": "A fourth of the big pizza looks bigger than a half of the little one. Is 1/4 really more than 1/2? What has to be true about the two pizzas before we can compare?"
        }
      }
    },
    {
      "id": "math.fractions.fraction-number-line",
      "domain": "math",
      "strand": "fractions",
      "title": "Fraction as a number on the number line; whole numbers as fractions",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: place a fraction on a number line (partition the unit interval 0-1 into b parts, iterate 1/b); express whole numbers as fractions (3 = 3/1, 4/4 = 1)",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.fractions.unit-fraction-meaning"
      ],
      "helps": [
        "math.measure.length-ruler"
      ],
      "resources": [
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch7 \u00a77F Fractions on a Number Line / \u00a77C Fractions Greater Than 1"
        },
        {
          "type": "beast",
          "ref": "BA 3D ch10 Fractions"
        }
      ],
      "sources": [
        "CC 3.NF.2",
        "CC 3.NF.3c",
        "research/math-spine.md \u00a77"
      ],
      "notes": "Number line = the unit interval (0\u21921) as the whole; 'an abstraction and generalization of their work with length measurement' (K4 p.2-3,8). helps FROM length-ruler \u2014 wire it or the map looks disconnected (spine \u00a711.4).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write whole numbers in fraction form and match them to points: 1 = 2/2 = 3/3 = 4/4 (all land on the '1' tick); 3 = 3/1. Pair each written fraction with the point you land on so the symbol names a NUMBER, not just a shaded piece.",
          "check": "Write 1 as a fraction with a bottom number of 4. Write 3 as a fraction. Which tick does each one sit on?"
        },
        "G": {
          "move": "Draw a number line 0\u21921, partition the unit interval into b equal segments, and locate a/b by iterating the unit fraction from 0 (NOT by counting tick marks). Extend past 1 to place 4/4 = 1 and to show whole numbers as fractions (3 = 3/1). Emphasize the whole is the DISTANCE 0\u21921, an abstraction of the length-bar model.",
          "check": "Mark 3/4 on this 0-to-1 number line. Now mark where 4/4 is \u2014 what other name does that point have?"
        },
        "C": {
          "move": "Use a physical number line: a length of ribbon or a ruler-strip marked 0 and 1. Have her fold/step the unit interval into b equal jumps with a paper strip and mark the tick for 1/b, then keep iterating jumps (1/b, 2/b, 3/b...) walking her finger along. This is length measurement \u2014 she's measuring how far from 0, not shading a region.",
          "check": "Here's the strip from 0 to 1. Make equal jumps to land the tick for one-third, then keep jumping \u2014 where does two-thirds land?",
          "down": "Measure lengths on a ruler first (partition a unit interval into equal parts)"
        }
      }
    },
    {
      "id": "math.fractions.mixed-numbers",
      "domain": "math",
      "strand": "fractions",
      "title": "Mixed numbers \u2194 improper fractions; operate with mixed numbers (all four operations, unlike denominators)",
      "tier": "L3",
      "band": [
        9,
        12
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: convert mixed\u2194improper, and add/subtract/multiply/divide mixed numbers including UNLIKE denominators (via equivalent fractions)",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.fractions.multiply-divide-fractions"
      ],
      "helps": [
        "math.numbertheory.gcf-lcm"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a74.7 Adding and Subtracting Fractions / \u00a74.8 Mixed Numbers",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-4 Fractions"
        },
        {
          "type": "beast",
          "ref": "BA-5 Fractions"
        }
      ],
      "sources": [
        "CC 4.NF.3c",
        "CC 5.NF.1",
        "research/prealgebra-extension.md \u00a74E (F2)"
      ],
      "notes": "5.NF.1: add/subtract fractions with UNLIKE denominators (incl. mixed) via equivalent fractions \u2014 the piece past the existing add-sub-mult-like (LIKE-denominators only). Uses GCF/LCM for the common denominator (helps). Misconception: adding whole parts and fraction parts separately then mishandling the regroup; converting 3\u00bc \u2192 13/4 by ADDING (3+4+1) instead of (3\u00d74)+1.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "convert mixed\u2192improper before multiplying/dividing; for +/\u2212 find a common denominator, then regroup wholes",
          "check": "compute 2\u2153 \u2212 \u215a, showing the common denominator step"
        },
        "G": {
          "move": "draw the whole circles plus the fractional part; to add unlike denominators, re-slice both pictures to a common number of pieces (the LCM) first",
          "check": "draw 1\u00bd + \u00be \u2014 what common slice size makes both pictures match?"
        },
        "N": {
          "move": "combine board lengths, recipe amounts, or times given as whole-plus-part quantities",
          "check": "two boards are 2\u00bc ft and 1\u00bd ft \u2014 total length?"
        }
      }
    },
    {
      "id": "math.fractions.multiply-divide-fractions",
      "domain": "math",
      "strand": "fractions",
      "title": "Multiply fractions (\u00d7 fraction, \u00d7 whole); divide fractions; multiplication as scaling",
      "tier": "L3",
      "band": [
        9,
        12
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: multiply fraction \u00d7 fraction and fraction \u00d7 whole (area meaning), divide a unit fraction by a whole and a whole by a unit fraction and (a/b)\u00f7(c/d); predict whether \u00d7 makes a number bigger or smaller (\u00d7 by <1 shrinks); give the answer in simplest form",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.fractions.add-sub-mult-like",
        "math.fractions.equivalence-compare-4"
      ],
      "helps": [
        "math.numbertheory.gcf-lcm"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a74.2 Multiplying Fractions / \u00a74.3 Dividing by a Fraction / \u00a74.5 Simplest Form",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-4 Fractions (multiplying, division by unit fractions)"
        },
        {
          "type": "beast",
          "ref": "BA-5 Fractions"
        }
      ],
      "sources": [
        "CC 5.NF.4",
        "CC 5.NF.5",
        "CC 5.NF.6",
        "CC 5.NF.7",
        "CC 6.NS.1",
        "research/prealgebra-extension.md \u00a74E (F1)"
      ],
      "notes": "5.NF.4\u20137: (a/b)\u00d7q, area with fractional sides, multiplication as scaling/resizing (\u00d7<1 shrinks, \u00d7>1 grows), divide unit-fraction\u00f7whole & whole\u00f7unit-fraction; 6.NS.1 completes GENERAL fraction division ((a/b)\u00f7(c/d) = ad/bc) with a visual justification. Simplest form leans on GCF (helps from gcf-lcm \u2014 kept as helps to avoid a numbertheory\u2192fractions hard gate that would over-couple the strands). Misconception: 'multiplying always makes bigger' (false for factors <1, 5.NF.5b targets it); inverting the WRONG fraction when dividing; 'flip and multiply' with no meaning.",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "multiply with an area model \u2014 shade 2/3 of a rectangle one way and 3/4 the other; the double-shaded overlap is the product; for division, ask 'how many 1/4s fit in 2?'",
          "check": "show 2/3 \u00d7 3/4 on a grid \u2014 why is the answer 1/2?"
        },
        "C": {
          "move": "fold paper: fold in thirds, then fold that in fourths, unfold \u2014 count the double-folded region against the whole",
          "check": "fold to show 1/2 of 1/3"
        },
        "N": {
          "move": "half of a half-pizza; how many quarter-cups fit in 3 cups of flour \u2014 real 'of' and 'how many fit' situations",
          "check": "a recipe needs 3/4 cup, you make half \u2014 how much?",
          "down": "math.fractions.add-sub-mult-like"
        }
      }
    },
    {
      "id": "math.fractions.unit-fraction-meaning",
      "domain": "math",
      "strand": "fractions",
      "title": "Unit fraction 1/b; a/b as a copies of 1/b; specify the whole",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: interpret 1/b as one part when a whole is split into b equal parts; read 3/4 as three 1/4s; explain that a fraction is meaningless without a specified whole",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.fractions.equal-shares"
      ],
      "helps": [
        "thinking.metacog.spot-the-trap"
      ],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2B ch11",
          "note": "Fractions (unit fractions)",
          "record": true
        },
        {
          "type": "packet",
          "ref": "fractions-2026-07-12",
          "note": "parts 4-5: counting pieces (numerator) \u2192 fraction of a set"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch7 \u00a77A Unit Fractions / \u00a77B More Fractions"
        },
        {
          "type": "beast",
          "ref": "BA 3D ch10 Fractions"
        },
        {
          "type": "gumball",
          "ref": "generator:fraction_identify"
        }
      ],
      "sources": [
        "CC 3.NF.1",
        "research/math-spine.md \u00a77"
      ],
      "notes": "Unit fractions are THE building block (K4 p.7), like 1 for whole numbers. Specify-the-whole is first-class: the same shaded region is 2/3 or 1/3 depending which square is the whole. No need for 'proper'/'improper' yet. Gr3 denominators limited to 2,3,4,6,8.",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "Connect the picture to the notation: the bottom number (denominator) = how many equal parts the whole was cut into; the top (numerator) = how many you counted. Write 3/4 next to its shaded bar and read it 'three one-fourths', not 'three out of four'. Stress that 3/4 is meaningless until you say '3/4 OF WHAT'.",
          "check": "Write the fraction for three shaded parts when the whole is cut into four. What does the bottom 4 tell you?"
        },
        "G": {
          "move": "Draw a bar split into b equal parts, shade exactly one part, and label it 1/b \u2014 the unit fraction. Then shade a copies of that one part and count them out loud ('1/4, 2/4, 3/4') so a/b reads as a copies of 1/b. Draw the SAME shaded region inside a small square and inside a big square to show it's 1/2 of one and 1/4 of the other \u2014 the whole must be named.",
          "check": "This bar has 4 equal parts and 3 are shaded. Say it as counting one-fourths \u2014 how many one-fourths are shaded?"
        },
        "C": {
          "move": "Give her fraction tiles/circles: pull ONE 1/4 tile out of the four that tile the whole \u2014 that single piece is the unit fraction 1/4. Then physically lay 3 of the 1/4 tiles side by side to build 3/4, saying 'three one-fourths'. Swap the whole (a small circle vs a big circle) with the same tiles to show 1/4 depends on which whole you started from.",
          "check": "Grab one-fourth of this whole with the tiles. Now build three-fourths \u2014 how many of the same piece did you use?",
          "down": "math.fractions.equal-shares"
        },
        "N": {
          "move": "Chocolate-bar sharing: a bar scored into 6 squares \u2014 one square is 1/6 of the bar, and if you eat 4 squares you ate 4 of those one-sixths = 4/6. Then trick her: '1/2 of my little candy bar vs 1/2 of the giant one \u2014 same amount?' The 'of what' question is the point.",
          "check": "I ate 3 squares of a chocolate bar that has 8 equal squares. What fraction of the bar did I eat \u2014 and one-eighth of WHAT?"
        }
      }
    },
    {
      "id": "math.geometry.array-rows-columns",
      "domain": "math",
      "strand": "geometry",
      "title": "Partition a rectangle into equal rows & columns of unit squares; count them",
      "tier": "L3",
      "band": [
        7,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: partition a rectangle into rows and columns of same-size squares and count them without double-counting or losing count; see a rectangle as rows-and-columns",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.geometry.compose-decompose-shapes"
      ],
      "helps": [],
      "resources": [
        {
          "type": "beast",
          "ref": "BA 3A ch3 Area and Perimeter"
        },
        {
          "type": "activity",
          "ref": "grid/graph-paper rectangle rows-and-columns count"
        }
      ],
      "sources": [
        "CC 2.G.2",
        "research/math-spine.md \u00a79"
      ],
      "notes": "HUB NODE \u2014 spatial structuring feeds multiplication arrays (D), area (measure), and partition-equal-area (geometry/fractions). 'More learning than is sometimes assumed'; at low levels kids double-count or lose count (K5 p.4-5,11). BA defers 2.G.2 to L3A ch3 (\u00a75.B).",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "On graph/grid paper, draw a rectangle on the lines and have her mark the equal rows and columns of unit squares, then count them systematically (skip-count by the row length, or count row-by-row) rather than one-at-a-time. Highlight one row and one column so 'rows AND columns' is visible \u2014 this is the structure that becomes area and multiplication arrays.",
          "check": "This grid rectangle is 3 rows of 4 squares. Count the squares without counting any twice \u2014 how many, and how could you count faster than by ones?"
        },
        "C": {
          "move": "Tile a rectangle with same-size square tiles/cubes with NO gaps or overlaps, filling it completely; then count the tiles by touching each once. Build it row by row so she sees equal rows and equal columns. Snap unit-cube rows together so the rectangle is literally rows of columns \u2014 the hands-on antidote to double-counting or losing count.",
          "check": "Fill this rectangle with the square tiles \u2014 no gaps, no overlaps. How many tiles fit? Count them by rows so you don't count one twice.",
          "down": "math.geometry.compose-decompose-shapes"
        },
        "N": {
          "move": "Real arrays: a muffin tin (rows and columns of cups), an egg carton, floor tiles, a chocolate bar's grid of squares, window panes. 'How many muffins fit \u2014 count the rows.' The everyday grid makes rows\u00d7columns concrete before it's a formula.",
          "check": "This muffin tin has 2 rows and 6 cups in each row. How many muffins fit? How did you count them?"
        }
      }
    },
    {
      "id": "math.geometry.compose-decompose-shapes",
      "domain": "math",
      "strand": "geometry",
      "title": "Compare shapes by informal parts; build, compose & decompose shapes",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: compare shapes by informal parts (sides, vertices, corners); model shapes from components (sticks/clay); compose simple shapes into a larger shape and decompose a composite; use a composite as a unit",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.geometry.name-shapes-visual"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch8",
          "note": "Shapes (compose/decompose)",
          "record": true
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch9 \u00a79B Partition 2-D Shapes"
        },
        {
          "type": "activity",
          "ref": "pattern blocks / tangrams: compose and take apart"
        }
      ],
      "sources": [
        "CC K.G.4",
        "CC K.G.5",
        "CC K.G.6",
        "CC 1.G.2",
        "research/math-spine.md \u00a79"
      ],
      "notes": "Compose \u2192 decompose \u2192 spatial-structuring is a real prereq chain (K5 p.4-5). Feeds array-rows-columns (the multiplication/area hub) and equal-shares (fractions).",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "Draw a composite figure and have her draw the cut-lines that break it into shapes she knows (a 'house' pentagon = a square + a triangle); and go the other way \u2014 show puzzle pieces and have her sketch the whole they'd compose into. Compare two shapes by their informal parts: 'this one has more corners / more sides.'",
          "check": "Draw a line to split this house-shape into a square and a triangle. Which of these two shapes has more corners?"
        },
        "C": {
          "move": "Pattern blocks and tangrams: put two triangles together to make a square or a rhombus; fill a hexagon outline with triangles and trapezoids; then take a composite apart. Build shapes from components too \u2014 toothpicks/sticks and clay balls for corners, so she feels sides and vertices as she counts them. Use a composite (two triangles = a square) as a single unit to make a bigger shape.",
          "check": "Make a bigger triangle out of these smaller triangles \u2014 how many did it take? Now take the square apart into two triangles. Can you build a rectangle the same way?",
          "down": "math.geometry.name-shapes-visual"
        },
        "N": {
          "move": "Real composing/decomposing: cutting a sandwich into two triangles then rearranging them; building a fort or a block tower where a big wall is made of smaller blocks used as a unit; a quilt/tile floor where small shapes tile a bigger pattern. Name the parts and the whole as she builds.",
          "check": "You cut your square sandwich corner to corner \u2014 what two shapes did you make? If you push them back together, what shape do you get?"
        }
      }
    },
    {
      "id": "math.geometry.coordinate-plane",
      "domain": "math",
      "strand": "geometry",
      "title": "Coordinate plane: plot ordered pairs (four quadrants); reflect across axes; distance along an axis",
      "tier": "L3",
      "band": [
        9,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: plot & name ordered pairs in all four quadrants, map a point's quadrant from its signs, reflect a point across an axis (sign change), and find the distance between two points sharing a coordinate as |difference|",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.geometry.lines-angles",
        "math.integers.negatives-number-line",
        "math.placevalue.big-numbers-round"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a711.1 (measuring segments, part)",
          "record": true
        }
      ],
      "sources": [
        "CC 5.G.1",
        "CC 5.G.2",
        "CC 6.NS.6b",
        "CC 6.NS.6c",
        "CC 6.NS.8",
        "CC 6.G.3",
        "research/prealgebra-extension.md \u00a74F (G1)"
      ],
      "notes": "The AoPS-surfaced coordinate node. Deliberately SPANS grade-5 (Q1 only, 5.G.1\u20132) and grade-6 (all four quadrants via negatives, 6.NS.6b; distance between points sharing a coordinate = |difference|, 6.NS.8). ONE node, harder items (negative quadrants, distance) gate L3 \u2014 do NOT split per-quadrant (granularity rule). requires the integers node (negatives-number-line) for quadrants II\u2013IV \u2014 the load-bearing cross-strand edge \u2014 and lines-angles (axes = perpendicular lines). Misconception: (x,y) order reversed ('over then up'); sign\u2192quadrant mapping; counting grid LINES vs SPACES for distance.",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "plot on grid paper; read a point's quadrant from the sign pattern of (x,y); reflect across an axis by flipping one coordinate's sign",
          "check": "plot (4,\u22123) and its reflection across the x-axis \u2014 what changed?"
        },
        "C": {
          "move": "walk a floor/tape grid: from the origin, step right/left for x then up/down for y; standing on a spot names its ordered pair",
          "check": "walk to (\u22123, 2) \u2014 which way for the \u22123, which for the 2?"
        },
        "N": {
          "move": "a map or game grid with an origin \u2014 coordinates locate a treasure, a chess-like square, a city on a plan",
          "check": "the treasure is 3 east and 2 south of camp \u2014 write it as an ordered pair"
        }
      }
    },
    {
      "id": "math.geometry.defining-attributes",
      "domain": "math",
      "strand": "geometry",
      "title": "Defining vs non-defining attributes; name/draw shapes by attributes; ID quadrilaterals",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: distinguish defining attributes (sides, closed, angles) from non-defining (color, size, orientation); name & draw a shape given attributes (# sides/angles); identify triangles, quadrilaterals, pentagons, hexagons, cubes",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.geometry.compose-decompose-shapes"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2B ch15",
          "note": "Shapes (attributes)",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA 3A ch1 Shapes"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch9 Shapes"
        }
      ],
      "sources": [
        "CC 1.G.1",
        "CC 2.G.1",
        "research/math-spine.md \u00a79"
      ],
      "notes": "van Hiele Level 1 (Descriptive). Directly targets the orientation-as-non-defining misconception ('doesn't matter which way it's turned', K5 p.8). BA defers Gr2 geometry to L3A (\u00a75.B) \u2014 BA 3A ch1 is a DEEP resource (triangles, quadrilaterals, polyominoes).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Attach category names to side/angle counts: 3 sides = triangle, 4 = quadrilateral, 5 = pentagon, 6 = hexagon. Write the defining attributes ('closed, 4 straight sides') as the shape's 'rule', and label the non-defining ones (color, size, orientation) as things that DON'T decide the name.",
          "check": "A shape has 4 straight sides and is closed. What family is it in? Is 'it's blue' a reason it's a quadrilateral?"
        },
        "G": {
          "move": "Give a 'What makes it a ___?' contrast: two triangles (one fat, one skinny, one rotated) all count because all have 3 straight sides + closed; a color/size difference does NOT. Then dictate attributes and have her DRAW the shape ('draw a closed shape with 4 sides'). Name triangles/quadrilaterals/pentagons/hexagons by counting sides on the diagram.",
          "check": "Circle every shape that is a triangle. Why do the skinny one AND the fat one both count? Draw a shape with exactly 6 sides \u2014 what's it called?"
        },
        "C": {
          "move": "Sort-and-say with blocks: give her a mixed pile and a rule card ('4 straight sides, closed') \u2014 she pulls every shape that fits, ignoring color and size. Use a geoboard/rubber bands or sticks to BUILD a shape to a spec ('make a shape with 3 sides and 3 corners'). Physically rotate a built triangle to prove turning it doesn't change what it is (orientation is non-defining).",
          "check": "Pull out every shape that has exactly 4 straight sides \u2014 does the color matter? Does it matter which way it's turned? Build me a shape with 5 sides.",
          "down": "math.geometry.compose-decompose-shapes"
        }
      }
    },
    {
      "id": "math.geometry.lines-angles",
      "domain": "math",
      "strand": "geometry",
      "title": "Points, lines, rays, angles (right/acute/obtuse); parallel & perpendicular; symmetry",
      "tier": "L3",
      "band": [
        8,
        10
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: draw/identify points, lines, rays, angles (right/acute/obtuse) and \u22a5 / \u2225 lines; classify 2-D figures by parallel/perpendicular lines & angle size (incl. right triangles); recognize & draw lines of symmetry",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.geometry.defining-attributes"
      ],
      "helps": [],
      "resources": [
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch10 \u00a710A Angles and Shapes"
        },
        {
          "type": "singapore",
          "ref": "PMUS 3B u8 Geometry (Angles, Right Angles)"
        },
        {
          "type": "beast",
          "ref": "BA 3A ch1 Shapes"
        }
      ],
      "sources": [
        "CC 4.G.1",
        "CC 4.G.2",
        "CC 4.G.3",
        "research/math-spine.md \u00a79"
      ],
      "notes": "van Hiele Level 1\u21922. Prereq for angle-measure (measure strand). Merges 4.G.1/4.G.2/4.G.3 (lines/angles, classification, symmetry) into one node \u2014 one MA-module-sized cluster.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Introduce the notation and vocabulary that names the pictures: point, line, ray, angle; right/acute/obtuse; parallel (\u2225) and perpendicular (\u22a5). Match each symbol/term to the drawn figure so the words are grounded (a ray has one endpoint and goes on forever; \u22a5 means a square-corner crossing). Classify figures in words by angle and line properties.",
          "check": "Which symbol means 'perpendicular'? What do you call an angle bigger than a right angle? Is a right angle the same as, bigger than, or smaller than an acute angle?"
        },
        "G": {
          "move": "Draw and label points, lines, rays, and angles; sort drawn angles into right / acute / obtuse using a right-angle corner as the referent. Mark parallel lines (arrows) and perpendicular lines (the small square). Classify 2-D figures by their angles/parallel sides (e.g. a right triangle has one right angle). Draw the line(s) of symmetry on a figure.",
          "check": "Label the right, acute, and obtuse angle in this row. Draw a line of symmetry on this butterfly shape. Which of these figures has a pair of parallel sides?"
        },
        "C": {
          "move": "Build angles with two sticks/pencils or a bendy straw hinged at a point \u2014 open them to a square corner (right angle), narrower (acute), wider (obtuse); check 'square corner' against the corner of an index card. Use straws or road-lines to lay out parallel (never meet) vs perpendicular (meet at a square corner) lines. Fold a paper shape to find its line of symmetry (the halves match when folded).",
          "check": "Open the sticks to make a right angle \u2014 check it with the card corner. Now make an angle that's smaller than a right angle. Fold this shape so the two halves match exactly \u2014 where's the fold line?",
          "down": "math.geometry.defining-attributes"
        }
      }
    },
    {
      "id": "math.geometry.name-shapes-visual",
      "domain": "math",
      "strand": "geometry",
      "title": "Name 2-D/3-D shapes regardless of orientation/size; 2-D vs 3-D",
      "tier": "L3",
      "band": [
        4,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: name 2-D and 3-D shapes correctly regardless of orientation, size, or non-prototypical variant (skinny/rotated); identify shapes as flat (2-D) vs solid (3-D)",
        "L3": "SM-2 spaced gate on mixed variants across separate days"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math KA ch4",
          "note": "Shapes and Solids",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch8",
          "note": "Shapes"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch9 \u00a79A 2-D and 3-D Shapes"
        },
        {
          "type": "activity",
          "ref": "shape hunt with rotated/skinny/scaled variants"
        }
      ],
      "sources": [
        "CC K.G.1",
        "CC K.G.2",
        "CC K.G.3",
        "research/math-spine.md \u00a79"
      ],
      "notes": "van Hiele Level 0 (Visual/syncretic). Concept-image error: kids reject a 'very skinny' isosceles triangle and accept a difficult distractor (K5 p.6). REMEDY: vary examples widely, include non-prototypical variants. Orientation is a NON-defining attribute (K5 p.8).",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "Show shapes in many orientations and sizes on paper and have her name each; mix in a hard distractor (a shape that looks triangle-ish but isn't closed, or has a curved side). Rotate the same square to sit on a corner ('diamond') and ask if it's still a square \u2014 orientation is a NON-defining attribute.",
          "check": "Name each of these shapes. Two of them are turned sideways \u2014 does turning a shape change what it's called?"
        },
        "C": {
          "move": "Sort a bin of real objects and blocks into 2-D-vs-3-D piles (a paper triangle vs a wooden pyramid, a circle vs a ball), then a shape hunt around the house naming what she finds. Crucially, hand her NON-prototypical variants \u2014 a very skinny/long triangle, a rotated square (diamond), an oversized circle \u2014 so she names by shape, not by the 'typical' picture (the concept-image error: kids reject a skinny triangle).",
          "check": "Sort these into flat shapes and solid shapes. Now \u2014 is this skinny pointy one still a triangle? What makes it a triangle even though it's not the fat kind?"
        },
        "N": {
          "move": "Point out shapes in the real world: 'that clock is a circle, the window is a rectangle, the roof is a triangle, the ball is a sphere, the cereal box is a rectangular prism (3-D).' A walk or a picture book becomes a naming game \u2014 and note when a real shape is skinny or tilted so the everyday example fights the prototype.",
          "check": "Look around the room \u2014 find me something shaped like a circle and something shaped like a triangle. Is the tall skinny door a rectangle even though it's not square-ish?"
        }
      }
    },
    {
      "id": "math.geometry.partition-equal-area",
      "domain": "math",
      "strand": "geometry",
      "title": "Partition shapes into equal areas; each part = unit fraction of the whole",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: partition a shape into equal areas and express each part as a unit fraction of the whole (e.g. one part of a rectangle split into 4 = 1/4 the area)",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.geometry.array-rows-columns",
        "math.fractions.unit-fraction-meaning"
      ],
      "helps": [],
      "resources": [
        {
          "type": "packet",
          "ref": "fractions-2026-07-12",
          "note": "reinforces area-as-fraction (part 1 fair shares)"
        },
        {
          "type": "beast",
          "ref": "BA 3D ch10 Fractions"
        }
      ],
      "sources": [
        "CC 3.G.2",
        "research/math-spine.md \u00a79"
      ],
      "notes": "Bridges geometry and fractions: area partitioning = the geometric model of unit fractions. BA folds this into L3D ch10 Fractions (\u00a75.B, 2.G.A.3 \u2192 BA 3D).",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "Connect the picture to the unit-fraction symbol: an equal-area part of a shape split into b parts = 1/b of the whole; write 1/4 under the shaded region of a fourths-partition. Tie it back to the fraction strand's notation (denominator = number of equal parts of the whole).",
          "check": "Write the fraction that names one part when a shape is cut into 4 equal-area parts. If it were cut into 6 equal parts, what fraction is one part?"
        },
        "G": {
          "move": "Draw a shape and partition it into equal-area parts (using the grid/array structure), shade one part, and label it as a unit fraction of the whole: a rectangle split into 4 equal parts \u2192 each is 1/4 the area. Show TWO different partitions of the same square into fourths (four strips vs four squares) \u2014 different shapes, same 1/4 area (the equal-area-not-equal-shape idea).",
          "check": "This rectangle is split into 4 equal parts. What fraction of its area is one part? Here's a different way to cut it into fourths \u2014 is each part still 1/4?"
        },
        "C": {
          "move": "Fold a paper rectangle into equal parts (halves, then fourths) and shade one part \u2014 that shaded part is 1/4 of the whole area. Cut it apart and stack the pieces to prove all four are the same amount of paper (equal AREA, even if you fold them into differently-shaped pieces). Bridges the fraction fold-work to the geometric whole.",
          "check": "Fold this rectangle into 4 equal parts and shade one. What fraction of the whole rectangle is shaded? Are all four parts the same amount of paper?",
          "down": "math.geometry.array-rows-columns"
        }
      }
    },
    {
      "id": "math.geometry.quadrilateral-categories",
      "domain": "math",
      "strand": "geometry",
      "title": "Shapes share attributes \u2192 larger categories (quadrilateral hierarchy, intro)",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: recognize that shapes sharing attributes form larger categories (rhombus/rectangle/square are all quadrilaterals); sort shapes into categories by shared attributes",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.geometry.defining-attributes"
      ],
      "helps": [],
      "resources": [
        {
          "type": "beast",
          "ref": "BA 3A ch1 Shapes"
        }
      ],
      "sources": [
        "CC 3.G.1",
        "research/math-spine.md \u00a79"
      ],
      "notes": "Gr3 = 'shares attributes \u2192 larger category' ONLY; keep the full Venn/hierarchy (all squares are rectangles) OUT of the Gr3-4 band \u2014 kids resist it via visual prototype (K5 p.13,16). TRAPEZOID definition conflict (K5 p.3): prefer the INCLUSIVE definition ('at least one pair of parallel sides') per the progression's own diagrams; flag if a resource uses exclusive \u2014 don't mark 'a parallelogram is a trapezoid' wrong. Flagged for adjudication.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Name the shared-attribute categories in words: quadrilateral = any closed shape with 4 straight sides; a square, rectangle, and rhombus are all KINDS of quadrilateral because they share that attribute. Write the category above its members. (Hold the nested 'a square is also a rectangle' statement out of scope at this band.)",
          "check": "What do we call the whole family of shapes with 4 straight sides? Name two different shapes that both belong to that family."
        },
        "G": {
          "move": "Draw a set of varied four-sided shapes and have her circle 'all the quadrilaterals' (everything with 4 straight sides), showing that rhombus/rectangle/square all qualify by the shared attribute. Keep it to 'shares attributes \u2192 same category' \u2014 do NOT push the full 'all squares are rectangles' hierarchy yet (Gr3-4 kids resist it via the visual prototype). Use the INCLUSIVE trapezoid (at least one pair of parallel sides).",
          "check": "Circle every shape here that is a quadrilateral. Is the square in the same family as the long rectangle? What attribute do they share?"
        },
        "C": {
          "move": "Physically sort a pile of cut-out quadrilaterals (squares, rectangles, rhombi, trapezoids, general 4-sided shapes) into a 'quadrilateral' hoop because they all share '4 straight sides' \u2014 then sub-sort by extra attributes (right angles, all sides equal). Handling the shapes and grouping by SHARED attributes builds the 'these belong to a bigger family' idea (Gr3 level, not the full hierarchy yet).",
          "check": "Put all the shapes with 4 straight sides in this hoop. What do a square, a rectangle, and this slanted shape all have in common that makes them one family?",
          "down": "math.geometry.defining-attributes"
        }
      }
    },
    {
      "id": "math.integers.compare-order-rationals",
      "domain": "math",
      "strand": "integers",
      "title": "Compare & order rational numbers (negatives, fractions, decimals) on the number line",
      "tier": "L3",
      "band": [
        10,
        12
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: order a mixed set of negatives, fractions and decimals on a number line; read \u22123 > \u22127 as 'right of on the line'; interpret absolute value in a debt/balance context",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.integers.negatives-number-line",
        "math.fractions.decimal-notation"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a71.4 Negation",
          "record": true
        }
      ],
      "sources": [
        "CC 6.NS.7a",
        "CC 6.NS.7b",
        "CC 6.NS.7d",
        "research/prealgebra-extension.md \u00a74B (I2)"
      ],
      "notes": "6.NS.7a: interpret \u22123 > \u22127 as '\u22123 is right of \u22127 on the line'; 6.NS.7c\u2013d: absolute value in real-world debt contexts (a balance of \u221230 is a debt of 30; 'less than \u221230' = a bigger debt). requires decimal-notation so a mixed negative-fraction / negative-decimal set can share a representation. Misconception: conflating 'farther from zero' with 'greater'; comparing a negative fraction and a negative decimal without converting to a common form.",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "plot the whole mixed set on one number line; leftmost = least; convert fractions/decimals to a common form to place them precisely",
          "check": "order \u22121.5, \u22123/4, 0.2, \u22122 on the line"
        },
        "N": {
          "move": "rank bank balances or temperatures \u2014 a \u2212$50 balance is 'less' (worse) than \u2212$20 even though 50 > 20",
          "check": "who is worse off: someone at \u2212$50 or someone at \u2212$20? which number is smaller?"
        }
      }
    },
    {
      "id": "math.integers.integer-add-subtract",
      "domain": "math",
      "strand": "integers",
      "title": "Add & subtract integers (and rationals): number-line hops, zero pairs, subtract = add the opposite",
      "tier": "L3",
      "band": [
        10,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: add and subtract integers using number-line hops and zero pairs; rewrite subtraction as adding the opposite (p \u2212 q = p + (\u2212q)); give the distance between two numbers as |difference|",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.integers.compare-order-rationals"
      ],
      "helps": [
        "math.algebra.one-step-equations"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a71.4 Negation / \u00a71.5 Subtraction",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-4 Integers (adding & subtracting)"
        }
      ],
      "sources": [
        "CC 7.NS.1",
        "research/prealgebra-extension.md \u00a74B (I3)"
      ],
      "notes": "7.NS.1 (all of a\u2013d): p+q as a distance |q| from p in the +/\u2212 direction; opposites sum to 0 (additive inverses); subtraction of rationals = adding the additive inverse (p \u2212 q = p + (\u2212q)); distance between two numbers = |difference|. THE canonical error: '\u22125 \u2212 3 = \u22122' (treating the magnitude as shrinking); '\u22125 \u2212 (\u22123)' sign-of-sign confusion; 'two minuses make a plus' over-applied to addition.",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "on the number line, start at p, then hop |q| RIGHT for +q or LEFT for \u2212q; rewrite any subtraction as add-the-opposite before hopping",
          "check": "walk \u22122 \u2212 4 on the line by first rewriting it as \u22122 + (\u22124)"
        },
        "C": {
          "move": "with two-color counters, adding is combining piles and removing zero pairs; subtracting is 'take away' \u2014 if you can't take away, add zero pairs first to make the removal possible",
          "check": "model \u22125 \u2212 (\u22123) with counters \u2014 what do you take away?"
        },
        "N": {
          "move": "track a temperature that rises and falls, or a balance with deposits and withdrawals \u2014 a withdrawal from a debt deepens it",
          "check": "you owe $5, then spend $3 more \u2014 what's your balance?"
        }
      }
    },
    {
      "id": "math.integers.integer-four-ops",
      "domain": "math",
      "strand": "integers",
      "title": "Multiply & divide integers; fluent four-operation signed arithmetic",
      "tier": "L4",
      "band": [
        10,
        13
      ],
      "fluency_aim": {
        "metric": "problems_per_min_oral",
        "target": 30,
        "sustain": "2 of 3 separate days, \u22642 errors/min",
        "source": "research/fluency-aims.md \u00a7integer-facts (UNGROUNDED \u2014 section not yet authored)"
      },
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: multiply and divide integers with correct signs, explain (\u22121)(\u22121)=1 via the distributive property, and apply \u2212(p/q) = (\u2212p)/q = p/(\u2212q)",
        "L3": "SM-2 spaced gate on mixed signed +/\u2212/\u00d7/\u00f7 items across separate days OR parent-observed spaced re-check after a gap of days (understanding gate \u2014 fires BEFORE the L4 rate gate)",
        "L4": "oral 1-minute timing on mixed signed +/\u2212/\u00d7/\u00f7 single-digit items; rate per fluency_aim (UNGROUNDED \u2014 pending research/fluency-aims.md \u00a7integer-facts); \u22642 errors; 2 of 3 separate days"
      },
      "requires": [
        "math.integers.integer-add-subtract",
        "math.multdiv.mult-div-facts-memory-100"
      ],
      "helps": [
        "math.algebra.two-step-equations"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a71.3 Multiplication / \u00a71.4 Negation",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-4 Integers"
        }
      ],
      "sources": [
        "CC 7.NS.2",
        "CC 7.NS.3",
        "research/prealgebra-extension.md \u00a73",
        "research/prealgebra-extension.md \u00a74B (I4)"
      ],
      "notes": "UNGROUNDED: fluency_aim target is a directional prior \u2014 no research/fluency-aims.md \u00a7integer-facts section exists yet; needs grounding before use. The pedagogically-motivated L4 of \u00a73 (not CC-'fluently' but the same automaticity logic \u2014 signed-arithmetic automaticity frees WM for equation-solving, DESIGN.md \u00a71). 7.NS.2a: multiplication extends to rationals preserving distributivity \u2192 (\u22121)(\u22121)=1 and the sign rules; 7.NS.2b: integer division (nonzero divisor), \u2212(p/q) = (\u2212p)/q = p/(\u2212q). fluency_aim is UNGROUNDED: research/fluency-aims.md has no \u00a7integer-facts rate yet \u2014 build-signal, NOT a guessed rate. Directional prior (to validate, NOT authored as fact): ~30\u201340/min oral (near the mult-facts band). L4 gate fires only AFTER the L3 understanding gate. Misconception: '\u22123 \u00d7 \u22124 = \u221212' (sign rule half-applied); mishandling division signs; forgetting 0/n = 0 but n/0 is undefined.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "chant the sign rule (same signs \u2192 +, different signs \u2192 \u2212) then compute the magnitude; check division against multiplication",
          "check": "compute \u221224 \u00f7 4 and \u221224 \u00f7 \u22126"
        },
        "C": {
          "move": "multiply as repeated groups of counters: 3 \u00d7 (\u22122) is three groups of two red; negative \u00d7 is 'remove that many groups' \u2014 removing red counters leaves yellow, so \u2212\u00d7\u2212 is +",
          "check": "why does \u22123 \u00d7 \u22122 come out positive? model it"
        },
        "N": {
          "move": "repeated debt (\u2212$2 four times = \u2212$8); 'undoing' repeated debt reverses the sign \u2014 the ledger interpretation of the sign rules",
          "check": "losing $2 per day for 3 days changes your balance by how much?"
        }
      }
    },
    {
      "id": "math.integers.negatives-number-line",
      "domain": "math",
      "strand": "integers",
      "title": "Negative numbers in context; the two-way number line; opposites & absolute value",
      "tier": "L3",
      "band": [
        9,
        12
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: place negatives on a two-way number line, name a number's opposite, interpret negatives in context (temperature, credit/debt, elevation), and give the absolute value as distance from 0",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.placevalue.big-numbers-round"
      ],
      "helps": [
        "math.measure.length-ruler"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a71.4 Negation",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-4 Integers"
        }
      ],
      "sources": [
        "CC 6.NS.5",
        "CC 6.NS.6a",
        "CC 6.NS.6c",
        "CC 6.NS.7",
        "research/prealgebra-extension.md \u00a74B (I1)"
      ],
      "notes": "6.NS.5: pos/neg describe opposite directions (temp above/below 0, credits/debts). 6.NS.7c: absolute value = distance from 0. requires big-numbers-round (whole-number number line + place value); the number line = a two-way ruler (helps from length-ruler). Misconception: '\u22128 > \u22123 because 8 > 3' (ordering flips for negatives, 6.NS.7a); |\u22125| read mechanically as 'make it positive' instead of 'distance'; confusing '\u2212' as an operation vs a sign.",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "extend the number line left of 0; mark a number and its opposite as equal hops on either side; |n| is the length of the hop",
          "check": "on the line, why are \u22125 and 5 the same distance from 0?"
        },
        "C": {
          "move": "use two-color counters (yellow = +1, red = \u22121); a yellow-red pair is a 'zero pair' worth 0 \u2014 build 3 and \u22123 as opposites",
          "check": "show me \u22124 and its opposite with counters"
        },
        "N": {
          "move": "read a thermometer below zero, a bank balance in the red, or floors below ground \u2014 negatives are directions from a chosen zero",
          "check": "the temperature is \u22127\u00b0F and rises to \u22122\u00b0F \u2014 did it get warmer or colder?"
        }
      }
    },
    {
      "id": "math.measure.angle-measure",
      "domain": "math",
      "strand": "measure",
      "title": "Angle as turn (1\u00b0 = 1/360); measure with a protractor; angles are additive",
      "tier": "L3",
      "band": [
        8,
        10
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: understand an angle as a turn (1\u00b0 = 1/360 of a full turn); measure & draw angles with a protractor; find an unknown angle using additivity",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.geometry.lines-angles"
      ],
      "helps": [
        "math.fractions.unit-fraction-meaning"
      ],
      "resources": [
        {
          "type": "beast",
          "ref": "BA 3A ch1 Shapes"
        }
      ],
      "sources": [
        "CC 4.MD.5",
        "CC 4.MD.6",
        "CC 4.MD.7",
        "research/math-spine.md \u00a78"
      ],
      "notes": "1\u00b0 = 1/360 of a turn ties angle to unit fractions (helps). Additivity: total angle = sum of parts. MA 7.22 splits angle work fine; one node here.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write angle measures in degrees and use ADDITIVITY as arithmetic: if a straight angle (180) is split into 110 and x, then x = 180 - 110 = 70. Connect 1 degree = 1/360 of a full turn to unit fractions of a whole.",
          "check": "Two angles sit together on a straight line. One is 125 degrees. Write the equation for the other and solve it.",
          "down": "math.fractions.unit-fraction-meaning"
        },
        "G": {
          "move": "Draw angles and a protractor overlay so she reads the degree where the arm crosses the scale (watch the two scales \u2014 read from the zero side). Show a full circle marked in degrees so 1 degree = 1/360 of the turn. Draw an angle split into two parts labeled, e.g. 30 and unknown inside a 90, to find the missing part by subtraction.",
          "check": "Read this drawn angle on the protractor. Then: inside a right angle, one part is 35 degrees \u2014 what's the other part?"
        },
        "C": {
          "move": "Make an angle with two rulers (or a clock's hands) hinged at a point and physically OPEN it \u2014 the angle is the amount of TURN, not the length of the arms. Walk a full turn = 360 degrees, a quarter turn = 90. Use a real protractor: line the center on the vertex, the baseline on one arm at zero, and read where the other arm crosses. Cut a straight angle into two pieces and show the pieces ADD to 180.",
          "check": "Open these two rulers to a right angle. About how many degrees? Now open them a little more \u2014 did the angle get bigger even though the rulers are the same length?",
          "down": "math.geometry.lines-angles"
        },
        "N": {
          "move": "Find turns in the real world: how far the clock's minute hand turns in 15 minutes (a quarter turn, 90 degrees), the angle a door opens, a skateboard '180' or '360' being a half and full turn. Angle is how much something rotates.",
          "check": "A skater does a '180'. How many degrees is that? What about a '360' \u2014 where do they end up facing?"
        }
      }
    },
    {
      "id": "math.measure.area-tiling-multiply",
      "domain": "math",
      "strand": "measure",
      "title": "Area as unit-square tiling; relate area to multiplication (length \u00d7 width)",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: find area by counting unit squares tiling a region (no gaps/overlaps); relate area to multiplication (area = length \u00d7 width) and use distributive tiling to break a rectangle apart",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.geometry.array-rows-columns",
        "math.multdiv.mult-div-meaning"
      ],
      "helps": [],
      "resources": [
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch6 \u00a76A-6B Area / Area of Squares and Rectangles"
        },
        {
          "type": "beast",
          "ref": "BA 3A ch3 Area and Perimeter"
        },
        {
          "type": "beast",
          "ref": "BA 3D ch12 Area"
        }
      ],
      "sources": [
        "CC 3.MD.5",
        "CC 3.MD.6",
        "CC 3.MD.7",
        "research/math-spine.md \u00a78"
      ],
      "notes": "Area relies on area-invariant, area-additive, unit-tiling-no-gaps (K4 p.4). Perceiving a region as tiled = spatial structuring (helps from array-rows-columns). Author area-tiling BEFORE any formula node.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write area as a product with square units: 'area = length x width = 6 cm x 4 cm = 24 square cm'. Name that area is always in SQUARE units. Show the distributive break as 4 x (5+2) = 4x5 + 4x2.",
          "check": "A rectangle is 8 cm by 3 cm. Write the area with its unit. What does 'square cm' mean?",
          "down": "math.multdiv.mult-div-meaning"
        },
        "G": {
          "move": "Draw a rectangle on grid paper and shade the unit squares to find area by counting; then label the side lengths and show area = length x width matches the count. Draw a rectangle split into two parts (distributive tiling: a 4x7 as 4x5 + 4x2) to make the multiplication visible.",
          "check": "This drawn rectangle is 5 squares wide and 3 tall. Count the squares, then check with a multiplication. Do they match?"
        },
        "C": {
          "move": "TILE a real rectangle (a book cover, a placemat) with square tiles or pattern-block squares \u2014 no gaps, no overlaps \u2014 and count the squares to get the area. Then arrange the SAME tiles into equal rows and columns (an array) and see that rows x columns gives the same count faster. Physically split a big rectangle into two smaller tiled pieces to show area adds up.",
          "check": "Cover this rectangle with square tiles, no gaps. How many tiles? Now \u2014 without counting one by one \u2014 how many rows and how many in each row?",
          "down": "math.geometry.array-rows-columns"
        },
        "N": {
          "move": "Measure a real area she cares about: how many square tiles cover the bathroom floor, or how much wrapping paper covers a box face, or the area of her bedroom to lay a rug. Area = 'how much surface it takes to cover'.",
          "check": "Your rug is 6 feet by 4 feet. How many square feet of floor does it cover? Show the multiplication."
        }
      }
    },
    {
      "id": "math.measure.compare-order-length",
      "domain": "math",
      "strand": "measure",
      "title": "Compare & order length; indirect comparison (transitivity)",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: describe/compare measurable attributes (longer/shorter, heavier); order 3 objects by length; compare two objects via a third (transitivity)",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math KA ch5",
          "note": "Compare Height, Length, Weight, and Capacity",
          "record": true
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch5 \u00a75C Compare and Order Lengths"
        },
        {
          "type": "activity",
          "ref": "order toys/sticks by length; compare via a string"
        }
      ],
      "sources": [
        "CC K.MD.1",
        "CC K.MD.2",
        "CC 1.MD.1",
        "research/math-spine.md \u00a78"
      ],
      "notes": "Length develops in a FIXED order: direct comparison \u2192 transitivity/indirect \u2192 iterate units \u2192 ruler (K4 p.2-4). Do NOT skip transitivity.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Attach the words to the model: write 'A > B' / 'A is longer than B' beside the flush-ends comparison; write 'A > B and B > C, so A > C' beside the string chain. The symbol just RECORDS what the objects showed.",
          "check": "The blue rod is longer than the red, and the red is longer than the green. Without seeing them, which is longer \u2014 blue or green? Write it with 'longer than'."
        },
        "G": {
          "move": "Draw two bars starting from the same vertical baseline, one longer; ask which is longer just from the picture (no objects). Then draw three bars off a common line for ordering. Draw the transitivity case: bar A next to a string, string next to bar B, and reason A vs B through the string.",
          "check": "Here are three drawn bars starting at the same line. Circle the longest and put 1-2-3 under them from shortest to longest."
        },
        "C": {
          "move": "Lay two pencils side by side with their ends flush at one edge; the one that sticks out farther is longer. Then hand her three sticks and have her physically line them up shortest->longest, re-checking each pair by aligning ends. For transitivity, hide the pencils: cut a piece of string exactly as long as pencil A, then carry the STRING over to pencil B to decide which is longer without the two pencils ever touching.",
          "check": "Show me these three ribbons in order from shortest to longest. Which end do you line up first?",
          "down": "count objects \u2014 she should already track 'more/fewer' before 'longer/shorter'"
        },
        "N": {
          "move": "Use a lived height/length situation: 'You're taller than Cora, and Cora is taller than the teddy \u2014 so are you taller than the teddy?' Or line up the family's shoes by length. Narrate that measuring lets us compare things that can't stand next to each other.",
          "check": "Dad's bike is longer than your bike, and your bike is longer than Cora's trike. Whose is longest? How do you know without lining them all up?"
        }
      }
    },
    {
      "id": "math.measure.data-graphs",
      "domain": "math",
      "strand": "measure",
      "title": "Classify & count categories; picture graphs & bar graphs (single-unit)",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: classify/sort objects into \u22643 categories and count each; read & build a single-unit picture graph and bar graph; answer put-together / take-apart / compare (how-many-more) questions from the graph",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.counting.count-objects-cardinality"
      ],
      "helps": [
        "math.addsub.wp-change-addend-compare",
        "thinking.reasoning.compare-contrast"
      ],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch11",
          "note": "Comparing (picture graphs)",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2B ch14",
          "note": "Graphs (picture & bar)"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch8 Data (Picture/Bar Graphs, Line Plots)"
        },
        {
          "type": "singapore",
          "ref": "PMUS 2B u7 Graphs"
        }
      ],
      "sources": [
        "CC K.MD.3",
        "CC 1.MD.4",
        "CC 2.MD.9",
        "CC 2.MD.10",
        "research/math-spine.md \u00a78"
      ],
      "notes": "NO Beast resource \u2014 BA 'does not include picture or bar graphs' (2.MD.D.9/.10 Not Included, \u00a75.D). Build/buy signal if BA is the daily core: Singapore + ed-packets carry it.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write the counts as a small tally/frequency table beside the graph, then as compare number sentences: 'apples 7, bananas 4, 7 - 4 = 3 more'. The graph is the picture; the number sentence records the comparison it shows.",
          "check": "The graph shows 6 cats and 9 dogs. Write the number sentence for 'how many more dogs than cats'."
        },
        "G": {
          "move": "Draw a single-unit picture graph (one icon = one thing) and a bar graph from the same data, with a clear category axis and count axis. Have her READ values off the bars and answer put-together (total), take-apart, and compare (how-many-MORE) questions directly from the picture.",
          "check": "On this bar graph of favorite fruits, how many more kids chose apples than bananas? How many kids in all?"
        },
        "C": {
          "move": "Sort a real collection (buttons, toy animals, colored blocks) into up to 3 category piles and count each pile. Then BUILD a picture graph physically: line the objects up in neat rows on a grid so each column is one category, one object per cell \u2014 turning the piles into a graph she can see and touch.",
          "check": "Sort these blocks by color into piles and line them up in rows. Which color has the most? How many more than the fewest?",
          "down": "math.counting.count-objects-cardinality"
        },
        "N": {
          "move": "Graph something from her life: survey the family's favorite ice-cream flavors, or count the cars of each color that pass the window for five minutes, then build the bar graph together and answer real questions ('which flavor wins?').",
          "check": "You counted the colors of cars that drove by. Which color was most common, and how many more than the least common?",
          "down": "math.addsub.counting-on"
        }
      }
    },
    {
      "id": "math.measure.elapsed-time",
      "domain": "math",
      "strand": "measure",
      "title": "Time to the minute; elapsed-time / time-interval word problems",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: read time to the minute; find minutes between two times (count up, crossing the hour in hops); compute start + duration = end; handle a.m./p.m. spanning the day",
        "L3": "SM-2 spaced gate across separate days"
      },
      "requires": [
        "math.measure.tell-time-5min",
        "math.addsub.add-sub-fluency-100"
      ],
      "helps": [
        "math.addsub.counting-on",
        "thinking.reasoning.deep-structure-transfer"
      ],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2B ch12",
          "note": "Time (intervals)",
          "record": true
        },
        {
          "type": "packet",
          "ref": "elapsed-time-2026-07-12",
          "note": "full packet: refresher \u2192 minutes between \u2192 crossing the hour \u2192 hours-then-minutes \u2192 start+minutes=end \u2192 AM/PM"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch5 Time"
        },
        {
          "type": "gumball",
          "ref": "generator:elapsed_time"
        }
      ],
      "sources": [
        "CC 3.MD.1",
        "research/math-spine.md \u00a78",
        "research/singapore-beast.md \u00a75.D"
      ],
      "notes": "Elapsed time = clocks + arithmetic; uses count-up (helps counting-on: count-up-change \u2194 elapsed-time is the ed-packet panel's empirical transfer, DESIGN \u00a72). Seed Penelope L0 \u2014 packet built but NOT completed (evidence-inventory).",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "Write the interval as arithmetic: start + duration = end, or end - start = duration, minding that an hour is 60 (not 100) minutes so you regroup at 60. Handle a.m./p.m. spans by noting the crossing of noon or midnight.",
          "check": "A movie starts at 3:50 p.m. and lasts 1 hour 30 minutes. Write the end time. Does it cross into a new hour?",
          "down": "math.addsub.counting-on"
        },
        "G": {
          "move": "Draw an open NUMBER LINE (the elapsed-time packet method): mark the start time, hop to the next whole hour, then hop the remaining minutes to the end, and add the two hops. This makes 'crossing the hour' visible as two clean jumps instead of borrowing across 60.",
          "check": "On the number line, jump from 4:45 to 6:10. Draw the hops and add them up. How long is that?"
        },
        "C": {
          "move": "Use the geared clock to COUNT UP from the start time: set 2:40, then hop the minute hand forward in fives to the next o'clock (2:40 -> 3:00 is 20 min), then continue to the end time, adding the hops. Crossing the hour is a physical stop-and-restart at the 12. Also do it forward: set a start, walk the hands ahead by a duration to find the end.",
          "check": "Set the clock to 2:50. Now move it forward to 3:20 by hopping. How many minutes did you move?",
          "down": "math.measure.tell-time-5min"
        },
        "N": {
          "move": "Use her real intervals: 'Swim practice is 4:15 to 5:00 \u2014 how long is that?' 'We leave at 9:20 and it's a 40-minute drive \u2014 when do we arrive?' Say out loud that count-up change-making (money) and count-up elapsed time are the SAME move \u2014 hop to a friendly landmark, then finish.",
          "check": "Your show starts at 6:40 and it's 25 minutes long. What time does it end? Which way did you count \u2014 up or back?"
        }
      }
    },
    {
      "id": "math.measure.length-ruler",
      "domain": "math",
      "strand": "measure",
      "title": "Measure length with iterated units & a ruler; two-unit inverse; length word problems",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: measure by laying same-size units end-to-end (no gaps); measure with a ruler (in/cm/ft/m) aligning the zero-point; measure the same object in two units (smaller unit \u2192 more units); solve length add/sub word problems; place whole numbers on a number-line diagram",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.measure.compare-order-length"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch10",
          "note": "Length",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch4",
          "note": "Length"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch5 Length"
        },
        {
          "type": "singapore",
          "ref": "PMUS 2A u3 Length"
        },
        {
          "type": "beast",
          "ref": "BA 2C ch7 Measurement"
        }
      ],
      "sources": [
        "CC 1.MD.2",
        "CC 2.MD.1",
        "CC 2.MD.2",
        "CC 2.MD.3",
        "CC 2.MD.4",
        "CC 2.MD.5",
        "CC 2.MD.6",
        "research/math-spine.md \u00a78"
      ],
      "notes": "Four named length understandings, each a misconception (K4 p.3): (1) unit iteration no gaps; (2) accumulation of distance ('eight' = whole span); (3) zero-point alignment (the classic 'start measuring at 1' error); (4) numerals count units-so-far. Inverse-unit relationship (smaller unit \u2192 more units) later powers same-numerator fraction comparison \u2014 helps into fractions.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write the measurement with its UNIT every time: '14 cm', '3 in', never a bare '14'. Turn a two-part measure into a length number sentence for word problems: '12 cm + 9 cm = 21 cm'. Name that the unit is part of the answer.",
          "check": "The ribbon is 8 cm and you cut off 3 cm. Write the number sentence and the answer WITH the unit."
        },
        "G": {
          "move": "Show a drawn ruler under an object with the classic trap: the object starts at the '1' mark. Ask what's wrong, then redraw it aligned at zero. Use a number-line diagram: place whole numbers as tick marks and read a length as the distance from 0 to the end, so 'eight' means the whole span, not just the last tick.",
          "check": "This drawing shows a crayon starting at the 1 on the ruler and ending at 7. The child said '7 cm'. Is that right? What's the real length?"
        },
        "C": {
          "move": "First iterate a UNIT: measure the table with same-size paperclips laid end-to-end, no gaps and no overlaps, and count them. Then hand her a real ruler and measure the same object \u2014 critically, START AT THE ZERO mark, not the '1', pointing out that the ruler's numbers count units-so-far. Measure one object twice: once in cm, once in a bigger unit, and notice the smaller unit gives MORE units.",
          "check": "Measure this book with the ruler. Where does the ruler have to line up before you read the number? (Show me.)",
          "down": "math.measure.compare-order-length"
        },
        "N": {
          "move": "Measure real things she cares about: how tall she's grown against the doorframe, how long her bed is, whether the couch fits a wall. Frame a word problem from a real cut: 'The tape is 15 cm; you use 6 cm for a bracelet \u2014 how much tape is left?'",
          "check": "Your bookshelf is 90 cm wide and the wall is 120 cm. Will it fit? How much room is left over?"
        }
      }
    },
    {
      "id": "math.measure.mass-liquid-volume",
      "domain": "math",
      "strand": "measure",
      "title": "Mass (grams/kilograms) & liquid volume (liters/milliliters): measure, estimate, one-step problems",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: measure & estimate mass in grams/kilograms and liquid volume in liters/milliliters using a scale / graduated container; read the scale; solve one-step +/\u2212/\u00d7/\u00f7 word problems involving masses or volumes given in the same units",
        "L3": "SM-2 spaced gate on mixed mass & volume items across separate days"
      },
      "requires": [
        "math.measure.length-ruler",
        "math.addsub.add-sub-fluency-100"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch5",
          "note": "Weight (grams/kilograms)",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2B ch13",
          "note": "Capacity (liquid volume)"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch8 Mass and Liquid Volume"
        },
        {
          "type": "beast",
          "ref": "BA 3B ch8 Mass and Liquid Volume"
        },
        {
          "type": "beast",
          "ref": "BA 3C ch9 Measurement"
        },
        {
          "type": "activity",
          "ref": "weigh fruit on a kitchen scale; fill a measuring jug to a target mL"
        }
      ],
      "sources": [
        "CC 3.MD.2",
        "research/math-spine.md \u00a78",
        "research/dimensions-math.md \u00a72",
        "research/singapore-beast.md \u00a75.D"
      ],
      "notes": "MISSING-NODE ADD (adj #7). CC 3.MD.2: measure & estimate liquid volumes and masses of objects using g/kg/l; add/subtract/multiply/divide to solve ONE-STEP word problems involving masses or volumes given in the same units (excludes multiplicative comparison). Requires scaled-instrument measurement (length-ruler: reading a scale, unit iteration, zero-point) + add-sub-fluency-100 (one-step problem arithmetic). Slotted in the measure length/quantity cluster before Time. Resources verified: Dimensions 2A ch5 Weight + 2B ch13 Capacity (dimensions-math.md \u00a72), Singapore PM2022 G3 ch8, Beast 3B ch8 / 3C ch9 (singapore-beast.md \u00a75.D). No gumball generator exists for mass/volume -> instrument_gap (adj #6).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write quantities with correct units (g, kg, mL, L) and solve one-step word problems with a number sentence: '2 L - 750 mL' or '3 bags x 250 g'. Keep units on the answer; note that mixing L and mL needs the same unit first.",
          "check": "A bottle holds 1 L and you drink 350 mL. Write the number sentence for how much is left."
        },
        "G": {
          "move": "Draw a scale dial or a jug with tick marks and have her read the value where the needle/water sits \u2014 reinforcing zero-point and reading the scale (same skill as the ruler). Draw a mass bar or jug for a one-step problem: '450 g of apples + 300 g of pears' shown as two segments.",
          "check": "This drawn jug is filled to a line halfway between 400 and 600 mL. How much water is in it?"
        },
        "C": {
          "move": "Put fruit on a real kitchen scale and read the grams; feel that a bag of flour is about 1 kg. Fill a graduated measuring jug to a target line (e.g. 250 mL) and pour, reading the scale on the side at eye level. Compare 'which is heavier' by holding two objects, then confirm on the scale \u2014 the instrument settles the argument.",
          "check": "Pour water into this jug until it reads 200 mL. Now add 100 mL more \u2014 read the new line. How much is in the jug?",
          "down": "math.measure.length-ruler"
        },
        "N": {
          "move": "Cook or shop: weigh out 500 g of pasta, measure 1 L of milk for a recipe, or figure out how many 250 mL cups fill a 1 L jug at a party. Narrate that mass and volume are how the whole grocery world is measured and sold.",
          "check": "A recipe needs 750 g of flour. You've weighed out 500 g. How many more grams do you need?"
        }
      }
    },
    {
      "id": "math.measure.measure-fraction-inch-convert",
      "domain": "math",
      "strand": "measure",
      "title": "Measure to nearest 1/2, 1/4 inch (line plot); convert units within a system",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: measure to nearest 1/2 and 1/4 inch and build a line plot; state relative unit sizes and convert within a system (larger \u2192 smaller unit)",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.measure.length-ruler",
        "math.fractions.unit-fraction-meaning"
      ],
      "helps": [],
      "resources": [
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch8 Mass and Liquid Volume"
        },
        {
          "type": "beast",
          "ref": "BA 3C ch9 Measurement"
        }
      ],
      "sources": [
        "CC 3.MD.4",
        "CC 4.MD.1",
        "CC 4.MD.2",
        "research/math-spine.md \u00a78"
      ],
      "notes": "Fractional-inch measurement requires unit-fraction meaning (cross-strand requires). Conversion (larger\u2192smaller) leans on multiplication. MA splits conversion per unit type \u00d7 direction (7.20, 9 topics); one node here.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write the fractional measure in notation (2 1/4 in) and connect it to unit conversion: 1 ft = 12 in, so 3 ft = 36 in \u2014 a LARGER unit converts to MORE of the smaller unit by multiplying. Build a small conversion table (ft->in, m->cm) from the model.",
          "check": "Write '2 and three-quarter inches' in numbers. And if a table is 4 ft long, how many inches is that?",
          "down": "math.fractions.unit-fraction-meaning"
        },
        "G": {
          "move": "Draw a ruler zoomed in so the 1/2 and 1/4 tick marks are labeled 1/4, 1/2, 3/4; have her mark where an object ends and name the fraction. Then draw the line plot: an X above each measured value on a number line, spacing the X's evenly, and read 'how many measured 2 and 1/4 inches'.",
          "check": "On this line plot of pencil lengths, how many pencils were 3 and 1/2 inches? How many were longer than 3 inches?"
        },
        "C": {
          "move": "Measure real objects (a leaf, a crayon, her finger) to the nearest half then quarter inch using a ruler whose quarter-inch marks she can see and touch; say 'between 2 and 2 and a half \u2014 closer to the half'. Collect several measurements and stack physical unit cubes or sticky notes above each length value to physically build a line plot.",
          "check": "Measure these four crayons to the nearest quarter inch and stack a cube for each one over its length. Which length has the tallest stack?",
          "down": "math.measure.length-ruler"
        },
        "N": {
          "move": "Measure everyone's height to the quarter inch and make a family line plot; or measure a set of toy cars and plot their lengths, then answer 'what's the most common length?'. For conversion, use a recipe/height context: 'You're 4 feet tall \u2014 the doctor writes it in inches. How many?'",
          "check": "You measured 6 of your stuffed animals and made a line plot. What length shows up the most? How much longer is the biggest than the smallest?"
        }
      }
    },
    {
      "id": "math.measure.money-coins-bills",
      "domain": "math",
      "strand": "measure",
      "title": "Coins & bills; count mixed amounts; make change (count up); money word problems",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: identify coin values, skip-count one coin type, count a mixed pile biggest-first, recognize same amount from different coins, know the dollar = 100\u00a2, and make change by counting up; solve $ and \u00a2 word problems",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.counting.skip-count-2-5-10",
        "math.addsub.add-sub-within-100"
      ],
      "helps": [
        "math.fractions.equal-shares",
        "math.addsub.counting-on",
        "thinking.reasoning.deep-structure-transfer"
      ],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math KB ch14",
          "note": "Money (coins, early)",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch19",
          "note": "Money"
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2B ch10",
          "note": "Money"
        },
        {
          "type": "packet",
          "ref": "money-2026-07-12",
          "note": "full packet: meet the coins \u2192 skip-count \u2192 biggest-first \u2192 the dollar \u2192 making change (count up) \u2192 shop"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch1 \u00a71E Count Money"
        },
        {
          "type": "singapore",
          "ref": "PMUS 2B u3 Money (U.S. Currency)"
        },
        {
          "type": "gumball",
          "ref": "generator:money_count"
        },
        {
          "type": "gumball",
          "ref": "generator:money_change"
        }
      ],
      "sources": [
        "CC 2.MD.8",
        "research/math-spine.md \u00a78",
        "research/singapore-beast.md \u00a75.D"
      ],
      "notes": "Leans on skip-count (5s/10s/25s) + coin values. helps: coin-quarters \u2194 clock-quarters \u2194 fraction-quarters, and count-up-change \u2194 elapsed-time (DESIGN \u00a72 empirical transfers). BA defers Gr2 money to L3C ch9 (\u00a75.D). Seed Penelope L0 \u2014 packet built but NOT completed.",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "Write amounts in money notation: 25 cents, $1.25, and 100 cents = $1. Solve $ and cent word problems as number sentences, keeping the sign/point consistent. Connect the dollar to place value: cents are the hundredths of a dollar.",
          "check": "Write 'one dollar and thirty cents' two ways: in cents and with a dollar sign. How many cents in a dollar?",
          "down": "math.addsub.add-sub-within-100"
        },
        "G": {
          "move": "Use true-to-size coin pictures (the money packet style) so she identifies by real diameter, not guesswork. Show a drawn mixed set and have her write the running total under each coin as she counts biggest-first. Draw a 'count-up change' line from 63 cents to $1.00 showing the hop coins.",
          "check": "This drawn set is a quarter, a quarter, a nickel, and 2 pennies. Write the running total under each and circle the total."
        },
        "C": {
          "move": "Sort REAL coins into piles by kind and name each value (penny 1, nickel 5, dime 10, quarter 25). Count a mixed pile BIGGEST-FIRST: start with quarters skip-counting by 25, then add dimes by 10, nickels by 5, pennies by 1. Trade physically: show that 5 pennies = 1 nickel, 2 dimes + 1 nickel = 1 quarter (same amount, different coins). Make change by COUNTING UP from the price to the money given, handing over coins as you go.",
          "check": "Here's a real pile: 2 quarters, 1 dime, 3 pennies. Count it biggest coin first. What did you get?",
          "down": "math.counting.skip-count-2-5-10"
        },
        "N": {
          "move": "Play shop with real prices: she's the cashier, you buy something for 68 cents with a dollar, she makes change by counting up (69, 70, 75, 100 \u2014 that's 32 cents back). Beware the trap that MORE coins can be LESS money (6 pennies < 1 nickel? no \u2014 but 1 penny < 1 dime though it looks similar). Cross-reference: a coin quarter, a clock quarter, and a fraction quarter are all one-fourth.",
          "check": "You buy a snack for 55 cents and pay with a dollar. Count up to give me my change. How much do I get back?"
        }
      }
    },
    {
      "id": "math.measure.perimeter-formulas",
      "domain": "math",
      "strand": "measure",
      "title": "Perimeter of polygons; apply area & perimeter formulas for rectangles",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: find perimeter of polygons; apply area & perimeter formulas for rectangles; compare same-perimeter/different-area (and vice versa)",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.measure.area-tiling-multiply",
        "math.measure.length-ruler"
      ],
      "helps": [],
      "resources": [
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch6 \u00a76C-6D Perimeter / Composite Figures"
        },
        {
          "type": "beast",
          "ref": "BA 3A ch3 Area and Perimeter"
        }
      ],
      "sources": [
        "CC 3.MD.8",
        "CC 4.MD.3",
        "research/math-spine.md \u00a78"
      ],
      "notes": "Area\u2194perimeter confusion is the classic error; 3.MD.8's same-perimeter/different-area comparison directly targets it (K4). Requires area-tiling first + ruler for measured sides.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write the perimeter as a sum (5 + 3 + 5 + 3 = 16) and introduce the rectangle formulas P = 2l + 2w (or 2(l+w)) and A = l x w side by side, with UNITS (perimeter in cm, area in square cm). Stress: perimeter is a length, area is a square measure \u2014 the units tell them apart.",
          "check": "A rectangle is 9 m by 4 m. Write both formulas and compute perimeter and area \u2014 each with its unit.",
          "down": "math.measure.area-tiling-multiply"
        },
        "G": {
          "move": "Draw a polygon with all side lengths labeled and have her ADD the sides for perimeter; draw a rectangle and derive both area (l x w) and perimeter (add all four, or 2l + 2w). Draw two rectangles with equal perimeter but different area side by side to target the classic area/perimeter mix-up.",
          "check": "This drawn rectangle is 7 by 3. Find its perimeter AND its area. Which one is 'around' and which is 'inside'?"
        },
        "C": {
          "move": "Run a finger (or a piece of string) all the way AROUND the edge of a real shape and measure the string \u2014 that's the perimeter, the distance around. Contrast with area (covering the inside). Build two rectangles from the same loop of string that have the SAME perimeter but different area, so she feels the two are different measures.",
          "check": "Wrap this string around the whole edge of the placemat and measure it. Is that the perimeter or the area? What's the difference?",
          "down": "math.measure.length-ruler"
        },
        "N": {
          "move": "Perimeter is real fencing/trim: how much fence goes around the garden, how much ribbon around a picture frame, how much baseboard around a room. Area is the covering (sod for the garden, glass for the frame). Same shape, two different shopping questions.",
          "check": "You're putting a fence around a 10 m by 6 m garden. How many meters of fence? Is that perimeter or area?"
        }
      }
    },
    {
      "id": "math.measure.scaled-graphs-lineplots",
      "domain": "math",
      "strand": "measure",
      "title": "Scaled picture & bar graphs; line plots (whole & fractional scale)",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: read/build scaled picture & bar graphs and answer how-many-more/less; build a line plot with a whole-number scale and with a fraction (1/2,1/4,1/8) scale",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.measure.data-graphs",
        "math.multdiv.mult-div-meaning"
      ],
      "helps": [],
      "resources": [
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch9 Data"
        }
      ],
      "sources": [
        "CC 3.MD.3",
        "CC 4.MD.4",
        "research/math-spine.md \u00a78"
      ],
      "notes": "Scaled graphs need multiplicative reasoning (each symbol = n). Fractional line plot ties to fractional-inch measurement. NO Beast resource (BA 3.MD.3 'Not Included', \u00a75.C) \u2014 Singapore/ed-packet only.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "Write the reading as multiplication: 'each symbol = 5, there are 6 symbols, 6 x 5 = 30'. Record line-plot answers with counts and fractions ('three items at 2 and 1/4 in'). The scale makes graph-reading a multiplicative act, not a count.",
          "check": "A picture graph uses one star = 4 books. A row has 7 stars. Write the multiplication and the total.",
          "down": "math.multdiv.mult-div-meaning"
        },
        "G": {
          "move": "Read scaled bar/picture graphs where the axis counts by 2s, 5s, or 10s \u2014 she must multiply the bar's units by the scale, not just count squares. Build a line plot with a whole-number scale, then one with a fractional scale (1/4-inch marks) tying it to fractional-inch measurement.",
          "check": "This bar reaches the 3rd mark and each mark is worth 5. What's the value? If the scale were 2 per mark, what would it be?"
        },
        "C": {
          "move": "Build a SCALED picture graph where each icon stands for MORE than one (each sticker = 2 kids): physically place half as many stickers and reason 'this is worth 10, not 5'. For a line plot, measure real objects and place a physical marker above each value on a number line \u2014 then switch the axis to fractional units (1/2, 1/4, 1/8) and plot again.",
          "check": "In this graph each apple sticker means 5. There are 4 stickers in the row \u2014 how many apples is that?",
          "down": "math.measure.data-graphs"
        },
        "N": {
          "move": "Make a scaled graph of real data too big to draw one-per: 'We read 40 books this month \u2014 draw it where each book icon = 10.' Or plot the family's shoe lengths to the quarter inch on a line plot and ask what's most common and the range.",
          "check": "You want to graph 60 minutes of screen time where each icon is 15 minutes. How many icons do you draw?"
        }
      }
    },
    {
      "id": "math.measure.stats-center-spread",
      "domain": "math",
      "strand": "measure",
      "title": "Statistical questions; mean, median, mode, range; measures of center vs variability",
      "tier": "L3",
      "band": [
        10,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: recognize a statistical question (anticipates variability), compute mean/median/mode/range for a data set, and say whether a number describes CENTER or SPREAD",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.measure.scaled-graphs-lineplots",
        "math.addsub.add-sub-standard-algorithm"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a713.1 Basic Statistics / \u00a713.2 Limits of Basic Statistics",
          "record": true
        }
      ],
      "sources": [
        "CC 6.SP.1",
        "CC 6.SP.2",
        "CC 6.SP.3",
        "CC 6.SP.5c",
        "research/prealgebra-extension.md \u00a74F (S1)"
      ],
      "notes": "6.SP.1\u20133: a statistical question anticipates variability; a data set has a distribution with center/spread/shape; a measure of center summarizes with one number, a measure of variation describes spread. Mean = 'fair-share/balance point'; median = 'middle value.' AoPS \u00a713.2 (when the mean misleads) is the thinking hook. requires add-sub-standard-algorithm for the mean's arithmetic. BA omits basic stats \u2014 build/buy signal. Misconception: median = middle of the RANGE not the middle VALUE; 'average' always = mean; assuming the mode is unique; forgetting to SORT before taking the median.",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "line up a dot/line plot, then read the median as the middle dot and the range as end-to-end width",
          "check": "on a sorted line plot of 7 values, which dot is the median?"
        },
        "C": {
          "move": "make each data value a stack of cubes; even the stacks out to the same height \u2014 that height is the MEAN (the fair-share/balance-point meaning)",
          "check": "with stacks of 2, 4, 6, even them out \u2014 what's the mean?"
        },
        "N": {
          "move": "average test score, typical shoe size, spread of daily temperatures \u2014 one number to summarize 'what's typical' vs 'how varied'",
          "check": "five friends' ages \u2014 is the mean or the median more 'typical' if one is much older?"
        }
      }
    },
    {
      "id": "math.measure.stats-displays",
      "domain": "math",
      "strand": "measure",
      "title": "Display & summarize data: dot plots, histograms, box plots; describe a distribution",
      "tier": "L3",
      "band": [
        11,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: build & read dot plots, histograms, and box plots; report n, the attribute & units, a measure of center and of variability, and relate the choice of measure to the distribution's shape",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.measure.stats-center-spread"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a713.3 Tables, Graphs, and Charts",
          "record": true
        }
      ],
      "sources": [
        "CC 6.SP.4",
        "CC 6.SP.5",
        "research/prealgebra-extension.md \u00a74F (S2)"
      ],
      "notes": "6.SP.4: dot plots, histograms, box plots; 6.SP.5: report n, describe the attribute/units, give center + variability, relate the choice of measure to the shape. Bar/picture graphs already exist (data-graphs, scaled-graphs-lineplots) \u2014 this node is the NEW display types (histogram, box plot, dot plot) + describing shape. Misconception: histogram (binned continuous) vs bar graph (categorical) confusion; box-plot quartiles read as equal-COUNT not equal-WIDTH.",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "turn the same data set into a dot plot, then a histogram (bin it), then a box plot (five-number summary) and compare what each shows about shape",
          "check": "for one data set, what does the box plot show that the dot plot hides?"
        },
        "N": {
          "move": "describe a real distribution \u2014 heights in the class, wait times at a ride \u2014 in words: where's the center, how spread, any outliers, what shape",
          "check": "look at a histogram of class heights \u2014 is it symmetric or skewed?"
        }
      }
    },
    {
      "id": "math.measure.tell-time-5min",
      "domain": "math",
      "strand": "measure",
      "title": "Tell & write time to the nearest 5 minutes; a.m./p.m.",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: read/write time to the nearest 5 minutes (each number = 5); use quarter-past / quarter-to; distinguish a.m./p.m.",
        "L3": "SM-2 spaced gate across separate days"
      },
      "requires": [
        "math.measure.tell-time-hour-half",
        "math.counting.skip-count-2-5-10"
      ],
      "helps": [
        "math.fractions.equal-shares",
        "thinking.reasoning.deep-structure-transfer"
      ],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch18",
          "note": "Time (to 5 min)",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2B ch12",
          "note": "Time"
        },
        {
          "type": "packet",
          "ref": "analog-clocks-2026-07-12",
          "note": "parts 5-7: counting minutes (each number = 5) \u2192 any time \u2192 quarter past/to"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch7 Time"
        },
        {
          "type": "gumball",
          "ref": "generator:clock_read"
        }
      ],
      "sources": [
        "CC 2.MD.7",
        "research/math-spine.md \u00a78",
        "research/singapore-beast.md \u00a75.D"
      ],
      "notes": "Needs skip-count-5 (each clock number = 5 min). helps clock-quarters \u2194 fraction-quarters (quarter-past = 1/4 turn). BA defers to L3C ch9.",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "Write times like 3:45, 8:20, and label a.m. vs p.m. from the day's events. Connect 'quarter past' = :15, 'half past' = :30, 'quarter to' = :45. Reinforce the leading zero: five past three is 3:05, not 3:5 \u2014 the notation always fills two minute digits.",
          "check": "Write 'twenty-five minutes past seven' as a digital time. Is it a.m. or p.m. if it's breakfast?"
        },
        "G": {
          "move": "Show a clock-face diagram with a faint minute-count ring (5,10,15... outside each number). Have her read times to the 5 minutes and mark quarter-past / quarter-to. Draw hands for '5 minutes to 4' \u2014 the trap is she must read the SHORT hand as still near the 3, almost at 4.",
          "check": "This face has the long hand on the 9 and the short hand just before the 12. What time is it \u2014 and is it quarter-to something?"
        },
        "C": {
          "move": "On the geared clock, skip-count by 5 out loud around the face while pointing at each number: the 1 is 5 past, the 2 is 10 past... so each NUMBER is worth 5 minutes for the long hand. Physically set the minute hand to '3:45' by walking it to the 9 while she counts 5-10-15...-45. Do quarter-past (long hand on 3) and quarter-to (long hand on 9) as landmark turns.",
          "check": "Count around the clock by fives with me. Now set the long hand to 20 minutes past \u2014 which number does it point to?",
          "down": "math.measure.tell-time-hour-half"
        },
        "N": {
          "move": "Read real schedules: 'The show starts at 7:15 \u2014 set it.' 'School is out at 3:05.' Use a.m./p.m. against her routine (7:30 a.m. is getting-up, 7:30 p.m. is winding-down). Cross-reference: a quarter-past on the clock is the same 'quarter' as a coin quarter and a fraction quarter \u2014 one-fourth of the turn.",
          "check": "The park closes at quarter to 6 in the evening. Write that time. Is it a.m. or p.m.?",
          "down": "math.fractions.equal-shares"
        }
      }
    },
    {
      "id": "math.measure.tell-time-hour-half",
      "domain": "math",
      "strand": "measure",
      "title": "Tell & write time to the hour and half-hour (analog + digital)",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: read and write time to the hour and half-hour on analog and digital clocks; track the hour hand's position",
        "L3": "SM-2 spaced gate (via the clock review pack: 3+ spaced reps, 4+ lifetime correct) across separate days"
      },
      "requires": [
        "math.counting.count-sequence-100"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math KB ch13",
          "note": "Time (to the hour, early)",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch18",
          "note": "Time"
        },
        {
          "type": "packet",
          "ref": "analog-clocks-2026-07-12",
          "note": "parts 1-4: clock face \u2192 o'clock \u2192 half-past \u2192 the sneaky hour hand"
        },
        {
          "type": "gumball",
          "ref": "generator:clock_read"
        },
        {
          "type": "gumball",
          "ref": "generator:clock_pick"
        }
      ],
      "sources": [
        "CC 1.MD.3",
        "research/math-spine.md \u00a78",
        "research/singapore-beast.md \u00a75.D"
      ],
      "notes": "Penelope FINISHED the analog-clocks packet 2026-07-12 end-to-end ('TOUGH for her') \u2192 seed L1. Clock review pack ACTIVATED 2026-07-13; first review 2026-07-14 \u2192 NO retention (L3) evidence yet, seed L1 not higher. NO Beast-L2 resource (BA defers Gr2 time to L3C ch9, \u00a75.D) \u2014 packet + Singapore + gumball carry it.",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "Connect the face to digital notation: o'clock reads '3:00', half past reads '3:30'. Read the hour off the SHORT hand's position and the minutes off the long hand. Practice writing both forms for the same face; note that '3:30' still belongs to the 3 o'clock hour even though the hour hand isn't on the 3 anymore.",
          "check": "This clock shows the short hand between 4 and 5, long hand on the 6. Write the digital time."
        },
        "G": {
          "move": "Use real-looking clock-face diagrams (the analog-clocks packet style, with a properly PROPORTIONAL short hand). At o'clock the hour hand points dead-on a number and the minute hand is straight up; at half-past the minute hand points down at 6 and the hour hand has crept halfway to the next number. Have her READ drawn faces and also DRAW the hands for a given time.",
          "check": "Draw the hands for 'half past 2'. Where exactly does the short hand go \u2014 on the 2, or between 2 and 3?"
        },
        "C": {
          "move": "Use a real GEARED teaching clock so the hour hand physically CREEPS as she turns the minute hand \u2014 set 3 o'clock, then walk the minute hand a full turn and watch the hour hand move from the 3 toward the 4, landing exactly ON the 3 at o'clock and HALFWAY between 3 and 4 at half-past. She reads it off the actual hands, not a picture.",
          "check": "Turn the hands to 3 o'clock. Now make it half past 3 \u2014 where does the SHORT hand end up, and how do you know?",
          "down": "math.counting.count-sequence-100"
        },
        "N": {
          "move": "Anchor times to her real day: 'We eat dinner at 6 o'clock \u2014 set the clock. Bath is half past 7.' Read the kitchen clock together at real moments. Time is the schedule she lives inside, so tie each reading to an event.",
          "check": "It's half past 8 and bedtime is 9 o'clock. Show me both times on the clock. Which comes first?"
        }
      }
    },
    {
      "id": "math.multdiv.equal-groups-arrays",
      "domain": "math",
      "strand": "multdiv",
      "title": "Equal groups & rectangular arrays as repeated addition; odd/even",
      "tier": "L3",
      "band": [
        7,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: express a rectangular array as repeated equal addends and as rows\u00d7columns; determine odd/even by pairing",
        "L3": "SM-2 spaced gate across separate days"
      },
      "requires": [
        "math.addsub.add-facts-memory-20",
        "math.geometry.array-rows-columns"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch14",
          "note": "Grouping and Sharing (equal groups)",
          "record": true
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch6 \u00a76A Add Equal Groups"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch6 \u00a76B Even and Odd Numbers"
        },
        {
          "type": "beast",
          "ref": "BA 3A ch2 Skip-Counting"
        }
      ],
      "sources": [
        "CC 2.OA.3",
        "CC 2.OA.4",
        "research/math-spine.md \u00a76"
      ],
      "notes": "The bridge from add-facts to multiplication (K2 p.25). Requires array-rows-columns (spatial structuring) AND add-facts-memory-20. BA defers 2.OA.4 to BA-L3 (\u00a75.B).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "write the array as repeated addition and connect it to the multiplication symbol: 3+3+3+3 = 4 x 3 = 12; name that 4 x 3 means '4 groups of 3'.",
          "check": "write 5+5+5 as a multiplication sentence \u2014 how many groups, how big is each?"
        },
        "G": {
          "move": "draw a dot array in rows and columns and label it as repeated addition AND as rows x columns; use pairing (two-by-two) on a number to show odd (one left over) vs even (none left over).",
          "check": "draw a 2-by-6 array \u2014 write it as an addition (6+6) and count by pairs: is 12 even or odd?"
        },
        "C": {
          "move": "build equal groups with physical objects \u2014 4 cups with 3 counters each \u2014 and count the total two ways: skip-count (3,6,9,12) and repeated addition (3+3+3+3); then arrange the SAME counters into a 4-by-3 rectangular array (rows of chairs) to show rows x columns is the same total.",
          "check": "make 3 groups of 5 with counters, then rebuild them as a 3-row array \u2014 is the total the same?",
          "down": "math.geometry.array-rows-columns"
        },
        "N": {
          "move": "frame arrays as real rectangular arrangements \u2014 rows of chairs, a muffin tin, tiles on a floor, an egg carton \u2014 and count total by rows-of-equal-size.",
          "check": "a muffin tin has 3 rows of 4 cups \u2014 how many muffins fit? write it two ways."
        }
      }
    },
    {
      "id": "math.multdiv.mult-div-facts-memory-100",
      "domain": "math",
      "strand": "multdiv",
      "title": "Know from memory all products of two one-digit numbers; fluent \u00f7 within 100",
      "tier": "L4",
      "band": [
        8,
        9
      ],
      "fluency_aim": {
        "metric": "problems_per_min_oral",
        "target": 40,
        "sustain": "2 of 3 separate days, \u22642 errors/min",
        "source": "research/fluency-aims.md \u00a78 (mult-facts oral 40-50 early \u2192 60-90 fluent)"
      },
      "gates": {
        "L2": "\u226590% on 10 fresh mixed \u00d7\u00f7-within-100 fact items, untimed",
        "L3": "SM-2 spaced gate on mixed fresh fact items across separate days (understanding gate \u2014 fires BEFORE the L4 rate gate)",
        "L4": "oral (see/say) 1-minute timing; 40-50 problems/min early, stretch 60-90 fluent; \u22642 errors; 2 of 3 separate days. Written variant at 2/3 \u00d7 measured write-digits rate."
      },
      "requires": [
        "math.multdiv.mult-facts-hard",
        "math.multdiv.mult-div-word-problems"
      ],
      "helps": [],
      "resources": [
        {
          "type": "gumball",
          "ref": "generator:fact_mc"
        },
        {
          "type": "activity",
          "ref": "printed times-table timed sheet (parent enters rate)"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch4 Multiplication and Division of 6,7,8,9"
        }
      ],
      "sources": [
        "CC 3.OA.7",
        "research/fluency-aims.md \u00a78",
        "research/math-spine.md \u00a72"
      ],
      "notes": "PENELOPE'S NEXT-YEAR TRUNK (spine \u00a711.1) \u2014 she has ~86% first-try small-factor multiplication accuracy in-app but 'fluent' (fast/automatic) is NOT established and there's no formal times-table assessment. Seed at L1/L2, NOT L3 (evidence-inventory contradiction, adjudicated: accuracy \u2260 fluency). Math Academy floor = \u00d7-tables-to-12 mastery \u2014 this node IS the graduation gate toward MA. L4 fires only after L3 understanding. Prefer oral aim. Confidence: literature-solid (oral) / extrapolated (written).",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "mixed see/say recall to automaticity \u2014 flashcards / timed sheets across the whole 0-10 table and the matching division facts; the L4 gate is a 1-minute oral (see/say) timing at 40-50/min early, stretching to 60-90, but ONLY after the L3 understanding gate.",
          "check": "quick, no counting: 7x8? 42 divided by 6? 9x7?",
          "down": "math.multdiv.mult-facts-hard"
        },
        "G": {
          "move": "keep a completed multiplication table visible and hunt PATTERNS (the diagonal of squares, symmetry across it = commutativity, the 5s/10s columns) so recall rests on structure, not rote-only.",
          "check": "on the table, find two cells that both equal 24 \u2014 why are there two?"
        }
      }
    },
    {
      "id": "math.multdiv.mult-div-meaning",
      "domain": "math",
      "strand": "multdiv",
      "title": "Interpret products & quotients; equal groups, arrays, sharing/grouping",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: interpret 5\u00d77 as 5 groups of 7 (unknown product); interpret 56\u00f78 as sharing OR grouping (group-size / number-of-groups unknown); write matching equations",
        "L3": "SM-2 spaced gate on mixed interpretations across separate days"
      },
      "requires": [
        "math.multdiv.equal-groups-arrays",
        "math.counting.skip-count-2-5-10"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch14",
          "note": "Grouping and Sharing (early \u00d7/\u00f7 meaning)",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch6",
          "note": "Multiplication and Division"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch3 \u00a73A Multiplication / \u00a73H Division"
        },
        {
          "type": "beast",
          "ref": "BA 3B ch4 Multiplication"
        },
        {
          "type": "beast",
          "ref": "BA 3C ch8 Division"
        }
      ],
      "sources": [
        "CC 3.OA.1",
        "CC 3.OA.2",
        "research/math-spine.md \u00a76"
      ],
      "notes": "Mult and div co-taught: division can be EASIER via count-by (24\u00f73: count by 3 until you hear 24, K2 p.25) \u2014 SOFT interleave, both meanings in one node. Three situation types escalate: equal groups \u2192 arrays \u2192 (Gr4) multiplicative compare.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "write both meanings as equations and connect them: 5 x 7 = 35, and 35 divided by 5 = 7 / 35 divided by 7 = 5; interpret the unknown's position (product unknown vs group-size vs number-of-groups).",
          "check": "if 6 x 4 = 24, write the two division facts that go with it."
        },
        "G": {
          "move": "draw an equal-groups / bar picture for a product (5 groups of 7) and for a quotient (56 split into 8 equal parts, OR into parts of 8); write the matching x and division equations from the same picture.",
          "check": "draw 56 divided into 8 equal groups \u2014 what's in each group? write it as a division and a multiplication."
        },
        "C": {
          "move": "act out BOTH division meanings with counters: SHARING (deal 24 counters one at a time into 3 plates -> how many each) and GROUPING (make plates of 3 from 24 -> how many plates); show multiplication is the inverse \u2014 3 plates of 8 rebuilds the 24.",
          "check": "share 20 counters fairly among 4 plates \u2014 how many each? Now make groups of 5 from 20 \u2014 how many groups?",
          "down": "math.multdiv.equal-groups-arrays"
        },
        "N": {
          "move": "use real sharing/grouping stories \u2014 'we have 24 cookies and 3 kids, fair shares?'; 'how many 4-packs of juice from 20 boxes?' \u2014 and connect division-by-count-by (count by 3s until you hear 24).",
          "check": "18 crackers shared among 3 friends \u2014 how many each? Count by 3s to check."
        }
      }
    },
    {
      "id": "math.multdiv.mult-div-multidigit",
      "domain": "math",
      "strand": "multdiv",
      "title": "Multi-digit \u00d7 1-digit / 2\u00d72-digit; multi-digit \u00f7 1-digit with remainders",
      "tier": "L3",
      "band": [
        8,
        10
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: multiply up-to-4-digit \u00d7 1-digit and 2-digit \u00d7 2-digit (area model & place value); divide up-to-4-digit \u00f7 1-digit with quotient & remainder; multiply by multiples of 10",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.multdiv.mult-div-facts-memory-100",
        "math.placevalue.three-digit-place-value"
      ],
      "helps": [],
      "resources": [
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch4 \u00a74E-4F Multiply by Tens / 2-Digit \u00d7 1-Digit"
        },
        {
          "type": "beast",
          "ref": "BA 3C ch8 Division"
        }
      ],
      "sources": [
        "CC 3.NBT.3",
        "CC 4.NBT.5",
        "CC 4.NBT.6",
        "research/math-spine.md \u00a76"
      ],
      "notes": "MA splits this into ~13 topics by strategy \u00d7 operand size (repeated-addition/place-value/area-model); we keep ONE node, strategy differences ride as assessment items + notes. Area model requires spatial structuring (helps from array-rows-columns, already upstream via facts).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "record the partial products / the division steps in the standard written layout, linking each written line back to its piece of the area model or the shared blocks; keep quotient-and-remainder explicit.",
          "check": "solve 6 x 34 by partial products (6x30, 6x4) then add; solve 47 divided by 5 \u2014 give the quotient and remainder."
        },
        "G": {
          "move": "draw the AREA MODEL: a rectangle split by place value \u2014 23 x 14 as a 2x2 grid of partial products (20x10, 20x4, 3x10, 3x4) \u2014 then add the partials; for x by multiples of 10, show the rectangle scaling by a factor of ten.",
          "check": "draw the area model for 13 x 12 \u2014 label the four partial products and add them. What is 13 x 12?"
        },
        "C": {
          "move": "build a multi-digit product with base-ten blocks / place-value disks: 4 x 23 as 4 groups of (2 tens 3 ones), gather 8 tens and 12 ones, then TRADE ten ones for a ten (regrouping made physical); for division, deal a 3-digit pile of blocks into equal groups and read the leftover as the remainder.",
          "check": "build 3 x 24 with ten-rods and ones \u2014 how many ones do you trade in for a ten? Now share 25 cubes into 4 groups \u2014 what is the remainder?",
          "down": "math.multdiv.mult-div-facts-memory-100"
        }
      }
    },
    {
      "id": "math.multdiv.mult-div-word-problems",
      "domain": "math",
      "strand": "multdiv",
      "title": "Multiplication/division word problems; unknown in a mult/div equation",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh word problems, untimed: solve equal-groups/array/measurement \u00d7\u00f7 word problems; find the unknown in a mult/div equation (8\u00d7?=48); understand \u00f7 as unknown-factor",
        "L3": "SM-2 spaced gate on mixed types across separate days"
      },
      "requires": [
        "math.multdiv.mult-div-meaning"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch6",
          "note": "Multiplication and Division (word problems)",
          "record": true
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch3 \u00a73G Word Problems"
        },
        {
          "type": "beast",
          "ref": "BA 3C ch7 Variables"
        }
      ],
      "sources": [
        "CC 3.OA.3",
        "CC 3.OA.4",
        "CC 3.OA.6",
        "research/math-spine.md \u00a76"
      ],
      "notes": "Division as unknown-factor is the keystone linking \u00d7 and \u00f7 (K2 p.25). BA 3C ch7 (Variables) pushes 6.EE.7 (solve x+p=q, px=q) \u2014 a 6th-grade algebra standard taught at grade 3 (\u00a75.C); early is fine for a strong reasoner.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "translate the story into an equation with the unknown in the right place (8 x ? = 48, or 48 divided by 8 = ?) and solve using the mult<->div link (division = unknown factor).",
          "check": "write an equation for '35 stickers shared equally on 5 pages' and solve it."
        },
        "G": {
          "move": "draw a bar / equal-groups model for the word problem, boxing the known parts and marking the unknown with a ? so the picture selects the operation; use it especially for the unknown-factor (8 x ? = 48).",
          "check": "draw a bar model for '8 times a number is 48' \u2014 where does the ? go, and what is it?"
        },
        "N": {
          "move": "read equal-groups / array / measurement x-and-division stories aloud, act out or model the situation before touching numbers, and ask which quantity is unknown (total, group size, or number of groups) \u2014 division reads as an unknown-factor question ('8 times WHAT is 48?').",
          "check": "a baker puts 6 rolls in each bag and fills 7 bags \u2014 how many rolls? Now: 48 rolls, 6 per bag \u2014 how many bags?",
          "down": "math.multdiv.mult-div-meaning"
        }
      }
    },
    {
      "id": "math.multdiv.mult-facts-easy",
      "domain": "math",
      "strand": "multdiv",
      "title": "Multiplication facts, easy-first (2s, 5s, 10s, 3s, 4s) via count-by & distributive",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: recall/derive 2s, 5s, 10s facts (count-by), 3s and 4s (via distributive & commutative); use 3\u00d76=6\u00d73",
        "L3": "SM-2 spaced gate on mixed easy facts across separate days"
      },
      "requires": [
        "math.multdiv.mult-div-meaning"
      ],
      "helps": [
        "math.counting.count-oral-skip"
      ],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch7",
          "note": "Multiplication and Division of 2, 5, and 10",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2B ch9",
          "note": "Multiplication and Division of 3 and 4"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch3 \u00a73B-3F Multiply by 2/5/10/3/4"
        },
        {
          "type": "beast",
          "ref": "BA 3B ch4 Multiplication"
        },
        {
          "type": "beast",
          "ref": "BA 3B ch6 The Distributive Property"
        },
        {
          "type": "gumball",
          "ref": "generator:fact_mc"
        }
      ],
      "sources": [
        "CC 3.OA.5",
        "CC 3.OA.7",
        "research/math-spine.md \u00a76"
      ],
      "notes": "Facts built easy-first then mixed (K2 p.27): 2s/5s/10s (count-by) \u2192 distributive \u2192 3s/4s. Commutative property (array rotation) + distributive (7\u00d75=(6+1)\u00d75) are named strategies. This is the ACCURACY rung feeding the L4 memory node; kept L3 (not its own L4 rung) per spine \u00a711.1 recommendation. helps count-oral-skip (skip-count \u2192 facts).",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "write the fact families and the strategy: 3x6 = (2x6) + (1x6), and 3x6 = 6x3; drill the 2s/5s/10s toward recall, keep 3s/4s strategy-derived. This is the ACCURACY rung feeding the L4 memory node.",
          "check": "use 5x8=40 to find 6x8 \u2014 write the step, then the answer."
        },
        "G": {
          "move": "use a dot-array / area sketch and split it to show distributive (7x5 = 6x5 + 1x5); mark the count-by ladder on a number line for 2s/5s/10s so the easy facts anchor the derivations.",
          "check": "draw 6x5 and split off one row to get from 5x5 you already know \u2014 what does 6x5 equal?"
        },
        "C": {
          "move": "derive facts from physical structure: skip-count equal stacks for 2s/5s/10s; for a new fact like 3x6, build a 2x6 array and add one more row of 6 (distributive, made physical); rotate the array 90 degrees to SEE 3x6 = 6x3 (commutative).",
          "check": "build 4x5 from a known 2x5 array \u2014 how many more rows did you add? Now turn it: what is 5x4?",
          "down": "math.multdiv.mult-div-meaning"
        }
      }
    },
    {
      "id": "math.multdiv.mult-facts-hard",
      "domain": "math",
      "strand": "multdiv",
      "title": "Multiplication facts 6s/7s/8s/9s via derived strategies (5+n, 9=10-1)",
      "tier": "L3",
      "band": [
        8,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: derive/recall 6/7/8/9 facts using 5+n pattern, 9=10\u22121, doubling, and known-fact anchors",
        "L3": "SM-2 spaced gate on mixed hard facts across separate days"
      },
      "requires": [
        "math.multdiv.mult-facts-easy"
      ],
      "helps": [],
      "resources": [
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch4 Multiplication and Division of 6,7,8,9"
        },
        {
          "type": "beast",
          "ref": "BA 3B ch5 Perfect Squares"
        },
        {
          "type": "gumball",
          "ref": "generator:fact_mc"
        }
      ],
      "sources": [
        "CC 3.OA.7",
        "research/math-spine.md \u00a76"
      ],
      "notes": "The 9s pattern (9=10\u22121) and 5+n pattern are named strategies (K2 p.26). Accuracy rung; the terminal automaticity (know-from-memory + rate) is mult-div-facts-memory-100.",
      "instrument_gap": false,
      "representations": {
        "S": {
          "move": "write the derived-strategy chains for 6s/7s/8s/9s: 5+n pattern (7x6 = 5x6 + 2x6), 9=10-1 (9x4 = 10x4 - 4), doubling (8x7 = double 4x7), and known-square anchors (7x7 -> 7x8).",
          "check": "find 8x6 by doubling 4x6 \u2014 show the two steps."
        },
        "G": {
          "move": "picture the hard facts as area splits off known anchors: 7x8 as (5x8)+(2x8) shaded in two colors; 9x6 as (10x6)-(1x6) drawn as a full ten-rows block with one row removed (the 9=10-1 pattern made visual).",
          "check": "draw 9x7 as ten 7s with one 7 taken away \u2014 what does 9x7 equal?",
          "down": "math.multdiv.mult-facts-easy"
        },
        "N": {
          "move": "the 9s finger/pattern trick and real anchors \u2014 'a week has 7 days, so 7x4 is 4 weeks'; make the derivation a quick mental habit tied to something memorable.",
          "check": "how many days in 6 weeks? which fact is that?"
        }
      }
    },
    {
      "id": "math.multdiv.multistep-4ops-patterns",
      "domain": "math",
      "strand": "multdiv",
      "title": "Multistep 4-operation problems (interpret remainders); factors, multiples, patterns",
      "tier": "L3",
      "band": [
        8,
        10
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: solve multistep problems with all four operations and interpret remainders in context; find factor pairs to 100, classify prime/composite, identify multiples; explain add/mult-table patterns; multiplicative comparison (35 = 5\u00d77 = '5 times as many as 7')",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.multdiv.mult-div-multidigit",
        "math.addsub.wp-start-unknown-two-step"
      ],
      "helps": [],
      "resources": [
        {
          "type": "beast",
          "ref": "BA 3D ch11 Estimation"
        },
        {
          "type": "beast",
          "ref": "BA 3B ch6 The Distributive Property"
        }
      ],
      "sources": [
        "CC 3.OA.8",
        "CC 3.OA.9",
        "CC 4.OA.1",
        "CC 4.OA.2",
        "CC 4.OA.3",
        "CC 4.OA.4",
        "research/math-spine.md \u00a76"
      ],
      "notes": "Multiplicative compare is GRADE 4 ONLY \u2014 do NOT introduce in Gr3 (distinct from additive compare, more complex, K2 p.22). Keep word-problem work about interpretation, not formal order-of-operations notation (that waits for Gr6, K2 p.27).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "write the multi-step solution as a sequence of equations (interpreting each result), and write factor pairs / multiplicative-compare equations; keep it about interpretation, NOT formal order-of-operations notation yet.",
          "check": "Maya has 3 boxes of 8 markers and gives away 5 \u2014 write the steps and the final number left."
        },
        "G": {
          "move": "use an array / multiplication-table view to see factor pairs and multiples, and to justify multiplicative comparison (35 = 5x7 = '5 times as many as 7') as a scaled bar \u2014 distinct from additive 'more than'.",
          "check": "on the table, list all factor pairs of 24. Then: '5 times as many as 7' \u2014 is that 12 or 35?"
        },
        "C": {
          "move": "explore factors/multiples and prime/composite physically: try to build every rectangle for a number of tiles \u2014 12 tiles make 1x12, 2x6, 3x4 (composite, many rectangles); 7 tiles make ONLY 1x7 (prime, one rectangle).",
          "check": "make all the rectangles you can with 16 tiles \u2014 is 16 prime or composite? Try 13 tiles \u2014 what does that tell you?"
        },
        "N": {
          "move": "read a multi-step real-world problem (buy, share, then have some left over), plan the ORDER of operations from the situation, and decide what the remainder MEANS in context (round up for buses, drop for full boxes, keep as leftover).",
          "check": "26 kids need vans that hold 4 each \u2014 how many vans? Why can't the answer have a remainder left un-rounded?",
          "down": "math.multdiv.mult-div-multidigit"
        }
      }
    },
    {
      "id": "math.numbertheory.divisibility-rules",
      "domain": "math",
      "strand": "numbertheory",
      "title": "Divisibility rules (2, 3, 4, 5, 6, 9, 10) and why they work",
      "tier": "L3",
      "band": [
        9,
        12
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: apply divisibility rules for 2/3/4/5/6/9/10 to decide (without dividing) whether a number is divisible, and explain why the digit-sum rule works for 3 and 9",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.numbertheory.factors-multiples"
      ],
      "helps": [
        "math.numbertheory.prime-factorization"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a73.2 Divisibility Tests",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-4 Factors (divisibility)"
        }
      ],
      "sources": [
        "research/prealgebra-extension.md \u00a74A (N2)",
        "AoPS Prealgebra \u00a73.2"
      ],
      "notes": "AoPS-surfaced first-class node (per adjudication). Not a standalone CC standard \u2014 CC folds divisibility into 4.OA.4 / 6.NS.4. Cited to AoPS \u00a73.2, NOT fabricated to CC. Misconception: applying the digit-sum rule (\u00f73, \u00f79) to other divisors; treating 'ends in an even digit' as sufficient for \u00f74 (need the last TWO digits); assuming a \u00f76 rule is just 'even' (need \u00f72 AND \u00f73).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "test 2/5/10 by the last digit, 4 by the last two digits, 3/9 by the digit sum, 6 by \u00f72 and \u00f73 together",
          "check": "is 3,564 divisible by 9? by 6? show the test"
        },
        "N": {
          "move": "decide if a bag of items can be split evenly among 3 (or 4, or 6) friends WITHOUT dividing \u2014 just by inspecting the number",
          "check": "can 132 stickers be shared evenly among 6 kids? use a rule, not division"
        }
      }
    },
    {
      "id": "math.numbertheory.factors-multiples",
      "domain": "math",
      "strand": "numbertheory",
      "title": "Factors, multiples, factor pairs; multiplicative structure to 100",
      "tier": "L3",
      "band": [
        8,
        11
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: list all factor pairs of a number \u2264100, list multiples of a number, and tell a factor from a multiple in context",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.multdiv.mult-div-facts-memory-100",
        "math.multdiv.multistep-4ops-patterns"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a73.1 Multiples / \u00a73.6 Divisors",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-5 Factors & Multiples"
        }
      ],
      "sources": [
        "CC 4.OA.4",
        "CC 6.NS.4",
        "research/prealgebra-extension.md \u00a74A (N1)"
      ],
      "notes": "Consolidation/deepening node \u2014 the grade-4 4.OA.4 seed (factor pairs / prime-composite / multiples) already lives in multistep-4ops-patterns; this makes factor/multiple structure a first-class rung feeding divisibility, primes, GCF/LCM. Do NOT re-file the grade-4 seed. 6.NS.2 long-division fluency is an extension of the existing multidigit node, noted here, not a separate L4. Misconception: 'factor' vs 'multiple' confusion (a factor divides IN, a multiple is built OUT); forgetting 1 and n are always factors of n.",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "draw a factor rainbow pairing factors from the outside in; skip-count on a number line to land the multiples",
          "check": "draw the factor rainbow for 24"
        },
        "C": {
          "move": "build a number as a rectangle of tiles every way it factors (12 = 1\u00d712, 2\u00d76, 3\u00d74); a prime has only the 1\u00d7n strip",
          "check": "make every rectangle for 18 \u2014 what are its factors?"
        },
        "N": {
          "move": "arrange 24 cookies onto identical plates with none left over \u2014 each arrangement is a factor pair",
          "check": "how many equal plates can hold 24 cookies with none left over?"
        }
      }
    },
    {
      "id": "math.numbertheory.gcf-lcm",
      "domain": "math",
      "strand": "numbertheory",
      "title": "Greatest common factor & least common multiple (via listing and via prime factorization)",
      "tier": "L3",
      "band": [
        10,
        12
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: find the GCF of two numbers \u2264100 and the LCM of two numbers \u226412 by listing AND from prime factorizations; use GCF to factor a sum (36 + 8 = 4(9 + 2))",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.numbertheory.prime-factorization"
      ],
      "helps": [
        "math.fractions.multiply-divide-fractions",
        "math.fractions.mixed-numbers",
        "math.algebra.expressions-evaluate-write"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a73.5 LCM / \u00a73.7 GCD",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-5 Factors & Multiples"
        }
      ],
      "sources": [
        "CC 6.NS.4",
        "research/prealgebra-extension.md \u00a74A (N5)",
        "AoPS Prealgebra \u00a73.5"
      ],
      "notes": "6.NS.4: GCF of two numbers \u2264100, LCM of two \u226412, and the distributive-factoring of a sum (36 + 8 = 4(9 + 2)) \u2014 that last part helps into expressions. Feeds fraction simplest-form + adding unlike denominators. Misconception: swapping GCF\u2194LCM; 'GCF is always bigger than the numbers' (it is \u2264 both); computing LCM as the plain product (only correct when the numbers are coprime).",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "list factors of each number, ring the shared ones, take the biggest (GCF); list multiples of each, ring the shared ones, take the smallest (LCM); OR use a Venn of the prime factors \u2014 overlap = GCF, whole diagram = LCM",
          "check": "put the prime factors of 12 and 18 in a Venn \u2014 read off GCF and LCM"
        },
        "N": {
          "move": "GCF = biggest equal-size groups you can make from two piles with none left over; LCM = when two repeating events (buses every 12 min, every 18 min) next coincide",
          "check": "two lights blink every 4s and every 6s \u2014 when do they blink together again?"
        }
      }
    },
    {
      "id": "math.numbertheory.prime-factorization",
      "domain": "math",
      "strand": "numbertheory",
      "title": "Prime factorization; factor trees; exponent form of a factorization",
      "tier": "L3",
      "band": [
        9,
        12
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: find the prime factorization of a number with a factor tree and write it in exponent form (72 = 2^3 \u00d7 3^2)",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.numbertheory.primes-composites"
      ],
      "helps": [
        "math.algebra.write-evaluate-exponents",
        "math.fractions.multiply-divide-fractions"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a73.4 Prime Factorization",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-4 Factors (factor trees)"
        },
        {
          "type": "beast",
          "ref": "BA-5 Factors & Multiples"
        }
      ],
      "sources": [
        "research/prealgebra-extension.md \u00a74A (N4)",
        "AoPS Prealgebra \u00a73.4"
      ],
      "notes": "Fundamental Theorem of Arithmetic, informally: every integer >1 has a UNIQUE prime factorization. Feeds GCF/LCM and fraction simplest-form. Exponent notation first appears here (helps into write-evaluate-exponents; also helped by it). No standalone CC code \u2014 cited to AoPS \u00a73.4. Misconception: stopping the factor tree before all leaves are prime; thinking two different trees give different factorizations (uniqueness \u2014 different trees, same primes).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "collect the prime leaves and write the product in exponent form, smallest prime first",
          "check": "write 200 as a product of primes in exponent form"
        },
        "G": {
          "move": "grow a factor tree, splitting each composite branch until every leaf is prime; circle the prime leaves",
          "check": "build the factor tree for 60 \u2014 what are the prime leaves?"
        }
      }
    },
    {
      "id": "math.numbertheory.primes-composites",
      "domain": "math",
      "strand": "numbertheory",
      "title": "Prime & composite numbers; the sieve; primes as building blocks",
      "tier": "L3",
      "band": [
        9,
        12
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: classify a number \u2264100 as prime or composite, use the Sieve of Eratosthenes to find primes, and explain why 1 is neither prime nor composite",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.numbertheory.divisibility-rules"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a73.3 Prime Numbers",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-4 Factors"
        },
        {
          "type": "beast",
          "ref": "BA-5 Factors & Multiples"
        }
      ],
      "sources": [
        "CC 4.OA.4",
        "research/prealgebra-extension.md \u00a74A (N3)",
        "AoPS Prealgebra \u00a73.3"
      ],
      "notes": "The grade-4 prime/composite seed (\u2264100) is in multistep-4ops-patterns; this node OWNS it going forward + adds the sieve and 'why 1 is neither.' Uses divisibility rules to test candidates quickly. Misconception: '1 is prime' (it is neither); 'all odd numbers are prime' (9, 15, 21\u2026); assuming primes must be small.",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "run the Sieve of Eratosthenes on a hundreds chart: circle 2, cross its multiples, repeat; the survivors are prime",
          "check": "after crossing multiples of 2, 3, 5, 7 \u2014 why is everything left prime?"
        },
        "C": {
          "move": "try to build each number as a NON-strip rectangle of tiles \u2014 the ones that only make a 1\u00d7n strip are prime",
          "check": "which of 7, 8, 9 can only be a single strip? those are prime"
        },
        "N": {
          "move": "primes are the 'atoms' of numbers \u2014 you cannot split a group of a prime size into equal smaller groups (except 1s)",
          "check": "can 13 chairs be set in equal rows bigger than 1? why not?"
        }
      }
    },
    {
      "id": "math.placevalue.big-numbers-round",
      "domain": "math",
      "strand": "placevalue",
      "title": "Multi-digit place value to millions; rounding to any place",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: read/write/compare numbers to 1,000,000; each digit = 10\u00d7 the place to its right; round to nearest 10/100/any place",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.placevalue.three-digit-place-value"
      ],
      "helps": [
        "thinking.reasoning.estimation-sanity-check"
      ],
      "resources": [
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch1 Numbers to 10,000"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G3 ch1 \u00a71D Rounding Numbers"
        },
        {
          "type": "beast",
          "ref": "BA 2D ch10 Big Numbers"
        }
      ],
      "sources": [
        "CC 3.NBT.1",
        "CC 4.NBT.1",
        "CC 4.NBT.2",
        "CC 4.NBT.3",
        "research/math-spine.md \u00a74"
      ],
      "notes": "BA-L2 already teaches multi-digit place value (4.NBT.2) in Grade 2 (research/singapore-beast.md \u00a75.A) \u2014 band set low, BA proves it. Rounding 'digit 9' carry is the wrinkle (MA 2.4).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "read/write/compare numbers to a million in a labeled place-value chart, then round to a named place by the underline-the-digit / look-right method; connect rounding to estimation (is this answer sensible?).",
          "check": "round 4,682 to the nearest hundred; to the nearest thousand. Which digit did you look at each time?"
        },
        "G": {
          "move": "round on a number line: mark the two nearest 'landmark' multiples (nearest 10, 100, etc.), plot the number, and see which landmark it's closer to; the midpoint rounds up. Watch the digit-9 carry (a number just under a landmark).",
          "check": "on a number line to the nearest 100, is 347 closer to 300 or 400? what about 850?"
        },
        "C": {
          "move": "extend the base-ten idea with grouped bundles / a place-value disk board out to thousands: each disk traded left is worth 10x the one to its right (ten 100-disks = one 1000-disk), making 'each place is 10x the place to its right' a physical trade.",
          "check": "how many hundred-disks do you trade in to make one thousand-disk?",
          "down": "math.placevalue.three-digit-place-value"
        }
      }
    },
    {
      "id": "math.placevalue.decimal-four-ops",
      "domain": "math",
      "strand": "placevalue",
      "title": "Add, subtract, multiply & divide decimals; fluent decimal arithmetic",
      "tier": "L4",
      "band": [
        9,
        12
      ],
      "fluency_aim": {
        "metric": "problems_per_min_written",
        "target": 9,
        "sustain": "2 of 3 separate days, \u22642 errors/min",
        "source": "research/fluency-aims.md \u00a7decimal-ops (UNGROUNDED \u2014 section not yet authored)"
      },
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: add/subtract/multiply/divide decimals to hundredths using models, drawings & place-value strategies; explain where the decimal point goes",
        "L3": "SM-2 spaced gate on mixed four-op decimal items across separate days OR parent-observed spaced re-check after a gap of days (understanding gate \u2014 fires BEFORE the L4 rate gate)",
        "L4": "1-minute written timing on mixed multi-digit decimal +/\u2212/\u00d7/\u00f7 items via the standard algorithm; rate per fluency_aim (UNGROUNDED \u2014 pending research/fluency-aims.md \u00a7decimal-ops); \u22642 errors; 2 of 3 separate days"
      },
      "requires": [
        "math.placevalue.decimal-place-value-round",
        "math.addsub.add-sub-standard-algorithm",
        "math.fractions.multiply-divide-fractions"
      ],
      "helps": [
        "math.ratio.percent-concept"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a76.1 Arithmetic with Decimals",
          "record": true
        },
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a76.4 Repeating Decimals"
        },
        {
          "type": "beast",
          "ref": "BA-4 Decimals"
        },
        {
          "type": "beast",
          "ref": "BA-5 Decimals"
        }
      ],
      "sources": [
        "CC 5.NBT.7",
        "CC 6.NS.3",
        "research/prealgebra-extension.md \u00a73",
        "research/prealgebra-extension.md \u00a75 (D2)"
      ],
      "notes": "UNGROUNDED: fluency_aim target is a directional prior \u2014 no research/fluency-aims.md \u00a7decimal-ops section exists yet; needs grounding before use. THE CC-'fluently' L4 of \u00a73 (6.NS.3: fluently add/subtract/multiply/divide multi-digit decimals via the standard algorithm; 5.NBT.7 is the strategies/understanding rung). fluency_aim is UNGROUNDED: research/fluency-aims.md has no \u00a7decimal-ops rate aim yet \u2014 build-signal, NOT a guessed rate. Directional prior (to validate, NOT authored as fact): ~8\u201310 problems/min, multidigit-compound band. L4 gate fires only AFTER the L3 understanding gate. Requires standard-algorithm (\u00f7 leans on that) + multiply-divide-fractions (decimal \u00f7 ties to fraction division). Misconception: 'count the total decimal places' misapplied to addition (line up the points, not the right edges); dropping the point in multiplication; not extending the dividend with zeros in division.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "line up the decimal points for +/\u2212; for \u00d7 ignore the point, multiply, then count total decimal places; for \u00f7 shift both points to make a whole-number divisor",
          "check": "compute 4.2 \u00d7 0.05 and explain the point placement"
        },
        "G": {
          "move": "add/subtract on a place-value chart with the decimal points stacked; multiply via an area (box) model where tenths\u00d7tenths tile into hundredths",
          "check": "why does 0.3 \u00d7 0.2 = 0.06, not 0.6? show the box"
        },
        "N": {
          "move": "total a grocery receipt, split a bill evenly, or convert a per-item price \u2014 real money forces the point to matter",
          "check": "$12.60 split among 4 people \u2014 how much each?",
          "down": "math.placevalue.decimal-place-value-round"
        }
      }
    },
    {
      "id": "math.placevalue.decimal-place-value-round",
      "domain": "math",
      "strand": "placevalue",
      "title": "Deeper decimal place value to thousandths; read/write/compare; round decimals",
      "tier": "L3",
      "band": [
        8,
        11
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: name decimal place value to thousandths (each place = 1/10 the place to its left), read/write decimals in numeral/word/expanded form, compare two decimals, and round a decimal to any place",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.fractions.decimal-notation",
        "math.placevalue.big-numbers-round"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a76.2 Rounding",
          "record": true
        },
        {
          "type": "singapore",
          "ref": "PM2022 G4/G5 Decimals (place value to thousandths)"
        }
      ],
      "sources": [
        "CC 5.NBT.1",
        "CC 5.NBT.3",
        "CC 5.NBT.4",
        "research/prealgebra-extension.md \u00a75 (D1)"
      ],
      "notes": "Deeper decimal place value: 5.NBT.1 (each place = 1/10 the one to its left, 10\u00d7 to its left), 5.NBT.3 (read/write/compare to thousandths), 5.NBT.4 (round decimals). Placed in placevalue (base-ten) not a decimals strand, per adjudication. Misconception: 'longer decimal = bigger' (0.45 > 0.5 because 45 > 5) \u2014 align by place value, not digit count; treating the decimal point as a mirror line for symmetry of place names (there is no 'oneths').",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "write the decimal in expanded form (0.372 = 3\u00d70.1 + 7\u00d70.01 + 2\u00d70.001); round by finding the nearest benchmark place",
          "check": "round 4.276 to the nearest hundredth"
        },
        "G": {
          "move": "shade thousandths on a base-ten flat/rod/unit grid; stack two decimals in a place-value chart aligned on the decimal point to compare",
          "check": "which is greater, 0.4 or 0.38? show it on the grid"
        },
        "N": {
          "move": "read a race time or a price to the thousandth of a second / cent and say which of two is smaller",
          "check": "runner A is 12.08s, runner B is 12.1s \u2014 who won?",
          "down": "math.fractions.decimal-notation"
        }
      }
    },
    {
      "id": "math.placevalue.teen-numbers-place",
      "domain": "math",
      "strand": "placevalue",
      "title": "Teen numbers 11-19 as ten ones + some ones (10+n)",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: represent/write teen numbers as 10 + some more; e.g. 14 = 10 + 4",
        "L3": "SM-2 spaced gate across separate days"
      },
      "requires": [
        "math.counting.count-objects-cardinality"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math KB ch7",
          "note": "Numbers to 20 (teen numbers as 10+n)",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1A ch5",
          "note": "Numbers to 20"
        },
        {
          "type": "beast",
          "ref": "BA 2A ch1 Place Value"
        },
        {
          "type": "activity",
          "ref": "ten-frame + loose counters to build teen numbers"
        }
      ],
      "sources": [
        "CC K.NBT.1",
        "research/math-spine.md \u00a74"
      ],
      "notes": "'ten' is unmarked in English number words; teen words say the ones digit first ('four-teen' but 14) \u2192 reversal error (write 41 for fourteen) (K3 p.5-6). Fragile early node; hard prereq for make-a-ten.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "write the teen as 10 + n and as the single numeral, saying it slowly to catch the reversal trap: fourteen SOUNDS like 'four' first but is written 1 then 4, NOT 41.",
          "check": "write fourteen as a number \u2014 is it 14 or 41? write it as 10 + 4 to check."
        },
        "G": {
          "move": "draw a filled ten-frame plus loose dots, and write it as 10 + n underneath; the picture and the 10 + 4 form sit together so 'ten and four' maps to 14.",
          "check": "draw 13 as a full ten-frame plus extra dots, then write it as 10 + ___."
        },
        "C": {
          "move": "build a teen number on a ten-frame: fill one whole ten-frame (10) and put the extra loose counters beside it, then say '14 is one full ten and 4 more' \u2014 the completed ten made concrete fights the 'teen is just a big pile' view.",
          "check": "show me 16 on a ten-frame \u2014 how many fill the frame, how many are left over?",
          "down": "math.counting.count-objects-cardinality"
        }
      }
    },
    {
      "id": "math.placevalue.three-digit-place-value",
      "domain": "math",
      "strand": "placevalue",
      "title": "Three-digit place value to 1000; compare; read/write/expanded form; \u00b110/100",
      "tier": "L3",
      "band": [
        7,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: name a 3-digit number as hundreds+tens+ones, read/write in numerals and words and expanded form, compare two 3-digit numbers, mentally add/subtract 10 or 100",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.placevalue.two-digit-place-value"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 2A ch1",
          "note": "Numbers to 1,000",
          "record": true
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch1 Numbers to 1,000"
        },
        {
          "type": "beast",
          "ref": "BA 2A ch1 Place Value"
        }
      ],
      "sources": [
        "CC 2.NBT.1",
        "CC 2.NBT.3",
        "CC 2.NBT.4",
        "CC 2.NBT.8",
        "research/math-spine.md \u00a74"
      ],
      "notes": "A hundred is a bundle of TEN TENS, a genuinely new unitizing step \u2014 don't assume it transfers from tens (K3 p.8). '500 as 5 hundreds' is not automatic even for a kid who says it after 499.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "write in numerals, in words, and in expanded form (342 = 300 + 40 + 2); check that '500' is read as 5 hundreds, not automatic just because she counts past 499.",
          "check": "write four hundred seven in numerals \u2014 is there a zero in the tens place? write it as ___ + ___ + ___."
        },
        "G": {
          "move": "record the number in a hundreds|tens|ones chart and sketch flats/rods/cubes; add/subtract 10 or 100 by changing exactly one column, and compare two 3-digit numbers hundreds-first.",
          "check": "in the chart, add 100 to 462 \u2014 which column changes? which is bigger, 428 or 431?"
        },
        "C": {
          "move": "build a 3-digit number with base-ten blocks \u2014 hundred-flats, ten-rods, unit-cubes: 342 = 3 flats, 4 rods, 2 cubes; SHOW that one flat is ten ten-rods stacked (a hundred is a bundle of ten tens \u2014 a genuinely new unit, don't assume it transfers from tens).",
          "check": "build 205 with flats, rods, and cubes \u2014 how many ten-rods make one flat?",
          "down": "math.placevalue.two-digit-place-value"
        }
      }
    },
    {
      "id": "math.placevalue.two-digit-place-value",
      "domain": "math",
      "strand": "placevalue",
      "title": "Two-digit numbers as tens + ones; compare; 10-more/10-less mentally",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: name/build a 2-digit number as tens+ones (67 = 6 tens 7 ones), compare two 2-digit numbers by tens then ones, and find 10 more / 10 less",
        "L3": "SM-2 spaced gate on mixed items across separate days"
      },
      "requires": [
        "math.placevalue.teen-numbers-place"
      ],
      "helps": [],
      "resources": [
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch12",
          "note": "Numbers to 40 (tens & ones)",
          "record": true
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math 1B ch16",
          "note": "Numbers to 100"
        },
        {
          "type": "dimensions",
          "ref": "Dimensions Math KB ch12",
          "note": "Numbers to 100 (early)"
        },
        {
          "type": "singapore",
          "ref": "PM2022 G2 ch1 Numbers to 1,000"
        },
        {
          "type": "singapore",
          "ref": "PMUS 2A u1 Numbers to 1000"
        },
        {
          "type": "beast",
          "ref": "BA 2A ch1 Place Value"
        }
      ],
      "sources": [
        "CC 1.NBT.2",
        "CC 1.NBT.3",
        "CC 1.NBT.5",
        "research/math-spine.md \u00a74"
      ],
      "notes": "Unitize ten (view ten ones as one 'ten') folded in here. Decade words are opaque ('twenty' = 2 tens) \u2014 explicit teaching move (K3 p.6). Strict ridgeline: do NOT advance to 3-digit before this is L3.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "write the number in expanded form 67 = 60 + 7 and name it as '6 tens 7 ones'; unitize \u2014 the digit 6 in the tens place is worth 60, not 6 (decade words are opaque: 'twenty' = 2 tens).",
          "check": "what is the 5 worth in 53? and the 3? write 53 as ___ + ___."
        },
        "G": {
          "move": "draw the number in a tens|ones place-value chart (sticks and dots, or block sketches) and compare two numbers by looking at the TENS column first, ones only to break a tie.",
          "check": "in the chart, which is bigger, 52 or 48 \u2014 which column did you check first?"
        },
        "C": {
          "move": "build a 2-digit number with base-ten blocks / place-value disks: 67 = 6 ten-rods and 7 unit-cubes; then ADD one ten-rod for '10 more' and REMOVE one for '10 less' so the mental \u00b110 is a physical swap of a single ten.",
          "check": "build 45 with ten-rods and ones; now show me 10 more \u2014 which piece did you add?",
          "down": "math.placevalue.teen-numbers-place"
        },
        "N": {
          "move": "use dimes and pennies as the ten|one anchor \u2014 67 cents = 6 dimes + 7 pennies; trading a group of ten pennies for one dime is unitizing a ten in the real world.",
          "check": "you have 4 dimes and 2 pennies \u2014 how many cents? now add a dime \u2014 how much now?"
        }
      }
    },
    {
      "id": "math.ratio.decimals-fractions-percents-fluency",
      "domain": "math",
      "strand": "ratio",
      "title": "Convert fluently among fractions, decimals, and percents (benchmark set)",
      "tier": "L3",
      "band": [
        10,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: convert quickly among fraction, decimal, and percent for the benchmark set (\u00bd, \u00bc, \u2153, \u2155, \u215b, 1/10, 1/100)",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.ratio.percent-concept"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a76.3 Decimals and Fractions / \u00a78.1",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-5 Percents"
        }
      ],
      "sources": [
        "CC 6.RP.3c",
        "research/prealgebra-extension.md \u00a74D (R6)"
      ],
      "notes": "OPTIONAL consolidation node (\u00a74D R6) \u2014 the benchmark FDP set (\u00bd, \u00bc, \u2153, \u2155, \u215b, 1/10, 1/100). Fold into percent-concept if trimming \u2014 it is not a distinct CC standard, it is a fluency-of-conversion rung. Left L3 (not L4): benchmark recall, not a rate-gated fundamental. Flagged for adjudication (keep vs fold). Misconception: memorizing conversions without the /100 meaning; misplacing the decimal (\u00be = 0.75 = 75%, not 7.5%).",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "fraction\u2192decimal by dividing, decimal\u2192percent by \u00d7100; drill the benchmark set until recall is instant",
          "check": "give \u2153 as a decimal and a percent"
        },
        "G": {
          "move": "build a triple-labeled benchmark strip / anchor chart: each landmark shows its fraction, decimal, and percent side by side",
          "check": "cover the chart \u2014 what are \u215b as a decimal and a percent?"
        }
      }
    },
    {
      "id": "math.ratio.percent-change-applications",
      "domain": "math",
      "strand": "ratio",
      "title": "Percent increase/decrease; discounts, tax, tip, markup, interest, percent error",
      "tier": "L3",
      "band": [
        11,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: solve multistep percent problems \u2014 tax, tip, discount/markup, simple interest, percent increase/decrease, percent error \u2014 using the correct base",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.ratio.percent-concept",
        "math.ratio.proportions-solve"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a78.3 Percent Increase and Decrease",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-5 Percents (percent change)"
        }
      ],
      "sources": [
        "CC 7.RP.3",
        "research/prealgebra-extension.md \u00a74D (R5)"
      ],
      "notes": "7.RP.3: multistep percent problems \u2014 simple interest, tax, markups/markdowns, gratuities/commissions, fees, percent increase/decrease, percent error. Misconception: computing % change off the WRONG base (new vs original); a 20% rise then 20% fall does NOT return to start; adding percentages taken of different wholes.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "identify the base, compute change = percent \u00d7 base, then add (increase/tax/tip) or subtract (discount); final = base \u00b1 change",
          "check": "a $40 shirt is 25% off then 8% tax \u2014 final price?"
        },
        "G": {
          "move": "draw a bar for the original (the 100% base), then extend it for an increase or cut it for a decrease; the change is measured against the ORIGINAL bar",
          "check": "draw a $50 item marked up 20% \u2014 where does the tax/tip get measured from?"
        },
        "N": {
          "move": "shopping (sale + tax), tipping, interest on savings \u2014 money situations where the base is the thing you must pin down",
          "check": "leave a 20% tip on a $30 meal \u2014 how much total?"
        }
      }
    },
    {
      "id": "math.ratio.percent-concept",
      "domain": "math",
      "strand": "ratio",
      "title": "Percent as a rate per 100; percent\u2194fraction\u2194decimal; percent of a number; find the whole",
      "tier": "L3",
      "band": [
        10,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: read a percent as a rate per 100, convert among percent/fraction/decimal, find a percent OF a number, and find the whole given a part and the percent",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.ratio.ratio-concept",
        "math.fractions.decimal-notation",
        "math.fractions.equivalence-compare-4"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a78.1 What is a Percent / \u00a78.2 Word Problems",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-5 Percents"
        }
      ],
      "sources": [
        "CC 6.RP.3c",
        "research/prealgebra-extension.md \u00a74D (R4)"
      ],
      "notes": "6.RP.3c: percent = rate per 100 (30% = 30/100 of a quantity); find the whole given a part and the percent. The decimal\u2194fraction\u2194percent triangle completes here (\u00bd = 0.5 = 50%). requires decimal-notation for the conversions. Misconception: 'of' as addition not multiplication; '50% always means half of the answer' regardless of the whole; treating 5% as 5.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "convert percent\u2192decimal (\u00f7100) to compute 'percent of' by multiplying; set up part = percent \u00d7 whole and solve for whichever is unknown",
          "check": "find 20% of 45; then 12 is 25% of what?"
        },
        "G": {
          "move": "shade a 10\u00d710 grid (100 cells) \u2014 the shaded count IS the percent; the same grid reads as a fraction of 100 and a two-place decimal",
          "check": "shade 25 of 100 cells \u2014 that's what percent, what fraction, what decimal?"
        },
        "N": {
          "move": "a test score, a battery level, a sale sign \u2014 percent as 'how much out of the whole'",
          "check": "you got 18 of 20 \u2014 what percent?"
        }
      }
    },
    {
      "id": "math.ratio.proportions-solve",
      "domain": "math",
      "strand": "ratio",
      "title": "Set up & solve proportions; scaling; unit conversion via ratio reasoning",
      "tier": "L3",
      "band": [
        11,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: set up a proportion a/b = c/d with matching units, solve for the unknown by scaling (or cross-multiplication as a derived move), and convert measurement units by ratio reasoning",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.ratio.rates-unit-rates"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a77.3 Proportions / \u00a77.4 Conversions",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-5 Ratios & Rates (unit conversions)"
        }
      ],
      "sources": [
        "CC 6.RP.3d",
        "CC 7.RP.2c",
        "research/prealgebra-extension.md \u00a74D (R3)"
      ],
      "notes": "6.RP.3d: ratio reasoning to convert measurement units; solve a/b = c/d for an unknown (cross-multiply as a DERIVED technique, not a first move). Misconception: cross-multiplying part:part with part:whole; setting up a proportion with mismatched units top/bottom.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "write a/b = c/d with like units aligned; scale up/down, or cross-multiply and solve the resulting one-step equation",
          "check": "solve 4/6 = x/15 and say what you scaled by"
        },
        "G": {
          "move": "line up the two ratios in a table with units labeled; find the scale factor between rows/columns and apply it to the unknown",
          "check": "3 apples cost $2; scale the table to find the cost of 12 apples"
        },
        "N": {
          "move": "map scale, recipe scaling, unit conversion (miles\u2194km) \u2014 same ratio held across different sizes",
          "check": "a map says 1 in = 5 mi; how far is 3.5 in?"
        }
      }
    },
    {
      "id": "math.ratio.rates-unit-rates",
      "domain": "math",
      "strand": "ratio",
      "title": "Unit rates; rate language; constant of proportionality; proportional vs non-proportional",
      "tier": "L3",
      "band": [
        11,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: find a unit rate (incl. from a complex fraction, \u00bd mi per \u00bc hr = 2 mph), use rate language, identify the constant of proportionality k in a table/graph/equation (y = kx), and test whether a relationship is proportional (straight line through the origin)",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.ratio.ratio-concept",
        "math.fractions.multiply-divide-fractions"
      ],
      "helps": [
        "math.geometry.coordinate-plane"
      ],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a77.3 Proportions / \u00a77.5 Speed / \u00a77.6 Other Rates",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-5 Ratios & Rates"
        }
      ],
      "sources": [
        "CC 6.RP.2",
        "CC 6.RP.3b",
        "CC 7.RP.1",
        "CC 7.RP.2",
        "research/prealgebra-extension.md \u00a74D (R2)"
      ],
      "notes": "6.RP.2 unit rate a/b; 7.RP.1 unit rates from complex fractions; 7.RP.2 constant of proportionality k in tables/graphs/equations y = kx, straight-line-through-origin test, meaning of (0,0) and (1,r). y = kx is PROPORTIONAL reasoning, NOT function/slope machinery \u2014 stays below the Algebra-1 line. requires coordinate-plane (to graph a proportional relationship) + multiply-divide-fractions (complex-fraction unit rates). Misconception: inverting the rate (mph vs hours-per-mile); calling a line NOT through the origin proportional.",
      "instrument_gap": true,
      "representations": {
        "S": {
          "move": "divide to make the denominator 1; write the relationship as y = kx where k is the unit rate; check k is constant across the table",
          "check": "find k for a table where y is 10,20,30 when x is 2,4,6"
        },
        "G": {
          "move": "on a double number line or a plane, scale down to the '1' column to read the unit rate; a proportional relationship is a straight line through the origin",
          "check": "if 3 lbs cost $6, scale to 1 lb \u2014 what's the unit price?"
        },
        "N": {
          "move": "miles per hour, price per ounce, pages per minute \u2014 the 'per one' amount that lets you scale to any quantity",
          "check": "a car goes 150 miles in 3 hours \u2014 what's the speed per hour?",
          "down": "math.ratio.ratio-concept"
        }
      }
    },
    {
      "id": "math.ratio.ratio-concept",
      "domain": "math",
      "strand": "ratio",
      "title": "Ratios & ratio language; equivalent ratios; tables & tape/double-number-line diagrams",
      "tier": "L3",
      "band": [
        10,
        13
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 10 fresh items, untimed: describe a relationship with ratio language (2:1, 'for every 2 \u2026'), build a table of equivalent ratios, and represent a ratio with a tape diagram or double number line",
        "L3": "SM-2 spaced gate on mixed items across separate days OR parent-observed spaced re-check after a gap of days"
      },
      "requires": [
        "math.multdiv.mult-div-facts-memory-100",
        "math.fractions.equivalence-compare-4"
      ],
      "helps": [],
      "resources": [
        {
          "type": "aops",
          "ref": "AoPS Prealgebra \u00a77.1 What is a Ratio / \u00a77.2 Multi-way Ratios",
          "record": true
        },
        {
          "type": "beast",
          "ref": "BA-5 Ratios & Rates"
        }
      ],
      "sources": [
        "CC 6.RP.1",
        "CC 6.RP.3a",
        "research/prealgebra-extension.md \u00a74D (R1)"
      ],
      "notes": "6.RP.1: ratio as a multiplicative relationship ('2:1, for every 2 wings there was 1 beak'); 6.RP.3a: tables of equivalent ratios, tape diagrams, plot on the plane. requires equivalence-compare-4 (equivalent-ratio reasoning is equivalent-fraction reasoning). Misconception: treating a ratio ADDITIVELY (2:3 \u2192 4:5 by adding 2, instead of \u00d72 \u2192 4:6); part:part vs part:whole confusion.",
      "instrument_gap": true,
      "representations": {
        "G": {
          "move": "draw a tape diagram (2 boxes to 1 box) or a double number line with the two quantities scaling together in lockstep",
          "check": "on a double number line, if 2:1 gives 6:?, what's the missing value?"
        },
        "C": {
          "move": "lay out physical groups in the ratio (2 red : 1 blue), then copy the group to keep the ratio while the counts grow",
          "check": "build 2 red : 1 blue, then double it \u2014 what's the new ratio?"
        },
        "N": {
          "move": "recipe ratios (2 cups flour per 1 cup sugar), mixing paint, 'for every' rates in a story",
          "check": "a recipe is 2:1 flour to sugar \u2014 for 6 cups flour, how much sugar?"
        }
      }
    },
    {
      "id": "reading-writing.lc-lang-structures.sentence-anatomy",
      "domain": "reading-writing",
      "strand": "lc-lang-structures",
      "title": "Sentence anatomy: fragments vs sentences; sentence types",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: identify/fix fragments & run-ons; unscramble sentences; write & punctuate the four sentence types (statement/question/exclamation/command)",
        "L3": "spaced gate: correctly discriminates & produces complete sentences of each type on fresh prompts over spaced sessions"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "The Writing Revolution: Sentences vs. Fragments; Sentence Types; Developing Questions"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a72.3"
      ],
      "notes": "The base of The Writing Revolution spine. Nearly independent of the decoding ridgeline \u2014 a 7yo can write before she reads at ceiling (only needs basic encoding). Lives in Language Structures (Scarborough syntax strand).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.lc-literacy-knowledge.readaloud-retell",
      "domain": "reading-writing",
      "strand": "lc-literacy-knowledge",
      "title": "Listen, retell & story structure (interactive read-aloud)",
      "tier": "L3",
      "band": [
        4,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: after a read-aloud, answer W-questions and retell key events naming character / setting / problem / outcome",
        "L3": "SM-2 / spaced gate: retell & structure-identification holds across fresh read-alouds over spaced sessions"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "readaloud",
          "ref": "The Secret Series (Pseudonymous Bosch) \u2014 nightly dad read-aloud",
          "note": "Penelope's current bedtime series; bk1 done 7-13, bk2 starting 7-14",
          "record": true
        },
        {
          "type": "activity",
          "ref": "dialogic reading (Whitehurst 1988): W-question prompts, predict, connect-to-life, name/describe illustrations"
        },
        {
          "type": "activity",
          "ref": "repeated interactive read-alouds (Reading Rockets) \u2014 build narrative syntax, story recall, text-structure sensitivity"
        },
        {
          "type": "book",
          "ref": "picture books & early chapter read-alouds"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a73.2"
      ],
      "notes": "Cora's comprehension ENGINE \u2014 her Language-Comprehension strands develop orally, ahead of decoding (Simple View of Reading). Feeds the SAME LC strands Penelope uses; read-aloud is 'the top lever' for Cora.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.lc-verbal-reasoning.comprehension-strategies",
      "domain": "reading-writing",
      "strand": "lc-verbal-reasoning",
      "title": "Comprehension strategies (predict / question / monitor / summarize / text-structure)",
      "tier": "L3",
      "band": [
        6,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on fresh text: applies a named strategy correctly (prediction, self-questioning/QAR, think-aloud monitoring, summarization/GIST, text-structure/story-map, visual representation) when prompted \u2014 spoken/read-aloud modes count for a pre-decoding child",
        "L3": "spaced gate: independently deploys strategies on fresh grade-level text (or a read-aloud, orally) over spaced sessions (transfer, not recitation)"
      },
      "requires": [],
      "helps": [
        "reading-writing.wr-decoding.oral-reading-rate",
        "reading-writing.writing-composition.single-paragraph",
        "thinking.reasoning.claim-evidence"
      ],
      "resources": [
        {
          "type": "packet",
          "ref": "solar-system-2026-07-12",
          "note": "reader carries evidence-hunt / underline-the-proving-sentence comprehension items already"
        },
        {
          "type": "activity",
          "ref": "Duke & Pearson gradual-release model (describe\u2192model\u2192we-do\u2192guided\u2192independent); ride strategies ON knowledge-rich readers OR read-alouds"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a72.1",
        "research/reading-writing.md \u00a71",
        "research/reading-writing.md \u00a77"
      ],
      "notes": "GATE FIX (adj #2, Simple View of Reading / Scarborough \u00a71): language-comprehension strands develop ORALLY, in PARALLEL with decoding \u2014 NOT gated behind it. The old `requires: oral-reading-rate` locked advanced-reader Penelope AND pre-decoding Cora out; SVR = Reading Comprehension = Decoding \u00d7 Language Comprehension, both develop concurrently. Decoding fluency now a `helps` edge (it enables comprehension of PRINT, but LC develops via read-aloud first). Deliberately LEAN & L3-capped. Willingham: ~10h captures the benefit; Shanahan: ~6wk studies \u2014 teach in a short burst, then maintain through reading volume + vocab + world-knowledge (DESIGN.md thinking-skills doctrine applied to reading). Homeostasis expectation: this node should master FAST; if it lingers, the gap is knowledge/vocabulary, not strategy. Six strategies collapsed to one node (research \u00a75).",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "reading-writing.lc-verbal-reasoning.reciprocal-teaching",
      "domain": "reading-writing",
      "strand": "lc-verbal-reasoning",
      "title": "Reciprocal-teaching routine (predict / question / clarify / summarize)",
      "tier": "L3",
      "band": [
        7,
        10
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on fresh text: runs all four reciprocal-teaching moves in a structured dialogue over a chapter (predict, question, seek-clarification, summarize)",
        "L3": "spaced gate: leads the routine ('acts as teacher') on fresh chapters over spaced sessions"
      },
      "requires": [
        "reading-writing.lc-verbal-reasoning.comprehension-strategies"
      ],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "Palincsar & Brown (1984) reciprocal teaching \u2014 1-to-1 dialogue over her chapter books (War of the Worlds etc.)"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a72.1"
      ],
      "notes": "The four individual strategies packaged into a self-run routine. Strong evidence base; works 1-to-1. One routine node on top of the strategy node \u2014 do NOT proliferate a strategy strand.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.lc-vocabulary.oral-vocab",
      "domain": "reading-writing",
      "strand": "lc-vocabulary",
      "title": "Oral vocabulary (learn & use new words)",
      "tier": "L3",
      "band": [
        4,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: give/use the meaning of fresh grade-appropriate words in context (orally or written)",
        "L3": "SM-2 / spaced gate: retains & correctly uses newly-taught words across spaced reps"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "dialogic read-aloud vocabulary; 'discussion of words and their meanings' (Duke & Pearson supportive-context requirement)"
        },
        {
          "type": "book",
          "ref": "knowledge-rich read-alouds & chapter books above independent-reading level"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a71",
        "research/reading-writing.md \u00a72.1"
      ],
      "notes": "Rope interdependence: vocabulary helps EVERYTHING (would carry many cross-domain helps \u2014 reconcile phase adds them). No prereqs: oral vocabulary develops ahead of decoding for both kids. Penelope's dominant comprehension lever at 7 is vocab + reading volume + background knowledge, NOT more strategy nodes.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-decoding.blends",
      "domain": "reading-writing",
      "strand": "wr-decoding",
      "title": "Consonant blends (CCVC / CVCC / CCVCC)",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: read fresh words with initial & final blends (stop, hand, blast) holding each consonant sound distinct",
        "L3": "SM-2 spaced gate on fresh blend decoding over expanding intervals"
      },
      "requires": [
        "reading-writing.wr-decoding.digraphs-floss"
      ],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "UFLI Foundations L47\u2013L53 (blends as CCVC/CVCC word shapes, interleaved w/ digraphs)"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a73.1",
        "research/reading-writing.md \u00a76"
      ],
      "notes": "One node per research \u00a76 resolution (UFLI interleaves blends; disagreement w/ Fundations is packaging, not order). Blends \u2260 digraphs: each letter keeps its sound.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-decoding.cvc-blend",
      "domain": "reading-writing",
      "strand": "wr-decoding",
      "title": "Decode & blend CVC words",
      "tier": "L3",
      "band": [
        4,
        6
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: read ~10 fresh CVC words aloud (VC & CVC, all short vowels), sounding out then blending",
        "L3": "SM-2 spaced gate on fresh CVC decoding over expanding intervals"
      },
      "requires": [
        "reading-writing.wr-decoding.letter-sounds"
      ],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "UFLI Foundations L5\u2013L41 (VC/CVC blending, short-vowel review)"
        },
        {
          "type": "activity",
          "ref": "decodable CVC readers"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a73.1"
      ],
      "notes": "Cora's active frontier (currently ~L1/L2 at UFLI L5\u2013L10). First true reading rung.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-decoding.digraphs-floss",
      "domain": "reading-writing",
      "strand": "wr-decoding",
      "title": "Digraphs & the FLOSS doubling rule",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: read fresh words with sh/ch/th/wh/ph/ng/nk/ck and FLOSS (ff/ll/ss/zz) endings",
        "L3": "SM-2 spaced gate on fresh digraph + FLOSS decoding over expanding intervals"
      },
      "requires": [
        "reading-writing.wr-decoding.cvc-blend"
      ],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "UFLI Foundations L42\u2013L53 (FLSZ rule, ck, sh, th, ch, wh/ph, ng, nk)"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a73.1",
        "research/reading-writing.md \u00a72.4"
      ],
      "notes": "Digraphs = one grapheme, two letters. FLOSS = double f/l/s/z after a short vowel. Blends interleave here per UFLI (see next node).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-decoding.letter-sounds",
      "domain": "reading-writing",
      "strand": "wr-decoding",
      "title": "Letter-sound correspondences",
      "tier": "L4",
      "band": [
        4,
        6
      ],
      "fluency_aim": {
        "metric": "sounds_per_min",
        "target": 50,
        "target_range": "\u224840\u201360 sounds/min [EXTRAPOLATED]",
        "sustain": "2 of 3 separate days",
        "source": "research/reading-writing.md \u00a74.1 [EXTRAPOLATED \u2014 no cited primary letter-sound rate; PT-neighborhood estimate, NOT a Hasbrouck-Tindal/PT-standard number]"
      },
      "gates": {
        "L2": "\u226590% untimed: name the sound for each single grapheme on a fresh mixed set (consonants + short vowels)",
        "L3": "SM-2 spaced gate on mixed fresh letter-sound items over expanding intervals",
        "L4": "rate per fluency_aim [EXTRAPOLATED] \u2014 gumball timed-sprint (letter-sound flashes) or parent-entered paper timed sheet; automatic letter-sounds free WM for blending. MEASURE a baseline before treating 50 as the aim."
      },
      "requires": [
        "reading-writing.wr-phon-awareness.phoneme-blend-seg"
      ],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "UFLI Foundations L1\u2013L34 (letter-sound intro sequence)"
        },
        {
          "type": "gumball",
          "ref": "generator:spelling",
          "note": "letter-sound reinforcement"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a73.1",
        "research/reading-writing.md \u00a74.1"
      ],
      "notes": "Fluency-tier (L4): automatic single-grapheme sound retrieval is a precision-teaching fundamental. Cora ~L2/L3 (she sounds out CVC). AIM FLAGGED [EXTRAPOLATED] (adj #4): the ~40\u201360 sounds/min figure is the precision-teaching NEIGHBORHOOD (reading-writing \u00a74.1), NOT a cited primary/PT-standard number \u2014 no letter-sound rate appears in the fluency-aims brief (which gives Cora NO L4 rate nodes at v1). Measure a real baseline before treating 50 as the aim. Corrected from the prior 'brief owns the exact number' claim, which was false \u2014 the brief owns WCPM (Hasbrouck-Tindal), not letter-sound rate.",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-decoding.multisyllable",
      "domain": "reading-writing",
      "strand": "wr-decoding",
      "title": "Syllable types & multisyllabic decoding",
      "tier": "L3",
      "band": [
        6,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: decode fresh 2\u20133 syllable words by dividing into the six syllable types (closed/open/VCe/vowel-team/r-controlled/consonant-le)",
        "L3": "SM-2 spaced gate on fresh multisyllabic decoding over expanding intervals"
      },
      "requires": [
        "reading-writing.wr-decoding.vowel-teams"
      ],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "UFLI Foundations L63\u2013L76 (-es/-ed/-ing, syllables, compound words, open/closed, -tch/-dge, -le)"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a73.1",
        "research/reading-writing.md \u00a72.4"
      ],
      "notes": "The bridge from word-level to fluent connected-text reading. Penelope decode-done here; Cora reaches it later.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-decoding.oral-reading-rate",
      "domain": "reading-writing",
      "strand": "wr-decoding",
      "title": "Oral reading fluency (connected text, WCPM)",
      "tier": "L4",
      "band": [
        6,
        9
      ],
      "fluency_aim": {
        "metric": "wcpm",
        "target": 112,
        "target_range": "112 (target) \u2014 floor 91",
        "sustain": "median of 2\u20133 unpracticed passages, on 2 of 3 separate days",
        "source": "research/fluency-aims.md \u00a74 (Hasbrouck & Tindal 2017, TR-1702, Table 4) + \u00a78 Penelope row"
      },
      "gates": {
        "L2": "reads a fresh grade-appropriate passage aloud with \u226590% word accuracy, untimed (accuracy before rate)",
        "L3": "SM-2 / repeated-reading gate: accurate reading holds across spaced fresh passages",
        "L4": "WCPM per fluency_aim = MEDIAN of 2\u20133 cold unpracticed passages at her reading level, parent-timed (errors counted separately, \u226590% accuracy); met on 2 of 3 separate days"
      },
      "requires": [
        "reading-writing.wr-decoding.multisyllable",
        "reading-writing.wr-sight-recognition.hfw"
      ],
      "helps": [
        "math.addsub.wp-result-unknown",
        "math.addsub.wp-change-addend-compare",
        "math.addsub.wp-start-unknown-two-step",
        "math.multdiv.mult-div-word-problems"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "cold-read grade-level passages + repeated-reading protocol; parent times & counts errors (WCPM)"
        }
      ],
      "sources": [
        "research/fluency-aims.md \u00a74",
        "research/reading-writing.md \u00a74.2",
        "research/reading-writing.md \u00a71"
      ],
      "notes": "AIM GROUNDED (adj #4, no fabricated WCPM): target 112 WCPM = grade-3 SPRING 50th percentile, floor 91 = grade-3 spring 25th percentile \u2014 Hasbrouck & Tindal 2017 (TR-1702) Table 4, read from the primary PDF (fluency-aims \u00a74). Indexed to her READING level (she reads chapter books ~grade 3-4), NOT chronological grade, per the norm's own design + fluency-aims \u00a78 Penelope row. Grade-2 spring 50th (100 WCPM) is the already-CLEARED rung. Score as the MEDIAN of 2-3 unpracticed passages (never a single read); errors counted separately. L4 is a GAUGE of the whole Word-Recognition bundle's automaticity, NOT a standalone skill (Scarborough: fluency is not a strand). Penelope's frontier (Cora far later \u2014 her grade-1 winter 50th = 29 / spring = 60 WCPM row applies only once she reads connected text). Accuracy gates BEFORE the rate gate \u2014 never race an inaccurate reader.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-decoding.silent-e",
      "domain": "reading-writing",
      "strand": "wr-decoding",
      "title": "VCe / silent-e (magic e)",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: read fresh a_e/i_e/o_e/u_e/e_e words + soft _ce/_ge; contrast with the CVC short-vowel version (cap/cape)",
        "L3": "SM-2 spaced gate on fresh silent-e decoding over expanding intervals"
      },
      "requires": [
        "reading-writing.wr-decoding.blends"
      ],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "UFLI Foundations L54\u2013L62 (a_e\u2026u_e, _ce /s/, _ge /j/, exceptions)"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a73.1",
        "research/reading-writing.md \u00a72.4"
      ],
      "notes": "First long-vowel spelling. Shared node: Cora reads it, Penelope's matching ENCODING node (spell-silent-e-vowelteams) requires this via a decode\u2192encode ordering.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-decoding.vowel-teams",
      "domain": "reading-writing",
      "strand": "wr-decoding",
      "title": "Vowel teams & r-controlled vowels",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: read fresh words with long vowel teams (ai/ay, ee/ea, oa/ow, igh) + r-controlled (ar/or/er/ir/ur) + diphthongs (oi/oy, ou/ow)",
        "L3": "SM-2 spaced gate on fresh vowel-team & r-controlled decoding over expanding intervals"
      },
      "requires": [
        "reading-writing.wr-decoding.silent-e"
      ],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "UFLI Foundations L77\u2013L98 (r-controlled, long vowel teams, other vowel teams, diphthongs, silent letters kn/wr/mb)"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a73.1",
        "research/reading-writing.md \u00a72.4"
      ],
      "notes": "Collapses several UFLI phases (r-controlled + vowel teams + diphthongs) into one milestone node per the coarse-ladder mandate (research \u00a77 rec 2). Penelope's active ORTHOGRAPHIC error zone lives here (spelling side).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-encoding.morphology",
      "domain": "reading-writing",
      "strand": "wr-encoding",
      "title": "Morphology: prefixes, suffixes & roots (spelling + vocabulary)",
      "tier": "L3",
      "band": [
        7,
        10
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: segment fresh words into prefix+base+suffix; build word 'sums' (re+play+ing); spell affixed words; give meaning from morphemes",
        "L3": "gumball spelling SM-2 gate on morphologically-complex words + demonstrated meaning-from-morpheme on fresh words over spaced reps"
      },
      "requires": [
        "reading-writing.wr-encoding.suffix-rules"
      ],
      "helps": [
        "reading-writing.lc-vocabulary.oral-vocab",
        "reading-writing.lc-verbal-reasoning.comprehension-strategies"
      ],
      "resources": [
        {
          "type": "gumball",
          "ref": "generator:spelling",
          "note": "harvest morphologically-complex words from her writing"
        },
        {
          "type": "activity",
          "ref": "compound words \u2192 inflections \u2192 prefixes (un-/re-/pre-/dis-/mis-) \u2192 derivational suffixes \u2192 Latin/Greek roots \u2192 word families (sign/signal/signature)"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a72.2"
      ],
      "notes": "Penelope's SINGLE highest-leverage lever (Bowers/Kirby/Deacon 2010: works for younger, best for orthographic-error profiles, more effective COMBINED with other literacy). English spelling encodes MEANING not just sound \u2014 attacks her exact error class AND compounds into vocabulary. helps oral-vocab + comprehension (vocab lever).",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-encoding.spell-cvc-digraph-blend",
      "domain": "reading-writing",
      "strand": "wr-encoding",
      "title": "Spell CVC, digraphs, blends & FLOSS",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: spell fresh CVC / digraph / blend / FLOSS words from dictation",
        "L3": "gumball spelling SM-2 gate (repetitions\u22653 AND times_correct\u22654) on words of these patterns \u2014 this IS the schema.md L3 gate; roll mastered words up to the pattern"
      },
      "requires": [
        "reading-writing.wr-decoding.cvc-blend"
      ],
      "helps": [],
      "resources": [
        {
          "type": "gumball",
          "ref": "generator:spelling",
          "note": "Word Architect SM-2 bank; map mastered CVC/digraph/blend words here (many-to-one, like review-pack\u2192skill)"
        },
        {
          "type": "activity",
          "ref": "UFLI Foundations encoding for L42\u2013L53 patterns"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a72.4",
        "research/reading-writing.md \u00a74.3"
      ],
      "notes": "Author-added strand wr-encoding (NOT in Scarborough 2001) \u2014 encoding is the write-direction of the same grapheme-phoneme knowledge as decoding. Penelope: mostly mastered (CVC), FLOSS/digraph tail is error-zone. Requires the DECODE node of the same pattern.",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-encoding.spell-silent-e-vowelteams",
      "domain": "reading-writing",
      "strand": "wr-encoding",
      "title": "Spell silent-e & vowel teams",
      "tier": "L3",
      "band": [
        6,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: spell fresh silent-e (a_e\u2026) and vowel-team (ai/ee/oa/igh\u2026) words from dictation",
        "L3": "gumball spelling SM-2 gate on silent-e / vowel-team words \u2014 roll mastered words up to this pattern"
      },
      "requires": [
        "reading-writing.wr-encoding.spell-cvc-digraph-blend",
        "reading-writing.wr-decoding.silent-e"
      ],
      "helps": [],
      "resources": [
        {
          "type": "gumball",
          "ref": "generator:spelling",
          "note": "map mastered silent-e/vowel-team words (e.g. skate, plate) here"
        },
        {
          "type": "activity",
          "ref": "UFLI Foundations encoding for L54\u2013L98 patterns"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a72.4",
        "research/reading-writing.md \u00a74.3"
      ],
      "notes": "Penelope's ACTIVE orthographic error zone (vowel teams, silent-e \u2014 she spells by sound; sound-spellings are plausible but wrong). Seed L1/L2 except where gumball SM-2 already confirms specific words.",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-encoding.suffix-rules",
      "domain": "reading-writing",
      "strand": "wr-encoding",
      "title": "Suffix spelling rules: doubling / drop-e / y-to-i",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: apply the three rules to fresh words \u2014 doubling (hop\u2192hopping), drop-e (hope\u2192hoping), y-to-i (try\u2192tries) \u2014 spelling from dictation",
        "L3": "gumball spelling SM-2 gate on suffix-rule words (hoping/hopped/tried\u2026) \u2014 roll mastered words up here"
      },
      "requires": [
        "reading-writing.wr-encoding.spell-silent-e-vowelteams"
      ],
      "helps": [],
      "resources": [
        {
          "type": "gumball",
          "ref": "generator:spelling"
        },
        {
          "type": "activity",
          "ref": "UFLI Foundations L107\u2013L110 (doubling 1-1-1, drop-e, change y-to-i)"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a72.4"
      ],
      "notes": "Highest-value orthographic node for a phonetic speller \u2014 inflection + spelling changes are exactly where she stumbles (build 1/9, cycle 1/8). The three rules verified in research \u00a72.4.",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-phon-awareness.phoneme-blend-seg",
      "domain": "reading-writing",
      "strand": "wr-phon-awareness",
      "title": "Blend & segment phonemes (CVC)",
      "tier": "L3",
      "band": [
        4,
        6
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: orally blend & segment ~10 fresh CVC words (say each sound, then the word; and vice-versa), no letters",
        "L3": "SM-2 spaced gate (3+ spaced reps, 4+ lifetime correct) on mixed fresh CVC blend/segment items over expanding intervals"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "gumball",
          "ref": "generator:spelling",
          "note": "sound-out coach exercises phonemic segmentation"
        },
        {
          "type": "activity",
          "ref": "oral sound games: elkonin-box / stretch-and-blend (no print)"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a73.1",
        "research/reading-writing.md \u00a71"
      ],
      "notes": "Phonological-awareness precursor to decoding (Rope Word-Recognition bundle). Purely oral \u2014 no grapheme mapping yet. Cora's true starting rung.",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "reading-writing.wr-sight-recognition.hfw",
      "domain": "reading-writing",
      "strand": "wr-sight-recognition",
      "title": "High-frequency / trick words (automatic sight reading)",
      "tier": "L4",
      "band": [
        5,
        8
      ],
      "fluency_aim": {
        "metric": "words_per_min_flashed",
        "target": 60,
        "target_range": "\u224860 flashed words/min [EXTRAPOLATED]",
        "sustain": "2 of 3 separate days",
        "source": "research/fluency-aims.md \u00a72b (CentralReach sight-reading 120\u201380 wpm is CONNECTED reading, not flashed single trick-words) [EXTRAPOLATED down for single-word flash]"
      },
      "gates": {
        "L2": "\u226590% untimed: read a fresh set of grade-level high-frequency / irregular 'trick' words correctly",
        "L3": "SM-2 spaced gate on fresh HFW reading over expanding intervals",
        "L4": "rate per fluency_aim [EXTRAPOLATED] \u2014 flashed-word timed sprint (gumball) or parent-entered flashcard timing; automatic HFW frees WM for connected-text reading. MEASURE a baseline before treating 60 as the aim."
      },
      "requires": [
        "reading-writing.wr-decoding.letter-sounds"
      ],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "Fundations L1 'Trick Words' list; Dolch/Fry high-frequency word lists"
        }
      ],
      "sources": [
        "research/fluency-aims.md \u00a72b",
        "research/reading-writing.md \u00a74.1",
        "research/reading-writing.md \u00a75"
      ],
      "notes": "Fluency-tier (L4): sight-recognition IS the automatic end of the Word-Recognition bundle (Scarborough). Both kids. Requires letter-sounds only (many HFW are irregular, not decoded). AIM FLAGGED [EXTRAPOLATED] (adj #4): NO flashed-single-word rate exists in the cited sources \u2014 the closest is CentralReach's sight-reading 120\u201380 correct words/min (fluency-aims \u00a72b), which is CONNECTED-text reading, so 60/min is a conservative extrapolation DOWN for isolated flashed trick-words. Corrected from the prior 'brief owns the number' claim, which was false. Measure a real baseline first.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.writing-composition.sentence-expansion",
      "domain": "reading-writing",
      "strand": "writing-composition",
      "title": "Sentence expansion & elaboration (because/but/so, question words, combining, appositives)",
      "tier": "L3",
      "band": [
        6,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: expand a kernel sentence 3 ways with because/but/so; answer who/what/when/where/why/how to elaborate; combine choppy sentences; add an appositive",
        "L3": "spaced gate: produces varied, elaborated sentences on fresh prompts over spaced sessions"
      },
      "requires": [
        "reading-writing.lc-lang-structures.sentence-anatomy"
      ],
      "helps": [
        "thinking.inquiry.consider-both-sides"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "The Writing Revolution: because/but/so; subordinating conjunctions; appositives; sentence combining; sentence expansion (always start with 'when')"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a72.3"
      ],
      "notes": "Author-added strand writing-composition (NOT in Scarborough 2001). The because/but/so activity is the fastest win AND doubles as a thinking-skills exercise (cause/contrast/consequence) \u2014 reconcile phase adds a helps edge into the thinking domain. Cap L3 (never gamify writing speed).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "reading-writing.writing-composition.single-paragraph",
      "domain": "reading-writing",
      "strand": "writing-composition",
      "title": "Single Paragraph Outline \u2192 paragraph (+ note-taking, summarizing, transitions)",
      "tier": "L3",
      "band": [
        7,
        10
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% untimed: build a Single Paragraph Outline (topic sentence \u2192 dotted supporting details in NOTE form \u2192 concluding sentence), then expand notes into a coherent paragraph with transitions; summarize a text to its gist",
        "L3": "spaced gate: independently plans-then-writes a coherent paragraph on fresh content over spaced sessions"
      },
      "requires": [
        "reading-writing.writing-composition.sentence-expansion"
      ],
      "helps": [
        "reading-writing.lc-verbal-reasoning.comprehension-strategies"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "The Writing Revolution: Single Paragraph Outline (SPO), note-taking/abbreviating, summarizing, transition words"
        }
      ],
      "sources": [
        "research/reading-writing.md \u00a72.3"
      ],
      "notes": "Trains the planning\u2260composing distinction (jot a note vs write a sentence) \u2014 highest-leverage move for a 7yo who generates sentences but can't yet organize them. Summarizing here is the SAME skill as the comprehension summarize strategy (helps edge). Multi-paragraph outline (MPO) is the later extension, not authored in this skeleton. Cap L3.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "thinking.inquiry.consider-both-sides",
      "domain": "thinking",
      "strand": "inquiry",
      "title": "Give a reason for AND against before deciding",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "On a fresh two-sided prompt with two printed stems ('One reason yes: ___ / One reason no: ___'), gives a reason on BOTH sides, parent-scored on-target, untimed.",
        "L3": "Weighs both sides AND then decides with a reason on tagged items across \u22652 DIFFERENT domains, AND holds on a spaced re-encounter."
      },
      "requires": [],
      "helps": [
        "thinking.reasoning.claim-evidence"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "tag:consider-both-sides on a world-models read-aloud dilemma ('should the town build the dam?' \u2014 one reason for, one against)",
          "note": "P4C/argument move scaled down (\u00a72.1); a build/buy signal \u2014 two-sided reason stems are NOT yet a standard packet item type (\u00a74)"
        }
      ],
      "sources": [
        "research/thinking-skills.md \u00a72.1",
        "https://pmc.ncbi.nlm.nih.gov/articles/PMC12565533/"
      ],
      "notes": "P4C-style dialogue moves reasoning behavior (2025 meta-analysis g\u22480.56\u20130.73) but is NULL on standardized attainment (\u00a72.1, \u00a76.1) \u2014 author for reasoning behavior, not a test-score lift. band [6,8]: weighing two views is developmentally later. BUILD/BUY: two-sided reason-stem item type does not exist in packetlib yet. Parent-observation is PRIMARY here \u2014 hard to auto-score (\u00a73.1 #12).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "thinking.inquiry.question-formulation",
      "domain": "thinking",
      "strand": "inquiry",
      "title": "Ask and sort your own questions (QFT gear)",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "On a fresh stimulus (a QFocus: picture/object/table/reader), produces \u22655 questions and sorts each as open- vs closed-ended, parent-scored on-target, untimed. Cora may respond verbally/by drawing (adult scribes).",
        "L3": "Produces open+closed questions AND prioritizes (picks the most-worth-answering one with a why) on tagged items across \u22652 DIFFERENT domains, AND holds on a spaced re-encounter (the SM-2 review-pack surfaces a question-formulation tag again \u22651 later session)."
      },
      "requires": [],
      "helps": [
        "thinking.inquiry.consider-both-sides",
        "thinking.metacog.plan-the-approach"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "tag:question-formulation on a world-models reader QFocus (end a reader with 'here is a photo of a dam \u2014 ask 5 questions')",
          "note": "QFT format, RQI 7-step; not a standalone subject (\u00a77.8)"
        },
        {
          "type": "packet",
          "ref": "solar-system-2026-07-12",
          "note": "reader prediction / 'what do you still wonder' prompts already exercise this \u2014 tag them (\u00a74)"
        },
        {
          "type": "gumball",
          "ref": "generator:input_ask_question",
          "note": "'your turn to ask' free-text; count + parent adjudication (\u00a73.1 #1)"
        }
      ],
      "sources": [
        "research/thinking-skills.md \u00a72.2",
        "https://rightquestion.org/what-is-the-qft/"
      ],
      "notes": "QFT is practitioner/design literature, not RCT-backed (\u00a72.2 [C]); author for engagement + the open/closed + prioritize moves, measured as behavior. For non-writers (Cora) the QFocus is a picture/object and drawing/verbal answers count.",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "thinking.metacog.check-your-work",
      "domain": "thinking",
      "strand": "metacog",
      "title": "Re-verify by a different method and catch errors",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "Checks her answer UNPROMPTED (by the same method) on fresh items, parent-observed (the behavior occurred), untimed.",
        "L3": "Checks by a DIFFERENT method (inverse op / estimate) AND catches a PLANTED error, on tagged items across \u22652 DIFFERENT domains, AND holds on a spaced re-encounter. Gate on the CATCH, never on her saying she checked."
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "tag:check-your-work on planted-error 'find the mistake' items (a deliberately wrong worked example she must catch); math 'check by a different method' (add up to verify a subtraction)",
          "note": "gate on the catch, not self-report (\u00a72.6 age-8 caveat)"
        },
        {
          "type": "packet",
          "ref": "elapsed-time-2026-07-12",
          "note": "fade-the-scaffold last item + self-check already ships; extend with an explicit 'find the mistake' item type (\u00a74 \u2014 planted-error items to add)"
        },
        {
          "type": "gumball",
          "ref": "generator:check-a-different-way",
          "note": "BUILD/BUY: after an answer, a 'check it a different way' second step (\u00a73.1 #9)"
        }
      ],
      "sources": [
        "research/thinking-skills.md \u00a72.4",
        "research/thinking-skills.md \u00a72.6"
      ],
      "notes": "Reasonableness + self-monitoring. CRITICAL: gate on the CATCH (binary, fresh, no self-report), NOT on the child saying she understood/checked \u2014 self-knowledge stays inaccurate until ~age 8 (Muijs 2020, \u00a72.6). Planted-error items are the cleanest gate; the ed-packet trap machinery already builds near-neighbors (\u00a75 instrument 3).",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "thinking.metacog.plan-the-approach",
      "domain": "thinking",
      "strand": "metacog",
      "title": "Name the problem type and pick a strategy first",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "Before starting a multi-step item, NAMES the problem type when prompted (a 'first I will ___' planning box), parent-scored on-target, untimed.",
        "L3": "Plans UNPROMPTED and picks an appropriate strategy, on tagged items across \u22652 DIFFERENT domains, AND holds on a spaced re-encounter."
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "tag:plan-the-approach on a 'first I will ___' planning box before a multi-step math item; reading 'what's your plan \u2014 reread? skim?'; world-models 'how would you find out?'",
          "note": "BUILD/BUY: a planning-box item type is not yet standard in packetlib (\u00a74)"
        }
      ],
      "sources": [
        "research/thinking-skills.md \u00a73.1 #11",
        "research/thinking-skills.md \u00a72.6"
      ],
      "notes": "Planning is part of the metacognition umbrella (EEF +7 months, high security; \u00a72.6). Hard to auto-score \u2192 PARENT-OBSERVATION PRIMARY, and gate on the observed plan, not a self-rating (\u00a72.6 caveat, \u00a75 instrument 2). BUILD/BUY: planning-box item type to add to packetlib.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "thinking.metacog.spot-the-trap",
      "domain": "thinking",
      "strand": "metacog",
      "title": "Detect a plausible-but-wrong option",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "Avoids a TAUGHT trap on fresh items (e.g. 6 pennies look like more than a nickel; a tilted slice looks unequal), parent- or auto-scored on-target, untimed.",
        "L3": "Avoids a trap AND its COUNTER-trap (doesn't over-apply the rule \u2014 6 pennies DO beat a nickel by count) and can explain why it was a trap, on tagged items across \u22652 DIFFERENT domains, AND holds on a spaced re-encounter."
      },
      "requires": [],
      "helps": [
        "thinking.metacog.check-your-work"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "tag:spot-the-trap on ed-packet honest traps + counter-traps (money: 6 pennies vs a nickel; fractions: a tilted slice); reading 'the tricky answer that seems right'",
          "note": "traps are already in every packet; the key tells the grading parent what the wrong-looking answer means \u2014 tag them (\u00a74)"
        },
        {
          "type": "packet",
          "ref": "money-2026-07-12",
          "note": "more-coins-vs-more-money trap + counter-trap already ships (\u00a74)"
        },
        {
          "type": "gumball",
          "ref": "generator:input_multiple_choice",
          "note": "distractor-heavy MC (\u00a73.1 #10) \u2014 the trap variant, NOT the trivia MC (evidence-inventory caveat #2)"
        }
      ],
      "sources": [
        "research/thinking-skills.md \u00a73.1 #10",
        "research/thinking-skills.md \u00a74"
      ],
      "notes": "The ed-packet 'one honest trap \u2026 include a COUNTER-trap' convention (SKILL.md \u00a71) already exercises this \u2014 tag it (\u00a74). The counter-trap is essential: L3 requires NOT over-generalizing the trap rule.",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "thinking.reasoning.claim-evidence",
      "domain": "thinking",
      "strand": "reasoning",
      "title": "Make a claim and point to the evidence",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "On fresh items, attaches CORRECT text/figure evidence to a claim using the stem 'I think ___ because the text/picture/data says ___', parent-scored on-target, untimed.",
        "L3": "Does claim+evidence AND rejects a claim that has NO supporting evidence, on tagged items across \u22652 DIFFERENT domains, AND holds on a spaced re-encounter."
      },
      "requires": [],
      "helps": [
        "thinking.inquiry.consider-both-sides"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "tag:claim-evidence on any reader evidence-hunt item ('underline the sentence that proves it') + an 'I think ___ because ___' stem",
          "note": "the underline IS the evidence step; the key quotes the evidence sentence verbatim (\u00a74)"
        },
        {
          "type": "packet",
          "ref": "solar-system-2026-07-12",
          "note": "evidence-hunt / underline-the-proving-sentence items already ship (\u00a74)"
        },
        {
          "type": "gumball",
          "ref": "generator:input_pattern",
          "note": "highlight-the-evidence interaction (\u00a73.1 #4)"
        }
      ],
      "sources": [
        "research/thinking-skills.md \u00a72.5",
        "https://www.pearson.com/us/higher-education/program/Mc-Neill-Supporting-Grade-5-8-Students-in-Constructing-Explanations-in-Science/PGM105262.html"
      ],
      "notes": "CER (McNeill & Krajcik, from Toulmin) targets grades 5\u20138; for THIS age run claim+evidence ONLY with sentence-starters, defer 'reasoning'/counterclaims (\u00a72.5, \u00a76.3). Penelope has real L1\u2013L2 evidence in the packets' evidence-hunt work \u2192 seed early (\u00a75, \u00a77.7).",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "thinking.reasoning.compare-contrast",
      "domain": "thinking",
      "strand": "reasoning",
      "title": "Name same and different on a chosen dimension",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "On a fresh pair, names both SAME and DIFFERENT on a CHOSEN dimension (not just one difference), parent-scored on-target, untimed.",
        "L3": "Uses a comparison to make a decision or claim, on tagged items across \u22652 DIFFERENT domains, AND holds on a spaced re-encounter."
      },
      "requires": [],
      "helps": [
        "thinking.reasoning.claim-evidence",
        "thinking.reasoning.deep-structure-transfer"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "tag:compare-contrast on ed-packet boxed comparison pairs: two characters/books, two fractions/shapes, two animals/planets",
          "note": "packets already box comparison pairs (gestalt rule) \u2014 tag them (\u00a74)"
        },
        {
          "type": "gumball",
          "ref": "generator:two-column-same-different",
          "note": "two-column same/different interaction (\u00a73.1 #7)"
        }
      ],
      "sources": [
        "research/thinking-skills.md \u00a73.1 #7",
        "research/thinking-skills.md \u00a74"
      ],
      "notes": "The ed-packet 'box each comparison pair' convention already exercises this \u2014 tag it (\u00a74). Gate on comparing on a CONSISTENT dimension, not scattershot differences.",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "thinking.reasoning.deep-structure-transfer",
      "domain": "thinking",
      "strand": "reasoning",
      "title": "Recognize a new problem is 'the same kind' as a known one",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "On matched-structure item PAIRS (same deep structure, different cover story \u2014 e.g. change-making vs elapsed time), recognizes the same structure when the surface changes and reuses the method, parent-scored, untimed.",
        "L3": "SPONTANEOUSLY says 'this is like ___' and reuses the method, on tagged items across \u22652 DIFFERENT domains, AND holds on a spaced re-encounter. Expect this to LAG \u2014 keep it aspirational."
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "tag:deep-structure-transfer on matched-structure item pairs (count-up change \u2194 two-hop elapsed time; clock quarters \u2194 coin quarters \u2194 fraction quarters)",
          "note": "targeted packet design, not off-the-shelf; the cross-domain content `helps` edges (clock\u2194coin\u2194fraction) are its substrate \u2014 added in the reconcile phase (\u00a77.3)"
        }
      ],
      "sources": [
        "research/thinking-skills.md \u00a71",
        "https://www.readingrockets.org/topics/comprehension/articles/critical-thinking-why-it-so-hard-teach"
      ],
      "notes": "THE Willingham transfer move (\u00a71) and the whole point of the thinking domain \u2014 learners fixate on surface structure and miss deep structure (only ~19% spontaneously transferred a structurally identical problem in his cited experiments). Hardest gear node; expect it to lag; seed L0/L1 and keep aspirational (\u00a75, \u00a77.7). band [6,8]. requires is empty by design \u2014 it is fed by cross-domain `helps` edges FROM content nodes, added in the reconcile phase, NOT by within-thinking prereqs.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "thinking.reasoning.estimation-sanity-check",
      "domain": "thinking",
      "strand": "reasoning",
      "title": "Estimate 'about how many' and check reasonableness",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "On fresh items, answers 'is it closer to A or B?' (or 'more/less than N?') with a STATED reason, parent- or auto-scored on-target, untimed.",
        "L3": "Estimates-then-CHECKS a computed answer for reasonableness (catches an unreasonable result) on tagged items across \u22652 DIFFERENT contexts (math + a real-world count), AND holds on a spaced re-encounter."
      },
      "requires": [],
      "helps": [
        "thinking.metacog.check-your-work",
        "math.measure.length-ruler",
        "math.measure.measure-fraction-inch-convert"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "tag:estimation-sanity-check on 'estimate \u2192 compute \u2192 was it reasonable?' items; real-world 'about how many kids fit in the gym?' counts",
          "note": "start with very small, visualizable quantities, then scale up; always ask WHY (\u00a72.4)"
        },
        {
          "type": "gumball",
          "ref": "generator:estimation-sanity-check",
          "note": "BUILD/BUY: 'estimate \u2192 compute \u2192 reasonableness' item type \u2014 auto-scores estimate band + reasonableness check; build this FIRST (\u00a74, \u00a77.5)"
        }
      ],
      "sources": [
        "research/thinking-skills.md \u00a72.4",
        "https://www.countingwithkids.com/early-math/learning-to-estimate"
      ],
      "notes": "Fermi-for-kids + reasonableness (\u00a72.4 [B/C]). Estimation is a REASONING act (self-explanation applied to number sense) \u2014 the 'why' is what makes it an informed guess. Highest-automation gear node: gumball can auto-generate and score both the estimate band and the reasonableness check \u2192 BUILD THIS ITEM TYPE FIRST (\u00a77.5). Weak number sense = a child who accepts any answer without asking if it's reasonable.",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "thinking.reasoning.pattern-rule",
      "domain": "thinking",
      "strand": "reasoning",
      "title": "Extend a pattern and articulate the rule",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "On fresh patterns, extends correctly AND ARTICULATES the rule ('+3 each time'), parent- or auto-scored on-target, untimed.",
        "L3": "Predicts a FAR term and spots a BROKEN pattern, on tagged items across \u22652 DIFFERENT domains, AND holds on a spaced re-encounter."
      },
      "requires": [],
      "helps": [
        "thinking.reasoning.deep-structure-transfer"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "tag:pattern-rule on math skip-count / growing patterns / function-machine in-out tables; reading rhyme/story-structure; world-models day-night & seasons cycles",
          "note": "needs an explicit 'state the rule' prompt added to sequence items (\u00a74 \u2014 partial)"
        },
        {
          "type": "gumball",
          "ref": "generator:pattern-rule-in-out-machine",
          "note": "BUILD/BUY: deterministic in-out-machine generator whose key stores the RULE, not just the next term (\u00a74, \u00a73.1 #6)"
        }
      ],
      "sources": [
        "research/thinking-skills.md \u00a73.1 #6",
        "research/thinking-skills.md \u00a74"
      ],
      "notes": "Existing sequence/number-line items partly exercise this but lack an explicit 'state the rule' prompt \u2014 a build/buy signal for a richer pattern item type (\u00a74). Answer key must store the RULE, not just the next term. Gate on saying the rule, not copying the visual.",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "thinking.reasoning.self-explanation",
      "domain": "thinking",
      "strand": "reasoning",
      "title": "Say WHY a step or fact is true",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "On fresh 'explain why' items with a SCAFFOLDED stem (sentence-starter or pick-the-reason menu, not a blank), gives a correct on-target reason, parent-scored, untimed.",
        "L3": "Self-explains UNPROMPTED (and can explain a worked example's step) on tagged items across \u22652 DIFFERENT domains, AND holds on a spaced re-encounter."
      },
      "requires": [],
      "helps": [
        "thinking.reasoning.claim-evidence",
        "thinking.reasoning.estimation-sanity-check"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "tag:self-explanation on any ed-packet 'explain why' production item (e.g. fractions 'why is 1/3 bigger than 1/4?')",
          "note": "the strongest embed-friendly lever; use a structured stem to harvest the full effect (\u00a72.3 moderator)"
        },
        {
          "type": "packet",
          "ref": "fractions-2026-07-12",
          "note": "'explain why' production items + open-writing sentence-starter (\u00a74)"
        },
        {
          "type": "gumball",
          "ref": "generator:math_facts",
          "note": "pick-the-reason MC + free-text 'because ___' (\u00a73.1 #2)"
        }
      ],
      "sources": [
        "research/thinking-skills.md \u00a72.3",
        "https://link.springer.com/article/10.1007/s10648-018-9434-x"
      ],
      "notes": "Bisra et al. 2018 meta-analysis g=0.55 (64 reports, ~6000 participants), comparable to mastery learning; works for BOTH conceptual and procedural knowledge (\u00a72.3 [A]). Prompt must SCAFFOLD the explanation (menu/starter) \u2014 a bare 'explain' is weaker. Penelope has real L1\u2013L2 evidence in the six packets' explain-why work \u2192 seed early (\u00a75, \u00a77.7).",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "thinking.reasoning.sort-classify",
      "domain": "thinking",
      "strand": "reasoning",
      "title": "Sort by a rule and state the rule",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "On fresh items, sorts correctly AND STATES the rule she used, including a 'circle every one that\u2026' with at least one NEGATIVE case, parent-scored on-target, untimed.",
        "L3": "INVENTS a valid sorting rule and finds the odd-one-out with justification, on tagged items across \u22652 DIFFERENT domains, AND holds on a spaced re-encounter."
      },
      "requires": [],
      "helps": [
        "thinking.reasoning.compare-contrast",
        "thinking.reasoning.pattern-rule"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "tag:sort-classify on ed-packet matching items ('exactly one decoy' + a negative case): even/odd, 2D/3D shapes, coins by value, living/nonliving",
          "note": "matching items already ship with exactly one decoy + at least one negative case \u2014 tag them (\u00a74)"
        },
        {
          "type": "gumball",
          "ref": "generator:input_memory_match",
          "note": "drag-to-bin sort with a 'what's your rule?' follow-up (\u00a73.1 #5)"
        }
      ],
      "sources": [
        "research/thinking-skills.md \u00a73.1 #5",
        "research/thinking-skills.md \u00a74"
      ],
      "notes": "The ed-packet matching-item convention ('exactly one decoy \u2026 needs at least one negative case', SKILL.md \u00a71) already exercises this \u2014 the work is TAGGING, not building (\u00a74). Gate on stating the rule, not just intuitive grouping.",
      "instrument_gap": false,
      "representations": {}
    },
    {
      "id": "world-models.body.digestion",
      "domain": "world-models",
      "strand": "body",
      "title": "Eating & digestion",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (order the path mouth \u2192 stomach \u2192 intestines; cells \u2192 tissues \u2192 organs \u2192 systems; what a healthy diet includes)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "book",
          "ref": "What Your Second Grader Needs to Know",
          "note": "cells & digestion"
        }
      ],
      "sources": [
        "CK Sci G2 \u00a7V",
        "research/world-models.md \u00a75 Region C"
      ],
      "notes": "",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.body.eyes-ears",
      "domain": "world-models",
      "strand": "body",
      "title": "How the eye & ear work",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (the eye \u2014 pupil/lens/retina \u2014 makes an image; the ear turns vibrations into sound via eardrum \u2192 tiny bones \u2192 cochlea)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "book",
          "ref": "What Your Third Grader Needs to Know",
          "note": "how eyes & ears work"
        },
        {
          "type": "activity",
          "ref": "make a pinhole camera; feel a speaker vibrate"
        }
      ],
      "sources": [
        "CK Sci G3 \u00a7V-D/E",
        "research/world-models.md \u00a75 Region C"
      ],
      "notes": "five-senses is a soft conceptual scaffold (helps), not a gate. DIRECTION FIX (adj minor): the helps edge now lives ON five-senses pointing HERE (scaffold \u2192 later node), not backwards on this node \u2014 a backwards helps was inert.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.body.five-senses",
      "domain": "world-models",
      "strand": "body",
      "title": "The five senses",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (name the five senses and the body part for each; match a sense to how we use it; basic body-care ideas)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [
        "world-models.body.eyes-ears"
      ],
      "resources": [
        {
          "type": "book",
          "ref": "What Your Kindergartner Needs to Know",
          "note": "five senses; Cora read-aloud"
        },
        {
          "type": "activity",
          "ref": "mystery-bag touch/smell game \u2014 identify by one sense at a time"
        }
      ],
      "sources": [
        "CK Sci K \u00a7V",
        "research/world-models.md \u00a75 Region C"
      ],
      "notes": "Cora-accessible entry to the body region (band [5,7]). helps eyes-ears (soft scaffold, forward direction \u2014 adj minor).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.body.heart-lungs",
      "domain": "world-models",
      "strand": "body",
      "title": "Heart, blood & breathing",
      "tier": "L3",
      "band": [
        6,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (heart pumps blood through vessels; lungs exchange gas when we breathe; the two systems work together; pulse rises with exercise)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [
        "math.counting.count-objects-cardinality"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "count your pulse before and after running \u2014 circulatory system made concrete"
        },
        {
          "type": "book",
          "ref": "What Your First Grader Needs to Know",
          "note": "respiratory & circulatory systems"
        }
      ],
      "sources": [
        "CK Sci G1 \u00a7V-B",
        "research/world-models.md \u00a75 Region C"
      ],
      "notes": "Pulse-counting activity ties to math counting/rate (cross-domain helps in reconcile).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.body.skeleton-muscles",
      "domain": "world-models",
      "strand": "body",
      "title": "Bones & muscles",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (the skeleton gives structure; muscles pull on bones to move; joints bend; name a few major bones)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "trace your own skeleton on butcher paper; feel a joint bend"
        },
        {
          "type": "book",
          "ref": "What Your First Grader Needs to Know",
          "note": "skeletal & muscular systems"
        }
      ],
      "sources": [
        "CK Sci G1 \u00a7V-A",
        "CK Sci G3 \u00a7V-A/B",
        "research/world-models.md \u00a75 Region C"
      ],
      "notes": "",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.civics.government-what-it-is",
      "domain": "world-models",
      "strand": "civics",
      "title": "What government does",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (government makes & enforces laws, settles disputes, protects rights; the Constitution is the highest law; 'We the people' = consent of the governed)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [
        "world-models.civics.three-branches"
      ],
      "resources": [
        {
          "type": "book",
          "ref": "What Your Second Grader Needs to Know",
          "note": "American government & the Constitution"
        }
      ],
      "sources": [
        "CK 2010 American H&G G2 \u00a7I",
        "research/world-models.md \u00a75 Region E"
      ],
      "notes": "Primary civics grade (G2). DIRECTION FIX (adj minor): rules-and-laws is the scaffold and now helps INTO this node (not this node backwards into it); this node in turn helps three-branches \u2014 the whole civics ladder now points forward (scaffold \u2192 later), no inert backwards helps.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.civics.rules-and-laws",
      "domain": "world-models",
      "strand": "civics",
      "title": "Why we have rules & laws",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (rules/laws let people live together; the Code of Hammurabi was an early written code; identify who makes rules at home/school/town)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [
        "world-models.civics.government-what-it-is"
      ],
      "resources": [
        {
          "type": "book",
          "ref": "What Your First Grader Needs to Know",
          "note": "Code of Hammurabi / why laws matter"
        },
        {
          "type": "activity",
          "ref": "make family house-rules together \u2014 why we have laws"
        }
      ],
      "sources": [
        "CK 2010 World H&G G1 \u00a7II-A",
        "research/world-models.md \u00a75 Region E"
      ],
      "notes": "bio-zack named example (laws). Entry point to the civics ladder. helps government-what-it-is (soft scaffold, forward direction \u2014 adj minor).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.civics.three-branches",
      "domain": "world-models",
      "strand": "civics",
      "title": "The three branches",
      "tier": "L3",
      "band": [
        8,
        10
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (Congress makes laws, the president carries them out, courts decide what's fair; the idea of separation of powers)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "book",
          "ref": "What Your Fourth Grader Needs to Know",
          "note": "three branches / separation of powers"
        }
      ],
      "sources": [
        "CK 2010 American H&G G4 \u00a7I",
        "research/world-models.md \u00a75 Region E"
      ],
      "notes": "Oldest-band node (8\u201310, CK G4). Research \u00a76 rec 10 lists this among first trim candidates \u2014 beyond both kids for now but grounded and kept as the civics ladder's top rung. government-what-it-is is a soft scaffold (helps), not a gate. DIRECTION FIX (adj minor): the helps edge now lives ON government-what-it-is pointing HERE (scaffold \u2192 later node), not backwards on this node \u2014 a backwards helps was inert.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.civics.voting-citizenship",
      "domain": "world-models",
      "strand": "civics",
      "title": "Voting & being a citizen",
      "tier": "L3",
      "band": [
        6,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (democracy = rule of the people; citizens have rights & responsibilities \u2014 voting, paying taxes; explain how a person becomes president)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "vote with the family \u2014 a real decision by majority rule"
        },
        {
          "type": "activity",
          "ref": "accompany a parent to a real election; look at a sample ballot"
        },
        {
          "type": "book",
          "ref": "What Your Kindergartner Needs to Know",
          "note": "rule of the people, presidents; Cora read-aloud"
        }
      ],
      "sources": [
        "CK 2010 American H&G K \u00a7III-C/\u00a7IV",
        "CK 2010 American H&G G2 \u00a7V/\u00a7VI",
        "research/world-models.md \u00a75 Region E"
      ],
      "notes": "bio-zack named example (voting). Spans K (rule-of-the-people, Cora-accessible read-aloud + activity) \u2192 G2 (rights/responsibilities, Penelope). Family-voting activity is the anchor (DESIGN.md \u00a73).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.earthsky.earths-water",
      "domain": "world-models",
      "strand": "earthsky",
      "title": "Earth's water (oceans, rivers, ice)",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (most of Earth is water; liquid vs solid/ice; fresh \u2014 rivers/lakes/groundwater/glaciers \u2014 vs salt/ocean; label water vs land on a globe)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "label a globe (water vs land); find the oceans"
        },
        {
          "type": "book",
          "ref": "What Your Second Grader Needs to Know",
          "note": "Earth's land & water"
        }
      ],
      "sources": [
        "CK Sci G2 \u00a7III-B",
        "research/world-models.md \u00a75 Region B"
      ],
      "notes": "Overlaps geo.continents-oceans (globe work) \u2014 soft transfer, not a prereq.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.earthsky.landforms",
      "domain": "world-models",
      "strand": "earthsky",
      "title": "Landforms & how land changes",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (name landforms \u2014 plains/hills/mountains/valleys/canyons/beaches/dunes; explain that wind & water slowly shape land via erosion)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "erosion demo (pour water over a sand pile); observe a local river or beach"
        },
        {
          "type": "book",
          "ref": "What Your Second Grader Needs to Know",
          "note": "landforms & erosion"
        }
      ],
      "sources": [
        "CK Sci G2 \u00a7III-A/C",
        "NGSS 2-ESS2/4-ESS2",
        "research/world-models.md \u00a75 Region B"
      ],
      "notes": "Landform naming overlaps geo/maps; erosion is the how-land-changes mechanism.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.earthsky.severe-weather",
      "domain": "world-models",
      "strand": "earthsky",
      "title": "Severe weather & staying safe",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (name severe-weather types \u2014 storms/tornadoes/hurricanes/blizzards/floods; explain how forecasting and warnings help people prepare)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "book",
          "ref": "What Your Third Grader Needs to Know",
          "note": "weather hazards"
        },
        {
          "type": "book",
          "ref": "What Your Kindergartner Needs to Know",
          "note": "Cora read-aloud"
        }
      ],
      "sources": [
        "CK Sci K \u00a7IV-C",
        "CK Sci G3 \u00a7IV-D",
        "NGSS K-ESS3-2",
        "research/world-models.md \u00a75 Region B"
      ],
      "notes": "Content spans CK K (intro) \u2192 G3 (fuller treatment); banded generously [5,8].",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.earthsky.water-cycle",
      "domain": "world-models",
      "strand": "earthsky",
      "title": "The water cycle",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (name and order evaporation \u2192 condensation \u2192 precipitation \u2192 groundwater; explain the sun's role; recognize the cycle from a diagram)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "puddle-evaporation demo + cold-glass condensation demo \u2014 the water cycle in the kitchen"
        },
        {
          "type": "book",
          "ref": "What Your Third Grader Needs to Know",
          "note": "weather & climate (evap/condensation/precipitation)"
        }
      ],
      "sources": [
        "CK 2010 G2 (Cycles in Nature: The Water Cycle)",
        "CK Sci G3 \u00a7IV-A",
        "research/world-models.md \u00a75 Region B"
      ],
      "notes": "PLACEMENT DISAGREEMENT (research \u00a73): CK 2010 places the named water cycle at G2, CK Sci 2020 at G3, NGSS at G5 (5-ESS2-1, but that grade is about system-MODELING rigor, not first exposure). Resolution = introduce as a named cycle at ages 6\u20138; band [6,8]. A deeper system-interaction node can sit later/unbuilt. bio-zack named example (water cycle).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.earthsky.weather-patterns",
      "domain": "world-models",
      "strand": "earthsky",
      "title": "Weather & seasons",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (describe today's weather in terms of sun/wind/precipitation/temperature; read a week-long weather chart; name seasonal patterns)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [
        "math.measure.data-graphs"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "track local weather for a week \u2014 temperature, precipitation, clouds; make a simple chart"
        },
        {
          "type": "book",
          "ref": "What Your Kindergartner Needs to Know",
          "note": "weather; Cora read-aloud"
        }
      ],
      "sources": [
        "CK Sci K \u00a7IV",
        "NGSS K-ESS2-1",
        "research/world-models.md \u00a75 Region B"
      ],
      "notes": "Weather-charting activity ties to math data/graphs (cross-domain helps to be added in reconcile).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.earthsky.weather-vs-climate",
      "domain": "world-models",
      "strand": "earthsky",
      "title": "Weather vs climate",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (distinguish weather = here-and-now from climate = long-term pattern over a big area; wind moves air from high to low pressure)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "book",
          "ref": "What Your Third Grader Needs to Know",
          "note": "weather & climate distinction"
        }
      ],
      "sources": [
        "CK Sci G3 \u00a7IV-B/C",
        "NGSS 3-ESS2",
        "research/world-models.md \u00a75 Region B"
      ],
      "notes": "Oldest-band earthsky node (7\u20139). Research \u00a76 rec 10 lists this among first trim candidates if maintenance-burden flags the domain \u2014 beyond both kids for now but grounded and kept for the strong reader (Penelope).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.geo.continents-oceans",
      "domain": "world-models",
      "strand": "geo",
      "title": "Continents & oceans",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (name the seven continents and the major oceans; locate yourself \u2014 town \u2192 state \u2192 country \u2192 continent)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "book",
          "ref": "What Your Kindergartner Needs to Know",
          "note": "continents & oceans; Cora read-aloud"
        },
        {
          "type": "activity",
          "ref": "trace the continents on a globe; find your continent"
        }
      ],
      "sources": [
        "CK 2010 World H&G K \u00a7II",
        "CK 2010 World H&G G1 \u00a7I",
        "research/world-models.md \u00a75 Region F"
      ],
      "notes": "DIRECTION FIX (adj minor): the helps edge now lives ON maps-globes pointing HERE (scaffold \u2192 later node), not backwards on this node \u2014 a backwards helps was inert.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.geo.maps-globes",
      "domain": "world-models",
      "strand": "geo",
      "title": "Maps & globes",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (maps & globes represent real places; a globe is a spherical map; read a map key/legend & symbols; find N/E/S/W)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [
        "world-models.geo.continents-oceans"
      ],
      "resources": [
        {
          "type": "activity",
          "ref": "make a treasure-hunt map of the house/yard with a key and compass rose"
        },
        {
          "type": "book",
          "ref": "What Your Kindergartner Needs to Know",
          "note": "maps & globes; Cora read-aloud"
        }
      ],
      "sources": [
        "CK 2010 World H&G K \u00a7I",
        "CK 2010 World H&G G1 \u00a7I",
        "research/world-models.md \u00a75 Region F"
      ],
      "notes": "Overlaps the maps ed-packet / math spatial work \u2014 kept because CK treats spatial sense as world-knowledge and it grounds the map layer. Research \u00a76 rec 10: first trim candidate if the domain gets crowded. helps continents-oceans (soft scaffold, forward direction \u2014 adj minor).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.howthings.compound-machines",
      "domain": "world-models",
      "strand": "howthings",
      "title": "Compound machines (cars, bikes)",
      "tier": "L3",
      "band": [
        6,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (a compound machine = two+ simple machines; decompose a bicycle / scissors / wheelbarrow into its simple machines)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "examine a bike or car; watch a tire change (jack = lever + screw)"
        },
        {
          "type": "activity",
          "ref": "watch roadwork / a construction site \u2014 name the machines in action"
        },
        {
          "type": "book",
          "ref": "The Way Things Work Now",
          "note": "Part 1 (gears, belts, cams)"
        }
      ],
      "sources": [
        "CK Sci G1 \u00a7IV-B",
        "research/world-models.md \u00a75 Region A"
      ],
      "notes": "bio-zack named example (cars). simple-machines is a soft scaffold (helps), NOT a gate \u2014 weak ordering is the design feature. DIRECTION FIX (adj minor): the helps edge now lives ON simple-machines pointing HERE (scaffold \u2192 later node), not backwards on this node \u2014 a backwards helps was inert.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.howthings.electricity",
      "domain": "world-models",
      "strand": "howthings",
      "title": "Electricity & circuits",
      "tier": "L3",
      "band": [
        6,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (electricity is a form of energy; static vs current; a circuit needs a complete loop; state the safety rules \u2014 never metal in an outlet, never a wet-hand switch)",
        "L3": "SM-2 spaced gate on mixed fresh items, safety rules included"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "book",
          "ref": "The Way Things Work Now",
          "note": "Part 4 (electricity)"
        },
        {
          "type": "book",
          "ref": "What Your Second Grader Needs to Know",
          "note": "electricity & magnetism"
        },
        {
          "type": "activity",
          "ref": "build a battery + bulb + wire circuit; rub-a-balloon static demo"
        }
      ],
      "sources": [
        "CK Sci G2 \u00a7IV-A/C/D",
        "NGSS 4-PS3",
        "research/world-models.md \u00a75 Region A"
      ],
      "notes": "PLACEMENT DISAGREEMENT (research \u00a73): CK Science places phenomenological electricity (what it is, static vs current, safety) at G2; NGSS's quantitative energy/electricity framing is G4. Resolution = earlier observation + safety exposure; band [6,9]. Carries a built-in safety strand (bio-zack: how the lights work).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.howthings.forces-pushes-pulls",
      "domain": "world-models",
      "strand": "howthings",
      "title": "Pushes, pulls & forces",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh recognition/explanation items, untimed (identify a push vs a pull; predict how a force changes an object's motion)",
        "L3": "SM-2 spaced gate (3+ spaced reps, 4+ lifetime correct) on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "book",
          "ref": "The Way Things Work Now",
          "note": "Part 1 (mechanics of movement)"
        },
        {
          "type": "book",
          "ref": "What Your Kindergartner Needs to Know",
          "note": "Cora read-aloud"
        },
        {
          "type": "activity",
          "ref": "watch things collide/roll \u2014 narrate the push or pull"
        }
      ],
      "sources": [
        "CK Sci K \u00a7I A-C",
        "NGSS K-PS2",
        "research/world-models.md \u00a75 Region A"
      ],
      "notes": "Anchor for the whole 'how things move' region; observation-first, no prereq.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.howthings.magnets",
      "domain": "world-models",
      "strand": "howthings",
      "title": "Magnets & magnetism",
      "tier": "L3",
      "band": [
        5,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (predict which materials a magnet pulls; like poles repel / unlike attract; name everyday devices that use magnets)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "magnet hunt around the house \u2014 what sticks, what doesn't"
        },
        {
          "type": "book",
          "ref": "The Way Things Work Now",
          "note": "Part 4 (magnetism)"
        }
      ],
      "sources": [
        "CK Sci K \u00a7I-C",
        "CK Sci G2 \u00a7IV-B",
        "NGSS 3-PS2",
        "research/world-models.md \u00a75 Region A"
      ],
      "notes": "PLACEMENT DISAGREEMENT (research \u00a73): CK intros magnetism at K (non-contact force) AND G2; NGSS places magnetic/electric forces at G3. Resolution = earlier phenomenological exposure; band [5,8], observation-first, no prereq. Do not move to G3.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.howthings.plumbing-water-systems",
      "domain": "world-models",
      "strand": "howthings",
      "title": "Where clean water comes from",
      "tier": "L3",
      "band": [
        6,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed after the field trip (trace the path: source \u2192 treatment \u2192 pipes \u2192 tap \u2192 drain; explain why water is treated)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "activity",
          "ref": "visit a water treatment plant \u2014 trace the plumbing end to end"
        },
        {
          "type": "book",
          "ref": "The Way Things Work Now",
          "note": "Part 2 (pressure, floating)"
        }
      ],
      "sources": [
        "CK Sci G2 \u00a7III-B (Earth's Water)",
        "research/world-models.md \u00a75 Region A"
      ],
      "notes": "SYNTHESIZED node \u2014 no single CK/NGSS topic covers municipal water (research \u00a76 rec 7). Anchor = the water-treatment-plant visit (bio-zack named example: plumbing; DESIGN.md \u00a73 named field trip). Grounded via CK Earth's Water + the activity; not a fabricated citation.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.howthings.simple-machines",
      "domain": "world-models",
      "strand": "howthings",
      "title": "Simple machines",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (name the six simple machines; identify which one a given tool is; explain how it makes work easier)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [
        "world-models.howthings.compound-machines"
      ],
      "resources": [
        {
          "type": "book",
          "ref": "The Way Things Work Now",
          "note": "Part 1 (inclined plane, lever, wheel & axle, pulley, screw, wedge)"
        },
        {
          "type": "book",
          "ref": "What Your First Grader Needs to Know",
          "note": "simple machines section; Cora read-aloud"
        },
        {
          "type": "activity",
          "ref": "find each of the six simple machines at home"
        }
      ],
      "sources": [
        "CK Sci G1 \u00a7IV-A",
        "research/world-models.md \u00a75 Region A"
      ],
      "notes": "PLACEMENT DISAGREEMENT (research \u00a73): CK Science has an explicit G1 simple-machines unit; NGSS has NO dedicated unit (folded into forces/energy). Kept as a first-class node \u2014 best 'how things work' hook, Macaulay Part 1 maps 1:1. NGSS silence != too early. helps compound-machines (soft scaffold, forward direction \u2014 adj minor).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.money.goods-services",
      "domain": "world-models",
      "strand": "money",
      "title": "Goods & services",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (goods = things you can hold; services = things people do for you; sort examples into goods vs services)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [
        "world-models.money.trade-barter"
      ],
      "resources": [
        {
          "type": "book",
          "ref": "Ox-Cart Man",
          "note": "goods/services + production\u2192sale loop; ideal Cora read-aloud"
        },
        {
          "type": "activity",
          "ref": "list the goods vs services in the house"
        }
      ],
      "sources": [
        "CK 2010 (economics embedded)",
        "research/world-models.md \u00a75 Region D"
      ],
      "notes": "CK economics is embedded, not a standalone unit; grounded via the Ox-Cart Man read-aloud (research \u00a74). helps trade-barter (soft scaffold, forward direction \u2014 adj minor).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.money.trade-barter",
      "domain": "world-models",
      "strand": "money",
      "title": "Trade & how money moves",
      "tier": "L3",
      "band": [
        7,
        9
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (people trade goods/services; money makes trade easier than barter; a dollar circulates; the produce \u2192 sell \u2192 buy loop)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [],
      "resources": [
        {
          "type": "book",
          "ref": "The Go-Around Dollar",
          "note": "how one dollar circulates"
        },
        {
          "type": "book",
          "ref": "Ox-Cart Man",
          "note": "production \u2192 sell \u2192 buy loop"
        },
        {
          "type": "activity",
          "ref": "run a lemonade stand / bake sale \u2014 price, make change, wants vs needs on spending earnings"
        }
      ],
      "sources": [
        "research/world-models.md \u00a75 Region D",
        "research/world-models.md \u00a74 (economics read-aloud lit)"
      ],
      "notes": "what-is-money and goods-services are soft scaffolds (helps), not gates. Change-making ties to math money (cross-domain helps in reconcile). DIRECTION FIX (adj minor): the helps edges now live ON what-is-money and goods-services pointing HERE (scaffold \u2192 later node), not backwards on this node \u2014 backwards helps were inert.",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.money.wants-needs",
      "domain": "world-models",
      "strand": "money",
      "title": "Wants vs needs & choices",
      "tier": "L3",
      "band": [
        6,
        8
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (needs \u2014 food/water/shelter \u2014 vs wants; money is limited so we choose; saving vs spending)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [
        "thinking.inquiry.consider-both-sides"
      ],
      "resources": [
        {
          "type": "book",
          "ref": "If You Made a Million",
          "note": "making money = making choices"
        },
        {
          "type": "activity",
          "ref": "a spend / save / give jar for allowance"
        }
      ],
      "sources": [
        "research/world-models.md \u00a75 Region D",
        "research/world-models.md \u00a74 (economics read-aloud lit)"
      ],
      "notes": "Economics-concept node; grounded via read-aloud literature (CK has no dedicated unit).",
      "instrument_gap": true,
      "representations": {}
    },
    {
      "id": "world-models.money.what-is-money",
      "domain": "world-models",
      "strand": "money",
      "title": "What money is & why we use it",
      "tier": "L3",
      "band": [
        5,
        7
      ],
      "fluency_aim": null,
      "gates": {
        "L2": "\u226590% on 8 fresh items, untimed (name the coins & the dollar bill; explain money is a stand-in we trade for things; read the $ and \u00a2 signs)",
        "L3": "SM-2 spaced gate on mixed fresh items"
      },
      "requires": [],
      "helps": [
        "math.measure.money-coins-bills",
        "world-models.money.trade-barter"
      ],
      "resources": [
        {
          "type": "book",
          "ref": "If You Made a Million",
          "note": "money read-aloud"
        },
        {
          "type": "activity",
          "ref": "sort a coin jar by type"
        }
      ],
      "sources": [
        "CK Math K\u20132 \u00a7III Money",
        "research/world-models.md \u00a75 Region D"
      ],
      "notes": "CONCEPTUAL node (what money IS). Coin-value ID and money arithmetic are math.measure.* nodes \u2014 helps-link there in the reconcile phase, do NOT duplicate them here (research \u00a76 rec 8). helps trade-barter (soft scaffold, forward direction \u2014 adj minor).",
      "instrument_gap": true,
      "representations": {}
    }
  ],
  "edges": [
    {
      "source": "math.addsub.add-facts-memory-20",
      "target": "math.addsub.make-a-ten-strategy",
      "kind": "requires"
    },
    {
      "source": "math.addsub.add-sub-fluency-10",
      "target": "math.addsub.add-sub-fluency-5",
      "kind": "requires"
    },
    {
      "source": "math.addsub.add-sub-fluency-10",
      "target": "math.addsub.counting-on",
      "kind": "requires"
    },
    {
      "source": "math.addsub.add-sub-fluency-100",
      "target": "math.addsub.add-sub-within-100",
      "kind": "requires"
    },
    {
      "source": "math.addsub.add-sub-fluency-1000",
      "target": "math.addsub.add-sub-within-1000",
      "kind": "requires"
    },
    {
      "source": "math.addsub.add-sub-fluency-5",
      "target": "math.addsub.represent-add-sub",
      "kind": "requires"
    },
    {
      "source": "math.addsub.add-sub-standard-algorithm",
      "target": "math.addsub.add-sub-fluency-1000",
      "kind": "requires"
    },
    {
      "source": "math.addsub.add-sub-standard-algorithm",
      "target": "math.counting.write-digits",
      "kind": "requires"
    },
    {
      "source": "math.addsub.add-sub-within-100",
      "target": "math.placevalue.two-digit-place-value",
      "kind": "requires"
    },
    {
      "source": "math.addsub.add-sub-within-100",
      "target": "math.addsub.make-a-ten-strategy",
      "kind": "requires"
    },
    {
      "source": "math.addsub.add-sub-within-1000",
      "target": "math.addsub.add-sub-fluency-100",
      "kind": "requires"
    },
    {
      "source": "math.addsub.counting-on",
      "target": "math.addsub.add-sub-fluency-5",
      "kind": "requires"
    },
    {
      "source": "math.addsub.counting-on",
      "target": "math.counting.compare-numbers-20",
      "kind": "requires"
    },
    {
      "source": "math.addsub.counting-on",
      "target": "math.measure.elapsed-time",
      "kind": "helps"
    },
    {
      "source": "math.addsub.counting-on",
      "target": "math.measure.money-coins-bills",
      "kind": "helps"
    },
    {
      "source": "math.addsub.decompose-make-10",
      "target": "math.addsub.represent-add-sub",
      "kind": "requires"
    },
    {
      "source": "math.addsub.equal-sign-unknown",
      "target": "math.addsub.counting-on",
      "kind": "requires"
    },
    {
      "source": "math.addsub.make-a-ten-strategy",
      "target": "math.addsub.add-sub-fluency-10",
      "kind": "requires"
    },
    {
      "source": "math.addsub.make-a-ten-strategy",
      "target": "math.addsub.decompose-make-10",
      "kind": "requires"
    },
    {
      "source": "math.addsub.make-a-ten-strategy",
      "target": "math.placevalue.teen-numbers-place",
      "kind": "requires"
    },
    {
      "source": "math.addsub.represent-add-sub",
      "target": "math.counting.count-objects-cardinality",
      "kind": "requires"
    },
    {
      "source": "math.addsub.wp-change-addend-compare",
      "target": "math.addsub.counting-on",
      "kind": "requires"
    },
    {
      "source": "math.addsub.wp-change-addend-compare",
      "target": "math.addsub.wp-result-unknown",
      "kind": "requires"
    },
    {
      "source": "math.addsub.wp-result-unknown",
      "target": "math.addsub.represent-add-sub",
      "kind": "requires"
    },
    {
      "source": "math.addsub.wp-result-unknown",
      "target": "math.addsub.decompose-make-10",
      "kind": "requires"
    },
    {
      "source": "math.addsub.wp-start-unknown-two-step",
      "target": "math.addsub.equal-sign-unknown",
      "kind": "requires"
    },
    {
      "source": "math.addsub.wp-start-unknown-two-step",
      "target": "math.addsub.wp-change-addend-compare",
      "kind": "requires"
    },
    {
      "source": "math.addsub.wp-start-unknown-two-step",
      "target": "math.addsub.add-sub-fluency-100",
      "kind": "requires"
    },
    {
      "source": "math.algebra.dependent-independent-vars",
      "target": "math.algebra.expressions-evaluate-write",
      "kind": "requires"
    },
    {
      "source": "math.algebra.dependent-independent-vars",
      "target": "math.geometry.coordinate-plane",
      "kind": "requires"
    },
    {
      "source": "math.algebra.dependent-independent-vars",
      "target": "math.ratio.rates-unit-rates",
      "kind": "requires"
    },
    {
      "source": "math.algebra.expressions-evaluate-write",
      "target": "math.algebra.write-evaluate-exponents",
      "kind": "requires"
    },
    {
      "source": "math.algebra.expressions-evaluate-write",
      "target": "math.multdiv.multistep-4ops-patterns",
      "kind": "requires"
    },
    {
      "source": "math.algebra.expressions-evaluate-write",
      "target": "math.integers.integer-add-subtract",
      "kind": "requires"
    },
    {
      "source": "math.algebra.expressions-evaluate-write",
      "target": "math.numbertheory.gcf-lcm",
      "kind": "helps"
    },
    {
      "source": "math.algebra.inequalities-intro",
      "target": "math.algebra.one-step-equations",
      "kind": "requires"
    },
    {
      "source": "math.algebra.inequalities-intro",
      "target": "math.integers.compare-order-rationals",
      "kind": "requires"
    },
    {
      "source": "math.algebra.one-step-equations",
      "target": "math.algebra.expressions-evaluate-write",
      "kind": "requires"
    },
    {
      "source": "math.algebra.one-step-equations",
      "target": "math.integers.integer-add-subtract",
      "kind": "requires"
    },
    {
      "source": "math.algebra.one-step-equations",
      "target": "math.addsub.equal-sign-unknown",
      "kind": "requires"
    },
    {
      "source": "math.algebra.one-step-equations",
      "target": "math.multdiv.mult-div-word-problems",
      "kind": "helps"
    },
    {
      "source": "math.algebra.order-of-operations",
      "target": "math.algebra.write-evaluate-exponents",
      "kind": "requires"
    },
    {
      "source": "math.algebra.order-of-operations",
      "target": "math.algebra.expressions-evaluate-write",
      "kind": "helps"
    },
    {
      "source": "math.algebra.two-step-equations",
      "target": "math.algebra.one-step-equations",
      "kind": "requires"
    },
    {
      "source": "math.algebra.two-step-equations",
      "target": "math.integers.integer-four-ops",
      "kind": "requires"
    },
    {
      "source": "math.algebra.write-evaluate-exponents",
      "target": "math.multdiv.mult-div-facts-memory-100",
      "kind": "requires"
    },
    {
      "source": "math.algebra.write-evaluate-exponents",
      "target": "math.numbertheory.prime-factorization",
      "kind": "helps"
    },
    {
      "source": "math.algebra.write-evaluate-exponents",
      "target": "math.algebra.order-of-operations",
      "kind": "helps"
    },
    {
      "source": "math.counting.compare-numbers-20",
      "target": "math.counting.count-objects-cardinality",
      "kind": "requires"
    },
    {
      "source": "math.counting.count-objects-cardinality",
      "target": "math.counting.count-sequence-100",
      "kind": "requires"
    },
    {
      "source": "math.counting.count-oral-skip",
      "target": "math.counting.count-sequence-100",
      "kind": "requires"
    },
    {
      "source": "math.counting.count-oral-skip",
      "target": "math.counting.skip-count-2-5-10",
      "kind": "helps"
    },
    {
      "source": "math.counting.count-sequence-100",
      "target": "math.counting.skip-count-2-5-10",
      "kind": "helps"
    },
    {
      "source": "math.counting.skip-count-2-5-10",
      "target": "math.counting.count-sequence-100",
      "kind": "requires"
    },
    {
      "source": "math.counting.skip-count-2-5-10",
      "target": "thinking.reasoning.pattern-rule",
      "kind": "helps"
    },
    {
      "source": "math.counting.write-digits",
      "target": "math.counting.count-objects-cardinality",
      "kind": "requires"
    },
    {
      "source": "math.fractions.add-sub-mult-like",
      "target": "math.fractions.fraction-number-line",
      "kind": "requires"
    },
    {
      "source": "math.fractions.add-sub-mult-like",
      "target": "math.multdiv.mult-div-meaning",
      "kind": "requires"
    },
    {
      "source": "math.fractions.add-sub-mult-like",
      "target": "math.addsub.wp-result-unknown",
      "kind": "requires"
    },
    {
      "source": "math.fractions.decimal-notation",
      "target": "math.fractions.equivalence-compare-4",
      "kind": "requires"
    },
    {
      "source": "math.fractions.decimal-notation",
      "target": "math.placevalue.big-numbers-round",
      "kind": "requires"
    },
    {
      "source": "math.fractions.equal-shares",
      "target": "math.geometry.compose-decompose-shapes",
      "kind": "requires"
    },
    {
      "source": "math.fractions.equal-shares",
      "target": "math.measure.money-coins-bills",
      "kind": "helps"
    },
    {
      "source": "math.fractions.equal-shares",
      "target": "math.measure.tell-time-5min",
      "kind": "helps"
    },
    {
      "source": "math.fractions.equal-shares",
      "target": "thinking.reasoning.self-explanation",
      "kind": "helps"
    },
    {
      "source": "math.fractions.equivalence-compare-4",
      "target": "math.fractions.equivalent-compare-3",
      "kind": "requires"
    },
    {
      "source": "math.fractions.equivalent-compare-3",
      "target": "math.fractions.fraction-number-line",
      "kind": "requires"
    },
    {
      "source": "math.fractions.fraction-number-line",
      "target": "math.fractions.unit-fraction-meaning",
      "kind": "requires"
    },
    {
      "source": "math.fractions.fraction-number-line",
      "target": "math.measure.length-ruler",
      "kind": "helps"
    },
    {
      "source": "math.fractions.mixed-numbers",
      "target": "math.fractions.multiply-divide-fractions",
      "kind": "requires"
    },
    {
      "source": "math.fractions.mixed-numbers",
      "target": "math.numbertheory.gcf-lcm",
      "kind": "helps"
    },
    {
      "source": "math.fractions.multiply-divide-fractions",
      "target": "math.fractions.add-sub-mult-like",
      "kind": "requires"
    },
    {
      "source": "math.fractions.multiply-divide-fractions",
      "target": "math.fractions.equivalence-compare-4",
      "kind": "requires"
    },
    {
      "source": "math.fractions.multiply-divide-fractions",
      "target": "math.numbertheory.gcf-lcm",
      "kind": "helps"
    },
    {
      "source": "math.fractions.unit-fraction-meaning",
      "target": "math.fractions.equal-shares",
      "kind": "requires"
    },
    {
      "source": "math.fractions.unit-fraction-meaning",
      "target": "thinking.metacog.spot-the-trap",
      "kind": "helps"
    },
    {
      "source": "math.geometry.array-rows-columns",
      "target": "math.geometry.compose-decompose-shapes",
      "kind": "requires"
    },
    {
      "source": "math.geometry.compose-decompose-shapes",
      "target": "math.geometry.name-shapes-visual",
      "kind": "requires"
    },
    {
      "source": "math.geometry.coordinate-plane",
      "target": "math.geometry.lines-angles",
      "kind": "requires"
    },
    {
      "source": "math.geometry.coordinate-plane",
      "target": "math.integers.negatives-number-line",
      "kind": "requires"
    },
    {
      "source": "math.geometry.coordinate-plane",
      "target": "math.placevalue.big-numbers-round",
      "kind": "requires"
    },
    {
      "source": "math.geometry.defining-attributes",
      "target": "math.geometry.compose-decompose-shapes",
      "kind": "requires"
    },
    {
      "source": "math.geometry.lines-angles",
      "target": "math.geometry.defining-attributes",
      "kind": "requires"
    },
    {
      "source": "math.geometry.partition-equal-area",
      "target": "math.geometry.array-rows-columns",
      "kind": "requires"
    },
    {
      "source": "math.geometry.partition-equal-area",
      "target": "math.fractions.unit-fraction-meaning",
      "kind": "requires"
    },
    {
      "source": "math.geometry.quadrilateral-categories",
      "target": "math.geometry.defining-attributes",
      "kind": "requires"
    },
    {
      "source": "math.integers.compare-order-rationals",
      "target": "math.integers.negatives-number-line",
      "kind": "requires"
    },
    {
      "source": "math.integers.compare-order-rationals",
      "target": "math.fractions.decimal-notation",
      "kind": "requires"
    },
    {
      "source": "math.integers.integer-add-subtract",
      "target": "math.integers.compare-order-rationals",
      "kind": "requires"
    },
    {
      "source": "math.integers.integer-add-subtract",
      "target": "math.algebra.one-step-equations",
      "kind": "helps"
    },
    {
      "source": "math.integers.integer-four-ops",
      "target": "math.integers.integer-add-subtract",
      "kind": "requires"
    },
    {
      "source": "math.integers.integer-four-ops",
      "target": "math.multdiv.mult-div-facts-memory-100",
      "kind": "requires"
    },
    {
      "source": "math.integers.integer-four-ops",
      "target": "math.algebra.two-step-equations",
      "kind": "helps"
    },
    {
      "source": "math.integers.negatives-number-line",
      "target": "math.placevalue.big-numbers-round",
      "kind": "requires"
    },
    {
      "source": "math.integers.negatives-number-line",
      "target": "math.measure.length-ruler",
      "kind": "helps"
    },
    {
      "source": "math.measure.angle-measure",
      "target": "math.geometry.lines-angles",
      "kind": "requires"
    },
    {
      "source": "math.measure.angle-measure",
      "target": "math.fractions.unit-fraction-meaning",
      "kind": "helps"
    },
    {
      "source": "math.measure.area-tiling-multiply",
      "target": "math.geometry.array-rows-columns",
      "kind": "requires"
    },
    {
      "source": "math.measure.area-tiling-multiply",
      "target": "math.multdiv.mult-div-meaning",
      "kind": "requires"
    },
    {
      "source": "math.measure.data-graphs",
      "target": "math.counting.count-objects-cardinality",
      "kind": "requires"
    },
    {
      "source": "math.measure.data-graphs",
      "target": "math.addsub.wp-change-addend-compare",
      "kind": "helps"
    },
    {
      "source": "math.measure.data-graphs",
      "target": "thinking.reasoning.compare-contrast",
      "kind": "helps"
    },
    {
      "source": "math.measure.elapsed-time",
      "target": "math.measure.tell-time-5min",
      "kind": "requires"
    },
    {
      "source": "math.measure.elapsed-time",
      "target": "math.addsub.add-sub-fluency-100",
      "kind": "requires"
    },
    {
      "source": "math.measure.elapsed-time",
      "target": "math.addsub.counting-on",
      "kind": "helps"
    },
    {
      "source": "math.measure.elapsed-time",
      "target": "thinking.reasoning.deep-structure-transfer",
      "kind": "helps"
    },
    {
      "source": "math.measure.length-ruler",
      "target": "math.measure.compare-order-length",
      "kind": "requires"
    },
    {
      "source": "math.measure.mass-liquid-volume",
      "target": "math.measure.length-ruler",
      "kind": "requires"
    },
    {
      "source": "math.measure.mass-liquid-volume",
      "target": "math.addsub.add-sub-fluency-100",
      "kind": "requires"
    },
    {
      "source": "math.measure.measure-fraction-inch-convert",
      "target": "math.measure.length-ruler",
      "kind": "requires"
    },
    {
      "source": "math.measure.measure-fraction-inch-convert",
      "target": "math.fractions.unit-fraction-meaning",
      "kind": "requires"
    },
    {
      "source": "math.measure.money-coins-bills",
      "target": "math.counting.skip-count-2-5-10",
      "kind": "requires"
    },
    {
      "source": "math.measure.money-coins-bills",
      "target": "math.addsub.add-sub-within-100",
      "kind": "requires"
    },
    {
      "source": "math.measure.money-coins-bills",
      "target": "math.fractions.equal-shares",
      "kind": "helps"
    },
    {
      "source": "math.measure.money-coins-bills",
      "target": "math.addsub.counting-on",
      "kind": "helps"
    },
    {
      "source": "math.measure.money-coins-bills",
      "target": "thinking.reasoning.deep-structure-transfer",
      "kind": "helps"
    },
    {
      "source": "math.measure.perimeter-formulas",
      "target": "math.measure.area-tiling-multiply",
      "kind": "requires"
    },
    {
      "source": "math.measure.perimeter-formulas",
      "target": "math.measure.length-ruler",
      "kind": "requires"
    },
    {
      "source": "math.measure.scaled-graphs-lineplots",
      "target": "math.measure.data-graphs",
      "kind": "requires"
    },
    {
      "source": "math.measure.scaled-graphs-lineplots",
      "target": "math.multdiv.mult-div-meaning",
      "kind": "requires"
    },
    {
      "source": "math.measure.stats-center-spread",
      "target": "math.measure.scaled-graphs-lineplots",
      "kind": "requires"
    },
    {
      "source": "math.measure.stats-center-spread",
      "target": "math.addsub.add-sub-standard-algorithm",
      "kind": "requires"
    },
    {
      "source": "math.measure.stats-displays",
      "target": "math.measure.stats-center-spread",
      "kind": "requires"
    },
    {
      "source": "math.measure.tell-time-5min",
      "target": "math.measure.tell-time-hour-half",
      "kind": "requires"
    },
    {
      "source": "math.measure.tell-time-5min",
      "target": "math.counting.skip-count-2-5-10",
      "kind": "requires"
    },
    {
      "source": "math.measure.tell-time-5min",
      "target": "math.fractions.equal-shares",
      "kind": "helps"
    },
    {
      "source": "math.measure.tell-time-5min",
      "target": "thinking.reasoning.deep-structure-transfer",
      "kind": "helps"
    },
    {
      "source": "math.measure.tell-time-hour-half",
      "target": "math.counting.count-sequence-100",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.equal-groups-arrays",
      "target": "math.addsub.add-facts-memory-20",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.equal-groups-arrays",
      "target": "math.geometry.array-rows-columns",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.mult-div-facts-memory-100",
      "target": "math.multdiv.mult-facts-hard",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.mult-div-facts-memory-100",
      "target": "math.multdiv.mult-div-word-problems",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.mult-div-meaning",
      "target": "math.multdiv.equal-groups-arrays",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.mult-div-meaning",
      "target": "math.counting.skip-count-2-5-10",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.mult-div-multidigit",
      "target": "math.multdiv.mult-div-facts-memory-100",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.mult-div-multidigit",
      "target": "math.placevalue.three-digit-place-value",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.mult-div-word-problems",
      "target": "math.multdiv.mult-div-meaning",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.mult-facts-easy",
      "target": "math.multdiv.mult-div-meaning",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.mult-facts-easy",
      "target": "math.counting.count-oral-skip",
      "kind": "helps"
    },
    {
      "source": "math.multdiv.mult-facts-hard",
      "target": "math.multdiv.mult-facts-easy",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.multistep-4ops-patterns",
      "target": "math.multdiv.mult-div-multidigit",
      "kind": "requires"
    },
    {
      "source": "math.multdiv.multistep-4ops-patterns",
      "target": "math.addsub.wp-start-unknown-two-step",
      "kind": "requires"
    },
    {
      "source": "math.numbertheory.divisibility-rules",
      "target": "math.numbertheory.factors-multiples",
      "kind": "requires"
    },
    {
      "source": "math.numbertheory.divisibility-rules",
      "target": "math.numbertheory.prime-factorization",
      "kind": "helps"
    },
    {
      "source": "math.numbertheory.factors-multiples",
      "target": "math.multdiv.mult-div-facts-memory-100",
      "kind": "requires"
    },
    {
      "source": "math.numbertheory.factors-multiples",
      "target": "math.multdiv.multistep-4ops-patterns",
      "kind": "requires"
    },
    {
      "source": "math.numbertheory.gcf-lcm",
      "target": "math.numbertheory.prime-factorization",
      "kind": "requires"
    },
    {
      "source": "math.numbertheory.gcf-lcm",
      "target": "math.fractions.multiply-divide-fractions",
      "kind": "helps"
    },
    {
      "source": "math.numbertheory.gcf-lcm",
      "target": "math.fractions.mixed-numbers",
      "kind": "helps"
    },
    {
      "source": "math.numbertheory.gcf-lcm",
      "target": "math.algebra.expressions-evaluate-write",
      "kind": "helps"
    },
    {
      "source": "math.numbertheory.prime-factorization",
      "target": "math.numbertheory.primes-composites",
      "kind": "requires"
    },
    {
      "source": "math.numbertheory.prime-factorization",
      "target": "math.algebra.write-evaluate-exponents",
      "kind": "helps"
    },
    {
      "source": "math.numbertheory.prime-factorization",
      "target": "math.fractions.multiply-divide-fractions",
      "kind": "helps"
    },
    {
      "source": "math.numbertheory.primes-composites",
      "target": "math.numbertheory.divisibility-rules",
      "kind": "requires"
    },
    {
      "source": "math.placevalue.big-numbers-round",
      "target": "math.placevalue.three-digit-place-value",
      "kind": "requires"
    },
    {
      "source": "math.placevalue.big-numbers-round",
      "target": "thinking.reasoning.estimation-sanity-check",
      "kind": "helps"
    },
    {
      "source": "math.placevalue.decimal-four-ops",
      "target": "math.placevalue.decimal-place-value-round",
      "kind": "requires"
    },
    {
      "source": "math.placevalue.decimal-four-ops",
      "target": "math.addsub.add-sub-standard-algorithm",
      "kind": "requires"
    },
    {
      "source": "math.placevalue.decimal-four-ops",
      "target": "math.fractions.multiply-divide-fractions",
      "kind": "requires"
    },
    {
      "source": "math.placevalue.decimal-four-ops",
      "target": "math.ratio.percent-concept",
      "kind": "helps"
    },
    {
      "source": "math.placevalue.decimal-place-value-round",
      "target": "math.fractions.decimal-notation",
      "kind": "requires"
    },
    {
      "source": "math.placevalue.decimal-place-value-round",
      "target": "math.placevalue.big-numbers-round",
      "kind": "requires"
    },
    {
      "source": "math.placevalue.teen-numbers-place",
      "target": "math.counting.count-objects-cardinality",
      "kind": "requires"
    },
    {
      "source": "math.placevalue.three-digit-place-value",
      "target": "math.placevalue.two-digit-place-value",
      "kind": "requires"
    },
    {
      "source": "math.placevalue.two-digit-place-value",
      "target": "math.placevalue.teen-numbers-place",
      "kind": "requires"
    },
    {
      "source": "math.ratio.decimals-fractions-percents-fluency",
      "target": "math.ratio.percent-concept",
      "kind": "requires"
    },
    {
      "source": "math.ratio.percent-change-applications",
      "target": "math.ratio.percent-concept",
      "kind": "requires"
    },
    {
      "source": "math.ratio.percent-change-applications",
      "target": "math.ratio.proportions-solve",
      "kind": "requires"
    },
    {
      "source": "math.ratio.percent-concept",
      "target": "math.ratio.ratio-concept",
      "kind": "requires"
    },
    {
      "source": "math.ratio.percent-concept",
      "target": "math.fractions.decimal-notation",
      "kind": "requires"
    },
    {
      "source": "math.ratio.percent-concept",
      "target": "math.fractions.equivalence-compare-4",
      "kind": "requires"
    },
    {
      "source": "math.ratio.proportions-solve",
      "target": "math.ratio.rates-unit-rates",
      "kind": "requires"
    },
    {
      "source": "math.ratio.rates-unit-rates",
      "target": "math.ratio.ratio-concept",
      "kind": "requires"
    },
    {
      "source": "math.ratio.rates-unit-rates",
      "target": "math.fractions.multiply-divide-fractions",
      "kind": "requires"
    },
    {
      "source": "math.ratio.rates-unit-rates",
      "target": "math.geometry.coordinate-plane",
      "kind": "helps"
    },
    {
      "source": "math.ratio.ratio-concept",
      "target": "math.multdiv.mult-div-facts-memory-100",
      "kind": "requires"
    },
    {
      "source": "math.ratio.ratio-concept",
      "target": "math.fractions.equivalence-compare-4",
      "kind": "requires"
    },
    {
      "source": "reading-writing.lc-verbal-reasoning.comprehension-strategies",
      "target": "reading-writing.wr-decoding.oral-reading-rate",
      "kind": "helps"
    },
    {
      "source": "reading-writing.lc-verbal-reasoning.comprehension-strategies",
      "target": "reading-writing.writing-composition.single-paragraph",
      "kind": "helps"
    },
    {
      "source": "reading-writing.lc-verbal-reasoning.comprehension-strategies",
      "target": "thinking.reasoning.claim-evidence",
      "kind": "helps"
    },
    {
      "source": "reading-writing.lc-verbal-reasoning.reciprocal-teaching",
      "target": "reading-writing.lc-verbal-reasoning.comprehension-strategies",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-decoding.blends",
      "target": "reading-writing.wr-decoding.digraphs-floss",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-decoding.cvc-blend",
      "target": "reading-writing.wr-decoding.letter-sounds",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-decoding.digraphs-floss",
      "target": "reading-writing.wr-decoding.cvc-blend",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-decoding.letter-sounds",
      "target": "reading-writing.wr-phon-awareness.phoneme-blend-seg",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-decoding.multisyllable",
      "target": "reading-writing.wr-decoding.vowel-teams",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-decoding.oral-reading-rate",
      "target": "reading-writing.wr-decoding.multisyllable",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-decoding.oral-reading-rate",
      "target": "reading-writing.wr-sight-recognition.hfw",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-decoding.oral-reading-rate",
      "target": "math.addsub.wp-result-unknown",
      "kind": "helps"
    },
    {
      "source": "reading-writing.wr-decoding.oral-reading-rate",
      "target": "math.addsub.wp-change-addend-compare",
      "kind": "helps"
    },
    {
      "source": "reading-writing.wr-decoding.oral-reading-rate",
      "target": "math.addsub.wp-start-unknown-two-step",
      "kind": "helps"
    },
    {
      "source": "reading-writing.wr-decoding.oral-reading-rate",
      "target": "math.multdiv.mult-div-word-problems",
      "kind": "helps"
    },
    {
      "source": "reading-writing.wr-decoding.silent-e",
      "target": "reading-writing.wr-decoding.blends",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-decoding.vowel-teams",
      "target": "reading-writing.wr-decoding.silent-e",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-encoding.morphology",
      "target": "reading-writing.wr-encoding.suffix-rules",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-encoding.morphology",
      "target": "reading-writing.lc-vocabulary.oral-vocab",
      "kind": "helps"
    },
    {
      "source": "reading-writing.wr-encoding.morphology",
      "target": "reading-writing.lc-verbal-reasoning.comprehension-strategies",
      "kind": "helps"
    },
    {
      "source": "reading-writing.wr-encoding.spell-cvc-digraph-blend",
      "target": "reading-writing.wr-decoding.cvc-blend",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-encoding.spell-silent-e-vowelteams",
      "target": "reading-writing.wr-encoding.spell-cvc-digraph-blend",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-encoding.spell-silent-e-vowelteams",
      "target": "reading-writing.wr-decoding.silent-e",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-encoding.suffix-rules",
      "target": "reading-writing.wr-encoding.spell-silent-e-vowelteams",
      "kind": "requires"
    },
    {
      "source": "reading-writing.wr-sight-recognition.hfw",
      "target": "reading-writing.wr-decoding.letter-sounds",
      "kind": "requires"
    },
    {
      "source": "reading-writing.writing-composition.sentence-expansion",
      "target": "reading-writing.lc-lang-structures.sentence-anatomy",
      "kind": "requires"
    },
    {
      "source": "reading-writing.writing-composition.sentence-expansion",
      "target": "thinking.inquiry.consider-both-sides",
      "kind": "helps"
    },
    {
      "source": "reading-writing.writing-composition.single-paragraph",
      "target": "reading-writing.writing-composition.sentence-expansion",
      "kind": "requires"
    },
    {
      "source": "reading-writing.writing-composition.single-paragraph",
      "target": "reading-writing.lc-verbal-reasoning.comprehension-strategies",
      "kind": "helps"
    },
    {
      "source": "thinking.inquiry.consider-both-sides",
      "target": "thinking.reasoning.claim-evidence",
      "kind": "helps"
    },
    {
      "source": "thinking.inquiry.question-formulation",
      "target": "thinking.inquiry.consider-both-sides",
      "kind": "helps"
    },
    {
      "source": "thinking.inquiry.question-formulation",
      "target": "thinking.metacog.plan-the-approach",
      "kind": "helps"
    },
    {
      "source": "thinking.metacog.spot-the-trap",
      "target": "thinking.metacog.check-your-work",
      "kind": "helps"
    },
    {
      "source": "thinking.reasoning.claim-evidence",
      "target": "thinking.inquiry.consider-both-sides",
      "kind": "helps"
    },
    {
      "source": "thinking.reasoning.compare-contrast",
      "target": "thinking.reasoning.claim-evidence",
      "kind": "helps"
    },
    {
      "source": "thinking.reasoning.compare-contrast",
      "target": "thinking.reasoning.deep-structure-transfer",
      "kind": "helps"
    },
    {
      "source": "thinking.reasoning.estimation-sanity-check",
      "target": "thinking.metacog.check-your-work",
      "kind": "helps"
    },
    {
      "source": "thinking.reasoning.estimation-sanity-check",
      "target": "math.measure.length-ruler",
      "kind": "helps"
    },
    {
      "source": "thinking.reasoning.estimation-sanity-check",
      "target": "math.measure.measure-fraction-inch-convert",
      "kind": "helps"
    },
    {
      "source": "thinking.reasoning.pattern-rule",
      "target": "thinking.reasoning.deep-structure-transfer",
      "kind": "helps"
    },
    {
      "source": "thinking.reasoning.self-explanation",
      "target": "thinking.reasoning.claim-evidence",
      "kind": "helps"
    },
    {
      "source": "thinking.reasoning.self-explanation",
      "target": "thinking.reasoning.estimation-sanity-check",
      "kind": "helps"
    },
    {
      "source": "thinking.reasoning.sort-classify",
      "target": "thinking.reasoning.compare-contrast",
      "kind": "helps"
    },
    {
      "source": "thinking.reasoning.sort-classify",
      "target": "thinking.reasoning.pattern-rule",
      "kind": "helps"
    },
    {
      "source": "world-models.body.five-senses",
      "target": "world-models.body.eyes-ears",
      "kind": "helps"
    },
    {
      "source": "world-models.body.heart-lungs",
      "target": "math.counting.count-objects-cardinality",
      "kind": "helps"
    },
    {
      "source": "world-models.civics.government-what-it-is",
      "target": "world-models.civics.three-branches",
      "kind": "helps"
    },
    {
      "source": "world-models.civics.rules-and-laws",
      "target": "world-models.civics.government-what-it-is",
      "kind": "helps"
    },
    {
      "source": "world-models.earthsky.weather-patterns",
      "target": "math.measure.data-graphs",
      "kind": "helps"
    },
    {
      "source": "world-models.geo.maps-globes",
      "target": "world-models.geo.continents-oceans",
      "kind": "helps"
    },
    {
      "source": "world-models.howthings.simple-machines",
      "target": "world-models.howthings.compound-machines",
      "kind": "helps"
    },
    {
      "source": "world-models.money.goods-services",
      "target": "world-models.money.trade-barter",
      "kind": "helps"
    },
    {
      "source": "world-models.money.wants-needs",
      "target": "thinking.inquiry.consider-both-sides",
      "kind": "helps"
    },
    {
      "source": "world-models.money.what-is-money",
      "target": "math.measure.money-coins-bills",
      "kind": "helps"
    },
    {
      "source": "world-models.money.what-is-money",
      "target": "world-models.money.trade-barter",
      "kind": "helps"
    }
  ],
  "kids": {
    "cora": {
      "kid": "cora",
      "profile_id": 2,
      "levels": {
        "math.addsub.add-sub-fluency-5": "L1",
        "reading-writing.wr-phon-awareness.phoneme-blend-seg": "L3",
        "reading-writing.wr-decoding.letter-sounds": "L3",
        "reading-writing.wr-decoding.cvc-blend": "L3",
        "reading-writing.wr-decoding.digraphs-floss": "L2",
        "reading-writing.wr-decoding.blends": "L1"
      },
      "frontier": {
        "constrained": [
          {
            "id": "math.counting.count-sequence-100",
            "title": "Oral count sequence to 100 (by 1s and 10s), count on from any number",
            "domain": "math",
            "strand": "counting",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "math.geometry.name-shapes-visual",
            "title": "Name 2-D/3-D shapes regardless of orientation/size; 2-D vs 3-D",
            "domain": "math",
            "strand": "geometry",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "math.measure.compare-order-length",
            "title": "Compare & order length; indirect comparison (transitivity)",
            "domain": "math",
            "strand": "measure",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "reading-writing.lc-lang-structures.sentence-anatomy",
            "title": "Sentence anatomy: fragments vs sentences; sentence types",
            "domain": "reading-writing",
            "strand": "lc-lang-structures",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "reading-writing.lc-literacy-knowledge.readaloud-retell",
            "title": "Listen, retell & story structure (interactive read-aloud)",
            "domain": "reading-writing",
            "strand": "lc-literacy-knowledge",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "reading-writing.lc-verbal-reasoning.comprehension-strategies",
            "title": "Comprehension strategies (predict / question / monitor / summarize / text-structure)",
            "domain": "reading-writing",
            "strand": "lc-verbal-reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "reading-writing.lc-vocabulary.oral-vocab",
            "title": "Oral vocabulary (learn & use new words)",
            "domain": "reading-writing",
            "strand": "lc-vocabulary",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "reading-writing.wr-decoding.digraphs-floss",
            "title": "Digraphs & the FLOSS doubling rule",
            "domain": "reading-writing",
            "strand": "wr-decoding",
            "tier": "L3",
            "level": "L2",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "reading-writing.wr-decoding.cvc-blend",
                "level": "L3"
              }
            ]
          },
          {
            "id": "reading-writing.wr-decoding.letter-sounds",
            "title": "Letter-sound correspondences",
            "domain": "reading-writing",
            "strand": "wr-decoding",
            "tier": "L4",
            "level": "L3",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "reading-writing.wr-phon-awareness.phoneme-blend-seg",
                "level": "L3"
              }
            ]
          },
          {
            "id": "reading-writing.wr-encoding.spell-cvc-digraph-blend",
            "title": "Spell CVC, digraphs, blends & FLOSS",
            "domain": "reading-writing",
            "strand": "wr-encoding",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "reading-writing.wr-decoding.cvc-blend",
                "level": "L3"
              }
            ]
          },
          {
            "id": "reading-writing.wr-sight-recognition.hfw",
            "title": "High-frequency / trick words (automatic sight reading)",
            "domain": "reading-writing",
            "strand": "wr-sight-recognition",
            "tier": "L4",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "reading-writing.wr-decoding.letter-sounds",
                "level": "L3"
              }
            ]
          }
        ],
        "free_roam_open": [
          {
            "id": "thinking.inquiry.consider-both-sides",
            "title": "Give a reason for AND against before deciding",
            "domain": "thinking",
            "strand": "inquiry",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.inquiry.question-formulation",
            "title": "Ask and sort your own questions (QFT gear)",
            "domain": "thinking",
            "strand": "inquiry",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.metacog.check-your-work",
            "title": "Re-verify by a different method and catch errors",
            "domain": "thinking",
            "strand": "metacog",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.metacog.plan-the-approach",
            "title": "Name the problem type and pick a strategy first",
            "domain": "thinking",
            "strand": "metacog",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.metacog.spot-the-trap",
            "title": "Detect a plausible-but-wrong option",
            "domain": "thinking",
            "strand": "metacog",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.claim-evidence",
            "title": "Make a claim and point to the evidence",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.compare-contrast",
            "title": "Name same and different on a chosen dimension",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.deep-structure-transfer",
            "title": "Recognize a new problem is 'the same kind' as a known one",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.estimation-sanity-check",
            "title": "Estimate 'about how many' and check reasonableness",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.pattern-rule",
            "title": "Extend a pattern and articulate the rule",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.self-explanation",
            "title": "Say WHY a step or fact is true",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.sort-classify",
            "title": "Sort by a rule and state the rule",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.body.digestion",
            "title": "Eating & digestion",
            "domain": "world-models",
            "strand": "body",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.body.eyes-ears",
            "title": "How the eye & ear work",
            "domain": "world-models",
            "strand": "body",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.body.five-senses",
            "title": "The five senses",
            "domain": "world-models",
            "strand": "body",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.body.heart-lungs",
            "title": "Heart, blood & breathing",
            "domain": "world-models",
            "strand": "body",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.body.skeleton-muscles",
            "title": "Bones & muscles",
            "domain": "world-models",
            "strand": "body",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.civics.government-what-it-is",
            "title": "What government does",
            "domain": "world-models",
            "strand": "civics",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.civics.rules-and-laws",
            "title": "Why we have rules & laws",
            "domain": "world-models",
            "strand": "civics",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.civics.three-branches",
            "title": "The three branches",
            "domain": "world-models",
            "strand": "civics",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.civics.voting-citizenship",
            "title": "Voting & being a citizen",
            "domain": "world-models",
            "strand": "civics",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.earthsky.earths-water",
            "title": "Earth's water (oceans, rivers, ice)",
            "domain": "world-models",
            "strand": "earthsky",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.earthsky.landforms",
            "title": "Landforms & how land changes",
            "domain": "world-models",
            "strand": "earthsky",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.earthsky.severe-weather",
            "title": "Severe weather & staying safe",
            "domain": "world-models",
            "strand": "earthsky",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.earthsky.water-cycle",
            "title": "The water cycle",
            "domain": "world-models",
            "strand": "earthsky",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.earthsky.weather-patterns",
            "title": "Weather & seasons",
            "domain": "world-models",
            "strand": "earthsky",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.earthsky.weather-vs-climate",
            "title": "Weather vs climate",
            "domain": "world-models",
            "strand": "earthsky",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.geo.continents-oceans",
            "title": "Continents & oceans",
            "domain": "world-models",
            "strand": "geo",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.geo.maps-globes",
            "title": "Maps & globes",
            "domain": "world-models",
            "strand": "geo",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.howthings.compound-machines",
            "title": "Compound machines (cars, bikes)",
            "domain": "world-models",
            "strand": "howthings",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.howthings.electricity",
            "title": "Electricity & circuits",
            "domain": "world-models",
            "strand": "howthings",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.howthings.forces-pushes-pulls",
            "title": "Pushes, pulls & forces",
            "domain": "world-models",
            "strand": "howthings",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.howthings.magnets",
            "title": "Magnets & magnetism",
            "domain": "world-models",
            "strand": "howthings",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.howthings.plumbing-water-systems",
            "title": "Where clean water comes from",
            "domain": "world-models",
            "strand": "howthings",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.howthings.simple-machines",
            "title": "Simple machines",
            "domain": "world-models",
            "strand": "howthings",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.money.goods-services",
            "title": "Goods & services",
            "domain": "world-models",
            "strand": "money",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.money.trade-barter",
            "title": "Trade & how money moves",
            "domain": "world-models",
            "strand": "money",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.money.wants-needs",
            "title": "Wants vs needs & choices",
            "domain": "world-models",
            "strand": "money",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.money.what-is-money",
            "title": "What money is & why we use it",
            "domain": "world-models",
            "strand": "money",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          }
        ],
        "constrained_count": 11,
        "free_roam_open_count": 39
      },
      "frontier_ids": [
        "math.counting.count-sequence-100",
        "math.geometry.name-shapes-visual",
        "math.measure.compare-order-length",
        "reading-writing.lc-lang-structures.sentence-anatomy",
        "reading-writing.lc-literacy-knowledge.readaloud-retell",
        "reading-writing.lc-verbal-reasoning.comprehension-strategies",
        "reading-writing.lc-vocabulary.oral-vocab",
        "reading-writing.wr-decoding.digraphs-floss",
        "reading-writing.wr-decoding.letter-sounds",
        "reading-writing.wr-encoding.spell-cvc-digraph-blend",
        "reading-writing.wr-sight-recognition.hfw"
      ],
      "free_roam_ids": [
        "thinking.inquiry.consider-both-sides",
        "thinking.inquiry.question-formulation",
        "thinking.metacog.check-your-work",
        "thinking.metacog.plan-the-approach",
        "thinking.metacog.spot-the-trap",
        "thinking.reasoning.claim-evidence",
        "thinking.reasoning.compare-contrast",
        "thinking.reasoning.deep-structure-transfer",
        "thinking.reasoning.estimation-sanity-check",
        "thinking.reasoning.pattern-rule",
        "thinking.reasoning.self-explanation",
        "thinking.reasoning.sort-classify",
        "world-models.body.digestion",
        "world-models.body.eyes-ears",
        "world-models.body.five-senses",
        "world-models.body.heart-lungs",
        "world-models.body.skeleton-muscles",
        "world-models.civics.government-what-it-is",
        "world-models.civics.rules-and-laws",
        "world-models.civics.three-branches",
        "world-models.civics.voting-citizenship",
        "world-models.earthsky.earths-water",
        "world-models.earthsky.landforms",
        "world-models.earthsky.severe-weather",
        "world-models.earthsky.water-cycle",
        "world-models.earthsky.weather-patterns",
        "world-models.earthsky.weather-vs-climate",
        "world-models.geo.continents-oceans",
        "world-models.geo.maps-globes",
        "world-models.howthings.compound-machines",
        "world-models.howthings.electricity",
        "world-models.howthings.forces-pushes-pulls",
        "world-models.howthings.magnets",
        "world-models.howthings.plumbing-water-systems",
        "world-models.howthings.simple-machines",
        "world-models.money.goods-services",
        "world-models.money.trade-barter",
        "world-models.money.wants-needs",
        "world-models.money.what-is-money"
      ]
    },
    "penelope": {
      "kid": "penelope",
      "profile_id": 3,
      "levels": {
        "math.counting.count-sequence-100": "L3",
        "math.counting.count-objects-cardinality": "L3",
        "math.counting.compare-numbers-20": "L3",
        "math.placevalue.teen-numbers-place": "L3",
        "math.placevalue.two-digit-place-value": "L3",
        "math.addsub.represent-add-sub": "L3",
        "math.addsub.decompose-make-10": "L3",
        "math.addsub.counting-on": "L3",
        "math.addsub.add-sub-fluency-5": "L4",
        "math.addsub.add-sub-fluency-10": "L3",
        "math.addsub.make-a-ten-strategy": "L2",
        "math.addsub.add-facts-memory-20": "L2",
        "math.counting.skip-count-2-5-10": "L2",
        "math.counting.write-digits": "L4",
        "math.multdiv.mult-facts-easy": "L1",
        "math.multdiv.mult-div-facts-memory-100": "L1",
        "math.measure.tell-time-hour-half": "L1",
        "math.measure.tell-time-5min": "L1",
        "reading-writing.wr-encoding.spell-cvc-digraph-blend": "L3",
        "reading-writing.wr-encoding.spell-silent-e-vowelteams": "L3",
        "reading-writing.wr-phon-awareness.phoneme-blend-seg": "L3",
        "reading-writing.wr-decoding.letter-sounds": "L4",
        "reading-writing.wr-decoding.cvc-blend": "L3",
        "reading-writing.wr-decoding.digraphs-floss": "L3",
        "reading-writing.wr-decoding.blends": "L3",
        "reading-writing.wr-decoding.silent-e": "L3",
        "reading-writing.wr-decoding.vowel-teams": "L3",
        "reading-writing.wr-decoding.multisyllable": "L3",
        "reading-writing.lc-lang-structures.sentence-anatomy": "L2",
        "math.counting.count-oral-skip": "L3",
        "reading-writing.wr-sight-recognition.hfw": "L4"
      },
      "frontier": {
        "constrained": [
          {
            "id": "math.addsub.add-sub-fluency-10",
            "title": "Fluency for add & subtract within 10",
            "domain": "math",
            "strand": "addsub",
            "tier": "L4",
            "level": "L3",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "math.addsub.add-sub-fluency-5",
                "level": "L4"
              },
              {
                "node": "math.addsub.counting-on",
                "level": "L3"
              }
            ]
          },
          {
            "id": "math.addsub.equal-sign-unknown",
            "title": "Meaning of =; true/false equations; find the unknown in any position",
            "domain": "math",
            "strand": "addsub",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "math.addsub.counting-on",
                "level": "L3"
              }
            ]
          },
          {
            "id": "math.addsub.make-a-ten-strategy",
            "title": "Add/sub within 20 via make-a-ten (Level 3) and derived facts; add 3 numbers",
            "domain": "math",
            "strand": "addsub",
            "tier": "L3",
            "level": "L2",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "math.addsub.add-sub-fluency-10",
                "level": "L3"
              },
              {
                "node": "math.addsub.decompose-make-10",
                "level": "L3"
              },
              {
                "node": "math.placevalue.teen-numbers-place",
                "level": "L3"
              }
            ]
          },
          {
            "id": "math.addsub.wp-result-unknown",
            "title": "Word problems: Add-To/Take-From/Put-Together, Result & Total Unknown",
            "domain": "math",
            "strand": "addsub",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "math.addsub.represent-add-sub",
                "level": "L3"
              },
              {
                "node": "math.addsub.decompose-make-10",
                "level": "L3"
              }
            ]
          },
          {
            "id": "math.counting.count-oral-skip",
            "title": "Skip-count by 2s, 5s, 10s (oral fluency tool skill)",
            "domain": "math",
            "strand": "counting",
            "tier": "L4",
            "level": "L3",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "math.counting.count-sequence-100",
                "level": "L3"
              }
            ]
          },
          {
            "id": "math.counting.skip-count-2-5-10",
            "title": "Skip-count by 2s/5s/10s to 1000; count within 1000 (understanding, not rate)",
            "domain": "math",
            "strand": "counting",
            "tier": "L3",
            "level": "L2",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "math.counting.count-sequence-100",
                "level": "L3"
              }
            ]
          },
          {
            "id": "math.geometry.name-shapes-visual",
            "title": "Name 2-D/3-D shapes regardless of orientation/size; 2-D vs 3-D",
            "domain": "math",
            "strand": "geometry",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "math.measure.compare-order-length",
            "title": "Compare & order length; indirect comparison (transitivity)",
            "domain": "math",
            "strand": "measure",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "math.measure.data-graphs",
            "title": "Classify & count categories; picture graphs & bar graphs (single-unit)",
            "domain": "math",
            "strand": "measure",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "math.counting.count-objects-cardinality",
                "level": "L3"
              }
            ]
          },
          {
            "id": "math.measure.tell-time-hour-half",
            "title": "Tell & write time to the hour and half-hour (analog + digital)",
            "domain": "math",
            "strand": "measure",
            "tier": "L3",
            "level": "L1",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "math.counting.count-sequence-100",
                "level": "L3"
              }
            ]
          },
          {
            "id": "math.placevalue.three-digit-place-value",
            "title": "Three-digit place value to 1000; compare; read/write/expanded form; \u00b110/100",
            "domain": "math",
            "strand": "placevalue",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "math.placevalue.two-digit-place-value",
                "level": "L3"
              }
            ]
          },
          {
            "id": "reading-writing.lc-lang-structures.sentence-anatomy",
            "title": "Sentence anatomy: fragments vs sentences; sentence types",
            "domain": "reading-writing",
            "strand": "lc-lang-structures",
            "tier": "L3",
            "level": "L2",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "reading-writing.lc-literacy-knowledge.readaloud-retell",
            "title": "Listen, retell & story structure (interactive read-aloud)",
            "domain": "reading-writing",
            "strand": "lc-literacy-knowledge",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "reading-writing.lc-verbal-reasoning.comprehension-strategies",
            "title": "Comprehension strategies (predict / question / monitor / summarize / text-structure)",
            "domain": "reading-writing",
            "strand": "lc-verbal-reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "reading-writing.lc-vocabulary.oral-vocab",
            "title": "Oral vocabulary (learn & use new words)",
            "domain": "reading-writing",
            "strand": "lc-vocabulary",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": []
          },
          {
            "id": "reading-writing.wr-decoding.oral-reading-rate",
            "title": "Oral reading fluency (connected text, WCPM)",
            "domain": "reading-writing",
            "strand": "wr-decoding",
            "tier": "L4",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "reading-writing.wr-decoding.multisyllable",
                "level": "L3"
              },
              {
                "node": "reading-writing.wr-sight-recognition.hfw",
                "level": "L4"
              }
            ]
          },
          {
            "id": "reading-writing.wr-encoding.suffix-rules",
            "title": "Suffix spelling rules: doubling / drop-e / y-to-i",
            "domain": "reading-writing",
            "strand": "wr-encoding",
            "tier": "L3",
            "level": "L0",
            "traversal": "constrained",
            "satisfied_prereqs": [
              {
                "node": "reading-writing.wr-encoding.spell-silent-e-vowelteams",
                "level": "L3"
              }
            ]
          }
        ],
        "free_roam_open": [
          {
            "id": "thinking.inquiry.consider-both-sides",
            "title": "Give a reason for AND against before deciding",
            "domain": "thinking",
            "strand": "inquiry",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.inquiry.question-formulation",
            "title": "Ask and sort your own questions (QFT gear)",
            "domain": "thinking",
            "strand": "inquiry",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.metacog.check-your-work",
            "title": "Re-verify by a different method and catch errors",
            "domain": "thinking",
            "strand": "metacog",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.metacog.plan-the-approach",
            "title": "Name the problem type and pick a strategy first",
            "domain": "thinking",
            "strand": "metacog",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.metacog.spot-the-trap",
            "title": "Detect a plausible-but-wrong option",
            "domain": "thinking",
            "strand": "metacog",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.claim-evidence",
            "title": "Make a claim and point to the evidence",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.compare-contrast",
            "title": "Name same and different on a chosen dimension",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.deep-structure-transfer",
            "title": "Recognize a new problem is 'the same kind' as a known one",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.estimation-sanity-check",
            "title": "Estimate 'about how many' and check reasonableness",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.pattern-rule",
            "title": "Extend a pattern and articulate the rule",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.self-explanation",
            "title": "Say WHY a step or fact is true",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "thinking.reasoning.sort-classify",
            "title": "Sort by a rule and state the rule",
            "domain": "thinking",
            "strand": "reasoning",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.body.digestion",
            "title": "Eating & digestion",
            "domain": "world-models",
            "strand": "body",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.body.eyes-ears",
            "title": "How the eye & ear work",
            "domain": "world-models",
            "strand": "body",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.body.five-senses",
            "title": "The five senses",
            "domain": "world-models",
            "strand": "body",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.body.heart-lungs",
            "title": "Heart, blood & breathing",
            "domain": "world-models",
            "strand": "body",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.body.skeleton-muscles",
            "title": "Bones & muscles",
            "domain": "world-models",
            "strand": "body",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.civics.government-what-it-is",
            "title": "What government does",
            "domain": "world-models",
            "strand": "civics",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.civics.rules-and-laws",
            "title": "Why we have rules & laws",
            "domain": "world-models",
            "strand": "civics",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.civics.three-branches",
            "title": "The three branches",
            "domain": "world-models",
            "strand": "civics",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.civics.voting-citizenship",
            "title": "Voting & being a citizen",
            "domain": "world-models",
            "strand": "civics",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.earthsky.earths-water",
            "title": "Earth's water (oceans, rivers, ice)",
            "domain": "world-models",
            "strand": "earthsky",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.earthsky.landforms",
            "title": "Landforms & how land changes",
            "domain": "world-models",
            "strand": "earthsky",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.earthsky.severe-weather",
            "title": "Severe weather & staying safe",
            "domain": "world-models",
            "strand": "earthsky",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.earthsky.water-cycle",
            "title": "The water cycle",
            "domain": "world-models",
            "strand": "earthsky",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.earthsky.weather-patterns",
            "title": "Weather & seasons",
            "domain": "world-models",
            "strand": "earthsky",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.earthsky.weather-vs-climate",
            "title": "Weather vs climate",
            "domain": "world-models",
            "strand": "earthsky",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.geo.continents-oceans",
            "title": "Continents & oceans",
            "domain": "world-models",
            "strand": "geo",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.geo.maps-globes",
            "title": "Maps & globes",
            "domain": "world-models",
            "strand": "geo",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.howthings.compound-machines",
            "title": "Compound machines (cars, bikes)",
            "domain": "world-models",
            "strand": "howthings",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.howthings.electricity",
            "title": "Electricity & circuits",
            "domain": "world-models",
            "strand": "howthings",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.howthings.forces-pushes-pulls",
            "title": "Pushes, pulls & forces",
            "domain": "world-models",
            "strand": "howthings",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.howthings.magnets",
            "title": "Magnets & magnetism",
            "domain": "world-models",
            "strand": "howthings",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.howthings.plumbing-water-systems",
            "title": "Where clean water comes from",
            "domain": "world-models",
            "strand": "howthings",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.howthings.simple-machines",
            "title": "Simple machines",
            "domain": "world-models",
            "strand": "howthings",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.money.goods-services",
            "title": "Goods & services",
            "domain": "world-models",
            "strand": "money",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.money.trade-barter",
            "title": "Trade & how money moves",
            "domain": "world-models",
            "strand": "money",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.money.wants-needs",
            "title": "Wants vs needs & choices",
            "domain": "world-models",
            "strand": "money",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          },
          {
            "id": "world-models.money.what-is-money",
            "title": "What money is & why we use it",
            "domain": "world-models",
            "strand": "money",
            "tier": "L3",
            "level": "L0",
            "traversal": "free-roam",
            "satisfied_prereqs": []
          }
        ],
        "constrained_count": 17,
        "free_roam_open_count": 39
      },
      "frontier_ids": [
        "math.addsub.add-sub-fluency-10",
        "math.addsub.equal-sign-unknown",
        "math.addsub.make-a-ten-strategy",
        "math.addsub.wp-result-unknown",
        "math.counting.count-oral-skip",
        "math.counting.skip-count-2-5-10",
        "math.geometry.name-shapes-visual",
        "math.measure.compare-order-length",
        "math.measure.data-graphs",
        "math.measure.tell-time-hour-half",
        "math.placevalue.three-digit-place-value",
        "reading-writing.lc-lang-structures.sentence-anatomy",
        "reading-writing.lc-literacy-knowledge.readaloud-retell",
        "reading-writing.lc-verbal-reasoning.comprehension-strategies",
        "reading-writing.lc-vocabulary.oral-vocab",
        "reading-writing.wr-decoding.oral-reading-rate",
        "reading-writing.wr-encoding.suffix-rules"
      ],
      "free_roam_ids": [
        "thinking.inquiry.consider-both-sides",
        "thinking.inquiry.question-formulation",
        "thinking.metacog.check-your-work",
        "thinking.metacog.plan-the-approach",
        "thinking.metacog.spot-the-trap",
        "thinking.reasoning.claim-evidence",
        "thinking.reasoning.compare-contrast",
        "thinking.reasoning.deep-structure-transfer",
        "thinking.reasoning.estimation-sanity-check",
        "thinking.reasoning.pattern-rule",
        "thinking.reasoning.self-explanation",
        "thinking.reasoning.sort-classify",
        "world-models.body.digestion",
        "world-models.body.eyes-ears",
        "world-models.body.five-senses",
        "world-models.body.heart-lungs",
        "world-models.body.skeleton-muscles",
        "world-models.civics.government-what-it-is",
        "world-models.civics.rules-and-laws",
        "world-models.civics.three-branches",
        "world-models.civics.voting-citizenship",
        "world-models.earthsky.earths-water",
        "world-models.earthsky.landforms",
        "world-models.earthsky.severe-weather",
        "world-models.earthsky.water-cycle",
        "world-models.earthsky.weather-patterns",
        "world-models.earthsky.weather-vs-climate",
        "world-models.geo.continents-oceans",
        "world-models.geo.maps-globes",
        "world-models.howthings.compound-machines",
        "world-models.howthings.electricity",
        "world-models.howthings.forces-pushes-pulls",
        "world-models.howthings.magnets",
        "world-models.howthings.plumbing-water-systems",
        "world-models.howthings.simple-machines",
        "world-models.money.goods-services",
        "world-models.money.trade-barter",
        "world-models.money.wants-needs",
        "world-models.money.what-is-money"
      ]
    }
  }
}
