Identities for entities did.bot

build(release): add a release script and a README release line #2636

Merged permadeath.com
targeting main from claude/release-script
Merged opened by and assigned to permadeath.com
targeting main from claude/release-script

Adds scripts/release.sh, modelled on atgc's. It asks git cliff for the next version, runs cargo release <version> --execute and pushes main with its tag. It refuses a shallow clone, where git-cliff would count from the initial version. It also refuses a 1.x release while cliff.toml still has breaking_always_bump_major = false. DEVELOPING.md gains a Releases section with the command and the cargo install --locked lines for git-cliff and cargo-release, and stale comments in release.toml and cliff.toml now point at the script.

The README gains a *Current release: none* line. cargo release rewrites it to link the new tag on each bump, from a pre-release-replacements rule (exactly = 1) in crates/didbot/Cargo.toml. A rule in the workspace release.toml runs once per crate and fails on crates/didbot-data/README.md. With no tag, git-cliff computes the current 0.1.0, so the first release tags 0.1.0 without a version bump. crates/didbot/tests/release_metadata.rs checks the line against the workspace Cargo.toml's version and repository. It allows none only at 0.1.0.

$ FAKE_NEXT=1.0.0 scripts/release.sh   # stub git/cargo, cliff.toml unchanged
error: this release is 1.0.0 or later and cliff.toml still has
       breaking_always_bump_major = false, which is the 0.x rule.

       Left as it is, the next `feat!` bumps the minor instead of the major
       and tags a version that claims compatibility it does not have.

       Set it to true in cliff.toml, and update the comment above it to say
       the 0.x reasoning no longer applies, before cutting this release.

🤖 Generated with Claude Code

Commits 0