From em-software-factory
Create bug reports in Jira from screen recording videos. Extracts keyframes and audio, analyzes the UI and narration to identify the bug, confirms understanding with the user, then files a structured bug report with the video attached. Use when given a video file (.mov, .mp4, .webm) showing a bug.
How this skill is triggered — by the user, by Claude, or both
Slash command
/em-software-factory:create-bug-from-videoThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Create comprehensive bug reports in Jira by analyzing screen recording videos. Extracts visual frames and audio transcription to understand the bug, confirms with the user, then files in Jira with the video attached.
Create comprehensive bug reports in Jira by analyzing screen recording videos. Extracts visual frames and audio transcription to understand the bug, confirms with the user, then files in Jira with the video attached.
Use this skill when:
/create-bug-from-video path/to/recording.mov
/create-bug-from-video ~/Downloads/bug-demo.mp4
# Check file exists and get metadata
VIDEO_PATH="{user-provided-path}"
if [ ! -f "$VIDEO_PATH" ]; then
echo "File not found: $VIDEO_PATH"
exit 1
fi
# Get video info
ffprobe -v quiet -print_format json -show_format -show_streams "$VIDEO_PATH"
Report to user:
Video: bug-demo.mov
Duration: 1m 54s
Resolution: 2818x3044
Has audio: Yes
Choose the keyframe interval based on video duration:
mkdir -p /tmp/bug_video_frames
# Extract keyframes (adjust fps=1/N based on duration), scale down for analysis
ffmpeg -i "$VIDEO_PATH" \
-vf "fps=1/5,scale=1409:-1" \
/tmp/bug_video_frames/frame_%03d.png -y
Read each extracted frame using the Read tool to visually analyze the UI state.
Audio transcription is critical — narration often explains context that frames alone cannot convey. Try hard before falling back.
# Extract audio
ffmpeg -i "$VIDEO_PATH" -q:a 0 -map a /tmp/bug_video_audio.wav -y
Attempt 1: Run whisper CLI directly:
whisper /tmp/bug_video_audio.wav --model base --language en --output_format txt --output_dir /tmp
Attempt 2: If Attempt 1 fails (typically SSL errors downloading the model), bypass SSL verification and use the Python API:
python3 -c "
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
import whisper
model = whisper.load_model('base')
result = model.transcribe('/tmp/bug_video_audio.wav', language='en')
print(result['text'])
"
Attempt 3: If whisper is not installed at all, check for alternative transcription tools:
# Check for alternative tools
which mlx_whisper 2>/dev/null || which faster-whisper 2>/dev/null
Only after all attempts fail:
If transcription succeeds:
From the keyframes (and transcription if available), identify:
Use the video filename as an additional hint — it often describes the bug (e.g., chat_bug_severity_policy_knowledge_retrieval.mov).
Present your analysis and ask the user to confirm or correct:
From the video, here's what I see:
**Product/Area:** [identified area]
**What happens:** [description of the bug observed]
**Expected behavior:** [what should have happened]
Does this capture the bug correctly?
Options:
Iterate until the user confirms the bug description is accurate.
Ask the user for any details not visible in the video:
A few more details:
1. Priority? [High / Medium / Low]
2. Did this work before? [Y/n/unknown]
3. Any additional context not shown in the video?
Gather automatically (no user input):
VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "untagged")
COMMIT=$(git rev-parse --short HEAD)
BRANCH=$(git branch --show-current)
REPORTER_NAME=$(git config user.name)
REPORTER_EMAIL=$(git config user.email)
OS=$(uname -s)
DATE=$(date +"%Y-%m-%d")
Invoke mcp__atlassian__jira_get_project_components with project_key: "SEMI"
Ask user to select components from the available list.
Show the complete bug report for review before filing:
═══════════════════════════════════════════════════
PREVIEW: Bug Report for Jira (from video analysis)
═══════════════════════════════════════════════════
Project: SEMI
Priority: {priority}
Components: {components}
Labels: bug, needs-triage
────────────────────────────────────────────────────
Bug: {summary}
────────────────────────────────────────────────────
## Expected Behavior
{expected}
## Actual Behavior
{actual}
## Steps to Reproduce
{steps from video analysis}
## Environment
- Version / Commit / Branch / OS / Reporter / Date
## Video Evidence
{video filename} ({file size})
Will be uploaded automatically after issue creation.
────────────────────────────────────────────────────
Create this bug in Jira? [Y/n/e]
Create the issue:
Invoke mcp__atlassian__jira_create_issue with:
project_key: "SEMI"
summary: "{bug summary}"
issue_type: "Bug"
description: {full bug report markdown}
components: "{selected components}"
additional_fields: {"labels": ["bug", "needs-triage"]}
Upload the video as attachment:
Invoke mcp__atlassian__jira_update_issue with:
issue_key: "{created issue key}"
fields: {}
attachments: "{video file path}"
Bug created and video attached!
**Issue:** SEMI-1234
**URL:** https://emergenceai.atlassian.net/browse/SEMI-1234
**Priority:** High
**Components:** Frontend, Backend
**Video:** bug-demo.mov (attached)
Remove temporary files after completion:
rm -rf /tmp/bug_video_frames /tmp/bug_video_audio.wav /tmp/bug_video_audio.txt
brew install ffmpeg)# Create bug from video
/create-bug-from-video ~/Downloads/bug.mov → SEMI-1234 created
# Investigate the code
/research-codebase "How does {feature} work?"
# Create fix plan
/create-plan SEMI-1234
# Implement fix
/implement-plan SEMI-1234
npx claudepluginhub emergenceai/em-aisoftwarefactoryGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.