be diff: must recurse into submodules and render gitlink/pin changes
be diff:?<sha> on a commit whose only change is a submodule pin bump shows NOTHING: the gitlink pointer move (old-pin → new-pin) is not rendered and diff: never recurses into the sub, so the real work is invisible from the parent. diff: should render the gitlink change AND recurse, the way GET/POST/PATCH already do.
<sub> gitlink change is not emitted, and diff: never reaches the sub's content.be diff:?29df3828 (bumps abc b8ed6277→d8656f41; the FILEErr change lives in the sub) → empty output.<path> <old40>..<new40>.diff: into the mounted sub and emit its commit-range diff (path-prefixed under the mount), mirroring GET/POST/PATCH; --nosub suppresses.be diff: unchanged.diff: renderer + the sub-recursion the other verbs do.DIFFREF.c); submodule mount discovery is be's job — graf must not gain mount discovery (per-store boundary).be already owns submodule mount discovery + child dispatch (BEProjectorSubs → BESubsHere → BERelaySub); it merely replays the parent URI verbatim per sub. The fix is diff-specific logic in be's fan-out: for diff:, rewrite each sub's child URI to diff:?<old-pin>#<new-pin> from the pin pair graf already computes for the gitlink line (part-a). The relay stays generic for every other projector.be's job. Rejected.<sub> <old40>..<new40> diff text — fragile, couples to render output). Pins come from keeper/SUBS.h KEEPSubsAt(tree) (per-tree gitlink+path enumeration, built on dog/git/SUBS.h SUBSu8sParse): new = subs at the target commit's tree, old = subs at the base commit's tree, joined by mount path (new-only ⇒ added/null old, old-only ⇒ deleted/null new). No capture-pipe detour, no bediff_parse_gitlinks. Endpoints MUST match graf's diff base (single sha → vs first-parent; ?a#b → a vs b).diffref_collect_visit collects WALK_KIND_SUB (is_sub) and emits <path> <old40>..<new40>; test test/diff/08-sub-pin-bump-gitlink.be's diff fan-out builds the per-sub pin map from KEEPSubsAt over both endpoint trees and rewrites each bumped sub's child URI to diff:?<old>#<new>; relay + path-prefix; --nosub.be diff: on a pin-bump shows the sub's content diff (test/diff/08); added-sub range (test/diff/10).ef0430da (gitlink line; validated vs the ABC-002 bump → abc b8ed6277..d8656f41).018a59c4 — route #3 structural pins via KEEPSubsAt (commit-show → first-parent; ?a#b → a/b), sha1hex pins, owned path8b paths, URIMake-built child URIs; graf untouched. 288/288 green. DIFF-001 complete.