|
1 | 1 | # Good First Issue — Candidate Guidelines |
2 | 2 |
|
3 | | -This document explains the purpose of the **`good first issue: candidate`** label, when to use it, and when an issue should be promoted to a full **Good First Issue**. |
| 3 | +This document defines the purpose and usage of the **`good first issue: candidate`** label, and explains when and how an issue may be promoted to a full **Good First Issue (GFI)**. |
| 4 | + |
| 5 | +The candidate label exists to protect the quality and trustworthiness of **Good First Issues** by ensuring issues are **fully specified, low-risk, and mechanically solvable** before being promoted. |
| 6 | + |
| 7 | +--- |
4 | 8 |
|
5 | 9 | ## Table of Contents |
6 | 10 |
|
7 | | -- [Why We Use a "Candidate" Label](#-why-we-use-a-candidate-label) |
8 | | -- [When to Use the Candidate Label](#️-when-to-use-good-first-issue-candidate) |
9 | | -- [What a Candidate Is NOT](#-what-a-candidate-is-not) |
10 | | -- [Promoting a Candidate to GFI](#-promoting-a-candidate-to-gfi) |
11 | | -- [Workflow Summary](#-workflow-summary) |
12 | | -- [Important Considerations](#important-considerations) |
| 11 | +- [Why We Use a Candidate Label](#why-we-use-a-candidate-label) |
| 12 | +- [When to Use `good first issue: candidate`](#when-to-use-good-first-issue-candidate) |
| 13 | +- [What a Candidate Is NOT](#what-a-candidate-is-not) |
| 14 | +- [Promoting a Candidate to GFI](#promoting-a-candidate-to-gfi) |
13 | 15 |
|
14 | 16 | --- |
15 | 17 |
|
16 | | -## 🎯 Why We Use a "Candidate" Label |
| 18 | +## Why We Use a Candidate Label |
17 | 19 |
|
18 | 20 | Labeling an issue as a **Good First Issue (GFI)** signals to new contributors that the issue is: |
19 | 21 |
|
20 | | -- ✅ **Well-scoped** — clear boundaries and deliverables |
21 | | -- ✅ **Low risk** — minimal chance of breaking changes |
22 | | -- ✅ **Clearly defined** — unambiguous requirements |
23 | | -- ✅ **Ready to be picked up** — with minimal guidance needed |
| 22 | +- ✅ Small and well-scoped |
| 23 | +- ✅ Low risk |
| 24 | +- ✅ Fully specified |
| 25 | +- ✅ Safe for first-time contributors |
| 26 | +- ✅ Ready to be picked up without interpretation or initiative |
| 27 | + |
| 28 | +However, **many issues are not ready for that label immediately**. |
| 29 | + |
| 30 | +They might have: |
| 31 | +- ❗ Incomplete documentation |
| 32 | +- ❗ Uncertainty if they are in fact a good first issue |
24 | 33 |
|
25 | | -However, **not all issues start in that state**. |
26 | 34 |
|
27 | 35 | The **`good first issue: candidate`** label exists to: |
28 | 36 |
|
29 | 37 | | Purpose | Description | |
30 | | -|---------|-------------| |
31 | | -| 🚫 **Avoid premature labeling** | Prevent issues from being labeled as GFIs before they're ready | |
32 | | -| 🔍 **Allow refinement time** | Give maintainers space to clarify scope and requirements | |
33 | | -| 📊 **Set accurate expectations** | Ensure new contributors know exactly what to do | |
34 | | -| 📋 **Create a clear pipeline** | Establish a workflow for curating high-quality GFIs | |
| 38 | +|--------|-------------| |
| 39 | +| 🚫 Avoid premature labeling | Prevent partially defined or misclassified issues from being advertised as GFIs | |
| 40 | +| 🧭 Enforce quality standards | Ensure GFIs meet strict “no interpretation required” criteria | |
| 41 | +| 🛠 Allow refinement time | Give maintainers space to fully specify scope and solution | |
| 42 | +| 📋 Create a clear pipeline | Establish a safe promotion path to GFI | |
35 | 43 |
|
36 | | -This approach helps us prioritize **quality over quantity** when advertising beginner-friendly work. |
| 44 | +The candidate label is **not a softer GFI** — it is a **holding state**. |
37 | 45 |
|
38 | 46 | --- |
39 | 47 |
|
40 | | -## 🏷️ When to Use `good first issue: candidate` |
| 48 | +## When to Use `good first issue: candidate` |
41 | 49 |
|
42 | | -Apply the **candidate** label when an issue: |
| 50 | +Apply the **candidate** label when you believe the issue is a good first issue, not documented enough, or have some doubt with its difficulty: |
43 | 51 |
|
44 | | -### ✅ Fits the General Criteria |
| 52 | +### ✅ Appears Potentially Suitable as a GFI |
45 | 53 |
|
46 | | -- *Might* be suitable as a GFI based on initial assessment |
47 | | -- Fits within the [allowed categories](./good_first_issues_guidelines.md#allowed-categories) of GFI work |
48 | | -- Appears to be small in scope and low risk |
| 54 | +- The change is *likely* small, localized, and low risk |
| 55 | +- The issue fits within the **allowed GFI categories** (docs, examples, typing, small mechanical edits) |
| 56 | +- The issue is *not* exploratory and does *not* require design decisions |
49 | 57 |
|
50 | | -### ⏳ Still Needs Work |
| 58 | +Suitability can be assessed [here](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/docs/maintainers/good_first_issues_guidelines.md) |
51 | 59 |
|
52 | | -- **Needs clarification** — requirements are ambiguous or incomplete |
53 | | -- **Needs refinement** — scope could be narrowed or better defined |
54 | | -- **Needs confirmation** — maintainer review required to verify suitability |
55 | | -- **Needs acceptance criteria** — clear success conditions not yet defined |
| 60 | +### ✅ Requires Some Refinement |
56 | 61 |
|
57 | | -### 📝 Example Scenarios |
| 62 | +One or more of the following is still missing: |
58 | 63 |
|
59 | | -| Scenario | Why Use Candidate? | |
60 | | -|----------|-------------------| |
61 | | -| User reports a documentation gap | Needs scoping to determine exact changes required | |
62 | | -| Bug in example code identified | Need to confirm it's isolated and straightforward to fix | |
63 | | -| Type annotation improvement suggested | Need to verify it doesn't affect runtime behavior | |
64 | | -| Test assertion missing | Need to confirm it extends existing tests only | |
| 64 | +- ❗ Explicit step-by-step instructions |
| 65 | +- ❗ Clearly defined acceptance criteria |
65 | 66 |
|
66 | | ---- |
67 | | - |
68 | | -## 🚦 What a Candidate Is NOT |
| 67 | +### ✅ Difficulty is Uncertain |
69 | 68 |
|
70 | | -The **candidate** label should **NOT** be used for: |
| 69 | +Use the `good first issue: candidate` label when you believe it is a Good First Issue but are not sure |
71 | 70 |
|
72 | | -### ❌ Large or Cross-Cutting Changes |
| 71 | +- ✅ Requires maintainer approval |
73 | 72 |
|
74 | | -Issues that span multiple modules, packages, or require architectural understanding. |
| 73 | +Check by reading good first issue guidelines [here](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/docs/maintainers/good_first_issues_guidelines.md) |
75 | 74 |
|
76 | | -### ❌ Core Protocol or SDK Logic |
| 75 | +If easy issues are not 'Good First Issues' are in fact 'beginner' issues. |
77 | 76 |
|
78 | | -Changes to: |
79 | | -- `to_proto` / `from_proto` methods |
80 | | -- Serialization/deserialization logic |
81 | | -- Network or wire-level behavior |
| 77 | +## What a Candidate Is NOT |
82 | 78 |
|
83 | | -### ❌ Exploratory or Investigative Work |
| 79 | +The **candidate** label must **NOT** be used for issues that clearly do not qualify as GFIs. |
84 | 80 |
|
85 | | -Issues where the solution path is unclear or requires research. |
| 81 | +### ❌ Not for Issues Requiring Decisions |
86 | 82 |
|
87 | | -### ❌ Blocked Issues |
| 83 | +If a contributor must decide: |
| 84 | +- *what* to change |
| 85 | +- *how* something should behave |
| 86 | +- *what* is correct or expected |
88 | 87 |
|
89 | | -Issues that depend on external decisions, other PRs, or upstream changes. |
| 88 | +→ the issue is **not** a candidate. |
90 | 89 |
|
91 | | ---- |
| 90 | +### ❌ Not for Core or Behavioral Changes |
92 | 91 |
|
93 | | -> ⚠️ **Important:** If an issue clearly does *not* meet GFI criteria, it should **not** be labeled as a candidate either. The candidate label is for issues that *might* qualify, not for issues that definitely won't. |
94 | | -
|
95 | | ---- |
| 92 | +Do **not** use the candidate label for changes involving: |
96 | 93 |
|
97 | | -## ✨ Promoting a Candidate to GFI |
| 94 | +- SDK or protocol behavior |
| 95 | +- Public APIs or contracts |
| 96 | +- `to_proto` / `from_proto` logic |
| 97 | +- Serialization, deserialization, or networking |
98 | 98 |
|
99 | | -A candidate should be promoted to a full **Good First Issue** when: |
| 99 | +### ❌ Not for Exploratory or Blocked Work |
100 | 100 |
|
101 | | -### Readiness Checklist |
| 101 | +- Investigations or debugging tasks |
| 102 | +- Issues dependent on other PRs or decisions |
| 103 | +- Work requiring domain or protocol knowledge |
102 | 104 |
|
103 | | -- [ ] **Clear description** — the problem and solution are well-defined |
104 | | -- [ ] **Scoped appropriately** — changes are localized and low-risk |
105 | | -- [ ] **Acceptance criteria defined** — clear conditions for success |
106 | | -- [ ] **Documentation linked** — relevant guides are referenced |
107 | | -- [ ] **No blockers** — no dependencies on other work |
108 | | -- [ ] **Maintainer approved** — a maintainer has reviewed and confirmed suitability |
109 | | - |
110 | | -### Promotion Process |
111 | | - |
112 | | -1. **Review the candidate issue** against [GFI guidelines](./good_first_issues_guidelines.md) |
113 | | -2. **Add missing details** — clarify requirements, add acceptance criteria |
114 | | -3. **Remove `good first issue: candidate`** label |
115 | | -4. **Add `Good First Issue`** label |
116 | | -5. **Optionally notify** in comments that the issue is ready for contributors |
117 | | - |
118 | | ---- |
119 | | - |
120 | | -## 📊 Workflow Summary |
121 | | - |
122 | | -``` |
123 | | -┌─────────────────────────────────────────────────────────────┐ |
124 | | -│ Issue Created │ |
125 | | -└─────────────────────────────────────────────────────────────┘ |
126 | | - │ |
127 | | - ▼ |
128 | | -┌─────────────────────────────────────────────────────────────┐ |
129 | | -│ Initial Assessment by Maintainer │ |
130 | | -│ │ |
131 | | -│ Is this potentially a Good First Issue? │ |
132 | | -│ │ |
133 | | -│ • Small scope? │ |
134 | | -│ • Low risk? │ |
135 | | -│ • Fits allowed categories? │ |
136 | | -└─────────────────────────────────────────────────────────────┘ |
137 | | - │ |
138 | | - ┌───────────────┼───────────────┐ |
139 | | - │ │ │ |
140 | | - ▼ ▼ ▼ |
141 | | - ┌────────┐ ┌──────────┐ ┌──────────┐ |
142 | | - │ No │ │ Maybe │ │ Yes │ |
143 | | - └────────┘ └──────────┘ └──────────┘ |
144 | | - │ │ │ |
145 | | - ▼ ▼ ▼ |
146 | | - ┌─────────────────┐ ┌───────────────┐ ┌───────────────┐ |
147 | | - │ Label normally │ │ Label as │ │ Label as │ |
148 | | - │ (not GFI) │ │ `candidate` │ │ Good First │ |
149 | | - │ │ │ │ │ Issue │ |
150 | | - └─────────────────┘ └───────────────┘ └───────────────┘ |
151 | | - │ |
152 | | - ▼ |
153 | | - ┌─────────────────┐ |
154 | | - │ Refine & Review │ |
155 | | - │ │ |
156 | | - │ • Add details │ |
157 | | - │ • Define scope │ |
158 | | - │ • Set criteria │ |
159 | | - └─────────────────┘ |
160 | | - │ |
161 | | - ▼ |
162 | | - ┌─────────────────┐ |
163 | | - │ Promote to GFI │ |
164 | | - │ when ready │ |
165 | | - └─────────────────┘ |
166 | | -``` |
| 105 | +> ⚠️ If an issue clearly does *not* meet GFI criteria, **do not label it as a candidate**. |
| 106 | +> The candidate label is for issues that *might* qualify after refinement — not for issues that never will. |
167 | 107 |
|
168 | 108 | --- |
169 | 109 |
|
170 | | -## Important Considerations |
| 110 | +## Promoting a Candidate to GFI |
171 | 111 |
|
172 | | -### Why This Matters |
| 112 | +A candidate may be promoted to a full **Good First Issue** only when **all** of the following are true. |
173 | 113 |
|
174 | | -1. **Good First Issues are automatically promoted** by GitHub and Hiero, making them highly visible to potential contributors worldwide |
| 114 | +### ✅ Readiness Checklist |
175 | 115 |
|
176 | | -2. **New contributors trust the GFI label** — they expect issues to be ready and achievable |
| 116 | +- [ ] The problem is clearly described |
| 117 | +- [ ] The solution is **explicitly specified** |
| 118 | +- [ ] The change is small, localized, and low risk |
| 119 | +- [ ] The issue touches a single file or clearly defined location |
| 120 | +- [ ] Acceptance criteria are defined and objective |
| 121 | +- [ ] No interpretation or initiative is required |
177 | 122 |
|
178 | | -3. **Poorly scoped GFIs waste contributor time** — and can discourage future contributions |
| 123 | +### 🔁 Promotion Process |
179 | 124 |
|
180 | | -4. **Quality GFIs build community** — successful first contributions lead to long-term contributors |
181 | | - |
182 | | -### Best Practices |
183 | | - |
184 | | -| Do | Don't | |
185 | | -|----|-------| |
186 | | -| ✅ Use candidate for uncertain issues | ❌ Rush issues to GFI status | |
187 | | -| ✅ Take time to refine candidates | ❌ Label obviously unsuitable issues as candidates | |
188 | | -| ✅ Add clear acceptance criteria before promotion | ❌ Promote candidates without review | |
189 | | -| ✅ Link to relevant documentation | ❌ Assume contributors know the codebase | |
190 | | - |
191 | | ---- |
| 125 | +1. Review the issue against the **Good First Issue Guidelines** [here](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/docs/maintainers/good_first_issues_guidelines.md) |
| 126 | +2. Add missing details, steps, and acceptance criteria |
| 127 | +3. Remove the `good first issue: candidate` label |
| 128 | +4. Add the **Good First Issue** label |
192 | 129 |
|
193 | | -## Additional Resources |
194 | 130 |
|
195 | | -- [Good First Issue Guidelines](./good_first_issues_guidelines.md) — what qualifies as a GFI |
196 | | -- [Contributing Guide](../../CONTRIBUTING.md) — how to contribute |
197 | | -- [DCO Signing Guide](../sdk_developers/signing.md) — commit signing requirements |
198 | | -- [Discord Community](../discord.md) — get help from the community |
199 | | -- [Community Calls](https://zoom-lfx.platform.linuxfoundation.org/meetings/hiero?view=week) — weekly office hours |
0 commit comments