
github-issues-bug-workflow
by oviney
Personal Blog
SKILL.md
name: GitHub Issues Bug Workflow description: Standard Agile process for bug reporting, triage, assignment, and resolution using GitHub Issues version: 1.2.0 triggers:
- User reports a bug
- QA finds a defect
- Production incident
- Test failure
- Need to track defect
- User asks "what should I work on next?"
- Need to query open issues
Context
This blog uses GitHub Issues (not docs/ISSUES.md) as the single source of truth for bug tracking. All defects must follow the Agile workflow: Report → Triage → Branch → Fix → PR → Review → Merge → Verify → Close.
Critical Rule: NEVER commit bug fixes directly to main. Always use feature branches and Pull Requests.
GitHub Issues URL: https://github.com/oviney/blog/issues
Step-by-Step Instructions
0. Invoking Agent from Existing GitHub Issue
When you return to dev environment and want to action a GitHub Issue:
Option 1: Tell Agent to Process Issue
User: "Process GitHub Issue #123"
User: "Fix bug #123"
User: "Work on issue #123"
Agent automatically:
- Fetches issue from https://github.com/oviney/blog/issues/123
- Reads title, description, labels, priority
- Activates correct agent persona based on labels
- Starts workflow at Step 2 (Triage) or Step 3 (Create Branch)
Option 2: Direct Agent Assignment
User: "Creative Director, fix GitHub Issue #123"
User: "QA Gatekeeper, triage issue #123"
Agent:
- Adopts specified persona
- Fetches issue details
- Continues from appropriate workflow step
Option 3: Check All Open Issues
User: "What bugs are open?"
User: "Show me P1 issues"
User: "List all agent:creative-director issues"
User: "What should we work on next?"
Agent (Flow Orchestrator activates):
- Queries GitHub Issues API
- Filters by label/priority/assignee
- Lists issues with quick summary
- Asks which to work on
Example:
gh issue list --repo oviney/blog --state open --label P1
gh issue list --repo oviney/blog --label "agent:creative-director"
See also: Flow Orchestrator Agent for backlog management and planning.
1. User Reports Bug (GitHub Issue)
When user asks to log/report a bug, ALWAYS provide the bug template first.
Trigger phrases:
- "I found a bug"
- "There's a problem with..."
- "How do I report a bug?"
- "What's the bug template?"
- "I want to log a bug"
Agent response:
Here's the bug template from .github/ISSUE_TEMPLATE/bug_report.yml:
Required fields:
- Priority: P0-P3 (Critical/High/Medium/Low)
- Component: Layout/Design, Blog Posts, Navigation, Performance, SEO, Other
- Bug Description: What's wrong? What did you expect?
Optional fields:
- Steps to Reproduce
- Reference/Screenshots
- Affected URL
Go ahead and describe the bug - I'll help triage and create a GitHub issue.
User creates new issue at https://github.com/oviney/blog/issues/new (or Agent creates it)
Full Template Reference:
**Bug Description:**
[Clear description of what's broken]
**URL/Location:**
[Where the bug occurs - URL or component]
**Expected Behavior:**
[What should happen]
**Actual Behavior:**
[What's actually happening]
**Steps to Reproduce:**
1. Step 1
2. Step 2
3. Observe issue
**Environment:**
- Browser: Chrome/Safari/Firefox
- Device: Desktop/Mobile/Tablet
- Screen size: [if layout issue]
**Priority Suggestion:**
P0-Critical / P1-High / P2-Medium / P3-Low
**Screenshots:**
[Attach if available]
Labels to add:
bug(required)P0,P1,P2, orP3(priority)
2. QA Gatekeeper Triages Issue (< 1 hour)
QA Gatekeeper persona activates and:
2a. Reproduce Bug
# Start local server
cd /Users/ouray.viney/code/economist-blog-v5
bundle exec jekyll serve --livereload
# Navigate to reported URL
open http://localhost:4000/path/to/bug
2b. Validate & Confirm
- ✅ Bug is reproducible
- ✅ Bug is a defect (not feature request)
- ✅ Bug is not duplicate of existing issue
Add comment to issue:
✅ **Confirmed** - Reproduced locally
**Root Cause:** [Brief analysis]
**Impact:** [How many users affected / severity]
**Estimated Effort:** S (< 1hr) / M (1-4hr) / L (> 4hr)
2c. Assign Priority
Update GitHub labels:
P0- Production down, data loss, security issueP1- Major feature broken, affects many usersP2- Minor issue, workaround existsP3- Cosmetic, low impact
2d. Assign to Agent
Add label based on domain:
| Bug Domain | Agent | Label | Skill File |
|---|---|---|---|
| Layout/CSS/Visual | Creative Director | agent:creative-director | economist-theme/SKILL.md |
| Tests/CI/Performance | QA Gatekeeper | agent:qa-gatekeeper | jekyll-development/SKILL.md |
| Content/Posts/SEO | Editorial Manager | agent:editorial-manager | editorial/SKILL.md |
Add comment:
🤖 **Assigned to:** Creative Director
📚 **Reference:** docs/skills/economist-theme/SKILL.md
🎯 **Sprint:** 2026-01 Sprint 1
2e. Define Acceptance Criteria
Add to issue description:
**Acceptance Criteria:**
- [ ] [Specific testable criterion 1]
- [ ] [Specific testable criterion 2]
- [ ] No visual regressions on other pages
- [ ] All tests pass
- [ ] Works on mobile/tablet/desktop
3. Assigned Agent Asks Clarifying Questions (BEFORE Creating Branch)
CRITICAL STEP: Before writing any code, agent must ask clarifying questions to avoid rework.
3a. Review Issue & Specifications
# Read issue details
gh issue view 123 --repo oviney/blog
# If spec file exists, read it
cat docs/BUG_*.md # e.g., docs/BUG_BLOG_LAYOUT.md
3b. VERIFY WHICH FILES TO CHANGE
⚠️ CRITICAL ANTI-PATTERN FROM ISSUE #33:
- Issue described as "blog layout" bug
- Requirement doc (BUG_BLOG_LAYOUT.md) said "The
/blogpage layout" - BUT actual intent was to fix individual BLOG POST layout (post.html)
- Agent changed blog archive page (blog.html) → created regression
- Wasted tokens on rollback and rework
BEFORE implementing, explicitly confirm:
-
Which template/file needs to change?
- Blog archive page (blog.html) - lists all posts? - Individual post layout (_layouts/post.html) - single post view? - Homepage (index.md) - landing page? - Other: __________ -
Which URL is affected?
- /blog/ (archive listing) - /blog/2026/01/post-title (individual post) - / (homepage) - Other: __________ -
Show user example of current state
# Start server bundle exec jekyll serve --livereload # Take screenshot or describe current layout # "I see the blog archive at /blog/ shows a 3-column grid of cards" # "Confirm: should I change THIS page, or the individual post view?"
Template:
🔍 **Requirement Verification Before Implementation**
Based on the issue description, I understand:
- **File to change**: [blog.html / _layouts/post.html / index.md / other]
- **Affected URL**: [/blog/ / /blog/2026/01/post-title / / other]
- **Current state**: [describe what you see]
**Is this correct?** Please confirm before I start coding.
Wait for explicit user confirmation before proceeding.
3c. Identify Ambiguities
Ask about:
- Design Details: Exact sizes, colors, fonts (if not fully specified)
- User Preferences: Options or variations not clarified
- Edge Cases: Behavior for missing data, empty states
- Dependencies: External resources needed (images, APIs)
- Responsive Behavior: Mobile/tablet handling if unclear
Example questions (from issue #33):
**Clarifying Questions Before Implementation:**
1. **Date Display Format**
- Spec mentions metadata but not date format
- Should we use "Jan 5, 2026" or "January 5, 2026" or "Jan 5th 2026"?
- Reference URL: [Economist article]
2. **Category Colors**
- Should all categories use same gray color?
- Or different colors per category like Economist does?
3. **Image Fallback**
- For posts without images, should we:
a) Use default gray gradient image?
b) Hide image container entirely?
c) Show placeholder icon?
3c. Wait for User Response
Do not proceed until:
- User answers all clarifying questions
- Design decisions are confirmed
- Implementation approach is approved
Benefit: Avoids wasted tokens on iterations and rework
4. Assigned Agent Creates Branch
Agent checks out feature branch:
# Get issue number from GitHub (e.g., #123)
git checkout main
git pull origin main
git checkout -b bugfix/GH-123-short-description
# Example:
git checkout -b bugfix/GH-123-related-articles-filter
Branch naming convention:
bugfix/GH-<issue#>-<short-kebab-description>- Max 50 characters
- Use GitHub issue number (GH-123)
Add comment to issue:
🔧 **Started work** on branch `bugfix/GH-123-related-articles-filter`
4. Agent Implements Fix
4a. Read Relevant Skill File
# Creative Director reads:
cat docs/skills/economist-theme/SKILL.md
# QA Gatekeeper reads:
cat docs/skills/jekyll-qa/SKILL.md
4b. Implement Fix
- Follow SKILL.md guidelines
- Use SCSS variables (no magic numbers)
- Test at all breakpoints (320px, 768px, 1024px)
- Run local server to verify
4c. Test Fix (MANDATORY BEFORE COMMIT)
⚠️ CRITICAL ANTI-PATTERN FROM ISSUE #33:
- Agent committed changes without visual testing
- Relied only on Jekyll build success (pre-commit hook)
- Build passing ≠ visual correctness
- Created regression that wasn't caught until user review
MANDATORY TESTING SEQUENCE:
-
Build Test (prerequisite)
bundle exec jekyll build # Must pass before proceeding -
Visual Testing (REQUIRED - not optional)
# Start local server bundle exec jekyll serve --config _config_dev.yml --livereload # Navigate to EXACT URL mentioned in issue # - If issue mentions /blog/, test /blog/ # - If issue mentions post layout, test a post URL like /2026/01/02/post-title/ # Open browser to http://localhost:4000 -
Verify Against Acceptance Criteria (checklist)
- Primary bug is fixed (the reported issue)
- No visual regressions on other pages
- Test at responsive breakpoints: 320px, 768px, 1024px
- Browser console shows 0 errors
- Typography/spacing matches specification
- Images load correctly
- Links work
- Hover states function
-
Test Related Pages (regression prevention)
# If you changed blog.html, also test: # - / (homepage - uses same card components) # - Individual post pages (might share styles) # If you changed _layouts/post.html, test: # - Multiple post URLs (with/without images, categories, etc.) # - Different post lengths -
Screenshot Evidence (for PR)
- Take screenshots of before/after
- Test at mobile/tablet/desktop sizes
- Capture any edge cases
Do NOT commit until all visual testing is complete.
Template for testing notes:
✅ **Testing Complete**
**URLs Tested:**
- http://localhost:4000/blog/ - ✅ 3-column grid displays correctly
- http://localhost:4000/ - ✅ Homepage card layout unchanged
- http://localhost:4000/2026/01/02/post-title/ - ✅ Hero image sized correctly
**Responsive Testing:**
- 320px (mobile) - ✅ Single column, proper spacing
- 768px (tablet) - ✅ Two columns, images scale
- 1024px (desktop) - ✅ Three columns, full layout
**Regression Check:**
- ✅ No visual changes to unrelated pages
- ✅ 0 console errors
- ✅ All links functional
Ready for commit.
4d. Run Automated Tests (if applicable)
# Run test suite (if changes affect tested code)
npm test
4e. Commit to Branch
git add <files>
git commit -m "fix(GH-123): brief description
- Detail 1
- Detail 2
- Detail 3
Closes #123"
# Push to GitHub
git push origin bugfix/GH-123-related-articles-filter
Commit message format:
fix(GH-123): <description>- Bug fix- Must include
Closes #123to auto-close issue - Sign with
[Agent Name]at end
5. Agent Creates Pull Request
Create PR on GitHub:
## Description
Fixes #123 - Related articles not filtered by category
## Changes
- Added Liquid filter to prioritize same-category posts
- Excluded current post from related list
- Falls back to other categories if < 6 available
## Testing
- [x] Tested locally on all article pages
- [x] Verified at 320px, 768px, 1024px
- [x] Jekyll build passes
- [x] No console errors
## Acceptance Criteria
- [x] Related articles filtered by category
- [x] Current post excluded
- [x] Max 6 posts shown
- [x] Fallback to other categories
- [x] Tested on existing posts
## Screenshots
[Attach before/after if visual change]
PR Labels:
bugagent:creative-director- Priority label from issue
Request review from: @oviney (or QA Gatekeeper if different agent)
6. QA Gatekeeper Reviews PR
QA Gatekeeper persona activates and:
6a. Code Review
- ✅ Follows SKILL.md guidelines
- ✅ No hardcoded values (uses variables)
- ✅ Proper commit message format
- ✅ Tests pass
- ✅ No security issues
6b. Test on PR Branch
# Checkout PR branch
git fetch origin
git checkout bugfix/GH-123-related-articles-filter
# Test locally
bundle exec jekyll serve --livereload
# Verify fix works
# Check for regressions
6c. Approve or Request Changes
If approved:
✅ **LGTM** (Looks Good To Me)
Verified:
- [x] Fix resolves issue
- [x] No visual regressions
- [x] Tests pass
- [x] Follows design system
Approved for merge to main.
If changes needed:
🔄 **Changes Requested**
Issues found:
- [ ] Issue 1 description
- [ ] Issue 2 description
Please address and re-request review.
7. Merge to Main (After Approval)
QA Gatekeeper or repo owner:
# On GitHub: Click "Merge Pull Request"
# Or via CLI:
git checkout main
git merge --no-ff bugfix/GH-123-related-articles-filter
git push origin main
# Delete branch
git branch -d bugfix/GH-123-related-articles-filter
git push origin --delete bugfix/GH-123-related-articles-filter
GitHub Actions automatically:
- Runs full test suite
- Builds Jekyll site
- Deploys to GitHub Pages (~2 minutes)
8. Verify on Production
QA Gatekeeper verifies:
# Wait for deployment (~2 minutes)
# Monitor: https://github.com/oviney/blog/actions
# Verify on production
open https://www.viney.ca/path/to/fixed-page
# Test at multiple breakpoints
# Check browser console (0 errors)
Add comment to issue:
✅ **Verified on Production**
- Deployment: https://github.com/oviney/blog/actions/runs/XXXXX
- Tested on: https://www.viney.ca/...
- All acceptance criteria met
- No regressions detected
Closing issue. Thanks for the report!
9. Close Issue
Issue auto-closes when PR with Closes #123 merges to main.
If manual close needed:
- Add final verification comment
- Close as "Completed"
- Add milestone if applicable
Common Pitfalls
Pitfall 1: Committing Directly to Main
Problem: Bypassing branch → PR → review workflow
Solution: ALWAYS create feature branch, even for "quick fixes"
Why: No code review, no rollback strategy, breaks production
Pitfall 2: Not Linking Issue in Commit
Problem: Commit message missing Closes #123
Solution: Always include Closes #XXX in commit body
Why: Issue doesn't auto-close, tracking breaks
Pitfall 3: Self-Approving PRs
Problem: Same agent reviews own code
Solution: QA Gatekeeper reviews all PRs, even QA's own fixes
Why: Catches mistakes, enforces quality standards
Pitfall 4: Using docs/ISSUES.md Instead
Problem: Logging bugs in markdown file, not GitHub Issues
Solution: ONLY use GitHub Issues for bug tracking
Why: GitHub Issues has automation, labels, assignments, history
Pitfall 5: Skipping Acceptance Criteria
Problem: Issue has no clear "done" definition
Solution: QA Gatekeeper adds testable acceptance criteria during triage
Why: Prevents scope creep, ensures complete fix
Pitfall 6: No Production Verification
Problem: Marking done after merge, not verifying on live site
Solution: QA Gatekeeper MUST verify on production before closing
Why: Deployment can fail, fix might not work in prod environment
Pitfall 7: Merged PR Without Tests Passing
Problem: Merging when GitHub Actions shows red X
Solution: Wait for green checkmark, fix failing tests first
Why: Broken builds reach production
Code Snippets/Patterns
Fetch GitHub Issue Details
# Get issue details via GitHub CLI
gh issue view 123
# Get issue details via API
curl -s https://api.github.com/repos/oviney/blog/issues/123 | jq '.title, .body, .labels[].name'
# List open issues with specific label
gh issue list --label "agent:creative-director" --state open
Agent Invocation Commands
User says → Agent action:
- "Process issue #123" → Fetch issue, determine agent, start workflow
- "Show open P1 bugs" → Query GitHub, list P1 issues
- "Creative Director fix #123" → Adopt Creative Director persona, start Step 3
- "What bugs need QA Gatekeeper?" → List issues with agent:qa-gatekeeper label
Quick Branch Creation
# From GitHub issue #123
ISSUE=123
DESC="related-articles-filter"
git checkout main && git pull && git checkout -b bugfix/GH-${ISSUE}-${DESC}
Commit Template
git commit -m "fix(GH-123): filter related articles by category
- Added Liquid where_exp filter for category matching
- Excluded current post from results
- Falls back to other categories if < 6 available
- Tested on all article pages
Closes #123
[Creative Director]"
PR Creation (via GitHub CLI)
gh pr create \
--title "fix(GH-123): filter related articles by category" \
--body "Fixes #123 - See commit message for details" \
--label "bug,agent:creative-director,P1:high" \
--reviewer oviney
Quick Production Check
# After deployment completes
curl -s https://www.viney.ca/ | grep -i "error" && echo "❌ ERRORS FOUND" || echo "✅ NO ERRORS"
GitHub Labels Setup
PREREQUISITE: GitHub repository must have these labels configured before workflow can function.
Required Labels
Priority Labels:
gh label create "P1:high" --repo oviney/blog --color "d73a4a" --description "High priority - impacts core functionality or brand"
gh label create "P2:medium" --repo oviney/blog --color "fbca04" --description "Medium priority - important but not urgent"
gh label create "P3:low" --repo oviney/blog --color "0e8a16" --description "Low priority - nice to have improvements"
Agent Labels:
gh label create "agent:creative-director" --repo oviney/blog --color "5319e7" --description "Assigned to Creative Director (CSS/Layout/Design)"
gh label create "agent:qa-gatekeeper" --repo oviney/blog --color "1d76db" --description "Assigned to QA Gatekeeper (Testing/Quality/CI)"
gh label create "agent:editorial-manager" --repo oviney/blog --color "c5def5" --description "Assigned to Editorial Manager (Content/Writing/SEO)"
Type Labels (GitHub defaults):
bug- Redenhancement- Feature requestdocumentation- Doc updatesquestion- Need clarification
Verifying Labels
# List all labels
gh label list --repo oviney/blog
# Check if specific label exists
gh label list --repo oviney/blog | grep "P1:high"
If labels are missing during triage:
- Agent should notify user
- User/agent creates labels using commands above
- Continue workflow
Related Files
docs/skills/economist-theme/SKILL.md- Creative Director skilldocs/skills/jekyll-qa/SKILL.md- QA Gatekeeper skilldocs/skills/git-operations/SKILL.md- Git workflow.github/workflows/jekyll.yml- CI/CD pipelinedocs/DEVELOPMENT_WORKFLOW.md- Overall workflow
Success Criteria
- Bug reported via GitHub Issue (not markdown file)
- QA Gatekeeper triaged within 1 hour
- Feature branch created (bugfix/GH-XXX)
- Fix implemented on branch (not main)
- Visual testing completed BEFORE commit
- Files to change confirmed with user BEFORE implementation
- PR created with screenshots
- CI tests pass (GitHub Actions)
- Code review approved
- Merged to main
- Verified on production (viney.ca)
- Issue closed with "Closes #123" in commit
Anti-Patterns & Lessons Learned
Issue #33 - Blog Layout Regression (January 2026)
What Went Wrong:
- ❌ Misunderstood requirements: Issue title said "blog layout" but meant individual post template, not blog archive
- ❌ Changed wrong files: Modified blog.html (archive page) instead of _layouts/post.html (post template)
- ❌ Committed without visual testing: Relied only on Jekyll build success, didn't verify visual output
- ❌ Created regression: Blog archive changed from 3-column grid to single-column horizontal layout
- ❌ Wasted tokens: Required rollback commit and rework
Root Causes:
- Ambiguous issue description ("blog layout" can mean multiple things)
- Didn't confirm which file/URL to change before coding
- Pre-commit hook only validates build, not visual correctness
- No visual regression testing before commit
Prevention (now in workflow):
- ✅ Step 3b added: "Verify Which Files to Change" - explicit confirmation with user
- ✅ Step 4c expanded: Mandatory visual testing sequence with checklist
- ✅ Template provided: "Requirement Verification Before Implementation"
- ✅ Testing notes template: Document what was tested before commit
Correct Approach:
Agent: "Based on issue #33, I see two possible interpretations:
1. Change blog archive page (blog.html) at /blog/
2. Change individual post layout (_layouts/post.html) at /2026/01/post-title/
I've started the Jekyll server. The blog archive currently shows a 3-column
grid. Should I change THIS page, or the individual post template?"
User: "The individual post template - not the archive."
Agent: "✅ Confirmed. I'll modify _layouts/post.html and test at URLs like
/2026/01/02/post-title/. Will not touch blog.html."
Lesson: When issue describes a "page" or "layout", always clarify:
- Which specific file/template?
- Which URL path?
- Show current state and confirm before changing
Impact: ~2 hours wasted, regression introduced to production, reduced trust
- All tests pass locally
- PR created with proper description
- Code review completed
- PR approved by QA Gatekeeper
- Merged to main after approval
- GitHub Actions deployment succeeded
- Verified on production (https://www.viney.ca/)
- Issue auto-closed or manually closed
- No rollbacks or hotfixes needed
Example Workflow (End-to-End)
Scenario: User logs bug, returns next day to fix it
Day 1 (Evening):
User browses blog → Notices related articles showing wrong posts
User goes to: https://github.com/oviney/blog/issues/new
User creates Issue #123:
Title: "Related articles not filtered by category"
Labels: bug, P1:high
Description: [Full details]
User closes laptop
Day 2 (Morning):
User: "What P1 bugs are open?"
Agent (QA Gatekeeper activates):
→ Queries GitHub Issues
→ Lists: "#123 - Related articles not filtered by category (P1, bug, no agent assigned)"
User: "Process issue #123"
Agent (QA Gatekeeper):
→ Fetches issue details
→ Reproduces bug locally
→ Confirms it's a layout issue
→ Adds label: agent:creative-director
→ Comments on issue: "Confirmed. Assigning to Creative Director"
Agent (switches to Creative Director):
→ Reads docs/skills/economist-theme/SKILL.md
→ Creates branch: bugfix/GH-123-related-articles-filter
→ Implements fix in _layouts/post.html
→ Tests at all breakpoints
→ Commits with "Closes #123"
→ Pushes branch
→ Creates PR
Agent: "PR created: https://github.com/oviney/blog/pull/124. Ready for review."
User: Reviews PR → Approves
Agent (QA Gatekeeper):
→ Merges PR to main
→ Waits for GitHub Actions
→ Ve2.0** (2026-01-05): Added Flow Orchestrator integration for backlog management, added planning triggers
- **1.rifies on production
→ Comments: "✅ Verified on production"
→ Issue auto-closes
DONE. Total time: ~15 minutes.
Version History
- 1.1.0 (2026-01-05): Added clarifying questions step (Step 3), GitHub labels setup section, updated QA skill reference to jekyll-qa
- 1.0.0 (2026-01-05): Initial creation - Established GitHub Issues as single source of truth for bug tracking
Score
Total Score
Based on repository quality metrics
SKILL.mdファイルが含まれている
ライセンスが設定されている
100文字以上の説明がある
GitHub Stars 100以上
3ヶ月以内に更新がある
10回以上フォークされている
オープンIssueが50未満
プログラミング言語が設定されている
1つ以上のタグが設定されている
Reviews
Reviews coming soon