A report saying it does not work leaves maintainers guessing about the version, steps and expected result. An issue form asks for the information needed to reproduce the problem before submission. It improves the starting point but does not prove that the report is correct or complete. This lesson builds a short YAML form and then treats triage as a human decision supported by clear fields. GitHub documents issue forms as a changing feature, so check the current schema and your repository's form preview when adopting or extending the example.
Design questions around the next decision
Start by asking what a maintainer needs to do next. To reproduce a bug, they need the affected version, a small sequence of steps, the observed behavior and the expected behavior. Ask for those facts directly in familiar language. Avoid a large questionnaire whose answers do not influence triage. A user who cannot understand a field may supply invented detail just to get through the form, which makes the resulting report less useful.
Use a textarea when several lines or a sequence of commands are needed, an input for a short version string and a dropdown for a small maintained set of choices. Do not turn every optional diagnostic into a required field. Someone reporting a crash may not yet have a complete log or know the responsible component. Let them state uncertainty and ask a focused follow-up. The form should reduce avoidable ambiguity while keeping the reporting process accessible to people with different levels of technical knowledge.
Understand the YAML and resulting issue
Place the form in .github/ISSUE_TEMPLATE with a YAML extension and supply its name, description and body fields. Body items have supported types, attributes and optional validations. Give interactive elements stable unique ids that describe their meaning. In the example, version, reproduction and behavior form the report's core contract. A required setting ensures an answer is supplied at form submission; it does not validate every technical claim in that answer.
Form responses become Markdown in an ordinary issue body. The issue can later be edited, and issues created through other paths may not follow the same structure. Do not treat headings as a permanent database schema or assume that every issue has passed the form's UI validation. Automation that parses bodies should handle missing, edited or unexpected content deliberately. For critical workflow decisions, use supported structured platform data or explicit maintainer confirmation instead of relying only on fragile text splitting.
Connect labels and routing deliberately
The labels listed in a form should already exist in the repository. A nonexistent label is not automatically created simply because its name appears in the YAML. Create a small shared vocabulary such as bug, needs-triage and needs-information, then explain what transitions mean. Labels should help a maintainer find the next decision, not accumulate indefinitely as a history of every passing thought.
Projects and assignment are separate routing concerns. A form's project settings can have permission requirements that ordinary outside reporters do not meet. Use the documented project automation approach when it better fits your audience. Avoid assigning every new report to one person before anyone has checked scope or duplication. Review the rendered form and create one practice report to confirm labels, fields and any intended routing. Do that in a designated practice repository so the test does not pollute a production backlog.
Triage from evidence to a next action
First decide whether the report is in scope and whether it exposes private security information that belongs in the project's private reporting channel. Then check for duplicates, gather missing reproduction details and attempt the smallest reported case. A reproducible defect can move to confirmed; an incomplete report should receive one clear request for the missing information. Explain why that detail matters rather than repeatedly asking the reporter to provide more details without direction.
A confirmed issue is not automatically scheduled work. Separate reproducibility, impact, priority and ownership so the project can make a transparent planning decision. Link the pull request that addresses the report and verify the intended behavior before closing it. For duplicates, link the active report so the person can follow progress. Periodically review whether form questions actually reduce clarification cycles, and remove fields that do not help maintainers reach a decision.
Sources and prerequisites
Review templates, issues and projects. Consult the official issue-form syntax, form schema, template configuration and label management.
GitHub Issue Forms for Useful Reports and Triage Summary
- Ask for the information that enables the next triage decision.
- Required fields and existing labels improve reports without proving correctness.
- Keep completeness, reproduction, impact and scheduling as distinct decisions.
GitHub Issue Forms for Useful Reports and Triage Examples
Each example shows the code, the output it produces and what each part does.
A complete focused bug report form
Create bug and needs-triage labels first. Save this file as .github/ISSUE_TEMPLATE/bug.yml on the practice repository's default branch. The output fence summarizes an illustrative completed report and its intended initial labels; it is not a terminal transcript or a live issue created by this lesson.
A maintainer has a version and a small sequence to try. That is an improved starting point, not proof that the theme defect exists. Read the rendered preview, submit a practice report and verify the actual labels and issue body before relying on the form.
name: Reproducible bug report
description: Report a problem with enough detail to reproduce it.
title: "[Bug]: "
labels: [bug, needs-triage]
body:
- type: markdown
attributes:
value: Please use a small example and remove secrets from logs.
- type: input
id: version
attributes:
label: Affected version
placeholder: For example, 2.3.1
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Steps to reproduce
description: List the smallest sequence that shows the problem.
validations:
required: true
- type: textarea
id: behavior
attributes:
label: Expected and actual behavior
description: State what should happen and what happened instead.
validations:
required: trueInitial labels: bug, needs-triage
Affected version: 2.3.1
Steps to reproduce: Open settings, change the theme, reload.
Expected and actual behavior: The chosen theme should remain; it resets.GitHub Issue Forms for Useful Reports and Triage in Real Projects
Check an issue report for missing fields
Run this standalone Node.js exercise. It models a first completeness pass over structured report data and identifies one missing next-action field. It does not parse GitHub Markdown or make API changes. After adding reproduction steps, the same check should permit a reproduction attempt.
const report = {
version: '2.3.1',
reproduction: '',
behavior: 'The selected theme resets after reload.'
};
function missingFields(value) {
return ['version', 'reproduction', 'behavior']
.filter(key => typeof value[key] !== 'string' || !value[key].trim());
}
console.log('missing:', missingFields(report).join(','));
const complete = { ...report, reproduction: 'Change the theme and reload settings.' };
console.log('ready to attempt reproduction:', missingFields(complete).length === 0);
console.log('confirmed defect:', false);missing: reproduction
ready to attempt reproduction: true
confirmed defect: falseCompleteness permits the next step but does not establish correctness. A maintainer still has to reproduce the behavior and assess impact. Keep those states distinct when designing labels or automation so a well-filled form does not automatically become a confirmed high-priority defect.
GitHub Issue Forms for Useful Reports and Triage FAQ
Does required: true prove the report contains valid reproduction steps?
It requires a response through that form field, not a successful reproduction or a technically correct explanation. A user can enter vague text, and the resulting issue can be edited later. Review the actual steps and try the smallest case before confirming the defect. Use the form to gather useful starting information and keep the human reproduction decision visible in the triage process.
Why was a label in my form not added to the issue?
Check that the label already exists with the intended name in the repository and that the report was created through the expected form. The form does not automatically create missing labels. Inspect its YAML and the rendered issue, then test in a practice repository. Keep labels few and clearly defined so reporters and maintainers can understand what needs-triage or needs-information means.
Can issue forms replace pull request templates?
Issue forms apply to issue creation; pull requests have their own template mechanism. Use an issue form to gather a report and a pull request template to explain a proposed change and its verification. Link the two where appropriate. Avoid assuming that the same YAML form supplies a merge-review contract, and preserve the separate checks, reviewers and repository rules that govern contributions.
Should automation close every report with a missing field?
Usually begin with a focused request explaining which information is needed and why. Some reports come through APIs or later edits rather than the form, and a useful defect can still have an incomplete field. Choose an explicit project policy for inactivity or out-of-scope reports instead of treating a text-format mismatch as proof the problem is invalid. Keep respectful human judgment in the transition from report completeness to closure.
GitHub Issue Forms for Useful Reports and Triage Exercises
Answer each one and check it instantly. If you get stuck, open the hint before the answer.
Why does the practice program still print confirmed defect: false after completing the fields?
GitHub Issue Forms for Useful Reports and Triage Quiz
2 questions to check what you learned.
Where does the example issue form belong?
- Only inside .git/config
- .github/ISSUE_TEMPLATE/bug.yml
- Inside an arbitrary source-code comment
What should a focused needs-information response do?
- Demand every possible environment detail regardless of relevance
- Treat the report as a confirmed release blocker
- Ask for the specific missing detail needed for the next decision