POST is the only commit-maker: it advances cur — the current branch's tip — and, through its other URI slots, fast-forwards labels and remotes to that new tip, all in one invocation. It is the worktree→repo write that turns staged and absorbed work into a commit.
patch rows since the pd boundary; PUT and PATCH never commit.?branch///remote advance refuses POSTNOFF unless cur descends from it; else PATCH+POST.#frag commits, ?branch FF-advances a label, //remote FF-pushes — composing to cur's new tip.POST's three URI slots are orthogonal — each adds its own effect, none implies another — and cur is the only ref POST ever commits onto, never another branch; the slots follow the shared Verbs vocabulary.
#frag (and stage scope): commit on cur; an empty fragment reuses the absorbed message, and a trailing ! forgets the origin.?branch: FF-advance it to cur's post-commit tip; POSTNOFF if cur isn't a descendant. Standalone is a pure label move.//remote: FF-push cur's tip to the remote's counterpart, same FF check. Standalone is a pure push (≡ be put //origin).be post '#msg' ?feat //origin commits, FF-advances ?feat, and pushes, all to cur's new tip.A bare POST is a dry-run status printer (the same read-only preview as HEAD); with intent it commits on cur and, per any populated slot, also FF-advances a label or pushes to a remote.
be post 'fix the typo' commits with a new message and refers back (merge); be post '#fix' is the single-word form.be post '#msg!' commits a new message but forgets the origin (squash); be post #! reuses the message and forgets (rebase-step).be post '#fix' ?feat commits, then FF-advances ?feat to cur's new tip.be post ?.. FF-advances the parent (no commit); be post //origin FF-pushes cur's tip (no commit).be post '#sync' //origin commits, then FF-pushes cur's new tip to origin.be post reuses the absorbed message and refers back; with no slot and no patch rows it prints dry-run status.#; a trailing ! forgets the origin; legacy -m "msg" still works.REFS; patch-id dedup (GRAFPatchId) skips an absorption already reachable from cur.The first parent is always cur's previous tip, so walking first-parents reaches the fork point in a straight line; the absorbed-branch provenance header comes from the post fragment, not the patch row.
!) → a parent <sha> header (merge); forget (#msg! or #!) → a foster <sha> header (rebase/squash).be patch #<sha>) patch row always records a picked <sha> header (next to foster), dedup-only.#frag wins if present, with any trailing ! stripped as the forget modifier (#msg!, #!).#/#! empty fragment), reuse the absorbed message if exactly one in-scope patch row carries a usable one.POSTNOMSG; a multi-commit absorption with no reusable message needs an explicit one.! is refused, since the trailing ! is reserved for the forget modifier.POSTNONE is the separate case: a commit was asked for but every candidate path is an unchanged baseline.
Every sniff row stamps the files it touched with its ts; at POST time each on-disk file's mtime is looked up to decide KEEP vs REWRITE, in selective or implicit (commit-all) mode — the Worktree page is the full treatment.
< last_get_ts, or the file is owned by a get/post row (baseline content) — in both modes.patch row (merged bytes) or a put row (current bytes) — in both modes.put named it; REWRITE in implicit mode.be post 'msg' needs be put <path> first.put/delete since last post; implicit = none (mirrors git commit -a for tracked edits).
Two .be/wtlog boundaries, both anchored at the most recent GET (a hard reset of the world, the repo→worktree inverse of POST), scope what the next POST consumes; a wall-clock guard refuses backwards clock motion.
get or post; put/delete rows after it are in scope for the next POST.get or commit-all post; patch rows after it are in scope.post is commit-all iff no put/delete lies between its pd boundary and itself — one forward scan, no new verb.now ≥ last_log_ts and refuses CLOCKBAD on backwards motion.
POST refuses by default to commit any tracked file holding PATCH's conflict-marker triple; --force (or the verb bang be post!) bypasses that one scan and nothing else.
patch && post from recording a half-merged commit (<<<<…||||…>>>>).be post! (bang on the verb) is the shorthand for --force; the fragment's trailing ! is the unrelated forget modifier.--force only for false positives — source or prose describing the marker shape — never a genuinely unmerged file.--force does not relax the FF rule, change ?branch///remote advance, or affect message resolution.POST's refusals are all fast-forward, message, or safety guards; each has its own code.
POSTNOFF — cur isn't a descendant of the ?branch/remote tip being advanced.POSTNOMSG — no fragment and no single reusable patch-row message.POSTNONE — a commit was asked for but every path is an unchanged baseline.POSTCFLCT — a tracked file holds conflict markers (bypass with --force).KEEPFAIL — //host push with no matching reflog row; CLOCKBAD — clock moved backwards.
The provenance wire format is settled: picked <sha> is a commit header next to foster, dedup-only and not a reachability edge.
picked header — multiple accumulate in row order; a "partial picked" <sha>:<path> for path-scoped forensics is a possible future extension.