Expert patterns for Git version control: branching, commits, collaboration, and CI/CD.
├── skills/git-workflow/
│ ├── SKILL.md # Skill metadata and core patterns
│ ├── checkpoints.yaml # Skill checkpoints
│ ├── evals/ # Skill evaluations
│ ├── references/ # Detailed reference docs (see below)
│ └── scripts/
│ ├── verify-git-workflow.sh # Git workflow verification
│ └── spec-cleanup-guard.sh # Read-only gate for intermediate planning artifacts
├── .spec-cleanup.yml.example # Template config for the spec-cleanup guard
├── Build/
│ ├── Scripts/ # Build/validation scripts
│ └── hooks/ # Git hook templates (pre-commit, pre-push)
├── hooks/
│ └── hooks.json # Hook configuration
├── scripts/
│ ├── verify-harness.sh # Harness consistency checker
│ └── validate_git_command.py # Git command validator
├── .github/workflows/ # CI workflows (lint, release, auto-merge)
├── docs/ # Architecture and planning docs
├── composer.json # Composer package manifest
└── README.md
The spec-cleanup capability (references/spec-cleanup.md) distinguishes two
classes of doc folder. The machine-readable source of truth is
.spec-cleanup.yml (here, .spec-cleanup.yml.example — this repo ships no
active config, so the guard is not wired into its own gate; run manually with the
baked-in defaults it does flag the dogfooded design spec, by design).
- Persisted / durable — keep in the base branch:
docs/adr/,docs/PRD.md,Documentation/, plus this repo'sdocs/architecture/planning notes. - Intermediate / working — must never reach the base branch:
docs/superpowers/,claudedocs/,docs/working/, ad-hoc*.plan.md.
Three surfaces, three different moments. Putting something on the wrong one is why a capability that exists still does not get used.
| Surface | When it enters context | Budget |
|---|---|---|
description in the frontmatter |
always, in the skill listing | combined description text truncated at 1536 characters; the listing itself is capped at ~1% of the context window |
SKILL.md body |
when the skill is invoked | published guidance is under 500 lines; the gate here enforces 500 words over the whole file (see below) |
references/*.md |
when the model chooses to read one | none, they cost nothing until read |
What follows from that:
- A missing capability in the
descriptionis the only true skip. The model never invokes the skill, so nothing further is consulted. Put the key use case first: when many skills are installed the listing overflows its budget and descriptions get shortened or dropped, starting with the least-used skills. - A missing capability in the body is a blind spot, not a skip. The skill runs, and the model does not know the thing exists.
- Scripts belong in the body. They are executed, never loaded, so listing one costs a line and buys the only chance the model has of knowing it is there.
The validate-skill pre-commit hook comes from netresearch/skill-repo-skill,
and it counts 500 words over the whole file, frontmatter included. The
published guidance is "Keep SKILL.md under 500 lines". Words are a much
tighter budget than lines, and charging the frontmatter to it means the
description -- the one surface that decides whether the skill is used at all
-- competes with the instructions for the same allowance.
The practical consequence is visible in this repository's history: it sat at
499 of 500 and left a script out of SKILL.md rather than spend fourteen words
on it. Note also that Build/Scripts/validate-skill.sh here is a COPY that
nothing runs -- editing it changes no gate.
Until the upstream check is corrected, budget in words and count the frontmatter. When the body is tight, move detail into an existing reference and keep the capability: a reader who cannot see that a script exists will not run it.
The documented shape is flat: SKILL.md is the overview and navigation, with
supporting files beside it, and each one referenced "so Claude knows what each
file contains and when to load it". The Reference Files table in SKILL.md
is that mechanism -- the Content Triggers column is not decoration, it is what
lets the model decide to read a file it cannot see.
So do not nest a second hop. SKILL.md -> references.md -> topic.md puts
the third file behind a door with no sign on it: nothing states what it holds or
when it matters, so the model has to open the middle file on speculation and
then guess again. Split by topic at the FIRST level instead -- topic-a.md and
topic-b.md both listed in the table, each with its own trigger.
The body stays short because detail moves into references, never because facts get dropped. If the body is at its limit, that is a signal to move a section into a reference and add a row to the table -- not to leave a capability undocumented.
No build system scripts defined in composer.json. Basic operations:
bash skills/git-workflow/scripts/verify-git-workflow.sh-- verify git workflow setupbash scripts/verify-harness.sh --status-- check harness maturity levelpython3 scripts/validate_git_command.py-- validate git commands
- Use Conventional Commits format:
<type>[scope]: <description> - Types:
feat,fix,docs,style,refactor,perf,test,build,ci,chore,revert - Breaking changes: append
!after type or addBREAKING CHANGE:footer - Prefer atomic commits (one logical change per commit)
- Use signed commits (
-S --signoff) - PR merges require: resolved threads, passing CI, rebased branch
- Load reference files based on content triggers (see SKILL.md)
- SKILL.md -- core skill definition and triggers
- Commit Conventions
- Pull Request Workflow
- CI/CD Integration
- Advanced Git
- GitHub Releases
- Code Quality Tools
- Architecture