Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ scripts/update_zed_models.py
# Dev notes — не для publish
DEV_EXP.md
# Экспериментальные артефакты — не пушить
.pr_work/
experiments/__pycache__/
experiments/*_results.json
experiments/*_results.csv
Expand Down Expand Up @@ -231,3 +232,7 @@ _measure_*.py
# E17 experiment: regenerable prompt shards (rebuild via e17_export_*.py)
experiments/bootstrap/e17_shards/*.txt
experiments/bootstrap/e17_judge/*.txt

# Written by tests/test_planted_break_gate.py on every run (atomic, read by nobody).
# Tracked, it dirties git status and invites committing a timestamp.
experiments/planted_break/results.json
224 changes: 0 additions & 224 deletions KNOWN_ISSUES.md

Large diffs are not rendered by default.

263 changes: 263 additions & 0 deletions docs/archive/KNOWN_ISSUES_2026_10_AUTO_SYNC.md

Large diffs are not rendered by default.

21 changes: 0 additions & 21 deletions experiments/planted_break/results.json

This file was deleted.

64 changes: 64 additions & 0 deletions experiments/prompt_robustness/frozen/HYPOTHESES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# HYPOTHESES — prompt robustness (frozen до первого живого вызова)

Датасет: `frozen/dataset.json` v2.0 (11 кейсов, 10 в агрегате, RU+EN).
Прогон: `opencode-go/{longcat-2.0, qwen3.7-plus, deepseek-v4.1-flash}`, `--variant high`, `--pure`.

**Правило переигрывания:** записано ДО данных. После первого взгляда на результат ни одна строка
не переписывается. Гипотеза, опровергнутая фактом, помечается `REFUTED (факт: …)`, а не удаляется
(§19.2: артефакт под аудитом — не источник истины).

Три гипотезы предсказаны к ПРОВАЛУ (H2, H5, H6). Без них отчёт выглядел бы как «7/7» и ничего
не значил бы (confirmation bias, §19.1).

---

## Гипотезы о модели

| # | Гипотеза | Фальсификатор | Фундамент |
|---|---|---|---|
| H1 | `base_accuracy(ru) ≈ base_accuracy(en)`: разница ≤ 0.15 | разница > 0.15 | Обе языковые руки — односемантичные факты; модели сильно многоязычны. Слабая гипотеза. |
| H2 | `invariance_ru ≈ invariance_en`: разница ≤ 0.10 | разница > 0.10 | Консистентность факта языконезависима. **Предсказан к ПРОВАЛУ:** русские формулировки здесь написаны «с кальки» (напр. «Каковой является столица…») — это добавляет шум, специфичный для RU, а не для EN. Ожидаю EN > RU. |
| H3 | `q_france_capital` и `q_japan_capital` → invariance = 1.000 у всех трёх моделей | хоть одна < 1.0 | Сверхчастотные факты; промах по столице — грубый дефект знания, не формулировки. |
| H4 | `q_python_release_year` и `q_titanic_year` → invariance < 1.0 хотя бы у одной модели | все три = 1.0 | Год — точная величина, модель склонна «сглаживать» к круглому или путать с датой смерти/постройки. Парафразы здесь меняют аспект («создан» vs «первый релиз») — это подлинная чувствительность к формулировке. |
| H5 | `seed_stability = 1.000` при `T=0.0` и фиксированном промпте | хоть один повтор дал иной факт | При T=0 и том же seed выбор токенов детерминирован. **Предсказан к ПРОВАЛУ:** либо провайдер не уважает seed, либо ответ упирается в `max_tokens`/reasoning-budget и обрезается по-разному. Ненулевой результат = находка про провайдера, а не про устойчивость. |
| H6 | `invalid_rate = 0` по всем 88 вызовам на модель | ≥ 1 TIMEOUT/MODEL-MISMATCH | **Предсказан к ПРОВАЛУ:** при ~26 с на вызов и 88 вызовах на модель × 3 модели ожидаю таймауты и/или silent fallback на длинных ответах. Guard `BUILD_MODEL` это ловит и пишет `invalid`, а не `fail`. |
| H7 | Три модели расходятся > 0.15 хотя бы по одной оси | все три в пределах 0.15 | Разные семейства (longcat / qwen / deepseek) ведут себя по-разному на инвариантности. Слабая гипотеза. |

## Гипотезы о харнессе (должны подтвердиться, иначе результаты непригодны)

| # | Гипотеза | Фальсификатор | Фундамент |
|---|---|---|---|
| C1 | Oracle-транспорт → `invariance == 1.000` **точно** (для обеих рук) | любое значение ≠ 1.0 | Транспорт всегда возвращает замороженный факт. Если не ровно 1.0 — в агрегате или матчере баг. **Это позитив-контроль: без него харнесс, застрявший на 0.0, проходит негативный тест.** |
| C2 | Planted-break транспорт → `invariance < 1.0`, и помеченной окажется **именно** саботированная парафраза | score == 1.0, или отмечена не та | Проверка адресности: падение должно локализоваться, а не просто «где-то упало». |
| C3 | **ПРАВИЛО ВЕРДИКТА (исправлено, см. AMENDMENT A1):** порог `invariance ≥ 0.90` применяется к **каждому языку отдельно**; `FAIL` хотя бы на одной языковой руке = `FAIL`. Проверяются обе границы: ровно 0.90 → PASS, 0.89 → FAIL. | усреднение по языкам возвращает PASS при провале одной руки | Усреднение маскировало бы провал RU идеальным EN — и вердикт противоречил бы собственному `reasons`. Повторы base **не** участвуют в пороге: они дают `seed_stability`. |
| C3b | `seed_stability` измеряет **согласованность повторов**, а не правильность: модель, стабильно отвечающая неверно, получает `seed_stability = 1.0` при `base_accuracy = 0.0` | стабильно-неверная модель получает seed < 1.0 | Две разные величины нельзя смешивать: «стабильно неправ» ≠ «нестабильно». |
| C4 | Сломанный матчер (всегда `True`) → `invariance == 1.0` **и** флаг `matcher_suspect` | флаг не выставлен | Второй контур: матчер — тоже часть харнесса, и у него должен быть свой способ быть пойманным. |
| C5 | `matcher_recall` на ручных корректных ответах = 1.000 (20 ответов, включая словесные формы и Fahrenheit) | любая невспомбранная форма | **Без этой калибровки «провал» неотличим от дефекта матчера.** FN матчера, помеченный как провал модели, — это ровно тот ложно-красный сигнал, который мы выводили в исходном фрагменте. |
| C6 | Пустой датасет / битый count → `exit(2)`, а не `score=0` | rc == 0 при пустом входе | §19.6 / T10: тихий ноль опаснее падения. |

## AMENDMENT (2026-10-02) — все правки внесены ДО первого живого вызова модели

К этому моменту выполнялись только детерминированные транспорты (`oracle`, `planted`) — ни один
ответ реальной LLM в данных не участвовал. Поэтому правки ниже не constitute «подгонку под результат».

| # | Что изменено | Почему |
|---|---|---|
| A1 | **C3 переписан.** Реальное правило: `invariance ≥ 0.90` на каждый язык отдельно, без усреднения | `decide()` усреднял RU и EN, из-за чего RU=0.89 при EN=1.0 давал `mean=0.945 → PASS`, и вердикт противоречил собственному `reasons`. Найдено тестом, не на данных. |
| A2 | **H6: 88 вызовов → 120 на модель** | 10 агрегатных кейсов × (3 base-повтора + 3 парафразы) × 2 языка = 120. Базовые прогоны входят в счёт. |
| A3 | `seed_stability` переопределена как согласованность повторов; `base_repeats` 2 → **3** | Прежний код считал правильность (`seed_same += int(bool(matched))`), то есть метрика называлась не по тому, что измеряла: стабильно-неверная модель получала бы 0.0. При 2 повторах единогласие ловится только для «разошлись один раз». |
| A4 | Коды возврата разведены: `0` PASS/контроль, `1` FAIL, `2` **только** POPULATION ERROR, `3` UNKNOWN | Раньше контроль-рука (`N/A`) и пустой датасет давали оба `2` — гейт по exit-code не мог отличить провал от успеха (§19.6). |
| A5 | В отчёт пишется **всё сырьё**: обе языковые руки и base-строки | `rows` создавался внутри цикла по языкам, поэтому в отчёт попадал только EN, и число для RU было недоказуемо. Добавлен тест, перевыводящий метрики из строк. |
| A6 | Формулировка «frozen до первого живого вызова» уточнена | До заморозки был выполнен один вызов `opencode-go/longcat-2.0` с промптом `PONG` (проверка транспорта). Он не содержал ни одного вопроса датасета и не участвует ни в какой метрике. |

**Число прогонов `base_repeats=3` — единственное непроверенное допущение:** при 120 вызовах на модель
и ~26 с на вызов полный прогон трёх моделей занимает порядка 2.5–3 часов. Это цена, зафиксированная
до данных, а не подгонка.

1. **Смысловая инвариантность длинных объяснительных ответов** — только `q_gradient_descent_direction`
(вне агрегата). Для остальных exact-match достаточен, потому что факт — это слово/число.
2. **Перевод как таковой.** `base_RU` и `base_EN` — разные промпты, не переводы. Утверждение
«перевод не меняет факт» этим харнессом НЕ проверяется и не будет публиковаться.
3. **Причинность «модель X устойчивее Y».** Различия между моделями не тестируются на значимость;
при N=30 это описательные числа с широким интервалом, не вывод о качестве.
4. **Устойчивость к более агрессивным переформулировкам** (длинный контекст, отрицание, ловушки) —
вне объёма.
Loading
Loading