This repo is my personal collection of Agent Skills for Claude Code, Codex, and Gemini CLI.
Each skill is a self-contained directory under skills/. It holds a SKILL.md, plus
any references/ or scripts/ that it needs. All three runtimes find the
same skill source. A runtime loads a skill's full body only when the skill's description matches
the task, or when you invoke the skill explicitly.
Important
These skills have strong opinions about my environment and my process. They work best if you share those opinions, or if you choose to adopt them. Read a skill's SKILL.md before you install it, and edit what does not fit. It is all plain Markdown. Know these three assumptions:
-
The process skills impose a spec-driven lifecycle.
brainstorming,writing-plans,executing-plans, andsubagent-driven-development, with the/deferredcommand, drive each project-sized feature through spec → plan → implementation → retirement. A small change gets a short design in chat and is built in the same session. These skills and the/deferredcommand create and maintain this structure in your project:- specs, as Markdown files in
specs/ - plans, in
specs/plans/<id>-<spec-name>.md, numbered automatically - finished work, retired to
specs/completed/andspecs/plans/completed/ - work that you consciously defer, appended to
specs/deferred_items.md
If your projects do not use that layout, these skills start to build it.
- specs, as Markdown files in
-
The review steps send code to OpenAI when the Codex CLI is present.
executing-plans,subagent-driven-development, andfinishing-a-development-branchrun a read-only second-opinion review with the Codex CLI (codex exec review) whenevercodexis on yourPATH. The review is agentic. It sends the branch diff to OpenAI under your Codex login, and every repository file and command output that Codex reads during the review. Where code egress is governed, keepcodexoff that machine or remove the step. -
The data and modeling skills assume my stack. That stack is Polars (not pandas), NumPyro + JAX (not PyMC), Python 3.13, and Altair, matplotlib, and plotly for charts.
validate-datais tuned to BLS (Bureau of Labor Statistics) data.
Skills are the center of the repo. The repo also carries runtime-specific agents, commands, hooks, and instruction files:
agent-skills/
├── skills/ # agent skills, one directory per skill (the tables below)
├── archive/ # retired skills, kept whole for a later restore (archive/README.md); never installed
├── agents/ # subagent definitions (reviewers + security/search/test/debug/docs — see Agents below)
├── commands/ # slash commands (/deferred, /fix-issue, /license-audit — see Commands below)
├── runtimes/ # generated Codex/Gemini agent and command adapters
├── hooks/ # Claude Code hooks: gates for Python/uv work repos + the read-only agent guard and the dispatch model guard (see Hooks below)
├── rules/ # rule files: path-scoped via .claude/rules/, one user-level (see Rules below)
├── build/ # lints and commit gates, the adapter generator, the Claude Code guide's drift detector, citation checks
├── specs/ # design records + implementation plans (retired work under completed/)
└── install.py # safe installer for Claude, Codex, Gemini, or all three (idempotent when linking)
The canonical skill bodies are portable. The runtimes use different file formats and tool names,
so build/sync_runtime_assets.py generates the Codex and Gemini agent files from
agents/. It also generates Gemini's TOML commands from commands/. The
hooks and rules stay specific to Claude Code. See Installation and the
compatibility notes below.
| Skill | Description |
|---|---|
bayesian-workflow |
An opinionated Bayesian modeling workflow with NumPyro (JAX) and ArviZ. It walks the full loop, from formulating a model to reporting results. It encodes guardrails that most agents skip: prior and posterior predictive checks, LOO-PIT calibration, prior-sensitivity checks, 94% HDI, non-centered parameterizations, and reproducible PRNGKey seeds. It bundles three scripts. diagnose_model.py and calibration_check.py write their results as JSON. check_diagnostics.py turns that JSON into qualitative ratings and ordered next steps for the report. (Adapted from Alexandre Andorra's PyMC skill. See Credits.) |
deep-learning |
Design, implement, train, fine-tune, and diagnose neural models in JAX. It uses Flax NNX, Optax, and Orbax by default. Its focused references cover sequence, scientific, vision, geometric, generative, and LLM topics. |
evaluate-deep-learning |
Evaluate neural models and research claims with explicit held-out inputs, metrics, leakage checks, comparable budgets, seed variation, domain checks, and experiment records. |
optimize-jax |
Reproduce, profile, and improve JAX execution: tracing, compilation, memory, precision, sharding, and generation and cache performance. It measures every change and keeps correctness parity. |
recommend-probabilistic-model |
Given a problem and its data, recommend a probabilistic-ML method grounded in Kevin Murphy's Probabilistic Machine Learning books. The skill is a thin decision-map router over 8 deep families: regression/GLMs/counts, hierarchical, time-series/state-space, GPs, factor models, classification, mixtures, and graphical models. It gives verified § references and pyprobml notebooks, a regularization and selection step that depends on the chosen family, and a structured handoff to bayesian-workflow. It bundles characterize.py, which computes the modeling signals that explore-data's profile.py does not, such as overdispersion and class balance. It recommends and points. It does not fit a model. |
recommend-causal-design |
Choose a causal research design before estimation. The skill defines the requested effect, and it makes the causal diagram and the identification assumptions explicit. It compares credible designs and writes a recommendation memo with diagnostics, sensitivity plans, and an implementation handoff. It covers experiments, adjustment and weighting, instrumental variables (IV), regression discontinuity (RDD), difference-in-differences (DiD), synthetic control, interrupted time series, and longitudinal regimes. It keeps local effects separate from population targets. When identification fails, it gives an evidence plan. Its planning workflow is selectively adapted from Robson Tigre and Alexandre Andorra (MIT). |
recommend-visualization |
Given an explore-data profile and an intent (trend, comparison, distribution, correlation, part-to-whole, ranking, geographic, flow), recommend the right chart, then write the code. The recommendation conditions on the data's signals: cardinality, row count, skew, panel shape, and null rates. Its core is a pure, unit-tested (intent × signal) → ranked candidates router. The router ships the encoding map (field → channel), grounded in perceptual theory. It routes the code phase (Phase 2) to Altair, matplotlib, or plotly. The skill is the visualization sibling of recommend-probabilistic-model. That skill recommends a model. This one recommends a view and carries it through to code. |
track-model-experiments |
Keep a ledger of model variants for each analysis, and rank the variants on one declared criterion. A human-written experiments.md records what changed and why across v1 → v2 → v3. A bundled compare_experiments.py ranks the variants and stamps the winner back into the ledger. ELPD mode loads each Bayesian variant's saved InferenceData, ranks the variants with az.compare, and extracts convergence diagnostics. Score mode ranks any variants (tabular cross-validation, forecast backtests, or Bayesian leave-future-out) from each variant's scores.json of per-fold or per-origin scores. It reports each variant's paired difference from the top variant and its standard error. The comparator refuses the inputs that make a comparison silently wrong. In ELPD mode, it refuses variants fit to different observations, a missing log_likelihood group, several log-likelihood variables (one per source in a multi-source model), or a log-likelihood with no pointwise terms. In score mode, it refuses mixed criteria or orientations, unit sets that differ, non-finite scores, or fewer than two units. In both modes, it refuses a mode that does not match the ledger's criterion. It names each ledger row that it could not rank. references/predictive-evaluation.md holds the backtest protocol, the paired-difference rule and its limits, benchmark baselines, and proper scores. The skill owns the variant ledger and the stopping rule. bayesian-workflow's model-comparison.md owns the ELPD statistics. Neural runs stay with evaluate-deep-learning. |
tune-hyperparameters |
Tune any model's knobs without leakage or overfitting: sklearn, boosting, statsmodels, NumPyro, dynamax and neural models. First classify the regime: predictive search (regime A), inference diagnostic (regime B) or structural choice (regime C), such as the number of mixture components or an AR order. Then tune the right objective with the right guard. For regime A, a table picks the cross-validation splitter from the data's dependence structure: independent, grouped, spatial or temporal. For temporal data, the skill bundles a PurgedTimeSeriesSplit (time_series_cv.py). It gives forward-chaining cross-validation with an embargo gap and an optional label-horizon purge. Given each row's period, it splits whole periods, so it also works on a panel. It feeds a manual, seeded Optuna objective (verified against the installed version), with nested cross-validation for large searches and a neural search loop: a trial budget, pruners, early stopping inside the training fold, and seed replication. A paired per-fold rule says when a gain is noise. For regime B, a thin decision table routes the NUTS and SVI knobs to bayesian-workflow, and the skill owns the optax learning rate of non-neural point fits. The bundled splitter guards temporal leakage only. It graduates a tuned winner to a track-model-experiments variant row with a scores.json that the comparator ranks in score mode, and it leaves revision and vintage leakage to develop-testing-strategy. |
creative-thinking |
Divergent target-finding for when the goal itself is fuzzy: the analysis, the estimand, the objective, or the approach space. Instead of converging on the first plausible target, the skill delivers a map of genuinely distinct candidate targets. It sketches each candidate in 3 lines or fewer and names the selection criteria. At least one candidate escapes the map's own organizing frame. It sorts gating questions by where the answer lives. It asks first for facts that the user holds (data access, the consuming decision), with a one-line preview for each direction. It absorbs modeling judgments provisionally, and it marks the candidates that would flip under the other answer. It runs ahead of brainstorming's narrowing and tune-hyperparameters' mechanics, and it hands the chosen target off unchanged. It was eval-tested against a no-skill baseline (RED→GREEN, two human-reviewed iterations). |
develop-testing-strategy |
Design a test strategy from invariants, not coverage %, for web scrapers, Polars pipelines, and NumPyro/PyMC models. Its methods include recorded fixtures, schema/null/key assertions, determinism, SBC-lite (parameter recovery on simulated data), and golden-master parity. |
validate-data |
QA a dataset or an analysis before it ships: schema/integrity, reproducibility, benchmark reconciliation, and methodology/bias checks. It is Polars-first, and it is tuned to BLS data and to as-of/vintage correctness. |
explore-data |
Profile a new dataset with Polars before analysis: null rates, key uniqueness, distributions, duplicates, quality flags, and panel balance. It bundles a reusable profile.py. |
tech-debt |
Audit, categorize, and prioritize tech debt in research and data codebases, with the DELETE-vs-HARDEN triage. It bundles scan.sh, a sweep for debt signals. |
design-architecture |
Write or evaluate Architecture Decision Records (ADRs) for data and modeling systems, for example NumPyro/JAX vs PyMC, a store layout, or a vintage data model. It bundles an ADR scaffolder. |
llm-wiki |
Maintain a personal research wiki (the Karpathy LLM-wiki pattern) as a citation-audited knowledge base instead of a folder of unread PDFs. The skill ingests a source as a status: unverified page. It promotes claims onto concept pages that carry inline [slug §x] locators. The quarantine rule forbids an unverified summary from ever becoming grounds for another page. A contradiction keeps both claims, with an entry in open-questions.md, instead of an overwrite. Every operation that changes the wiki appends to log.md. The wiki root ($LLM_WIKI_ROOT) owns its normative SCHEMA.md, so the skill stays generic. A second root, for example work vs. personal with no content crossing between them, reuses the skill unchanged. A supervised harvest turns a repo's specs/ corpus (specs, plans, deferred items) into a raw/specs/ digest, one repo at a time. The skill bundles four stdlib-only scripts. bootstrap_wiki.py seeds a fresh root and never overwrites content. lint_wiki.py is the mechanical gate before any status flip. distill_sessions.py turns Claude Code transcripts into capture notes to ingest. distill_specs.py runs the harvest's mechanical inventory and assembly steps. An INSTALL.md covers fresh machines. |
describe-critique-methodology |
Leg 1 of the methodology-critique loop. Write a system-level or module-level methodological description of a codebase. Its math and prose are deliberately decoupled from the code: a notation table, the data-generating story, the estimation procedure, assumptions, evaluation criteria, and open questions. Carry the description to a Claude Chat Research critique. Then synthesize the description and the adjudicated critique into a house-format spec, routed onward to derive-roadmap. Routing headers in the artifacts themselves join the two modes (Describe and Synthesize). The skill bundles an advisory check_decoupling.py. In v1, its scope is statistical, Bayesian, and nowcast work. |
derive-roadmap |
Leg 2 of the methodology-critique loop. It takes a synthesized spec and the system that the spec describes, and it partitions the distance between them into staged spec→plan→implementation cycles. It runs a one-time gap analysis over every numbered requirement. The rubric in references/gap-rubric.md has four classes: implemented-as-specified, implemented-differently, missing, and in-code-but-not-in-spec. The skill orders stages by dependency and information order, not by the spec's own priority ranking. When the gaps fit a single cycle, it writes no roadmap file at all. Otherwise it writes a brevity-budgeted specs/<name>-roadmap.md (references/roadmap-format.md) that cites the spec's § references instead of restating them. Every stage routes onward to brainstorming or writing-plans by bare name. This skill never designs a stage. It resumes from authoritative stage stamps, and it supports a first-class PARKED exit that folds unticked stages into specs/deferred_items.md. |
prepare-handoff |
The sending half of a handoff between sessions. Before a fresh session takes over a spec, a plan, or a checkpoint, the skill sorts what that session needs into four bins. The bins are: already in the artifact, recomputed by the receiver, amendable and committed now, or everything else. Only the last bin goes into a brief, which is never committed. Fact-checker and cold-reader templates review the brief. The final message gives one launch line for each runtime, and it leaves the choice of model to the owner. |
write-with-asd-ste100 |
Write and rewrite in ASD-STE100 Simplified Technical English (STE), the controlled English of aircraft maintenance manuals. Human mode, the default, writes about 80% of the way to the standard, after a tip from Andrej Karpathy. Agent mode applies strict rules to prompts, tool descriptions, subagent briefs and error strings. The skill rewrites a text, or a whole file in place (left uncommitted) or as a .ste copy beside it. It also explains, summarizes and draws small Mermaid diagrams, and it never claims dictionary compliance. It bundles danyuchn's structural linter, unchanged. A user-level rule carries the everyday habits and a label rule into every session (see Rules). Adapted from danyuchn and prithivrajmu (MIT). |
document-python-package |
Document a public Python package with Great Docs 0.17.x. The skill is a thin layer over Posit's five official Great Docs skills. It builds on them and copies none of their text. A bundled preflight.py checks the great-docs version that uv.lock pins against the tested range and finds the config. Then it fetches the official skills from the matching release tag into a cache. The skill pins great-docs in a uv docs group that CI also installs. It makes the README work as the site homepage, and it freezes slow executed examples. Its done gate has three checks: lint, a build that kept its API reference, and docstring completeness. |
This family is the proactive-cleanup counterpart to tech-debt. It applies standards in the flow of normal editing, and consent bounds how far it goes. Most rule codes come from Martin's Chapter 17 catalog, cited by code only, with no book prose. The exception is the Modules category (rules M1–M4, on module and subpackage granularity), which is adapted from Mancuso Lab's python-module-design skill (see Credits). The curation leaves mechanical rules to ruff and keeps the judgment-level ones, tuned to Polars and JAX. A third artifact, the clean-code-python rule, loads the Python guardrails whenever a *.py file is read, written or edited (see Rules).
| Skill | Description |
|---|---|
clean-coder |
Opportunistic cleanup with a consent gate. In-scope fixes apply directly. Anything adjacent goes through announce → list (file:line + rule code) → ask → apply-on-yes. Beck's Tidy First? supplies the spine: tidyings and behavior changes never share a commit, and a stopping rule caps the cascade and defers bigger findings to tech-debt. It was pressure-tested against a no-skill baseline on six gate scenarios. |
clean-code |
The curated standards catalog that clean-coder applies. It gives each of Martin's Names, Functions, General, Comments, and Tests rules (N/F/G/C/T) one disposition: keep, defer to ruff, or drop. Its examples are tuned to the stack. Polars fluent chains are not Law of Demeter violations. jax.lax.switch is the dispatch that G23 (dispatch over if/elif chains) asks for. Comments that carry design intent survive C3 (no redundant comments). A sixth category, Modules (M1–M4), comes from Mancuso Lab. Six per-category references load on demand, and every fix cites its rule code. |
Adapted from superpowers (Jesse Vincent, MIT)
These skills are adapted from Jesse Vincent's superpowers skills. They are process disciplines for planning, TDD (test-driven development), debugging, code review, and skill authoring. I made three mechanical changes so that they work as standalone personal skills:
- I rewrote cross-skill references from the
superpowers:plugin namespace to bare skill names. - I removed unused authoring scaffolding.
- I dropped the plugin-bootstrap skill.
Beyond that cleanup, I rewired the planning and execution skills around the spec-driven lifecycle at the top of this README. The lifecycle has the specs/ layout, auto-numbered plans, and a plan-completion protocol that marks up the plan, logs deferred items, and retires the spec. Upstream does not impose that workflow. For attribution and license, see NOTICE and LICENSE-superpowers.
Note
These skills overlap with the upstream superpowers plugin. If you also run that plugin, these personal copies duplicate it under the same names: bare names here, and the superpowers: namespace in the plugin. Use one source to avoid the duplication.
| Skill | Description |
|---|---|
brainstorming |
Size the work: do a quick, clear task at once, design a small change in chat, and write a spec for a project. |
writing-plans |
Turn a spec into a written implementation plan before you touch code. |
executing-plans |
Execute a written plan directly in the current session. Use it for tightly coupled plans, or when your partner asks for direct execution. |
subagent-driven-development |
Execute plans with independent tasks in the current session. |
dispatching-parallel-agents |
Fan out 2+ independent tasks with no shared state. |
test-driven-development |
Write tests before implementation for any feature or bugfix. |
systematic-debugging |
Diagnose bugs and test failures methodically before you propose fixes. |
verification-before-completion |
Run the verification and check its output before you claim that work is done. |
requesting-code-review |
Get work reviewed when you complete a feature or before you merge. It also carries the recipe for the Codex CLI second-opinion review (codex-review.md). The plan executors run that review beside code-reviewer, and branch finishing runs it before a merge or a PR. Where the codex CLI is absent, the review is skipped with a notice. |
receiving-code-review |
Handle review feedback with rigor instead of blind agreement. |
finishing-a-development-branch |
Decide how to integrate completed work: merge, PR, or cleanup. A Codex second-opinion review gates the merge and the PR. |
using-git-worktrees |
Create an isolated workspace for feature work. |
writing-skills |
Create, edit, and verify agent skills. |
The canonical subagent definitions live in agents/. Claude Code loads these files
directly. The generated Codex TOML and Gemini Markdown adapters live under
runtimes/. The adapters keep the same system-prompt body and map Gemini's tool
identifiers. They declare read-only sandboxes in Codex where required. They inherit the active
runtime model instead of carrying Claude model names.
Five agents are read-only: code-reviewer, task-reviewer, security-auditor, Explore, and
test-runner. They keep a shell, and each runtime handles that shell differently:
- Claude Code: their
tools:lists hold noWriteorEdit. The read-only agent guard, once you install it (see Hooks), denies Bash commands that change files or git state. The guard is a guardrail against drift from the contract, not a sandbox. - Codex: every adapter sets
sandbox_mode = "read-only"excepttest-runner. Its test commands write caches (uv writes~/.cache/uv), and a read-only sandbox blocks that. It sets no sandbox mode and inherits the session's mode. Its contract alone keeps it from editing. A probe withcodex sandboxon 2026-11-01 showed that both the read-only and the workspace-write modes block~/.cache/uv. In those modestest-runnercan run only commands that write no cache, unless you start Codex with a wider mode. - Gemini CLI: each adapter lists
run_shell_commandwith no restriction.
| Agent | Description |
|---|---|
code-reviewer |
A read-only reviewer for diff-based reviews against a plan, a spec, or requirements. requesting-code-review dispatches it, and so does subagent-driven-development for its final whole-branch review. Per-task reviews go to task-reviewer. It has no edit tools. It inspects history with git show and git diff, and it reports Critical and Important findings, a Declined to judge list, and a merge verdict. Opus-pinned. |
task-reviewer |
A read-only, task-scoped reviewer for subagent-driven-development's per-task gate. It checks one task's diff against its brief for spec compliance and code quality, and it returns both verdicts. It carries the full review contract, so a dispatch needs only the paths of the task's brief, report, and diff. Sonnet is its floor. For a risky or subtle diff, the controller escalates the review to Opus. |
security-auditor |
A read-only security reviewer for a diff, a branch, or a repo. It covers injection, committed secrets and credential handling, insecure deserialization, TLS verification, and dependency risks. It ranks findings by severity, each with file:line and a concrete remediation. Opus-pinned, like code-reviewer. |
explore |
⚠ A Haiku-pinned override of the built-in Explore agent. It keeps the same read-only fan-out-search contract and adds a structured output contract: path:line refs with relevance notes, and no file dumps. The frontmatter name: Explore (capital E) is what shadows the built-in. Claude Code resolves agents by the name field, case-sensitively. Shadowing depends on the version (probed on Claude Code 2.1.219), so probe again after a binary update. |
test-runner |
Runs one test suite in isolation and reports the complete failure output. It never truncates a traceback, it reports warnings as findings, and it does not diagnose. The dispatch supplies the exact command. The agent never guesses a runner. Haiku-pinned. |
debugger |
Fixes one self-contained, reproducible failure in an isolated context: reproduce → isolate the root cause → failing test → minimal fix. It leaves all changes uncommitted for review. Sonnet-pinned. |
docs-writer |
Writes grounded technical docs in an isolated context: READMEs, analysis write-ups (methods → results → caveats), docstrings under the clean-code comment discipline, and general guides. It reads the code first, flags unverified claims, and never commits. Sonnet-pinned. |
The slash commands for Claude Code live in commands/. The generated Gemini TOML
commands live in runtimes/gemini/commands/, and they pass user
arguments through {{args}}. This repo has no command adapter for Codex. In Codex, you invoke the
reusable workflows as skills.
| Command | Description |
|---|---|
/deferred |
Triage specs/deferred_items.md in the current project. It groups the unticked items by theme. Then it sorts each item into retire, quick fix, plan, design, or hold, so that the ceremony matches the item. Only items that record an open design decision go to brainstorming. The triage itself is read-only. On the user's selection, the command retires or quick-fixes items, ticks them with a dated suffix, and routes the rest to writing-plans or brainstorming. The plan-completion protocol still ticks the items that a plan implements. |
/fix-issue |
Fix a GitHub issue end to end: gh issue view → classify → an offered worktree and a fix branch → systematic-debugging + TDD + verification → a PR that links Fixes #N. It hands the last step to finishing-a-development-branch (the PR path), so the backlog gate and the review step run before the push. It fixes bugs only, and it routes a feature-shaped issue to brainstorming. Without gh or a GitHub remote, it stops gracefully. |
/license-audit |
Audit the current repo's licensing and attribution. It runs the repo's mechanical gates where they exist. Then it makes judgment checks: NOTICE ↔ artifact sync, LICENSE consistency, flags for copyleft and NonCommercial (NC) compatibility, and the risk of uncredited adaptations. Read-only. |
Hook scripts live in hooks/. They are Claude Code hooks, not cross-runtime config. They
fall into two groups, which install differently:
- The project tooling hooks (
ruff-fix.sh,ruff-check.sh,uv-guard.sh) are templates for your Python/uv work repos, not config for this repo. You copy each one into a target repo and register it in that repo's.claude/settings.json. - The read-only agent guard (
readonly-agent-guard.py) is an agent contract hook. It enforces the contract of the five read-only agents (see Agents). You install it once, globally, in~/.claude. - The dispatch model guard (
dispatch-model-guard.py) is also an agent contract hook. It makes every agent dispatch name itsmodel, so an agent never silently inherits the session's costly model.subagent-driven-developmentrelies on it. You install it once, globally, like the read-only guard.
| Hook | Event | What it does |
|---|---|---|
ruff-fix.sh |
PostToolUse (Write/Edit) |
Runs uv run ruff check --fix + ruff format on the edited *.py. It is best-effort: PostToolUse fires after the write and cannot undo it. |
ruff-check.sh |
Stop |
Runs uv run ruff check .. Exit 2 feeds back to Claude whatever --fix could not resolve. stop_hook_active guards it against loops. When ruff cannot run, it exits 1 with "ruff unavailable", which does not block. |
uv-guard.sh |
PreToolUse (Bash) |
Blocks pip install and bare python / pytest, and injects the uv … form instead. Escape hatch: no-uv-guard anywhere in the command. |
readonly-agent-guard.py |
PreToolUse (Bash) |
For the five read-only agents, denies Bash commands that change files or git state, such as git checkout, git stash, git reset, and sed -i. For every other agent, and for the main session, it exits at once and does nothing. Install it globally, by symlink. Then run probe-readonly-guard.sh once, because a wrong path or a missing execute bit fails open. |
dispatch-model-guard.py |
PreToolUse (Agent) |
Denies an Agent call with no model. It allows model-pinned agents, built-in agents that pin their own model, and fork. An unknown agent type, plugin agents included, must name a model. Install it globally, like the read-only guard. |
The three project tooling hooks read the hook JSON payload from stdin with jq. The guard is
Python and needs no jq. To block, a hook uses exit 2, which feeds stderr back to Claude, or
it prints a JSON deny decision, as the guard does. Exit 1 only logs, unless the hook sets
"onFailure": "block" (2.1.295+). That setting has no effect on a Stop hook such as
ruff-check.sh. A shell-form PreToolUse or PermissionRequest command hook on Windows without
Git Bash (2.1.299+) also blocks when it fails, unless it sets shell to powershell, which still
fails open.
Warning
Do not install the project tooling hooks globally, and do not wire them into this repo. A hook registered in ~/.claude/settings.json fires in every project, including non-Python ones. Also, agent-skills itself has no root pyproject.toml. Its bundled scripts run on uv run --with inline deps. So ruff check would have no config to run against, and uv-guard.sh would fight the very invocation that the repo intends. Install them per work repo instead. The read-only agent guard is the exception: it is global by design, and it acts only on the five read-only agents.
hooks/README.md has the details for both groups. It gives the copy-in
procedure, the settings JSON to merge, and an optional permission allowlist that stops the uv
forms from prompting in manual permission mode. It also gives the guard's global install and tests,
and each script's known limits. One notable limit: uv-guard.sh is a command-word heuristic, not a
shell parser.
Rule files live in rules/. They hold standing conventions that load automatically, with no skill invocation. Claude Code loads a project's .claude/rules/*.md natively. A rule with a paths: frontmatter glob loads only when a matching file is read, written or edited. A rule without frontmatter loads at session start. (Native loading was verified against Claude Code 2.1.218.)
This repo keeps rule sources in rules/. A path-scoped rule applies here through a committed relative symlink from .claude/rules/. The user-level rule applies here, as in every project, from ~/.claude/rules/:
| Rule | Scope | What it injects |
|---|---|---|
clean-code-python.md |
**/*.py |
Python guardrails, loaded on .py reads, writes and edits (a compaction summarizes them away): single quotes, 4-space indent, Polars over pandas, method-style Polars expressions, lazy evaluation, NumPyro+JAX, and named constants (G25). It cross-references the clean-code catalog by rule code. |
write-with-asd-ste100.md |
every session, user-level | The everyday writing habits of the write-with-asd-ste100 skill, for replies and for prose files written for people. It also carries the label rule, and a pointer to the skill for rewrites, agent-facing text and strict STE. |
Rules here ship project-level. Commit 7aa454f made that decision when it added the Python rule. To use a path-scoped rule in another project, copy it into that repo's .claude/rules/. (User-level ~/.claude/rules/ also loaded in the 2.1.218 probe. See that commit's message.)
write-with-asd-ste100.md is the one exception. It shapes every reply and every prose file, and an "all output" rule only works at user level. So install.py places it in ~/.claude/rules/, for Claude Code only: Codex and Gemini get the skill without the rule. It is not linked into this repo's .claude/rules/, because a second copy there would load it twice in this repo.
Clone the repository somewhere stable:
git clone https://github.com/lowmason/agent-skills.git ~/agent-skillsSkills that bundle scripts run them with uv run, which reads each script's dependencies from its
own header. Install uv before you use those skills. Each one names uv
in its compatibility field. The installer itself needs only python3.
Then run the installer for one runtime or for all three. It installs every skill, plus that runtime's supported agents and commands:
cd ~/agent-skills
python3 install.py codex
python3 install.py gemini
python3 install.py claude
# or: python3 install.py allSymlinks are the default, so edits to installed skills are live. Run the installer again after a pull that adds skills, agents, or commands. It is idempotent for symlinks that already point at the matching item in this checkout. It refuses to overwrite any other existing file or directory. It checks every destination before it writes, so a conflict installs nothing and lists every conflicting path at once. Useful options:
python3 install.py codex --skill bayesian-workflow # just this skill; repeat --skill as needed
python3 install.py claude --skill finishing-a-development-branch # plus its dependencies (see below)
python3 install.py codex --skill bayesian-workflow --companions # the skill plus Codex's agents
python3 install.py claude --rule write-with-asd-ste100 # the user-level rule and the skill it names
python3 install.py claude --no-rules # everything except the user-level rules
python3 install.py claude --no-companions # every skill, no agents or commands
python3 install.py all --dry-run # inspect without writing
python3 install.py gemini --copy # frozen copies instead of symlinks (see below)
python3 install.py all --check # list links into this repo whose source is gone--check installs nothing. A renamed, archived or removed skill leaves its link behind, and a
normal install never looks at it. --check lists each link in the runtime's directories that points
into this repository at a source that is gone. It exits 1 when it finds one. It never removes a
link, so you delete the stale ones yourself.
--skill also installs what the named skills cannot work without, and what those need in turn.
That means the sibling skills whose scripts or files they use, and the /deferred command where
the runtime has commands (Claude Code, Gemini CLI). For example,
--skill finishing-a-development-branch brings writing-plans, requesting-code-review, and
/deferred. --skill derive-roadmap brings writing-plans, which /deferred needs, even where
the command itself is not installed (Codex, or --no-companions). --skill skips the runtime's other agents
and commands unless you add --companions. A full install includes every companion unless you add
--no-companions. That option leaves out all agents and commands, required ones included. The
table is DEPENDENCIES in install.py.
A full Claude install also places the user-level rules, today only
write-with-asd-ste100, in ~/.claude/rules/. --rule NAME installs one of
them with the skills that it names and their dependencies. Like --skill, it
skips the runtime's other agents and commands unless you add --companions.
--no-rules leaves the rules out of a full Claude install. Codex and Gemini
installs place no rule. On those runtimes, --rule installs only the skills it
names and prints a one-line notice. The table is USER_RULES in install.py.
--copy installs the same skills, agents, and commands that a link install would, including any
that git ignores whole. It copies agents and commands as they are. Within a skill, it copies the
files that git keeps: tracked files, and untracked files that git does not ignore. Sometimes git
keeps none of a skill's files: there is no git, the directory is not a checkout, or git ignores the
skill whole. Then --copy copies everything except a fixed list of generic names from this repo's
.gitignore, such as caches and virtualenvs. Patterns that you add to .gitignore later do not
apply there. It installs nothing if anything that it would copy is a symlink, because a copy would
follow the link. It also installs nothing if it finds a nested repository or submodule, because it
cannot copy one file by file. It never replaces an existing destination, a previous copy included,
so remove old copies before you run it again.
| Runtime | Skills | Agents | Commands | Rules |
|---|---|---|---|---|
| Claude Code | ~/.claude/skills/ |
~/.claude/agents/*.md |
~/.claude/commands/*.md |
~/.claude/rules/*.md (user-level rules only) |
| Codex | ~/.agents/skills/ |
~/.codex/agents/*.toml |
— | — |
| Gemini CLI | ~/.agents/skills/ |
~/.gemini/agents/*.md |
~/.gemini/commands/*.toml |
— |
Codex and Gemini deliberately share the cross-runtime ~/.agents/skills/
installation. This matches Codex's local skill discovery
and Gemini CLI's discovery tiers.
To link one skill manually for Codex and Gemini:
mkdir -p ~/.agents/skills
ln -s ~/agent-skills/skills/bayesian-workflow ~/.agents/skills/bayesian-workflowFor Claude Code, use ~/.claude/skills/ instead. To scope a skill to one project, use
.agents/skills/ for Codex and Gemini, or .claude/skills/ for Claude Code:
mkdir -p .agents/skills
ln -s ~/agent-skills/skills/bayesian-workflow .agents/skills/bayesian-workflowUse /skills in Claude Code or Codex, and /skills list in Gemini. In Gemini, check agents with
/agents list and commands with /commands list. After you change generated files, use the
matching reload command. Codex reads its TOML agents when a new session starts.
The repo also includes project instruction entrypoints. Codex reads AGENTS.md.
Gemini reads GEMINI.md, which imports the canonical maintainer guide.
The project tooling hooks break the pattern above. Do not symlink them into ~/.claude/, or they fire in every project that you open (see the warning under Hooks). Copy them into the work repo that wants them:
mkdir -p .claude/hooks && cp ~/agent-skills/hooks/{ruff-fix,ruff-check,uv-guard}.sh .claude/hooks/ && chmod +x .claude/hooks/*.shThen merge the hooks block from hooks/README.md into that repo's .claude/settings.json. Prefer cp to a symlink here. With a copy, an edit to a template cannot silently change the gates in every repo at once. Copy the hooks again when you want the update.
The read-only agent guard is the opposite case, and install.py does not install it. You symlink it once into ~/.claude/hooks/ and register it in ~/.claude/settings.json, so it covers every project. A symlink keeps the guard in step with the agent files that it enforces, which are themselves symlinked from this repo. hooks/README.md gives the commands, the settings entry, and the live probe to run after the install.
write-with-asd-ste100.md is user-level. A full python3 install.py claude places it.
python3 install.py claude --rule write-with-asd-ste100 places it with only its skill.
The path-scoped rules are project-level, per repo:
mkdir -p <target-repo>/.claude/rules
cp ~/agent-skills/rules/clean-code-python.md <target-repo>/.claude/rules/In this repo, the committed .claude/rules/clean-code-python.md symlink already wires the rule up. There is nothing to install.
- My original skills —
develop-testing-strategy,validate-data,explore-data,tech-debt,design-architecture,recommend-probabilistic-model,recommend-visualization,track-model-experiments,tune-hyperparameters,creative-thinking,llm-wiki,describe-critique-methodology,derive-roadmap,deep-learning,evaluate-deep-learning,optimize-jax,prepare-handoff, anddocument-python-packageare my own work, MIT licensed (seeLICENSE). - deep-learning, evaluate-deep-learning, and optimize-jax — my own original work (MIT). That covers their JAX training, evaluation, execution and research-generation workflows, focused references, record contracts, prose, runnable examples and synthetic checks. The Orchestra AI Research Skills suite is coverage inspiration, by reference to scope only. No Orchestra prose or code is adapted or reproduced. Primary documentation and papers are cited without bundled copies, model weights or datasets. CPU fixtures and the limits of the hardware and checkpoint recipes are recorded separately (see
NOTICE). - Archived skills —
archive/skills/keeps three retired originals,bls-data-context,classification-codesandgeographic-codes, so that one can be restored. They are not installed. They are my own work, MIT licensed. Thedata/tables in the two code skills are derived from publications of the U.S. Census Bureau, the U.S. Bureau of Labor Statistics, and the Office of Management and Budget. These are the NAICS and SOC structure and concordance workbooks, the Census occupation code lists, the county gazetteer, and the "List 1" CBSA delineation workbooks. Those publications are works of the United States Government and in the public domain under 17 U.S.C. § 105. Each code skill'sscripts/build.pykeeps the exact source bytes insources/as the audit copy, with URL, sha256, and retrieval time inMANIFEST.md. It derivesdata/from them. The parsing code, the seed tables, the hand-curated county change log, and all prose are my own work, MIT (seeNOTICE). - Cited-only sources —
recommend-probabilistic-modelcites Kevin Murphy's Probabilistic Machine Learning books (CC-BY-NC-ND) by section number only.bayesian-workflowcites the Bayesian Workflow book by Gelman, Vehtari, McElreath et al. (2026) by chapter and section number only. It cites the Gelman et al. (2020), Betancourt (CC BY-NC 4.0), and Gabry et al. workflow papers by author-year.recommend-visualizationcites the visualization literature by author-year only. No text is reproduced, and no copies are bundled (seeNOTICE). - Clean-code family —
clean-coder,clean-code, andrules/clean-code-python.mdadapt the rule-catalog concept from Robert C. Martin's Clean Code (Prentice Hall, 2008). They cite it by rule code and short title only, and they reproduce no book prose.clean-coderalso cites Kent Beck's Tidy First? (O'Reilly, 2023), Martin Fowler's opportunistic-refactoring note, and John Ousterhout's A Philosophy of Software Design (2nd ed., 2021), by idea only (seeNOTICE). - llm-wiki — my own work (MIT). It implements the LLM-wiki pattern from Andrej Karpathy's public idea file. It adopts a simplified per-claim citation-audit form from kfchou/wiki-skills. It takes both by reference to the idea only: no external prose or code is reproduced, and no copies are bundled. Its bundled
scripts/are my own work under the same terms (seeNOTICE). - bayesian-workflow — adapted from Alexandre Andorra's original PyMC Bayesian-workflow skill (MIT licensed). I ported it to NumPyro + JAX and expanded the visualization guidance. Its
references/model-comparison.mddocuments fourarviz_statsAPIs that themodel-evaluationskill in pymc-labs/python-analytics-skills (Chris Fonnesbeck) pointed out. That repository ships no LICENSE text, so the skill takes the idea only and reproduces nothing from it. - Mancuso Lab's coding-skills — two skills adapt material from mancusolab/coding-skills (MIT, © 2026 Mancuso Lab), and a third takes one idea from it.
bayesian-workflow'sreferences/jax-numerics.mdadapts precision and stability rules from itsjax-equinox-numericsandjax-project-engineeringskills.clean-code's Modules category (M1–M4) adapts four rules from itspython-module-designskill.tech-debt's "Unguarded join cardinality" signal takes only the idea of the "Make join contracts explicit" rule in itspolars-data-engineeringskill. The upstream license text is inLICENSE-coding-skills, and the exact scope is inNOTICE. - recommend-causal-design — its planning workflow is selectively adapted from Robson Tigre's causal-planner and Alexandre Andorra's causal-inference, both MIT licensed. The method references and the memo contract are newly written. The skill cites the primary literature without reproducing or bundling it. Both full upstream notices are in
LICENSE-causal-design-sources. The exact source commits and the scope of the adaptation are inNOTICE. - write-with-asd-ste100 — adapted from danyuchn/asd-ste100-skill (Dustin Yuchen Teng) and prithivrajmu/asd-ste100 (Dustin Yuchen Teng and Prithiv M U), both MIT licensed.
scripts/ste-lint.pyis danyuchn's linter, copied unchanged. The 80% style follows a post by Andrej Karpathy, cited by idea only. The skill cites ASD-STE100 by issue and bundles nothing from the standard or its dictionary. The skill's test record underspecs/credits prithivrajmu's eval cases. Both full upstream notices are inLICENSE-write-with-asd-ste100-sources. The exact source commits and the scope of the adaptation are inNOTICE. - superpowers skills — the 13 process skills are adapted from the superpowers project by Jesse Vincent, MIT licensed, © 2025. My modifications are under the same MIT terms. The
code-reviewerandtask-revieweragents are distilled from the adaptedrequesting-code-reviewandsubagent-driven-developmentreviewer templates, under the same terms. SeeLICENSE-superpowersandNOTICE.
Everything I wrote here is MIT licensed. NOTICE tracks the attribution for each skill:
- My original skills and
bayesian-workflow— MIT, © Lowell Mason; full text inLICENSE. (bayesian-workflowis an adaptation of Alexandre Andorra's PyMC skill; its upstream notice is inLICENSE-andorra.) recommend-causal-design— MIT. The adaptations are by Lowell Mason.LICENSE-causal-design-sourceskeeps the source copyrights and permission notices for Robson Tigre and Learning Bayesian Statistics.write-with-asd-ste100and its rule — MIT. The adaptations are by Lowell Mason.LICENSE-write-with-asd-ste100-sourceskeeps the source copyrights and permission notices for Dustin Yuchen Teng and Prithiv M U.- superpowers skills — MIT, © 2025 Jesse Vincent (superpowers). The full text is in
LICENSE-superpowers. - Mancuso Lab material in
bayesian-workflowandclean-code— MIT, © 2026 Mancuso Lab (coding-skills). The adaptations are by Lowell Mason. The full upstream text is inLICENSE-coding-skills. - Bundled U.S. Government data — the verbatim
sources/audit copies in the archivedclassification-codesandgeographic-codes(archive/skills/) are works of the United States Government, in the public domain under 17 U.S.C. § 105, and carry no license of mine; thedata/tables derived from them, the build scripts, the seed tables, and all prose are MIT (seeNOTICE).
Each skill directory also carries copies of the license files that apply to it, so a skill installed on its own keeps its notices; the root files are canonical, and build/check_provenance.py checks the copies.