2026 models
Opus 5, Sonnet 5, Fable 5, Mythos 5 are current. Opus 4.8 / Sonnet 4.6 / Haiku 4.5 stay current. Claude 3.x is stale-model-id. --fix rewrites 3.x to claude-sonnet-5.
GESH Lab · LLM tooling
Zero-dependency linter for Claude Code and Agent Skills. Frontmatter, progressive disclosure, dead refs, secrets, stale model IDs — plus a 22-skill NetOps pack for the change window.
CLI and playground now agree. Pin the GitHub Action at @v0.5.0. Docs live here; the engine lives in one Python 3.8+ file.
Opus 5, Sonnet 5, Fable 5, Mythos 5 are current. Opus 4.8 / Sonnet 4.6 / Haiku 4.5 stay current. Claude 3.x is stale-model-id. --fix rewrites 3.x to claude-sonnet-5.
computer-unscoped fails closed when computer use / computer_toolset is paired with bare Bash on a jump host.
Agent Skills no longer need the skills-2025-10-02 header. beta-header-stale flags copy that still says they do. plugin-colon-name catches plugin:skill in name:.
Anything else is stale-model-id. Override leftovers with --allow-model.
Deep reasoning, long-horizon agents.
Previous flagship, still current.
Default coding / NetOps agent. --fix target.
Still current in Claude Code.
Fast, cheap classification.
Frontier class. Alias: fable.
Cyberdefense / trusted access. Alias: mythos.
Python 3.8+, no dependencies. Exit non-zero on ERROR so it drops into CI. --fail-on-warn and --min-score 80 for stricter gates.
curl -fsSL https://raw.githubusercontent.com/gesh75/claude-skill-lint/main/install.sh -o install.sh bash install.sh skill-lint ~/.claude/skills
curl -O https://raw.githubusercontent.com/gesh75/claude-skill-lint/main/skill_lint.py chmod +x skill_lint.py ./skill_lint.py ~/.claude/skills
name: skill-lint
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: gesh75/claude-skill-lint@v0.5.0
with:
path: skills
profile: claude-code
sarif: skill-lint.sarif
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: skill-lint.sarif
skill_lint.py [PATH] [--json] [--sarif FILE] [--profile claude-code|spec|claude-ai]
[--allow-model ID] [--fail-on-warn] [--fix] [--stdin]
[--min-score N] [--ignore CODE] [--exclude GLOB]
Profiles: claude-code (default, CC extensions are INFO), spec (strict Agent Skills), claude-ai (reserved names + XML). Score: errors −16, warns −6, infos −1, floor 0.
89 rules across schema, authoring, safety, disclosure, and style. Full table in the README. New in 0.5:
| Code | Level | What it catches |
|---|---|---|
| computer-unscoped | WARN | computer use / computer_toolset paired with unscoped Bash |
| beta-header-stale | INFO | skills-2025-10-02 treated as still required — Agent Skills are out of beta |
| plugin-colon-name | WARN | name contains a colon; plugin namespace is /plugin:name at invoke time |
| stale-model-id | WARN | outdated Claude model id (Claude 3.x, pre-4.5 leftovers) |
| unscoped-bash | WARN | allowed-tools grants bare Bash |
| disk-wipe / reverse-shell | ERROR | mkfs, dd if=/dev/zero, nc -e, /dev/tcp, pty.spawn |
L1 description is loaded every turn (~100 tok). L2 body loads on fire (<5k tok). L3 references/scripts are zero until read. A vague trigger is a permanent tax.
Non-zero exit on ERROR. GitHub Actions annotations and SARIF 2.1.0. Treat a skill like software you install.
Secrets, reverse shells, disk wipes, curl|bash, insecure TLS, unpinned installs, bundled .env / id_rsa.
22 production skills. Each file lints clean at ERROR/WARN, has a do-not-use boundary, numbered steps, and a verify loop. Copy into ~/.claude/skills/.
Source: skills/netops. Lint the pack with python3 skill_lint.py skills/netops --quiet --min-score 90.