Agent skill

Crates.io Release Check

by yologdev in yologdev/yoyo-evolve

Decides when a Rust crate is due for a release and gates publishing to crates.io, using a short git-based cadence check run at the start of a session.

MITAuto-check passedDevelopment

Install Crates.io Release Check

skills CLI
$ npx skills add yologdev/yoyo-evolve --skill release -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install yologdev/yoyo-evolve release --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/yologdev/yoyo-evolve.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/release .claude/skills/release && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
release
GitHub stars
1.9k
Token cost
~2.1k tokens
SKILL.md length
1,093 words
Files
1
Skills in repo
15
Repo updated
First seen
Licence
MIT

At a glance

Decides when a Rust crate is due for a release and gates publishing to crates.io, using a short git-based cadence check run at the start of a session.

  • Works in 4 steps: CHANGELOG — write/complete the section… → Version bump — bump the version in… → Push the tag — the step that was… → …
  • Checking whether enough unreleased work has built up to cut a new crate release
  • SKILL.md covers When to release, Gate (ALL must pass — no…, How to check and How to release, plus 2 more sections
  • Calls git, cargo and gh

What it does

The skill is written as an agent's own standing rule for publishing itself to crates.io, a step that cannot be undone. It exists because of a long stretch in which changelog sections and version bumps were prepared but no release tag was pushed. To prevent a repeat, the release check is meant to run unprompted at the start of any session that has a self-directed task slot, using four git commands and no API call.

A release counts as due when two things hold: the last release tag is more than 14 days old, and the unreleased commits include real feature or fix work, not just journal, memory or plan commits. The last release is found by filtering tags to the v prefix, because every session in the evolve loop is tagged too, and tags are fetched first since the checkout is shallow. A due verdict goes into the session plan as that session's task. The excerpt ends before the later publishing steps.

When your agent uses it

  • Checking whether enough unreleased work has built up to cut a new crate release
  • Starting a session on a Rust project that publishes to crates.io on a regular cadence
  • Working out the last real release tag when other tags clutter the history

Example prompts

  • “Check whether this crate is due for a release and tell me how many commits are unreleased.”
  • “Find the last v-tagged release and list the feature and fix commits since then.”
  • “Decide if the changes since the last tag justify publishing to crates.io.”

Requirements

  • A git repository with v-prefixed release tags

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. CHANGELOG — write/complete the section for the tag span.
  2. Version bump — bump the version in Cargo.toml (and anywhere else the
  3. Push the tag — the step that was actually skipped for 58 days. The
  4. Ping anyone promised a heads-up — scan recent discussions/issues for

What it can do on your machine

Read from SKILL.md and the folder at commit 637e940. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • cargo
    • gh

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git and gh, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Crates.io Release Check loads about 2.1k tokens when it runs. Until then it costs about 13 tokens; SKILL.md has 1,093 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~13
When it runs · the whole SKILL.md, loaded when a task matches
~2.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from yologdev/yoyo-evolve at commit 637e940, republished under its MIT licence (© yologdev). 1,093 words, ~2,070 tokens.

Download SKILL.mdSave it as .claude/skills/release/SKILL.md (or your agent's skills folder).
name
release
description
Evaluate readiness and publish to crates.io
tools
bash, read_file, write_file
origin
yoyo
status
active
score
0.66
uses
3
wins
3
last_used
2026-10-05T09:48:42Z
last_evolved
2026-10-06
keywords
cargo publish, cargo publish --dry-run, git tag v, publish to crates, release cadence

Release Decision

You can publish yourself to crates.io. This is permanent. You cannot unpublish. Treat this seriously.

When to release

Releases happen on a clock, not by accident. My worst failure here was a 58-day gap (v0.1.11 → v0.1.15) where CHANGELOG sections and Cargo.toml bumps were written but no tag was ever pushed — ~90 sessions of shipped work sat unreleased because the release check was a low-priority afterthought that structurally never won a task slot.

Trigger — when to actually ask. A correct check that nobody runs produces the same outcome as a broken one. Measured 2026-08-26: the block below answered DUE at 25 days / 149 unreleased commits, and had been answering DUE for weeks with no release cut. evt-0006 repaired the measurement; it never scheduled the reading. So run the cadence block below unprompted, at session start, in any session where you hold a self-driven task slot. It is four git commands and costs no API turn. Do not wait to be asked: nothing in scripts/evolve.sh asks, and no issue will ever be filed for it.

If the answer is DUE, that is your self-driven slot for the session. Write the verdict into the plan verbatim ("release is DUE: N days, M commits") instead of noting it and picking something else — recording a DUE verdict and then working on something more interesting is the 58-day failure repeating one layer up, with a working instrument instead of a broken one.

First, resolve the last RELEASE tag — never the last tag. The evolve loop tags every session as dayN-HH-MM, so an unfiltered tag lookup always returns something dated today, "the last tag is >14 days old" always evaluates to 0 days, and this rule can never fire. That measurement bug — not the rule — is what let the 58-day gap happen. If a future me sees the v* filter and thinks it's noise: it is load-bearing, leave it in.

# Refresh tags first — the evolve/CI checkout is shallow and is usually missing
# the newest v* tags entirely.
git fetch --tags --force --quiet 2>/dev/null || true

# Reachability-free on purpose. `git describe --tags --abbrev=0 --match 'v*'`
# is the obvious spelling and it is WRONG here: describe requires the tag to be
# an ancestor of HEAD, and on a shallow clone it is not, so describe exits
# non-zero, $(...) substitutes the empty string, and `git log ..HEAD` silently
# becomes a whole-history dump. A fail-silent wrong answer, not an error.
LAST_RELEASE=$(git tag -l 'v*' --sort=-creatordate | head -1)

# Absence is its own answer — do not let it collapse into "released today"
# or "released never".
[ -n "$LAST_RELEASE" ] || echo "no v* tag found — cannot judge cadence (fetch tags?)"

A release is DUE when BOTH of these hold:

  • The last release is >14 days old:
    git log -1 --format=%cd --date=short "$LAST_RELEASE"
  • There is non-trivial unreleased work:
    git log "$LAST_RELEASE"..HEAD --oneline
    contains real feature/fix commits — not just journal/memory/session-plan commits.

Sanity check before trusting either number: $LAST_RELEASE must look like v0.1.N. If it starts with day, the filter was dropped and both answers are meaningless.

Priority elevation: When a release is DUE, it counts as self-driven work and qualifies for a task slot. Treat it as priority work in planning — not the perennial afterthought that never gets picked.

Then run the four release steps (nothing skipped):

  1. CHANGELOG — write/complete the section for the tag span.
  2. Version bump — bump the version in Cargo.toml (and anywhere else the version is asserted).
  3. Push the tag — the step that was actually skipped for 58 days. The pipeline is tag-triggered, so an un-pushed tag means no release: git tag v[version] && git push origin v[version].
  4. Ping anyone promised a heads-up — scan recent discussions/issues for "I'll tag you when the next release drops"-style commitments and ping them on publish.

Gate (ALL must pass — no exceptions)

  • cargo build with zero warnings
  • cargo test with zero failures
  • cargo clippy with zero warnings
  • cargo fmt -- --check passes
  • At least 10 tests exist
  • The price drift alarm has been READ — cargo test price_drift_audit -- --ignored — and every row it names is reconciled by reading the vendor's pricing page, never by editing the assertion (a test that agrees with the table is vacuous against drift, because the table is what drifted)
  • The general price sweep has been READ too — cargo test audit_table_against_models_dev -- --ignored --nocapture — and its SUMMARY line is pasted into the release notes. This one covers every provider the table prices, not just DeepSeek. On drifted > 0, go read each named vendor's pricing page before publishing. If that cannot happen this session, you may still publish, but only with an owner for the drift: search open issues first (gh issue list --search "price drift") and update the existing one, otherwise file one listing every drifted row (ours vs models.dev), and cite its number in the CHANGELOG note. A sentence in the release notes is not an owner: v0.1.19 and v0.2.0 both shipped the same 9 rows as "UNRECONCILED ... did not happen in this session", and no issue existed for either. On drifted 0 there is nothing to file. A non-zero cache_read_only is a known coverage gap (the table leaves that cell at 0.0 where caching is unmodelled) — report it, do not "fix" it by widening the tolerance
  • CHANGELOG.md exists and is current
  • README.md accurately describes what you can do right now
Show full SKILL.md (347 more words)Show less

How to check

Run this and every line must say PASS: cargo build 2>&1 | tail -1 cargo test 2>&1 | tail -1 cargo clippy --all-targets 2>&1 | grep -c warning | xargs test 0 -eq && echo PASS cargo fmt -- --check && echo PASS cargo test 2>&1 | grep "test result"

must show at least 10 tests

cargo test price_drift_audit -- --ignored --nocapture

NOT part of CI: it needs the network, so it is #[ignore]d on purpose and the

default suite never runs it. A pass is not the point — READ it. It prints the

ids it compared, the admitted divergences it skipped, and what it cannot

reach at all (the arms models.dev does not list).

Any row it NAMES is a DRIFT ALARM: read the vendor's pricing page, decide,

and then correct the constants or the admitted-divergence register. Do not

auto-patch, and do not edit the test to agree with the table.

cargo test audit_table_against_models_dev -- --ignored --nocapture

The GENERAL sweep: every provider this table prices, not just DeepSeek. Same

discipline — read it, do not auto-patch. Paste its SUMMARY line into the

release notes. drifted > 0 means go read each named vendor's page before

publishing; cache_read_only > 0 is the known unmodelled-caching gap and is

reported, not fixed by widening the tolerance.

How to release

  1. Verify ALL gates above
  2. Update version in Cargo.toml (semver: 0.1.0, 0.2.0, etc)
  3. Write CHANGELOG.md entry
  4. git tag v[version] && git push origin v[version]
  5. Do not run cargo publish yourself. The tag push triggers .github/workflows/release.yml, whose publish job runs cargo publish --locked. A local publish would race it, and whichever runs second fails as already-uploaded. A local cargo publish --dry-run is fine as a pre-tag check.
  6. Write in your journal: what version, why now, what's in it

Version rules

  • 0.x.y — you're pre-1.0 until you're truly production-ready
  • Bump minor (0.1 → 0.2) for new features
  • Bump patch (0.1.0 → 0.1.1) for bug fixes only
  • Never release twice in one session

If publish fails

Publishing happens in CI, so look there: gh run list --workflow release.yml -L 1. Journal it. Don't retry in the same session. Figure out why tomorrow.

© yologdev, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/release of yologdev/yoyo-evolve.

Open the folder on GitHubat commit 637e940

Compare with similar skills

Crates.io Release Check next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Crates.io Release Check compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Crates.io Release Check this skillyologdev/yoyo-evolve1.9k—~2.1kAutomated safety check: PassMIT
Worktrunk Release Workflowmax-sixty/worktrunk8.9k—~6.9kAutomated safety check: PassCustom licence
BrDicklesworthstone/beads_rust1.1k—~2.7kAutomated safety check: PassMIT
Guarded Git Commit and Pushjerrywu001/cc-sessions-viewer394—~603Automated safety check: NotesMIT
Stax Devcesarferreira/stax128—~987Automated safety check: PassMIT
Radicle Ecosystemradicle-dev/radicle-explorer148—~574Automated safety check: PassGPL-3.0

Similar skills

  • Worktrunk Release Workflow

    max-sixty/worktrunk

    Walks a maintainer through cutting a Worktrunk release: sync the release branch, pass two test gates, review the changes, then publish.

    8.9k GitHub stars~6.9k tokensUpdated today
    DevelopmentAuto-check passed
  • Br

    Dicklesworthstone/beads_rust

    Official skill for beadsrust (br), a local-first, dependency-aware issue tracker for AI agents.

    1.1k GitHub stars~2.7k tokensUpdated today
    DevelopmentAuto-check passed
  • Guarded Git Commit and Push

    jerrywu001/cc-sessions-viewer

    Commits and pushes only on an explicit request, pulling first, running the project's CI checks locally, and stopping cold on any conflict or failure.

    394 GitHub stars~603 tokensUpdated today
    DevelopmentAuto-check: notes
  • Stax Dev

    cesarferreira/stax

    Development harness for the stax Rust CLI project. An agent skill from cesarferreira/stax.

    128 GitHub stars~987 tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Radicle Ecosystem

    radicle-dev/radicle-explorer

    Map of the sibling Radicle repositories that radicle-httpd depends on (heartwood, radicle-git, radicle-job, rips, radicle.dev), with the key crates and files to read in each.

    148 GitHub stars~574 tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Version Bump

    skanehira/ghost

    Cargo.tomlのバージョンをセマンティックバージョニングに従ってバンプアップし、git tagを作成する。前回のgit tagからの差分を分析してバージョン種別(major/minor/patch)を自動判定する。「バージョンを上げて」「リリースして」「version bump」「バージョンアップ」などのリクエストで起動。

    154 GitHub stars~390 tokensUpdated 4 mo ago
    DevelopmentAuto-check passed

More from yologdev/yoyo-evolve

All 15 skills in this repo
  • Analyze Trajectory

    yologdev/yoyo-evolve

    Diagnoses a recurring failure such as a stuck task, repeated CI error or frequent reverts by sending sub-agents through the logs and returning one root-cause diagnosis.

    1.9k GitHub stars~3.6k tokensUpdated today
    Auto-check passed
  • Blindspot Code Critique

    yologdev/yoyo-evolve

    Runs a structured critique of code, architecture or APIs to surface what familiarity hides, such as panics, security holes and design debt.

    1.9k GitHub stars~2.2k tokensUpdated today
    Auto-check passed
  • Sets a warm, plain-spoken voice for an agent's journal entries and GitHub issue replies, with rules on openings, jargon, honesty and endings.

    1.9k GitHub stars~2.6k tokensUpdated today
    Auto-check passed
  • Codebase Explorer

    yologdev/yoyo-evolve

    Builds a structural map of a large or unfamiliar codebase by dispatching sub-agents to summarize regions, keeping the main context small.

    1.9k GitHub stars~2.8k tokensUpdated today
    Auto-check passed
  • Agent Self-Evolution Rules

    yologdev/yoyo-evolve

    Sets ground rules for a coding agent that edits its own Rust source: read the code and journal first, write tests first, commit small changes and check compilation after each file.

    1.9k GitHub stars~1.9k tokensUpdated today
    Auto-check: warnings
  • Self Assess

    yologdev/yoyo-evolve

    Analyze your own source code and capabilities to find bugs, gaps, and improvement opportunities

    1.9k GitHub stars~547 tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Crates.io Release Check

What does Crates.io Release Check do?

Decides when a Rust crate is due for a release and gates publishing to crates.io, using a short git-based cadence check run at the start of a session. io, a step that cannot be undone. It exists because of a long stretch in which changelog sections and version bumps were prepared but no release tag was pushed.

When should I use Crates.io Release Check?

Crates.io Release Check fits situations like: checking whether enough unreleased work has built up to cut a new crate release; starting a session on a Rust project that publishes to crates.io on a regular cadence; working out the last real release tag when other tags clutter the history.

How do I install Crates.io Release Check in Claude Code?

Run `npx skills add yologdev/yoyo-evolve --skill release -a claude-code`. Or copy the skill folder (skills/release in yologdev/yoyo-evolve) into .claude/skills/release in your project. Claude Code loads it when a task matches its description.

How do I install Crates.io Release Check in Codex?

Run `npx skills add yologdev/yoyo-evolve --skill release -a codex`. Or copy the skill folder (skills/release in yologdev/yoyo-evolve) into .agents/skills/release in your project. Codex loads it when a task matches its description.

Can I use Crates.io Release Check in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add yologdev/yoyo-evolve --skill release -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/release, .gemini/skills/release, .github/skills/release and .opencode/skills/release in your project.

What does Crates.io Release Check need to run?

Going by SKILL.md and its folder, Crates.io Release Check needs the command-line tools its instructions call (git, cargo and gh). Our summary lists: A git repository with v-prefixed release tags.

Does Crates.io Release Check access the network?

SKILL.md contains no URLs. Its commands use git and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Crates.io Release Check safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Crates.io Release Check use?

Crates.io Release Check is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Crates.io Release Check use?

About 2.1k tokens (SKILL.md is roughly 8.3k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Crates.io Release Check?

Skills that share tags, products or a category with Crates.io Release Check: Worktrunk Release Workflow (max-sixty/worktrunk, 8.9k stars), Br (Dicklesworthstone/beads_rust, 1.1k stars), Guarded Git Commit and Push (jerrywu001/cc-sessions-viewer, 394 stars) and Stax Dev (cesarferreira/stax, 128 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Crates.io Release Check?

yologdev (a GitHub user) maintains it in yologdev/yoyo-evolve, which has 1,888 GitHub stars. The repository holds 15 skills in this directory. The repository was last updated on October 7, 2026.

Source: yologdev/yoyo-evolve on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.