Open-Source Issue Finder 🚀: ClaimScout GitHub Triage
Discover the open-source issue finder ClaimScout—deterministic GitHub issue triage with optional open-weight AI ranking. See the code & improve contributions.

ClaimScout: A More Practical Way to Find Open-Source Issues
Finding an open-source issue to work on sounds straightforward: pick a repository, open the issue tracker, and grab a bug. In practice, the "best" candidate is often already assigned, buried under weeks of back-and-forth, too vague to reproduce, or large enough that it turns into a multi-week project all by itself. You can spend an evening hunting and still end up with nothing you can realistically contribute.
ClaimScout is meant to cut that wasted time. It scans selected repositories and filters for issues that look unassigned, low-traffic, and actionable. If you want, an optional open-weight model then ranks the remaining shortlist based on a contributor's skills. The key design choice is that the model doesn't decide what's claimable - simple, testable Python filters do that first.
This article walks through how ClaimScout works, why the deterministic-plus-model split matters, and when open-weight inference actually makes sense. It also covers the tool's limits and a workflow you can use to figure out whether an issue is worth your time. The project's code and demo are available in the ClaimScout GitHub repository.
The problem is issue discovery, not a lack of issues
Open-source projects are rarely short on open issues. The real problem is finding one that's both available and genuinely workable for your skills and time.
Just listing issues doesn't tell you whether someone is already handling the ticket, whether the discussion has effectively resolved it, or whether the title is hiding a major architectural change. Labels help, but they're inconsistent across repositories - what "good first issue" means in one place might be totally different in another. And even when an issue is labeled well, it still might not be small, well-defined, or currently wanted by maintainers.
There's also a practical cost: time. A contributor might be trying to land their first merged pull request, build a portfolio, prep for a hackathon, or investigate something tied to a bug bounty. In those cases, spending hours on a stale issue or something already claimed is time you could have spent building something that ships. The author of ClaimScout describes losing days to this exact kind of searching before building the tool for their own workflow.
What makes an issue worth investigating?
"Worth your time" isn't the same for everyone. It depends on your skills, what the project expects, and how much uncertainty you're willing to absorb. Still, a first-pass shortlist can weed out common dead ends:
- The item is an issue, not a pull request.
- No contributor is listed as an assignee.
- The discussion hasn't grown beyond a configured comment limit.
- Labels don't indicate a broad roadmap item, epic, or spike.
- The author isn't identified as a bot.
- The issue has useful signals (for example, a bug report, help-wanted label, or a recent unlabelled report).
None of these checks prove the issue is "available" in the social sense. A maintainer might be working on it elsewhere, or a contributor might be preparing a fix without formal assignment. But these filters do reduce the noise and give you a set of candidates you can actually verify.
That distinction matters. ClaimScout isn't a replacement for reading the thread or talking to maintainers. It's a way to avoid manually scanning every item in the tracker until you reach the ones that deserve attention.
How ClaimScout turns a repository into a shortlist
The core scanner is a small Python command-line tool. The project describes it as about 250 lines of dependency-free Python using the standard library, with Python 3.9 or later. You point it at repositories you care about, and it returns the issues that pass its filters.
A sample command is:
claimscout scan --repos 0dotxyz/marginfi-v2
The example output includes a short list of issues that look unclaimed, along with details like issue number, comment count, creation date, title, and labels. In the documented run, the scanner found ten claimable candidates in that repository. The output is helpful because it gives you evidence to inspect, not just a vague "trust me" recommendation.
Filtering before ranking
The scanner runs in a deliberate order. It removes pull requests, assigned issues, anything over the configured comment limit, architecture-oriented work, and bot-authored reports. Then it applies actionability signals using labels and recency. In other words, the first stage is filtering - not an AI judgment.
This also creates a clear contract: for a given input and configuration, the same ordinary code runs the same rules. You can inspect those rules, adjust thresholds, and even test them. If you only want issues with no comments, for example, you can set the maximum comment count to zero.
After that, you can send the shortlist to a separate ranking command. The project's example uses a skill profile containing Rust, Anchor, Solana, and security:
claimscout scan --repos 0dotxyz/marginfi-v2 --max-comments 0 --json \
| claimscout-rank --profile "rust,anchor,solana,security"
In the documented run, the ranker put issues #682 and #705 at the top. The author then opened pull requests for those two bugs. That's a concrete result from the project's own testing, not proof that ranking will work the same way for every contributor or every repository. Still, it's a useful distinction: the workflow helped its builder, and you should still do your own check.
The output is a starting point, not permission to claim an issue
"Unassigned" is a tracker field, not a promise from maintainers that nobody else is working on the problem. Before you write a substantial patch, read the discussion, reproduce the behavior, check recent activity, and follow the project's contribution guidance. If the fix isn't clear, ask first - don't spend days coding in the dark.
That's where a tight shortlist helps. Instead of pretending you can automate the human parts of contributing, ClaimScout narrows the search so you can spend more time on context, reproduction, and communication.
Why the model only ranks the results
ClaimScout splits deterministic filtering from model-based ranking. The model doesn't fetch issues, determine whether they're assigned, or run a multi-step tool loop. It takes an already-filtered shortlist and makes a single stateless request to return a ranked JSON array based on the contributor's profile.
This boundary matches a practical lesson from working with smaller models: multi-step agent loops can fail in subtle ways that are hard to catch. A model might call tools multiple times, stop early, and still produce something that looks "successful." If you asked the model to own the entire process, a simple task would become harder to test and debug.
In this setup, the two stages have different jobs:
- Code handles facts and rules. Filtering is structured logic with clear conditions. Python can apply those conditions consistently and test them.
- The model handles comparison. Matching a shortlist against a profile involves interpretation and relevance estimates. That's a reasonable place for a language model - as long as you treat the result as advisory.
This isn't a claim that deterministic code is always better than AI. It's an allocation decision. If a problem has explicit rules, keep them inspectable. If interpretation adds value, use a model - but don't put predictable decisions into it.
A single call still needs defensive handling
Even though the ranker is "one call," you still shouldn't treat model output as reliable by default. In an early live test, the ranker returned a Python code block instead of the requested JSON. That isn't something to wave away as an edge case: downstream code can't safely assume a model will always follow formatting instructions.
ClaimScout handles this by stripping code fences, extracting an array when the output is wrapped in prose, and attempting one stricter JSON-only retry before giving up. The project also includes tests for parsing and prompt construction cases, along with its triage filter. Those 19 standard-library unit tests are a useful signal: small enough to review, but focused on failures the author actually hit.
The broader point is simple: test the model boundary like you'd test any other integration. Define what "valid output" means, handle common deviations, and fail clearly when recovery doesn't work. Don't turn a malformed response into a confident ranking just because the command still needs to return something.
When open-weight AI makes the economics work
The model used for ranking is optional. By default, ClaimScout uses meta/llama-3.2-11b through NVIDIA's OpenAI-compatible endpoint, and it can also work with compatible servers like Ollama or vLLM. That flexibility is helpful if you want to choose between a hosted endpoint and running inference in an environment you control.
The cost argument here is specific. ClaimScout is designed to run repeatedly while you look for contribution opportunities. If every scan required a paid hosted-model call, the total cost could get hard to justify - especially if you're chasing a small bounty or trying to find your first real issue. Keeping ranking optional, and separate from scanning, avoids turning inference into a required expense for every run.
Open-weight models can also support a privacy option. The tool uses repository information and a skill profile. If you run inference locally, the ranking request doesn't have to go to a third-party model provider. If you use a hosted endpoint, your data gets sent to that service, so you should check their policies before deciding whether it's appropriate to share repository details or personal skill information. "Open-weight" doesn't automatically mean "private" - how you deploy it determines where the data goes.
There's also a development upside. The author can observe the model's real formatting behavior and build the parser and retry logic around the failures they actually see. A closed API can still work, but it may offer less visibility into formatting quirks and can make cost, data handling, and provider behavior harder to control.
The trade-off is operational responsibility
Running an open-weight model isn't free, at least not in the practical sense. A local setup means compatible hardware or infrastructure, model downloads, configuration, and ongoing maintenance. A hosted endpoint lowers that operational burden, but adds a provider dependency and potentially per-request costs. The right choice depends on how often you scan, privacy needs, latency, and what hardware you already have.
And if you just need a small ranking help, you can always skip the model. If your shortlist is small or your skill match is obvious, deterministic filtering may be enough. The important design property is that ranking is optional: the project doesn't require an AI call just to identify candidates.
A practical workflow and its limits
A tool can speed up issue discovery without making contribution "automatic." A good workflow keeps the human checks that protect both your time and the project.
- Choose repositories deliberately. Start with projects you understand, use, or actually want to learn. A "technically good" issue in a repository you don't care about may still waste your time.
- Run the scanner with explicit thresholds. Start conservative with the comment limit and inspect what it returns. A zero-comment threshold can remove a lot of discussion-heavy noise, but it can also filter out issues where maintainers already clarified the scope.
- Use ranking as a sorting aid. Provide a concise, honest skill profile. The model can help order candidates, but it can't validate your experience or tell you the real complexity of a patch.
- Verify the issue manually. Read the full thread, check whether the problem reproduces, look at related code and recent commits, and review the repository's contribution guidelines.
- Communicate before committing. If ownership or the intended behavior is unclear, ask maintainers whether your contribution would be useful. An unassigned issue isn't a guarantee that a pull request will be accepted.
- Start with a bounded change. Confirm expected behavior with a test or a reproducible case. Keep the patch scoped and easy for a maintainer to review.
The tool's known limits follow from how it's designed. Labels and comment counts are imperfect proxies for issue quality. A low-traffic bug might be hard to reproduce, and a popular issue can still be a great contribution. Bot detection based on usernames will miss some automation and can't understand every project's workflow. Skill matching from issue text is only an estimate - it isn't a competence check.
The same caution applies to the author's success example. ClaimScout surfaced two issues that led to pull requests for its builder. That's meaningful evidence that the tool helped the first user, but it doesn't prove a universal success rate or guarantee merged PRs. The value proposition is narrower and more realistic: spend less time sorting tracker noise, then use your judgment to decide what's worth pursuing.
To try the project, follow the installation and usage instructions in the repository. There's also an executable demo at ./examples/demo.sh, so you can inspect a real run instead of relying only on screenshots or a walkthrough.
Conclusion
ClaimScout is a small tool built around a practical boundary: deterministic code filters issues, and an optional open-weight model ranks the shortlist. That keeps the core discovery logic testable, while using AI only where interpretation might help. It also avoids making paid inference a prerequisite for every scan.
The important point isn't that a ranking guarantees someone will merge your pull request. The output is simply a shorter, more relevant list to investigate. If you regularly lose time to stale, claimed, or poorly scoped issues, try the ClaimScout demo and source, review the filters, and see whether the workflow fits the repositories you contribute to. Keep the final decision human: verify the issue, confirm the scope, and make sure the project actually wants the change.