| name | debugging-workflows |
| description | Guide for debugging GitHub Agentic Workflows - analyzing logs, auditing runs, and troubleshooting issues |
Debugging GitHub Agentic Workflows
This skill provides comprehensive guidance for debugging GitHub Agentic Workflows, including scripts to download and analyze workflow logs, audit specific runs, and understand how agentic workflows operate.
Table of Contents
Quick Start
Download Logs from Recent Runs
gh aw logs --start-date -1d -o /tmp/workflow-logs
gh aw logs weekly-research --start-date -1d
gh aw logs --json
Audit a Specific Run
gh aw audit 1234567890
gh aw audit https://github.com/owner/repo/actions/runs/1234567890
gh aw audit 1234567890 --json
Downloading Workflow Logs
The gh aw logs command downloads workflow run artifacts and logs from GitHub Actions for analysis.
Basic Usage
gh aw logs
gh aw logs <workflow-name>
gh aw logs -o ./my-logs
Filter Options
gh aw logs --start-date 2024-01-01 --end-date 2024-01-31
gh aw logs --start-date -1w
gh aw logs --start-date -1mo
gh aw logs --engine copilot
gh aw logs --engine claude
gh aw logs --engine codex
gh aw logs -c 5
gh aw logs --ref main
gh aw logs --ref feature-xyz
gh aw logs --after-run-id 1000 --before-run-id 2000
gh aw logs --firewall
gh aw logs --no-firewall
Output Options
gh aw logs --json
gh aw logs --parse
gh aw logs --tool-graph
gh aw logs --timeout 300
Downloaded Artifacts
When you run gh aw logs, the following artifacts are downloaded for each run:
| File | Description |
|---|
aw_info.json | Engine configuration and workflow metadata |
safe_output.jsonl | Agent's final output content (when non-empty) |
agent_output/ | Agent logs directory |
agent-stdio.log | Agent standard output/error logs |
aw.patch | Git patch of changes made during execution |
workflow-logs/ | GitHub Actions job logs (organized by job) |
summary.json | Complete metrics and run data for all runs |
Example: Analyze Recent Failures
gh aw logs --start-date -1w -o /tmp/debug-logs
cat /tmp/debug-logs/summary.json | jq '.runs[] | select(.conclusion == "failure")'
Auditing Specific Runs
The gh aw audit command investigates a single workflow run in detail, downloading artifacts, detecting errors, and generating a report.
Basic Usage
gh aw audit 1234567890
gh aw audit https://github.com/owner/repo/actions/runs/1234567890
gh aw audit https://github.com/owner/repo/actions/runs/1234567890/job/9876543210
gh aw audit https://github.com/owner/repo/actions/runs/1234567890/job/9876543210#step:7:1
Output Options
gh aw audit 1234567890 --json
gh aw audit 1234567890 -o ./audit-reports
gh aw audit 1234567890 --parse
gh aw audit 1234567890 -v
Audit Report Contents
The audit command provides:
- Error Detection: Errors and warnings from workflow logs
- MCP Tool Usage: Statistics on tool calls by the AI agent
- Missing Tools: Tools the agent tried to use but weren't available
- Execution Metrics: Duration, token usage, and cost information
- Safe Output Analysis: What GitHub operations were attempted
Example: Investigate a Failed Run
gh aw audit 1234567890 --json > audit.json
cat audit.json | jq '{
status: .status,
conclusion: .conclusion,
errors: .errors,
missing_tools: .missing_tools,
tool_usage: .tool_usage
}'
How Agentic Workflows Work
Understanding the workflow architecture helps in debugging.
Workflow Structure
Agentic workflows use a markdown + YAML frontmatter format:
---
on:
issues:
types: [opened]
permissions:
issues: write
timeout-minutes: 10
engine: copilot
tools:
github:
mode: remote
toolsets: [default]
safe-outputs:
create-issue:
labels: [ai-generated]
---
# Workflow Title
Natural language instructions for the AI agent.
Use GitHub context like ${{ github.event.issue.number }}.
Execution Flow
1. Trigger Event (issue opened, PR created, schedule, etc.)
↓
2. Activation Job
- Validates permissions
- Processes safe-inputs
- Sanitizes context
↓
3. AI Agent Job
- Loads MCP servers and tools
- Executes AI agent with prompt
- Agent makes tool calls
- Agent produces output
↓
4. Safe Outputs Job
- Processes agent output
- Creates GitHub resources (issues, PRs, etc.)
- Applies labels, comments
↓
5. Completion
- Workflow summary generated
- Artifacts uploaded
Key Components
| Component | Purpose | Configuration |
|---|
| Engine | AI model to use | engine: copilot, claude, codex |
| Tools | APIs available to agent | tools: section with MCP servers |
| Safe-Inputs | Context passed to agent | safe-inputs: with GitHub expressions |
| Safe-Outputs | Resources agent can create | safe-outputs: with allowed operations |
| Permissions | GitHub token permissions | permissions: block |
| Network | Allowed network access | network: with domain/ecosystem lists |
Compilation Process
gh aw compile <workflow-name>
The .lock.yml file is the actual GitHub Actions workflow that runs.
Common Issues and Solutions
Missing Tool Errors
Symptoms:
- Error: "Tool 'github:read_issue' not found"
- Agent cannot access GitHub APIs
Solution: Add GitHub MCP server configuration:
tools:
github:
mode: remote
toolsets: [default]
Permission Errors
Symptoms:
- HTTP 403 (Forbidden) errors
- "Resource not accessible" errors
Solution: Add required permissions:
permissions:
contents: read
issues: write
pull-requests: write
Safe-Input Errors
Symptoms:
- "missing tool configuration for safeinputs-gh"
- Environment variable not available
Solution: Configure safe-inputs:
safe-inputs:
issue:
title: ${{ github.event.issue.title }}
body: ${{ github.event.issue.body }}
Safe-Output Errors
Symptoms:
- Agent tries to create resources but fails
- "Safe output not enabled" errors
Solution: Enable safe-outputs:
safe-outputs:
staged: false
create-issue:
labels: [ai-generated]
Network Access Errors
Symptoms:
- Firewall denials
- URLs appearing as "(redacted)"
Solution: Configure network access:
network:
allowed:
- defaults
- python
- node
- "api.example.com"
Timeout Errors
Symptoms:
- Workflow exceeds time limit
- Agent loops or hangs
Solution: Increase timeout or optimize prompt:
timeout-minutes: 30
Advanced Debugging Techniques
Polling In-Progress Runs
When a run is still executing:
while true; do
output=$(gh aw audit <run-id> --json 2>&1)
if echo "$output" | grep -q '"status":.*"\(completed\|failure\|cancelled\)"'; then
echo "$output"
break
fi
echo "⏳ Run still in progress. Waiting 45 seconds..."
sleep 45
done
Inspecting MCP Configuration
gh aw mcp inspect <workflow-name>
gh aw mcp list
Checking Workflow Status
gh aw status
Downloading Specific Artifacts
GH_REPO=owner/repo gh run download <run-id> -n agent-stdio.log
Inspecting Job Logs
gh run view <run-id>
gh run view --job <job-id> --log
Analyzing Firewall Logs
gh aw logs --parse
gh aw logs --firewall
Debug Mode Compilation
gh aw compile --verbose
gh aw compile --strict
gh aw compile --actionlint --zizmor --poutine
Reference Commands
Log Analysis Commands
| Command | Description |
|---|
gh aw logs | Download logs for all workflows |
gh aw logs <workflow> | Download logs for specific workflow |
gh aw logs --json | Output as JSON |
gh aw logs --start-date -1d | Filter by date |
gh aw logs --engine copilot | Filter by engine |
gh aw logs --parse | Generate Markdown reports |
Audit Commands
| Command | Description |
|---|
gh aw audit <run-id> | Audit specific run |
gh aw audit <url> | Audit from GitHub URL |
gh aw audit <run-id> --json | Output as JSON |
gh aw audit <run-id> --parse | Parse logs to Markdown |
MCP Commands
| Command | Description |
|---|
gh aw mcp list | List workflows with MCP servers |
gh aw mcp inspect <workflow> | Inspect MCP configuration |
Status Commands
| Command | Description |
|---|
gh aw status | Show all workflow status |
gh aw compile | Compile all workflows |
gh aw compile <workflow> | Compile specific workflow |
gh aw compile --strict | Compile with security checks |
Workflow Execution Commands
| Command | Description |
|---|
gh aw run <workflow> | Trigger workflow manually |
gh workflow run <name>.lock.yml | Alternative trigger method |
gh run watch <run-id> | Monitor running workflow |
Additional Resources