core/registry.js — build masks load/syntax errors as unresolved verb
registry.build resolves a verb to its handler via two nested require attempts (views/ then verbs/). Both catches are BLIND to the error kind, so a module that EXISTS but throws at load (syntax error, bad require, throwing top-level) is swallowed and recorded null — later surfacing far away as the misleading "no handler for verb" loop refusal. Method: Issues.
core/registry.js:36: try { mod = req("views/" + verb + "/" + verb + ".js"); }core/registry.js:37-39: `catch (e) { try { mod = req("verbs/"...) }
catch (e2) { tableverb = null; continue; } } — e/e2` discarded.
error or a throwing top-level require throws a DIFFERENT error, yet both land in the same table[verb] = null not-found bucket.
core/loop.js:102-106: a null handler is retried lazily, then
throw "loop: no handler for verb '" + row.verb + "' ..." — so a broken-but-present module is reported as MISSING, hiding the syntax error from the author.
not be reported as an unresolved verb.
leave-absent path.
build's signature + return shape (table[verb] = fn | null)."cannot find" not-found marker; treat only not-found as fall-through.
e is NOT not-found, re-throw immediately (doNOT fall to the verbs/ probe — the module was found, it threw).
e2 is NOT not-found, re-throw; else null.hard-coding it — a wrong substring re-masks everything.
throw (or a
syntax error); assert build PROPAGATES it, not "no handler for verb".
core/registry.js.core/registry.js:45-48 both catches discard the error
(catch(e){ try{...}catch(e2){ table[verb]=null; continue; } }); no "cannot find" check.