Skip to content
LGLorenzo Gallone
All work

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
The TIGER loop
  1. Repository
  2. Docs, signatures, tests
  3. Prompt
  4. LLM
  5. 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

Next projectFanta F1