Dog: the static-lib-plus-exe convention every tool follows

A dog is a Beagle tool with a fixed shape: a static library plus an executable, each owning one purview of the repo's data. The goal is uniform composition — be dispatches HTTP-like verbs to dogs by spawning processes, and dogs coordinate through keeper's read APIs rather than pushing into each other. The method: a name struct with three entry points (DOGOpen/DOGExec/DOGClose), a shared dog [verb] [--flags] URI* CLI, sibling discovery via dog/HOME, and pull-based indexing from Keeper.

The three entry points

Every dog's static lib exposes a name control struct and three uniform calls; the first DOGOpen across all dogs in a process decides whether the session is writable.

Dependency graph

Dogs layer over a foundation — beagle → spot,graf,sniff,… → keeper → libdog — so the dispatcher sits on top and the object store at the bottom.

CLI and URI convention

Every dog speaks dog [verb] [--flags] URI*; no verb means a read-only view or search, a verb means an action with a direction of data flow.

Pull-based indexing

There is no push path into a dog's index: after a write each indexing dog runs its own pass driven by the invoking URI, pulling object data from Keeper.