Five factors, one draw and the simple rule that moves a skill rating after every drill.
September 10, 2026 · 2 views
A training session in Cue Ball Network does not pick drills at random. Every proposal comes out of the same repeatable mechanism: a pool of drills that qualify at all, five factors that score each of them, one weighted draw and, at the end, an update to your skill level. This article walks through what happens between tapping "next drill" and saving the result.
Only measurable drills make it into the pool. Concretely: published drill variants for your table type (pool or snooker) that have a metric, a number of attempts and at least one goal. A variant without a goal has no way to end in "completed" or "failed", so the trainer will not show it.
Importantly, drills you have already seen in this session do not leave the pool. They are pushed to the back of the queue. As long as anything unseen is left, the trainer proposes something unseen. Only when everything has been shown does it go back to seen drills, drawing with a preference for the ones shown longest ago. That is why a session never "runs out" of drills, unless the catalog for that game is empty.
Each variant in the pool gets a weight. It starts from a base of 1, so even a drill that scores nothing can still be drawn. To that base the sum of five components is added. Each component is a score between 0 and 1 multiplied by a factor weight set by the administrator.
The three skill-promoting factors (weakest, least recently trained, open mistakes) are additionally multiplied by a per-skill weight. By default only jumps are dampened (0.2), because it is a skill trained rarely by design and without that correction the trainer would keep pushing it just for being "weakest" or "stalest". Level proximity and failure repetition are not multiplied, so a jump drill still shows up from time to time.
Once every drill has its weight, the trainer chooses the pool to draw from:
The pick itself is a weighted random draw. A drill with weight 150 is three times as likely as one with weight 50, but the second one can still come up. Sessions are therefore not predictable down to a single drill, yet they follow the direction your data points to.
After the draw, the trainer checks which of the five factors contributed the most to the weight of that particular drill. That factor, together with the skill and level, is shown in a short intro before the drill. A factor disabled by the administrator (weight 0) is never reported as the reason. If no factor scored at all, the intro is skipped rather than inventing a justification.
After the drill you record the outcome of each attempt. You do not grade yourself: the system compares the recorded attempts with the variant's goals and decides on its own whether the drill is completed or failed. That result goes into the execution history together with a copy of the goals, so you can always check why a given drill counted as completed.
Every skill has its own level on a 0 to 10 scale (stored internally a thousand times larger, so level 5.0 is 5000). The update after a drill is classic ELO, like in chess, except the "opponent" is the drill:
The expected score comes from the standard ELO formula with a divisor of 400. In practice that gives three situations:
The change is recorded to two decimals on the execution, and the skill level itself is rounded to a whole number. Levels map onto five tiers: beginner (0 to 2.9), amateur (3 to 4.9), intermediate (5 to 6.9), advanced (7 to 9.9) and pro (10 and above). You will see the same tiers on your profile and in tournament entries.
Level proximity keeps drills within reach. Weakest skill and least recently trained make sure you do not only train what you enjoy. Failure repetition works like flashcards: a drill that did not work out comes back at growing intervals until you finally complete it. Open mistakes connect what you wrote down in the mistake register, sparrings included, with what you get in training. Every saved result changes the ELO, and the changed ELO changes the next proposal. That is the whole loop.