core/registry.js — build masks load/syntax errors as unresolved verbregistry.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) { table[verb] = null; continue; } } — e/e2 discarded.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.build's signature + return shape (table[verb] = fn | null).e is NOT not-found, re-throw immediately (do
NOT fall to the verbs/ probe — the module was found, it threw).e2 is NOT not-found, re-throw; else null.require: cannot find '<spec>' from '<dir>'
(jab/require.cpp resolveJsrc:72-73, resolve:80; thrown as a PLAIN STRING) —
gate substring cannot find, handles string and Error throws.cannot load verb '<w>' (<file>): <err> (verbFile proved existence);
convention-null in resolveVerb now loud (exports no plain-args handler (bad
module.exports shape)) — build() keeps fn | null per constraint.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.[-N] click in a warm pager session died as err: loop: verb 'get' has no plain-args handler — get.js, required cold after the day's landings, threw on the stale resident cache and resolveVerb:91 swallowed it (pty repro flips on an injected bad require). The cwd-pin ruling from the same incident is JS-119.[-1] click in a warm be work session after the day's four landings (get.js rewritten 09:30-10:02 under the resident cache) → the same masked message, loop.js:419 ← resolveVerb null-collapse (registry.js:91). The //KEY/: get spell itself is lawful (views/work/work.js:496). The mask also hides BRO-037's mis-resolved file-click behind the same phantom text. The staged fix in //JS-074 cures this — land it (base 82ef082f is 5 behind; mind the stale-wt first-get hazard on update).jab put, NO post), clone at tip 82ef082f; verified by
orchestrator (test/registry.js all-assertions-pass by absolute path, scope =
core/registry.js + test/registry.js + CMakeLists foreach append). Dispatch
suites green; test/work/getctx red is the pre-existing stale one (fix pending
in work/GETCTX). Suggested commit:
JS-074: registry re-throws load/syntax errors instead of masking verbs as absent