Group closed experiment scripts into eval/exp12|13|14|14b folders with import shims preserved, keep live seed and oracles in eval/, and update all path citations

This commit is contained in:
Claude (backend session) 2026-07-12 21:48:55 +03:00
parent af469140dc
commit f468f27de6
35 changed files with 27 additions and 26 deletions

View file

@ -13,7 +13,7 @@
- **Задача 1 ✅ — индекс `docs/experiments/README.md`** создан, каждая строка сверена по шапке дока + D-логу (легенда ⭐живой-reference/живой/закрыт/settled; дуга 12→14b; пропуск exp05 отмечен). Указатель на карту скриптов в `eval/README`.
- **Задача 2 — уборка `eval/`:** (а) **`exp14b_{arms,judge,monitor,score}.py` закоммичены** (path-scoped, 0be3084) — дыра воспроизводимости за ратифицированным D38 закрыта. (б) **Карта скриптов в `eval/README` расширена** (9feb115): все семьи exp12/13/14/14b + 18+/корпус-билдеры + `dialogue/mistral_fidelity/local_bench` — навигация плоского каталога без перемещения.
- **⚠ ФАКТЧЕК ОПРОВЕРГ наивную «архивацию exp12/13»:** прямое условие промпта («без живых импортов») выполнено (exp14b импортит `exp14_common`, не exp12/13), **НО** нашлись **живые цитаты по пути**, которые `git mv` порвёт: `eval/exp13_seed_v2.py`+`exp13_seed_signoff.py` цитируются **D-логом:400/437** как воспроизводимый провенанс ДЕЙСТВУЮЩЕГО сида v2 (D30.5) — это ЖИВЫЕ скрипты, не спент; плюс exp12/13/14 цитируются по пути из закрытых отчётов (12/13/14) и PROGRESS-прозы. `memory_hotpath.py` (README: УСТАРЕЛ) — в ~10 ссылках вкл. `architecture/06:114`. **Перемещение = сирота-ссылки в зонах, что я не правлю (D-лог/PROGRESS/architecture) → нарушение D23.3.** Вывод: уборка = индекс+карта, НЕ relocation; ничего не двигал. Гигиена gitignore уже чистая (нет трекнутого мусора).
- **⚠ ФАКТЧЕК ОПРОВЕРГ наивную «архивацию exp12/13»:** прямое условие промпта («без живых импортов») выполнено (exp14b импортит `exp14_common`, не exp12/13), **НО** нашлись **живые цитаты по пути**, которые `git mv` порвёт: `eval/exp13_seed_v2.py`+`exp13_seed_signoff.py` цитируются **D-логом:400/437** как воспроизводимый провенанс ДЕЙСТВУЮЩЕГО сида v2 (D30.5) — это ЖИВЫЕ скрипты, не спент; плюс exp12/13/14 цитируются по пути из закрытых отчётов (12/13/14) и PROGRESS-прозы. `memory_hotpath.py` (README: УСТАРЕЛ) — в ~10 ссылках вкл. `architecture/06:114`. **Перемещение = сирота-ссылки в зонах, что я не правлю (D-лог/PROGRESS/architecture) → нарушение D23.3.** Вывод: уборка = индекс+карта, НЕ relocation; ничего не двигал. Гигиена gitignore уже чистая (нет трекнутого мусора). **[⟶ СУПЕРСИДНУТО D38.2-оркестр (12.07): владелец выбрал полную логическую группировку кода по папкам; спент-семьи перенесены в `eval/exp12|13|14|14b/`, живой сид (`exp13_seed_v2/signoff`) и оракулы оставлены в `eval/`, ВСЕ цитаты+импорты починены и проверены (`py_compile`+`find_spec`); контракт (D-лог) не трогали. См. оркестр-запись ниже.]**
- **Самопроверка (мандат):** `py_compile` 4 exp14b-скриптов — OK; `import exp14_common` — чисто (Spender/cost_of на месте); импорты закрытых экспов не тронуты (0 перемещений). `git status` перед каждым коммитом; staging пофайловый.
- **Мультисессия:** живой бэкенд (infra-pack) держит WIP в `backend/internal/pipeline/{sanitizer,chunkrun,disposition}.go`**не трогал** (не моя зона).

View file

@ -33,7 +33,7 @@
**Frame:** ЧИСТЫЕ главы этапа A = все чанки `disposition=ok` на ОБЕИХ стадиях (draft+edit), `flag_reason` пуст. Из 25: главы 1 (эхо cjk_artifact) и 10 (length) исключены как флагнутые → frame = **23 главы** {29, 1125}.
**Метрика на ИСХОДНИКЕ zh (детерминированная):** `D` = доля символов внутри кавычек «“…”» (U+201C…U+201D) от не-пробельных символов главы. Диалого-плотность.
**Правило выбора (frozen):** `high = argmax D`, `low = argmin D`, `mid = ближайшая к медиане D`. Тай-брейк — меньший номер главы. Скрипт: `eval/exp12_extract.py` (воспроизводимо).
**Правило выбора (frozen):** `high = argmax D`, `low = argmin D`, `mid = ближайшая к медиане D`. Тай-брейк — меньший номер главы. Скрипт: `eval/exp12/exp12_extract.py` (воспроизводимо; сгруппирован в `eval/exp12/` — D38.2).
| Регистр | Глава | D | чанков | zh-симв. | реализованный характер |
|---|---|---|---|---|---|
@ -47,7 +47,7 @@
### 1.2. Армы (на ОДНИХ И ТЕХ ЖЕ черновиках; редактор-стадия варьируется)
Черновик A0 и его глоссарная инъекция общие для всех редакторских армов. Реконструкция инъекции — из `retrieval_state.injected_ids` приёмочного store, воспроизводит ровно блок, что видел боевой glm-5 (`renderEditorConstraintBlock`/`renderGlossaryBlock`, `eval/exp12_blocks.py`): editor-констрейнт = CONFIRMED dst-формы «- «dst»»; билингв-глоссарий = «src → dst». Sticky (A5) внутри главы = union chunk0chunk1.
Черновик A0 и его глоссарная инъекция общие для всех редакторских армов. Реконструкция инъекции — из `retrieval_state.injected_ids` приёмочного store, воспроизводит ровно блок, что видел боевой glm-5 (`renderEditorConstraintBlock`/`renderGlossaryBlock`, `eval/exp12/exp12_blocks.py`): editor-констрейнт = CONFIRMED dst-формы «- «dst»»; билингв-глоссарий = «src → dst». Sticky (A5) внутри главы = union chunk0chunk1.
| Арм | Редактор | Режим | Констрейнты | Источник | Стоимость |
|---|---|---|---|---|---|
@ -95,7 +95,7 @@
## 2. РЕЗУЛЬТАТЫ
Армы: 36 вызовов, 0 ошибок, все finish=stop, **$0.779**. Судьи: 27 вызовов, **$1.31**. Демо §2.6: 1 вызов ~$0.13. **Итого потрачено ≈ $2.22 из капа $5.** Скрипты: `eval/exp12_*.py`; артефакты (тексты, JSON) — `/home/ubuntu/books/gu-zhenren/diag/` (ВНЕ git). Дефолт-конфиг НЕ менялся (D26.2).
Армы: 36 вызовов, 0 ошибок, все finish=stop, **$0.779**. Судьи: 27 вызовов, **$1.31**. Демо §2.6: 1 вызов ~$0.13. **Итого потрачено ≈ $2.22 из капа $5.** Скрипты: `eval/exp12/` (сгруппированы D38.2); артефакты (тексты, JSON) — `/home/ubuntu/books/gu-zhenren/diag/` (ВНЕ git). Дефолт-конфиг НЕ менялся (D26.2).
### 2.1. Контроль рига (A1 ≈ A1) — ПРОЙДЕН
@ -217,7 +217,7 @@ A1 (glm-5-моно моим ригом) vs A1 (store, боевой): similari
Ревью D30.5 отметило: v2-сид и делегация владельца были раскрыты только в докстринге скрипта, не в отчёте. Фиксирую здесь.
- **Делегация:** владелец делегировал пере-генерацию глоссария («перегенерируй без меня»). Термины-рекомендации — консенсус двух флагманов (GPT+Claude, `diag/reading/ОЦЕНКА_ФЛАГМАНА.md`) + явные пожелания владельца из фидбека раунда 2 (таблица §4.2).
- **Провенанс генерации:** первый прогон — `eval/exp12_glossary_v2.py` (нёс дефект: спорные термины со `status:approved` → ушли бы в CONFIRMED-hard-constraints до подписи, `memory.go:419/473`; тихие промоушены draft→approved у 花酒行者/本命蛊, причём 花酒行者 перезаписывал пожелание владельца «Винный Странник»). **Супрсежено** единым воспроизводимым трансформом `eval/exp13_seed_v2.py` (D30.5): спорные (修炼/修行, 人祖, 花酒行者, 蛊虫, 本命蛊 + род «гу») → `status:draft`; бесспорные 8 правок + 5 добавлений → approved; влито обогащение мн.ч. (D24.4). Итог: `guzhenren-seed-v2.yaml` (57 терминов) + таблица на подпись `diag/glossary_v2_signoff.md`.
- **Провенанс генерации:** первый прогон — `eval/exp12/exp12_glossary_v2.py` (нёс дефект: спорные термины со `status:approved` → ушли бы в CONFIRMED-hard-constraints до подписи, `memory.go:419/473`; тихие промоушены draft→approved у 花酒行者/本命蛊, причём 花酒行者 перезаписывал пожелание владельца «Винный Странник»). **Супрсежено** единым воспроизводимым трансформом `eval/exp13_seed_v2.py` (D30.5): спорные (修炼/修行, 人祖, 花酒行者, 蛊虫, 本命蛊 + род «гу») → `status:draft`; бесспорные 8 правок + 5 добавлений → approved; влито обогащение мн.ч. (D24.4). Итог: `guzhenren-seed-v2.yaml` (57 терминов) + таблица на подпись `diag/glossary_v2_signoff.md`.
- **Гейт:** ничего не уходит в прод без подписи владельца по спорным + resnapshot. Спорные инъектятся как `⟨проверить⟩` (не hard-constraint), пока draft.
---

View file

@ -160,5 +160,5 @@ Opus-ревью подняло флаг: «метки, похоже, НЕ пер
- **Рекомендация переводчика:** `deepseek-v4-pro` (цена ~$0.23/25 глав) — на ратификацию оркестратора.
- **Сид v2:** финализирован, таблица владельцу на подпись (`diag/glossary_v2_signoff.md`).
- **Артефакты:** `diag/arms13/` (выходы, гейты, судьи, summary.json, costs); `diag/reading/monitor13.{html,md}` + ключ (слепая флагман-сверка владельца); `eval/exp13_*.py` (воспроизводимо).
- **Артефакты:** `diag/arms13/` (выходы, гейты, судьи, summary.json, costs); `diag/reading/monitor13.{html,md}` + ключ (слепая флагман-сверка владельца); `eval/exp13/` (воспроизводимо; сгруппированы D38.2).
- **Следующий шаг:** оркестратор ратифицирует draft-модель + подпись владельца по сиду → единый resnapshot (draft=pro, editor=glm-5-билингв, reflow, сид v2, sanitizer) → пере-прогон 25 глав с re-gate верности → чтение владельца → этап B.

View file

@ -134,7 +134,7 @@ F-disc — НИКОГДА не делалось (финалисты {P0, A-2pass
4. Разрешено объединять/делить русские предложения; ЗАПРЕЩЕНО терять смысловые атомы (число предложений/абзацев совпадать не обязано).
5. `REFERENCE`-блоки — только для разрешения связей; не переводить/не пересказывать в выходе.
Few-shot — минимальные, ортогональные: narrative N:1, dialogue 1:N, focal-shift boundary (target-side русский якорь, ≤3). **Для DeepSeek-thinking (если гоню его переводчиком/редактором с дискурс-промптом) — сначала zero-shot против few-shot** (модель-специфика research/15; не переносить между моделями); ручной verbose CoT reasoning-модели НЕ добавлять. Точный текст промпта и few-shot — в `eval/exp14_prompts.py`, sha256 фиксируется в §2 при заморозке армов.
Few-shot — минимальные, ортогональные: narrative N:1, dialogue 1:N, focal-shift boundary (target-side русский якорь, ≤3). **Для DeepSeek-thinking (если гоню его переводчиком/редактором с дискурс-промптом) — сначала zero-shot против few-shot** (модель-специфика research/15; не переносить между моделями); ручной verbose CoT reasoning-модели НЕ добавлять. Точный текст промпта и few-shot — в `eval/exp14/exp14_prompts.py`, sha256 фиксируется в §2 при заморозке армов.
### 1.3. Фронтир-арм — ДИАГНОСТИКА потолка (capability-vs-activation)

View file

@ -29,18 +29,18 @@
| `refusal_corpus_build.py` | exp02 (наполнение refusal-корпуса L0L1) | explicit/L3 этим НЕ наполняются |
| `local_bench.py`, `llama_moe_bench.sh` | exp03 (локальный стенд) | dense через ollama / MoE через llama.cpp |
### Скрипты «дуги качества» 12 → 13 → 14 → 14b (эксперименты ЗАКРЫТЫ — отчёты см. `docs/experiments/README.md`)
Оставлены на месте намеренно: цитируются по пути из D-лога/PROGRESS/отчётов; перемещение рвёт грепы (D23.3). Прогонять повторно не нужно — вердикты ратифицированы (D30/D32/D37/D38).
### Скрипты «дуги качества» 12 → 13 → 14 → 14b — сгруппированы по папкам `eval/expNN/` (эксперименты ЗАКРЫТЫ; отчёты см. `docs/experiments/README.md`)
Спент-семьи структурированы по папкам `eval/exp12/`, `eval/exp13/`, `eval/exp14/`, `eval/exp14b/` (решение владельца — D38.2): declutter top-level `eval/`, логическая группировка кода (это код-репо, не «архив»/не заморозка). Прогонять повторно не нужно — вердикты ратифицированы (D30/D32/D37/D38). **Импорты сохранены (проверено `py_compile`+`find_spec`):** скрипты, тянущие `refusal_bench`, дотягиваются до `eval/` шимом `.parent.parent`; `exp14b_*` тянут общий `exp14_common`/`exp14_prompts` из `../exp14/` (exp14b построен на харнессе exp14). **ЖИВОЙ провенанс сида v2 (`exp13_seed_v2.py`/`exp13_seed_signoff.py`) НЕ перемещён** — остался в `eval/` (цитируется D-логом D30.5, регенерирует боевой сид).
| Семья | Эксперимент | Общие/особые модули |
| Папка | Эксперимент | Скрипты / особые модули |
|---|---|---|
| `exp12_*.py` (arms, blocks, candidate, extract, glossary_v2, judges, monitor, pack, reflow_demo, rootcause) | exp12 диагноз (закрыт D30) | `exp12_judges` **импортит** `exp12_pack` — семья неделима |
| `exp13_*.py` (aggregate, blind_stage, gates, judges, monitor, translate) | exp13 бейк-офф переводчиков (закрыт D32) | — |
| `exp13_seed_v2.py`, `exp13_seed_signoff.py` | **ЖИВОЙ провенанс сида v2** (воспроизводимый трансформ, цитируется D-логом D30.5) | НЕ спент, НЕ трогать/не перемещать |
| `exp14_*.py` (arms, judges, kpi, monitor, rank, regate, sizecurve) | exp14 рычаги качества (закрыт D37) | все импортят `exp14_common` (+ arms/sizecurve → `exp14_prompts`); `exp14_material` автономен |
| `exp14b_*.py` (arms, judge, monitor, score) | exp14b батарея смысл-трапов (закрыт D38) | реюзят `exp14_common`/`exp14_prompts`**exp14 и 14b неразделимы** |
| `eval/exp12/` | exp12 диагноз (закрыт D30) | arms, blocks, candidate, extract, glossary_v2, judges, monitor, pack, reflow_demo, rootcause; `exp12_judges``exp12_pack` |
| `eval/exp13/` | exp13 бейк-офф переводчиков (закрыт D32) | aggregate, blind_stage, gates, judges, monitor, translate |
| `eval/exp14/` | exp14 рычаги качества (закрыт D37) | arms, common, judges, kpi, material, monitor, prompts, rank, regate, sizecurve; фундамент `exp14_common`/`exp14_prompts` |
| `eval/exp14b/` | exp14b батарея смысл-трапов (закрыт D38) | arms, judge, monitor, score; реюзят `exp14_common`/`exp14_prompts` из `../exp14/` |
| `eval/` (НЕ перемещён) | ЖИВОЙ провенанс сида v2 | `exp13_seed_v2.py`, `exp13_seed_signoff.py` (D30.5, регенерируют боевой сид) |
> **`exp14_common.py` + `exp14_prompts.py` — общий фундамент exp14 И exp14b.** Их не переносить/не переименовывать без переезда обеих семей вместе (иначе рвётся `import exp14_common`).
> **`exp14_common.py` + `exp14_prompts.py`** живут в `eval/exp14/` и служат фундаментом exp14 И exp14b; `exp14b_*` тянут их через шим `../exp14`, поэтому переименование/перенос exp14 без правки шимов exp14b порвёт `import exp14_common`.
## Правила (выучены на ошибках)

View file

@ -14,7 +14,7 @@ from __future__ import annotations
import json, os, sys, time, urllib.request, urllib.error
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) # script now under eval/expNN/ — reach up to parent eval/ for the refusal_bench oracle
from refusal_bench import load_env_file
load_env_file()

View file

@ -11,7 +11,7 @@
from __future__ import annotations
import json, os, sys, urllib.request
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) # script now under eval/expNN/ — reach up to parent eval/ for the refusal_bench oracle
from refusal_bench import load_env_file
load_env_file()

View file

@ -15,7 +15,7 @@ import json, re, sys, random, time
from pathlib import Path
from statistics import median
sys.path.insert(0, str(Path(__file__).resolve().parent))
sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) # script now under eval/expNN/ — reach up to parent eval/ for the refusal_bench oracle
from refusal_bench import call_provider, load_env_file
from exp12_pack import arm_chapter_text, POOL, CHAPTERS
load_env_file()

View file

@ -11,7 +11,7 @@
from __future__ import annotations
import json, os, sys, urllib.request
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) # script now under eval/expNN/ — reach up to parent eval/ for the refusal_bench oracle
from refusal_bench import load_env_file
load_env_file()

View file

@ -15,7 +15,7 @@ import json, os, re, sys, time, random, urllib.request, urllib.error
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) # script now under eval/expNN/ — reach up to parent eval/ for the refusal_bench oracle
from refusal_bench import load_env_file
load_env_file()

View file

@ -16,7 +16,7 @@ from __future__ import annotations
import json, os, sys, time, urllib.request, urllib.error
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) # script now under eval/expNN/ — reach up to parent eval/ for the refusal_bench oracle
from refusal_bench import load_env_file
load_env_file()

View file

@ -12,7 +12,7 @@ from __future__ import annotations
import json, os, sys, time, urllib.request, urllib.error
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) # script now under eval/expNN/ — reach up to parent eval/ for the refusal_bench oracle
from refusal_bench import load_env_file # noqa: E402
load_env_file()

View file

@ -10,7 +10,7 @@ editor-модель: C=glm-5 / F=gpt-5.4 / X=grok-4.3(reasoning-ON). Общий
from __future__ import annotations
import argparse, json, shutil, sys, time
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "exp14")) # exp14b reuses exp14's harness (exp14_common/exp14_prompts live in eval/exp14/)
import exp14_common as C
import exp14_prompts as P

View file

@ -8,7 +8,7 @@
from __future__ import annotations
import argparse, json, re, sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "exp14")) # exp14b reuses exp14's harness (exp14_common lives in eval/exp14/)
import exp14_common as C
ARMS = Path("/home/ubuntu/books/gu-zhenren/exp14b/arms")

View file

@ -4,8 +4,9 @@
Копирайт: ВНЕ git.
"""
from __future__ import annotations
import json, random
import json, random, sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "exp14")) # exp14b reuses exp14's harness (exp14_common lives in eval/exp14/)
import exp14_common as C
ARMS = Path("/home/ubuntu/books/gu-zhenren/exp14b/arms")