Saphan StudioDocs
Reference/Commands

saphan merge

Merges a gated stream's branch into its base branch, as the recorded act of the person who runs it.

Merges a gated stream's branch into its base branch, as the recorded act of the person who runs it. Before anything changes it checks that the gates allow the merge, that the base branch is checked out, clean and not diverged from its remote, and reads the saphan verify-union record for the exact branch and base commits (⚠ in this release a missing or failing union record does not stop the merge); it then test-merges the pair in a scratch worktree and runs the repository's declared build command on the merged tree, refusing if the tree does not build or the build cannot run (with no build command declared, it says that no build ran), and any failure is a named refusal with nothing landed. Only one merge runs in a workspace at a time. On success the merge message is composed from the record, the merge gate is recorded and the commit's trailers are printed as proof; nothing is ever pushed. ⚠ This is an owner act: it prints a one-time code on this terminal and waits for you to type it back. It is refused when no terminal is attached (for example from a script or a CI job), and in the console's browser terminal it is refused in favour of the console's passkey prompt. saphan dry-run merge runs the same conflict test and lands nothing.

saphan merge add-rate-limits --workspace /srv/saphan
saphan dry-run merge add-rate-limits --workspace /srv/saphan
saphan merge <stream>
flagtypedefaultwhat it does
--actorstringThe person performing the merge; defaults to SAPHAN_ACTOR, then the identity in your configuration. It must name an enrolled, active actor in this workspace's signed actor registry; a spelling that differs only in case or spacing is refused, not corrected.
--cliboolfalseSign the recorded merge with a FIDO2 security key attached to this terminal instead of through the console's passkey page. Until the person epoch for gates is declared, the merge row is signed with the workspace key; after it, without --cli, the command makes the merge commit, then opens the console's gate page and waits for your passkey touch on the merge row.
--ontostringLand this merge on the named local branch, normally the trunk, instead of the target the record names; every gate and check still runs, and the override is recorded with the merge. A branch other than the trunk is refused (merge-onto-is-not-the-trunk).

Global options apply to every command — see Every command.