GitHub Issue
Prepare a GitHub issue that is clear, actionable, and proportionate.
Core behavior
- Follow repository-specific issue templates and contribution rules when they exist.
- Prefer the shortest structure that still makes the issue understandable and actionable.
- Do not pad small issues with empty sections.
- Do not invent evidence or repo conventions.
- If a likely duplicate exists, mention that before drafting a new issue.
- Inspect existing repository labels before creating an issue with
gh.
- If clear matching labels already exist, apply them explicitly when creating the issue.
First step
Inspect, when present:
.github/ISSUE_TEMPLATE/ — use templates when they exist (--template flag)
- existing repository labels (
gh label list)
- recent similar issues
- the repository's own commit / issue conventions (e.g.
CONTRIBUTING.md, AGENTS.md)
If the repository has issue templates, use the matching template. Common template → type mapping:
| Commit type |
Template file |
Title prefix |
feat |
feature_request.yml |
feat(scope): ... |
fix |
bug_report.yml |
fix(scope): ... |
refactor |
maintenance_task.yml |
refactor(scope): ... |
chore |
maintenance_task.yml |
chore(scope): ... |
docs |
(none — use generic) |
docs(scope): ... |
ci |
(none — use generic) |
ci(scope): ... |
test |
(none — use generic) |
test(scope): ... |
If no repo-specific issue templates are found, fall back to the generic structures below.
Size classification
Classify the issue into one of:
- tiny: typo, wording inconsistency, obvious low-scope cleanup
- normal: localized bug, small feature request, focused docs gap, small refactor
- substantial: cross-module bug, feature affecting multiple workflows, API/schema/config discussion, proposal with compatibility or migration implications
Required writing rule
Prefer the minimum detail needed for a maintainer to answer:
- what is the issue?
- where is it?
- why does it matter?
- what should happen next?
Templates
tiny issue template
## Summary
<1 short paragraph or 1-2 sentences>
## Suggested fix
<optional, 1 short sentence if obvious>
normal issue template
## Summary
<short paragraph>
## Current behavior
<what happens now>
## Expected behavior
<what should happen>
## Evidence
<logs / code refs, only if available>
substantial issue template
## Summary
<short paragraph>
## Background
<context and affected area>
## Current behavior
<what happens now>
## Expected behavior
<what should happen>
## Evidence
<logs / code refs / benchmark deltas>
## Scope / impact
<who is affected and how>
## Suggested direction
<optional and lightweight>
Title convention
Issue titles use conventional commit format: type(scope): description.
- Describe the problem or need, not the solution.
- GOOD:
fix(api): retry exhausts after 3 attempts with no model fallback
- BAD:
fix(api): add model fallback on consecutive overload errors ← this describes the solution; use it for the PR title instead
- Scope follows the repository's commit conventions (typically the owning package / crate / module name).
- Do not include issue numbers, internal planning IDs (Block, Phase, Tier, EPIC, Batch, Wave), or file paths in the title.
Output contract
When asked to draft an issue:
- State the chosen size class: tiny / normal / substantial
- Output: proposed title + issue body
- If asked to create it with gh CLI, include labels and assignee per the repo's policy.
Assignee and labels
- kind/ label (if the repo uses kind-prefixed labels): always apply the
kind/ label that matches the conventional commit type in the title:
feat(...) → kind/feature
fix(...) → kind/bug
refactor(...) → kind/refactor
docs(...) → kind/docs
chore(...) → kind/chore
ci(...) → kind/cicd
test(...) → kind/test
- Agent-attribution label (if the repo tracks which tool drove the work, e.g.
claude, codex): apply the matching label on every issue the assistant creates.
- Assignee: pass
--assignee per the repo's policy.
- Inspect available labels first (
gh label list); reuse existing labels, do not invent new ones.
- If the repo installs
dotai-conventions with GUARD_GIT_REQUIRE_PR_METADATA=1, the guard enforces --label and --assignee on gh issue create.
- If no clear label fits beyond these, say so instead of guessing.
Style rules
- neutral, polite, concrete
- no emotional language, no blame, no fake certainty
- no unnecessary verbosity
- no tool-attribution footers in the body — use the attribution label instead
1---2name: github-issue3description: Draft concise, repository-aligned GitHub issues with proportional detail based on change size.4---56# GitHub Issue78Prepare a GitHub issue that is clear, actionable, and proportionate.910## Core behavior1112- Follow repository-specific issue templates and contribution rules when they exist.13- Prefer the shortest structure that still makes the issue understandable and actionable.14- Do not pad small issues with empty sections.15- Do not invent evidence or repo conventions.16- If a likely duplicate exists, mention that before drafting a new issue.17- Inspect existing repository labels before creating an issue with `gh`.18- If clear matching labels already exist, apply them explicitly when creating the issue.1920## First step2122Inspect, when present:2324- `.github/ISSUE_TEMPLATE/` — **use templates when they exist** (`--template` flag)25- existing repository labels (`gh label list`)26- recent similar issues27- the repository's own commit / issue conventions (e.g. `CONTRIBUTING.md`, `AGENTS.md`)2829If the repository has issue templates, use the matching template. Common template → type mapping:3031| Commit type | Template file | Title prefix |32|-------------|--------------|--------------|33| `feat` | `feature_request.yml` | `feat(scope): ...` |34| `fix` | `bug_report.yml` | `fix(scope): ...` |35| `refactor` | `maintenance_task.yml` | `refactor(scope): ...` |36| `chore` | `maintenance_task.yml` | `chore(scope): ...` |37| `docs` | (none — use generic) | `docs(scope): ...` |38| `ci` | (none — use generic) | `ci(scope): ...` |39| `test` | (none — use generic) | `test(scope): ...` |4041If no repo-specific issue templates are found, fall back to the generic structures below.4243## Size classification4445Classify the issue into one of:4647- **tiny**: typo, wording inconsistency, obvious low-scope cleanup48- **normal**: localized bug, small feature request, focused docs gap, small refactor49- **substantial**: cross-module bug, feature affecting multiple workflows, API/schema/config discussion, proposal with compatibility or migration implications5051## Required writing rule5253Prefer the minimum detail needed for a maintainer to answer:5455- what is the issue?56- where is it?57- why does it matter?58- what should happen next?5960## Templates6162### tiny issue template6364```markdown65## Summary6667<1 short paragraph or 1-2 sentences>6869## Suggested fix7071<optional, 1 short sentence if obvious>72```7374### normal issue template7576```markdown77## Summary7879<short paragraph>8081## Current behavior8283<what happens now>8485## Expected behavior8687<what should happen>8889## Evidence9091<logs / code refs, only if available>92```9394### substantial issue template9596```markdown97## Summary9899<short paragraph>100101## Background102103<context and affected area>104105## Current behavior106107<what happens now>108109## Expected behavior110111<what should happen>112113## Evidence114115<logs / code refs / benchmark deltas>116117## Scope / impact118119<who is affected and how>120121## Suggested direction122123<optional and lightweight>124```125126## Title convention127128Issue titles use conventional commit format: `type(scope): description`.129130- **Describe the problem or need**, not the solution.131 - GOOD: `fix(api): retry exhausts after 3 attempts with no model fallback`132 - BAD: `fix(api): add model fallback on consecutive overload errors` ← this describes the solution; use it for the PR title instead133- Scope follows the repository's commit conventions (typically the owning package / crate / module name).134- Do not include issue numbers, internal planning IDs (Block, Phase, Tier, EPIC, Batch, Wave), or file paths in the title.135136## Output contract137138When asked to draft an issue:1391401. State the chosen size class: tiny / normal / substantial1412. Output: proposed title + issue body1423. If asked to create it with gh CLI, include labels and assignee per the repo's policy.143144## Assignee and labels145146- **kind/ label** (if the repo uses kind-prefixed labels): always apply the `kind/` label that matches the conventional commit type in the title:147 - `feat(...)` → `kind/feature`148 - `fix(...)` → `kind/bug`149 - `refactor(...)` → `kind/refactor`150 - `docs(...)` → `kind/docs`151 - `chore(...)` → `kind/chore`152 - `ci(...)` → `kind/cicd`153 - `test(...)` → `kind/test`154- **Agent-attribution label** (if the repo tracks which tool drove the work, e.g. `claude`, `codex`): apply the matching label on every issue the assistant creates.155- **Assignee**: pass `--assignee` per the repo's policy.156- Inspect available labels first (`gh label list`); reuse existing labels, do not invent new ones.157- If the repo installs `dotai-conventions` with `GUARD_GIT_REQUIRE_PR_METADATA=1`, the guard enforces `--label` and `--assignee` on `gh issue create`.158- If no clear label fits beyond these, say so instead of guessing.159160## Style rules161162- neutral, polite, concrete163- no emotional language, no blame, no fake certainty164- no unnecessary verbosity165- no tool-attribution footers in the body — use the attribution label instead