Ten real repos with open issues shaped for loops: failing tests, lint debt, type errors, formatting bugs — outcomes a script can check. How to pick: smallest mechanically-checkable task wins. An issue you can verify with one command beats an interesting one you can't. Not sure your pick qualifies? Run it through verifiers/good-vs-bad.md. Clone, run the setup line, and confirm your verifier fails before you start the loop. A verifier that fails first and passes after is proof the loop did something.
Issue counts were checked July 2026. Counts drift; the label links stay current. Read each repo's CONTRIBUTING.md before opening a PR — a loop that ships an unwanted PR is spam.
Simplified man pages. Thousands of Markdown files, one strict style guide.
- Why it loops: every page is independent. Style violations and missing examples are mechanically detectable — the lint suite is the spec. The easiest first loop in this list.
- Issues: help wanted (188 open at last check)
- Setup:
npm ci - Verifier:
npm test(runs tldr-lint and markdownlint over every page)
The Python type checker. Pure Python, pip-installable dev environment.
- Why it loops: bug reports arrive as minimal code samples with expected-vs-actual output, and the test suite is data-driven
.testfiles. Turn the report into a failing test case, loop until green. - Issues: good-first-issue (9 open at last check)
- Setup:
python3 -m pip install -r test-requirements.txt - Verifier:
python3 -m pytest -q -n0 -k <your_test_case>
Computer algebra in pure Python. pip install -e . and you're running.
- Why it loops: most issues are "this expression evaluates wrong." Write the failing assert first — that assert is your exit condition.
- Issues: Easy to Fix (54 open at last check)
- Setup:
python3 -m pip install -e . && python3 -m pip install pytest - Verifier:
python3 -m pytest sympy/<module>/tests -q -k <case>
The Python linter. False positives are its most common bug class.
- Why it loops: checker behavior is pinned by functional test files with golden expected output. A false-positive fix is: add the input, loop until the golden output matches.
- Issues: Good first issue (16 open at last check)
- Setup:
python3 -m pip install -e . && python3 -m pip install -r requirements_test.txt - Verifier:
python3 -m pytest tests/test_functional.py -k <checker_name>
The documentation generator behind most of Python's docs.
- Why it loops: builder and directive bugs reproduce as small test projects inside the pytest suite. Targeted runs are fast.
- Issues: good first issue (13 open at last check)
- Setup:
python3 -m pip install -e ".[test]" - Verifier:
python3 -m pytest tests -q -k <name>
The code formatter. Formatting bugs are the purest loop food there is.
- Why it loops: the entire test suite is Jest snapshots — input file in, formatted output compared against a golden file. Add the failing input, loop until the snapshot is right.
- Issues: help wanted (50 open at last check)
- Setup:
yarn install - Verifier:
yarn test tests/format/<language>(path filter keeps it under 30s; full suite is slow)
The virtual whiteboard. React + TypeScript, vitest, strict typecheck.
- Why it loops: UI bugs come with reproduction steps, and the repo enforces
tscclean plus a unit suite — a ready-made composite verifier. - Issues: good first issue (35 open at last check)
- Setup:
yarn - Verifier:
yarn test:typecheck && yarn test:app --watch=false
The Python linter and formatter, written in Rust. cargo is the whole toolchain.
- Why it loops: every lint rule is snapshot-tested (insta). Rule bugs and new-rule requests reduce to: fixture in, snapshot out, loop until it matches.
- Issues: help wanted (26 open at last check)
- Setup:
cargo build(first build takes a few minutes; after that, fast) - Verifier:
cargo test -p ruff_linter
A shell where pipelines carry structured data instead of text.
- Why it loops: commands are small, self-contained, and individually tested. Command bugs have one-line reproductions you can paste straight into a test.
- Issues: good first issue (12 open at last check)
- Setup:
cargo build(first build takes a few minutes) - Verifier:
cargo test -p nu-command
The compiler itself. Heavier than the rest — take it if you want the fight.
- Why it loops: thousands of baseline tests; a compiler bug is a
.tsinput plus expected diagnostics. Targeted test runs take seconds even though the full suite takes an hour. - Issues: good first issue (12 open at last check; Help Wanted has ~900 more)
- Setup:
npm ci - Verifier:
npx hereby runtests --tests=<regex>
Picked one? Go back to README.md, write the loop, and make the verifier the exit condition — not your judgment.