release
Prepare and execute a selectools release โ version bump, changelog, docs, git, PyPI
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Prepare and execute a selectools release โ version bump, changelog, docs, git, PyPI
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Run the full code quality pipeline โ ruff format, ruff check, mypy, bandit
Auto-fill HANDOFF.md with current session state from git, then suggest /clear for a fresh start
Autonomous hunt-and-fix loop for a single selectools module. Finds bugs, auto-applies fixes, writes regression tests, verifies with pytest. Outputs RALPH_RESULT sentinel on the last line so the orchestration script can detect convergence.
End-to-end feature implementation โ source, exports, tests, docs, examples, and notebook
Deploy parallel QA agents to hunt for bugs across selectools. Each agent audits a different subsystem. Use for pre-release quality gates or periodic sweeps.
Cross-reference audit for stale counts, broken links, and doc drift across all files
| name | release |
| description | Prepare and execute a selectools release โ version bump, changelog, docs, git, PyPI |
| argument-hint | <version-number> |
Preparing release version: $ARGUMENTS
grep -m1 __version__ src/selectools/__init__.pygrep -m1 "version" pyproject.tomlpytest tests/ --collect-only -q 2>/dev/null | tail -1ls examples/*.py | wc -l | tr -d ' 'grep -c "ModelInfo(" src/selectools/models.pypython3 -c "from selectools.trace import StepType; print(len(StepType))" 2>/dev/nullpython3 -c "from selectools.observer import AgentObserver; print(len([m for m in dir(AgentObserver) if m.startswith('on_')]))" 2>/dev/nullls examples/*.py | tail -1Run /lint (fix mode) to auto-format and check code quality. ALL must pass
(the repo uses ruff + mypy + bandit โ NOT black/isort/flake8):
ruff check src/ tests/ (lint; isort+flake8 replacement)ruff format src/ tests/ --check (format; black replacement)mypy src/bandit -c pyproject.toml -r src/Then run the full test suite (use the project venv, e.g. .venv/bin/python -m pytest):
pytest tests/ -q # full suite โ do NOT shortcut to a subset
E2E hard gate (real API, before tagging). Per feedback_evals_before_release,
real-LLM e2e tests must run before every release โ mock tests passed while a real
SYSTEM-role bug shipped. Run the named gate files with whatever provider keys are
set (each provider's tests skip if its key is absent):
python -u -m pytest tests/test_orchestration_evals.py tests/test_orchestration_e2e.py --run-e2e -v
Tip: do NOT pipe through tail (it block-buffers and hides progress); use -u
and read the output file. If only one provider key is available, a scoped
-k <provider> run validates that provider's real path quickly.
STOP if any lint, test, or e2e failure. Fix before proceeding.
Update version in TWO files (must match):
src/selectools/__init__.py: __version__ = "X.Y.Z"pyproject.toml: version = "X.Y.Z"Add entry at the top following existing format. Include:
Then sync:
cp CHANGELOG.md docs/CHANGELOG.md
This is the most commonly missed step. For EVERY new feature in this release, verify ALL of these exist. Use /docs guidance for each missing item.
For each new feature, verify:
@beta for first release, @stable for mature APIs โ see ## Stability Markers in CLAUDE.md)@deprecated(since=..., replacement=...) applied and are listed in CHANGELOG migration notesdocs/modules/<FEATURE>.mdexamples/These docs reference counts and features that change with every release:
| Document | What to check |
|---|---|
README.md | "What's New" section, feature table, stats (test count, example count, model count) |
ROADMAP.md | Mark completed version โ , update Implementation Order section |
CLAUDE.md | Codebase Structure tree, StepType table, Observer counts, Current Roadmap section, Common Pitfalls |
docs/index.md | Feature table, model count, test count |
CONTRIBUTING.md + docs/CONTRIBUTING.md | Test count |
landing/index.html | Badge counts (if exists) |
Update .private/ tracking docs:
.private/session.md โ update Current State table, record what shipped.private/master-competitive-plan.md โ mark completed items, update scorecard/counts.private/competitive-analysis.md โ update comparison matrix, test count, advantages list.private/growth-plan.md โ update product features listdocs/llms-full.txt is generated, NOT hand-edited โ regenerate it so it picks up
new module docs and current counts/versions automatically:
python scripts/build_llms_full.py # rebuild from mkdocs nav
python scripts/build_llms_full.py --check # CI-style staleness guard
Then sync the changelog mirror and build the docs:
cp CHANGELOG.md docs/CHANGELOG.md && mkdocs build
Report any warnings. Fix broken links.
Run /audit to catch anything missed in Phase 4. This is a HARD GATE โ do not proceed to commit if there are count mismatches or content drift.
The audit checks:
Fix ALL mismatches before proceeding.
git checkout -b release/vX.Y.Z # or feat/<name> for feature releases
git add <specific-files>
git commit -m "release: vX.Y.Z โ Feature Theme Name"
Stop here and tell the user the commit is ready. Wait for explicit push approval.
git push -u origin HEAD
gh pr create --title "release: vX.Y.Z โ Theme" --body "$(cat <<'EOF'
## Summary
- Feature 1
- Feature 2
- ...
## Checklist
- [ ] All tests pass (N tests)
- [ ] Lint clean (black, isort, flake8, mypy)
- [ ] Docs updated (README, ROADMAP, CHANGELOG, module docs, index, architecture)
- [ ] Audit passed (counts consistent)
- [ ] mkdocs build clean
EOF
)"
Wait for user to approve merge.
gh pr merge <number> --merge --delete-branch
git checkout main && git pull
git tag -a vX.Y.Z -m "vX.Y.Z โ Feature Theme Name"
git push origin main --tags
Pushing the tag triggers the publish-pypi job in .github/workflows/ci.yml automatically.
No manual publish step needed โ CI builds and uploads to PyPI after tests + security pass.
Monitor at: https://github.com/johnnichev/selectools/actions
pip install selectools==X.Y.Z in a clean env