Why. Two of the three documented silent-wrong traps are deliberate semantics that cannot be removed (observer state IS binding identity; is mutating outward is the scope model). Lua's lesson: traps left as documentation-only become a permanent per-user tax — the community verdict there was default-on linting (luacheck/strict.lua). Fence them at type-time.
What.
Acceptance. tests/test_lint.sh cases both ways (fires on the trap, silent on local-correct / explicit-predicate code); docs/DIAGNOSTICS.md contract entries; LSP surfaces both.
Effort: days. Source: 2026-07-04 survey (learnability dimension).
Why. Two of the three documented silent-wrong traps are deliberate semantics that cannot be removed (observer state IS binding identity;
ismutating outward is the scope model). Lua's lesson: traps left as documentation-only become a permanent per-user tax — the community verdict there was default-on linting (luacheck/strict.lua). Fence them at type-time.What.
local— "outer mutation; addlocalor rename". Scope the rule to module/library functions, where it is almost always unintended.stable of xexplicitly" (the feat: observer loop-halting is opt-in (compositional) — fixes cross-talk truncation #247/Observer dH-window lost when a residual is built via temps that NUM_REUSE-alias the convergence variable #262 aliasing family).--lint --jsonand aseigenlspdiagnostics so the editor teaches the model as-you-type. This encodes the write-eigenscript skill's hard-won rules into the toolchain instead of tribal docs.Acceptance.
tests/test_lint.shcases both ways (fires on the trap, silent onlocal-correct / explicit-predicate code);docs/DIAGNOSTICS.mdcontract entries; LSP surfaces both.Effort: days. Source: 2026-07-04 survey (learnability dimension).