The Verbs basis is fixed and orthogonal by design, so new behaviour can't be bolted onto it — extensions are the escape hatch. An extension is a JS file run by JAB: jab <name> [args] scans up for a be/ dir, evals the script, and passes the tail as args. be itself runs no JS and forks no runtime, so a script can't shadow a verb, projector, or file — extensions grow the command space beside the basis, never inside it. Scripts share the be/ submodule (beagle-ext) and require() each other, so a set versions on its own. A script gets whatever JAB installs; a beagle repo/store SDK is the open frontier.
be and jab are divorced — scripts run on jab
be is a pure native dispatcher with no JSC linked; the jab runner owns all script resolution and execution.
be <name> matching no verb/file runs no script: the no-verb branch falls through to a typo diagnostic, then bro.jab <name> [args] scans up ./be ../be … (ceiling $HOME/be or /be), trying <be>/<name> then <be>/<name>.js.jab /abs or jab ./rel runs that file directly by global eval — the explicit-path mode, no scan.jab's exit code; the tail reaches it as args + Node-ish process.argv.
Extensions live in the be/ submodule; CommonJS require() resolves siblings and lib/ with no new machinery.
be/<name>.js is the entry per command; helpers are modules under be/lib/ require()d by relative path.require("name") re-runs the be/-scan; an explicit require("./x") resolves node-style from the module's dir.require() is synchronous (mmap → eval → cache), cycle-safe — the loader ships with JAB.be/ submodule (beagle-ext) versions independently, so a script set ships and updates on its own.A script gets the whole JAB global API; the gap is beagle-domain repo access, deliberately deferred.
io, Buf, abc/abc.index, git.pack/delta, tok, codec, zip, uri, pol, net — the JAB bindings list..be, resolve refs/HEAD, read an object by sha, walk the log, classify the worktree (keeper/graf/sniff/HOME).be/dogs through io.spawn and reading their output.