Files
settled-reach/.claude/skills/git-commit/SKILL.md
T
jpmschweitzerandClaude Opus 5 338644b409 refactor(tooling): T-1286 — generate, pr and dev become reach domains
Twelve scripts retired, three domains registered. `reach` now covers nine.

generate: `generate-brands` and `generate-corporations` were the second and
third copies of the same 24-line build-if-missing-then-exec bash `tooling/atlas`
carried, so they collapsed into `core.process.cargo_binary` rather than being
ported. `import_economics` shelled out to the first of those, so it now calls
that helper — `generated_brands.toml` comes back byte-identical, and the stamp
registry swaps the retired wrapper for `core/process.py`.

pr: `watchlist-diff` derives its watched set from `generator_sources.py` instead
of restating it, so it cannot drift from the stamp check.

dev: the environment scripts split decision from performing, per D-263's
guarded-exec rule. `godot_plan()` and `worktree_plan()` decide what would
happen; `install_godot()`, `install_rust()` and `setup_worktree()` do it.
`tooling/test_environment.py` pins the version pin, both override precedences,
the already-current skip, the platform refusal and both worktree refusals —
none of them performed. `make setup` now installs reach first, since the
targets that install rust and godot are reach verbs.

Two live bugs found while porting:

- The clerk read its decision index from `decisions/README.md`, a path that
  stopped existing when the DQR tree moved to `governance/`. Every clerk agent
  has been grepping blind; its prompt pointed at the same dead directory.
- The conformance exec-check matched any `x.system()` regardless of receiver,
  so `platform.system()` read as `os.system()`. Narrowed and re-proved against
  a real mutant.

`process.run` gains `input=`, `timeout=` and a `ProcessTimeout` subclass so a
killed run stays distinguishable from a verdict. The pre-push hook no longer
merges the clerk's stderr into its stdout — under streaming the last merged
line is a JSONL event, which would read as an unrecognised verdict and block.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 17:00:46 +02:00

180 lines
6.1 KiB
Markdown

---
name: git-commit
description: >
Commit changes with clean, structured messages. Use when the user says
"commit", "save my work", "commit changes", or invokes /git-commit. Enforces
conventional commit format, groups changes into logical commits, and maintains
CHANGELOG.md. Never squash unrelated changes into one commit.
user-invocable: true
allowed-tools: Bash, Read, Grep, Glob, Write, Edit
---
# Commit Skill
## Workflow
1. Run `git status` and `git diff --stat` to assess all pending changes.
2. **Triage: session vs pre-existing.** Separate changes you made in this
session from changes that were already dirty when the session started.
Check the conversation history — if you didn't touch a file, it's
pre-existing. After grouping your own commits, surface any remaining
modified or untracked files to the user:
> These files are also modified/untracked but weren't part of this
> session's work:
> - `path/to/file` — <brief description of the diff>
> - `path/to/other` — <untracked, N files>
>
> Should any of these be included in a commit?
Wait for the user's answer before staging them. Never silently skip
or silently include pre-existing changes.
3. Group changes into **logical commits** — each commit should represent one
coherent change. Common groupings:
- A bug fix (all files touched to fix one issue)
- A new feature or system (e.g., new trait files + localization + events)
- Refactoring / cleanup (encoding fixes, comment fixes, renaming)
- Config / meta changes (CLAUDE.md, .claude/ skills, mod descriptor)
- Data corrections (province remapping, missing fields)
4. For each logical group, stage only the relevant files and commit with a
properly formatted message.
5. After all commits, update CHANGELOG.md.
## Commit Message Format
```
<type>(<scope>): <short summary>
<optional body — what and why, not how>
Co-Authored-By: Claude <noreply@anthropic.com>
```
The trailer is intentionally **unpinned** — do not write a model version into the
example. The model-identifier variant the Claude Code harness appends automatically
(e.g. `Co-Authored-By: Claude Opus <version> <noreply@anthropic.com>`) is equally
valid; leave it as the harness emits it. Pinned version numbers are the root cause of
attribution drift (this line read `Claude Opus 4.6` for months after the model moved on).
### Types
| Type | Use for |
|------|---------|
| `feat` | New game system, mechanic, or feature |
| `fix` | Bug fix — crashes, logic errors, broken references |
| `refactor` | Code restructuring without behavior change |
| `chore` | Build, config, tooling, skills, CLAUDE.md, infrastructure |
| `docs` | Documentation, design docs, discussion logs, briefings |
| `data` | Game data changes — entity definitions, map templates, balance values |
| `loc` | Localization additions or corrections |
### Scope
Use the project subsystem as scope. Examples:
- `agents` — agent personality files (.claude/agents/)
- `skills` — skill definitions (.claude/skills/)
- `docs` — design documents, architecture docs
- `briefings` — agent briefing files (docs/briefings/)
- `discussions` — discussion round archives
- `schema` — database schema changes
- `db` — database operations, connector scripts
- `config` — project configuration, endpoints
- `simulation` — game simulation server-side code
- `client` — game client code, rendering
- `engine` — engine-level systems (ECS, chunk loading, etc.)
- `ui` — user interface, HUD, insert/minimap
- `audio` — sound system, audio propagation
- `assets` — visual assets, sprites, art
- `meta` — project config, CLAUDE.md, team roster
### Rules
- Summary line: imperative mood, lowercase, no period, max 72 chars.
- Body: wrap at 72 chars. Explain *why* the change was made.
- Never combine unrelated changes (e.g., don't mix a crash fix with new features).
- When in doubt, prefer more smaller commits over fewer large ones.
### Clerk safety valve (`Clerk-Skip:` trailer)
The pre-push clerk reviews each commit for D-record consistency. For a pure bulk
content commit — e.g. shipping thousands of generated planetary description files
— that review is moot and just burns agents on noise. Add a `Clerk-Skip:` **trailer
line** to the commit message and `reach dev clerk` auto-approves that commit
without spawning an agent. Use it only for content/data dumps, never for commits
that touch `governance/`, code, or ticket-bearing work.
It must be a trailer (a line starting with `Clerk-Skip:`), not inline prose — that
way a commit that merely *mentions* the token in its subject or body isn't skipped.
```
data(content): generate 5000 planetary description files
Clerk-Skip: bulk generated content, no D-record surface
```
### Examples
```
feat(simulation): add LOS shadowcasting for vision cone
Implements 2D shadowcasting per z-level with forward/peripheral/
blind spot zones per D-011 and D-015 specifications.
```
```
docs(discussions): archive round 13 engine selection debate
Split completed round from DISCUSSION.md into per-round archive.
Updated briefings for Tyre and Troblum with new requirements.
```
```
chore(agents): add Stig UI developer agent
Standby agent for UI implementation phase. Configured with
briefing reference and Settled Reach-themed personality.
```
## CHANGELOG.md Format
Maintain `CHANGELOG.md` in the project root. Use Keep a Changelog format:
```markdown
# Changelog
## [Unreleased]
### Added
- New feature descriptions
### Fixed
- Bug fix descriptions
### Changed
- Change descriptions
```
Group entries under: Added, Fixed, Changed, Removed. Write entries from the
player/modder perspective, not implementation details.
After committing, read the existing CHANGELOG.md (create if missing), prepend
new entries under `[Unreleased]`, and commit the changelog update separately as:
```
chore(meta): update changelog
```
## Version Tracking
Version is tracked in CHANGELOG.md. When the user bumps the version,
move `[Unreleased]` entries under a new version heading and commit as:
```
chore(meta): release v0.1.0
```
## Staging Rules
See `.claude/rules/git-safety.md` for staging rules (always-loaded).
These apply to ALL git operations, not just this skill.