From 435f49debee45031ddae5b6812bcce445b52ee75 Mon Sep 17 00:00:00 2001 From: heaven Date: Thu, 17 Sep 2026 01:32:51 +0300 Subject: [PATCH] Correct the batch-identity row the zone disproved, fix the field roster in the platform prompt, raise a row for unlocalisable labels and repair a stale anchor --- ...BACKEND_BANK_RETRY_LADDER_SESSION_PROMPT.md | 18 +++++++++++++++++- docs/BACKLOG.md | 7 ++++--- docs/PLATFORM_BANK_READOUT_SESSION_PROMPT.md | 14 +++++++++++++- docs/architecture/05-decisions-log.md | 11 +++++++++++ 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/docs/BACKEND_BANK_RETRY_LADDER_SESSION_PROMPT.md b/docs/BACKEND_BANK_RETRY_LADDER_SESSION_PROMPT.md index fb675892..f3ba6461 100644 --- a/docs/BACKEND_BANK_RETRY_LADDER_SESSION_PROMPT.md +++ b/docs/BACKEND_BANK_RETRY_LADDER_SESSION_PROMPT.md @@ -52,7 +52,11 @@ ⇒ Фоллбек банк-роли на другую модель обязан: не тратить чужой пул, считаться против ролевого суб-бюджета, оцениваться по цене **той модели, на которую идёт**. Ключ конфигурации — аддитивный, по образцу стадий. ⚠ Возьми у образца не форму, а **гарантию**: посмотри, чем соседний механизм себя стережёт, и перенеси это тоже. -### 4.4. Тождество банк-батча — этим же паком, но развилку выбираешь ты +### 4.4. ~~Тождество банк-батча~~ — ⛔ **ПУНКТ СНЯТ 17.09 ОТКАЗОМ СЕССИИ, и отказ принят.** + +Посылка ряда 478 пере-мерена на настоящем батчере и НЕ подтвердилась: снятие одного решённого кандидата даёт ноль сдвигов из 246, при боевом размере батча — ноль и на 66, и на 300 кандидатах, при положительном контроле 18 из 19. ⇒ **ключ покупки не трогать.** Класс остаётся латентным и оживает лишь при мелком размере батча. Ниже — исходная формулировка заказа, оставлена как история: + +> Ключ покупки включает порядковый номер куска, а банк-батчи нумеруются по порядку ⇒ стоит фильтру снять одну решённую строку, номера всех последующих сдвигаются, и они покупаются заново при неизменном тексте (ряд **478**). @@ -111,6 +115,18 @@ - гейт зоны зелёный **целиком** (сверка списком целей, а не отсутствием слова FAIL); - сказано явно: **«работа завершена, править не планирую»**. + +## АДДЕНДУМ ВЛАДЕЛЬЦА 17.09 (передан сессии релеем; ратифицирован `D39.258` п.9) + +1. **Тщательно проектируй решение** — замысел раньше кода, и он предъявляется запиской-планом. +2. **Комментарии только нужные, без странных гарантий.** Не пиши гарантию, которой не стережёт ни один пин; комментарий, несущий ВЫВОД, обязан назвать условие, при котором вывод перестаёт держаться. +3. **Прозы в коде нет.** Комментарий объясняет ПОЧЕМУ, а не пересказывает, что делает строка. +4. **Решение общее для книг и языков.** Go-логика не ветвится по паре или книге: пара-специфика — в данных и языковых пакетах, книжные каноны — в сиде и брифе. Ревью-вопрос по умолчанию: «заработает ли пара, которой в репозитории ещё НЕТ, без правки Go?» +5. **Советчиков разрешено ДО ДВУХ** (прежняя норма — один), с ПОСТОЯННЫМ контекстом; вопросы досылаются тем же агентам. Советоваться предписано на ПРОЕКТИРОВАНИИ и на ПРИЁМКЕ, а не только при затруднении. +6. **Грепать `docs/`, `research/`, `experiments/` можно в любое время** — карта чтения промта это МИНИМУМ, а не потолок. + +⇒ приём аддендума эхо-подтверждается, и в отчёте он идёт ОТДЕЛЬНЫМ пунктом. + --- ⭐ Мы не «чиним ретраи». Мы делаем так, чтобы книга не получила героев с неверно переданными именами из-за того, что движок знал о негодном ответе и промолчал. diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 361a8ff0..0490442e 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). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 16.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **357** строк · зона бэкенд **188** строго / **241** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **189** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 16.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **358** строк · зона бэкенд **189** строго / **242** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **188** (перечень — грепом по таблице, рукописный список снят 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; правки — только через оркестратора) @@ -191,7 +191,7 @@ | 225 | **Гейт «строка `open`, а лекарство уже в дереве».** При лендинге пересекать ПОЛНЫЕ пути застейдженных файлов с якорями открытых строк регистра и бэклога; совпадение — вопрос лендеру, а не находка следующего пака. Замерено прежде решения: по именам файлов 22 совпадения, почти все ложные; по полным путям 2, оба настоящие, и один из них (`PD-157`) убил мой же лендинг `d1eb8a9`. Норма-половина уже стоит в `platform/docs/ENGINEERING_STANDARDS.md` §3 п.8; здесь — машинная половина, режимом `counts.py` | оркестратор | скоро (окупился до постройки) | режим `counts.py`, берущий список путей и печатающий открытые строки, чьи якоря в них целят | приёмка пака P8-REVIEW 27.08, D39.159 п.7 | | 226 | **История ПРЕДЪЯВЛЕННОГО не ведётся — «почему меня не остановило на этом термине» ответить нечем.** Карта и человеческая таблица стопа перезаписываются каждым прогоном, память флажка — плоское множество поверхностей без `map_id` и без времени. Это прямая расплата за то, что стоп срабатывает ОДИН раз (кластерная память, названный остаток дофикса-2), и единственная возможная диагностика спора. Кандидат в пак решённости, не заказ. ⚠ Шестое, названное консилиумом и оставленное владельцу: авторство и время решения — сегодня цена нуля (владелец один), станет нужным при мультипользовательской платформе, и тогда его захотят ЗАДНИМ ЧИСЛОМ | бэкенд | скоро (диагностики нет вовсе) | движок метит предъявленное `map_id` и временем; оверлей отвечает «что предъявлялось на прошлом стопе» | консилиум по читающей стороне банка 27.08 | | 250 | **Заголовок глоссария на проводе ОПИСЫВАЕТ маркер, которого после пака больше нет — живая строка с висячей ссылкой.** Строка данных `ru glossary_header` (`backend/internal/lang/data/injection.txt`) дословно объясняет модели: «строки с пометкой ⟨проверить⟩ — неподтверждённые кандидаты», а пункт 3 вайр-батча снимает маркер с провода по `D39.104` п.2 ⇒ на проводе не останется НИ ОДНОЙ помеченной строки, а заголовок продолжит объяснять пометку. ⚠ Это НЕ мёртвая строка данных (те — `editor_unverified_header` и `unverified_marker`, они просто перестают читаться), это ЖИВАЯ строка, которую читает модель. По `D39.104` п.1 клаузула становится ВАКУУМНОЙ, а не ложной, вред не измерен — поэтому не блокер. ⛔ **Чинится ТОЛЬКО правкой `injection.txt`, а она двигает `EmbeddedVersion` → `cutTag` → ключ манифеста → снос `unit_resolutions` книги (строка 198).** Носитель — ближайшее ОКНО правки эмбед-данных: строка **160** идёт своим паком и всё равно бампает форму манифеста. Найдено бэкенд-сессией вайр-батча 04.09 — она правильно НЕ тронула и принесла предмет | бэкенд | скоро (в окне строки 160) | правка `injection.txt` в окне 160 | пинг бэкенд-сессии 04.09 | -| 251 | **Банковый контур в `pipeline-c1.yaml` требует АРТЕФАКТА, которого в git нет и быть не должно — первая же выкатка после лендинга откажется стартовать, если его не положили.** ⚠ **УТОЧНЕНО 08.09 живым прогоном — ЭТО ДВА РАЗНЫХ ДЕФЕКТА С РАЗНЫМ ЛЕЧЕНИЕМ, и прежняя формулировка сливала их в один.** (1) Путь `contrast_path` В КОНФИГЕ ЗАДАН, файла нет ⇒ `os.Open` (`backend/internal/pipeline/mining.go:69`=`os.Open(r.Pipeline.Mining.ContrastPath)`) — отказ ГРОМКИЙ, с флагом `--verify-bank` и без него; боевой c1 путь задаёт, значит это «развёртывание не поднимется». (2) ⛔ **СНЯТО 08.09 — Я СДЕЛАЛ ЭТУ СТРОКУ ХУЖЕ, ЧЕМ ОНА БЫЛА.** Вчера сюда попало «на конфиге без `contrast_path` контур МОЛЧА МЁРТВ» — неверно для конфигурации, которая одна и имеет значение: `internal/config/pipeline.go:1133`=`gates.repair.model %q is not defined` ОТКАЗЫВАЕТ загрузку, если `gates.terminology.enabled` и путь пуст, и стоит это с **04.09** (`b8154cd`) — на четыре дня раньше моей «правки»; второй вход закрыт `runner.go:349`. Тихий `return false, nil` в `backend/internal/pipeline/mining.go:58-66`=`r.Pipeline.Mining.ContrastPath == ""` достижим только при ВЫКЛЮЧЕННОМ гейте, то есть когда контур и не заказан. Рантбук требование несёт (`platform/deploy/README.md`, 8 упоминаний). ⚠ Класс ошибки: принял формулировку зоны, проверил ОДИН путь по коду и не спросил, достижим ли он при живом конфиге. **Живой остаток строки другой** — пар-перекос: `mining.contrast_path` есть факт ИСХОДНОГО языка в пар-агностичном конфиге (задан в 3 из 5 конфигов `backend/configs/`), то есть это цель №2, а не «выкатка не поднимется». ⇒ лечение (1) — положить артефакт при выкатке; лечение (2) — сделать отсутствие контура ВИДИМЫМ без флага. Подтверждено чтением кода оркестратором и живым прогоном зонной сессии 08.09, которой пришлось воспроизводить артефакт по запиненному рецепту `docs/experiments/16-bank-mining.md` (sha сошёлся), потому что на машине его нет. Оба банк-роля живут ВНУТРИ стопа майнинга, а `runBankMiningStop` (`backend/internal/pipeline/mining.go:58`=`func (r *Runner) runBankMiningStop`) возвращается РАНЬШЕ построения кандидатов при пустом `mining.contrast_path` ⇒ без корпуса контраста терминолог и классификатор не исполняются ВООБЩЕ, чем бы ни были заполнены их гейты. Артефакт — общечастотный словарь jieba (`.gitignore:38`: «jieba 0.42.1 dict.txt, 5MB — SHA pinned in the report, **reproducible**»), рецепт и sha256 `7197c321…` — `docs/experiments/16-bank-mining.md` (греп `jieba_dict_general_zh`). ⚠ **Риск ограничен и это ГЛАВНОЕ:** артефакт не утерян, а ВОСПРОИЗВОДИМ по запиненному рецепту; дыра в том, что требование не доехало до РАНТБУКА развёртывания (`platform/deploy/README.md` о нём не знает), и оператор узнаёт о нём только от гарда. Гарды поставлены паком и они правильные: загрузка ОТКАЗЫВАЕТ при включённом гейте с пустым ключом, наличие файла проверяется на ПИШУЩЕМ пути рядом с `CheckKeys` — то есть до оплаченной черновой волны, а не после неё. ⛔ **Что делать:** требование в рантбук платформы (её зона, пинг) + слово владельца/оператора, что файл лежит на боевой машине, ДО первой выкатки после лендинга. ⚠ **Вторая половина, вскрытая тем же включением:** корпус контраста — факт ИСХОДНОГО ЯЗЫКА, а `mining.contrast_path` живёт в конфиге пайплайна, который по построению пар-агностичен (цель проекта №2). Перекос не заведён паком, а вскрыт им; пара, которой в репо нет, потребует своего корпуса и своего ключа | бэкенд+платформа | скоро (до первой выкатки после лендинга вайр-батча) | пинг рантбуку + слово оператора; пар-перекос — отдельным решением | бэкенд-сессия вайр-батча 04.09 | +| 251 | **Банковый контур в `pipeline-c1.yaml` требует АРТЕФАКТА, которого в git нет и быть не должно — первая же выкатка после лендинга откажется стартовать, если его не положили.** ⚠ **УТОЧНЕНО 08.09 живым прогоном — ЭТО ДВА РАЗНЫХ ДЕФЕКТА С РАЗНЫМ ЛЕЧЕНИЕМ, и прежняя формулировка сливала их в один.** (1) Путь `contrast_path` В КОНФИГЕ ЗАДАН, файла нет ⇒ `os.Open` (`backend/internal/pipeline/mining.go:69`=`os.Open(r.Pipeline.Mining.ContrastPath)`) — отказ ГРОМКИЙ, с флагом `--verify-bank` и без него; боевой c1 путь задаёт, значит это «развёртывание не поднимется». (2) ⛔ **СНЯТО 08.09 — Я СДЕЛАЛ ЭТУ СТРОКУ ХУЖЕ, ЧЕМ ОНА БЫЛА.** Вчера сюда попало «на конфиге без `contrast_path` контур МОЛЧА МЁРТВ» — неверно для конфигурации, которая одна и имеет значение: `backend/internal/config/pipeline.go:1152`=`gates.repair.model %q is not defined` ОТКАЗЫВАЕТ загрузку, если `gates.terminology.enabled` и путь пуст, и стоит это с **04.09** (`b8154cd`) — на четыре дня раньше моей «правки»; второй вход закрыт `runner.go:349`. Тихий `return false, nil` в `backend/internal/pipeline/mining.go:58-66`=`r.Pipeline.Mining.ContrastPath == ""` достижим только при ВЫКЛЮЧЕННОМ гейте, то есть когда контур и не заказан. Рантбук требование несёт (`platform/deploy/README.md`, 8 упоминаний). ⚠ Класс ошибки: принял формулировку зоны, проверил ОДИН путь по коду и не спросил, достижим ли он при живом конфиге. **Живой остаток строки другой** — пар-перекос: `mining.contrast_path` есть факт ИСХОДНОГО языка в пар-агностичном конфиге (задан в 3 из 5 конфигов `backend/configs/`), то есть это цель №2, а не «выкатка не поднимется». ⇒ лечение (1) — положить артефакт при выкатке; лечение (2) — сделать отсутствие контура ВИДИМЫМ без флага. Подтверждено чтением кода оркестратором и живым прогоном зонной сессии 08.09, которой пришлось воспроизводить артефакт по запиненному рецепту `docs/experiments/16-bank-mining.md` (sha сошёлся), потому что на машине его нет. Оба банк-роля живут ВНУТРИ стопа майнинга, а `runBankMiningStop` (`backend/internal/pipeline/mining.go:58`=`func (r *Runner) runBankMiningStop`) возвращается РАНЬШЕ построения кандидатов при пустом `mining.contrast_path` ⇒ без корпуса контраста терминолог и классификатор не исполняются ВООБЩЕ, чем бы ни были заполнены их гейты. Артефакт — общечастотный словарь jieba (`.gitignore:38`: «jieba 0.42.1 dict.txt, 5MB — SHA pinned in the report, **reproducible**»), рецепт и sha256 `7197c321…` — `docs/experiments/16-bank-mining.md` (греп `jieba_dict_general_zh`). ⚠ **Риск ограничен и это ГЛАВНОЕ:** артефакт не утерян, а ВОСПРОИЗВОДИМ по запиненному рецепту; дыра в том, что требование не доехало до РАНТБУКА развёртывания (`platform/deploy/README.md` о нём не знает), и оператор узнаёт о нём только от гарда. Гарды поставлены паком и они правильные: загрузка ОТКАЗЫВАЕТ при включённом гейте с пустым ключом, наличие файла проверяется на ПИШУЩЕМ пути рядом с `CheckKeys` — то есть до оплаченной черновой волны, а не после неё. ⛔ **Что делать:** требование в рантбук платформы (её зона, пинг) + слово владельца/оператора, что файл лежит на боевой машине, ДО первой выкатки после лендинга. ⚠ **Вторая половина, вскрытая тем же включением:** корпус контраста — факт ИСХОДНОГО ЯЗЫКА, а `mining.contrast_path` живёт в конфиге пайплайна, который по построению пар-агностичен (цель проекта №2). Перекос не заведён паком, а вскрыт им; пара, которой в репо нет, потребует своего корпуса и своего ключа | бэкенд+платформа | скоро (до первой выкатки после лендинга вайр-батча) | пинг рантбуку + слово оператора; пар-перекос — отдельным решением | бэкенд-сессия вайр-батча 04.09 | | 252 | **Две гарантии не прибиты — мутации сессии ПЕРЕЖИЛИ всю батарею** (собственные посадки бэкенд-сессии вне шести пунктов заказа, 04.09; из восьми посадок шесть красные, две выжили и НЕ чинились как вне-заказные). **(а) `StickyDepth = 2 → 1` не ловит НИКТО** — глубина окна липкости меняется молча. **(б) `priorityRank`, отбрасывающий приоритет доверия** (подтверждённые строки раньше неоднозначных в бюджете инъекции), **не ловит НИКТО** — то есть порядок, решающий, ЧТО попадёт в инъекцию при нехватке бюджета, можно перевернуть безнаказанно. ⚠ Класс тот же, что дал паку «число согласия» три неприбитых свойства: заявленное поведение без пинящего теста. Сессия правильно НЕ чинила вне заказа и принесла предмет | бэкенд | скоро (ближайшим касанием инъекции) | по тесту на гарантию + запись в `cmd/tmmutate/mutations.json` | собственные посадки бэкенд-сессии 04.09 | | 253 | ⚠ **ДВИЖКОВАЯ ПОЛОВИНА ЗАКРЫТА 08.09 (`D39.228`): полнота консолидации доезжает до сайдкара и до stdout-экрана подписи. ОСТАЁТСЯ ПЛАТФОРМЕННАЯ — поля на `BankPage` нет, читателей у секции `consolidation` НОЛЬ**, и до её лендинга это сознательно заведённый класс A онтологии банка (⛔ бит `complete` платформа берёт ГОТОВЫМ, не выводит у себя: у движка он считается от среза РЕНДЕР-паса, а срез классификатора полноты банка не означает). ⚠ испр. 08.09: акт `D39.228` объявил строку закрытой ЦЕЛИКОМ — неверно, лечение (б) по телу ниже требует «полнота в сайдкар + поле на `BankPage`», и вторая половина не построена. Ниже — тело находки. **НА ЭКРАНЕ ПОДПИСИ БАНКА ПОДПИСЫВАТЬ НЕЧЕГО, а сам подписываемый банк НЕПОЛОН — две половины одного шва, найдены ПЕРВЫМ живым прогоном 04.09.** **(а)** ⚠ **ЭТО ТОТ ЖЕ ДЕФЕКТ, ЧТО СТРОКА 224 — испр. 05.09:** корень там уже найден и назван (майненные строки пишутся внутри ветки `if !stopping`), поэтому «разобрать порядок публикации» здесь заказывать НЕЛЬЗЯ — работа удвоится. Половина (а) закрывается лендингом 224; живой в этой строке остаётся только (б). Прогон встал `awaiting_bank`, `GET /bank` отдал `total 0, signed 0` — при том что рядом лежали `mined-signature.yaml` 49 КБ и `bank-stop.txt` 60 КБ, а движок держал 82 неразобранные поверхности; термины появились в read-модели только на СЛЕДУЮЩЕМ прогоне (`bank export refreshed … terms=83`). Платформа читает сайдкар честно: 0 значит 0 ⇒ либо сайдкар пишется не в тот момент, либо стоп наступает РАНЬШЕ публикации банка. Корень скорее движковый. **(б)** Банк, который пользователь подписывает, ЧАСТИЧНО КОНСОЛИДИРОВАН, и платформа об этом не знает вовсе: терминология урезала план под бюджет ДО первого вызова (`batches_dropped=5`, `consolidated=38 declined=0 unanswered=47` из 85), а поверхности нет ни одной — `grep -rn 'consolidat\|unanswered\|batches_dropped' platform/internal/ --include=*.go` → **0**, аллоулист сайдкара несёт только термины. ⇒ **пользователь подписывает как ПОЛНЫЙ банк то, что движок сам называет неполным.** Лечение (б) — КАНАЛ: полнота консолидации в сайдкар + поле на `BankPage`; лечение (а) — разбор порядка «стоп против публикации». ⚠ Обе половины на шве, чинятся согласованно | бэкенд+платформа | скоро (до первого внешнего пользователя) | разбор порядка публикации + канал полноты | наблюдение платформы за живым потоком 04.09, H10/H11 | | 254 | **Шесть движковых ловушек, увиденных ПЕРВЫМ живым прогоном (04.09) и НЕ тронутых платформой — чужая зона.** ⚠ **ОДНА ИЗ ШЕСТИ РЕШЕНА ВЛАДЕЛЬЦЕМ 05.09 — остальные ПЯТЬ живы, строку не закрывать** (испр. 05.09; строка 285 закрывает ровно эту одну и не больше). ⛔ Решённая — самая дорогая: `manifest` на пустом файле даёт exit 11, а интейк на 11 УДАЛЯЕТ ЗАГРУЗКУ ⇒ пользователь, приславший пустой файл, терял его. **Лечение названо владельцем: fail fast на загрузке** — строка **285**. · `tmctl build` не читает контекст: всегда SIGKILL, staging-файл `.tmp-*` остаётся · потолок бросает летящие вызовы, они списываются нулём (`PD-441`, замер: отмены на 120756/156469/156470 мс) · терминология МОЛЧА режет план под бюджет (вход строки 253б) · сайдкар банка пуст в момент стопа (вход 253а) · **`build --format X` без `--out` удаляет соседние форматы** — ловушка для оператора с руками. ⚠ Ни один из шести не найден чтением кода за месяцы — все шесть увидены за один прогон | бэкенд | скоро (ближайшим касанием соответствующего пути) | по пунктам; часть — райдерами других паков | наблюдение платформы за живым потоком 04.09, H21 | @@ -392,4 +392,5 @@ | 475 | **УЛИКИ ПРОГОНА A НЕЧИТАЕМЫ ДВИЖКОВЫМ СТОРОМ, И НОСИТЕЛЯ ЭТОГО ФАКТА НЕТ НИГДЕ.** База прогона A несёт схему 16 при голове 18: `OpenReadOnly` отказывает, а `Open` МИГРИРУЕТ, то есть уничтожает улику при попытке её прочесть. Свойство архива, а не дефект кода — но следующий, кто захочет реплей, потратит час, чтобы это выяснить, и рискует испортить сырьё | бэкенд | когда-нибудь | способ читать старые прогоны назван носителем; опасность миграции при чтении объявлена рядом с ней | сессия пака D39.257, её §10 | | 476 | **ДЕНЬГИ ВТОРОГО ВЫЗОВА НЕ ПОСЧИТАНЫ:** сетка чувствительности даёт число СТРОК, а не сумму, поэтому «сколько стоит включить второй вызов» сегодня не отвечается ничем. Предмет пака-маршрутизатора, но сегодня он не записан нигде, и по этой же сетке будут выбирать порог за деньги | бэкенд | скоро | рядом с числом строк стоит их цена | сессия пака D39.257, её §10 | | 477 | **ЗАМЕР M2 — ПОПУЛЯЦИЯ КНИГ С ДВОЙНИКОМ КЛЮЧА НЕ ИЗМЕРЕНА, А НА НЕЙ СТОИТ ДОВОД «ПАК 1 БЕСПЛАТЕН ПО СНАПШОТАМ».** Прибор ряда 330 (`backend/internal/membank/memseed.go:714`=`func UnverifiedKeyConflicts`) ключуется на `entryFiringKeys`, поэтому пере-определённый вопрос M2 он вернёт тем же НУЛЁМ ПО ПОСТРОЕНИЮ — то есть «ноль» будет ответом прибора на свой вопрос, а не о предмете. Чтобы вопрос был задан, нужны три правки `membank`: снять пропуск пары подписанных (`backend/internal/membank/memseed.go:733`=`ApprovedSharedKeyCollisions`), снять пропуск одинаковой передачи (`backend/internal/membank/memseed.go:735`=`ei.Dst == ej.Dst`) и экспортировать порог ключа (`backend/internal/membank/memory.go:78`=`func minKeyLenFor`). ⚠ Значит это правка ДВИЖКА, а не $0-ресёрч, как значилось прежде. ⛔ Цена молчания: пока популяция не измерена, довод консилиума о бесплатности пака 1 по снапшотам остаётся недоказанным. Ряд 330 — ДРУГОЙ предмет (решение владельца по противоречию, цена там уже замерена на 142 книгах) | бэкенд | скоро | популяция книг с двойником ключа измерена прибором, который этот вопрос действительно задаёт | консилиум `D39.253` §3 строка 0-M2, ответ автора 16.09 | -| 478 | **ОРДИНАЛ БАТЧА ВХОДИТ В КЛЮЧ ПОКУПКИ ⇒ СНЯТИЕ ОДНОЙ РЕШЁННОЙ СТРОКИ ПЕРЕ-ПОКУПАЕТ ВСЕ ПОСЛЕДУЮЩИЕ БАТЧИ.** Ключ берёт номер куска (`backend/internal/pipeline/render.go:366`=`strconv.Itoa(req.ChunkIdx)`), а терминолог нумерует батчи порядком (`backend/internal/pipeline/terminologist.go:1003`=`Chapter: 0, ChunkIdx: i`). ⇒ когда фильтр решённого убирает кандидата из раннего батча, ординалы ВСЕХ следующих сдвигаются, хеши меняются, чекпойнт не находится — и они покупаются заново, ДАЖЕ когда их сообщения не изменились ни на байт. Замерено советчиком на купленном сырье B (батчи покупки 1 с номерами 1 и 2 стали в покупке 2 номерами 0 и 1), оба адреса пере-сняты оркестратором. ⛔ Бьёт прямо по экономике `D39.256`: чем лучше работает «решённое остаётся решённым», тем больше сдвиг ординалов и тем дороже он обходится. Комментарий у фильтра называет только смену СОСТАВА батча и про ординал молчит | бэкенд | скоро | ключ покупки не зависит от порядкового номера батча либо зависимость названа у фильтра и учтена сметой | советчик Fable 16.09, пере-снято по двум адресам | +| 478 | **ОРДИНАЛ БАТЧА ВХОДИТ В КЛЮЧ ПОКУПКИ ⇒ СНЯТИЕ ОДНОЙ РЕШЁННОЙ СТРОКИ ПЕРЕ-ПОКУПАЕТ ВСЕ ПОСЛЕДУЮЩИЕ БАТЧИ.** Ключ берёт номер куска (`backend/internal/pipeline/render.go:366`=`strconv.Itoa(req.ChunkIdx)`), а терминолог нумерует батчи порядком (`backend/internal/pipeline/terminologist.go:1003`=`Chapter: 0, ChunkIdx: i`). ⇒ когда фильтр решённого убирает кандидата из раннего батча, ординалы ВСЕХ следующих сдвигаются, хеши меняются, чекпойнт не находится — и они покупаются заново, ДАЖЕ когда их сообщения не изменились ни на байт. Замерено советчиком на купленном сырье B (батчи покупки 1 с номерами 1 и 2 стали в покупке 2 номерами 0 и 1), оба адреса пере-сняты оркестратором. ⛔ Бьёт прямо по экономике `D39.256`: чем лучше работает «решённое остаётся решённым», тем больше сдвиг ординалов и тем дороже он обходится. Комментарий у фильтра называет только смену СОСТАВА батча и про ординал молчит. ⛔ **ПОСЫЛКА ОПРОВЕРГНУТА ЗАМЕРОМ ЗОНЫ 17.09 — ряд остаётся ЛАТЕНТНЫМ.** Пере-мерено на НАСТОЯЩЕМ батчере, а не выведено: снятие одного решённого кандидата даёт **0 сдвигов из 246 снятий**, снятие блока при боевом размере батча — **0** и на 66, и на 300 кандидатах. ⭐ Ноль не слепота прибора: положительный контроль (убрать батч целиком) даёт **18 из 19**. Причина — боевые конфиги размер батча не задают, работает умолчание, и снятие строки перекладывает кандидатов ВНУТРИ батча, не меняя их числа. ⇒ ключ покупки не трогать, пере-чеканка не нужна. ⚠ Условие, при котором вывод перестаёт держаться (назвала зона): МЕЛКИЙ размер батча оживляет класс — при 400 рунах замер даёт 475 сдвигов. ⚠ Моя ошибка названа прямо: я пере-снял два адреса и НЕ проверил саму посылку на боевом батчере, вывод советчика поехал в трекер непроверенным | бэкенд | когда-нибудь (гейт: мелкий batch_runes) | посылка пере-мерена на боевом размере батча либо класс закрыт как латентный | `D39.257` п.7, замер сессии 17.09 | +| 479 | **ВАРИАНТЫ ЧЕРНОВИКОВ УХОДЯТ НАРУЖУ СКЛЕЕННЫМ ЯРЛЫКОМ, И КЛИЕНТ НЕ МОЖЕТ ПОКАЗАТЬ ИХ НА ЯЗЫКЕ ЧИТАТЕЛЯ.** В проекции банка вариант едет одной строкой вида «передача ×N», а при алиасе — с англоязычным хвостом про то, для какой поверхности он предложен: части (сама передача · число чанков · алиас) НЕ опубликованы отдельными полями. ⇒ платформа вынуждена везти это как непрозрачный текст, а разобрать ярлык у себя не вправе — движок держит парсер рядом с писателем именно потому, что второй, пере-выведенный, «продолжит работать до дня, когда у ярлыка появится поле, и тогда вернёт числа вместо ошибки». ⚠ Пара-специфики в форме нет, но **английский фрагмент в данных ломает общность по языку интерфейса**: ревью-вопрос «заработает ли пара, которой в репозитории ещё нет, без правки Go» здесь отвечается «нет на уровне ПОКАЗА». Лечение движковое: публиковать части ярлыка полями. Найдено платформенной сессией 17.09 на купленном сырье при исполнении п.4 аддендума владельца | бэкенд | когда-нибудь | части ярлыка опубликованы полями либо решено, что показ вариантов читателю не нужен | зона платформы 17.09, `D39.258` п.9 | diff --git a/docs/PLATFORM_BANK_READOUT_SESSION_PROMPT.md b/docs/PLATFORM_BANK_READOUT_SESSION_PROMPT.md index 9e8c370b..c3f1062e 100644 --- a/docs/PLATFORM_BANK_READOUT_SESSION_PROMPT.md +++ b/docs/PLATFORM_BANK_READOUT_SESSION_PROMPT.md @@ -37,7 +37,7 @@ Научить ридер разбирать две секции, которые он сегодня игнорирует: **`proposed`** (предложения движка) и **`consolidation`** (итог прохода терминолога). -⛔ **Список полей НЕ переписывай из промта — сними с обоих купленных файлов сама.** Контроль, с которым сверишься: у предложения **восемь обязательных** полей (`src`, `dst`, `kind`, `channel`, `freq`, `spread`, `conf`, `variants`) и **четыре опциональных**, которые есть не везде: `conventions` (в B у всех 66, в A нет ни у одной), `invented` (11 из 69 в A, 17 из 66 в B), `contradicts`, `bank_holds`. +⛔ **Список полей НЕ переписывай из промта — сними сама, и НЕ с файлов, а С ПИСАТЕЛЯ.** ⚠ Первая редакция этого промта называла состав по двум снимкам сырья и ошиблась в членстве: обязательность определяется наличием `omitempty` у сериализуемой структуры движка, а не тем, что видно в файле. Верно (пере-снято зоной 17.09, доказательство построением): **обязательные** — `src`, `dst`, `kind`, `channel`, `freq`, `spread`, `conventions`, `conf`; **опциональные** — `invented`, `contradicts`, `bank_holds`, `variants`. ⚠ И отсутствие `conventions` в прогоне A — НЕ опциональность, а ДРУГАЯ СБОРКА движка: у поля нет `omitempty`, значит сериализатор опустить его не мог, ⇒ тот файл написан до коммита, добавившего поле. ⛔ **Несущее следствие: у обязательного ЧИСЛОВОГО поля «поля нет» ≠ «ноль».** `freq: 0` означает «поверхность видел только черновик», `conf: 0` — «роль сказала ноль процентов»; свернуть их в обычное число значит стереть смысл. ⚠ `contradicts` и `bank_holds` не встретились ни разу в 135 объектах — читатель их несёт, но исполнением они не проверены, и это идёт в «где прибор слеп». ⛔⛔ **`invented` — то самое поле, ради которого экран и существует:** движок объявляет его классом, который читают ПЕРВЫМ («консолидированная передача — НЕ та, что дали черновики»). Ридер без него покажет человеку список, в котором не видно, что движок выдумал имя. Не потеряй его так, как потерял первый черновик этого промта. @@ -117,6 +117,18 @@ - гейт зоны зелёный **целиком**; всё живое — **в дереве**; - сказано явно: **«работа завершена, править не планирую»**. + +## АДДЕНДУМ ВЛАДЕЛЬЦА 17.09 (передан сессии релеем; ратифицирован `D39.258` п.9) + +1. **Тщательно проектируй решение** — замысел раньше кода, и он предъявляется запиской-планом. +2. **Комментарии только нужные, без странных гарантий.** Не пиши гарантию, которой не стережёт ни один пин; комментарий, несущий ВЫВОД, обязан назвать условие, при котором вывод перестаёт держаться. +3. **Прозы в коде нет.** Комментарий объясняет ПОЧЕМУ, а не пересказывает, что делает строка. +4. **Решение общее для книг и языков.** Go-логика не ветвится по паре или книге: пара-специфика — в данных и языковых пакетах, книжные каноны — в сиде и брифе. Ревью-вопрос по умолчанию: «заработает ли пара, которой в репозитории ещё НЕТ, без правки Go?» +5. **Советчиков разрешено ДО ДВУХ** (прежняя норма — один), с ПОСТОЯННЫМ контекстом; вопросы досылаются тем же агентам. Советоваться предписано на ПРОЕКТИРОВАНИИ и на ПРИЁМКЕ, а не только при затруднении. +6. **Грепать `docs/`, `research/`, `experiments/` можно в любое время** — карта чтения промта это МИНИМУМ, а не потолок. + +⇒ приём аддендума эхо-подтверждается, и в отчёте он идёт ОТДЕЛЬНЫМ пунктом. + --- ⭐ Приоритет №1 проекта — издательское качество перевода длинной книги: связные термины и голоса на всю книгу. Экран подписи — место, где человек этим управляет напрямую. Всё здесь меряется одним: **стало ли человеку видно, о чём его спрашивают.** diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 6ee790ab..a1569922 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -4022,3 +4022,14 @@ bought NOTHING». ⇒ **`tmctl manifest` есть НИЖНЯЯ граница, пользователей. **Пятый вопрос СНЯТ с владельца самим дизайном** и переведён в замер, потому что у размена неизвестна одна сторона. ⇒ **к владельцу по структуре глав сегодня не идёт ни один вопрос.** +**9. АДДЕНДУМ ВЛАДЕЛЬЦА 17.09 К ОБОИМ ВЫДАННЫМ ПАКАМ — передан релеем, эхо затребовано.** Слово: «попроси обе сессии тщательно проектировать свои решения, +писать только нужные комментарии не давая странных гарантий, не писать прозу в код, разрабатывать решение которое будет общим для книг и языков… по +проектированию и приёмке советоваться с фаблом 5, я разрешаю до 1-2 с конектстом сессиям запускать, ну и так же они имеют право грепать по документации или +полигону в любое время». ⇒ четыре требования к работе (проектирование до кода · комментарий без недостережённых гарантий · никакой прозы в коде · общность по +книгам и парам как ревью-вопрос) плюс два расширения прав сессии. +⚠ **ПОТОЛОК СОВЕТЧИКОВ ПОДНЯТ С ОДНОГО ДО ДВУХ** — прежняя редакция канона («разрешаю 1 фабла на 1 сессию», слово 11.09, `D39.248`) этим СМЯГЧЕНА для зонных +сессий: до двух советчиков с ПОСТОЯННЫМ контекстом, и советоваться предписано на ПРОЕКТИРОВАНИИ и ПРИЁМКЕ, а не только при затруднении. Форма прежняя: вопросы +досылаются тем же агентам, новые не поднимаются. +⚠ **ПРАВО ГРЕПАТЬ `docs/` И ПОЛИГОН В ЛЮБОЕ ВРЕМЯ** подтверждено явно: карта чтения промта остаётся МИНИМУМОМ, но перестаёт читаться как потолок. +⇒ оба требования входят в форму бэкенд-промта наравне со стандартом п.3, и отчёт сессии несёт их отдельным пунктом. +