diff --git a/rust/Cargo.lock b/rust/Cargo.lock
index 710e30d2..f5093228 100644
--- a/rust/Cargo.lock
+++ b/rust/Cargo.lock
@@ -457,6 +457,7 @@ checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b"
name = "conversation-protocol"
version = "0.1.0"
dependencies = [
+ "ed25519-dalek",
"flate2",
"git-locator",
"serde",
diff --git a/rust/crates/conversation-protocol/Cargo.toml b/rust/crates/conversation-protocol/Cargo.toml
index c0ba3b2d..2678237c 100644
--- a/rust/crates/conversation-protocol/Cargo.toml
+++ b/rust/crates/conversation-protocol/Cargo.toml
@@ -9,6 +9,9 @@ serde = { version = "1", features = ["derive"] }
serde_json = "1"
sha1 = "0.10"
sha2 = "0.10"
+# Optional: only what signs or verifies a ref write needs it
+# (design/ref-writers.md); a std tool that pushes with a run token does not.
+ed25519-dalek = { version = "3", optional = true }
[features]
# On by default so the dependency artifact cargo builds for caos-cli (which asks
@@ -17,6 +20,7 @@ sha2 = "0.10"
default = ["git-cli"]
git-cli = []
memory-store = []
+ed25519 = ["dep:ed25519-dalek"]
[dependencies.git-locator]
path = "../git-locator"
diff --git a/rust/crates/conversation-protocol/src/v3/git_store.rs b/rust/crates/conversation-protocol/src/v3/git_store.rs
index 001c36ca..fd323b26 100644
--- a/rust/crates/conversation-protocol/src/v3/git_store.rs
+++ b/rust/crates/conversation-protocol/src/v3/git_store.rs
@@ -36,10 +36,15 @@ pub struct GitStore {
remote_tip: RefCell