From 42533bb1665d018f93f2bdb6a7d94ed430d15f5b Mon Sep 17 00:00:00 2001 From: heaven Date: Sat, 5 Sep 2026 19:15:42 +0300 Subject: [PATCH] Take the review's verdict into both packs: the checker's instrument already exists and its precision is already measured, and the order pack is one session, not two --- docs/BACKEND_QUALITY_CANON_SESSION_PROMPT.md | 46 +++++++++++++++++--- docs/ORDER_FORM_SESSION_PROMPT.md | 43 +++++++++++++----- docs/README.md | 2 +- 3 files changed, 74 insertions(+), 17 deletions(-) diff --git a/docs/BACKEND_QUALITY_CANON_SESSION_PROMPT.md b/docs/BACKEND_QUALITY_CANON_SESSION_PROMPT.md index ba12fc9c..418e528c 100644 --- a/docs/BACKEND_QUALITY_CANON_SESSION_PROMPT.md +++ b/docs/BACKEND_QUALITY_CANON_SESSION_PROMPT.md @@ -15,6 +15,20 @@ ⚠ Голову журнала целиком НЕ читать. Номер грепается: тело — `^## D<номер>`; **подномер (`D39.196`, `D2.3`) собственного тела НЕ имеет** — это ПУНКТ внутри родителя, отбрось хвост. +## ⛔ ГЛАВНОЕ, ЧТО НАДО ЗНАТЬ ДО ВСЕГО ОСТАЛЬНОГО: ПРИБОР УЖЕ ЕСТЬ И УЖЕ ДАЛ ЦИФРУ +Первая редакция этого промта заказывала «замерить точность чекера» как неизвестное. **Это был заказ на +построенное, пойманный внешним ревью до выдачи.** Факты, каждый проверен командой: +· харнесс — `backend/internal/membank/labelharness_test.go` и `backend/internal/checks/labelharness_test.go`, + гейт окружения `TM_CHECKER_LABELS=1`; корпус лейблов **ВНЕ git** — `books/gu-zhenren/labels/`; +· результат записан: `books/gu-zhenren/labels/metrics.json`, класс `k6` (пост-чек глоссария) — + **`n=258, tp=1, fp=14, fn=0, precision=0.0667, recall=1.0`** (замер 26.07, ДО стеммера); +· ⇒ **из пятнадцати срабатываний ЧЕТЫРНАДЦАТЬ ЛОЖНЫЕ**, а полнота 1.0 держится на ОДНОМ положительном + примере — то есть порочна именно ПОЛНОТА, как и говорит строка 12, а точность измерена и она плохая; +· ⚠ все `fp_ids` — из прогонов С ПОДКЛЮЧЁННЫМ сидом (`acceptance`, `minirun`, `rerun2-*`), значит для + ЭТОГО прибора «сначала подключить канон» не предусловие: его корпус уже с каноном. +**Твоя работа — не построить замер, а СНЯТЬ ЕГО ЗАНОВО ЧЕСТНО:** добрать положительные примеры (без них +полнота — вырожденное утверждение) и пере-снять точность ПОСЛЕ стеммера. + ## ЗАЧЕМ ЭТОТ ПАК — одной фразой **Приоритет №1 владельца — «100% консистентность, никаких разнопереведённых терминов» — сегодня не исполняется, и живая дыра НЕ там, где её искали.** Не порог 98% и не ранг флага: **подписанный канон из @@ -23,13 +37,30 @@ ## ЧТО ДЕЛАТЬ — ТРИ ШАГА, ПОРЯДОК ЖЁСТКИЙ -**ШАГ 1. ПОДАТЬ КАНОН В ПРОГОН (строка 295).** Ключ `glossary_seed` в книжном конфиге существует +**ШАГ 1. ПОДАТЬ КАНОН В ПРОГОН (строка 295) — ЭТО ПРАВКА ДАННЫХ, А НЕ КОДА.** ⚠ Движковая половина +ПОСТРОЕНА и запинена: `backend/internal/pipeline/runner_memory_test.go`, греп +`TestRunnerMemoryInjectionAndPostcheck` — подписанные формы доезжают до system-сообщения ОБЕИХ ролей. +Не подключён сид на ОДНОМ стенде (`books/gu-zhenren/probe-4axes/book.yaml`), и это **сознательное +пре-регистрированное решение полигона**, а не забывчивость; на восьми других стендах сид подключён. +⛔ **Стенд — ЧУЖАЯ зона (полигон), и подключение сида двигает `memory_version` ⇒ ОБА снапшота ⇒ +обесценивает $0-резюм всех рук.** Куплено там около **$8.7**. ⇒ **без явного слова полигона и +оркестратора ничего на стенде не трогать.** ⚠ И `books` — симлинк в соседний worktree, который тебе +трогать запрещено: значит физически правит стенд ПОЛИГОН, а не ты. +⚠ **Что действительно движковое и $0:** данные канона (`allow_short: false` у одноруновых ключей — +`books/gu-zhenren/guzhenren-seed-v2.yaml`, и отсев `minKeyLenHan = 2` в `backend/internal/membank/memory.go`) +и, если решишь заказывать, поле в `status --json` «сид подключён / сколько подписанных форм» — сегодня +там есть только счётчик НЕподписанных. +**Прежняя редакция шага 1:** Ключ `glossary_seed` в книжном конфиге существует (`backend/internal/config/book.go`, греп `GlossarySeed`); канон лежит файлом. Задача: предъявить ИСПОЛНЕНИЕМ, что прогон идёт С каноном — что подписанные формы доезжают до провода обеих ролей и что `status --json` это показывает. ⚠ Если подключение двигает `RequestHash`/снапшот — **скажи ЦИФРУ цены пере-снапшота ДО того, как что-то менять**, и жди слова оркестратора: пере-снапшот есть пере-оплата. -**ШАГ 2. ЗАМЕРИТЬ ЧЕКЕР — ЭТО ГЛАВНОЕ (строка 12).** Прежний замер полноты ПОРОЧЕН и почему — сказано в +**ШАГ 2. ПЕРЕ-СНЯТЬ ЗАМЕР ЧЕСТНО — ЭТО ГЛАВНОЕ (строка 12).** Прибор и корпус названы выше; гонится как +`TM_CHECKER_LABELS=1 go test ./internal/membank -run <класс>`. ⚠ **Одно-Han класс структурно недостижим без +правки ДАННЫХ:** ключ `蛊` несёт `allow_short: false`, а отсев стоит на `minKeyLenHan = 2` — «добрать +одно-Han-позитивы» невозможно, пока это не сменится, а смена двигает `memory_version` ⇒ снапшот. **Назови +цену прежде, чем менять.** Прежний замер полноты ПОРОЧЕН и почему — сказано в самой строке: класс одного иероглифа не имел НИ ОДНОГО положительного примера, то есть «ошибок нет» означало «мерить было нечем». Нужны **точность и полнота на выборке, где положительные примеры есть**, и отдельно — **доля ЛОЖНЫХ срабатываний**. ⛔ Слово владельца 05.09 дословно: «если он ложно @@ -52,8 +83,10 @@ 2. **Адверсариальный проход по СВОЕЙ готовой работе.** Уязвимое место этого пака названо прямо: **замер, который меряет не то.** Атакуй свою выборку вопросом «а есть ли в ней положительные примеры того класса, про который я делаю вывод» — прежний замер пал ровно здесь. -3. **NAMED-АРТЕФАКТ: посадка `QC-canon-not-loaded` — предъявить КРАСНОЙ.** Смысл: сломать подачу канона - ⇒ замер обязан это заметить. ⚠ Этот механизм окупился 05.09: он поймал не «забыли прогнать», а +3. **NAMED-АРТЕФАКТ: посадка `QC-canon-not-loaded` в `backend/cmd/tmmutate/mutations.json` — предъявить + КРАСНОЙ.** Пакет — `./internal/pipeline/`, ожидаемый красный тест — `TestRunnerMemoryInjectionAndPostcheck`. + ⚠ **НЕ целить посадку в харнесс лейблов:** без `TM_CHECKER_LABELS=1` он СКИПАЕТСЯ, и посадка выйдет + зелёной по скипу — это форма ложной зелени, а не пин. ⚠ Этот механизм окупился 05.09: он поймал не «забыли прогнать», а ВЫРОЖДЕННЫЙ ТЕСТ — утверждение, зелёное потому, что его предмета в фикстуре не было. 4. **Своё воркфлоу-ревью** готовой работы — обязательная часть сдачи, не «если останется время». 5. **Fable 5 помощник — ОДИН, максимум ДВА**, модель задавать ЯВНО, вести долгим разговором, а не @@ -63,7 +96,10 @@ 7. **Каталог мутаций гонится ЦЕЛИКОМ и обязан СОЙТИСЬ.** «Прогнан целиком» и «прогнан целиком И СОШЁЛСЯ» — разные утверждения; 05.09 первый полный прогон нашёл четыре дыры именно потому, что был честным. ⚠ Проверка «якорь посадки резолвится РОВНО ОДИН раз» гоняется ПОСЛЕ КАЖДОГО касания кода. -8. **Нормы смены 05.09 — `^## D39.202`, прочти целиком.** Там девять форм ложной зелени, включая ту, что +8. **`docs/scripts/counts.py --lint` — гнать ОБЯЗАТЕЛЬНО** (его корень включает `backend/docs`, куда ты пишешь + полный отчёт): собственная проверка якорей тула НЕ заменяет этот гейт — вытеснение существующего гейта + своей привычкой стоило смене шести битых якорей (`D39.202` п.3-бис). +9. **Нормы смены 05.09 — `^## D39.202`, прочти целиком.** Там девять форм ложной зелени, включая ту, что стоила дороже всех: **гейт, ЗАЩИЩАЮЩИЙ дефект** (тест ПИНИТ неверное поведение). ## ЧЕГО ЖДЁТ ОТ ТЕБЯ ПРИЁМКА diff --git a/docs/ORDER_FORM_SESSION_PROMPT.md b/docs/ORDER_FORM_SESSION_PROMPT.md index dd536cbb..05e3266b 100644 --- a/docs/ORDER_FORM_SESSION_PROMPT.md +++ b/docs/ORDER_FORM_SESSION_PROMPT.md @@ -1,8 +1,7 @@ # Промт пака: ФОРМА ЗАКАЗА ПЕРЕВОДА — деньги, объём и вердикт ДО клика -> **Пак на ДВЕ зоны.** Половины независимы по коду и делаются РАЗНЫМИ сессиями: **платформа** (`platform/`) -> и **контракт** (канон `docs/architecture/14-api-contract/` правит ТОЛЬКО оркестратор — зона предъявляет -> состав минора отчётом). **Никто не коммитит:** деревья готовятся и передаются оркестратору +> **Пак делает ОДНА ПЛАТФОРМЕННАЯ СЕССИЯ.** Канон `docs/architecture/14-api-contract/` правит ТОЛЬКО +> оркестратор — зона предъявляет **состав минора ОТЧЁТОМ**, своей рукой канон не трогает. **Никто не коммитит:** деревья готовятся и передаются оркестратору > `textmachine-main-27`. Соседний worktree `/home/ubuntu/projects/textmachine` не трогать. > **`.env` не читать никогда.** @@ -40,19 +39,18 @@ не было): подтвердить замером — часть работы. ## СОСТАВ — ЧЕТЫРЕ ПОЗИЦИИ -**(1) Контракт, минор (строка 279).** Заказ ОБЪЁМОМ: `ceiling_chapters` → `chapters` со смыслом объёма +**(1) Контракт, минор (строка 279) — состав берётся ИЗ СТРОКИ ЦЕЛИКОМ, ниже только несущее.** ⚠ Первая редакция промта сузила его до четырёх позиций и тем противоречила собственной карте чтения; в строке есть ещё: `PausedReason` += причина исчерпания лимита, `Run` += заказано/доставлено глав, оценка `{expected, hold}`, границы денежного ползунка `{min: step_max, max: balance}`, ТРИ вида заказа, упрощение резюма, «фразы данными». Заказ ОБЪЁМОМ: `ceiling_chapters` → `chapters` со смыслом объёма (`null` = вся книга); `CeilingBounds` → `OrderOptions{chapters_left, affordable_chapters, verdict: covers_all|covers_part|covers_none, blocked}`; баланс и холд выходят ДЕНЬГАМИ. ⛔ **Поле недостачи в событии `ceiling` НЕ зеркалить под нынешним именем:** владелец выбрал форму «сколько добавить», значит `shortfall_micro_usd` станет ЛОЖНЫМ именем — величина `max(shortfall, step_max − headroom)`, кандидат `top_up_micro_usd`, `StreamVersion` 1.3→1.4 (строка **294**, `D39.203`). Зеркалить приговорённое имя — значит покупать второй минор. -**(2) Платформа (строка 280).** Заказ живёт на КНИГЕ (`ordered_through_chapter`, `null` = вся книга), холд +**(2) Платформа (строка 280).** ⚠ **`PD-422` берётся В ТОТ ЖЕ ПАК — так велит сама строка 280** (это её предусловие, не соседняя работа). ⚠ И знай заранее: комментарий `platform/internal/ingest/resync.go` (греп `waits on a decision of its own`) описывает гейт оркестратора на проводку `--max-units` — **этой строкой гейт СНЯТ**, читая комментарий буквально, ты встанешь на пустом месте. Заказ живёт на КНИГЕ (`ordered_through_chapter`, `null` = вся книга), холд считается ОТ ПРОЕКЦИИ движка, `--max-units` наконец едет в argv. **(3) Честность числа знаков (строка 282).** Подпись «Знаков» сегодня лжёт для EPUB — считаются руны -ZIP-архива. Источник построен: `source_chars` в манифесте. ⚠ Форму признака точности владелец -ратифицировал: **признак РЯДОМ с числом, а НЕ смена семантики `null`** — `null` уже значит «ещё грузится». -**(4) Замер (строка 281).** Сколько наших денег стоит тысяча ПЛОТНЫХ и тысяча РАЗРЕЖЁННЫХ знаков по +ZIP-архива. Источник построен: `source_chars` в манифесте. ⚠ Форму признака точности ратифицировал **ОРКЕСТРАТОР актом приёмки `D39.201` п.5(б)** — зона подала две законные формы и выбор оставила ему; **слова владельца тут нет** (испр. по ревью до выдачи): **признак РЯДОМ с числом, а НЕ смена семантики `null`** — `null` уже значит «ещё грузится». +**(4) Замер (строка 281) — ⚠ ЗОНА ПОЛИГОН, не твоя; он ГЕЙТ коэффициента холда для (2).** Пока его нет, коэффициент называет оркестратор явным числом. Не начинай его сам и не жди молча — скажи, что упёрся. Сколько наших денег стоит тысяча ПЛОТНЫХ и тысяча РАЗРЕЖЁННЫХ знаков по стадиям. ⚠ Цель — **НЕ константа** (это прямо запрещено), а **дисперсия проекции**: коэффициент для холда и честность вердикта «хватает / не хватает». @@ -62,12 +60,35 @@ ZIP-архива. Источник построен: `source_chars` в мани работа строки 294) · решение, ЧТО печатать на титуле (закрыто `D39.205`: копия без пометки = книга без единого пропуска, пропущенный КУСОК главы критичен). +## ⛔ ЧТО ПРИДЁТСЯ СЛОМАТЬ НАМЕРЕННО — НАЗЫВАЮ ЗАРАНЕЕ, ЧТОБЫ ТЫ НЕ ВСТАЛА НА ПИНГ +**Тест платформы ПИНИТ отозванный запрет:** `platform/internal/httpapi/v0_test.go`, греп на денежные +суффиксы в проводе книги — он краснеет на ЛЮБОЙ сумме. Владелец запрет отозвал (`D39.196`), значит правка +теста ЗАКАЗАНА, а не самовольна: по `D39.183` это обслуживание, но **объявляется в отчёте** — что +изменилось в поведении, какой тест это описывал, куда уехала гарантия. +**Носители того же отозванного запрета, которые пак обязан закрыть** (их называет `D39.196` п.2): +`platform/docs/ENGINEERING_STANDARDS.md` (зонный) · `frontend/docs/api-contract/openapi.yaml` и +`frontend/docs/API_CONTRACT_INPUT.md` §4.8 (зеркало ЗАМОРОЖЕННОЙ зоны — правит оркестратор, скажи ему) · +комментарии на пути провода в `platform/internal` (греп `D39.84`). + +## ⚠ ПРЕДУСЛОВИЯ ХОСТА — проверь ДО работы, иначе зелень будет ложной +· батарея зоны требует Postgres: без `TM_PLATFORM_TEST_DSN` тесты хранилища и бэкапа **СКИПАЮТСЯ**, и + скип читается как зелень (`D39.202` п.2); +· бинарь движка — не старше `81a89e9`, иначе манифест не несёт цен; +· фикстуры `manifest --json` снимать РЕАЛЬНЫМ бинарём, а не рукописные. + +## ⚠ ЧТО ПЛАТФОРМА ОТДАЁТ ДО ПЕРЕИМЕНОВАНИЯ ПОЛЯ — РЕШИ И НАЗОВИ +Строка **294** (переименование в форму «сколько добавить») **сегодня не выдана никому**, а поток на 1.3 +уже несёт старое имя. ⇒ реши явно и запиши в отчёт: считать величину самой, отдавать `null` или не +показывать блок — и предъяви довод. Молчание здесь станет третьим носителем расхождения. + ## ОБЯЗАТЕЛЬНЫЕ НОРМЫ СДАЧИ 1. **Ревью ИСПОЛНЕНИЕМ** своего кода и результатов; «проверено» без команды и её вывода — не утверждение. 2. **Адверсариальный проход по своей работе.** Уязвимое место названо: **вердикт «хватает», выданный по проекции, которая врёт.** Атакуй его короткой книгой, книгой без структуры и книгой с дырами. -3. **NAMED-АРТЕФАКТ: посадка `OF-verdict-lies` — предъявить КРАСНОЙ** (вердикт «хватает» при недостаточном - балансе). +3. **NAMED-АРТЕФАКТ: `OF-verdict-lies` — вердикт «хватает» при недостаточном балансе, предъявить КРАСНЫМ.** + ⚠ **Мутационного каталога у платформы НЕТ** (`tmmutate` — движковый инструмент). Форма прежних паков зоны + и она же обязательна здесь: ручная посадка в КОПИИ дерева + отчёт строкой «`file:line` · что подменено · + какой тест покраснел ИМЕНЕМ · был ли DSN». Без DSN тест мог скипнуться — тогда это не красный. 4. **Своё воркфлоу-ревью** — часть сдачи. **Fable 5 — ОДИН-ДВА агента**, модель задавать явно. 5. **Сверить промт с заказанным и НАЗВАТЬ расхождения**, а не исполнять молча. 6. **Состав контрактного минора — ОТЧЁТОМ**, канон своей рукой не трогать. ⚠ Ратификация, порождающая @@ -80,5 +101,5 @@ ZIP-архива. Источник построен: `source_chars` в мани ## ПРИЁМКА Два верификатора: №1 судит заказ и дифф **не читая отчёт**, №2 ищет ВНЕ карты отчёта; каждой находке — скептик с заданием СНЯТЬ её. Верификаторам выдаётся ГОТОВЫЙ ПУТЬ отдельного рабочего дерева. -**Отчёт — в зонный журнал `platform/docs/platform-PROGRESS.md`** (платформа в `docs/PROGRESS.md` не пишет). +⚠ **Пак делает ОДНА платформенная сессия**, а состав контрактного минора идёт ОТЧЁТОМ оркестратору — отдельной «контрактной сессии» нет: у неё не было бы ни зоны записи, ни журнала (испр. по ревью до выдачи). **Отчёт — в зонный журнал `platform/docs/platform-PROGRESS.md`** (платформа в `docs/PROGRESS.md` не пишет). ⚠ **Канал сессий — `/tmp/textmachine-channel`**, адрес сверять `ListAgents`. diff --git a/docs/README.md b/docs/README.md index 602e701d..98a9d8e8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -24,7 +24,7 @@ | Оркестратор | [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) | роль и нормы; счётчик роли — CURRENT-STATE | | Бэкенд · КАЧЕСТВО | [BACKEND_QUALITY_CANON_SESSION_PROMPT.md](BACKEND_QUALITY_CANON_SESSION_PROMPT.md) | **НАПИСАН 05.09, выдача по слову владельца** — «подать подписанный канон в прогон и ЗАМЕРИТЬ чекер»: строки **295** (канон в прогон) · **12** (пере-замер точности/полноты — прежний замер порочен) · рекомендация по гейту БЕЗ права его включать. ⚠ Строка **296** (точечная перегенерация) в пак НЕ входит — гейчена 295 | | Бэкенд · прежний | активного НЕТ | пак «денежный стоп» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.206** (`81a89e9` + `616a8e4`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **291** (флаг вместо клина, `D39.204`) · **294** (форма «сколько добавить», `D39.203`) · **296** (точечная перегенерация по промаху глоссария, после 295) | - | Платформа+контракт · ФОРМА ЗАКАЗА | [ORDER_FORM_SESSION_PROMPT.md](ORDER_FORM_SESSION_PROMPT.md) | **НАПИСАН 05.09, выдача по слову владельца** — деньги, объём и вердикт ДО клика (`D39.196`): строки **276 · 279 · 280 · 281 · 282**. ⛔ Читать с эрратой **05.09-д**: строки 277/278 УЖЕ ПОСТРОЕНЫ, заказывать заново нельзя; поле недостачи НЕ зеркалить — оно переименовывается (строка 294). Живая цель — **пол последних ~2 глав**, а не снятая стена десяти | + | Платформа · ФОРМА ЗАКАЗА | [ORDER_FORM_SESSION_PROMPT.md](ORDER_FORM_SESSION_PROMPT.md) | **НАПИСАН 05.09, выдача по слову владельца** — деньги, объём и вердикт ДО клика (`D39.196`): строки **276 · 279 · 280 · 281 · 282**. ⛔ Читать с эрратой **05.09-д**: строки 277/278 УЖЕ ПОСТРОЕНЫ, заказывать заново нельзя; поле недостачи НЕ зеркалить — оно переименовывается (строка 294). Живая цель — **пол последних ~2 глав**, а не снятая стена десяти | | Платформа · прежний | активного НЕТ | пак «пустить внутрь можно» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.201** (`7e2226a` + `3e84716`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **294** (зеркало словаря под минор потока) ⚠ (строка 293 — зона ОРКЕСТРАТОРА, не платформы: правило игнора общее для всех рабочих деревьев клона) | | Полигон | [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md) (отложенный — [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md), строка 85) | фаза Д ИДЁТ; ⚠ живой носитель курса — в `eval/dovodka/`, какой именно называет зона (⚠ [POLYGON_PHASE_D_HANDOFF.md](POLYGON_PHASE_D_HANDOFF.md) — перекрытый снимок, читать не как курс) | | Фронт | активного НЕТ | **ЗОНА ЗАМОРОЖЕНА** (D39.136 п.2 + D39.147: разморозка отдельным словом владельца, не привязана к P7); перечень первого касания — в зонном журнале |