Level 8: Real Issue Contribution
Every level before this one was curated. You built from source against a known-good baseline, you traced code paths someone chose for you, and you implemented labs with a known answer. Level 8 is different. Here you contribute to OpenSearch the way maintainers actually work: you find a real, open GitHub issue, reproduce it deterministically, root-cause it, fix it with a minimal diff, write the test that fails-then-passes, and open a Pull Request that meets merge quality.
There is no answer key. The issue may be mis-triaged. The "obvious" fix may be wrong. The repro may be flaky. That is the job. This level teaches you the loop that the rest of your contributor life runs on, and it deliberately hands you less scaffolding than any prior level.
Learning Objectives
By the end of Level 8 you must be able to:
- Find a tractable real issue in
opensearch-project/OpenSearchand judge whether it is in scope for you. - Build a deterministic reproducer (a failing JUnit test, or a
curl/REST-YAML sequence on./gradlew run) that fails onmainand will pass after the fix. - Separate the symptom (what the reporter saw) from the trigger conditions (what is actually required to provoke it).
- Implement a minimal-diff fix with the SPDX header,
spotlessApply, and aCHANGELOG.mdentry. - Open a merge-quality Pull Request: DCO sign-off (
git commit -s), a filled-in PR template, green CI, and a description a reviewer can act on. - Improve error messages and diagnostics as a focused, high-value contribution type.
The End-to-End Contribution Cycle (preview)
Everything in this level — and the Capstone — is one loop:
flowchart LR
F[Find issue<br/>good first issue / bug] --> R[Reproduce<br/>deterministic, fails on main]
R --> C[Root cause<br/>grep + read + debug]
C --> X[Fix<br/>minimal diff]
X --> T[Test<br/>fails-then-passes]
T --> P[PR<br/>DCO + CHANGELOG + template]
P --> CI[CI + review]
CI -->|changes requested| X
CI -->|approved| M[Merge + backport label]
The non-obvious truth: the reproducer, not the fix, is the center of gravity. A bug you can reproduce on demand is a bug you can fix with confidence; one you cannot is a guess. Maintainers look for the reproducer first. Lab 8.1 is entirely about building one.
How This Level Differs From Levels 1–7
| Earlier levels | Level 8 |
|---|---|
| Curated labs with a known answer | Real open issues, possibly mis-triaged |
| Code path chosen for you | You locate the code from a symptom |
| Repro provided | You build the repro from a bug report |
| "Make it compile / pass" | "Make a reviewer say yes" |
| No external stakes | A real PR, real CI, real maintainers |
You bring the skills from prior levels: reading the codebase (Level 1), the request/transport path (Levels 2–3), cluster state and allocation (Levels 4–5), the engine (Level 6), and search/aggs (Level 7). Level 8 is where they combine on a target you did not choose.
Finding a Tractable Issue
Browse github.com/opensearch-project/OpenSearch/issues and filter with these labels:
| Label | What it signals | Good for you now? |
|---|---|---|
good first issue | Maintainers vetted it as small and self-contained | Yes — start here |
help wanted | Maintainers want a contributor; may be larger | Sometimes |
bug | A defect with (ideally) a repro in the issue | Yes, if scoped |
flaky-test | A test that fails intermittently | Yes — see Level 9 / stage-9 |
enhancement | New behavior; needs design buy-in | Not yet (needs an RFC discussion) |
untriaged | Not yet reviewed by a maintainer | Risky — may be invalid |
GitHub search you can paste into the issues search box:
is:open is:issue label:"good first issue" repo:opensearch-project/OpenSearch
is:open is:issue label:bug label:"help wanted" sort:updated-desc
Triage checklist before you claim an issue:
- Read the entire thread. Is someone already assigned or has an open PR?
- Is the symptom described concretely enough to reproduce?
- Is it in a subsystem you can actually read (server core, not a separate plugin repo)?
- Is it small? A first contribution should touch a handful of files, not the coordination layer.
- Comment that you are investigating before you sink a day into it — avoid duplicate work.
Warning: Do not open a PR against an issue someone else is actively working. Check for linked PRs and recent comments. The community norm is: announce intent, then work.
The Deliverables of a Real PR
A merge-quality OpenSearch PR contains, at minimum:
| Artifact | Where | Why |
|---|---|---|
| Minimal code diff | server/ (or the relevant module) | The fix, with SPDX headers intact |
| A test that fails-then-passes | *Tests.java / *IT.java / *.yml | Proves the bug and guards regression |
CHANGELOG.md entry | one line under ## [Unreleased ...] | Required by precommit |
| DCO sign-off | every commit (git commit -s) | OpenSearch requires DCO, not a CLA |
| Filled PR template | .github/pull_request_template.md | Description, related issue, checklist |
| Green CI | GitHub Actions on the PR | precommit, tests, gradle check |
The labs in this level produce exactly these artifacts.
Key Practices
| Practice | What it means | Tooling |
|---|---|---|
| Repro first | Fail on main before you touch the fix | JUnit / curl / REST-YAML |
| Minimal diff | Change only what the bug requires | git diff, no drive-by reformat |
| Fails-then-passes test | Revert the fix → test red; apply → green | ./gradlew :server:test --tests ... |
| Run the gate locally | Don't burn CI to find a checkstyle nit | ./gradlew spotlessApply precommit |
| DCO sign-off | Signed-off-by: on every commit | git commit -s |
| One logical change | One issue, one PR | rebase, not bundle |
| CHANGELOG hygiene | Add/Changed/Fixed/Deprecated/Removed | edit CHANGELOG.md |
Labs
| Lab | Title | Output |
|---|---|---|
| 8.1 | Reproduce an Existing GitHub Issue | A deterministic reproducer that fails on main |
| 8.2 | Implement the Fix, Write the Test, Open the PR | A merge-quality PR with a fails-then-passes test |
| 8.3 | Improve Error Messages and Diagnostics | A diagnostics PR with a message-asserting unit test |
Deliverables
You must demonstrate all of the following before advancing to Level 9:
- A chosen real (or real-feeling) issue with a written triage note (scope, assignee check, plan).
-
A deterministic reproducer that fails on
main(Lab 8.1). - A minimal-diff fix and a fails-then-passes test (Lab 8.2).
-
A
CHANGELOG.mdentry and DCO-signed commits. - A PR (or a complete PR-ready branch + filled template, if not submitting upstream).
- One diagnostics improvement with a unit test asserting the new message (Lab 8.3).
Common Mistakes
| Mistake | Consequence | Fix |
|---|---|---|
| Fixing before reproducing | You "fix" the wrong thing; can't prove it | Build the repro first; it must fail on main |
| Test that passes before the fix | Proves nothing; reviewer rejects | Revert the fix and confirm the test goes red |
| Drive-by reformatting in the diff | Reviewer can't see the real change | Keep the diff minimal; reformat in a separate PR |
| Forgetting the CHANGELOG entry | precommit fails CI | Add the one-liner under [Unreleased] |
Forgetting git commit -s | DCO check blocks the PR | Sign off every commit (-s) |
| Bundling two fixes in one PR | Hard to review; stalls | One issue per PR |
Picking an enhancement as a first PR | Needs design buy-in; spins forever | Start with good first issue / bug |
Where This Level Points Next
- The full, graded version of this loop is the Capstone; Lab 8.1 maps onto Capstone Step 2: Reproduction and Lab 8.2 onto the implementation/PR steps.
- The issue roadmap sequences contribution types by difficulty; Lab 8.3 corresponds to Stage 3: Error Messages.
- Level 9 takes you into cross-repo and harder, release-relevant work.
- For PR etiquette and review, see PR quality and responding to feedback.