# plan.run.Plan.run_over_control_mode

- **Module:** plan.run.Plan
- **Package:** libtmux
- **Language:** Rust
- **Kind:** method
- **Source:** https://github.com/libtmux/libtmux-rs/blob/8a648c0894dfffc9303583f753b6c8ae01f2fe76/crates/libtmux/src/plan/run.rs#L704
- **Page:** https://libtmux.org/reference/rs/plan-run-plan-run_over_control_mode/

```
plan.run.Plan.run_over_control_mode(self, sender: &crate::control::ControlSender) -> Result<PlanResult, Error>
```

Run this plan over an open control-mode connection.

Control mode is the one transport that separates *how many commands*
from *how many processes*: every operation is its own protocol block
over one connection, so a plan costs one process however long it is and
every operation still reports its own outcome. That is the combination
a subprocess cannot offer -- there, sharing an invocation is what buys
the process back, and it is exactly what costs the attribution.

There is no planner argument because there is nothing to trade: blocks
are per command already.

# Errors

Returns an error when the connection is closed, a command cannot be
written, a slot dependency is invalid, or a creating operation does not
return valid IDs. Validation happens before the first command. A command
tmux refuses is reported in the [`PlanResult`].
