saphan bridge
Bridge generation: instantiate a project command deck
saphan bridge
Bridge generation: instantiate a project command deck
Subcommands
| Subcommand | What it does |
|---|---|
saphan bridge init | Generate a blank-but-working <name>-bridge and register the workspace |
saphan bridge init
Generate a blank-but-working <name>-bridge and register the workspace
Generate <workspace>/<name>-bridge from the protocol canon embedded in this
binary and register the workspace. The generated bridge carries its OWN
executor-behavior law: the protocol doc set (protocol/ — roles & gates,
order/status process, dispatch playbook, principles, team workflow) ships
byte-verbatim from the pinned wato-protocol commit, digest-verified, alongside
the content templates, BOARD, OPERATIONS (which emits the worktree law-path
model), dispatch/ + returns/ + decisions/ + findings/ lanes, SYNC stub, and
the channel-artifact .gitignore from day one. Registration writes the .saphan
marker plus the worktrees/ lane, so 'fleet show' immediately answers with a
valid empty envelope.
The law ships EMBEDDED and offline: no network is touched at init or ever by an executor (a worktree behind a firewall stays governed). PROTOCOL_BASELINE declares the integration trunk (--base-branch, default main).
Never destructive: an existing bridge or any colliding file refuses with a per-path report — no overwrite, no merge, no --force in v1. The workspace must be named explicitly (--workspace or SAPHAN_WORKSPACE): generating into a walked-up or fallback CWD is exactly the silent surprise the resolution contract exists to prevent.
saphan dry-run bridge init builds the SAME plan the real write builds (bridgegen.New) and checks collisions with the SAME plan.Collisions() — a collision refuses with the IDENTICAL per-path report the real write would print. Past that point plan.Apply() is never called: zero directories, zero files, zero writes of any kind. bridge init opens no store.Backend at all (unlike gate/teardown, there is no fleet_gate/fleet_event reconcile residue to name here — the whole verb is filesystem-only), so a clean dry-run genuinely touches nothing, disk or store. An admissible plan prints what plan.Paths() says would be created and exits 0.
Options
| Option | Type | Default | Description |
|---|---|---|---|
--base-branch | string | unset | integration trunk the bridge declares in PROTOCOL_BASELINE (default: main) |
--name | string | unset | bridge base name; <name>-bridge is generated (default: basename of --workspace) |