Which arrow gets refused?
Your agent drew the config path for a service. The server owns the config. A logger keeps a reference to read from. A hot reloader overwrites it in place, possibly while the logger is mid-read.
On your microcontroller this design shipped. In Rust one arrow is refused before it runs. Tap it.
Tap the part that will not survive contact with reality — or press 1…4.
Hand it over, or copy it?
A 2 MB parsed document goes from parse() into store(). Nothing in the caller touches it afterwards.
The agent asks: move it, or clone it so the caller keeps its own copy? Pick one and say why.
The clone that made it compile
Your agent hit a borrow error in the request handler and reports a fix. Read it, then make your move.
The borrow checker complained that session was still borrowed when I passed it to audit(). I added a .clone() on the session before the call and it compiles now. It is a small struct, so the cost is negligible.
When the borrow checker is right
Your agent is building a workflow graph, like your LangGraph nodes: nodes point to their neighbours in both directions. The compiler refused two ownership designs already. Here is the third proposal.
Each node holds its neighbours as Rc<RefCell<Node>>. Rc lets several nodes share ownership; RefCell lets us mutate through a shared handle. It compiles, the graph API stays simple, and this is a standard idiom for graphs in Rust.
Answering a refusal
The borrow checker refused a design. Put your agent’s moves in the order you want them made, first to last. Then run it and watch the refusal travel the pipeline.
What survives this level
| Move semantics | Hand data over by default; a move is free and forces you to say who owns it next. |
| Borrowing as a design critic, not a rule | A borrow-checker rejection is a review comment on ownership; answer it with a design change, not a workaround. |
| Clone / Copy and the cost of cheap duplication | A clone that exists to silence the compiler is a second owner nobody designed; ask what it is for. |