# Campaign Commit

> Choose the correct commit command in a camp, also called a campaign. Use when you are about to commit and need to select `camp commit`, `camp p commit`, `fest commit`, or intentional root pointer sync via `camp refs-sync`.

- Skill: `obedience-corp/campaign-commit` (Agent Skill)
- Install (CLI): `npx skillmds@latest add obedience-corp/campaign-commit`
- Raw SKILL.md: https://api.skillmd.com/api/skills/obedience-corp/campaign-commit/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- License: Apache-2.0
- Author: Obedience-Corp (https://skillmd.com/u/obedience-corp)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/obedience-corp/campaign-commit

---


# Camp Commit Decision

A camp was previously called a campaign; this skill applies whichever word the user uses.

## Decision

- Project change (submodule, linked project, or worktree): `camp p commit -m "msg"`
- Festival task execution: `fest commit -m "msg"`
- Camp root files: `camp commit -m "msg"` (stages all root-level changes; submodule refs excluded by default)
- Camp root, scoped to specific paths: `git add <paths>` then `camp commit --all=false -m "msg"` (commits only what is staged)
- Intentional root pointer sync: `camp refs-sync [submodule...]`

## Festival Commits Cover the Linked Project

When a festival or sequence has a linked project, `fest commit` makes up to two
commits even when you run it from inside the festival:

- a project commit staging the project's changes, skipped when the project is
  clean
- a camp root commit staging only festival-scoped files, the camp's
  `.campaign/fest/` state, and the submodule pointer

So during festival execution do not run `camp p commit` first and `fest commit`
after. One `fest commit` covers both sides. Use `--no-root` to skip the camp
root commit.

A festival with no linked project makes the single camp root commit only.

## Deferred Commit Queue

Camp defers its own bookkeeping commits so they do not hold the terminal. The
queue is machine-local and disposable; git is the record.

```bash
camp jobs                       # what is queued, running, or failed
camp jobs --json                # same, for agents
camp jobs retry all             # requeue everything that failed
camp jobs drop <id>             # give up on a failed job, keeping its content
camp jobs drop --running <id>   # a stalled job, and the worker holding it
camp jobs drain                 # wait for every lane, then exit
```

Dropping a job never discards work: the content stays uncommitted in the working
tree for the next ordinary commit. If `camp jobs` reports a job as `stalled`, a
commit message writer stopped answering; `--running` is what ends that wait.

## Rules

- Never run raw `git commit` anywhere in a camp; staging with `git add` is fine.
- Keep submodule commits and root pointer sync as separate, explicit actions.
- Do not bypass hooks with `--no-verify` without clear justification.
- Do not add agent co-author trailers unless explicitly requested.

