Skip to content

Fitness and presets

Each test call is scored on these objectives, each between 0 and 1:

Objective Scores
state_coverage The share of the flow’s reachable blocks the call visits.
branch_coverage The share of the transitions a call can take that this call takes.
happy_path Calls that reach an end having answered the flow’s prompts; halved if they hit an error on the way.
error_recovery Of the errors the call caused (a timeout, a wrong key), how many it got back from.
queue_reachability 1 for a call that reaches a queue or an agent, and partial credit the closer it gets.

Coverage counts only what a test can reach: blocks no path leads to, and error arms a call can never take (a queue’s at-capacity arm, say), are left out, so a suite that takes every path scores 1.

  • Weighted sum (the default): each objective times its weight, added up.
  • Pareto: calls that no other call beats on every objective rank first, then the next layer, and so on; within a layer, calls unlike their neighbours rank higher.
  • Lexicographic: the most important objective decides, and the next one breaks ties.
Size Calls × generations Typical time
Quick 40 × 15 under a minute
Standard 100 × 50 a few minutes
Thorough 200 × 120 for a final suite; it also mutates less
Focus Weights
Balanced coverage 0.3 + 0.3, happy path 0.2, error recovery 0.2
Coverage state and branch coverage, 0.5 each
Error handling error recovery 0.6, branch coverage 0.4
Reaching agents queue reachability 0.6, state coverage 0.4

The size sets the population and the number of generations. The rest of the genetic algorithm (mutation and crossover rates, tournament size, elites kept each generation, the random seed, and how fitness scores are combined) is under Advanced settings. A fixed seed makes a run reproducible.