mcpField
B
bail

bail

github.com/camachoAgent workflows684 installs
Repository

About bail

A bail-out protocol skill for Claude coding work that records what was attempted and learned before cleanup. It guides branch and worktree handling, optional GitHub issue or PR updates, and saving learnings to `MEMORY.md`.

Key features

  1. 01Detects the current work step
  2. 02Records learnings in `.branch-context.md`
  3. 03Consolidates notes into `MEMORY.md`
  4. 04Guides issue and PR updates
  5. 05Requires confirmation before deletion

Use cases

  1. 01Document why work is being abandoned
  2. 02Preserve learnings for future sessions
  3. 03Clean up an abandoned branch or worktree

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/camacho/ai-skills --skill bail

After installing, type/bailin Claude Code to confirm it loaded.

Details

From the project README

Bail-out protocol: always reflect FIRST, then clean up. All commands use absolute paths and git -C.

Inputs

  • WORKTREE: absolute path to current worktree (or primary if no worktree)
  • Optional reason string (if not provided, ask for one)

Steps

  1. Detect current step by examining what exists:

    What existsEstimated step
    Just an issue, no branchStep 0 (Capture)
    .branch-context.md, no worktreeStep 1 (Orient)
    Worktree exists, no code changesStep 2 (Isolate)
    Plan file on branchStep 3-4 (Design/Review)
    Code changes committedStep 5-7 (Build/Verify/Archive)
    PR open on GitHubStep 8 (Ship)
  2. Prompt for reason if not provided.

  3. Write learnings to .branch-context.md in the worktree:

    # Write bail context — use absolute path
    cat >> "$WORKTREE/.branch-context.md" <<EOF
    
    ## Bail
    - Reason: <reason>
    - What was attempted: <summary>
    - What was learned: <learnings>
    EOF
    git -C "$WORKTREE" add .branch-context.md
    git -C "$WORKTREE" commit -m "docs: capture bail context"
    
  4. Consolidate learnings to MEMORY.md via disposable clone (never checkout main in a worktree):

    BAIL_DIR="${CLAUDE_SESSION_DIR:-$TMPDIR}/bail-reflect"
    [ -d "$BAIL_DIR" ] && rm -rf "$BAIL_DIR"
    git clone --depth 50 "$(git -C "$WORKTREE" remote get-url origin)" "$BAIL_DIR"
    

    Read $BAIL_DIR/ai-workspace/MEMORY.md, append relevant learnings from .branch-context.md, then:

    git -C "$BAIL_DIR" add ai-workspace/MEMORY.md
    git -C "$BAIL_DIR" commit -m "docs: consolidate learnings from abandoned <branch>
    
    Co-Authored-By: Claude <model>"
    git -C "$BAIL_DIR" push
    

    On non-fast-forward: git -C "$BAIL_DIR" pull --rebase then push. Max 3 retries. Clean up: rm -rf "$BAIL_DIR"

  5. Update GitHub Issue (if accessible):

    GH_REPO=<owner/repo> gh issue comment <number> --body "Bailing: <reason>. Learnings captured in MEMORY.md."
    GH_REPO=<owner/repo> gh issue edit <number> --add-label "deferred" --remove-label "triage"
    
  6. Close PR if open:

    PR_NUM=$(GH_REPO=<owner/repo> gh pr list --head "<branch>" --json number -q '.[0].number')
    if [ -n "$PR_NUM" ]; then
      GH_REPO=<owner/repo> gh pr close "$PR_NUM"
    fi
    
  7. Ask about branch preservation:

    Default: preserve the branch (user can resume later).

    If user explicitly says delete — confirm by showing what will be destroyed:

    This will delete:
    - Branch: <name>
    - Worktree: <path>
    - Remote branch (if pushed)
    
    Type 'delete' to confirm.
    

    Only after typed confirmation:

    PRIMARY="$(git -C "$WORKTREE" worktree list --porcelain | grep -m1 '^worktree ' | sed 's/^worktree //')"
    # Verify branch is merged before deleting (-d fails if unmerged, -D would force)
    git -C "$PRIMARY" worktree remove "$WORKTREE"
    git -C "$PRIMARY" branch -d <branch>
    

    If branch -d fails (unmerged work), warn the user and stop. Do NOT use branch -D.

  8. Done. Do not checkout main — stay in whatever CWD the session has.

Edge Cases

  • No worktree exists (bailing at Step 0-1) → skip worktree cleanup, just update issue
  • No GitHub access → skip issue update, still do local cleanup + memory consolidation
  • PR already merged → don't close, just note it in the output
  • No .branch-context.md → create one with just the bail reason before consolidating
  • CLAUDE_SESSION_DIR unset → fall back to $TMPDIR for clone

Output: Summary of what was cleaned up and where learnings were saved.

Comments

Markdown supported