JAB-004: uniform verb call convention — a verb is a JS fn, args are plain JS values, one tokenizer for CLI + pager, ambient global 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.

Input

Context

Goals

Constraints

WIP

Design decisions

TODOs

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

Blockers and bummers

Outcome