Assessment#
Before you have timed anything, the trainer has no idea what you know. The assessment is how you tell it — quickly, roughly, and without a cube in your hand if you like.
The scale#
Every case is rated on the same six-point scale. The labels come from
assessment.scale in config.yml, so an instance can reword them, but the
shipped scale is:
| Value | Label | What it means in practice |
|---|---|---|
| 0 | Never seen it | You would not recognise the case |
| 1 | Recognise it, cannot solve it | You know its name, not its algorithm |
| 2 | Solve it slowly, need to think | You get there, with pauses and a rotation or two |
| 3 | Solve it, some hesitation | The algorithm is in your fingers but not automatic |
| 4 | Solid, smooth | No hesitation, decent finger tricks |
| 5 | Instant, no thought | Recognition and execution are one action |
Be honest at 4 and 5. A self-rating is capped at 80 in the score model precisely because self-ratings drift optimistic, but an inflated rating still buries a case you should be drilling.
Rate on recognition, not on knowledge
The question is not "do I know this algorithm" but "would I execute it without stopping, mid-solve, at speed". Most people who can recite an algorithm rate themselves a 4 and belong at a 2.
The wizard#
Assessment → Start wizard walks the phases in order: F2L, then OLL, then PLL. Within a phase it goes group by group.
For each group you get two ways to answer:
- Rate the whole group
- One click sets every case in the group to the same value. This is the fast path and it is the intended one for your first pass — "all the OLL dot cases: 1".
- Rate individual cases
- Expand the group and rate case by case, with a thumbnail for each. Use this for groups where you genuinely know some and not others.
The wizard is resumable and partial. Leave at any point; what you rated is
saved, what you did not stays unassessed. Unassessed is a useful state, not a
gap to be filled — it sorts a case to the top of every list and marks it as
None rather than 0 in the score model.
You can re-run the wizard whenever you like; it starts from your current ratings so a second pass is mostly confirmation.
Re-assessing one case#
You do not need the wizard to change a single rating. The same control appears:
- on every case page in the library;
- inside a drill, after each rep — this is the most useful place, because you have just found out how well you actually know it.
Assessment history is kept. The newest rating wins for scoring, but the history is what lets the overview show movement over time.
The overview#
Assessment → Overview is the dashboard the whole app points at.
Phase scores#
One score per CFOP phase, 0–100, computed from the case scores in that phase. Alongside each is:
- how many cases in the phase are still unassessed;
- your measured average for the phase, if you have enough timed data;
- the split target for your goal, and whether you are inside it.
Projected solve time#
The overview adds up your measured phase averages (falling back to the target where you have no data) into a projected full-solve time. It is a rough number and the page says so — real solves have pauses between phases that isolated case drilling never shows. Treat it as a direction, not a prediction. Your actual averages come from the timer.
The spider graph#
The spider (radar) graph has two levels.
- Collapsed
- Three or four axes — cross, F2L, OLL, PLL — showing the phase scores. This is the shape you want to look at weekly. A balanced triangle is a solver with no glaring hole; a spike means one phase is carrying you.
- Expanded
- Click a phase axis (or Expand all) to fan that phase out into one axis per case. With 57 OLL cases the labels get dense, so hovering or tapping an axis names the case and links to it.
The graph is drawn as inline SVG with no charting library, so it prints, scales and works offline like everything else.
Unassessed cases are drawn, not hidden
An unassessed case shows as a hollow point at the outer edge rather than as a zero. Zero would say "you are bad at this"; hollow says "we do not know", which is the truth and is the thing worth fixing first.
How a rating becomes a score#
The full model lives in Developer → Scoring, but the short version is:
- No assessment, no attempts → score is
None. Sorts first. - Self-assessment only →
self_score / 5 × 100, capped at 80. An unmeasured claim never counts as mastery. - At least
targets.min_attempts_for_measuredattempts (default 3) → the measured part dominates. The trimmed mean of your best recent attempts is compared against the phase target for your goal, mapped so that hitting the target scores 80 and hitting half the target time scores 100. - Stars boost visibility in drill selection, never the score.
This is why the wizard is worth ten minutes and not an hour: the moment you have three timed attempts on a case, your self-rating stops driving its score.