# Starting a New Change

The jj workflow is: **describe first, then code, then refine**. The working copy is always a commit (`@`), so you're already in one when you start. The question is whether to reuse it or start fresh.

## The opening sequence

```bash
# 1. Check what @ currently looks like
jj st
```

**If `@` is empty** (no changes, no description set, or description is fine to discard):

- Reuse it. Just describe and start.

**If `@` has changes you want to keep** (it's someone else's WIP, or work you haven't finished):

- Start fresh with `jj new` — this creates a new empty commit on top of `@`.

```bash
# 2. Describe before coding (only with -m; never editor-based)
jj desc -m "feat: Add user authentication to login endpoint"

# 3. Make changes — they snapshot to @ automatically on the next jj command
#    (no `jj add`, no `jj commit` needed)

# 4. Verify
jj st
```

## Why describe first

Setting the message up front:

- Forces you to articulate the change as one logical unit before writing code (atomic commits)
- Means there's never a phase where `@` says "(no description set)"
- Makes the change navigable in `jj log` while it's still being built

See `references/COMMIT_MSG.md` for the message format conventions.

## After the change is done

**Do NOT run `jj new` to "close" the change.** In jj, the working copy is always a commit — there's no separate commit step. Leave `@` as-is; the *next* task's step 1 (`jj st` → reuse or `jj new`) handles transition.

If refinement is needed (split, squash, absorb, abandon), see `references/REFINE_COMMIT.md`.

## Anti-patterns

- ❌ `jj commit` — doesn't exist; the working copy is already a commit
- ❌ `jj desc` without `-m` — opens an editor; will hang in non-interactive agent environments
- ❌ Running `jj new` at the end of a task — leaves an empty `@` for the next agent to clean up
- ❌ Starting code before describing — you'll forget to describe, or describe vaguely after the fact
