{% extends "base.html" %} {% block title %}Experiment #{{ e.id }}{% endblock %} {% block main %}
Experiments · #{{ e.id }}

{{ e.flag }}

{{ e.title }}, proposed by {% if e.base_run_id %}run #{{ e.base_run_id }}{% else %}a deleted run{% endif %} ({{ e.rule_id }}) for {{ e.base_url }}. {{ e.status }}

01What to change, and why

{{ e.reason | safe }}

{% if e.expected %}

Expected {{ e.expected | safe }}

{% endif %} {% if e.risk %}

Risk {{ e.risk | safe }}

{% endif %}

Before {{ before if before is not none else "not known from the run" }}. To roll back, undo the change and restart.

02Before you change anything: record answers

{% if q_before %}

Recorded {{ q_before.questions }} questions ({{ q_before.set_name }}) twice, passes #{{ q_before.id }} and #{{ q_floor.id if q_floor else "?" }}: {{ "%.1f%%" % (100 * q_before.accuracy) }} right{% if q_floor_flips is not none %}; asking twice flipped {{ "%.1f%%" % (100 * q_floor_flips) }}, the noise floor{% endif %}. After the change, step 06 asks the same questions again.

{% else %}

Optional, and worth it for anything that changes the numbers the model computes with (number formats, a new checkpoint, a different engine). kneebench asks every question twice now, at temperature 0 with 16 at a time, so it knows how much answers move with nothing changed.


Asking every question twice…

The rule is saved now, before any answers exist, so the result can't move it (lesson 54). JSONL lines: {"prompt": "...", "answer": "...", "match": "exact|contains|number|choice|regex", "category": "..."}.

{% endif %}

03Apply it

How do you run vLLM? {% for key, label in styles.items() %} {% endfor %}

{{ how.intro }}

{{ how.code }}

kneebench never changes your server. Most flags need a restart; use a staging or canary replica if this one serves real traffic.

04Check it landed

Reading the server…
{% if check %}{% include "_check.html" %}{% endif %}

05Measure what it did to speed

{% if verify_run %} {% if verify_run.status == "running" %}

The verification run is in progress. Follow it.

{% elif comparison %}
{% for s in comparison.summary %}{{ s | safe }} {% endfor %}
{% for label, a, b, change, verdict in comparison.metrics %} {% endfor %}
MeasureBefore (run #{{ e.base_run_id }})After (run #{{ verify_run.id }})Change
{{ label }}{{ a }}{{ b }}{{ change }} {{ {'unknown': 'one run only'}.get(verdict, verdict) }}

Changes under {{ "%.0f" % comparison.noise_pct }}% count as noise{% if comparison.noise_measured %}, from how much each run's repeated baseline moved{% endif %}. Full comparison · Verification report

{% if e.status not in ("kept", "reverted") %}
{% else %}

You {{ "kept" if e.status == "kept" else "reverted" }} this change. {% if e.status == "kept" %}The verification report has the next suggestions.{% endif %}

{% endif %} {% else %}

The verification run ended as {{ verify_run.status }}{% if verify_run.error %}: {{ verify_run.error }}{% endif %}. You can start another below.

{% endif %} {% endif %} {% if not verify_run or verify_run.status not in ("running", "done") %}

A short run with the same targets and request size, covering only the load levels this change can move, usually 5 to 15 minutes. It is compared with run #{{ e.base_run_id }}.

Detecting and planning…
{% endif %}

06Measure what it did to answers

{% if not q_before %}

Record answers in step 02 before applying a change to compare them afterwards.

{% else %}
{% if quality %}{% include "_quality.html" %}{% endif %}
{% if e.status not in ("kept", "reverted") %}
Asking every question…
{% endif %} {% endif %}
{% endblock %}