{% if q_error %}
{{ q_error }}
{% endif %} {% if quality %} {% set c = quality.comparison %}
{{ c.verdict.overall }} {% for s in quality_summary %}{{ s }} {% endfor %}
{% if c.floor %}{% endif %}{% for name, p in c.categories.items() %} {% if c.floor %}{% set f = c.floor_categories.get(name) %}{% endif %} {% endfor %}
CategoryQuestionsRight beforeRight afterLostGainedFlipped when asked twice
{{ name }}{% if name in c.verdict.categories %} worse{% endif %} {{ p.n }}{{ "%.1f%%" % (100 * p.acc_a) }}{{ "%.1f%%" % (100 * p.acc_b) }} {{ p.lost }}{{ p.gained }}{{ f.flips if f else "n/a" }}

Rule, written before the answers were recorded: accuracy may drop at most {{ c.rule.max_drop_points }} point{{ "" if c.rule.max_drop_points == 1 else "s" }} at 95% confidence, and flips may exceed the noise floor by at most {{ c.rule.max_flip_excess_points }} points. Answers are checked by rules, not a model: read the changed ones below before you decide (lesson 54).

{% if quality.examples %}
Changed answers ({{ quality.examples | length }}{% if quality.examples | length >= 60 %}, first 60{% endif %}) {% for x in quality.examples %} {% endfor %}
QuestionExpectedBeforeAfter
{{ x.kind }} {{ x.question | truncate(110) }}{{ x.expected }} {{ (x.before or "") | truncate(80) }}{{ (x.after or "") | truncate(80) }}
{% endif %} {% endif %}