Skip to content

Lint/LSP: scope-aware name-resolution pass — E-class 'no binding on any path' #404

Description

@InauguralPhysicist

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").

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions