MSc thesis · Research
TIGER
Master's thesis · University of Illinois Chicago · 2025
Can an LLM write correct, maintainable code when it only sees what a developer would see: documentation, signatures and tests, but never the original implementation? TIGER answers that with a loop that behaves like a developer running the test suite.
- open-source Python repositories
- 10open-source Python repositories
- success rate vs one-shot, at best
- +30%success rate vs one-shot, at best
- iterations on average to pass
- 1.9iterations on average to pass
- Repository
- Docs, signatures, tests
- Prompt
- LLM
- Run tests
Failing tests become feedback for the next prompt, until they pass or the retry limit is hit.
How it works
Preprocess
Parse the repository with the AST and a call graph to extract each function's signature, docstring, related documentation and tests.
Generate
Ask the model for the implementation with a structured prompt built only from that specification.
Test and feed back
Run the test suite. When tests fail, turn the failures into targeted feedback and prompt again.
Results
Across 10 open-source Python repositories (around 230 functions in boltons alone), the iterative loop outperformed single-pass generation by up to 30% in success rate, needing 1.9 iterations on average.
Why it matters
TIGER uses public LLM APIs as any third-party developer would: no fine-tuning and no special hardware. The improvement comes from the method around the model, which is what makes it practical for real engineering teams.
Stack
PythonPyTestAST parsingCall-graph analysisOpenRouterGeminiQwen CoderGitHub Actions