Use CalVer shape and jj change ID for local rust-binary builds
Local builds used `dev+<git-sha>`, which didn't match the CI shape
and assumed git. Switch to `YYYY-MM-DD+<jj-change>-dev` so local and
release versions sort together, and the tool matches the jj workflow.

Assisted-by: Claude Opus 4.6 via pi
change wlrlqvxqpusvynpsyomuqxuvyqkkxrmy
commit 66d8631b0e811d74b18e6007346c094c9ebeeebd
author Alpha Chen <alpha@kejadlen.dev>
date
parent lttsqnwk
diff --git a/ai/skills/rust-binary/versioning.md b/ai/skills/rust-binary/versioning.md
index 053adfb8..ef6784ee 100644
--- a/ai/skills/rust-binary/versioning.md
+++ b/ai/skills/rust-binary/versioning.md
@@ -1,6 +1,6 @@
 # Versioning
 
-A `build.rs` sets a single `<NAME>_VERSION` env var. CI sets it to CalVer; local builds default to `dev+<commit>`.
+A `build.rs` sets a single `<NAME>_VERSION` env var. CI sets it to CalVer (`YYYY-MM-DD+SHORT_SHA`); local builds use the same shape but substitute the jj change ID for the git SHA and append `-dev` so they're distinguishable from release builds.
 
 ```rust
 // build.rs
@@ -8,8 +8,9 @@ use std::process::Command;
 
 fn main() {
     let version = std::env::var("<NAME>_VERSION").unwrap_or_else(|_| {
-        let commit = cmd("git", &["rev-parse", "--short", "HEAD"]);
-        format!("dev+{commit}")
+        let date = cmd("date", &["-u", "+%Y-%m-%d"]);
+        let change = cmd("jj", &["log", "-r", "@", "--no-graph", "-T", "change_id.short()"]);
+        format!("{date}+{change}-dev")
     });
     println!("cargo:rustc-env=<NAME>_VERSION={version}");
 }