From f278b5966b7d17342d93e4627892804a646c19f1 Mon Sep 17 00:00:00 2001 From: "Claude (backend session)" Date: Sun, 2 Aug 2026 15:48:11 +0300 Subject: [PATCH] Ratify D39.89: owner bank-arbitration hypothesis taken as testable, Q2 widened with confidence calibration and cluster coherence, research prompt issued with two-dollar ceiling --- ...ANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md | 128 ++++++++++++++++++ docs/PROGRESS.md | 8 +- docs/README.md | 2 +- docs/architecture/05-decisions-log.md | 14 +- docs/product-requirements.md | 2 +- 5 files changed, 149 insertions(+), 5 deletions(-) create mode 100644 docs/BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md diff --git a/docs/BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md b/docs/BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md new file mode 100644 index 00000000..841ca3bc --- /dev/null +++ b/docs/BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md @@ -0,0 +1,128 @@ +# Промт ресёрч-сессии: АРБИТРАЖ БАНКА ПАМЯТИ — консилиум, уверенность моделей, инжект/фетч (строки 5/36б · 48 · 16) + +**Выдан 02.08.2026, оркестратор №10, по прямому запросу владельца.** Ты — **ресёрч+полигон сессия**. Зона записи ровно три места: **`docs/research/24-bank-arbitration.md`** (свой файл, других в `docs/research/` не трогать) + **`eval/bank_arbitration/`** (свои харнессы; сырьё моделей — durable в `~/books/`, НЕ в scratch) + своя секция в `docs/PROGRESS.md` → `## Полигон`. ⚠ `eval/` — зона полигона: на момент выдачи полигон-сессий не запущено, но перед первой записью `git status` и опознание чужого; своё держать в своей папке. **НЕ коммитить** — лендит оркестратор. **Первый деливерабл — эхо-блок ≤10 строк** (первым сообщением ДО работы: как понял скоуп · четыре работы и их СТОП-точки · потолки денег · что вне скоупа; подтверждения не жди — работай до СТОП-условий). + +**Деньги (жёстко):** работы A и D = **$0**. Пробы работ B и C ≤ **$2.00 суммарно**, суб-потолки: калибровка уверенности ≤$0.60 · арбитраж ≤$0.80 · инжект ≤$0.60. **Каждая проба пре-регистрируется**: критерий успеха/провала записан в отчёт ДО запуска (норма D39.46). Превышение любого суб-потолка = СТОП+релей, а не «добрать немного». В отчёте — деньги по каждой пробе отдельно и суммой; сырые выходы моделей персистить в `~/books/gu-zhenren/bank-arbitration/` (урок 01.08: платное сырьё в эфемерном scratch = потеря). + +--- + +## §0. Рамка и ГЛАВНЫЙ мандат + +**Слова владельца дословно (02.08):** «банк памяти сейчас центральная ценность при переводе… туда нужен как грамотный инжект так и фетч по книге, прям очень грамотно алгоритмически продуманный»; про перевод банка — «тут нужен **консилиум без голоса**… либо если модели не равноправные, то склонять вес перевода в какую-то сторону»; «могут ли вообще модели устанавливать уверенность… можно ли на таком построить банковский перевод»; и оговорка — «только тут надо ещё осторожно подходить, чтобы учитывался общий контекст и стиль, а то мы можем выбрать перевод какой-то модели, который разобьёт стиль перевода другой». + +Это **гипотеза владельца, поданная на проверку, а не спецификация на стройку.** Твой мандат — проверить её, а не исполнить. + +1. **МАНДАТ РЕВИЗИИ ПОСЫЛОК (норма D39.68, обязателен).** Каждый предлагаемый механизм получает вердикт-тройку: **посылка** (источник, актуальна ли) · **нужность** (что даёт НА ДАННЫХ; не даёт — «закрыть») · **форма** (лучшая из ≥2 альтернатив по названному критерию). Допустимый исход любого пункта — **«не строить»**. Замер, бьющий по ПОСЫЛКЕ задачи, обязывает остановиться и поднять через канал вопросов, а не выдать формально требуемый артефакт (процессное правило №4, D39.47). +2. **БАР (по образцу research/14).** Любой новый механизм обязан: (а) оставить детерминированное ядро авторитетным; (б) влезть в стоимостный контур; (в) **эмпирически побить бесплатный детерминированный базис** — сегодняшнюю формулу §C2-3 (частота × конформность × согласие с подписанной строкой × лемма-штраф); (г) оправдать сложность. **Не проходит (в) → не мёржить.** Это главный фильтр пака: у нас уже есть бесплатные сигналы, и платный консилиум обязан их ПЕРЕИГРАТЬ, а не продублировать. +3. **Ревью-вопрос общности:** «заработает ли на паре, которой в репо ещё НЕТ, без правки Go?» Арбитраж не имеет права стать пар-словарём: **D39.47 отменил жанровый словарь КАК КЛАСС** — решение о переводе принадлежит подписи владельца на банк КНИГИ, пар-словарь форсит один регистр как единственно верный. Консилиум, приносящий «правильный русский регистр» из пар-данных, воспроизводит ровно отменённое. +4. **Инвариант, который нельзя размывать:** терминолог **не может ничего утвердить** — тронутый им терм эмитит `draft` (помеченный ⟨проверить⟩), отказ эмитит `auto` (`terminologist.go:31-35`, §C2-7). Худшее, что делает плохой вызов, — кладёт помеченное предложение перед редактором и владельцем. Любой дизайн консилиума обязан сохранить это свойство и явно сказать, как. «Три модели согласились ⇒ канон» — запрещённая форма. +5. **Самопроверка исполнением обязательна** (свой код + сформированные запросы к моделям + полученные результаты). Полигон регулярно багует, и это искажает эксперименты (D37). **Вывод на агрегате до вскрытия единиц запрещён** — перед любым «сигнал работает» открой глазами хотя бы по одной живой единице с каждой стороны. В конце — **адверсариальный проход author≠reviewer** по своим выводам (норма 01.08: соло-самопроверка платные пробы НЕ закрывает). + +--- + +## §1. Онбординг (карта чтения; доки целиком НЕ читать) + +1. `CLAUDE.md` — «Цели и мерило» (6 пунктов) + гардрейлы (**`.env` НЕ читать** · DeepSeek thinking НЕ отключать · аномалия провайдера → вендор-дока, не гадать) → CURRENT-STATE в `docs/PROGRESS.md`, строки **5**, **36б**, **48**, **48б**, **16**, **37**, **80**. +2. `docs/architecture/05-decisions-log.md` — **D39.69 целиком** (три примитива банка §1–§3 + список закрытого ПО НУЖНОСТИ, там же диспозиция 36б), **D39.70** (ответы владельца Q1–Q8), **D39.46** (что именно измерено про контексты и про судью), **D39.47** (жанровый словарь отменён как класс), **D39.42** (роль терминолога, эмиссия auto/draft), **D39.77** (политика подписи: банк обязан приходить верным АВТОНОМНО; сид — другой артефакт). +3. `docs/research/20-bank-mining.md` — **амендмент-шапка + §C2 + §E** (открытые вопросы, в т.ч. §E-1 мини-голд). `research/13` — TL;DR + Q-структура (там же `eval/retrieval_bench.py`). `research/14` — TL;DR и правило БАР (образец дисциплины: «не бьёт базис — не мёржить»). `research/15` — через ⚠-амендмент 26.07 (двухсекционная инъекция). +4. Код (читать, НЕ править): `internal/terminology/` (`terminology.go` — Merge/AttachKWIC/ScoreVariants; `series.go`; `classify.go`) · `internal/pipeline/terminologist.go` + `banknote.go` · `internal/membank/memory.go` (`Select`, trust-ранги, `RenderGlossaryBlock`/`RenderEditorConstraintBlock`) + `mempostcheck.go` + `memvoice.go` · `internal/miner/`. +5. `eval/README.md` + `docs/experiments/00-provider-quirks.md` (шапка + секция DeepSeek-V4-Flash-0731 целиком) — **перед любым платным вызовом**. + +--- + +## §2. Что УЖЕ установлено замером — не пере-открывать (приоры; опровергаются аргументом или замером) + +Это самая важная секция промта: половина наивных форм консилиума уже фальсифицирована НАШИМИ данными. + +- **Судья-модель — катастроф-ЭКРАН, а не ранжировщик (D39.46, измерено).** Слепой LLM-судья различает «сломано / не сломано», но не расставляет годные варианты по качеству. Это прямой приор ПРОТИВ схемы «модель ставит скор → скор выбирает победителя»; чтобы её принять, нужен замер, бьющий этот вывод. +- **Контексты — главный рычаг терминолога (D39.46, ратифицировано):** разрыв 6 термов при размахе 1. То есть качество арбитража сегодня двигает ПОДАЧА улик, а не количество мнений. +- **Канал отказа модели НЕСТАБИЛЕН (пакет-8, D39.50; отчёт `archive/reports/POLYGON_PREMEASURE_2026-07-26.md`):** на хвосте расширенной эмиссии роль **выдумывает dst 77–82% стабильно**, а сентинел ⟦TM-NO-DST⟧ различает «переводимо», а не «терм», и нестабилен даже там — **размах 0.375**. ⇒ «модель скажет „не уверен“» — уже проверявшаяся и провалившаяся форма. Хочешь строить на отказе/уверенности — обязан показать конструкцию, в которой этот замер не воспроизводится. +- **Согласие прогонов само по себе слабое (D39.50):** банкнота невоспроизводима между прогонами одних и тех же глав — **Жаккар 0.077–0.40**. Консенсус-механика, молча считающая согласие сильным сигналом, стоит на песке; мерить надо согласие ПО КОНКРЕТНОМУ ТЕРМУ, а не по составу списка. +- **Роль ре-решает контекстом, а не первым вхождением и не частотой** (first-occurrence-тест $0 исполнен, гипотеза первенства ОПРОВЕРГНУТА — D39.69). +- **Со-батчинг — единственное, что чинит расхождение внутри системы термов (D39.65 строка 21 → D39.69 §1):** черновики расходились по общей ГОЛОВЕ серии через границу батча (甲等→«класс», 乙丙丁等→«ранг»); порядковые и частотные трюки этого не чинят, чинит только показ набора целиком. **Это ядро возражения к по-терминному арбитражу — см. §4.** +- **KWIC-дефолт 3×40 достаточен (D39.50)**: ни одна точка сетки «подача × контекст» не отличима, 0×0 — лучшая. Не пере-открывать без нового носителя. +- **Формула §C2-3 намеренно НЕ мажоритарна** (`terminology.go:363-387`): частотный фактор ограничен 2× (floor 0.5), конформность может его перебить, согласие с подписанной строкой — отдельный фактор. Комментарий там же формулирует «почему»: N согласных чанков — это N независимых догадок из N ЧАСТИЧНЫХ видов книги, а не N подтверждений. +- **Деньги (замер, строка 16):** черновая волна + банкнота **$0.0247/волна**, терминолог **$0.006–0.013 за проход** — на 10 главах сопоставимо. Но: **арбитраж платится раз на книгу и по числу РАЗЛИЧНЫХ термов (насыщается), а инжект — на каждом чанке каждой волны каждой роли** (`memory.go:523`, `Select(chunk, chapter, sticky, budgetTokens)`). На книге эти оси расходятся на порядки. **Отсюда рабочая гипотеза пака, которую надо подтвердить или опровергнуть числами: в арбитраже качество можно покупать расточительно, в инжекте каждая строка платная навсегда.** +- **Банк обязан приходить верным АВТОНОМНО** (D39.59/67/77): подпись владельца опциональна и не является частью нормального пути. Дизайн, который «дотягивается качеством» за счёт того, что владелец всё вычитает, — не решение. +- ⚠ **Терминолог на весах 0731 сломан не алгоритмом, а транспортом:** 4 батча из 5 возвращались пустыми, банк консолидировал **1 терм из 81** (было 21/21 до смены весов; D39.86). **Валидный базлайн качества — coldrun-a, НЕ coldrun-b.** Сравнить консилиум с этой поломкой = получить фальшивую победу; такой вывод приёмка отклонит. + +--- + +## §3. Работа A — КРИТИКА ТЕКУЩЕГО АЛГОРИТМА В КОДЕ ($0, обязательный деливерабл) + +**Прямой запрос владельца.** Разбери сегодняшний путь терма от поверхности до инъекции и назови его дефекты — с `file:line`, а не по заголовкам. Маршрут: майнер (`miner/`) → банкнота (`banknote.go`, голоса чанков) → `Merge` + `AttachKWIC` + `ScoreVariants` (`terminology.go`) → серия-батчинг (`series.go`) → классификатор типов (`classify.go`, §2 D39.69) → терминолог (`terminologist.go`, эмиссия auto/draft) → банк (`membank/memory.go`) → отбор и рендер инъекции → пост-чек (`mempostcheck.go`). + +На каждый найденный дефект — вердикт-тройка §0 п.1 и класс: **сломано** (даёт неверный результат) / **хрупко** (верно случайно) / **дорого** (стоит непропорционально) / **слепо** (класс явлений не покрыт вовсе). Обязательно ответь по этим точкам, каждая — с собственным вердиктом (не пересказ, а проверка): + +- **Единица решения.** `ScoreVariants` ранжирует варианты ОДНОГО кандидата независимо от соседей; единственный межстрочный сигнал — `Neighbours` (согласие с уже подписанной строкой), то есть работает только когда подпись УЖЕ есть. Автономный банк подписи не имеет ⇒ **на холодном старте связность системы термов не защищена ничем, кроме со-батчинга серий.** Так ли это? Насколько широко? (серия ловит равнодлинные наборы с общей головой — а семьи с общим КОРНЕМ, регистры обращения, алиас-графы одной сущности?) +- **`Related`/`containmentRelations`** (`terminology.go:242-256`) обрезан на 4 и заявлен как «контекст для человека и модели, не индекс». Это честно — но достаточно ли для системной связности? +- **Однопроходность.** Терминолог видит книгу один раз; решения ранних батчей не пересматриваются поздними. Где это стоит качества? +- **Потери на швах:** `foldVariants` · `OriginAlias`-путь «не потерять поверхность» (`terminology.go:180-192`) · строка 48 «направленная банкнота» · строка 37 (квадратичность `AttachKWIC`: 16.8 с на 2000 кандидатов) · строка 28 (7 строк утечки латиницы через экран). +- **Инжект-сторона:** `Select` — precision over recall (`memory.go:42`), trust-ранги, sticky-окно, токен-бюджет. Что режется при переполнении бюджета и по какому правилу? Двухсекционная инъекция (закон CONFIRMED + ⟨проверить⟩) — есть ли замер, что помеченная секция читается моделью МЯГЧЕ, чем закон? (приор: замера нет). +- **Наблюдаемость арбитража:** можно ли сегодня по артефактам прогона ответить «почему у этого терма такой dst»? Если нет — это дефект класса «слепо», и он гейтит любой будущий арбитраж (нельзя улучшать то, чего не видно). + +⚠ **Не чинить.** Работа A — диагноз, а не правка. Код бэкенда — чужая зона и **прямо сейчас в ней ЖИВАЯ сессия** (строки 104/46/16: `internal/config/`, `internal/pipeline/`, новый `internal_call.go`). Твои находки уезжают строками бэклога и рекомендациями §6. + +--- + +## §4. Работа B — АРБИТРАЖ: голд → уверенность → консилиум (≤$1.40 из общего потолка) + +**Порядок жёсткий: без B1 остальные пробы неинтерпретируемы.** + +**B1. Голд-набор ($0, гейт остального).** Без размеченной истины любое правило арбитража нефальсифицируемо. **Ядро уже есть:** `~/books/gu-zhenren/guzhenren-seed-v2.yaml` — 58 записей, **53 `approved`** с подписанным владельцем dst; плюс дистилл-фикстура BANK-FULL (150 поверхностей побайтно равны боевому TSV, D39.75-ж) и банк coldrun-a. Собери из этого голд и **честно назови его смещение**: сид — это термы, до которых у владельца дошли руки, то есть выборка сдвинута к важным и уже спорным. Нужны ли добавки (мини-голд алиасов §E-1 research/20 — вопрос владельцу, ответа на него нет с 17.07) — реши и сформулируй запрос конкретным списком, а не «нужна разметка». Голд персистить в `eval/bank_arbitration/gold/`, провенанс каждой строки — обязателен. + +**B2. Калибровочная проба (≤$0.60): МОГУТ ЛИ наши модели оценивать свою уверенность.** Прямой вопрос владельца, и он не выводится из литературы — только замером на НАШИХ моделях и НАШЕЙ задаче. Пре-регистрируй критерий. Замерь **разделяющую способность, а не точность**: попадает ли верный по голду dst в верхнюю часть шкалы чаще неверного (ранговая мера — AUC или её непараметрический эквивалент; на десятках термов доверительный интервал широкий, и это надо честно напечатать). Обязательные срезы: +- **числа против слов** (0–100 против «точно / скорее да / не уверен / не знаю») — какая форма разделяет лучше и стабильнее при повторе; +- **устойчивость к повтору** (тот же вопрос дважды — тот же скор?) и к перестановке вариантов; +- **сравнимость МЕЖДУ моделями** — ключевой вопрос: «0.9» модели A и «0.9» модели B это одна шкала? Приор: **нет**, и тогда сырой кросс-модельный скор как решающее правило запрещён без калибровки; +- **канал отказа** — воспроизводится ли нестабильность ⟦TM-NO-DST⟧ (§2) в лучшей конструкции; +- **против бесплатного базиса:** бьёт ли уверенность сегодняшние даровые сигналы (частота по чанкам, конформность, лемма, согласие вариантов) — это БАР (в). Не бьёт → в отчёт идёт «уверенность как арбитр закрыта по нужности», и это полноценный результат пака, а не провал. + +**B3. Консилиум (≤$0.80): форма, а не факт.** Владелец назвал «консилиум без голоса» (равноправные модели) и допустил взвешивание. Сравни на голде минимум три формы против базиса §C2-3: +- **(и) равноправный совет** — N моделей независимо, агрегатор детерминированный; +- **(ии) улики-первым** — §C2-3 решает, совет только на спорных (близкая верхушка) — дешевле в N раз, потому что спорных меньшинство; +- **(иии) взвешенный** — веса из B2/голда, а не назначенные. +Плюс **обязательный контроль:** одна модель, спрошенная N раз (само-согласованность). Если она даёт тот же выигрыш, что совет разных моделей, то «разные семейства» не окупаются, и это ровно вопрос Q2 (строка 5), на который пак и обязан ответить. + +⚠ **Главное возражение, которое обязано быть проверено, а не обойдено — СВЯЗНОСТЬ СИСТЕМЫ.** Строки банка не независимы: они образуют системы (семья общего корня, серия рангов, регистр обращения, алиас-граф одной сущности). **По-терминный argmax ломает систему, даже когда каждый выбор локально лучший** — и это у нас уже измерено на серии (§2, D39.65 строка 21). Пример класса, НЕ покрытого сегодняшним `DetectSeries` (равная длина + общая голова): семья общего корня, где члены разной длины и голова разная — модель A даёт связную тройку «энергия/камень/жила», модель B связную «ци/камень ци/канал ци», а по-терминный победитель собирает химеру из обеих. **Требование к дизайну: единица арбитража — КЛАСТЕР, а не строка**; совет голосует за согласованный набор, а отклонение отдельной строки от набора — исключение, требующее улик. Проверь это на голде и назови, какие кластеры сегодня детектируются, а какие нет. + +**Стоимость обязана быть посчитана в терминах КНИГИ, а не пробы:** число различных термов насыщается, число глав — нет. Дай оценку «$ на книгу в 1000 глав» для каждой формы, с названным допущением о росте словаря. + +--- + +## §5. Работа C — ИНЖЕКТ/ФЕТЧ (≤$0.60) + +Владелец назвал инжект и фетч отдельно, и по §2 это ось РЕКУРРЕНТНЫХ денег. Известное: recall банка на холодном прогоне 0.918/0.980 (D39.58). **Но recall — не продуктовая метрика.** Мерить надо ПОСЛУШАНИЕ и ВРЕД: раз модели инъекцию слушают (наша же эмпирика), они одинаково послушно берут и неверную строку. + +- **Что мерить:** доля инъецированных строк, реально отражённых в выходе; доля случаев, где инъекция ИСПРАВИЛА выход против безинъекционного контроля; и **доля, где она его УХУДШИЛА** (неверная строка, неуместный падеж/регистр, вытеснение более нужной строки бюджетом). +- **Ручки, которые стоит различить:** объём инъекции (токен-бюджет) · порядок · пометка (закон против ⟨проверить⟩) · sticky-окно · разница между черновой и редакторской формой (`RenderGlossaryBlock` против `RenderEditorConstraintBlock`). +- **Проба маленькая и адресная:** это не полный эксп-пакет, а замер, отвечающий «есть ли здесь вообще управляемый рычаг». Нет рычага — так и скажи, строка уедет в бэклог с честным «не окупается мерить дальше». +- ⚠ **Не строй эмбеддинг-ретривал.** Закрыт по нужности (D39.69), реопен = измеренный recall-разрыв НА МАСШТАБЕ, и только batch-time лейн. Если твой замер такой разрыв покажет — это находка, а не разрешение строить. + +--- + +## §6. Работа D — РЕКОМЕНДОВАННЫЕ ДАЛЬНЕЙШИЕ АЛГОРИТМЫ ($0, обязательный деливерабл) + +**Прямой запрос владельца.** Отдельной секцией — ранжированный список того, что делать дальше с банком, **как инженерная рекомендация, а не как список идей**. На каждый пункт: что даёт (по возможности числом или названным ожидаемым эффектом) · чего стоит (деньги и сложность) · на чём стоит (какой замер его обосновывает) · **чем опровергается** · зависимость от других пунктов. Явно раздели три корзины: **строить сейчас** · **измерить прежде чем решать** · **закрыть по нужности** (последняя обязана быть непустой — если у тебя всё «надо строить», ты не применил §0 п.1). + +Обязательно накрой: арбитраж (итог §4) · связность кластеров · инжект (итог §5) · наблюдаемость «почему такой dst» · холодный старт против накопленного банка · перенос на вторую пару (ja→ru; ⚠ **не-CJK детектора не существует** — строка 35, en-майнер даёт 0 эмиссии, ja с zh-таблицами активно неверен 0/10) · серийный шаринг банка между книгами (строки 48а/48б). + +**Свободная критика приветствуется.** Если считаешь, что центральная ценность лежит не там, где мы её ищем, — скажи это с обоснованием: это ровно тот случай, ради которого написано процессное правило №4. + +--- + +## §7. Чего НЕ делать + +`backend/` **не править ВООБЩЕ** (чужая зона; там ЖИВАЯ сессия — незакоммиченные `internal/config/`, `internal/pipeline/`, новый `internal_call.go`) · `frontend/`, `platform/`, `START_PROMT.MD`, `.claude/settings.local.json` — не трогать · **`~/books/gu-zhenren/coldrun-a/` — ЗАМОРОЖЕННЫЙ ЭТАЛОН, только чтение**; `coldrun-b/` — **стенд живой бэкенд-сессии, не трогать вовсе** · пробы гонять СВОИМ харнессом в `eval/bank_arbitration/` против API напрямую (не через движок — так проба не зависит от незакоммиченного кода; перенос выводов в движок обязан быть назван явно) · **`.env` НЕ читать** · слаги моделей — live-фактчеком `/models`, не по памяти · **DeepSeek thinking НЕ отключать**; помни, что бэнк-роли на вендор-дефолте `high` сейчас упираются в потолок (§2) — в СВОЁМ харнессе эффорт задаёшь ты сам, и это надо напечатать в отчёте, иначе числа несравнимы · тексты книги в доки НЕ цитировать (сырьё durable в `~/books`) · не коммитить · **не строить механизм, потому что он красивый** — только под измеренную нужду (канон целей, п.3). + +⚠ **Фолд-ось: любое предложение обязано назвать свою цену детерминизма.** Строки банка фолдятся в `memory_version`, резолвнутая конфигурация — в снапшот → `RequestHash` → чекпойнты. Смена правила арбитража меняет банк ⇒ меняет инъекции ⇒ **промахивает чекпойнты и перекупает прогон**. Рекомендация без ответа «что это двигает и сколько стоит пере-покупка» неполна. + +--- + +## §8. Отчёт и СТОП + +`docs/research/24-bank-arbitration.md`: эхо-шапка · **§A критика текущего кода** (дефекты с `file:line`, классами и вердикт-тройками) · **§B арбитраж** (голд и его смещение · числа калибровки со знаменателями и интервалами · формы консилиума против базиса §C2-3 · кластерная связность · $ на книгу) · **§C инжект/фетч** · **§D рекомендации тремя корзинами** · **вопросы владельцу** отдельным коротким списком (если нужен мини-голд — конкретным перечнем) · **критик полноты против себя** (обязательная секция: какой класс явлений не покрыт, какая проба не гонялась, какой вывод стоит на одном источнике) · **адверсариальный проход author≠reviewer** по своим выводам · **заявление = команда**: каждое число сопровождено командой/скриптом, которым получено (приёмка их пере-ранит) · провенанс сырья · деньги по пробам и суммой. + +Краткий итог — `docs/PROGRESS.md`, секция `## Полигон`, СВЕРХУ; бэклог-таблицу и CURRENT-STATE НЕ трогать. D-номер лендинга проставит оркестратор. **СТОП — приёмка оркестратора.** + +**Легитимные исходы пака, которые НЕ являются провалом:** «консилиум не бьёт базис — закрыть» · «уверенность не разделяет — закрыть» · «голда недостаточно, вот точный запрос владельцу — остальное неинтерпретируемо» · «рычаг лежит в инжекте, а не в арбитраже». diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index ea8a67e6..179e77cf 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-02, голова D39.88). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md`; этот файл — ЖУРНАЛ.** +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-02, голова D39.89). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md`; этот файл — ЖУРНАЛ.** > - **Сделано (сводно; детали — D-лог и архив-слайсы):** Ф0 ✅ · Ф1-инфра ✅ · арх-ресет D39 (7 слоёв, паки 11–16) ✅ · паки 17 «канал B» · 18 «долги» · 19 «голос/состояние» · 20 «банк+терминолог» ✅ (D39.26–28/31/41–56) · мини-прогон (D39.37) и ХОЛОДНЫЙ прогон (D39.58: recall банка 0.918/0.980, банк приходит переведённым) приняты · полигон-пакеты 5–8, ToS-речек (D39.57), Р6+P4 (D39.61) закрыты · **карта языковой привязки движка (D39.60): 149 сайтов/45 файлов, книго-ось чиста (4), ja→ru безопасно без правки Go, en→ru — нет** · Р1–Р4 закрыты целиком (D39.63: Р2 = ЗНАЧЕНИЕ, Р4 = норма потолка recall) · **ФАЗА 2 ОБЩНОСТИ ✅ (D39.64: П0 эмбед-хеш · П1 цель-шов · П2 скрипт-шов, ko-баг закрыт · П3 нарезка · П4 манифест-по-каналам; голден вердикт-нейтрален 0/172, майнер-парити EXACT)** · жанровый словарь отменён как класс (D39.47) · петля ремонта построена и НЕ включена (D39.38). > - **Курс (D39.59–78): ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ (D39.69/75/77) → ПАКЕТ-ЧЕКЕРОВ ✅ (D39.78: строка 25 целиком; харнесс labels В GIT 12/12; K2 r0.85 · K4b r0.22 · K6 fp 14→6; Р2 hard/soft + Р4-потолки в контрактах).** **Текущее: МЕЛКАЯ ПАЧКА ✅ ПРИНЯТА И ЗАЛЕНДЕНА (D39.82: строки 89/53/83 закрыты · 93 сужена до остатков · F4-бэкап+pre-flight построен · register/жанр → книжный слой · DC7 пере-гейчен сид-покрытием → строка 98); решения §6 исполнены (D39.79/82); **РЕ-ПРОБА + ОТЛАДОЧНЫЙ ХОЛОДНЫЙ ПРОГОН coldrun-b САНКЦИОНИРОВАНЫ (D39.83: промт выдан и холодно аудирован — 3 major вправлены; потолки $0.15 ре-проба / $5 прогон; ступени 2+8 глав, автобанк по D39.77)**; ре-проба flash (строка 74) — по слову владельца; finding-1 ЗАКРЫТ (D39.77); онбординг-оверхол доков исполнен (D39.80); **ФРОНТ ОТКРЫТ владельцем (D39.81: продукт = SaaS; зоны `frontend/` + `platform/` живые, фронт работает на моках; движковая очередь НЕ пере-упорядочена — ранняя вставка одна: строка 95 «контракт API» $0; строки 96/97 и перевесы 49/94 заведены)**; **СТЕК ФРОНТА/ПЛАТФОРМЫ ЗАПИНЕН, 8 решений владельца ратифицированы (D39.84: SEO Google-only · PWA-первый · денег в MVP-UI нет · стоп-на-банке = параметр запуска, `--verify-bank` готов · перевод НИКОГДА на индексируемый URL = ПТ-34 · якорь чтения = edit-unit, ПТ-21; работы движка под фронт = строки 99–102; фронт/платформа ведут ЗОННЫЕ бэклоги — `frontend/docs/BACKLOG.md` · `platform/BACKLOG.md`, строки 96/97 → П-1/П-2; зоны залендены, фронт-промт S0–S7 в `frontend/docs/`)**; **ШОВ ДВИЖОК↔ПЛАТФОРМА РАТИФИЦИРОВАН ПО РЕСЁРЧУ (D39.85, `research/23`): NDJSON-поток событий → материализация в Postgres → SSE; артефакты границ стадий; анти-паттерны запрещены (живой SQLite не читать · HTTP в движок не тащить · read-пакет из ядра не выносить); строка 103 заведена, входы контракта 95 зафиксированы)**.** **coldrun-b ПРИНЯТ И ЗАЛЕНДЕН (D39.86): фазы A/B исполнены за $0.114378 из $0.15, фаза C заморожена чекпойнтом — легитимный исход по D39.83.** Блокер 0731 воспроизведён на боевой форме (0 из 9 пригодных при `max_tokens=8496`); **вариант (а) флор-16000 ФАЛЬСИФИЦИРОВАН** (4/5 пустых при 16992, добавка уходит в размышление); **(б) `reasoning_effort:"low"` оживляет волну, но требует правки Go** (у бэнк-ролей ручки нет — НОВАЯ строка 104; посылка об амендменте гейта неверна только для СТАДИЙНОЙ ручки); **(в′) thinking OFF замерен карантинно — эхо-мина ЖИВА на весах 0731 (4/20)**, флаг `echoes_when_thinking_off` сохраняет основание; **(г) pro ≈×8.9, а не ×3.1**, и на pro ручка эффорта не работает (вендор `low→high`, смена маппинга объявлена «early August 2026»). Порог классификатора **6/6 взят**; две дыры наблюдаемости закрыты; live-риг не собирался с D39.64 — починен. НОВЫЕ строки **104** (ручки синтетических стадий) и **105** (мис-вердикт классификатора + честность поверхностей); **46** повышена до «скоро» с живым носителем; **16 НЕ закрыта**. ✅ **РАЗВИЛКА 74 РЕШЕНА ВЛАДЕЛЬЦЕМ (D39.87): вариант (б)** — `reasoning_effort: "low"` черновику ПЛЮС правка Go, дающая ручку эффорта ролям, у которых её нет (строка 104), ПЛЮС экран целевого языка (строка 46). Мандат владельца на исполнение — «элегантно встроить в текущее решение по коду, чтоб было чисто»: правка обязана быть использованием СУЩЕСТВУЮЩЕГО поля `Stage.Reasoning`, одним швом на все три рукописные `config.Stage`, так чтобы четвёртое такое место не могло появиться молча. **Промт выдан** — `BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md` (работы A/B $0 + проба банка ≤$0.10 + добивка прогона ≤$5, закрывающая строку 16 и впервые дающая данные по осям голоса для 13б). Перекупок нет (D39.63). > - **Горизонт (D39.62/67):** ре-проба flash (74; + платный порог 6/6 классификатора + пробы 36б-замера Q2/эмиссии Q7 по слову) → **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · итерация №2 редакторов 65 · цена 16 · веса K1–K12 13а · вне-претрейн чекпоинт 55) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 62–68, 85) → Ф3 ридер-IDE (69–71). **Стоячие:** ToS-триггер 25.10 · Ш-2 до go1.27 · строка 74 перед любым платным прогоном. @@ -17,7 +17,7 @@ | **— ВИСИТ НА ВЛАДЕЛЬЦЕ —** | | | | | | | 2 | Четыре вопроса границы «алгоритмического идеала» (Annotator · семантический судья · ja→ru §B5 · ru-target до/после) | владелец | скоро (гейт «добора идеала» перед МАСШТАБОМ) | отдельное решение | D39.33, D39.38 | | 4 | **Ре-чек ToS по триггерам** — первый ИСПОЛНЕН 31.07, дельт вердиктов нет (D39.57); предмет Google-мониторинга перевешен на цепочку договора (PUP · Additional ToS · Google APIs ToS); следующие: квартал 25.10.2026 · первая лейблованная книга · любая правка `accepts_labels` | владелец/полигон | скоро (следующий триггер 25.10.2026) | отдельное решение (правило) | D39.32, D39.57 | -| 5 | **Судья-с-декоем/36б «второе мнение»** — бэкенд-стройка ЗАКРЫТА дизайном (D39.69): маршрут = полигон-ЗАМЕР нужности рецензента-другого-семейства ПОВЕРХ §1+§2 (Q2); переживёт замер → тонкая колонка наблюдаемости, не гейт | полигон | скоро (санкция Q2 D39.70 — слотом при ре-пробе 74) | полигон-замер → решение | D39.50 п.6, D39.58, D39.69 | +| 5 | **Судья-с-декоем/36б «второе мнение» → РАСШИРЕНО ДО АРБИТРАЖА БАНКА (D39.89), ПРОМТ ВЫДАН.** Бэкенд-стройка ЗАКРЫТА дизайном (D39.69): маршрут = полигон-ЗАМЕР нужности рецензента-другого-семейства ПОВЕРХ §1+§2 (Q2); переживёт замер → тонкая колонка наблюдаемости, не гейт. **Вход владельца 02.08 добавил в тот же замер четыре вопроса, которых в Q2 не было:** (i) калибровка САМООЦЕНКИ моделей как сигнала (числа против слов · устойчивость · **сравнимость между моделями**), (ii) взвешенный арбитраж против равноправного «консилиума без голоса», (iii) **связность системы термов как ограничение** — единица арбитража обязана быть КЛАСТЕРОМ (семья корня · серия · регистр · алиас-граф), а не строкой (по-терминный argmax возвращает классом дефект, вылеченный со-батчингом, D39.65 стр.21), (iv) инжект/фетч отдельной осью (мерить послушание и ВРЕД, не recall). Приоры против наивной формы уже есть: судья = катастроф-экран, не ранжировщик (D39.46) · канал отказа нестабилен, размах 0.375 (D39.50) · согласие прогонов слабое, Жаккар 0.077–0.40 (D39.50). Гейт всего — **голд-набор** (ядро: сид v2 53 `approved` + BANK-FULL 150 + банк coldrun-a; мини-голд алиасов §E-1 research/20 ждёт владельца с 17.07). Промт `BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md` (потолок $2.00, суб-потолки, пре-регистрация; легитимный исход — «закрыть по нужности») | полигон/ресёрч | **скоро (промт выдан D39.89; запуск — по слову владельца)** | замер → дизайн → решение | D39.50 п.6, D39.58, D39.69, D39.70 (Q2), **D39.89** | | 6 | **Строка Gemini в `accepts_labels`** — ждёт слова владельца о подписи интерпретации сужения как разрешения; ре-чек 31.07 понизил приоритет: подпись даёт ПРАВО, но не судью 18+ (фильтр неконфигурируем D22.6 + обход запрещён договором) — возвращаться при вопросе, требующем именно права | владелец | когда-нибудь | отдельное решение | D39.32, D39.57 | | 7 | Q2 «редактор под `sexually-explicit`» (grok-4.3 интерим · glm-5 после сверки ToS Z.AI · mistral вон) | владелец | когда-нибудь (перед первой explicit-книгой) | отдельное решение | D39.27 п.7 | | 8 | D22.7 пер-чанковый L3-скрин — несня­тое предусловие первой erotica-книги в проде, отдельный гейт | владелец | когда-нибудь | отдельное решение | D22.7, CURRENT-STATE (оркестратор) | @@ -111,6 +111,10 @@ | 103 | **NDJSON-эмиттер прогонных событий со стабильным словарём** (машинный канал живого статуса для платформы, `research/23` §2): NDJSON-логи уже есть (`LOG_FORMAT=json`, авто-оси trace/book/chapter/stage/role — `obs/logging.go:15-54`), но сообщения прозой, version-хендшейка нет, а **событие потолка отсутствует вовсе** (деньги только в тексте ошибки `stagerun.go:472-494`); нужен словарь-enum + version-хендшейк первой строкой (образец terraform -json: минор = ignore-unknown, мажор = reject) + событие потолка; все границы — единичные call-sites в pipeline рядом с готовыми slog; человеческие логи уже на stderr — stdout-дисциплина соблюдена | бэкенд | к подключению фронта (словарь — вместе с контрактом 95) | малое касание | research/23, D39.85 | | 104 | **У СИНТЕТИЧЕСКИХ стадий нет ручек `reasoning`/`temperature` — бэнк-роли и repair всегда едут вендор-дефолтом (Д2 coldrun-b, D39.86).** Проводной шов ОДИН — `terminologist.go:515` (`config.Stage{Name, Role, Model}`, поля `Reasoning`/`Temperature` пусты; из `:568` до провайдера читается только `st.Name`), он ОБЩИЙ для обеих бэнк-ролей (render `:289` и classify `:396`); третье такое же место — `repair.go:384`, и его доккоммент `:377-378` декларирует ровно ту посылку, которую замер фальсифицировал («no reasoning setting, so the provider default holds — thinking stays ON»). У `config.TerminologyGate` ключа нет вовсе. **Живая цена:** на весах 0731 терминолог 4/5 батчей `length` с `completion=8000` ровно и пустым телом, банк консолидировал 1 терм из 81 (было 21/21 `stop` до смены весов) ⇒ **при выборе (б) по строке 74 это ОБЯЗАТЕЛЬНАЯ правка, иначе банк не собирается**. Дизайн обязан: (i) быть мультиязычным ран-скоупным ключом (не пар-данные), (ii) накрыть ВСЕ ТРИ шва, (iii) решить `temperature` осознанно тем же диффом, (iv) держать один режим и для `control=extra_body_disable` (на glm пустой эффорт даёт thinking:disabled — не дефолт, а ВЫКЛЮЧЕНО, то есть зона эха), (v) ⚠ ловушка хеш-оси: `bankCheckpointExists` строит Request БЕЗ Temperature/Reasoning (`terminologist.go:498-501`), а `runAttempt` — с ними (`stagerun.go:403-406`, `Reasoning` входит в `RequestHash`, `render.go:308`) — сегодня оси совпадают лишь потому, что оба значения нулевые; «минимальная» правка только `:515` разведёт пробу чекпойнта и вызов ⇒ ложный `paid=false` и обрыв прохода по потолку до первого вызова | бэкенд | **блокер-очереди при выборе (б)/(в′)** | правка Go с тестом + батарея (после развилки 74) | D39.86, COLDRUN_B_DEBUG §3.6/Д2 | | 105 | **Роль `classifier` мис-вердиктится как эхо + честность двух новых строк наблюдаемости (D39.86).** (а) `classifyOutput` даёт поблажку `SourceEchoExpected` только `roleTerminologist` (`chunkrun.go:37`), а ответ классификатора по формату состоит из исходных ханьских термов ⇒ доля исходного письма 0.20–0.29 > порога 0.15 на каждом батче: живой артефакт пробы 6/6 несёт `verdict=cjk_artifact` при `bad_lines=0`. Ущерб узкий — `runBankRoleBatches` кладёт `run.texts[i] = att.text` без проверки диспозиции (`terminologist.go:603`), посчитанные эхо-ставки (`quality.go:313-321`) берутся из `chunk_status`, куда бэнк-путь не пишет ⇒ портятся только строки `tmctl report`/лога; **латентно** (`classify_types` выключен во всех шиппинг-конфигах). ⚠ Цена дисциплинированного фикса, которую надо знать заранее: бамп `classifierVersion` (литерал, сам не двигается) меняет payload снапшота → snapshot id → `RequestHash` ⇒ промах ВСЕХ чекпойнтов книги, то есть `--resnapshot` + пере-покупка. (б) тем же касанием — честность поверхностей: строка `VOICE` берёт `rules=` из конфига ВРЕМЕНИ ОТЧЁТА (`quality.go:436`), поэтому включение `gates.voice` после прогона печатает «измерено, чисто» для неизмеренной книги (воспроизведено); и она печатается при выключенном гейте, если `SpoilerLeaks>0` (дизъюнкция — поведение верное, формулировка отчёта/коммента неверна); знаменатель `BANKNOTE` = `len(states)` включая призрачные строки `retrieval_state`, тогда как соседний агрегатор их фильтрует (`quality.go:259-260`) ⇒ после пере-чанковки покрытие занижается | бэкенд | когда-нибудь (ближайшее касание банка/наблюдаемости; (б) — дешёвая часть, вердиктов не двигает) | малое касание + вердикт-двигающая половина (а) через СТОП-решение | D39.86 | +## Оркестратор №10 — АРБИТРАЖ БАНКА: гипотеза владельца о консилиуме принята к ПРОВЕРКЕ, промт выдан (D39.89), 02.08 + +Владелец поднял банк как центральную ценность и предложил для перевода термов **«консилиум без голоса»** со скорами уверенности от моделей, с оговоркой про слом стиля/системы соседних термов; отдельно потребовал в промте секцию рекомендованных дальнейших алгоритмов и критики текущего кода. **Разобрано как гипотеза на проверку, не как ТЗ.** Ключевое: трек НЕ новый — маршрут «второе мнение» ратифицирован (D39.69 закрыл стройку, D39.70 Q2 санкционировал полигон-замер, строка 5), поэтому Q2 РАСШИРЕН четырьмя новыми вопросами вместо дубля. **Три наших замера уже бьют по наивной форме гипотезы и вписаны в промт приорами:** судья = катастроф-экран, а не ранжировщик (D39.46) · канал отказа роли нестабилен (⟦TM-NO-DST⟧ размах 0.375, выдумывание dst 77–82%, D39.50) · согласие прогонов слабое (Жаккар 0.077–0.40, D39.50). **Несущее возражение оркестратора:** единица арбитража обязана быть КЛАСТЕРОМ, а не строкой — по-терминный argmax возвращает классом ровно тот дефект, который вылечен со-батчингом серий (D39.65 стр.21), а `Neighbours` (единственный межстрочный сигнал `ScoreVariants`) работает только при уже существующей подписи, которой у автономного банка нет. **Экономическая рамка, вписанная числами:** арбитраж платится раз на книгу и насыщается по числу различных термов ($0.006–0.013/проход), инжект — на каждом чанке каждой волны каждой роли (`memory.go:523`) ⇒ расточительность законна в арбитраже и запрещена в инжекте. Промт `BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md`: работы A (критика кода, $0) · B (голд → калибровка уверенности → формы консилиума, ≤$1.40) · C (инжект/фетч, ≤$0.60) · D (рекомендации тремя корзинами, $0); потолок $2.00, пре-регистрация каждой пробы, легитимные исходы «закрыть по нужности» объявлены заранее. ⚠ Названы коллизии: `backend/` живая, coldrun-a — эталон на чтение, coldrun-b — стенд живой сессии, валидный базлайн качества банка = coldrun-a (в coldrun-b терминолог сломан транспортом). **Запуск — по слову владельца.** + ## Оркестратор №10 — coldrun-b ПРИНЯТ: блокер 0731 вскрыт до корня, развилка 74 подана владельцу числами (D39.86), 02.08 Приёмка первой задачи хендоффа №9→№10. **Пере-проверено исполнением, а не чтением:** батарея независимо зелёная (build/vet/`vet -tags live` · `-race -count=1` все пакеты ok · парити EXACT · labels 5/5 фрозен · голден PASS · 5 новых тестов PASS); **деньги пере-выведены мной из сырья** (`sqlite3` read-only, пересчёт провайдерских `usage` по вендор-ценам мимо `ledger.CostUSD`): леджер **$0.114378** ≡ Σ чекпойнтов во всех ЧЕТЫРЁХ проектах до 6-го знака, независимый путь **$0.099267**, разница **$0.015111** = 3 декод-фейла (строка 78 живьём); все несущие счётчики пере-выведены из `chunk_status`/`request_log` и сошлись; строка `BANKNOTE` на боевой БД coldrun-a независимо воспроизвела `lines=182 over 18/20 · parse-fail 3` при неизменном sha256 БД. Плюс **9-осевой refute-воркфлоу** (скептик + независимый арбитр на каждую ось): 6 CONFIRMED, 2 PARTIALLY, 0 REFUTED. **Отчёт принят; тело не переписано, все поправки — в ревю-шапке** (10 пунктов). Несущие поправки: посылка об амендменте гейта неверна ТОЛЬКО для стадийной ручки, для бэнк-ролей ЖИВА ⇒ (б) = правка Go · «нет пути восстановления вообще» слишком сильно (ре-ген вылечил 1/5), НО **вылечил не бюджет — победивший вызов уложился НИЖЕ базового потолка** ⇒ лечит стохастика, а не потолок · волна (б) = **$0.028195**, не $0.0257 · вариант (г) ≈**×8.9**, не ×3.1 · Д1 недооценён (санитайзер условен тройкой, и `TargetActive()` только для ru ⇒ **для не-русской цели рубежа нет вовсе**; худший исход — тихо отгруженный релейный перевод zh→en→ru) · Д2 назван на 2/3 (третий шов `repair.go:384` с доккомментом, декларирующим фальсифицированную посылку) · строка `VOICE` говорит «сконфигурирован», а не «отработал» ⇒ **13б без данных**. **Вендор-факты, которых в отчёте не было** (пере-сняты мной, HTTP 200): дефолт эффорта = `high`; маппинг per-модельный — у pro **`low→high`** (рычага нет), и вендор объявил смену маппинга pro «early August 2026». `experiments/00-provider-quirks.md` обновлён (п.3а и п.10; отозван хвост «движок эту ручку слать не может» — может). **Ратифицирована норма прецедента:** ратифицированный гардрейл можно ПРОБОВАТЬ только карантином (копия конфига вне git, боевой файл и гейт не тронуты, вопрос релеем владельца), и результат = ЗАМЕР, не разрешение шипить. **НА ВЛАДЕЛЬЦЕ: развилка строки 74** — платных прогонов до его слова нет. — **РАЗВИЛКА РЕШЕНА тем же днём (D39.87): вариант (б); промт выдан после 4-линзового холодного аудита с независимым арбитражем (3 блокера + 15 major вправлены ДО выдачи).** diff --git a/docs/README.md b/docs/README.md index 8121335f..af44f226 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,7 +15,7 @@ - `experiments/` — эмпирика полигона: [00-provider-quirks.md](experiments/00-provider-quirks.md) — **читать перед любым вызовом провайдера**; [08-cost-model-v2.md](experiments/08-cost-model-v2.md) — денежная модель; [09-pilot-protocol.md](experiments/09-pilot-protocol.md) — пилот Ф2.5; остальные 01–16 — отчёты закрытых экспериментов (судьба — в баннерах/D-логе). - `research/` — фактура ресёрчей 01–22; у принятых — ревью-шапки, часть тел под ⚠ superseded: **читай баннер прежде содержимого**. Ключевые для навигации: 15 голос · 16 ридер-IDE · 17 внешняя критика · 18 рычаги качества · 19 нарезка · 20 банк-майнинг · 21 обзор транспорта · 22 доменные харнессы · 23 шов движок↔платформа (читать перед любым кодом стыка). - [PROGRESS.md](PROGRESS.md) — журнал: CURRENT-STATE + **ЕДИНЫЙ БЭКЛОГ** (единственный трекер) + живой хвост хроники. НЕ источник решений. -- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (полигон, отложен). [BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md](BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md) (**текущий бэкендный**, D39.87: ручка эффорта для ролей без неё · экран целевого языка · добивка холодного прогона; предшественник coldrun-b отработан фазами A/B и заархивирован, D39.86). Фронт-промт — в чужой зоне `frontend/docs/`. +- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (полигон, отложен). [BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md](BACKEND_EFFORT_HANDLE_SESSION_PROMPT.md) (**текущий бэкендный**, D39.87: ручка эффорта для ролей без неё · экран целевого языка · добивка холодного прогона; предшественник coldrun-b отработан фазами A/B и заархивирован, D39.86) · [BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md](BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md) (**ресёрч+полигон**, D39.89: арбитраж банка — критика текущего кода · голд · калибровка уверенности моделей · формы консилиума · инжект/фетч · рекомендации; расширение Q2 строки 5, запуск по слову владельца). Фронт-промт — в чужой зоне `frontend/docs/`. - Зоны фронта (чужие, читать при касании стыка; каждая ведёт СВОЙ зонный бэклог — единый бэклог их строк не принимает, D39.84): [../frontend/](../frontend/) — веб-интерфейс: промт фронт-сессий S0–S7 + [STACK_DECISIONS.md](../frontend/docs/STACK_DECISIONS.md) (пины версий точными числами и ловушки, сверены с вебом 02.08) + [BACKLOG.md](../frontend/docs/BACKLOG.md) · [../platform/](../platform/) — SaaS control plane: README-заглушка + [BACKLOG.md](../platform/BACKLOG.md). - `archive/` — история ([правила архива](archive/README.md)): закрытые промты (`prompts/`) · отчёты с ревью-шапками (`reports/` — на них ссылаются приёмки) · исполненные арх-доки (`architecture/`) · слайсы хроники `PROGRESS-*.md`. Инструкции оттуда не исполнять. - Диаграммы: [../backend/docs/components.puml](../backend/docs/components.puml) · [../backend/docs/pipeline.puml](../backend/docs/pipeline.puml) — дом рядом с кодом (D39.80), правятся бэкендом одним коммитом с кодом; вручную НЕ рендерить (владелец смотрит PlantUML-расширением VS Code). diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 528b49e3..a714f210 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.88 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07) +# Журнал решений оркестратора — контракт D1–D39.89 (развязки 04.07 · пакеты 09–10.07 · приёмка/качество-первым/пивот/эмпирика 11–12.07 · арх-ресет+стройка пере-прогонного стека 13–19.07) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Читая контракт целиком, держи под рукой, что чем перекрыто: > ⚠ **Навигация (актуализация 01.08):** карта ниже детально покрывает D1–D39.28; решения D39.29+ живут хронологически в теле файла, **свежая голова — С ХВОСТА** (новые ноты аппендятся вниз). Сводка текущей головы и очередь — CURRENT-STATE в `../PROGRESS.md`. @@ -1291,3 +1291,15 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу **Поэтому норма записана как ПРОТОКОЛ, а не как призыв** (канон — `CLAUDE.md` §Гардрейлы, «Git-координация мультисессий»): коммит ТОЛЬКО с явным списком путей `git commit -- <пути>` (pathspec-форма чужой индекс не трогает) · **никогда** `git add -A` / `git add .` / `git commit -a` · перед каждым коммитом `git status` + `git diff --cached --name-only`, и чужой путь в индексе не «прибирать», а обойти pathspec-формой · свои файлы не держать застейдженными между шагами (стейдж и коммит одной командой) · `reset --hard`/amend/rebase несвежих коммитов/checkout поверх грязного дерева — запрещены · чужое уехало в твой коммит → историю НЕ переписывать, сообщить владельцу · не коммитить `START_PROMT.MD` и `.claude/settings.local.json`. **Носители (правило обязано доехать до сессии, а не только до канона):** `CLAUDE.md` — таблица зон получила колонку «Коммитит сама?» + протокол в гардрейлах · `frontend/docs/FRONTEND_SESSION_PROMPT.md` — раздел «Коммит-права и git-протокол» перед первым коммитом (правка чужой зоны сделана оркестратором по прямому указанию владельца «надо ему явно это прописать»; прежняя формулировка §«Кто ты и твоя зона» несла только общий запрет и не давала механики) · `platform/README.md` — то же плюс ревью-гард модулей D39.85, потому что отдельного промта платформы ещё нет, а правило нужно ДО первой строки кода. ⚠ Фронт-сессия на момент ратификации ЖИВАЯ: правило доедет до неё только РЕЛЕЕМ владельца — бегущая сессия файл промта не перечитывает (норма хендофф-промтов п.4) (02.08.2026, оркестратор №10). ✅ + +## D39.89 — БАНК КАК ЦЕНТРАЛЬНАЯ ЦЕННОСТЬ: ГИПОТЕЗА ВЛАДЕЛЬЦА О КОНСИЛИУМЕ И УВЕРЕННОСТИ МОДЕЛЕЙ ПРИНЯТА К ПРОВЕРКЕ, ТРЕК = РАСШИРЕНИЕ Q2 (строка 5/36б), НЕ НОВЫЙ; ПРОМТ ВЫДАН (02.08, оркестратор №10). ✅ + +**Вход владельца (02.08, дословные опоры):** «банк памяти сейчас центральная ценность при переводе… туда нужен как грамотный инжект так и фетч по книге, прям очень грамотно алгоритмически продуманный»; перевод банка требует **«консилиума без голоса»** (равноправные модели; при неравноправии — склонять вес); открытый вопрос — **могут ли модели вообще устанавливать уверенность** (числами или словами) и можно ли на скоре строить выбор перевода терма; оговорка — выбор по-терминно может **разбить стиль/систему** соседних решений. Отдельно владелец потребовал в промте секцию **рекомендованных дальнейших алгоритмов/доработок и критики текущего решения в коде**. + +**Диспозиция: это НЕ новый трек.** Маршрут «второе мнение по банку» уже ратифицирован — **D39.69** закрыл бэкенд-стройку 36б по нужности и оставил ПОЛИГОН-ЗАМЕР нужности рецензента другого семейства поверх §1 (серия-батчинг) + §2 (тип-классификатор); **D39.70 (Q2)** санкционировал замер «ДО любой стройки», слотом при ре-пробе 74 (строка 5). **Новое в входе владельца, чего в Q2 не было:** (i) калибровка САМООЦЕНКИ моделей как сигнала; (ii) взвешенный арбитраж вместо равноправного; (iii) **связность системы термов как ограничение арбитража**; (iv) инжект/фетч как отдельная ось. Поэтому Q2 РАСШИРЕН этими вопросами, а не продублирован новой строкой. + +**Разбор оркестратора, вошедший в промт как приоры (грунтованы, не мнение):** **(1) экономическая асимметрия** — арбитраж платится раз на книгу и по числу РАЗЛИЧНЫХ термов (насыщается: замер строки 16 — терминолог $0.006–0.013/проход), инжект платится на каждом чанке каждой волны каждой роли (`membank/memory.go:523`, `Select(chunk, chapter, sticky, budgetTokens)`) ⇒ на книге оси расходятся на порядки, и «покупать качество расточительно» законно именно в арбитраже; **(2) три наших замера уже бьют по наивной форме гипотезы** — слепой судья = катастроф-ЭКРАН, а НЕ ранжировщик (D39.46); канал отказа роли нестабилен (⟦TM-NO-DST⟧ размах 0.375, выдумывание dst 77–82% на хвосте — D39.50); согласие прогонов само по себе слабое (Жаккар банкноты 0.077–0.40 между прогонами одних глав, D39.50); **(3) единица арбитража** — сегодня `ScoreVariants` ранжирует варианты ОДНОГО кандидата, единственный межстрочный сигнал `Neighbours` работает лишь при уже существующей подписи, а автономный банк подписи не имеет ⇒ связность системы термов на холодном старте держится ТОЛЬКО со-батчингом серий (`series.go`), и это ровно тот дефект, который был измерен и вылечен со-батчингом (D39.65 строка 21: 甲等→«класс» против 乙丙丁等→«ранг» через границу батча) ⇒ по-терминный argmax вернул бы его классом ⇒ **дизайн обязан оперировать КЛАСТЕРОМ (семья корня · серия · регистр · алиас-граф), а не строкой**; **(4) инвариант эмиссии** (терминолог не может утвердить — `draft`/`auto`, D39.42 §C2-7) размывать запрещено: «три модели согласились ⇒ канон» — запрещённая форма; **(5) D39.47** запрещает арбитражу превратиться в пар-словарь, форсящий один регистр. + +**Промт выдан — `docs/BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md`** (ресёрч+полигон сессия; зона: `docs/research/24-bank-arbitration.md` + `eval/bank_arbitration/` + секция PROGRESS; НЕ коммитит). Четыре работы: **A** критика текущего алгоритма в коде ($0, вердикт-тройки, дефекты классами сломано/хрупко/дорого/слепо) · **B** арбитраж (B1 голд — гейт остального; ядро уже есть: `guzhenren-seed-v2.yaml` 58 записей / 53 `approved` + дистилл-фикстура BANK-FULL 150 поверхностей + банк coldrun-a, смещение выборки назвать честно; B2 калибровка уверенности ≤$0.60 — разделяющая способность, числа против слов, устойчивость к повтору, **сравнимость МЕЖДУ моделями**, канал отказа, и обязательный БАР против бесплатного базиса §C2-3; B3 формы консилиума ≤$0.80 с контролем «одна модель N раз» — ответ на Q2) · **C** инжект/фетч ≤$0.60 (мерить ПОСЛУШАНИЕ и ВРЕД, не recall) · **D** рекомендованные алгоритмы тремя корзинами (строить сейчас · измерить · закрыть по нужности; последняя обязана быть непустой). Потолок **$2.00** с суб-потолками и пре-регистрацией критерия до каждой пробы. **Легитимные исходы, объявленные заранее:** «консилиум не бьёт базис — закрыть» · «уверенность не разделяет — закрыть» · «голда мало, вот точный запрос владельцу» · «рычаг в инжекте, а не в арбитраже». Мандат ревизии посылок (D39.68) и правило №4 (D39.47) вшиты. + +**Гигиена выдачи:** промт холодно аудирован автором перед выдачей по `file:line`/D-номерам; исправлена одна мис-атрибуция (фактура премеров — **D39.50**, отчёт `archive/reports/POLYGON_PREMEASURE_2026-07-26.md`, а не D39.71). ⚠ **Коллизия зон названа в промте:** `backend/` ЖИВАЯ (сессия строк 104/46/16), `coldrun-a` — замороженный эталон только на чтение, `coldrun-b` — стенд живой сессии; пробы гонять СВОИМ харнессом против API, не через движок. Валидный базлайн качества банка — **coldrun-a**, НЕ coldrun-b (там терминолог сломан транспортом: 1 терм из 81, D39.86) — сравнение с поломкой даст фальшивую победу консилиума и будет отклонено приёмкой. diff --git a/docs/product-requirements.md b/docs/product-requirements.md index 1ce971d4..cee0a9f9 100644 --- a/docs/product-requirements.md +++ b/docs/product-requirements.md @@ -21,7 +21,7 @@ | ID | Требование (источник) | Статус | Носитель / доказательство | |---|---|---|---| | ПТ-8 | Банк памяти на всю книгу, «крайне точный» (V0-п.7–8; Выводы-п.1) | ✅ | D39.69/75/77/78; recall банка 0.918/0.980 на холодном прогоне (D39.58). Смежный остаток H6 (running-summary): carryover закрыт замером (D39.7/8), проза-суммарайзер закрыт (D39.69), нарратив-состояние = строка 80 (гейт пилота Ф2.5) | -| ПТ-9 | Глоссарий автосборкой: модель переводит термины с контекстом/жанром (V4-п.4, H15) | ✅ | терминолог пака-20 (D39.41–53), KWIC-контексты, подписной цикл | +| ПТ-9 | Глоссарий автосборкой: модель переводит термины с контекстом/жанром (V4-п.4, H15) | ✅ | терминолог пака-20 (D39.41–53), KWIC-контексты, подписной цикл. **Вход владельца 02.08 (D39.89):** банк = центральная ценность, арбитраж перевода термов должен быть консилиумом со скорами уверенности, но не ломать связность системы термов ⇒ качество МЕХАНИЗМА поставлено на проверку (строка 5, промт `BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md`); статус ПТ-9 «построено» не меняется — под вопросом не наличие, а алгоритм | | ПТ-10 | Веб-фетч для терминов без культурного контекста (V0-п.16, V4-п.4) | ⭕ | гейт action-security = строка 70 (Ф3); до него — сид/бриф | | ПТ-11 | Голоса персонажей консистентны на книгу (V1-п.2; канон §1) | 🔶 | схема голосов построена (пак-19, D39.55/56); оси не подписаны — замер добора (строки 24 · 13б) |