diff --git a/docs/BACKEND_ENGLISH_PAIR_SESSION_PROMPT.md b/docs/BACKEND_ENGLISH_PAIR_SESSION_PROMPT.md index 65b7d0d7..2127c1d9 100644 --- a/docs/BACKEND_ENGLISH_PAIR_SESSION_PROMPT.md +++ b/docs/BACKEND_ENGLISH_PAIR_SESSION_PROMPT.md @@ -148,7 +148,29 @@ (`:410`=`if !ok {` → `return nil`). ⇒ **`en/manifest.txt` с единственной строкой `channelsource-morphology` снимает пиньинь целиком, без единой строки Go.** -**ДЕЛАЙ РОВНО ТАК: проверь этот путь СКВОЗНЫМ прогоном первым делом** — моё чтение говорит, что он +⛔⛔ **ЭТОТ ВЫВОД ОПРОВЕРГНУТ ЗАМЕРОМ 17.09 — ДВЕРИ НЕТ. Читай дальше, прежде чем строить на абзаце выше.** +Сессия пака прогнала ПЯТЬ написаний манифеста юнит-пробой и продублировала живым `tmctl translate` на +книге Кристоффа. Итог: манифеста, при котором английский источник грузится, **не завезя ЛИБО одиннадцать +таблиц китайской формы, ЛИБО пиньинь, НЕ СУЩЕСТВУЕТ**. `channel⇥source-morphology` → `open …/en/surnames-single.txt: +no such file`; `channel⇥transliteration` → `open …/en-ru/palladius.txt: no such file`; обе строки → снова +`surnames-single`; только комментарий → `manifest declares no channel`. Моё чтение было верно про ПИНЬИНЬ +(гейт канала его снимает) и неверно в практическом выводе: одиннадцать `srcFiles` требуются ровно тогда, +когда объявлен канал морфологии, а не объявить ни одного нельзя. + +⛔ **И заполнять одиннадцать таблиц по-английски ЗАПРЕЩЕНО — это решение, а не осторожность.** Их +единственный потребитель — майнер имён, а его алфавит кандидатов только ханьский +(`backend/internal/miner/miner_substrate.go:44`=`func isMinerHan(r rune) bool`) ⇒ **на английском источнике +эти файлы не читает НИКТО**, и их заполнение не меняет ни одного байта поведения. Это «копия без предмета» +дословно: она зеленеет и не делает ничего. Слово владельца было «уникально описать английский язык», а не +«подделать китайскую форму, чтобы загрузчик замолчал». + +⇒ **Практический путь на сегодня — §4.3 (путь данными), и он ПРОВЕРЕН сквозным прогоном.** Цена названа +там же и обязана стоять в отчёте: английская книга едет с выключенным терминологом и выключенной +банкнотой, то есть **без сквозной консистентности терминов — частичная потеря цели №1**. Это цена +состояния дерева, а не выбор исполнителя. + +**Прежний абзац оставлен НАМЕРЕННО, а не вычищен:** он показывает, как выглядит вывод, сделанный чтением +пяти верных точек и опровергнутый одним прогоном. Твоя работа устроена так же — **моё чтение говорит, что он работает; твой прогон говорит, что он работает НА САМОМ ДЕЛЕ, и это разные утверждения. ⚠ Разойдётся — это находка, пинг мне, и заказ меняется. ⚠ И назови в отчёте цену выбранного пути: без канала транслитерации передача английских имён в русский @@ -187,6 +209,22 @@ ⭐ **Путь данными существует.** Гейты живут в ПАЙПЛАЙН-файле, который книга называет полем `pipeline:` (`backend/internal/config/book.go:79`). Замер: **все 23** `book.yaml` объявляют конвейер, из них **19** +⛔ **И СТЕНА, КОТОРОЙ НЕТ ВЫШЕ ВОВСЕ, А СТОИТ ОНА РАНЬШЕ ГЕЙТА ТЕРМИНОЛОГА** (замер сессии пака 17.09, +`tmctl translate`): `mining.contrast_path` — частотный корпус ИСХОДНОГО языка, артефакт вне git. При пустом +значении отказ идёт уже на ЗАГРУЗКЕ конфига (`backend/internal/config/pipeline.go:1197`), при непрочитанном +файле — `EXIT=10`. Его единственный потребитель тоже майнер, то есть для английского он куплен впустую. +⚠ И перекос называет сам боевой конфиг: корпус контраста есть факт ИСХОДНОГО языка, а лежит он в +пайплайн-файле, который по построению пар-агностичен. + +⚠ **Шаг, без которого путь данными не проходит:** гасить надо не только `gates.terminology.enabled`, но и +`gates.terminology.classify_types` — загрузчик отказывает на «classify_types is on but terminology.enabled +is false». Плюс `gates.banknote.enabled` (иначе платим за выход, который никто не прочтёт). + +⭐ **Путь ПРОВЕРЕН сквозным прогоном, а не обещан:** с этими тремя выключенными движок доходит до вызова +модели (`stage=draft role=translator`, `estimate_usd=0.000000`) и встаёт только на отсутствии локальной +модели на машине. **Никакого `configs/langpacks/en/` на этом пути не нужно вовсе.** + +Замер: **все 23** `book.yaml` объявляют конвейер, из них **19** называют `pipeline.yaml` и **4** — не-дефолтное имя. ⇒ конвейер английской книги с выключенным `gates.terminology` снимает отказ **без единой строки Go**. diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 52b8873e..511fe8c2 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -3,7 +3,7 @@ > **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и D-ноты ссылаются словами «строка N» / «строка бэклога N»: **ID строки стабилен навсегда**, не перенумеровывается и не переиспользуется (D39.80). Правки — только через оркестратора; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено. > ⚠ **Это НЕ бэклог зоны `docs/`, а бэклог ПРОЕКТА.** У зон свои, с другими неймспейсами ID, и единый их строк не принимает (D39.84): платформа — [../platform/BACKLOG.md](../platform/BACKLOG.md) (`П-N`) и её регистр дефектов `platform/docs/DEFECT_REGISTER.md` (`PD-N`); фронт — [../frontend/docs/BACKLOG.md](../frontend/docs/BACKLOG.md) (`Ф-N`). > ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 17.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **369** строк · зона бэкенд **196** строго / **249** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **196** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 17.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **370** строк · зона бэкенд **197** строго / **250** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **197** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - ⚠ **Переезд 06.09 (D39.218):** таблица вынесена из `PROGRESS.md` ДОСЛОВНО и ни один ID не сдвинут — **с единственным исключением: две ячейки (строки 220 и 306) тронуты РОВНО в номере якоря `docs/scripts/counts.py:566`→`:569` и `:592`→`:595`**, потому что цель сдвинул этот же коммит; текст ячеек не менялся, длины равны. В `PROGRESS.md` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп. ## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора) @@ -405,3 +405,4 @@ | 494 | **ФИКСТУРА ПРЕДЕЛА ПЕРЕЗАПУСКОВ ДЕРЖИТ ТРАТУ НУЛЁМ — ПИН ОТЧИТЫВАЕТСЯ ЗА КЛАСС, А МЕРЯЕТ СРЕЗ.** Все четыре денежных пина капа в `platform/internal/runs/attemptcap_test.go` гоняют `f.engine.set(… Spend: usd(0))` при `f.runner.alive = false`, поэтому утверждение «холд вернулся целиком» осмысленно ровно на НУЛЕВОЙ трате. Класс «предел сработал на прогоне, который УЖЕ что-то потратил» идёт другой веткой расчёта и не измерен ничем: пинов капа на ненулевой трате в зоне нет. ⚠ Это не дефект пака — поведение при нуле верно и запинено, — а НЕПОЛНОТА, названная приёмкой и принятая зоной в её же блок «где прибор слеп». Норма, под которую ряд заводится: если фикстура держит что-то постоянным, пин отчитывается за КЛАСС, а меряет СРЕЗ, и молчит о том, какой именно | платформа | скоро | предел перезапусков запинен на прогоне с ненулевой тратой, либо утверждение пина сужено до среза, который он действительно меряет | линза приёмки 17.09, пере-снято оркестратором | | 495 | ⛔ **РЕШЕНИЕ ВЛАДЕЛЬЦА О РОДОВОЙ ДИРЕКТИВЕ ЗАПИСАНО В ЖУРНАЛЕ И НЕ ИСПОЛНЕНО В ДАННЫХ — носителя у него не было вовсе.** `backend/internal/lang/data/injection.txt:12` по-прежнему предписывает роли «при неизбежности — мужские», тогда как `D39.254` п.3 постановил «меняется ТОЛЬКО текст данных `injection.txt:12`: вместо «при неизбежности — мужские» — перестроить фразу, а если литературно не выходит, писать как читается лучше», и `D39.263` п.2 уже ОБЪЯВИЛ это исполненным («больше не предписывает»). ⚠ **Замер 17.09 с контролем:** строка в дереве жива (1 совпадение), упоминаний `injection.txt` в журнале решений **4**, рядов трекера на этот предмет — **0**. ⇒ решение существовало только в прозе ратификаций, а гейт чисел такого не видит по построению: он сторожит литералы, а не согласие решений с деревом. ⛔ **И это НЕ «правка данных за $0».** Файл встроен `go:embed` (28 упоминаний в `backend/internal/lang/embedded.go`), а `lang.EmbeddedVersion()` хеширует встроенные файлы целиком (`backend/internal/lang/embedded.go:79`=`hashEmbeddedFiles`) ⇒ хеш двигает тег кроя и ключ манифеста, у купленной книги стираются `unit_resolutions` платформы и пере-покупается нарезка. ⇒ правка идёт в ОКНО ПЕРЕКРОЯ вместе со свёртками исходника (ряд **446**) и ручкой голоса (ряд **410**); окно открыто словом владельца 17.09 и закрывается первым же продолжением книги. ⚠ Класс для следующей смены: **ратифицированное без носителя исполняется ноль раз, и вторая нота, объявившая исполнение, лжи не заметила** — акт судил намерение, а не дерево | бэкенд | скоро (в окне перекроя) | `injection.txt:12` не предписывает род по умолчанию, формулировка ратифицирована, и правка уехала ОДНИМ заходом со всеми прочими правками встроенных данных | верификация актов Fable 5 17.09, пере-снято оркестратором | | 496 | ⛔ **ЦЕЛЬ `battery-stand` НА GIT-ВОРКРИ НЕ ПРОХОДИТ ПО ПОСТРОЕНИЮ, И ЕЁ СОБСТВЕННОЕ ОБЕЩАНИЕ ИСПОЛНЯЕТСЯ НАОБОРОТ.** Рецепт ставит флаги ВНУТРИ команды (`backend/Makefile:140`=`TM_MINER_PARITY=1 TM_CHECKER_LABELS=1`), то есть у оператора выбора нет — «я неудачно запустил» тут неверный диагноз. `standdata.Root()` ищет корень по маркеру (`backend/internal/standdata/standdata.go:35`=`Root finds the repository root by MARKER`) и в воркри разрешается в корень ВОРКРИ, где `eval/.gitignore` исключает `data/` правилом-классом ⇒ путь по умолчанию указывает туда, где файла не может быть никогда. Замер 17.09: `eval/exp16/data` в воркри отсутствует, гиту файл неизвестен (`git ls-files --error-unmatch` — 0), в основном чекауте лежит (5 071 852 байта), и цель падает `TM_MINER_PARITY=1 but required data is missing`. ⛔ Комментарий цели обещает «при отсутствии данных ПАДАТЬ, чтобы наличие корпуса УТВЕРЖДАЛОСЬ, а не предполагалось» — на воркри она утверждает отсутствие стенда, которого нет только здесь, и её сообщение читается как находка о дереве. ⚠ Лечение — НЕ оверрайд пути: `TM_MINER_PARITY_CONTRAST=<путь в основном чекауте>` живёт на одной машине и умрёт при переносе, как умирают вычисленные адреса. У артефакта есть воспроизводимое происхождение — регенерируется из jieba 0.42.1 с запиненным SHA (`docs/experiments/16-bank-mining.md:183`=`jieba_dict_general_zh.txt`) ⇒ цель обязана либо регенерировать его, либо объявлять отсутствие стенда ОТДЕЛЬНЫМ исходом, а не падением. Пять корпусных тестов при поданном стенде проходят — прибор годен, негоден его путь по умолчанию | бэкенд | скоро | цель проходит на воркри без ручных оверрайдов, либо печатает «стенда нет» отдельным исходом, отличимым от падения | замер оркестратора 17.09 при приёмке `D39.266` | +| 497 | ⛔ **ПИН КВАДРАТИЧНОСТИ ФЛЕЙКУЕТ НА ЗДОРОВОМ ДЕРЕВЕ И КРАСИТ ЧУЖОЙ ЛЕНДИНГ.** `TestEvidenceWindowsDoesNotGrowQUADRATICALLYWithTheBook` (`backend/internal/terminology/evidence_test.go:77`=`linear ≈4, quadratic ≈16`; размеры входа объявлены строками выше — `measure(2000)` и `measure(8000)`) утверждает ОТНОШЕНИЕ времён, и его докблок объясняет выбор так: «IT ASSERTS A RATIO, NOT A DURATION. A wall-clock threshold on a shared machine is a flake; the shape of the curve is the property». ⛔ **Посылка опровергнута замером: отношение защищает от РОВНОЙ нагрузки и слепо к её ИЗМЕНЕНИЮ между половинами.** Обе половины меряются ПОСЛЕДОВАТЕЛЬНО, а `go test ./...` гоняет пакеты параллельно — выросла контенция между малым и большим замером, и отношение раздулось, ничего об этом не сказав. ⚠ **Улика — два вердикта на ОДНОМ коммите `871e0af`:** приёмка оркестратора дала `MAKE_EXIT=0`, входная батарея следующей сессии — `MAKE_EXIT=2` с `ratio ×16.5` при пороге 16 (малый замер прошёл на 42.5 мс против изолированных 22, то есть уже вдвое медленнее). Изолированно пять прогонов оркестратора дают 4.3 · 4.3 · 3.1 · 4.6 · 5.7 — свойство ДЕРЖИТСЯ, негоден прибор. ⇒ **зелень приёмки была везением, а не замером**, и цена дефекта не в этом тесте, а в том, что он красит лендинг чужой зоны и заставляет её доказывать невиновность. **Форма лечения названа сессией:** мерить половины ВПЕРЕМЕЖКУ (A-B-A-B, брать медиану) либо нормировать на опорный замер той же секунды — тогда общая нагрузка сокращается по-настоящему, а не по предположению. ⚠ Родня ряда про «пин, флейковый на мутанте, измеряет пустой сценарий», но здесь хуже: флейк на ЗДОРОВОМ дереве | бэкенд | скоро | пин краснеет только на настоящей квадратичности: посадка «вернуть квадратичный `window()`» краснеет им, а десять прогонов полной батареи подряд — зелёные | найдено `textmachine-main-c5` на входной батарее 17.09, пере-снято оркестратором пятью изолированными прогонами | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 3f718131..a1427666 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -348,6 +348,22 @@ > в файлах её пака. Её вывод «это хвост моего пака, а не долг зоны» проверен мной пере-снятием пяти адресов: > у каждого ровно одно вхождение токена в файле. +> ⛔ **Эррата 17.09-м (`D39.266` п.5 — «батарея зоны `MAKE_EXIT=0`»): ЧИСЛО НЕВОСПРОИЗВОДИМО, и это дефект +> ПРИЁМКИ, а не отчёта зоны.** Акт объявляет гейт зоны зелёным. На ТОМ ЖЕ коммите `871e0af` входная батарея +> следующей сессии дала **`MAKE_EXIT=2`**: `TestEvidenceWindowsDoesNotGrowQUADRATICALLYWithTheBook` упал с +> `ratio ×16.5` при пороге 16. ⇒ **два прогона, одно дерево, разные вердикты — флейк по определению, и моя +> зелень была везением, а не замером.** Пере-снято мной изолированно пять раз: 4.3 · 4.3 · 3.1 · 4.6 · 5.7, +> все PASS, и полный прогон модуля `EXIT=0` — то есть СВОЙСТВО держится, негоден ПРИБОР. Носитель — ряд **497**. +> ⚠ Читать п.5 акта как «батарея зелена в одном прогоне приёмки», а НЕ как «гейт зоны зелен». +> ⭐ **И класс, который это покупает, дороже случая:** «зелёная батарея» у нас всюду считается доказательством, +> и ни один наш прибор не отличает «зелено» от «повезло». Отличает только ПОВТОРЕНИЕ, а повторяем мы +> тяжёлое редко и именно там, где цена ошибки выше всего. Флейк на ЗДОРОВОМ дереве хуже флейка на мутанте: +> второй портит одно измерение, первый красит ЧУЖОЙ лендинг и заставляет следующую зону доказывать +> невиновность — что она и сделала, тремя изолированными прогонами и полным прогоном модуля. +> ⚠ Провенанс: нашла `textmachine-main-c5` на входной батарее своего пака, назвала как «не мой предмет» и +> не стала чинить — по §2 промта. Диагноз («отношение слепо к ИЗМЕНЕНИЮ нагрузки между половинами») и форма +> лечения (A-B-A-B с медианой либо нормировка на опорный замер) — её, записаны в ряд дословно. + ## D22. Приёмка пакетов «бэкенд №3» и «полигон-erotica» + развязки 18+/эха/L3 (10.07, оркестратор). ✅