diff --git a/docs/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md b/docs/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md index 935d16a4..71c92e8b 100644 --- a/docs/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md +++ b/docs/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md @@ -58,16 +58,30 @@ ⚠ Контроль «два одинаковых прогона дали 0 % пере-спроса» ВЫРОЖДЕН: он меряет детерминизм харнесса, а не силу предиката. Не засчитывай его. -⛔ **Материал замера — ТРИ вещи, а не одна, и это найдено опровергателем промта.** Из базы отпечаток не считается: -таблицы чанков в схеме НЕТ (контроль: в `tm-coldrun-b/evidence/paid-final-project.db` таблиц 17, в -`tm-coldrun-a/evidence/v16-readonly/project.db` — 16, `chunks` среди них ноль). Нужны: **(1)** копия базы — ответы ролей, -банк, чекпойнты; **(2)** ИСХОДНИК книги, он лежит отдельно: `/home/ubuntu/tm-coldrun-a/material/guzhenren-ch1-3.gb18030.txt` -(⚠ кодировка gb18030) и `evidence/*/source.txt`; **(3)** `book.yaml` того прогона. Отпечаток, посчитанный по единственному -тексту, который база хранит, — по ОТВЕТАМ модели, — измерил бы не тот предмет. +⛔ **Материал замера — НЕ ОДНА БАЗА, и первая редакция этого блока называла не тот файл.** Из базы отпечаток не +считается: таблицы чанков в схеме НЕТ (контроль: 17 и 16 таблиц, `chunks` среди них ноль). Нужны ПЯТЬ входов: +**(1)** копия базы платного прогона; **(2)** исходник `source.txt` рядом с ней; **(3)** `book.yaml` того прогона; +**(4)** зеркало конфигов прогона; **(5)** контраст майнинга. -⛔ **Сырьё куплено и невосстановимо. Работай на КОПИЯХ.** Базы: `/home/ubuntu/tm-coldrun-a` (14 баз, -`evidence/v16-readonly/project.db`) и `/home/ubuntu/tm-coldrun-b` (26 баз, `evidence/paid-final-project.db`, -`evidence/paid-bankstop/project.db`). База прогона A несёт схему 16 при голове 18: `OpenReadOnly` её отвергает, +⛔ **Какая база платная — проверено замером, а не именем каталога.** Прогон **A** — это +`/home/ubuntu/tm-coldrun-a/stand/books/bk_ROEHZBD46ALFI43E/project.db` (глоссарий **69** — число, на котором стоят все +замеры банка; чекпойнтов 33; Σ`cost_usd` **0.419423**, сходится с ратифицированной суммой). ⚠ `evidence/v16-readonly/project.db` +платным прогоном A **НЕ является**: `book_id` `guzhenren-coldrun-v16`, глоссарий 53, Σ 0.43611 — другая книга и другие деньги. +Прогон **B** — `evidence/paid-final-project.db`, он же `stand/books/bk_NH6275ZIRFFTLZHG/project.db` (66 · 34 · 0.396657); +дополнительно `evidence/paid-bankstop/project.db` годится как «проход 1 ДО подписи» (глоссарий 0, банка в нём нет). + +⛔ **Ловушка конфигов, которая портит замер МОЛЧА.** Все `book.yaml` прогонов ссылаются на `/home/ubuntu-26/…`, и этого +каталога на машине нет. Работай на КОПИИ `book.yaml`, перенаведя `pipeline`, `models`, `langpack_root` на +`/home/ubuntu/tm-coldrun-{a,b}/mirror/cfg/…` (у A реестр моделей и языковые пакеты — в `freeze/backend/configs/`). Иначе +загрузка либо падает, либо берёт конфиги ГОЛОВЫ, и ты меряешь не тот прогон. + +⚠ **Вход контура, которого в репозитории нет вовсе:** `backend/configs/pipeline-c1.yaml:139`=`contrast_path: mining-contrast.zh.txt` +— в git ноль файлов, в зеркалах прогонов он есть (349 046 строк) и резолвится ОТНОСИТЕЛЬНО каталога pipeline-файла. +⚠ Базы в WAL-режиме: копируй `project.db` вместе с `-wal` и `-shm`, печатай их размеры — копия одного файла при непустом +WAL есть устаревший снимок. ⚠ `source.txt` — сырые байты gb18030; гони чанки через ingest движка (автопроба кодировки у +него есть), а не читай файл харнессом как UTF-8, иначе кандидаты станут мусором и контроль покраснеет не по своей причине. + +⛔ **Сырьё куплено и невосстановимо. Работай на КОПИЯХ**, оригиналы не открывай вовсе. База прогона A несёт схему 16 при голове 18: `OpenReadOnly` её отвергает, а `Open` МИГРИРУЕТ (ряд **475**). Я пере-снял: миграции v17/v18 аддитивны — `CREATE TABLE IF NOT EXISTS` и `ALTER TABLE … ADD COLUMN`, ни одного `DROP`/`RENAME`/`DELETE FROM`, — то есть на копии `Open` безопасен, а оригинал не открывай вовсе. `sqlite3` как CLI на машине НЕТ: python3 + модуль `sqlite3`, режим `mode=ro`. @@ -83,9 +97,19 @@ двухрежимная эмиссия ставит `draft` ТОЛЬКО при непустом `dst` (`backend/internal/miner/miner_emit.go:279`=`st.Dst, st.Status = m.Dst, "draft"`), иначе строка остаётся `auto`. -⇒ Наивный фильтр молча ОБНУЛИТ уже купленную передачу: авто-банк потеряет её, а таблица стопа и проекция -покажут строку неотвеченной. Прогон станет выглядеть дешевле, а банк — беднее. Это ровно тот класс, за который -здесь бьют: выгода видна, потеря молчит. +⇒ Наивный фильтр молча теряет КОНСОЛИДИРОВАННУЮ передачу и статус. ⚠ Механика уточнена пингом исполнителя 17.09 и +пере-снята мной — прежняя редакция писала «обнулит передачу», это верно по следствию и неточно по механизму: +`backend/internal/miner/miner_emit.go:268`=`st.Dst = props[0].Dst` ставит передачу из СЫРОГО банкнотного предложения ещё до +консолидации, а статус поднимается отдельной веткой только при консолидированном значении. ⇒ снятая строка откатывается +к догадке ПЕРВОГО куска в статусе `auto`; целиком передача исчезает лишь там, где своего предложения на поверхности не +было. **И это опаснее обнуления, а не мягче:** пустой `dst` заметен на листе и в проекции, а строка с чужой догадкой в +статусе `auto` выглядит нормальной и едет дальше как обычная неотвеченная. Прогон при этом выглядит дешевле, а банк +беднеет — класс, за который здесь бьют: выгода видна, потеря молчит. + +⛔ **Отсюда прямое требование к базису, и довод берётся у самого кода:** `backend/internal/miner/miner_emit.go:274`=`The mode turns on the CONSOLIDATED dst only` +объясняет, что режим включается только консолидированной передачей и никогда сырой догадкой куска, иначе «первая мысль +модели становится рабочим каноном книги». ⇒ базис подставляет КОНСОЛИДИРОВАННЫЙ ответ, а не любой непустой — иначе он +сам сделает то, против чего эта ветка написана. **Поэтому базис подставляет ответ** — передачу, тип, род — там, где роль не спрашивали. Перечисли в записке ВСЕХ читателей ответа и покажи в отчёте, что каждый получил своё; начни с `attachConsolidatedDst`, @@ -102,6 +126,18 @@ передачу, которую в эту покупку никто не покупал, и поедут на КАЖДОЙ покупке. «Нет» — отметки исчезнут у населения, ради которого фильтр и сделан двух-условным. Молчание здесь — выбор вслепую, и он денежный. +⛔ **Проверок СПОРА три, а не две, и третья решает судьбу правила «семья — юнит».** Кроме двух названных есть +`backend/internal/pipeline/terminologist.go:637`=`terminology.ConsolidationConflicts(cands, out)`. Все три читают карту +передач и не знают, откуда передача взялась, денег не тратят. ⭐ Довод в пользу «да, судить»: пере-спрошенный член семьи +виден в конфликте с РЕШЁННЫМ братом только если брат присутствует в карте — иначе правило «семья решается целиком» +лишается единственного $0-прибора, который его стережёт. Цена «да» — не деньги, а шум на листе подписи, и лечится он +ЯРЛЫКОМ строки («решено памятью с покупки N»), а не молчанием. + +⛔ **И потому базисной строке нужен СВОЙ флаг, а не существующий «снято банком».** Код объясняет старый флаг дословно: +`backend/internal/pipeline/stopcontest.go:70`=`there is no answer to doubt` — строку, снятую банком, не оспаривают, потому что +ответа нет. У базисной строки ответ ЕСТЬ, и отметка спора на ней законна. Унаследуешь флаг по совпадению смысла — молча +выключишь спорность там, где она должна работать. Счётчик тоже свой: цикл счёта идёт по оплаченным. + ⛔ **Отдельно `Invented`:** `backend/internal/pipeline/mining.go:502`=`row.Invented = dst != "" && !proposedByDrafts(dst, c.Variants)` — передача, подставленная базисом, черновиками ЭТОЙ покупки не предлагалась и будет помечена «выдумано движком»: ложное обвинение собственного канона книги на листе подписи. Смежное, назови оба: `backend/internal/pipeline/stopcontest.go:75`=`if r.SettledByBank` @@ -158,7 +194,17 @@ в пар-данные, построено `D39.51`/`D39.53`, носитель — `backend/internal/lang/langpack.go:744`=`kwic_per_term`. Константа в Go стала бы единственной шириной и была бы пар-слепой по случайности, причём на ДЕНЕЖНОМ предикате. ⇒ ширина — пар-данное с движковым умолчанием, и в отчёте ответь на ревью-вопрос канона: заработает ли пара, которой в репозитории нет, без -правки Go. Инвариантность достигается тем, что отпечаток не читает ОТОБРАННЫЕ окна, а не тем, что ширина зашита. Якорь канона бери **по кандидату**, не по +правки Go. + +⛔ **И условие, без которого пар-данное само становится миной: ключ ОТДЕЛЬНЫЙ, не `kwic_width` и не `kwic_per_term`.** +Возьмёшь ширину провода — первый же «богаче контекст» пере-откроет решённое у КАЖДОЙ книги пары, то есть вернётся ровно +та связка, которую этот блок и запрещает. Инвариантность даёт то, что отпечаток не читает ОТОБРАННЫЕ окна; ручка ШИРИНЫ +хеш двигает, и это говорится прямо, а не умалчивается. Эффективная ширина входит в версию схемы в заголовке носителя, +чтобы смена пар-данного была НАЗВАННЫМ событием с числом, а не тихим обнулением. + +⚠ И уточнение к сторожу исходника: при отпечатке по всем вхождениям дописка в конец меняет отпечаток только у строк, +чьи вхождения попали в дописанное, — базис целиком не обнуляется. «Дописано» от «подменено» отличает хеш префикса +прежней длины, и это $0. Якорь канона бери **по кандидату**, не по батчу: `CanonFor` принимает батч (`backend/internal/terminology/terminology.go:856`=`func CanonFor(batch []Candidate`), и отпечаток по батчу вернул бы зависимость от состава, от которой пак как раз уходит. В отпечатке НЕТ вариантов черновиков, `freq` и `since_ch`. @@ -262,8 +308,9 @@ своей готовой работе; субагентов поднимать разрешаю явно. Глубину выбираешь сама, направление даю я — пять мест, где этот пак мягок: -1. **Потеря передачи у снятого кандидата** (§4.2) — самая тихая регрессия. Проверяй тем, что авто-банк и - стоп-таблица после прогона с базисом несут ТЕ ЖЕ ответы, что без него. +1. **Потеря передачи у снятого кандидата** (§4.2) — самая тихая регрессия. ⛔ Пин сравнивает **ПАРУ (передача, статус)**, + а не одну передачу: сравнение по одному полю пройдёт ЗЕЛЁНЫМ на строке, которая уехала с консолидированной передачи + на сырую догадку куска, оставшись в статусе `auto`. Уточнение пришло пингом исполнителя и подтверждено деревом. 2. **Точка записи** (§4.3) — посадка, ставящая базис до развилки, обязана краснеть пином резюма. 3. **Отпечаток** (§4.4) — посадка, меняющая число или ширину окон, НЕ должна обнулять набор решённых. 4. **Первый резюм после записи базиса** — он платит за переупаковку хвоста один раз. ⛔ **Пин обязан различать ДВЕ diff --git a/docs/orchestrator-norms-scratchpad.md b/docs/orchestrator-norms-scratchpad.md index a0e6f236..179fc2e3 100644 --- a/docs/orchestrator-norms-scratchpad.md +++ b/docs/orchestrator-norms-scratchpad.md @@ -109,7 +109,7 @@ UNKNOWN 1 — её, дошёл один раз до правок; десять | 12 | — (вне кодовых зон) | КОНСИЛИУМ «банк памяти длинной книги — как строить»: наследует банковую работу смены после отзыва проекта оркестратора; совет агентов, Fable 1–2 | textmachine-main-1e | ✅ своими словами; три опасности: шесть открытых решений против лимита в пять вопросов · исход «не термин» против закрытия D39.102 п.2 · угол «журнал с окнами» против почти пустых окон — все по делу, ответы отправлены | ✅ **ПРИНЯТ актом `D39.253`** 16.09: сдан по правилу остановки, приёмка — пять осей вне консилиума (50 находок, 14 мажоров), затем круг дофикса и узкий закрывающий. ⭐ Совет нашёл ратифицированный ответ на заглавный кейс владельца (D5 п.1, D7 правка 1), мимо которого прошли оба отозванных проекта. ⚠ Мои ошибки смены — в п.6 акта. Выдан 16.09 после механической сверки 13 блоков и ЧЕТЫРЁХ кругов опровергателя: 4 мажора + 15 миноров → 1 + 7 → 1 + 2 → 0 + 2, миноры последнего внесены. ⭐ Опровергатель нашёл то, мимо чего прошли оба отозванных проекта: ратифицированный ответ на заглавный кейс владельца (D5 п.1, D7 правка 1) и что у движковых строк банка окон почти нет (`since_ch` > 0 у 2 строк на книгу, `until_ch` = 0 у всех). ⚠ Дважды мажор родила МОЯ правка: цитата о заморозке без её предмета · баннер выписки, объявивший опровергнутым верное утверждение | | 13 | бэкенд | БАНК ЗА $0 — фундамент «умного участка»: ряды 441 · 445 · 449 · 459 | — (не выдан) | — | ⏳ **промт написан 16.09**, прошёл круг опровергателя фабла (7 мажоров: 5 внесены, **M1 опровергнут моим замером** — опровергатель напечатал «баз нет», а их 19, включая `bank_stop_presented` на 67 строк; 1 уточнён по ссылке). ✅ **ПРИНЯТ актом `D39.257`** 16.09: пять приборов (батарея 24/24 · мой прогон её 37 мутаций 37/37 без осечек · три оси вне сдачи · числа пере-сняты третьим прибором парсер-свободно · деньги 0 платных путей при контроле 192 файла). Два мажора названы, остаток принят. ⚠ Моя ошибка смены: снёс её рабочий корень мутаций — норма записана выше. ⚠ В самой выдаче явно попрошено ВЕРНУТЬ заказ, если сессия не свежая: норма «новый пак — новой сессии» стоит на том, что карта чтения писана для свежего читателя, а занятость чужого контекста снаружи не видна | -| 14 | бэкенд | РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ: базис решённого как ИСТОЧНИК ОТВЕТОВ (ряд 130) + страж разрыва окон (ряд 490) | textmachine-main-57 | ✅ **своими словами, десять пунктов, механика а не текст** — и ДО начала работы названы два кандидата на отказ с замером (ряд 447 как смена продуктового поведения · сторож растущей книги, чья посылка вынесена владельцу и ответа не имеет). Ошибок понимания в эхо нет: воспроизведены порядок блоков, инвариант «базис — ИСТОЧНИК ответа, не фильтр», один писатель на двух границах, инвариантность отпечатка к способу отбора при пар-данной ширине, обязательность статуса `draft` и развилка юнитов | ⏳ **ВЫДАН 17.09** после опроса кандидатов (свежих нашлось ДВЕ — `57` и `78`; взята `57`, второй сказано не занимать зону). Оба рубежа пройдены: механическая сверка 13 блоков (27 якорей, все живы, токен по адресу, коротких нет) и субагент-опровергатель — **12 находок, 9 денежных, все внесены**. ⭐ Чем окупился опровергатель: (1) я вписал «текста в коде УЖЕ НЕТ, 0 совпадений» о строке, которая ЖИВА ДОСЛОВНО, — грепал по одному файлу, увидел начало длинной строки, обрезанной по ширине, и прочёл обрезок как ФАКТ; у неё вдобавок третий носитель, голден операторских сообщений, которого я не видел вовсе; (2) замер M1 был заказан на копиях купленных баз, а таблицы чанков в них НЕТ (17 и 16 таблиц) — предмет из них не строится, нужен исходник отдельным файлом; (3) порядок записи на границе стопа задаёт САМ КОД («последним пишется то, чья потеря дешевле»), и по нему базис идёт ПЕРЕД памятью флажка, а не пятым, как велел консилиум; (4) ширину отпечатка я заказал константой Go — это утечка пары в общий слой, закрытая `D39.50`, причём на денежном предикате. ⛔ **И урок абзацем ниже — про эту самую выдачу: приоритет пака у владельца я НЕ подтверждал.** Слот бэкенда свободен, но «слот свободен ≠ работу зоны надо заказывать»; поэтому промт лежит файлом, исполнитель не назначен, и решение о выдаче — за владельцем. ⚠ В самой выдаче, когда она состоится, повторить норму строки 13: ВЕРНУТЬ заказ, если сессия не свежая | +| 14 | бэкенд | РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ: базис решённого как ИСТОЧНИК ОТВЕТОВ (ряд 130) + страж разрыва окон (ряд 490) | textmachine-main-57 | ✅ **своими словами, десять пунктов, механика а не текст** — и ДО начала работы названы два кандидата на отказ с замером (ряд 447 как смена продуктового поведения · сторож растущей книги, чья посылка вынесена владельцу и ответа не имеет). Ошибок понимания в эхо нет: воспроизведены порядок блоков, инвариант «базис — ИСТОЧНИК ответа, не фильтр», один писатель на двух границах, инвариантность отпечатка к способу отбора при пар-данной ширине, обязательность статуса `draft` и развилка юнитов. ⛔ **РЕЛЕЙ 17.09, через считанные минуты после выдачи: база прогона A в промте была названа НЕ ТА, и сессия уже строила прибор.** Я вписал `evidence/v16-readonly/project.db` — замер: `book_id` `guzhenren-coldrun-v16`, глоссарий 53, Σ`cost_usd` 0.43611; платный A — `stand/books/bk_ROEHZBD46ALFI43E/project.db`, глоссарий **69** (число всех банковых замеров), Σ **0.419423**, сходится с ратифицированной суммой. Нашёл советчик, пере-снял я. Той же правкой доехали три ловушки материала: все `book.yaml` прогонов ссылаются на несуществующий `/home/ubuntu-26/…` (загрузка либо падает, либо ТИХО берёт конфиги головы) · вход контура `mining-contrast.zh.txt` в git отсутствует вовсе и живёт только в зеркалах прогонов · базы в WAL-режиме, копировать с `-wal`/`-shm`. ⚠ Урок мой: **материал замера я назвал по имени каталога, а не по замеру содержимого** — «evidence» и «readonly» звучали как платная улика, и этого хватило, чтобы не открыть базу. Заказ, отправляющий мерить не тот предмет, дороже битого якоря: якорь виден линтеру, неверная база — никому | ⏳ **ВЫДАН 17.09** после опроса кандидатов (свежих нашлось ДВЕ — `57` и `78`; взята `57`, второй сказано не занимать зону). Оба рубежа пройдены: механическая сверка 13 блоков (27 якорей, все живы, токен по адресу, коротких нет) и субагент-опровергатель — **12 находок, 9 денежных, все внесены**. ⭐ Чем окупился опровергатель: (1) я вписал «текста в коде УЖЕ НЕТ, 0 совпадений» о строке, которая ЖИВА ДОСЛОВНО, — грепал по одному файлу, увидел начало длинной строки, обрезанной по ширине, и прочёл обрезок как ФАКТ; у неё вдобавок третий носитель, голден операторских сообщений, которого я не видел вовсе; (2) замер M1 был заказан на копиях купленных баз, а таблицы чанков в них НЕТ (17 и 16 таблиц) — предмет из них не строится, нужен исходник отдельным файлом; (3) порядок записи на границе стопа задаёт САМ КОД («последним пишется то, чья потеря дешевле»), и по нему базис идёт ПЕРЕД памятью флажка, а не пятым, как велел консилиум; (4) ширину отпечатка я заказал константой Go — это утечка пары в общий слой, закрытая `D39.50`, причём на денежном предикате. ⛔ **И урок абзацем ниже — про эту самую выдачу: приоритет пака у владельца я НЕ подтверждал.** Слот бэкенда свободен, но «слот свободен ≠ работу зоны надо заказывать»; поэтому промт лежит файлом, исполнитель не назначен, и решение о выдаче — за владельцем. ⚠ В самой выдаче, когда она состоится, повторить норму строки 13: ВЕРНУТЬ заказ, если сессия не свежая | ⛔ **ПОЛИГОН СНЯТ ВЛАДЕЛЬЦЕМ 11.09.** Я предлагал пак трижды — `ed`, `5c` (обе отработавшие, отказались ПО НОРМЕ и были правы) и свежей `37`, — после чего владелец сказал «полигон не надо выдавать». Выдача `37` ОТОЗВАНА тем же часом. ⚠ Урок не про полигон: **я трижды искал адресата для заказа, приоритет которого не подтверждал у владельца.** Слот зоны свободен ≠ работу зоны надо заказывать.