| name | issue-driven-development |
| description | Use for any development work - the master 13-step coding process that orchestrates all other skills, ensuring GitHub issue tracking, proper branching, TDD, code review, and CI verification |
Issue-Driven Development
Overview
The master coding process. Every step references specific skills. Follow in order.
Core principle: No work without an issue. No shortcuts. No exceptions.
Announce at start: "I'm using issue-driven-development to implement this work."
Before Starting
Create TodoWrite items for each step you'll execute. This is not optional.
The 13-Step Process
Step 1: Issue Check
Question: Am I working on a clearly defined GitHub issue that is tracked in the project board?
Actions:
- If no issue exists → Create one using
issue-prerequisiteskill - If issue is vague → Ask questions, UPDATE the issue, then proceed
- VERIFY issue is in GitHub Project with correct fields (not assumed - verified)
Verification (MANDATORY):
# Verify issue is in project board
ITEM_ID=$(gh project item-list "$GITHUB_PROJECT_NUM" --owner "$GH_PROJECT_OWNER" \
--format json | jq -r ".items[] | select(.content.number == [ISSUE_NUMBER]) | .id")
if [ -z "$ITEM_ID" ] || [ "$ITEM_ID" = "null" ]; then
echo "BLOCKED: Issue not in project board. Add it before proceeding."
# Add to project
gh project item-add "$GITHUB_PROJECT_NUM" --owner "$GH_PROJECT_OWNER" \
--url "$(gh issue view [ISSUE_NUMBER] --json url -q .url)"
fi
# Verify Status field is set
STATUS=$(gh project item-list "$GITHUB_PROJECT_NUM" --owner "$GH_PROJECT_OWNER" \
--format json | jq -r ".items[] | select(.id == \"$ITEM_ID\") | .status.name")
if [ -z "$STATUS" ] || [ "$STATUS" = "null" ]; then
echo "BLOCKED: Issue has no Status in project. Set Status before proceeding."
fi
Skill: issue-prerequisite, project-board-enforcement
Gate: Do not proceed unless:
- GitHub issue URL exists
- Issue is verified in GitHub Project (ITEM_ID obtained)
- Status field is set (Ready, Backlog, or In Progress)
Step 2: Read Comments
Question: Are there comments on the issue I need to read?
Actions:
- Read all comments on the issue
- Note any decisions, clarifications, or context
- Check for linked issues or PRs
Skill: issue-lifecycle
Step 3: Size Check
Question: Is this issue too large for a single task?
Indicators of too-large:
- More than 5 acceptance criteria
- Touches more than 3 unrelated areas
- Estimated > 1 context window of work
- Multiple independent deliverables
If too large:
- Break into sub-issues using
issue-decomposition - Link sub-issues to parent
- Update parent issue as
parentlabel - Loop back to Step 1 with first sub-issue
Skill: issue-decomposition
Step 4: Memory Search
Question: Is there previous work on this issue or related issues?
Actions:
- Search
episodic-memoryfor issue number, feature name, related terms - Search
mcp__memoryknowledge graph for related entities - Note any relevant context, decisions, or gotchas
Skill: memory-integration
Step 5: Research
Question: Do I need to perform research to complete this task?
Research types:
- Repository documentation - README, CONTRIBUTING, docs/
- Existing codebase - Similar patterns, related code
- Online resources - API docs, library references, Stack Overflow
Actions:
- Conduct necessary research
- Document findings in issue comment if significant
- Note any blockers or concerns
Skill: pre-work-research
Step 6: Branch Check & Status Update
Question: Am I on the correct branch AND has the project status been updated?
Rules:
- NEVER work on
main - Create feature branch if needed
- Branch from correct base (usually
main, sometimes existing feature branch)
Naming: feature/issue-123-short-description or fix/issue-456-bug-name
Project Status Update (MANDATORY):
When starting work, update project board Status to "In Progress":
# Get project and field IDs
PROJECT_ID=$(gh project list --owner "$GH_PROJECT_OWNER" --format json | \
jq -r ".projects[] | select(.number == $GITHUB_PROJECT_NUM) | .id")
STATUS_FIELD_ID=$(gh project field-list "$GITHUB_PROJECT_NUM" --owner "$GH_PROJECT_OWNER" \
--format json | jq -r '.fields[] | select(.name == "Status") | .id')
IN_PROGRESS_ID=$(gh project field-list "$GITHUB_PROJECT_NUM" --owner "$GH_PROJECT_OWNER" \
--format json | jq -r '.fields[] | select(.name == "Status") | .options[] | select(.name == "In Progress") | .id')
# Update status to In Progress
gh project item-edit --project-id "$PROJECT_ID" --id "$ITEM_ID" \
--field-id "$STATUS_FIELD_ID" --single-select-option-id "$IN_PROGRESS_ID"
# Verify update succeeded
NEW_STATUS=$(gh project item-list "$GITHUB_PROJECT_NUM" --owner "$GH_PROJECT_OWNER" \
--format json | jq -r ".items[] | select(.id == \"$ITEM_ID\") | .status.name")
if [ "$NEW_STATUS" != "In Progress" ]; then
echo "ERROR: Failed to update project status. Cannot proceed."
exit 1
fi
Skill: branch-discipline, project-board-enforcement
Gate: Do not proceed if:
- On
mainbranch - Project Status not updated to "In Progress"
Step 7: TDD Development
Process: RED → GREEN → REFACTOR
Standards to apply simultaneously:
tdd-full-coverage- Write test first, watch fail, minimal code to passstrict-typing- Noanytypes, full typinginline-documentation- JSDoc/docstrings for all public APIsinclusive-language- Respectful terminologyno-deferred-work- No TODOs, do it now
Actions:
- Write failing test for first acceptance criterion
- Implement minimal code to pass
- Refactor if needed
- Repeat for each criterion
Skills: tdd-full-coverage, strict-typing, inline-documentation, inclusive-language, no-deferred-work
Step 8: Verification Loop
Question: Did I succeed in delivering what is documented in the issue?
Actions:
- Run all tests
- Check each acceptance criterion
- If any failure → Return to Step 7
- If 2 consecutive failures → Trigger
research-after-failure
Skill: acceptance-criteria-verification, research-after-failure
Step 9: Code Review (MANDATORY GATE)
Question: Minor change or major change?
Minor change (Step 9.1):
- Review only new tests and generated code
- Use
comprehensive-reviewchecklist
Major change (Step 9.2):
- Identify all impacted code
- Review new AND impacted tests and code
- Use
comprehensive-reviewchecklist
7 Review Criteria:
- Blindspots - What am I missing?
- Clarity/Consistency - Is code readable and consistent?
- Maintainability - Can this be maintained?
- Security - Any vulnerabilities?
- Performance - Any bottlenecks?
- Documentation - Adequate docs?
- Style - Follows style guide?
Security-Sensitive Check:
# Check if any changed files are security-sensitive
git diff --name-only HEAD~1 | grep -E '(auth|security|middleware|api|password|token|secret|session|routes|\.sql)'
If matches found:
- Invoke
security-reviewersubagent OR performsecurity-reviewskill - Mark "Security-Sensitive: YES" in review artifact
- Include security findings in artifact
HARD REQUIREMENT: Post review artifact to issue comment:
<!-- REVIEW:START -->
## Code Review Complete
| Property | Value |
|----------|-------|
| Issue | #[ISSUE] |
| Scope | [MINOR|MAJOR] |
| Security-Sensitive | [YES|NO] |
| Reviewed | [ISO_TIMESTAMP] |
[... full artifact per comprehensive-review skill ...]
**Review Status:** ✅ COMPLETE
<!-- REVIEW:END -->
Gate: PR creation will be BLOCKED by hooks if artifact not found.
Skills: review-scope, comprehensive-review, security-review, review-gate
Step 10: Implement Findings (ABSOLUTE REQUIREMENT)
Rule: Implement ALL recommendations from code review, regardless how minor.
ABSOLUTE: Every finding must result in ONE of:
- Fixed in this PR - Code changed, tests pass, verified
- Tracking issue created - Using
deferred-findingskill
There is NO third option. "Won't fix without tracking" is NOT permitted.
Actions:
- Address each finding from review
- For findings that cannot be fixed now:
- Use
deferred-findingskill to create tracking issue - Add
review-findingandspawned-from:#ISSUElabels - Link tracking issue in review artifact
- Use
- Re-run affected tests
- Update review artifact to show:
- All FIXED findings marked ✅
- All DEFERRED findings with tracking issue #
- "Unaddressed: 0"
Gate: Review artifact must show "Unaddressed: 0" before proceeding.
Skills: apply-all-findings, deferred-finding
Step 11: Run Full Tests
Actions:
- Run full relevant test suite (not just new tests)
- Verify no regressions
- Check test coverage if available
Skill: tdd-full-coverage
Step 12: Raise PR (GATED)
Prerequisites (verified by hooks):
- Review artifact posted to issue (Step 9)
- All findings addressed (Step 10) - "Unaddressed: 0"
- Review status is COMPLETE
- Full tests pass (Step 11)
Actions:
- Commit with descriptive message
- Push branch
- Create PR with complete documentation:
- Summary of changes
- Link to issue
- Link to review artifact in issue
- Verification report
- Screenshots if UI changes
CRITICAL: The PreToolUse hook will BLOCK gh pr create if:
- No review artifact found in issue comments
- Review status is not COMPLETE
- Unaddressed findings > 0
If blocked, return to Step 9 or Step 10.
Skills: clean-commits, pr-creation, review-gate
Step 13: CI Monitoring
Actions:
- Wait for CI to run
- If failure → Fix and push
- Repeat until green or truly unresolvable
- If unresolvable → Document in issue, mark as blocked
Skills: ci-monitoring, verification-before-merge
Throughout the Process
Issue AND project board updates happen CONTINUOUSLY, not as a separate step.
Mandatory Project Board Updates
These updates are NOT optional. They are gates.
| Moment | Project Status | Verification |
|---|---|---|
| Starting work (Step 6) | → In Progress | Verify status changed |
| PR created (Step 12) | → In Review | Verify status changed |
| Work complete | → Done | Verify status changed |
| Blocked | → Blocked | Verify status changed |
Issue Comment Updates
At minimum, update the issue:
- When starting work (Status → In Progress)
- When hitting blockers
- When making significant decisions
- When completing verification
- When raising PR
Project Board Query (NOT Labels)
CRITICAL: Use project board for state queries, NOT labels.
# WRONG - do not use labels for state
gh issue list --label "status:in-progress"
# RIGHT - query project board
gh project item-list "$GITHUB_PROJECT_NUM" --owner "$GH_PROJECT_OWNER" \
--format json | jq -r '.items[] | select(.status.name == "In Progress")'
Skill: issue-lifecycle, project-status-sync, project-board-enforcement
Error Handling
If any step fails unexpectedly:
- Assess severity using
error-recovery - Preserve evidence (logs, errors)
- Attempt recovery if possible
- If unrecoverable, update issue as Blocked and report
Skill: error-recovery
Completion Criteria
Work is complete when:
- All acceptance criteria verified (PASS)
- All tests pass
- Build succeeds
- Code review completed (comprehensive-review)
- Security review completed (if security-sensitive files)
- Review artifact posted to issue
- All review findings addressed (Unaddressed: 0)
- Deferred findings have tracking issues
- PR created with complete documentation
- CI is green
- Issue status updated
- GitHub Project Status → Done (VERIFIED)
- Project board update confirmed (not assumed)
Quick Reference
| Step | Skill(s) | Gate |
|---|---|---|
| 1 | issue-prerequisite, project-board-enforcement | Must have issue IN PROJECT BOARD |
| 2 | issue-lifecycle | - |
| 3 | issue-decomposition | - |
| 4 | memory-integration | - |
| 5 | pre-work-research | - |
| 6 | branch-discipline, project-board-enforcement | Must not be on main, Status → In Progress |
| 7 | tdd-full-coverage, strict-typing, inline-documentation, inclusive-language, no-deferred-work | - |
| 8 | acceptance-criteria-verification, research-after-failure | - |
| 9 | review-scope, comprehensive-review, security-review, review-gate | Review artifact required |
| 10 | apply-all-findings, deferred-finding | Unaddressed: 0 required |
| 11 | tdd-full-coverage | - |
| 12 | clean-commits, pr-creation, review-gate, project-board-enforcement | Hook blocks without artifact, Status → In Review |
| 13 | ci-monitoring, verification-before-merge | Must be green, Status → Done on merge |
Enforcement
This process is enforced by:
Review Enforcement
- PreToolUse hook on
gh pr create- Blocks without review artifact - PreToolUse hook on
gh pr merge- Verifies CI and review - Stop hook - Verifies review completion before session end
- Conditional rules - Security-sensitive files trigger security review requirement
Project Board Enforcement
- PreToolUse hook on
git checkout -b- Verifies issue is in project board - PreToolUse hook on
git checkout -b- Updates Status → In Progress - PreToolUse hook on
gh pr create- Updates Status → In Review - Stop hook - Verifies project board status matches work state
Project Board Gate Failures
If project board verification fails:
## BLOCKED: Project Board Compliance Failed
**Issue:** #[NUMBER]
**Problem:** [Issue not in project / Status not set / Update failed]
**Required Action:**
1. Add issue to project board
2. Set required fields (Status, Type, Priority)
3. Retry the blocked action
**Command to add:**
gh project item-add $GITHUB_PROJECT_NUM --owner $GH_PROJECT_OWNER --url [ISSUE_URL]
Do NOT proceed past a project board gate failure. Fix it first.