|
1 | | -# Good First Issue — Candidate Guidelines |
| 1 | +# Good First Issue — Candidate Guidelines |
| 2 | +**Hiero Python SDK** |
2 | 3 |
|
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 | +## How to Use This Document |
4 | 5 |
|
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 | +This guide is intended to support **maintainers and issue creators** who use the |
| 7 | +**`good first issue: candidate`** label. |
6 | 8 |
|
7 | | ---- |
| 9 | +It provides shared language and guidance to help: |
| 10 | + |
| 11 | +**Issue creators:** |
| 12 | +- Flag issues that *might* be a good starting point for new contributors |
| 13 | +- Identify where additional clarity or detail is needed |
| 14 | +- Prepare issues for promotion to a full Good First Issue |
8 | 15 |
|
9 | | -## Table of Contents |
| 16 | +**Maintainers:** |
| 17 | +- Protect the quality and trustworthiness of Good First Issues |
| 18 | +- Give issues time to be refined before promotion |
10 | 19 |
|
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) |
| 20 | +This document is not a strict rulebook, and it is not meant to limit what kinds of contributions are welcome. |
| 21 | +All contributions are valuable to the Hiero project. |
| 22 | + |
| 23 | +The **candidate** label simply helps ensure that Good First Issues offer a smooth and confidence-building first experience. |
15 | 24 |
|
16 | 25 | --- |
17 | 26 |
|
18 | | -## Why We Use a Candidate Label |
| 27 | +## What the Candidate Label Is For |
| 28 | + |
| 29 | +The **`good first issue: candidate`** label is used to mark issues that *appear* suitable for first-time contributors, but may still need a bit more clarity, polish, or confirmation before being promoted to a full **Good First Issue (GFI)**. |
19 | 30 |
|
20 | | -Labeling an issue as a **Good First Issue (GFI)** signals to new contributors that the issue is: |
| 31 | +It provides a safe “holding state” where maintainers can refine the issue without prematurely advertising it as ready for new contributors. |
21 | 32 |
|
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 |
| 33 | +The candidate label is **not** a softer or lower-quality GFI — it is a **preparation stage**. |
27 | 34 |
|
28 | | -However, **many issues are not ready for that label immediately**. |
| 35 | +--- |
| 36 | + |
| 37 | +## Why This Label Exists |
29 | 38 |
|
30 | | -They might have: |
31 | | -- ❗ Incomplete documentation |
32 | | -- ❗ Uncertainty if they are in fact a good first issue |
| 39 | +Some issues look small and approachable, but may still be missing: |
33 | 40 |
|
| 41 | +- Clear step-by-step instructions |
| 42 | +- Explicit file paths or locations |
| 43 | +- Well-defined acceptance criteria |
| 44 | +- Confidence about difficulty or scope |
34 | 45 |
|
35 | | -The **`good first issue: candidate`** label exists to: |
| 46 | +The candidate label helps signal: |
36 | 47 |
|
37 | | -| Purpose | Description | |
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 | |
| 48 | +> “This issue is close — it just needs a little more detail before it’s ready.” |
43 | 49 |
|
44 | | -The candidate label is **not a softer GFI** — it is a **holding state**. |
| 50 | +This protects the credibility of the Good First Issue label and helps ensure a positive experience for new contributors. |
45 | 51 |
|
46 | 52 | --- |
47 | 53 |
|
48 | 54 | ## When to Use `good first issue: candidate` |
49 | 55 |
|
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: |
| 56 | +Apply the **candidate** label when an issue appears suitable for a Good First Issue, but is **not fully ready yet**. |
51 | 57 |
|
52 | | -### ✅ Appears Potentially Suitable as a GFI |
| 58 | +### ✅ Potentially a Good First Issue |
53 | 59 |
|
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 |
| 60 | +The issue likely qualifies because: |
57 | 61 |
|
58 | | -Suitability can be assessed [GFIC Guidelines](https://github.com/hiero-ledger/hiero-sdk-python/blob/main/docs/maintainers/good_first_issues_guidelines.md) |
| 62 | +- The change appears small, localized, and low risk |
| 63 | +- The task fits within allowed GFI categories (documentation, examples, typing, or small mechanical edits) |
| 64 | +- The issue does not require exploration, investigation, or design decisions |
59 | 65 |
|
60 | | -### ✅ Requires Some Refinement |
| 66 | +Suitability can be evaluated using the |
| 67 | + |
| 68 | +[**Good First Issue Guidelines**](./good_first_issues_guidelines.md) |
| 69 | + |
| 70 | +--- |
| 71 | + |
| 72 | +### ✅ Needs Refinement Before Promotion |
61 | 73 |
|
62 | 74 | One or more of the following is still missing: |
63 | 75 |
|
64 | | -- ❗ Explicit step-by-step instructions |
65 | | -- ❗ Clearly defined acceptance criteria |
| 76 | +- Explicit step-by-step implementation instructions |
| 77 | +- Clear and objective acceptance criteria |
66 | 78 |
|
67 | | -### ✅ Difficulty is Uncertain |
| 79 | +At this stage, the issue may include partial notes, rough ideas, or reminders for maintainers to clarify later — and that’s okay. |
| 80 | + |
| 81 | +--- |
68 | 82 |
|
69 | | -Use the `good first issue: candidate` label when you believe it is a Good First Issue but are not sure |
| 83 | +### ✅ Difficulty Is Uncertain |
70 | 84 |
|
71 | | -- ✅ Requires maintainer approval |
| 85 | +Use the candidate label when: |
72 | 86 |
|
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) |
| 87 | +- The issue *seems* easy, but you are not fully confident |
| 88 | +- The scope or effort needs maintainer confirmation |
74 | 89 |
|
75 | | -If easy issues are not 'Good First Issues' are in fact 'beginner' issues. |
| 90 | +The candidate stage allows time to confirm that the issue is truly appropriate for first-time contributors. |
| 91 | + |
| 92 | +If an issue turns out to be more complex, it is usually better labeled as a **Beginner Issue** instead of a GFI. |
| 93 | + |
| 94 | +--- |
76 | 95 |
|
77 | 96 | ## What a Candidate Is NOT |
78 | 97 |
|
79 | | -The **candidate** label must **NOT** be used for issues that clearly do not qualify as GFIs. |
| 98 | +The candidate label is intended for issues that are potential Good First Issues but may need additional detail or scoping to be fully beginner-friendly. |
80 | 99 |
|
81 | 100 | ### ❌ Not for Issues Requiring Decisions |
82 | 101 |
|
83 | 102 | If a contributor must decide: |
84 | | -- *what* to change |
85 | | -- *how* something should behave |
86 | | -- *what* is correct or expected |
87 | 103 |
|
88 | | -→ the issue is **not** a candidate. |
| 104 | +- *What* should change |
| 105 | +- *How* something should behave |
| 106 | +- *What* is correct or expected |
| 107 | + |
| 108 | +Then the issue is **not** a candidate. |
| 109 | + |
| 110 | +--- |
89 | 111 |
|
90 | 112 | ### ❌ Not for Core or Behavioral Changes |
91 | 113 |
|
92 | | -Do **not** use the candidate label for changes involving: |
| 114 | +Do not use the candidate label for issues involving: |
93 | 115 |
|
94 | | -- SDK or protocol behavior |
95 | | -- Public APIs or contracts |
96 | | -- `to_proto` / `from_proto` logic |
97 | | -- Serialization, deserialization, or networking |
| 116 | +- SDK or protocol behavior |
| 117 | +- Public APIs or contracts |
| 118 | +- `to_proto` / `from_proto` logic |
| 119 | +- Serialization, deserialization, or networking |
| 120 | + |
| 121 | +--- |
98 | 122 |
|
99 | 123 | ### ❌ Not for Exploratory or Blocked Work |
100 | 124 |
|
101 | | -- Investigations or debugging tasks |
102 | | -- Issues dependent on other PRs or decisions |
103 | | -- Work requiring domain or protocol knowledge |
| 125 | +Avoid using the candidate label for: |
| 126 | + |
| 127 | +- Investigations or debugging tasks |
| 128 | +- Issues blocked on other PRs or decisions |
| 129 | +- Work requiring domain or protocol knowledge |
104 | 130 |
|
105 | | -> ⚠️ If an issue clearly does *not* meet GFI criteria, **do not label it as a candidate**. |
| 131 | +> ⚠️ If an issue clearly does *not* meet Good First Issue criteria, |
| 132 | +> do **not** label it as a candidate. |
106 | 133 | > The candidate label is for issues that *might* qualify after refinement — not for issues that never will. |
107 | 134 |
|
108 | 135 | --- |
109 | 136 |
|
110 | | -## Promoting a Candidate to GFI |
| 137 | +## Promoting a Candidate to Good First Issue |
111 | 138 |
|
112 | | -A candidate may be promoted to a full **Good First Issue** only when **all** of the following are true. |
| 139 | +An issue should only be promoted to a full **Good First Issue** once it is clearly ready for first-time contributors. |
113 | 140 |
|
114 | 141 | ### ✅ Readiness Checklist |
115 | 142 |
|
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 |
| 143 | +Before promoting an issue to Good First Issue, consider checking whether: |
| 144 | + |
| 145 | +- [ ] The problem is clearly described and easy to understand for someone new to the project. |
| 146 | +- [ ] The solution is **explicitly specified** |
| 147 | +- [ ] The change is small, localized, and low risk |
| 148 | +- [ ] The issue touches a single file or clearly defined location |
| 149 | +- [ ] Acceptance criteria are objective and complete |
| 150 | +- [ ] No interpretation, investigation, or initiative is required |
| 151 | + |
| 152 | +--- |
122 | 153 |
|
123 | 154 | ### 🔁 Promotion Process |
124 | 155 |
|
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 |
| 156 | +1. Review the issue against the [**Good First Issue Guidelines**](./good_first_issues_guidelines.md) |
| 157 | +2. Add missing details, steps, and acceptance criteria |
| 158 | +3. Remove the `good first issue: candidate` label |
| 159 | +4. Apply the **Good First Issue** label |
| 160 | + |
| 161 | +There is no rush — taking the time to refine an issue is part of creating a welcoming and supportive community. |
| 162 | + |
| 163 | +--- |
| 164 | + |
| 165 | +## The Big Picture |
| 166 | + |
| 167 | +The **Good First Issue — Candidate** label helps make the Hiero Python SDK accessible and friendly for everyone — especially new contributors. |
129 | 168 |
|
| 169 | +All contributions are welcome. |
| 170 | +This label simply helps highlight the best place to begin. |
130 | 171 |
|
0 commit comments