List of bugs needed fixing:

Last previewed: September 28, 2025

precheckBlocks doesn't handle nested IF blocks properly. This means multiple nested IFs with missing END won't be caught as unclosed blocks and could result in misaligned execution (skipping lines or running too far).
Suspected Problem: if (/^IF\s+(.+)\s+THN\s*$/) { ... }

safeEval variable replacement may break string literals. If the user has a string like "do this" it might accidentally replace do inside quotes with __V["do"], leading to syntax errors.
Suspected Problem: const replaced = transformed.replace(/\b([A-Za-z_]\w*)\b/g, ...);

collectBlock doesn’t advance main index inside -c + N = loops. We never set i = endIndex after processing, which means: after running the loop, execution continues through the block a second time as if it was normal code, and we could accidentally double execute.
Suspected Problem: const { block, endIndex } = collectBlock(number);

Uncaught errors break async execution silently. Inside executeLine, the interpreter throw err after catching, but the outer try just swallows it. This could be the reason why errors that aren't hardcoded into executeLine don't show errors in the console, it just stops the execution and throws an error in console. No idea where exactly the suspected problem is

math.Add/Sub/Mul/Div regex is too strict. This only allows a single binary operation such as 2 + 5, it won't allow more digits, such as 2 + 5 + 4, or nested do Var + 3 * 2 won't work. Also, division by zero is not caught, it could throw infinity.
Suspected Problem: const parts = expr.match(/^(do\s+[A-Za-z_]\w*|\d+(?:\.\d+)?)\s*([\+\-\*\/])\s*(do\s+[A-Za-z_]\w*|\d+(?:\.\d+)?)$/i);.

Button leaks if the user runs multiple times fast. If the user spam run, cleanupRuntime() removes buttons but the event listeners are still attached because we don't call btn.removeEventListener before removing them. This is a memory leak. No idea where the suspected problem is.

Edge case: empty code still highlights first line. If editor is empty, queue[0] is undefined = crash.
Suspected Problem: if (queue.length === 0 || queue[0].line !== "STR")

Expression parser (parseConcatExpression) fails on escaped quotes. If you have, for example, RRI("Hello \"World\"") the function will toggle quotes incorrectly because it doesn't account for /".
No idea where the suspected problem is.

window.fetchDiagnostics is global (yipes). We expose window.fetchDiagnostics directly which could be abused from browser console to spam logs.
No idea where the suspected problem is.

"cringe" lyric output never clears output. If you run another script after cringe the old lyric timer keeps running and keeps appending to output.
No idea where the suspected problem is.