aMin > aMax or bMin > bMax, rnd(min, max) receives a negative range. Math.floor(Math.random() * negative) produces garbage — large negative numbers that become nonsensical problem text. Fixed: explicit guard fires before any problem generates, exits with a named error message explaining which range is inverted.laMin was set to 1, the generator produced equations like 1x + 5 = 8. This is not a meaningful algebra problem — it's trivially x = c − b with no coefficient to solve through. Fixed: guard requires a ≥ 2 with an explanation of why.CERTIFICATION.md in the Sovereign Trace Protocol repository. Gold SVG seal matches the RCS Physics Simulator. This product is certified under the AION Constitutional Stack.bMin and bMax were both 0, Math.max(0,1)=1 overrode silently — displayed range said "0–0" but problems generated with divisor=1. Fixed: explicit pre-generate guard detects bMin===0 && bMax===0 and exits with named error: "Divisor range cannot be 0–0. Set B Min to at least 1." No silent override remains.simplify(n, d) function reduce all answers to lowest terms. Inline display format (a/b — not stacked, print-safe). Guards: denominator clamp ≥1; subtraction ensures numerator result ≥0. Quick templates: "Fractions (Like)" and "Fractions (Unlike)."<sup> superscript — verified functional in preview and PDF print window. Hard cap at exponent 5 enforced in both UI (max="5") and JS generator. Quick template: "Exponents."unlike-sub swapped only the numerators when ensuring a/c ≥ b/d, while keeping denominators c and d in their original positions. This is mathematically incorrect — swapping numerators without swapping their paired denominators can produce negative answers (e.g. 2/10 − 1/1 = negative). Fixed: swap the full fraction pairs [n1,d1,n2,d2] = [n2,d2,n1,d1] so the larger fraction always appears first. The cross-product comparison now correctly guards the paired units.
ops = ['+', '-', '×'] — the ASCII hyphen-minus for subtraction. Every other generator in this tool uses the Unicode minus sign − (U+2212). Result: PEMDAS subtraction displayed as 3 - 5 while all other types display 3 − 5. Fixed: split into separate display and eval arrays. dispOps = ['+', '−', '×'] (Unicode) drives the worksheet display; evalOps = ['+', '-', '*'] (ASCII) drives the JS evaluator. Both arrays indexed by the same random index per operation.
(−3) using fmtNum(). The division generator formatted both operands in the display text using raw ${a*b} — bypassing fmtNum() for the dividend. If a=-3, b=4, the worksheet showed -12 ÷ 4 instead of (−12) ÷ 4. Fixed: fmtNum(a*b, allowNeg) now applied to the dividend consistently.
resize() to update canvas dimensions W and H, but did not rebuild the particle array. Particles were created at initial viewport density (e.g. laptop window) and stayed at that count regardless of how the window was resized. On a large monitor, the background would be sparse; on a narrow viewport, it would be crowded. Fixed: resize handler now rebuilds particles array at the new density calculation immediately after updating W and H.
genLinear built the constant display as b ≥ 0 ? '+ b' : '− |b|'. When b=0 (reachable via JSON template load, bypassing the HTML min="1" constraint), the equation displayed as 3x + 0 = 9 — not a valid algebra worksheet format. Fixed: three-branch display: b === 0 → '${a}x = ${c}', b > 0 → '${a}x + ${b} = ${c}', b < 0 → '${a}x − ${|b|} = ${c}'. The negative-constant branch also corrects a separate display issue: previously b could only be positive (HTML enforced), but JSON loading bypasses that constraint.
(a + b) × c — always a 2-step expression — even when the configured step count was 3 or 4. Fixed: fallback now builds a proper addition/subtraction chain matching the configured step count, evaluates it, and confirms a non-negative integer result before returning. A guaranteed-safe last-resort remains if the fallback chain also fails.
eval() to compute answers from user-entered expressions. A character whitelist (/[^0-9+\-*/() .]/g) blocks arbitrary code execution before evaluation. For a local-use, no-backend, zero-network tool this is acceptable. If Salmon EDU ever moves to a hosted platform, this must be replaced with a proper expression parser (e.g. math.js). Logged for architecture awareness. LIMITATION-1 (division b=0) resolved in Pass 3.The Salmon EDU Worksheet Builder is a single HTML file that runs entirely in your browser — no internet required after the first load, no login, no subscription, no IT approval needed. Download once, open forever. Generate unlimited worksheets, save templates as JSON files, and export to PDF using your browser's print dialog.
Click any chip in the Quick Templates card to instantly load a pre-configured worksheet. Templates set the pattern type, number ranges, problem count, and title. You can then adjust any setting before generating. Templates do not overwrite your saved JSON files.
Set your assignment title, student instructions, number of problems (1–50), and column layout (1 or 2 columns). 2 columns fits more problems per page — good for arithmetic. 1 column gives more space per problem — good for multi-step types like PEMDAS or Linear Equations.
{a:1-10} + {b:1-10}. Answers computed automatically for +, −, ×, ÷ expressions.In the Options card, turn on "Allow Negative Numbers" to enable negative operands in arithmetic problems (Addition, Subtraction, Multiplication, Division, Mixed). Negative numbers display in parentheses: (−3) + 7 = ___. Appropriate for Grades 6–7 pre-algebra. Division divisors always remain positive regardless of this setting.
When negatives are on, subtraction can produce negative results. Prepare students for this before assigning, or pair with a mini-lesson on the number line.
Select "Interleaved Practice ★" from the pattern dropdown. Choose at least 2 problem types using the checkboxes. The generator distributes problems across types using a shuffled order — no two problems of the same type appear consecutively. Each type uses whatever ranges you've configured in its own field panel.
Interleaving problem types — rather than practicing one type at a time — has been shown to double test scores compared to blocked practice (Taylor & Rohrer, 2010; Rohrer, Dedrick & Stershic, 2015). Blocked practice feels easier but produces weaker long-term retention. Interleaving forces students to identify which strategy applies to each problem — the key skill tested on exams.
Generate your worksheet with "Answer Key" turned ON. Print once for yourself — that's your teacher copy. Then turn Answer Key OFF and print the class set. Same problems, no answers. No extra steps.