From c366672f7ae0598c7d7714b8d26f61b9d7134363 Mon Sep 17 00:00:00 2001 From: heaven Date: Fri, 4 Sep 2026 19:27:41 +0300 Subject: [PATCH] Write down the gender-axis ratifications the channel issued and the journal never saw, including the one that was wrong: a dedup on the bare source term drops a signature --- docs/PROGRESS.md | 53 ++++++++++++++++++++++++- docs/architecture/05-decisions-index.md | 1 + docs/architecture/05-decisions-log.md | 14 ++++++- 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 3714cc31..7c3ab650 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-04, голова D39.192 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №22** (единственный носитель — здесь; роль передана 01.09, №21 закрыт нотой передачи D39.184). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ПЕРВЫМ:** (0а) **ревизия документации на ПРОТУХШЕЕ** — по всем зонам, не только тронутым; (0б) **планы доработок в БЭКЕНД и ПЛАТФОРМУ** по остатку бэклога и регистра; (0в) **вынос неактуального в АРХИВ** (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **94** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 95 (major 3) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-04, голова D39.193 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №22** (единственный носитель — здесь; роль передана 01.09, №21 закрыт нотой передачи D39.184). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ПЕРВЫМ:** (0а) **ревизия документации на ПРОТУХШЕЕ** — по всем зонам, не только тронутым; (0б) **планы доработок в БЭКЕНД и ПЛАТФОРМУ** по остатку бэклога и регистра; (0в) **вынос неактуального в АРХИВ** (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **94** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 95 (major 3) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). > ⛔⛔ **НО КНИГУ ЧЕРЕЗ API НЕЛЬЗЯ ДОВЕСТИ ДО КОНЦА — найдено тем же прогоном 04.09 и воспроизведено дважды.** Прирост потолка на прогон = `chaptersLeft × $0.03` (ставка `DefaultPerChapter`, занижена ×4.47 — D39.179 п.1), и после первой готовой главы это $0.27, тогда как движок при `waves.workers: 4` резервирует под редакторский шаг ~$0.28 ⇒ **отказ резервации, прогон встаёт, книга не двигается**. Два прогона подряд дали одно и то же: `committed` не сдвинулся, холд вернулся. ⇒ **занижение ставки — не «шкала короче», а СТОП ПРОДУКТА: с какого-то момента каждая следующая покупка не покупает ничего.** Лечить придётся согласованно двумя сторонами (ставка платформы + резерв движка под шаг с параллельными воркерами), носитель — ряд регистра зоны, вес `major` **за недостижимость продукта, а не за деньги**: сам стоп НЕ ЖЖЁТ ничего — замер платформы 04.09 показал отмену ДО ухода запроса (латентность 20–31 мс, `model_actual` пуст, токенов ноль), и вся книга сходится до микро-доллара по трём источникам (`request_log` 0.278319 · `spend.committed_usd` 0.278318752 · платформенный `committed` 278319 микро). > ⛔ **ЗАТО HALT НА ПРОГОНЕ, КОТОРЫЙ ПРОДВИНУЛСЯ, ЖЖЁТ — отдельная находка того же прогона и свежая датированная точка строки 78 («леджер = НИЖНЯЯ граница»).** Четыре редакторских вызова ушли параллельно; один дошёл ($0.063404) и своим коммитом сорвал потолок, три других отменены в тот же миг, **отработав 120756, 156469 и 156470 мс** — и легли в леджер нулём. Незаписанное ≈ **$0.05–0.19 на ОДИН halt** против $0.278 за всю книгу, то есть механизм, защищающий от перерасхода, сам создаёт неучтённый расход. ⚠ Списание провайдером НЕ доказано (биллинга у нас нет) — утверждается ровно наблюдаемое: вызовы шли 2–2.6 минуты, их цены в леджере нет. > ⇒ **Дыра НЕ в принципе, а в покрытии, и это делает её заказом, а не наблюдением** (разбор оркестратора 04.09 по коду): консервативная оценка уже построена и ратифицирована — `backend/internal/pipeline/stagerun.go`, греп `settling the reservation estimate to keep the ceiling honest` (pack-13 point-9), — но её условие требует ОТВЕТА провайдера (`resp.Usage`), а отменённый в полёте вызов ответа не получает и уходит другим путём. Направление лечения: сеттлить оценку при отмене вызова, который успел уйти; различитель — факт ухода (латентность кандидат, порог обязан быть обоснован замером, а не назначен). Половина ДВИЖКОВАЯ. ⚠ Прежняя формулировка пункта — ниже, она о состоянии ДО 04.09. Движок пишет файл с 30.08 (`tmctl build` — EPUB 3 + чистый txt, D39.175), и холодный прогон 31.08 предъявил это живьём: собранный EPUB настоящего перевода прошёл `epubcheck` 0/0/0/0 и передан владельцу. Открыто ровно одно: канон обещает `createExport`/`getExport`, а платформа их НЕ монтирует (смонтировано 15 операций из 20; нет также `getRun`, `updateBook`, `deleteBook`). Долг числится с P8 (`platform/BACKLOG.md` П-17), и НИ ОДИН пак платформы после P7 его не взял (проверка вместо ручного счёта, чтобы не гнило при каждом лендинге: `grep -rn 'createExport\|getExport' platform/internal/ --include=*.go` — пусто). **Слово «отдаёт результат» ложно по букве ТОЛЬКО платформенной половиной** (п.4) · **(2) ~~холодный прогон движка~~ ОТРАБОТАЛ 31.08, закрыт РЕШЕНИЕМ ВЛАДЕЛЬЦА «не доводить»** (отчёт — `archive/reports/COLDRUN_V16_REPORT_2026-08-31.md`, числа относятся к `065d8ac`). Потрачено **$0.436110** из санкции $0.80. ПРЕДЪЯВЛЕНО живьём: объёмный потолок · D39.158 ОБЕИМИ половинами (стоп и не-стоп) · exit 16 · строки 154/198/239/240. ⚠ ~~**Причина большой доли редактора НЕ УСТАНОВЛЕНА**~~ — **УСТАНОВЛЕНА пробой полигона 02.09 по четырём осям: РЕДАКТОР ДУМАЕТ, А НЕ ПИШЕТ.** Размышление — **77.9%** цены редактора без ручки и 45.7% с `low`; у `glm-5` с выключенным thinking — 0.0%. Замер куплен и закончен ($6.17 из $9.50). ⚠ `research/30` §2.4 того же полигона повторяет «причина не установлена» — это про ДРУГОЙ вопрос (доля роли в прогоне против доли размышления в цене роли), и различение обязано попасть в ревью-шапку 30. Доля редактора идёт с ДВУМЯ знаменателями: **49.3%** от всего прогона ($0.214865 из $0.436110) и **81.3%** внутри порции П1 (⚠ ходившее «73%» — фантом, в отчёте его нет ни разу). Следующий шаг — контролируемая проба по ЧЕТЫРЁМ осям (роли осей и три требования, купленные ошибками этого прогона, — §14 отчёта; ось `stale` НЕДОСТИЖИМА — §10 там же). ⚠ **Цена: слово владельца 31.08 — ≈$0.60, потолок $0.80, ДЕСЯТЬ глав ПОЛНОЙ цепью включая редакторскую волну.** ⚠ **КЛЮЧИ: гейт снят словом владельца 30.08, разбор двух путей — D39.176 п.6.** Живое отсюда: конвенционного `.env` НЕТ НИ У ОДНОЙ книги корпуса (заполнены только `projects/textmachine/backend/.env` и `.../eval/.env`), поэтому прогон движка обязан передавать `--keys-file` абсолютным путём и только на `translate`; для п.3 нужен ДРУГОЙ файл — `TM_PLATFORM_ENGINE_KEYS_PATH`, тоже АБСОЛЮТНЫМ путём (`platform/internal/config/config.go`, греп `must be an absolute path`). Лечение операционное и $0 — направить переменную на уже заполненный файл; проверять ПРОГОНОМ, не чтением (гардрейл `.env`) · **(3) живой сквозной прогон через API платформы** — форма манифеста, сайдкара банка и карта причин флагов сочинены платформой САМОСТОЯТЕЛЬНО. ⚠ Уточнено 01.09: гейт СНЯТ холодным прогоном, и настоящие артефакты движка теперь ЕСТЬ (каталог `books/gu-zhenren/coldrun-v16/`), но сверка вышла ТОНКОЙ: на шов реально вышло **одно значение `flag_reason` из пятнадцати** (`sanitizer_stripped`), остальные четырнадцать по-прежнему только чтением кода, а манифест против `platform/internal/ingest/manifest.go` не сверялся вовсе · **(4) дверь выдачи** — строго ПОСЛЕ (3) (⚠ слово владельца 30.08: дверь ВСЕГДА строит файл — отказ юзеру не отдаётся, неполная книга уходит с пометкой, т.е. дверь зовёт `tmctl build --partial`; отказ по умолчанию остаётся операторской ручкой CLI; D29.1(б) «fail-closed» читать как «никогда молча» — честность несут пометки) · **(5) проводка `--max-units`** — снятие гейта, а не стройка: механизм в движке стоит (D39.170), живое основание гейта — `PD-422` · **(6) разморозка фронта** — ПОСЛЕ (4): зеркало отстало на СЕМЬ миноров (`frontend/docs/api-contract/openapi.yaml` — `0.2.3` против канона `0.9.0`, и первый из них — ЛОМАЮЩИЙ 0.3.0), 16 операций против 20; отставание ратифицировано D39.142 п.5 на время фриза и две ручки разъехались, размораживать раньше значит перегенерировать типы дважды. ⚠ **ДВА ЗАГЕЙЧЕННЫХ ТРИГГЕРА НАЖАТЫ И НЕ ОТРАБОТАНЫ — строка бэклога 237** (`go.work` · вендор-сверка эффорта `deepseek-v4-pro`; реестр `13-tech-debt-anchors.md` §Б-108). ⚠ **Состояние git — снимать КОМАНДАМИ, не чтением** (ветка `polygon` ушла вперёд, коммит здесь не цитирую): работа полигона лежит на ней и в `main` НЕ влита, а `git status -- eval/` в main-дереве пуст ПО ПОСТРОЕНИЮ и уводит в ложный вывод «работы нет»; ⚠ **«развязка git с origin» — арбитр ПЕРЕ-СНЯТ 04.09 и прежний вердикт БОЛЬШЕ НЕ ВЕРЕН:** `git merge-base --is-ancestor origin/main main` → **rc 1**, `git log main..origin/main` → `afa7700 temp` (коммит владельца 04.09, которым он передавал работу зон). Локальная линия ушла вперёд на семнадцать коммитов и содержит ВСЁ содержимое `afa7700` — оно снято `reset --soft` и заленджено раздельными зонными коммитами, — но формально ветки разошлись. Лечение — force-push рукой владельца; **не пуллить** (его же правило). ⚠ Пункт «развязка git с origin» в листе владельца ниже держится ТОЛЬКО как вопрос про force-push его рукой; утверждением о расхождении дерева он не является — арбитр этой пары именно здесь. @@ -453,6 +453,57 @@ Go: `terminology.Genders` + `ParseTypes` возвращает `types, genders, s **Батарея после дофикса:** `MAKE_EXIT=0`, `0 issues`, 19 пакетов `ok`, скипы те же три. **Голден пере-захвачен — 0 изменений** (дофикс не двинул ни одного байта провода в фикстуре). Тесты **1105 → 1143**, удалённых имён по-прежнему одно и то же переименование. Каталог **92 → 105**, записи `WB1`–`WB13` красные. +## КРУГ 2 ПЕТЛИ (`D39.191`) — НЕ ЗАМКНУЛСЯ: веер нашёл 21 пережившую посадку, все закрыты. Круг 3 обязателен + +⚠ **Условие замыкания жёсткое, и оно не выполнено:** круг замыкается, только когда проход с НЕПУСТЫМ веером не нашёл ни одной пережившей посадки. Этот нашёл двадцать одну. Ниже — веер, все находки с диспозициями, что я перепроверила сама, и чего круг не покрыл. + +### Веер +**Три источника, разные ракурсы.** (1) Агент `fable`, read-only — ДОФИКС, которого свежий контекст не видел: `CheckPlaceholders`, дедуп по `src`, новые тесты гардов и экрана на ВАКУУМНОСТЬ. (2) Агент `fable`, read-only — НЕПОКРЫТОЕ, ровно по моему же списку слепых зон: `volume.go` (пункт 6, чужой дофикс), закон-блок на книге с НЕПОДПИСАННЫМИ строками, бласт-радиус `InjectionTrust`, свип леджера, мелкие поверхности. (3) **МОИ собственные посадки — В ДАННЫЕ**, чего в круге 1 не было вовсе: фикстура корпуса, `prompt-labels.json`, `pipeline-c1.yaml`, промпт классификатора, `injection.txt`. +**Посадок всего: 12 моих + ~26 агента A + ~60 агента B.** Мои: 11 красных, 1 пережила. + +### Что нашлось — двадцать одна пережившая, по классам + +**А. ЖИВОЙ ДЕФЕКТ, внесённый моим же дофиксом (1).** +· **Дедуп закон-блока по голому `src` ронял ВТОРУЮ ПОДПИСАННУЮ строку.** Ключ уникальности банка — `(src, sense, since, until)`, то есть одна поверхность законно несёт несколько подписанных канонов: 青山-фамилия и 青山-направление. Мой дедуп выбрасывал один из них МОЛЧА, при том что трансляторный блок продолжал рендерить оба — два провода разъезжались. Правило исправлено на то, чем оно должно было быть с самого начала: **уступает НЕПОДПИСАННАЯ строка, и только подписанной; подпись не роняется никогда.** Пин красный на возврате к старому ключу. + +**Б. ДЕНЬГИ (2).** +· **`ReachableModels` не знал банк-ролей.** `buildClients` пре-строит именно этот список, `CheckKeys` требует именно эти ключи — оба на ОТКРЫТИИ. Модель терминолога или классификатора, не заведённая в `models.yaml` или без ключа в окружении, проходила ВЕСЬ преflight и убивала прогон на стопе майнинга — после купленной черновой волны. Латентно, пока контур не жил в боевом конфиге; пункт 4 делает это живым. +· **Банкнотный канал покупает вывод, который на этой конфигурации никто не прочитает** — единственный читатель за ранним возвратом. Не отказ (прогон корректен, срез делает свою работу), а предупреждение с ценой. + +**В. УТВЕРЖДЕНИЯ О СТРУКТУРЕ, ВЫДАННЫЕ ЗА ГАРАНТИИ (4) — класс, которого я в круге 1 не назвала.** +· «валидатор и рендер читают одну таблицу» — прибито только ПРИМЕРАМИ; валидатор-надмножество проходил всё; +· «проверка стоит в единственной воронке и покрывает все пути» — **все четыре пути загрузки промптов обводятся вокруг гейта, батарея зелёная.** Моя же формулировка из отчёта по Д2; +· «порог лежит в пустом интервале» — порог 0.50 → 0.45 переживает всё И НЕ ДВИГАЕТ ВЕРСИЮ: резюмнутый чанк пере-судился бы по порогу, за который никто не платил. ⇒ `langscreen.Version` теперь ВЫВОДИТСЯ из констант, `classifierVersion` стал var, правка порога роняет голден по построению; +· «свип леджера покрывает обе банк-роли» — свип ходил по НАЙДЕННОМУ и никогда по ЗАПИСАННОМУ, поэтому удаление роли из свипа оставляло её запись сиротой, а промпт — неприбитым. ⇒ проверка сирот. + +**Г. ДАННЫЕ (1) — и это то, ради чего норма про посадки в данные написана.** +· **Фикстура корпуса, размягчённая до красивого числа, проходила всё.** Тест утверждает пол «не меньше 3×», а пол не измерение: обнуление исходных рун у ЕДИНСТВЕННОГО худшего здорового образца оставляло батарею зелёной и рапортовало запас ЛУЧШЕ, чем корпус когда-либо давал. ⇒ леджер записанных чисел (30/44 строк · 0.011655 · 0.976706 · 346 букв), по образцу леджера лейблов: пере-взять корпус законно, но это стоит правки здесь и фразы в отчёте, а не ничего. + +**Д. РАСЩЕПЛЕНИЕ `Disp`, прибитое только там, где две половины СОВПАДАЮТ (3).** +· липкий перенос, ПЕРЕ-ВЫЧИСЛЯЮЩИЙ матч-доверие, переживал всё: единственный пин использует строку, чей `src` И ЕСТЬ сработавший ключ, поэтому пере-вычисление совпадает с наследованием. Разводит их строка с ханьским `src` и коротким фонетическим АЛИАСОМ — там перенос re-trusted, и род едет к сущности, которой на странице может не быть; +· липкий перенос, ВЫВОДЯЩИЙ доверие из диспозиции, тоже переживал: неподписанная строка на чистом ключе теряет род в момент переноса — дверь строки 210 в липкой форме; +· диспозиционная ось `priorityRank` не отличима от статусной ни одной фикстурой. Это одна из ДВУХ, переживших круг 1, и теперь на ней стоит мой дедуп. ⇒ прибита состоянием, которое оси разводит: две ПОДПИСАННЫЕ строки, одна на collision-prone ключе, под связывающим бюджетом. + +**Е. ЧУЖОЙ ПАК (пункт 6), которого свежими глазами не видел никто (6).** Из двадцати посадок в `volume.go` шесть пережили, и все шесть — в ОПЕРАТОРСКОМ ПРЕДЛОЖЕНИИ и в двух неотфикстуренных ветках `reconcile`: счёт «%d paying output unit(s)» без флагнутых (недо-счёт того, за что заплачено) · клауза про $0-попутчиков · развилка головы, спрошенная про `LeftFresh` вместо `Left()` · свободный юнит, флагнувшийся на резюме, посчитанный оплаченным · пере-деланный юнит, флагнувшийся и оставшийся В ОБОИХ счётчиках · и **порядок `bound()` ДО `reconcile`, от которого корректность отчёта зависит СЛУЧАЙНО**. Прибиты пятью тестами; последний — документирован в `waverun.go` с прямым указанием, какой «естественный рефактор» его сломает. + +**Ж. Прочее (4):** липкие записи, исчезающие из закон-блока · глубина липкого окна · сироты леджера · `injection.txt` без родовой строки (последнее — уже красное, поймано `TestDC3GenderInjection`). + +### Что я перепроверила сама, а что взяла со слов +**Перепроверила посадкой ДО починки (все, кроме одной):** дедуп по `src` · порог экрана · валидатор-надмножество · обход воронки на пути классификатора · диспозиционная ось · липкий перенос (обе формы) · сирота леджера (обе формы) · липкая запись в закон-блоке · банкнотный канал · размягчённая фикстура. +**Взяла со слов:** `H2` (два ряда с одним id — недостижимо через стор), `H7` (битый артефакт контраста молча даёт пустой контраст), и стейл-текст `glossary_header` — про него я уже знала. +⚠ **И одна собственная ошибка, которую поймал каталог, а не я:** первая редакция теста про `ReachableModels` читала `pipeline-c1.yaml`, где модель банк-роли СОВПАДАЕТ с моделью черновика, — то есть тест не мог упасть. Посадка сказала `SURVIVED`, я переписала тест на конфиг, где банк-модель своя. **Механизм проаудировал мой пин; чтение бы не проаудировало.** + +### Чего круг НЕ покрыл +- **Пункт 5 (жанр) и цепь рода end-to-end** — ни один агент их не атаковал: я дала им дофикс и непокрытое, считая эти два закрытыми кругом 1. Остаются проверенными одним проходом. +- **`$0`-проекции на дефектной книге** — `status`/`report`/`export`, реально отрендеренные: и мой тест, и посадки доказывают только, что КОНСТРУКТОР открывается. +- **Липкий перенос до РЕДАКТОРСКОГО провода сквозным прогоном** — ни одна фикстура не гонит прономинальный чанк с переносом в edit-юнит; всё прибито на уровне `membank`. +- **Настоящая латинописьменная цель** — `target-en.txt` в репо нет; ветка достигается пустым объявлением, и тест это говорит. +- **`eval/`-харнессы** — вне модуля бэкенда, не гонялись. +- **Сверка двух агентов между собой** — снова не делалась. + +### Числа круга +Батарея `MAKE_EXIT=0`, `0 issues`, 19 пакетов, скипы те же три. **Голден БАЙТ-ИДЕНТИЧЕН** тому, что был до починок круга (единственное движение голдена за круг — `classifier_version` от вывода версии экрана из констант; вердикты не двинулись). Тесты **1105 → 1156**. Каталог **92 → 120**, записи `WB1`–`WB29` красные одним прогоном. Удалённых имён по-прежнему одно — переименование `TestEditorSectionFollowsProvenance`. + ## Файлы **Изменены:** `internal/pipeline/{disposition,chunkrun,waverun,events,manifest,mining,terminologist,repair,render,runner}.go` · `internal/membank/{memory,mempostcheck,decisions}.go` · `internal/terminology/{terminology,classify}.go` · `internal/miner/miner_emit.go` · `internal/checks/sanitizer.go` · `internal/config/{book,pipeline}.go` · `internal/lang/embedded.go` · `internal/store/migrate.go` · `cmd/tmctl/render.go` · `cmd/tmmutate/mutations.json` (92 → 96) · `configs/pipeline-{c1,c2,arm-*}.yaml` · `prompts/zh-ru/*.md` (шесть — жанр; `classifier.md` — третье поле) · `example/book.yaml` · тесты и голден. diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md index 18b02ff0..04de1f0e 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -251,3 +251,4 @@ | D39.190 | 04.09 | **Три решения очереди по слову владельца «делаем как рекомендуете».** 160 (структура глав, Этап 0) БЕРЁТСЯ, но своим паком ПОСЛЕ двери — причина порядковая: она бампает `manifestVersion`, а у бампа формы безопасного порядка деплоя нет, и параллельный ПЛАТНЫЙ прогон платформы был бы сорван · 142 — после шагов 0–1 полигона (precision глоссарного флага 0.067; формы пре-гейта детальнее ноты нет нигде ⇒ первым будет дизайн) · пере-снапшот вайр-батча ратифицирован единым актом (цена сегодня $0: продолжаемых книг нет). Промты обоих паков ВЫДАНЫ 04.09 | жив | ЖИВОЕ: форма манифеста заморожена на время окна; окно закрывается первой внешней книгой | очередь порядок деплоя | | D39.191 | 04.09 | **Норма приёмки: после дофикса — ВТОРОЙ адверсариальный круг по ИСХОДНЫМ пунктам заказа, петля до замыкания** (слово владельца). Закрывает окно, в котором дофикс ревьюировал только его автор. Цена окна замерена дважды в тот же день: двенадцать посадок первого круга пережили зелёную батарею (семь гарантий жили только как код), а платформенная сессия объявила починенной находку, снятие различителя в которой переживало батарею — у ручки над ДЕНЬГАМИ. Форма круга: пере-посадить находки самому · атаковать САМ ДОФИКС · проверить новые тесты на вакуумность · сажать мутации И В ДАННЫЕ | жив | ЖИВОЕ: круг без предъявленных посадок кругом не считается | приёмка норма петля | | D39.192 | 04.09 | **Класс дефекта, названный ЗОНОЙ: «утверждение о СТРУКТУРЕ, выданное за гарантию»** — верное по факту и не прибитое ничем. Три из семи переживших посадок второго круга оказались им: «две функции читают одну таблицу» · «проверка в единственной воронке» · «порог в пустом интервале». Падает не от порчи ЗНАЧЕНИЯ, а от ЗАВЕДЕНИЯ ВТОРОГО ПУТИ, и падает молча. Форма посадки против него — «заведи обход», а не «сломай значение». ⚠ Норма о мутациях В ДАННЫЕ окупилась первой попыткой: размягчённая фикстура прошла батарею и отрапортовала число ЛУЧШЕ реального, потому что тест утверждал ПОЛ, а пол не измерение ⇒ число-доказательство обязано иметь леджер записанных значений | жив | ЖИВОЕ: карта слепых зон полна только с обеими осями — что не смотрели И чем нельзя опровергнуть | приёмка класс мутации данные | +| D39.193 | 04.09 | **Три ратификации по оси рода, выданные каналом и НЕ внесённые в журнал** (долг оркестратора, предъявлен приёмкой: греп `KeyTrusted` по D-логу → 0). Производитель рода — КЛАССИФИКАТОР (ноль новых вызовов, закрытый словарь парсера; следствие: банковый контур в c1 — предпосылка) · замок расщеплён: род гейтится МАТЧЕМ (`KeyTrusted`), а не статусом, в ОБОИХ блоках · ⚠ дедуп закон-блока по голому `src` РОНЯЛ ПОДПИСЬ — ратификация оркестратора была неверна, принята редакция зоны: уступает только неподписанная | жив | ЖИВОЕ: ратификация без проверки ключа уникальности предмета вносит дефект; каждая посадка предъявляется КРАСНОЙ | род ратификация дедуп | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index b245a093..a63d0709 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.192 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.193 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто: > ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 живёт ниже в этом файле (голова D39.106+). @@ -2034,3 +2034,15 @@ Fable 5.1 со сквозным контекстом (решение владе **4. Норма о ДАННЫХ (`D39.191` §5) окупилась первой же попыткой и получает уточнение.** Двенадцать посадок сессии в ДАННЫЕ дали одиннадцать красных и одну пережившую — и пережившая оказалась худшей из семи: **фикстура корпуса, размягчённая до красивого числа, прошла всю батарею И ОТРАПОРТОВАЛА ЧИСЛО ЛУЧШЕ, чем корпус когда-либо давал.** Причина механическая: тест утверждал ПОЛ («запас не меньше 3×»), а пол — не измерение. ⇒ **Уточнение нормы: число, которым пак доказывает свойство, обязано иметь ЛЕДЖЕР записанных значений** (как у пинов промпт-лейблов), иначе «улучшившееся» число неотличимо от испорченных данных. **5. Что сессия сказала о собственном методе, и это стоит хранить.** «Моя карта слепых зон перечисляла ФАЙЛЫ, которых никто не смотрел, а не ФОРМЫ УТВЕРЖДЕНИЙ, которые нечем уронить». ⇒ **Карта слепых зон, которую сессия обязана дать приёмке (`D39.191`), полна только когда несёт обе оси: что не смотрели И чем нельзя было бы опровергнуть.** (04.09.2026, оркестратор №22) ✅ + +## D39.193 — РАТИФИКАЦИИ ПО ОСИ РОДА, выданные каналом 04.09 и не внесённые в журнал: производитель — КЛАССИФИКАТОР, замок расщеплён на МАТЧ, дедуп закон-блока уступает только НЕПОДПИСАННОЙ строкой (04.09). ✅ + +**0. Почему нота появилась постфактум и это долг оркестратора, а не зоны.** Три решения были выданы бэкенд-сессии по каналу в ходе пака и ИСПОЛНЕНЫ, но в журнал не попали: приёмка второго круга предъявила `grep -n 'KeyTrusted' docs/architecture/05-decisions-log.md` → **0**. То есть построенное держалось на переписке, а канон о ней не знает — ровно то, что `CLAUDE.md` запрещает («долговечное знание живёт в репозитории»). Записываю с указанием, что было решено, чем обосновано и что при этом ОШИБОЧНО. + +**1. Производитель рода — КЛАССИФИКАТОР, а не терминолог.** Промт предлагал три пути (поле у терминолога · отдельный проход · признать сид-только); сессия принесла четвёртый и он принят. Доводы, проверенные оркестратором по коду: **ноль новых вызовов** (классификатор уже гоняется по тем же батчам ⇒ цель №5, низкий COGS) · род — свойство СУЩНОСТИ, то есть акт классификатора, а не выбор рендеринга · парсер классификатора позиционный с ЗАКРЫТЫМ словарём, неизвестное значение уходит в считаемый `Bad`, тогда как третья колонка терминолога — уверенность, вокруг которой уже написана развязка по живому дефекту · двигается `RequestHash` ТОЛЬКО классификаторных вызовов. ⚠ Следствие, обязательное к произнесению: род появляется лишь там, где включён `classify_types`, то есть **пункт про банковый контур в `pipeline-c1.yaml` — предпосылка производства рода в бою**, а не соседний пункт. + +**2. Замок расщеплён: род на проводе гейтится МАТЧЕМ, а не СТАТУСОМ.** Сессия предложила снять `p.Disp != Confirmed` целиком; оркестратор ратифицировал ЧАСТИЧНО, и разбор существен. `dispositionFor` сворачивает ДВЕ разные вещи: рискованность матча (`collisionProneKey` — короткий не-ханьский ключ) и статус строки. `D39.104` п.1 говорит «независимо от СТАТУСА строки» и про матч не говорит ничего — а на collision-prone срабатывании «дать одинаково» означает уверенно приписать род ЧУЖОЙ сущности. ⇒ условие не снято, а РАСЩЕПЛЕНО: матч-половина вынесена в `KeyTrusted`, статус на род больше не влияет. ⚠ Позже тем же днём оркестратор пере-решил и вторую половину: **в редакторском блоке род тоже гейтится `KeyTrusted`, а не `status=="approved"`** — прежний отказ стоял на доводе «приказ с неподписанным данным — контрабанда», а этот довод растворился, когда пак схлопнул двухсекционку: неподписанный РЕНДЕРИНГ уже едет приказом. Проверено, что `D39.104` сохранил инвариант про СТАТУСЫ и подписную таблицу, а саму доктрину объявил «о ПРОВОДЕ». + +**3. ⚠ ДЕДУП ЗАКОН-БЛОКА: моя ратификация была НЕВЕРНА, и правильная редакция — зоны.** Оркестратор велел «один приказ на исходный термин, побеждает подписанная». Формула шире правила: ключ уникальности банка — `(src, sense, since, until)`, значит одна поверхность ЗАКОННО несёт несколько ПОДПИСАННЫХ канонов (фамилия и направление у одного написания), и дедуп по голому `src` ронял подпись МОЛЧА, при том что трансляторный блок продолжал рендерить обе — два провода разъезжались. **Ратифицируется редакция зоны: уступает НЕПОДПИСАННАЯ строка и только ПОДПИСАННОЙ; подпись не роняется никогда.** Содержание исходного решения (конфликт подписанной с авто-консолидацией даёт один приказ) исполнено целиком; полисемия двух подписанных канонов конфликтом не является. ⚠ Класс ошибки называю прямо: **ратификация, выданная без проверки ключа уникальности предмета, внесла дефект в код** — и поймала его ЗОНА своим кругом петли, а не приёмка. + +**4. Норма, купленная тем же кругом:** тест, написанный на конфигурации, где различаемые величины СОВПАДАЮТ, физически не может упасть — сессия завела пин на `pipeline-c1.yaml`, где модель банк-роли равна модели черновика, посадка сказала `SURVIVED`, и только это её и спасло. ⇒ **каждая новая посадка предъявляется КРАСНОЙ, а не объявляется**; чтение такого не ловит по построению. (04.09.2026, оркестратор №22) ✅