status-workflow

Performs GitHub Projects v2 status transitions for issue workflow. Use when you need to "move issue to status", "transition status", "update project status", "set status field", or "change issue state". Handles status field mutations, GraphQL verification, and comment attribution. Works with cached board-scanner environment variables.

8 stars

Best use case

status-workflow is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Performs GitHub Projects v2 status transitions for issue workflow. Use when you need to "move issue to status", "transition status", "update project status", "set status field", or "change issue state". Handles status field mutations, GraphQL verification, and comment attribution. Works with cached board-scanner environment variables.

Teams using status-workflow should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/status-workflow/SKILL.md --create-dirs "https://raw.githubusercontent.com/botminter/botminter/main/.agents/planning/2026-03-22-console-web-ui/fixture-gen/fixtures/team-repo/coding-agent/skills/status-workflow/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/status-workflow/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How status-workflow Compares

Feature / Agentstatus-workflowStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Performs GitHub Projects v2 status transitions for issue workflow. Use when you need to "move issue to status", "transition status", "update project status", "set status field", or "change issue state". Handles status field mutations, GraphQL verification, and comment attribution. Works with cached board-scanner environment variables.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Status Workflow

Performs status transitions on GitHub Projects v2 items. This skill covers the mutation side of status management — updating the Status field on project items, verifying the update via GraphQL, and posting attribution comments.

## Prerequisites

Status transitions require these environment variables, typically set by the board-scanner skill during board scanning:

| Variable | Source | Contains |
|----------|--------|----------|
| `OWNER` | Board scanner | GitHub org/user owning the project |
| `PROJECT_NUM` | Board scanner | Project number |
| `PROJECT_ID` | Board scanner | Project node ID (for GraphQL) |
| `STATUS_FIELD_ID` | Board scanner | Status field node ID |
| `FIELD_DATA` | Board scanner | Cached field list JSON |
| `TEAM_REPO` | Board scanner | `owner/repo` for the team repo |

If these variables are not available, resolve them manually:

```bash
TEAM_REPO=$(cd team && git remote get-url origin | sed 's|.*github.com[:/]||;s|\.git$||')
OWNER=$(echo "$TEAM_REPO" | cut -d/ -f1)
PROJECT_NUM=$(gh project list --owner "$OWNER" --format json | jq -r '.projects[0].number')
PROJECT_ID=$(gh project view "$PROJECT_NUM" --owner "$OWNER" --format json | jq -r '.id')
FIELD_DATA=$(gh project field-list "$PROJECT_NUM" --owner "$OWNER" --format json)
STATUS_FIELD_ID=$(echo "$FIELD_DATA" | jq -r '.fields[] | select(.name=="Status") | .id')
```

## Performing a Status Transition

### Step 1: Resolve IDs

```bash
# Get the project item ID for the issue
ITEM_ID=$(gh project item-list "$PROJECT_NUM" --owner "$OWNER" --format json \
  --jq ".items[] | select(.content.number == $ISSUE_NUM) | .id")

# Get the option ID for the target status
OPTION_ID=$(echo "$FIELD_DATA" | jq -r \
  '.fields[] | select(.name=="Status") | .options[] | select(.name=="'"$TARGET_STATUS"'") | .id')
```

### Step 2: Validate

```bash
# Ensure item exists in project
if [ -z "$ITEM_ID" ] || [ "$ITEM_ID" = "null" ]; then
  # Auto-add issue to project
  gh project item-add "$PROJECT_NUM" --owner "$OWNER" \
    --url "https://github.com/$TEAM_REPO/issues/$ISSUE_NUM"
  sleep 2
  ITEM_ID=$(gh project item-list "$PROJECT_NUM" --owner "$OWNER" --format json \
    --jq ".items[] | select(.content.number == $ISSUE_NUM) | .id")
fi

# Ensure target status is valid
if [ -z "$OPTION_ID" ] || [ "$OPTION_ID" = "null" ]; then
  echo "Status '$TARGET_STATUS' not found. Available:"
  echo "$FIELD_DATA" | jq -r '.fields[] | select(.name=="Status") | .options[] | .name'
fi
```

### Step 3: Update Status

```bash
gh project item-edit \
  --project-id "$PROJECT_ID" \
  --id "$ITEM_ID" \
  --field-id "$STATUS_FIELD_ID" \
  --single-select-option-id "$OPTION_ID"
```

### Step 4: Verify (Recommended)

Use the GraphQL verification query to confirm the status actually changed. The `gh project item-edit` command may return success even when the status did not change (permissions issues, transient API errors).

```bash
sleep 1
CURRENT_STATUS=$(gh api graphql -f query='
query($projectId: ID!, $itemId: ID!) {
  node(id: $projectId) {
    ... on ProjectV2 {
      items(first: 100) {
        nodes {
          id
          fieldValueByName(name: "Status") {
            ... on ProjectV2ItemFieldSingleSelectValue {
              name
            }
          }
        }
      }
    }
  }
}' -F projectId="$PROJECT_ID" -F itemId="$ITEM_ID" \
  | jq -r ".data.node.items.nodes[] | select(.id == \"$ITEM_ID\") | .fieldValueByName.name")

if [ "$CURRENT_STATUS" != "$TARGET_STATUS" ]; then
  echo "Verification failed: expected '$TARGET_STATUS', got '$CURRENT_STATUS'"
fi
```

**Critical:** Use `-F` (uppercase) for GraphQL ID type variables, not `-f` (lowercase). See [GraphQL Mutations Reference](references/graphql-mutations.md).

### Step 5: Post Attribution Comment

```bash
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
gh issue comment "$ISSUE_NUM" --repo "$TEAM_REPO" \
  --body "### $EMOJI $ROLE — $TIMESTAMP

Status: $FROM_STATUS -> $TARGET_STATUS"
```

Where `ROLE` and `EMOJI` come from `.botminter.yml` in the workspace root.

## Quick Reference

Minimal transition (when board-scanner variables are available):

```bash
ITEM_ID=$(gh project item-list "$PROJECT_NUM" --owner "$OWNER" --format json \
  --jq ".items[] | select(.content.number == $ISSUE_NUM) | .id")
OPTION_ID=$(echo "$FIELD_DATA" | jq -r \
  '.fields[] | select(.name=="Status") | .options[] | select(.name=="'"$TARGET_STATUS"'") | .id')
gh project item-edit --project-id "$PROJECT_ID" --id "$ITEM_ID" \
  --field-id "$STATUS_FIELD_ID" --single-select-option-id "$OPTION_ID"
```

## Label Operations

Some workflow transitions also require label changes:

### Adding a Label

```bash
gh issue edit "$ISSUE_NUM" --repo "$TEAM_REPO" --add-label "label-name"
```

### Removing a Label

```bash
gh issue edit "$ISSUE_NUM" --repo "$TEAM_REPO" --remove-label "label-name"
```

### Common Label Patterns

| Operation | Labels |
|-----------|--------|
| Classify issue | `kind/epic`, `kind/story` |
| Link story to parent | `parent/<number>` |
| Assign to role | `role/<role-name>` |

## References

- **[GraphQL Mutations](references/graphql-mutations.md)** — Verification queries, variable type handling, mutation templates

Related Skills

workspace-sync

8
from botminter/botminter

Sync and diagnose BotMinter workspaces. Use when the operator says "sync workspaces", "apply profile changes", "propagate changes", "update all workspaces", "check workspace health", "diff against profile", "full sync", "my workspace has old files", or "why is the workspace out of date". Do NOT use for member behavior/config tuning (use member-tuning) or structured process changes (use process-evolution).

team-design

8
from botminter/botminter

Entry point for all day-2 team design operations. Routes operator intent to the appropriate sub-skill — retrospective, role-management, member-tuning, or process-evolution — and provides a unified dashboard of team design state. Use when asked to "design the team", "show me the team", "team overview", "what's our team setup", "let's evolve the team", "team health check", or when the operator's intent spans multiple team design areas.

role-management

8
from botminter/botminter

Manages team role composition — list, add, remove, and inspect roles defined in botminter.yml. Includes impact analysis of statuses, hats, and knowledge before changes, and records every change as a team agreement decision. Use when asked to "add a role", "remove a role", "list roles", "inspect a role", "change team composition", "what roles do we have", "team structure", or when an cos:exec:todo issue requests a role change.

retrospective

8
from botminter/botminter

Guides a structured team retrospective examining what went well, what didn't, and produces typed action items. Outputs a retro summary to agreements/retros/. Use when asked to "run a retro", "do a retrospective", "reflect on the sprint", "what went well", "review team performance", or when an cos:exec:todo issue requests a retrospective.

process-evolution

8
from botminter/botminter

Guides deliberate, team-wide process changes — adding or removing statuses, modifying transitions, updating review gates, and evolving the workflow lifecycle. Validates changes against the status graph before applying and records every decision as a team agreement. Use when asked to "change the process", "add a status", "remove a status", "modify the workflow", "update transitions", "add a review gate", "evolve the process", "change auto-advance rules", or when an cos:exec:todo issue requests a process change.

member-tuning

8
from botminter/botminter

Diagnoses and tunes individual member configurations by mapping symptoms to the responsible artifact — PROMPT.md, CLAUDE.md, ralph.yml (hats), skills, or PROCESS.md. Provides a diagnostic decision tree, inspection commands, example edits, and propagation steps for each artifact type. Use when asked to "tune a member", "fix a member", "troubleshoot a member", "member isn't working", "adjust member behavior", "member diagnostic", "why is the member doing X", or when an cos:exec:todo issue requests member tuning.

cos-session

8
from botminter/botminter

Chief of Staff working session with the operator. Use when the operator says "chief of staff session", "cos session", "I have things to file", "let's work through some items", "I found some problems", "what's <member> doing", "let's go over the board", or brings any mix of observations, bugs, ideas, or operational concerns.

github-project

8
from botminter/botminter

Manages GitHub Projects v2 workflows for issue tracking and project management. Use when user asks to "show the board", "view issues", "what's in [status]", "create an epic", "add a story", "create a bug", "move issue

workspace-doctor

8
from botminter/botminter

Diagnoses common BotMinter workspace issues — stale submodules, broken symlinks, missing files, outdated context, and sync problems. Use when the operator asks to "check my workspace", "diagnose issues", "why isn't X working", "fix my setup", "workspace health", or "something seems wrong".

team-overview

8
from botminter/botminter

Shows registered BotMinter teams, their members, roles, workspaces, and running state. Use when the operator asks to "show teams", "list teams", "who is on the team", "team status", "show members", or "what teams do I have". Reads ~/.botminter/config.yml and workspace directories.

profile-design

8
from botminter/botminter

Designs and troubleshoots BotMinter profiles — team methodology templates that define roles, statuses, hats, skills, and process conventions. Use when the operator asks to "design a profile", "create a new role", "fork a profile", "fix my profile", "troubleshoot profile issues", "design a process workflow", "add a hat", "customize a profile", or "validate my profile". Operates on profile templates, not live team repos.

profile-browser

8
from botminter/botminter

Browses and describes BotMinter profiles — team methodology templates that define roles, statuses, coding agents, and process conventions. Use when the operator asks to "list profiles", "show profiles", "what profiles are available", "describe a profile", "what roles does X have", or "compare profiles". Reads ~/.config/botminter/profiles/.