The analysis pipeline
Here is what happens from the moment you request a progress check to the moment you see a result:Cache check
Before running any analysis, Waterline checks whether a recent result already exists for this ticket and repository combination. If a result is less than one hour old (configurable via
PROGRESS_CACHE_TTL_HOURS), it’s returned immediately — no LLM calls, no waiting.This means the second time you check the same ticket within an hour, the result is instant.Fetch the ticket
Waterline retrieves the ticket’s summary, description, and any structured acceptance criteria from Jira or GitHub Issues. This full text is used in every subsequent step.
Semantic code search
The ticket text is converted to an embedding and used to search your indexed codebase for the symbols most likely to implement what the ticket describes. Waterline retrieves the top 30 nearest symbols by semantic similarity, then removes any that fall below the similarity threshold.If not enough symbols are found at the symbol level, Waterline falls back to file-level search automatically.
LLM relevance scoring
Each candidate symbol is scored by the analysis LLM on a 0–1 scale for relevance to the ticket. Symbols that matched the embedding by coincidence — not because they’re actually about the ticket’s domain — are filtered out here.Only the top candidates (up to 20 by default) proceed to the next step.
Extract acceptance criteria
A separate LLM call reads the ticket description and extracts discrete, individually assessable acceptance criteria.For example, given a ticket description like:
The user should be able to reset their password via email. The reset link should expire after 24 hours. An error message should display if the link is expired.Waterline extracts:
- User can reset password via email
- Reset link expires after 24 hours
- Error message shown for expired link
Map evidence to criteria
The high-scoring symbols from the relevance step are mapped to the extracted criteria. The LLM determines which symbols provide evidence for which criteria, and assigns a confidence score to each mapping.
Fast path: pre-computed alignments
For tickets you’ve analyzed before, Waterline doesn’t wait for you to ask. Every time new code is pushed and the index updates, Waterline re-evaluates any previously analyzed tickets in the background and warms the cache. This means that for active tickets in repos with regular pushes, your analysis result is always fresh and available the moment you request it.The fast path only applies to tickets that have been analyzed at least once before. The first analysis of a new ticket always runs the full pipeline.
Result structure
Every analysis returns aProgressInference object. Here is an example:
| Field | What it means for you |
|---|---|
ticket_key | The ticket this result is for |
progress_percent | The share of acceptance criteria that are fully satisfied by code in your codebase |
criteria_evaluations | The per-criterion breakdown — what was found, what wasn’t, and what’s partially there |
criterion | The acceptance criterion as extracted from your ticket description |
state | Whether this criterion is SATISFIED, PARTIAL, or UNSATISFIED |
confidence | How strongly the evidence supports this criterion (0–1) |
evidence | The specific functions and methods that support this criterion, as file::symbol references |
uncertainty_level | How much confidence Waterline has in the overall analysis — LOW, MEDIUM, or HIGH |
analyzed_at | When this result was computed |
evidence list is the most actionable part of the result. If a criterion shows UNSATISFIED with an empty evidence list, you know that code either hasn’t been written yet or hasn’t been indexed. If it shows PARTIAL, you can look at the listed symbols to understand what exists and what might be missing.