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.
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.
$ npx skills add yologdev/yoyo-evolve --skill release -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install yologdev/yoyo-evolve release --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "release" agent skill from https://github.com/yologdev/yoyo-evolve/tree/main/skills/release into .claude/skills/release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/yologdev/yoyo-evolve/tree/main/skills/releaseType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add yologdev/yoyo-evolve --skill release -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install yologdev/yoyo-evolve release --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yologdev/yoyo-evolve.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/release .agents/skills/release && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "release" agent skill from https://github.com/yologdev/yoyo-evolve/tree/main/skills/release into .agents/skills/release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add yologdev/yoyo-evolve --skill release -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install yologdev/yoyo-evolve release --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yologdev/yoyo-evolve.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/release .cursor/skills/release && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "release" agent skill from https://github.com/yologdev/yoyo-evolve/tree/main/skills/release into .cursor/skills/release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/yologdev/yoyo-evolve.git --path skills/release--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add yologdev/yoyo-evolve --skill release -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install yologdev/yoyo-evolve release --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yologdev/yoyo-evolve.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/release .gemini/skills/release && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "release" agent skill from https://github.com/yologdev/yoyo-evolve/tree/main/skills/release into .gemini/skills/release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install yologdev/yoyo-evolve releaseInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add yologdev/yoyo-evolve --skill release -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/yologdev/yoyo-evolve.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/release .github/skills/release && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "release" agent skill from https://github.com/yologdev/yoyo-evolve/tree/main/skills/release into .github/skills/release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add yologdev/yoyo-evolve --skill release -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install yologdev/yoyo-evolve release --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yologdev/yoyo-evolve.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/release .opencode/skills/release && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "release" agent skill from https://github.com/yologdev/yoyo-evolve/tree/main/skills/release into .opencode/skills/release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
releaseDecides 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.
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.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 637e940. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
gitcargoghFrom the folder's file list and the shell code blocks in SKILL.md.
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.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
The full file from yologdev/yoyo-evolve at commit 637e940, republished under its MIT licence (© yologdev). 1,093 words, ~2,070 tokens.
.claude/skills/release/SKILL.md (or your agent's skills folder).You can publish yourself to crates.io. This is permanent. You cannot unpublish. Treat this seriously.
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:
git log -1 --format=%cd --date=short "$LAST_RELEASE"git log "$LAST_RELEASE"..HEAD --onelineSanity 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):
Cargo.toml (and anywhere else the
version is asserted).git tag v[version] && git push origin v[version].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)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 toleranceRun 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"
cargo test price_drift_audit -- --ignored --nocapture
cargo test audit_table_against_models_dev -- --ignored --nocapture
drifted > 0 means go read each named vendor's page beforecache_read_only > 0 is the known unmodelled-caching gap and isgit tag v[version] && git push origin v[version]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.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
Just SKILL.md in skills/release of yologdev/yoyo-evolve.
Open the folder on GitHubat commit 637e940
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Crates.io Release Check this skillyologdev/yoyo-evolve | 1.9k | — | ~2.1k | Automated safety check: Pass | MIT | |
| Worktrunk Release Workflowmax-sixty/worktrunk | 8.9k | — | ~6.9k | Automated safety check: Pass | Custom licence | |
| BrDicklesworthstone/beads_rust | 1.1k | — | ~2.7k | Automated safety check: Pass | MIT | |
| Guarded Git Commit and Pushjerrywu001/cc-sessions-viewer | 394 | — | ~603 | Automated safety check: Notes | MIT | |
| Stax Devcesarferreira/stax | 128 | — | ~987 | Automated safety check: Pass | MIT | |
| Radicle Ecosystemradicle-dev/radicle-explorer | 148 | — | ~574 | Automated safety check: Pass | GPL-3.0 |
max-sixty/worktrunk
Walks a maintainer through cutting a Worktrunk release: sync the release branch, pass two test gates, review the changes, then publish.
Dicklesworthstone/beads_rust
Official skill for beadsrust (br), a local-first, dependency-aware issue tracker for AI agents.
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.
cesarferreira/stax
Development harness for the stax Rust CLI project. An agent skill from cesarferreira/stax.
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.
skanehira/ghost
Cargo.tomlのバージョンをセマンティックバージョニングに従ってバンプアップし、git tagを作成する。前回のgit tagからの差分を分析してバージョン種別(major/minor/patch)を自動判定する。「バージョンを上げて」「リリースして」「version bump」「バージョンアップ」などのリクエストで起動。
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.
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.
yologdev/yoyo-evolve
Sets a warm, plain-spoken voice for an agent's journal entries and GitHub issue replies, with rules on openings, jargon, honesty and endings.
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.
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.
yologdev/yoyo-evolve
Analyze your own source code and capabilities to find bugs, gaps, and improvement opportunities
Works with
Categories
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.