POST: the only commit-maker — advance cur, FF labels, push

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.

The three slots

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.

CLI use

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.

Commit assembly

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.

Message resolution

File classification

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.

Boundaries and guards

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.

Flags

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.

Errors

POST's refusals are all fast-forward, message, or safety guards; each has its own code.

Open questions

The provenance wire format is settled: picked <sha> is a commit header next to foster, dedup-only and not a reachability edge.