PATCH absorbs commits from another branch into cur's worktree and records the absorbed sha(s) in .be/wtlog for the next POST to consume; it never commits on its own. The cycle is patch → test → post, one absorption per landing commit — so every commit that lands is a tested commit, never a chain of unverified work. PATCH is one verb in the Beagle Verbs vocabulary, and unlike GET it weave-merges theirs rather than overwriting the worktree.
.be/wtlog, and the next POST turns them into a commit with a header; staging is PUT's job.?ref absorbs the whole missing commit line, #hash cherry-picks one commit; plain patch records the ref as a merge parent, forceful patch! as a local foster.patch && post before a bad commit.The URI slot picks WHAT is absorbed; the verb bang picks how the origin is recorded in the next commit. URI bangs are retired (the old ?br! whole-branch toggle is gone — ?ref always takes the whole missing line); the bang rides the verb only, and PATCH never carries a #message.
?<ref> (or bare patch = the tracked ref): absorb every missing commit of that line; the next POST records the ref as a non-first parent.patch! ?<ref>: same absorption, origin recorded as a foster header git does not understand — the fostered object is not propagated to other replicas, a local reference only.#<hash> cherry-pick, the special case: absorb the one named commit; recorded as picked, never a parent.gritzko, no LLM edits allowed
PATCH applies changes from a commit/branch, thus implementing merge, rebase, cherry pick.
patch comes in many forms:
patch implies the tracked ref is the argument, so all the "miss" commits from that ref get applied and become "ptch"patch ?branch, patch ?tag, patch ?hash specify the commit line to patch in explicitlypatch //worktree/path - worktree get (the actual tree base commit line)patch #hash cherry picks a particular commit, no parents, the hash is mentioned in a commit as "picked", not "parent"patch file:..., patch https:... and others imply the remote leg that updates remote refs, may download objectspatch modes
patch path/file?ref scoped to file/dirpatch submodule recursion
--nosubpatch mentions the ref in the commit as non-first parentpatch! forceful - mentions the the ref as foster (header not understood by git, so the object is not propagated to other replicas, for local reference only)An absorption replays only the commits cur doesn't already have — the missing set of the target line, computed by reachability from cur.
?ref or bare patch) replays only commits not already reachable from cur via parent ∪ foster.picked headers are dedup-only and do not participate in reachability.The merge base splits by shape: a line absorption weaves the whole missing stack against auto-LCA(cur, theirs), while a cherry weaves one commit against its own parent. The git-visible operation is picked by the origin record (parent vs foster), not by the base.
?ref uses auto-LCA(cur, theirs) and replays the full not-yet-reachable stack; with the parent header this is git's merge.#hash uses parent(theirs) as the base, weaving that one commit's diff — git's cherry-pick, recorded picked.patch!'s foster keeps the same weave but hides the link from git — the landed history reads linear, the rebase flavor.PATCH never refuses on dirty files: it runs a 3-way WEAVE with the absorbed commit on the theirs side and the wt's current bytes on the ours side, so PATCH-on-PATCH composes by construction.
<<<</>>>>), not git's 7-char line markers.git mergetool and existing UIs won't recognize the token-level markers — hand-edit, or enumerate via a diff:? view.A non-empty path slot scopes the absorption to those paths, but records no provenance — a partial absorption is not a faithful DAG commit.
be patch file.c?feat lands theirs bytes for those paths only.&theirs slot, so POST emits no provenance header and counts zero commits.Every PATCH prints a ULOG-style report — one line per applied commit and touched file, <verb> <status> <path-or-uri> — so the patch-test-post loop stays auditable.
applied: the file was clean (baseline or stamped) and overlaid with theirs bytes, no merge needed.merged: the file had non-baseline bytes and theirs touched it, and WEAVE integrated both sides cleanly.mod: ours diverged from the merge base but theirs didn't touch this path, so the bytes are kept as-is (fork-relative).conflict: non-baseline bytes theirs touched but WEAVE couldn't resolve, leaving markers in the file and a non-zero exit.Two PATCH-side formats are still unsettled, both about how downstream tools read PATCH's output.
git mergetool adapter.<sha>:<path> for path-scoped forensics is a possible future extension.