{"record":{"id":"acce46f72e37fcf4","repo":"gastownhall/beads","slug":"evaluating-range-start-q-w","errorCode":null,"errorMessage":"evaluating range start %q: %w","messagePattern":"evaluating range start %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/formula/range.go","lineNumber":60,"sourceCode":"func ParseRange(expr string, vars map[string]string) (*RangeSpec, error) {\n\texpr = strings.TrimSpace(expr)\n\tif expr == \"\" {\n\t\treturn nil, fmt.Errorf(\"empty range expression\")\n\t}\n\n\t// Parse start..end format\n\tm := rangePattern.FindStringSubmatch(expr)\n\tif m == nil {\n\t\treturn nil, fmt.Errorf(\"invalid range format %q: expected start..end\", expr)\n\t}\n\n\tstartExpr := strings.TrimSpace(m[1])\n\tendExpr := strings.TrimSpace(m[2])\n\n\t// Evaluate start expression\n\tstart, err := EvaluateExpr(startExpr, vars)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"evaluating range start %q: %w\", startExpr, err)\n\t}\n\n\t// Evaluate end expression\n\tend, err := EvaluateExpr(endExpr, vars)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"evaluating range end %q: %w\", endExpr, err)\n\t}\n\n\treturn &RangeSpec{Start: start, End: end}, nil\n}\n\n// EvaluateExpr evaluates a mathematical expression with variable substitution.\n// Supports: + - * / ^ (power) and parentheses.\n// Variables use {name} syntax.\nfunc EvaluateExpr(expr string, vars map[string]string) (int, error) {\n\t// Substitute variables first\n\texpr = substituteVars(expr, vars)\n","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/formula/range.go#L42-L78","documentation":"ParseRange() matched the start..end structure but EvaluateExpr failed on the start expression, so the start side is not a valid arithmetic expression (after variable substitution). The failing start expression and the underlying evaluator error are wrapped for diagnosis.","triggerScenarios":"ParseRange(\"a..10\", vars) where variable 'a' is undefined in vars; a start expression with unsupported syntax (non-numeric tokens, unknown operators); unexpanded template placeholders like \"{n}\" with no matching var key.","commonSituations":"Loop range defined as \"2^{n}..10\" but var n missing from the expansion vars; typo in the variable name inside the start expression; locale/formatting issues leaving commas or units (e.g. \"1,000\") in the expression.","solutions":["Fix the start expression to a valid arithmetic expression, e.g. \"1..10\" or \"2^{n}..10\".","Ensure every variable referenced in the start expression exists in the vars map passed to ParseRange.","Read the inner wrapped error from EvaluateExpr — it names the exact evaluation problem (unknown var, bad token)."],"exampleFix":"# before\nrange: \"{start}..10\"   # start not in vars\n\n# after\nvars: { start: \"1\" }\nrange: \"{start}..10\"","handlingStrategy":"validation","validationCode":"// Check that every {var} in the start expression exists before parsing.\nfor _, m := range varRefRe.FindAllStringSubmatch(startExpr, -1) {\n\tif _, ok := vars[m[1]]; !ok {\n\t\treturn fmt.Errorf\"undefined var %q in range start\", m[1]\n\t}\n}\nif _, err := EvaluateExpr(startExpr, vars); err != nil {\n\treturn fmt.Errorf\"bad range start: %w\", err\n}","typeGuard":null,"tryCatchPattern":"spec, err := ParseRange(expr, vars)\nif err != nil {\n\tvar evalErr error\n\tif errors.As(err, &evalErr) && strings.Contains(err.Error(), \"evaluating range start\") {\n\t\t// fix the start expression or its vars\n\t}\n}","preventionTips":["Verify all vars referenced in range expressions are in the vars map.","Keep range expressions simple: integer literals and ^ arithmetic only.","Test molecules with their declared vars set to representative values."],"tags":["go","range","expression-evaluation","variables"],"backgroundTag":"invalid-range-format","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}