From 5ecdc342bdbef10b2360df8777d33b69c67d2dc8 Mon Sep 17 00:00:00 2001 From: heaven Date: Sat, 5 Sep 2026 02:11:43 +0300 Subject: [PATCH] Re-take the two-forms row as a defect rather than a doctrine: the guard that keeps one rendering per chapter reads a single file, so a seed row and a mined row with overlapping windows both reach the wire --- docs/PROGRESS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 8f8fb466..c980e718 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -335,7 +335,7 @@ | 264 | **Фингерпринт-предпроход `tmmutate` падает на исчезнувшем файле ДО первой записи — каталог не ходит целиком, и пер-записной вердикт `ROTTED` этот разрыв НЕ закрывает.** Предъявлено: каталог с одной записью на несуществующий файл печатает `fingerprint …: no such file or directory` и не запускает ничего, включая здоровую запись за ней. Ветка `ROTTED` покрывает только гонку «файл исчез между фингерпринтом и посадкой», и комментарий инструмента теперь это и говорит | бэкенд | скоро | фингерпринт судит пер-записно, как и посадка | круг 4 петли, самопроверка инструмента | | 265 | **Питоново зеркало полигона держит ВТОРУЮ копию таблицы плейсхолдеров движка, и она разошлась: `genre` есть, `book_id` нет.** `eval/bank_arbitration/editor_wire_probe.py` — ПЛАТНАЯ проба, читающая ШИППИНГОВЫЙ `backend/prompts/zh-ru/editor.md`, на неё ссылаются ещё **25** скриптов (`grep -rl editor_wire_probe eval --include=*.py`; ⚠ испр. 05.09, первая редакция говорила «девять»); 27 промтов под `eval/` несут `{{genre}}`, который движок ОТКАЗЫВАЕТСЯ собрать при загрузке. ⇒ замеры идут на проводе, которого в проде не существует, и это «третий путь», которого в Go больше нет. ⚠ Зона ПОЛИГОНА — чинит она, носитель заведён оркестратором пингом | полигон | скоро (перед следующим платным замером) | зеркало читает таблицу движка, а не держит копию | передано бэкенд-сессией 04.09, чужая зона | | 266 | **Правки кругов 3 и 4 петли не ревьюил НИКТО — круг свёрнут решением владельца, а не замкнут.** Замеренная база, из-за которой это долг, а не формальность: ДВАЖДЫ подряд дефект вносил фикс предыдущего круга (круг 2 объявил денежную дыру закрытой — круг 3 показал, что она открыта; ратификация оркестратора по дедупу внесла живой дефект — поймала зона). Круг 3 добавил ~2000 строк и не ревьюил из них ни одной; круг 4 — две правки, обе проверены исполнением, но не чужими глазами. ⚠ Дисциплина петли исправлена эрратой: круг крутит СЛЕДУЮЩАЯ сессия по готовому паку, а не прежняя — правило «сессия отрабатывает скоуп и завершается» бьёт норму петли | бэкенд | скоро | проход свежей сессии по диффу `c77c3ba`+`2e13cd1` | решение владельца 04.09 остановить полировку | -| 267 | **Две НЕПОДПИСАННЫЕ строки одной поверхности теперь обе едут в закон-блок — провод изменился, доктрины на этот случай нет.** Было: одна (`元石 → «юаньши»`); стало: две (`юаньши` + `камень первоисточника`). Причина — фикс круга 2 (дедуп по `(src,dst)` + уступка неподписанной) снял схлопывание там, где подписи нет ВООБЩЕ. Ратифицированному правилу не противоречит (уступать нечему), и молчаливый выбор первой по сортировке был бы хуже. **Развилка:** конфликт двух неподписанных — показывать оба и репортить · схлопывать · НЕ давать приказа вовсе (закон-блок это ПРИКАЗ, а «либо A, либо B» приказом не является). Бьёт в цель №1: две конкурирующие формы термина на входе редактора | бэкенд | скоро | решение доктрины + пин выбранной формы | объявленная смена поведения, бэкенд-сессия 04.09, D39.183 | +| 267 | ⛔ **ОДИН ТЕРМИН В ОДНОМ СМЫСЛЕ МОЖЕТ НЕСТИ ДВЕ КОНКУРИРУЮЩИЕ ФОРМЫ, И ОБЕ ЕДУТ НА ОБА ПРОВОДА — дыра в ПРОВЕРКЕ схлопывания.** ⚠ **Пере-снято 05.09: было заведено как ДОКТРИНА («показывать обе или схлопывать») — это была неверная постановка оркестратора.** Владелец: у неподписанного термина тоже обязан быть ОДИН перевод, отвечает за это стадия схлопывания, подпись ни при чём. **Измерено зоной по коду и предъявлено на банке:** ключ уникальности БД — `(book_id, src, sense, since_ch, until_ch)`, значит один смысл при РАЗНЫХ окнах законен для БД; гард «одна форма на главу» существует (`backend/internal/pipeline/memseed.go`, греп `a term has ONE rendering per chapter`) и статус-слеп, **но работает ВНУТРИ ОДНОГО ФАЙЛА** — `loadMinedDelta` проверяет дельту саму против себя и НЕ против сида; точка слияния (`bankmaterialize.go`, греп `storeOrder`) отвергает только ТОЧНЫЙ дубль, перекрывающиеся окна проходят. Предъявлено: сид `[0,0]` «юаньши» + майнинг `[3,9]` «камень первоисточника», глава 5 внутри обоих ⇒ **injected=2, две строки и редактору, и черновику**. ⇒ Банк перестаёт быть законом ровно там, ради чего построен — консистентность термина на всю книгу. ⚠ **ГРАНИЦА, названная зоной: доказано, что состояние ДОСТИЖИМО и провода его несут; НЕ доказано, что обычная последовательность операций его производит** (консолидация даёт один `dst` на термин — сверено; сверяет ли она предложение с УЖЕ существующей сид-строкой другого окна — не мерено). Это дыра в проверке, а не наблюдённый инцидент. Чинить на СЛИЯНИИ, где видны все три источника, а не на загрузке каждого | бэкенд | скоро | гард перекрытия окон на слиянии + пин на достижимом состоянии | решение владельца 05.09 + замер зоны | | 268 | **Гейт версии контракта у фронта читает СВОЁ зеркало, а не канон — и потому слеп по построению.** `frontend/src/api/contract.test.ts` сверяет `${cwd}/docs/api-contract/openapi.yaml` с фикстурой, то есть копию с копией, и зелен при любом отставании; соседний тест сравнивает только МАЖОР, а он у `0.2.3` и `0.10.0` одинаков — ноль. Зеркало отстало на ВОСЕМЬ миноров. Сравнение: тот же класс гейта у платформы читает КАНОН с диска и поймал расхождение `0.9.0→0.10.0` в тот же час. ⚠ Зона фронта ЗАМОРОЖЕНА — строка ждёт разморозки, но входит в перечень первого касания | фронт | скоро (первое касание при разморозке) | перенацелить гейт на канон | находка платформенной сессии 04.09, подтверждена оркестратором | | 269 | **НА БОЕВОМ ПУТИ НЕТ НИ ОДНОГО БЭКАПА — ни оплаченной работы, ни денежного реестра.** Весь оплаченный перевод книги живёт в её SQLite на локальном диске хоста, кредиты и холды — в Postgres; `grep -rEn 'backup|Backup' platform/ --include=*.go` → три хита, **все три комментарии, ни одного вызова** (⚠ испр. 05.09 по ревью: первая редакция писала «НОЛЬ» и была невоспроизводима — суть верна, записанный вывод нет). Движковые `store.BackupSQLite` / `tmctl backup` существуют, платформа их не зовёт никогда. Единственное упоминание отложено словами «работа с первым реальным деплоем, не раньше» (`platform/deploy/README.md`) — **первый реальный деплой УЖЕ БЫЛ**, платный EPUB через API 04.09. Экспорты при этом сознательно TTL-эфемерны, то есть своей копии у пользователя может не быть тоже. ⇒ Одна потеря диска = вся оплаченная работа всех пользователей и весь баланс кредитов, без возможности ни восстановить, ни доказать, кто сколько купил. ⚠ **Единственный пункт из семи, у которого НЕТ частичного исхода** | платформа | скоро (блокер первого внешнего пользователя) | бэкап проектных БД + Postgres на боевом пути | критик полноты стратегии 04.09 | | 270 | **У ПРОДУКТА СЕГОДНЯ НОЛЬ ДВЕРЕЙ: контракт объявляет `bearerToken`, выдать его нечем, а живой цикл доказан через ДЕВЕЛОПЕРСКИЙ вход, который прод отказывается запускать.** Канон сам признаёт «Nothing issues such a token today»; вход ставит только HttpOnly-куку; живая проба двери шла `curl -c jar` через `/auth/dev-login`, а прод-конфигурация ОТКАЗЫВАЕТСЯ стартовать, если dev-вход стоит рядом с настоящим OIDC. Фронт заморожен. ⇒ Не-браузерный клиент (CLI, десктоп, интеграция, смоук боевого хоста) войти не может ВООБЩЕ, а «цикл замкнут живьём» числится доказанным на механизме, которого в бою нет. Компаньон канона держит это строкой с прямым признанием «строки нет» | платформа | скоро (блокер первого внешнего пользователя) | выдача токена ЛИБО разморозка фронта — развилка владельца | критик полноты стратегии 04.09 |