Skip to content

Phase 2 — Execute Plan

Phase 2 reads an approved plan Excel file and applies Jira transitions concurrently. Multi-step paths (e.g., Open → In Progress → Done) are resolved automatically via BFS on the workflow graph.

Command

jira-runner \
  --project <KEY> \
  --yaml transition.yaml \
  --execute <plan.xlsx> \
  [--dry-run]
Flag Required Description
--project Yes Jira project key
--yaml Yes Path to workflow YAML
--execute Yes Plan Excel file (Phase 1 output)
--dry-run No Simulate without applying changes
# 1. Dry-run first to catch path errors
jira-runner --project PROJ --yaml transition.yaml --execute plan.xlsx --dry-run

# 2. Execute live
jira-runner --project PROJ --yaml transition.yaml --execute plan.xlsx

What Gets Executed

Only rows where approved is True, yes or 1 are processed. Other rows get status NOT_APPROVED. Rows already in their target status get SKIPPED.

Dry Run

--dry-run makes no changes in Jira. For each approved row it reads the current status, works out the route from the workflow YAML, and checks that Jira offers the first step. The execution_message column then shows the route, e.g. [DRY RUN] Would transition: Open → In Progress → Done. Later steps can only be checked against the YAML, because the issue doesn't actually move.

Output Excel (*_results.xlsx)

The results file is written next to the input file with a _results suffix. It contains all input columns plus:

Column Description
workflow_name Workflow used for the transition
execution_status SUCCESS / FAILED / SKIPPED / NOT_APPROVED
execution_message Error details when FAILED
final_status Actual Jira status after execution
executed_at ISO 8601 timestamp

Concurrency

Transitions run in parallel up to PHASE2_WORKERS (default 5, set in settings.toml). Rate-limited requests (HTTP 429) wait for Jira's Retry-After and are retried up to JIRA_RATE_LIMIT_MAX_RETRIES times. Network errors are retried up to JIRA_MAX_RETRIES times, but a transition is only re-sent if it never reached Jira. Other API errors fail the row immediately.