On the CLI the user's SHELL expands globs before be sees argv, so be put *.c works; in the
pager the typed spell goes to the verb VERBATIM, so put *.c / delete src/* hands the literal
pattern as a filename (FILENONE / bogus row). The pager already owns confined FS enumeration for
Tab-completion (_fsCompletions, BRO-013, wt-confined via resolveInTree/wtJoin per
BE-027); glob expansion is the same machinery driven by a pattern instead of a prefix. The
pager plays the shell here: it multiplies WORDS, it does not resolve them — verbs still resolve
each arg via resolve(context,base,rel) (BE-030, BE-032) and put/delete rest args stay RAW
wt-relative (authorityRepo strips arg0 only).
views/bro/pager.js _runSpell/_applySpell hand the typed word spell to driveSpell → cli(); core/loop.js:327 splits/scalar()s the words — no expansion point anywhere, patterns reach the verb literally../ stem against the VIEW dir and a bare stem against the wt root, enumerates via io.readdir, and CONFINES to the wt (resolveInTree throws NAVESCAPE → no candidates) — exactly the enumeration a glob expander needs (BE-027, pager.js:604).*, ?, [...] in its arg words shell-style before dispatch: put *.c stages every matching wt file, delete src/*.tmp removes the matches../ stem yields view-relative ./x words, a bare stem yields wt-relative words (same token shape as _compTok) — so verbs resolve them exactly as if the user had typed each one.?ref/#frag slot edits, or the verb word itself.put *.c failing today, expanding after.*, ?, [...] per segment; ** out of scope for the first cut.delete.. (shell convention); expansion output sorted. NOTE: io.readdir hides dotfiles entirely (same as Tab-completion), so the dotted-pattern branch is unreachable today — kept as a guard should readdir ever change.driveSpell reentry), gated on the word actually containing a glob metachar._globToRe (one segment → anchored RegExp), _isGlobWord (skips ?ref/#frag/-flag/scheme: words), _glob (segment-wise frontier walk, literals via resolveInTree, glob segs via wtJoin+readdir, output via _compTok), _globSpell (argline.shellSplit, verb peeled, quoted words inert, failglob → null), called from _applySpell before _composeCall.? glob word (?.c) is NOT expanded — leading ? is the ref-slot-edit syntax; the slot grammar wins over the shell alphabet.put *.c today hands the literal *.c to put (RED), test/bro/glob/glob.js unit-drive like navescape.js._fsCompletions-style confined readdir walk.be-js-bro-view readdir-order golden (BE-027-documented). Orchestrator re-ran repro + bro subset 2026-07-09: same.2dcfc392): jab get file:…?/beagle-ext checks out the project's own be -> . symlink over the bootstrap locator, then the test submodule gate requires shared/gitmodules.js/core/discover.js BEFORE those subtrees exist → "require: cannot find". Worked around with per-subtree jab get shared|core|view|views|verbs first. Root-caused 2026-07-09 under GET-041 (open umbrella): jab's pinBeStack pins symlink paths verbatim + explicit ./ requires bypass it; exposed by the a763a86a checkout-order change./home/gritzko/src/BE-036, uncommitted: views/bro/pager.js + test/bro/glob/{glob.js,run.sh}; pending user review + land)