Issue Prerequisite Overview No work without a GitHub issue. This is a hard gate. Core principle: Every task, regardless of size, must have a corresponding GitHub issue. Announce at start: "I'm checking for a GitHub issue before proceeding with any work." The Gate When Issue is Provided Verify the issue exists and is accessible: If issue doesn't exist or is inaccessible: - Report error to user - Do not proceed When No Issue is Provided Option 1: User has existing issue Ask: "What's the GitHub issue number for this work?" Option 2: Need to create issue Gather information to create an issue: Cre…

)\necho \"Created issue #$ISSUE_NUMBER\"\n```\n\n### Adding to Project Board (MANDATORY)\n\n**This step is NOT optional. It is a gate.**\n\n**Uses cached IDs from `github-api-cache`. API calls: 1 (add) + 1 (refresh cache).**\n\n```bash\n# Add to project - REQUIRED (1 API call)\ngh project item-add \"$GITHUB_PROJECT_NUM\" --owner \"$GH_PROJECT_OWNER\" --url \"$ISSUE_URL\"\n\nif [ $? -ne 0 ]; then\n echo \"ERROR: Failed to add issue to project. Cannot proceed.\"\n echo \"Issue #$ISSUE_NUMBER exists but is NOT tracked in project board.\"\n exit 1\nfi\n\n# Refresh cache after adding (1 API call)\nexport GH_CACHE_ITEMS=$(gh project item-list \"$GITHUB_PROJECT_NUM\" --owner \"$GH_PROJECT_OWNER\" --format json)\n\n# Get the item ID from refreshed cache (0 API calls)\nITEM_ID=$(echo \"$GH_CACHE_ITEMS\" | jq -r \".items[] | select(.content.number == $ISSUE_NUMBER) | .id\")\n\nif [ -z \"$ITEM_ID\" ] || [ \"$ITEM_ID\" = \"null\" ]; then\n echo \"ERROR: Issue added but item ID not found. Cannot set fields.\"\n exit 1\nfi\n\necho \"Issue #$ISSUE_NUMBER added to project with item ID: $ITEM_ID\"\n```\n\n### Setting Project Fields (MANDATORY)\n\n**All fields must be set before proceeding.**\n\n**Uses cached IDs - 0 API calls for lookups, 3 API calls for field updates.**\n\n```bash\n# Use cached IDs (0 API calls) - set by session-start via github-api-cache\n# GH_PROJECT_ID, GH_STATUS_FIELD_ID, GH_STATUS_READY_ID already available\n\n# Get Type and Priority field IDs from cache (0 API calls)\nTYPE_FIELD_ID=$(echo \"$GH_CACHE_FIELDS\" | jq -r '.fields[] | select(.name == \"Type\") | .id')\nPRIORITY_FIELD_ID=$(echo \"$GH_CACHE_FIELDS\" | jq -r '.fields[] | select(.name == \"Priority\") | .id')\n\n# Get option IDs from cache (0 API calls)\nTYPE_OPTION_ID=$(echo \"$GH_CACHE_FIELDS\" | jq -r \".fields[] | select(.name == \\\"Type\\\") | .options[] | select(.name == \\\"[TYPE]\\\") | .id\")\nPRIORITY_OPTION_ID=$(echo \"$GH_CACHE_FIELDS\" | jq -r \".fields[] | select(.name == \\\"Priority\\\") | .options[] | select(.name == \\\"[PRIORITY]\\\") | .id\")\n\n# Set Status = Ready (1 API call)\ngh project item-edit --project-id \"$GH_PROJECT_ID\" --id \"$ITEM_ID\" \\\n --field-id \"$GH_STATUS_FIELD_ID\" --single-select-option-id \"$GH_STATUS_READY_ID\"\n\n# Set Type (1 API call)\ngh project item-edit --project-id \"$GH_PROJECT_ID\" --id \"$ITEM_ID\" \\\n --field-id \"$TYPE_FIELD_ID\" --single-select-option-id \"$TYPE_OPTION_ID\"\n\n# Set Priority (1 API call)\ngh project item-edit --project-id \"$GH_PROJECT_ID\" --id \"$ITEM_ID\" \\\n --field-id \"$PRIORITY_FIELD_ID\" --single-select-option-id \"$PRIORITY_OPTION_ID\"\n```\n\n### Verify Project Board Setup (GATE)\n\n**Do not proceed until verification passes.**\n\n**Refresh cache and verify (1 API call).**\n\n```bash\n# Refresh cache and verify (1 API call)\nexport GH_CACHE_ITEMS=$(gh project item-list \"$GITHUB_PROJECT_NUM\" --owner \"$GH_PROJECT_OWNER\" --format json)\nVERIFY=$(echo \"$GH_CACHE_ITEMS\" | jq \".items[] | select(.content.number == $ISSUE_NUMBER)\")\n\nSTATUS=$(echo \"$VERIFY\" | jq -r '.status.name')\nTYPE=$(echo \"$VERIFY\" | jq -r '.type.name // \"unset\"')\n\nif [ -z \"$STATUS\" ] || [ \"$STATUS\" = \"null\" ]; then\n echo \"GATE FAILED: Status not set for issue #$ISSUE_NUMBER\"\n exit 1\nfi\n\necho \"VERIFIED: Issue #$ISSUE_NUMBER is in project with Status=$STATUS\"\n```\n\n## Issue Quality Check\n\nBefore proceeding, verify the issue has:\n\n| Required | Check |\n|----------|-------|\n| Clear title | Describes what will be delivered |\n| Description | Explains the work |\n| Acceptance criteria | At least one verifiable criterion |\n| In GitHub Project | Added with correct status |\n\nIf any are missing, update the issue before proceeding.\n\n## \"Too Small for an Issue\" is False\n\nCommon objections and responses:\n\n| Objection | Response |\n|-----------|----------|\n| \"It's just a typo fix\" | Issues take 30 seconds. They provide a record. Create one. |\n| \"It's a one-liner\" | One-liners can introduce bugs. Document them. |\n| \"I'll do it quickly\" | Quick work is forgotten work. Track it. |\n| \"It's obvious what needs doing\" | If it's obvious, the issue will be fast to write. |\n\nNo exceptions. Every change has an issue.\n\n## Minimum Viable Issue\n\nFor truly trivial work, this is the minimum:\n\n```markdown\nTitle: Fix typo in README.md\n\n## Description\nFix typo: \"teh\" → \"the\"\n\n## Acceptance Criteria\n- [ ] Typo is corrected\n```\n\nThat's 30 seconds. There's no excuse.\n\n## After Gate Passes\n\nOnce issue is confirmed:\n\n1. Note the issue number for all subsequent work\n2. Proceed to next step in `issue-driven-development`\n3. Reference issue in all commits and PR\n\n## Checklist\n\nBefore proceeding past this gate:\n\n- [ ] Issue number identified\n- [ ] Issue exists in GitHub\n- [ ] Issue is accessible (correct repo, not archived)\n- [ ] Issue has description\n- [ ] Issue has at least one acceptance criterion\n- [ ] **Issue is in GitHub Project (VERIFIED with ITEM_ID)**\n- [ ] **Status field is set (Ready or Backlog)**\n- [ ] **Type field is set**\n- [ ] **Priority field is set**\n\n**Gate:** Cannot proceed to `issue-driven-development` Step 2 without all checkboxes verified.\n\n**Skill:** `project-board-enforcement`\n---","attachment_filenames":[],"attachments":[],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Issue Prerequisite","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Overview","type":"text"}]},{"type":"paragraph","content":[{"text":"No work without a GitHub issue. This is a hard gate.","type":"text"}]},{"type":"paragraph","content":[{"text":"Core principle:","type":"text","marks":[{"type":"strong"}]},{"text":" Every task, regardless of size, must have a corresponding GitHub issue.","type":"text"}]},{"type":"paragraph","content":[{"text":"Announce at start:","type":"text","marks":[{"type":"strong"}]},{"text":" \"I'm checking for a GitHub issue before proceeding with any work.\"","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"The Gate","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"┌─────────────────────────────────────┐\n│ WORK REQUESTED │\n└─────────────────┬───────────────────┘\n │\n ▼\n ┌─────────────────┐\n │ Issue provided? │\n └────────┬────────┘\n │\n ┌─────────┴─────────┐\n │ │\n Yes No\n │ │\n ▼ ▼\n ┌─────────┐ ┌─────────────┐\n │ Verify │ │ Ask user or │\n │ issue │ │ create issue│\n │ exists │ └──────┬──────┘\n └────┬────┘ │\n │ │\n ▼ ▼\n ┌──────────────────────────────┐\n │ Issue confirmed? │\n │ (exists and accessible) │\n └─────────────┬────────────────┘\n │\n ┌────────┴────────┐\n │ │\n Yes No\n │ │\n ▼ ▼\n PROCEED STOP\n WITH WORK (Cannot proceed)","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When Issue is Provided","type":"text"}]},{"type":"paragraph","content":[{"text":"Verify the issue exists and is accessible:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Verify issue exists\ngh issue view [ISSUE_NUMBER] --json number,title,state,body\n\n# Check issue is in the correct repository\ngh issue view [ISSUE_NUMBER] --json url","type":"text"}]},{"type":"paragraph","content":[{"text":"If issue doesn't exist or is inaccessible:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report error to user","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Do not proceed","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When No Issue is Provided","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Option 1: User has existing issue","type":"text"}]},{"type":"paragraph","content":[{"text":"Ask: \"What's the GitHub issue number for this work?\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Option 2: Need to create issue","type":"text"}]},{"type":"paragraph","content":[{"text":"Gather information to create an issue:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"I need to create a GitHub issue before starting this work.\n\n**Please provide or confirm:**\n\n1. **Title:** [What should this issue be called?]\n\n2. **Description:** [What should this issue deliver?]\n\n3. **Acceptance Criteria:**\n - [ ] [First verifiable behavior]\n - [ ] [Second verifiable behavior]\n\n4. **Type:** Feature / Bug / Chore / Research / Spike\n\n5. **Priority:** Critical / High / Medium / Low","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Creating the Issue","type":"text"}]},{"type":"paragraph","content":[{"text":"Once information is gathered:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Create the issue\nISSUE_URL=$(gh issue create \\\n --title \"[Type] Title here\" \\\n --body \"## Description\n\n[Description]\n\n## Acceptance Criteria\n\n- [ ] Criterion 1\n- [ ] Criterion 2\n\n## Verification Steps\n\n1. Step 1\n2. Step 2\n\n## Technical Notes\n\n[Any technical context]\" 2>&1 | tail -1)\n\nISSUE_NUMBER=$(echo \"$ISSUE_URL\" | grep -oE '[0-9]+

Issue Prerequisite Overview No work without a GitHub issue. This is a hard gate. Core principle: Every task, regardless of size, must have a corresponding GitHub issue. Announce at start: "I'm checking for a GitHub issue before proceeding with any work." The Gate When Issue is Provided Verify the issue exists and is accessible: If issue doesn't exist or is inaccessible: - Report error to user - Do not proceed When No Issue is Provided Option 1: User has existing issue Ask: "What's the GitHub issue number for this work?" Option 2: Need to create issue Gather information to create an issue: Cre…

)\necho \"Created issue #$ISSUE_NUMBER\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Adding to Project Board (MANDATORY)","type":"text"}]},{"type":"paragraph","content":[{"text":"This step is NOT optional. It is a gate.","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Uses cached IDs from ","type":"text","marks":[{"type":"strong"}]},{"text":"github-api-cache","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":". API calls: 1 (add) + 1 (refresh cache).","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Add to project - REQUIRED (1 API call)\ngh project item-add \"$GITHUB_PROJECT_NUM\" --owner \"$GH_PROJECT_OWNER\" --url \"$ISSUE_URL\"\n\nif [ $? -ne 0 ]; then\n echo \"ERROR: Failed to add issue to project. Cannot proceed.\"\n echo \"Issue #$ISSUE_NUMBER exists but is NOT tracked in project board.\"\n exit 1\nfi\n\n# Refresh cache after adding (1 API call)\nexport GH_CACHE_ITEMS=$(gh project item-list \"$GITHUB_PROJECT_NUM\" --owner \"$GH_PROJECT_OWNER\" --format json)\n\n# Get the item ID from refreshed cache (0 API calls)\nITEM_ID=$(echo \"$GH_CACHE_ITEMS\" | jq -r \".items[] | select(.content.number == $ISSUE_NUMBER) | .id\")\n\nif [ -z \"$ITEM_ID\" ] || [ \"$ITEM_ID\" = \"null\" ]; then\n echo \"ERROR: Issue added but item ID not found. Cannot set fields.\"\n exit 1\nfi\n\necho \"Issue #$ISSUE_NUMBER added to project with item ID: $ITEM_ID\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Setting Project Fields (MANDATORY)","type":"text"}]},{"type":"paragraph","content":[{"text":"All fields must be set before proceeding.","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Uses cached IDs - 0 API calls for lookups, 3 API calls for field updates.","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Use cached IDs (0 API calls) - set by session-start via github-api-cache\n# GH_PROJECT_ID, GH_STATUS_FIELD_ID, GH_STATUS_READY_ID already available\n\n# Get Type and Priority field IDs from cache (0 API calls)\nTYPE_FIELD_ID=$(echo \"$GH_CACHE_FIELDS\" | jq -r '.fields[] | select(.name == \"Type\") | .id')\nPRIORITY_FIELD_ID=$(echo \"$GH_CACHE_FIELDS\" | jq -r '.fields[] | select(.name == \"Priority\") | .id')\n\n# Get option IDs from cache (0 API calls)\nTYPE_OPTION_ID=$(echo \"$GH_CACHE_FIELDS\" | jq -r \".fields[] | select(.name == \\\"Type\\\") | .options[] | select(.name == \\\"[TYPE]\\\") | .id\")\nPRIORITY_OPTION_ID=$(echo \"$GH_CACHE_FIELDS\" | jq -r \".fields[] | select(.name == \\\"Priority\\\") | .options[] | select(.name == \\\"[PRIORITY]\\\") | .id\")\n\n# Set Status = Ready (1 API call)\ngh project item-edit --project-id \"$GH_PROJECT_ID\" --id \"$ITEM_ID\" \\\n --field-id \"$GH_STATUS_FIELD_ID\" --single-select-option-id \"$GH_STATUS_READY_ID\"\n\n# Set Type (1 API call)\ngh project item-edit --project-id \"$GH_PROJECT_ID\" --id \"$ITEM_ID\" \\\n --field-id \"$TYPE_FIELD_ID\" --single-select-option-id \"$TYPE_OPTION_ID\"\n\n# Set Priority (1 API call)\ngh project item-edit --project-id \"$GH_PROJECT_ID\" --id \"$ITEM_ID\" \\\n --field-id \"$PRIORITY_FIELD_ID\" --single-select-option-id \"$PRIORITY_OPTION_ID\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Verify Project Board Setup (GATE)","type":"text"}]},{"type":"paragraph","content":[{"text":"Do not proceed until verification passes.","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Refresh cache and verify (1 API call).","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Refresh cache and verify (1 API call)\nexport GH_CACHE_ITEMS=$(gh project item-list \"$GITHUB_PROJECT_NUM\" --owner \"$GH_PROJECT_OWNER\" --format json)\nVERIFY=$(echo \"$GH_CACHE_ITEMS\" | jq \".items[] | select(.content.number == $ISSUE_NUMBER)\")\n\nSTATUS=$(echo \"$VERIFY\" | jq -r '.status.name')\nTYPE=$(echo \"$VERIFY\" | jq -r '.type.name // \"unset\"')\n\nif [ -z \"$STATUS\" ] || [ \"$STATUS\" = \"null\" ]; then\n echo \"GATE FAILED: Status not set for issue #$ISSUE_NUMBER\"\n exit 1\nfi\n\necho \"VERIFIED: Issue #$ISSUE_NUMBER is in project with Status=$STATUS\"","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Issue Quality Check","type":"text"}]},{"type":"paragraph","content":[{"text":"Before proceeding, verify the issue has:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Required","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Check","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Clear title","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Describes what will be delivered","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Explains the work","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Acceptance criteria","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"At least one verifiable criterion","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"In GitHub Project","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Added with correct status","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"If any are missing, update the issue before proceeding.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"\"Too Small for an Issue\" is False","type":"text"}]},{"type":"paragraph","content":[{"text":"Common objections and responses:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Objection","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Response","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"It's just a typo fix\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Issues take 30 seconds. They provide a record. Create one.","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"It's a one-liner\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"One-liners can introduce bugs. Document them.","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"I'll do it quickly\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Quick work is forgotten work. Track it.","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"It's obvious what needs doing\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"If it's obvious, the issue will be fast to write.","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"No exceptions. Every change has an issue.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Minimum Viable Issue","type":"text"}]},{"type":"paragraph","content":[{"text":"For truly trivial work, this is the minimum:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"Title: Fix typo in README.md\n\n## Description\nFix typo: \"teh\" → \"the\"\n\n## Acceptance Criteria\n- [ ] Typo is corrected","type":"text"}]},{"type":"paragraph","content":[{"text":"That's 30 seconds. There's no excuse.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"After Gate Passes","type":"text"}]},{"type":"paragraph","content":[{"text":"Once issue is confirmed:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Note the issue number for all subsequent work","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Proceed to next step in ","type":"text"},{"text":"issue-driven-development","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reference issue in all commits and PR","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Checklist","type":"text"}]},{"type":"paragraph","content":[{"text":"Before proceeding past this gate:","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Issue number identified","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Issue exists in GitHub","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Issue is accessible (correct repo, not archived)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Issue has description","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Issue has at least one acceptance criterion","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Issue is in GitHub Project (VERIFIED with ITEM_ID)","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Status field is set (Ready or Backlog)","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Type field is set","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Priority field is set","type":"text","marks":[{"type":"strong"}]}]}]}]},{"type":"paragraph","content":[{"text":"Gate:","type":"text","marks":[{"type":"strong"}]},{"text":" Cannot proceed to ","type":"text"},{"text":"issue-driven-development","type":"text","marks":[{"type":"code_inline"}]},{"text":" Step 2 without all checkboxes verified.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Skill:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"project-board-enforcement","type":"text","marks":[{"type":"code_inline"}]}]}]},"metadata":{"date":"2026-06-05","name":"issue-prerequisite","model":"opus","author":"@skillopedia","source":{"stars":8,"repo_name":"claude-skills","origin_url":"https://github.com/troykelly/claude-skills/blob/HEAD/skills/issue-prerequisite/SKILL.md","repo_owner":"troykelly","body_sha256":"898396174ea4bc1f534a999c3e911c47f7abce1f2b25f88e95e95e601e8c1f59","cluster_key":"7266faab617ca006795272abf42eebcf8ed2405d82e04244db0795377d3d6613","clean_bundle":{"format":"clean-skill-bundle-v1","source":"troykelly/claude-skills/skills/issue-prerequisite/SKILL.md","bundle_sha256":"34bc7400175528bf11488e9a647bb30a232bd17968067435fdc8c775ffeaa694","attachment_count":0,"text_attachments":0,"binary_attachments":0},"cluster_size":1,"skill_md_path":"skills/issue-prerequisite/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"web-development","category_label":"Web"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"web-development","import_tag":"clean-skills-v1","description":"Use before starting ANY work - hard gate ensuring a GitHub issue exists, creating one if needed through user questioning","allowed-tools":["mcp__github__*"]}},"renderedAt":1782979911082}

Issue Prerequisite Overview No work without a GitHub issue. This is a hard gate. Core principle: Every task, regardless of size, must have a corresponding GitHub issue. Announce at start: "I'm checking for a GitHub issue before proceeding with any work." The Gate When Issue is Provided Verify the issue exists and is accessible: If issue doesn't exist or is inaccessible: - Report error to user - Do not proceed When No Issue is Provided Option 1: User has existing issue Ask: "What's the GitHub issue number for this work?" Option 2: Need to create issue Gather information to create an issue: Cre…