be
Straighten the JS verb calling convention so a verb is a plain JS function invoked with plain JS args, driven identically from the CLI and the pager. THREE call shapes: (1) verb — 0 args; (2) verb some args incl 'some quoted' — shell-split string args; (3) verb("proper", 132, "js") — JS-eval'd to real values. The CLI gets shape 2 pre-split by the shell; the pager : line must split the SAME way. Ambient state (repo, output sink, render mode, flags) rides a global be object, not call args; the verb understands paths/URIs on its own. Replaces the (row, ctx)→{enqueue} handler + central resolve.js classifier.
(row, ctx)→{enqueue?} (core/registry.js contract); the fan-out queue itself was just retired in JSQUE-020, so {enqueue} is already vestigial and dispatch is an in-memory FIFO in core/loop.js.core/loop.js cli() pre-chews every positional through resolve.seed→classifyArg (new URI(arg)) BEFORE the verb runs, fanning one branch-free row per path arg — with a growing pile of per-verb escapes (post rides its message on ctx.args; get/head + reparse-views ride their token verbatim; patch pins a triple). This central pre-classification is what we retire.be today: be is a per-module alias — ~15 files do const be = require("core/discover.js") (be.find/be.repoFromBe/be.projectFromQuery). The real C-injected runtime globals are io, abc, uri, ron, utf8, URI.: line (views/bro/pager.js _runSpell→driveSpell) is ONE unsplit string we tokenize ourselves, so a spaced verb arg arg spell never splits there today.eval and a tok dogenizer; the POST colon-message silent-drop (JAB-003) is the concrete symptom of the central classifier this ticket removes.verb("proper", 132, "js"), NOT (row, ctx) and NOT params[]. The verb coerces string-or-value and parses any URI/path itself.verb → verb(); (2) verb a b 'c d' → shell-split string args; (3) verb( ⇒ parse the rest as a JS call, eval args to real values. CLI shape-2 is pre-split by the shell; the pager splits shape-2 the same way.be: mint globalThis.be ONCE at loop entry as the unified beagle object — ambient repo, output sink, render mode, and flags — AND fold the discover API onto it (be.find/be.repoFromBe/…). Drop the ~15 require(discover) aliases. Nested verb calls inherit be, so flags apply recursively for free.resolve.js classifyArg + the per-path seed fan-out; verbs receive raw args and resolve via shared helpers.be/ (beagle-ext) ONLY: core/loop.js, core/registry.js, core/resolve.js, core/discover.js, views/bro/pager.js + bro.js, and each verb/view. REUSE the tok/eval/uri bindings — do NOT touch beagle/js (per user).jab, never native be. Comments ≤2 lines, prefixed JAB-004:. Report ≤ half a page per phase.verb(), not on individual tokens: shape-2 CLI/pager tokens stay string + safe-scalar (number/true/false/null), no eval, no code-exec surface; shape-3 verb(...) is eval'd on BOTH surfaces. This reconciles JAB-003's "CLI stays eval-free" (which was about per-token eval) with the parenthesized call form.be so a verb signature is exactly its user args. be is set before dispatch and inherited by every nested call (recursive flags).be mapping: a boolean flag sets its own field (--force → be.force=true); the mutually-exclusive render selectors collapse into ONE field (--tlv/--color/--plain → be.format="tlv"|"color"|"plain"). A verb reads be.force/be.format, never a threaded ctx flag list.be folds discover: one unified object rather than a separate module alias; the ~15 header requires collapse to reading the global.new URI(arg) itself, a numeric arg does +p. Unquoted multiword (post foo bar) is arity (a verb declares a greedy/rest last param), not grammar.
-v Phase 1 — the tokenizer shared/argline.js (bare / shell-split / verb(-eval), unit-driven; pager : line (bro.js spellCall) rewired to it. 122/122. -v Phase 2 — global be: globalThis.be minted at loop entry (mintBe folds discover + repo/sink/format/flags); 18 require(discover) aliases dropped. 122/122. -v Phase 3 — flags onto be: be.force set from --force, be.format from the render selectors; force/format reads migrated via the single shared/ambient.js ctx→be bridge (transitional, phase 5 removes it); bro driveSpell re-entry snapshots/restores the be ambient. 122/122. -v Phase 4 — plain-arg conversion: dual-convention spine (registry marker .jab="args" + loop.js plain branch calling fn(...args)), then ALL 24 verbs/views converted in a parallel worker-per-verb fan-out (shared worktree, disjoint files, own build dirs). Every handler reads ambient off be, owns its arg loop + fan-out ({enqueue} dead), and self-parses/classifies its URIs. POST colon-message drop FIXED + proven (post-colon-msg). lsr latent non-recursion bug fixed via be.verb. 122/122 throughout. RECIPE.md drove the fan-out (columnar + mutating + re-entrancy addenda). -v Phase 5 — CLEANUP done (full classifyArg retirement, gritzko's call): put/delete parse their OWN args (a tiny bare/URI/file-list 3-way, NOT the classifyArg matrix); deleted resolve.seed/seedCtx/classifyArg/pinPath (core/resolve.js 208→27 lines, now just isHexish/resolveHex for the 6 view/put users); deleted cli()'s dead legacy dispatch branch + run()'s whole queue loop + _memQueue (core/loop.js net −65; run() is a thin plain-dispatch wrapper); dropped 3 orphaned requires; refreshed registry.js verb-contract doc. 122/122. KEPT (still live): shared/ambient.js ctx-fallback + per-verb dual-shape (row,ctx) fallbacks — direct-handler unit tests (cat/commit/blob) still call verbs that way; removing them needs a test-update pass (own follow-up). - Consistency follow-ups surfaced mid-fan-out: unify the search-trio fan-out (regex per-arg vs spot single-search); lift the re-entrancy src = ctx || be precedence into ambient.js (commit→diff needed an ad-hoc be I/O-surface swap).
b937076d (on 928aaad5 JSQUE-020) — "JAB-004: plain-args verb convention; retire central classifier". All 24 verbs/views are plain-arg fns reading the global be; the tokenizer (shared/argline.js), global be+discover, flags-on-be, and the whole central classifier/queue are gone. 122/122.core/resolve.js 208→27 lines (just isHexish/resolveHex); core/loop.js legacy dispatch + queue + _memQueue deleted; put/delete parse their own args.post-colon-msg), lsr bareword non-recursion.src = ctx || be precedence into ambient.js; prune the transitional dual-shape (row,ctx) fallbacks + ambient ctx-fallback once the direct-handler unit tests (cat/commit/blob) are updated to mint be.11e4dddc (Fri03 "JAB-004: plain js calling convention for the verbs"); b937076d is absent from be log (pre-post worktree hash). Code state verified: shared/argline.js, core/resolve.js at 27 lines, mintBe/globalThis.be in loop.js, test/post/colon-msg.