Why. src/lint.c has no undefined-name pass (W001–W014 are all mechanical), so the classic dynamic-language bug — a typo'd name in a rarely-taken branch — survives until that exact path executes at runtime. This is the single biggest large-codebase tax of every dynamic language (Lua's silent-nil, Python's late AttributeError). A name-resolution diagnostic delivers ~80% of gradual typing's practical value at a fraction of its cost, and hardens all 10 consumer repos at once. Deliberately NOT a type system (see the survey's do-not-do: a solo-maintainer half-built checker is worse than none, and f64-only semantics give a checker almost nothing to narrow).
What.
Acceptance. tests/test_lint.sh: fires on a typo in a cold branch; silent on outward-is, local shadowing, sibling-branch first assignment, module-qualified names; consumer-repo sweep produces no false positives (run it over lib/ and two consumers as the calibration gate).
Effort: weeks. Source: 2026-07-04 survey (correctness dimension; critic top-5 — "highest correctness yield per week available").
Why.
src/lint.chas no undefined-name pass (W001–W014 are all mechanical), so the classic dynamic-language bug — a typo'd name in a rarely-taken branch — survives until that exact path executes at runtime. This is the single biggest large-codebase tax of every dynamic language (Lua's silent-nil, Python's late AttributeError). A name-resolution diagnostic delivers ~80% of gradual typing's practical value at a fraction of its cost, and hardens all 10 consumer repos at once. Deliberately NOT a type system (see the survey's do-not-do: a solo-maintainer half-built checker is worse than none, and f64-only semantics give a checker almost nothing to narrow).What.
src/lint.c: use of a name with no binding on any path.ismutates outward,localshadows, module namespaces, and the sibling-if-branch first-assignment case that mechanical local passes miss (the load_file scope asymmetry: a lib function can write a caller global declared BEFORE the load, but not one declared after #373 lesson).exec,load_file).src/eigenlsp.cso typos land as as-you-type squiggles (whole-line ranges now; token-precise once column tracking lands).Acceptance.
tests/test_lint.sh: fires on a typo in a cold branch; silent on outward-is,localshadowing, sibling-branch first assignment, module-qualified names; consumer-repo sweep produces no false positives (run it over lib/ and two consumers as the calibration gate).Effort: weeks. Source: 2026-07-04 survey (correctness dimension; critic top-5 — "highest correctness yield per week available").