diff --git a/docs/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md b/docs/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md index 53852ca1..935d16a4 100644 --- a/docs/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md +++ b/docs/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md @@ -89,7 +89,7 @@ **Поэтому базис подставляет ответ** — передачу, тип, род — там, где роль не спрашивали. Перечисли в записке ВСЕХ читателей ответа и покажи в отчёте, что каждый получил своё; начни с `attachConsolidatedDst`, -`attachClassifiedGender` (`backend/internal/pipeline/terminologist.go:1306`), их соседа по типу, `consolidatedRows`, строк стоп-таблицы и +`attachClassifiedGender` (`backend/internal/pipeline/terminologist.go:1306`=`attachClassifiedGender stamps`), их соседа по типу, `consolidatedRows`, строк стоп-таблицы и проекции консолидации. ⛔ **И ДВА читателя, которых докблок фильтра называет ПРИЧИНОЙ своей двух-условности — мой первый список их упускал, @@ -114,7 +114,7 @@ Базис пишет ПРОГОН на своих выходных границах, и границ **две**: - `run-finished` — `backend/internal/pipeline/bookrun.go:258`=`r.exportBank(ctx, "run-finished")`, и она стоит - под `if err == nil` (`backend/internal/pipeline/bookrun.go:254`); + под `if err == nil` (`backend/internal/pipeline/bookrun.go:254`=`if err == nil {`); - `bank-mining/signature-stop` — `backend/internal/pipeline/mining.go:270`=`bank-mining/signature-stop`. Одной мало не по вкусу, а по коду: сигнатурная остановка возвращается ЗНАЧЕНИЕМ-ОШИБКОЙ — @@ -137,7 +137,7 @@ КРИЧАТЬ** — она означает, что резюм пере-спросит роли, то есть это денежное событие, а не строка бухгалтерии. ⚠ **Писатель ОДИН — прогон; границ у него две.** Формулируй именно так. Онтология судит носитель с двумя -писателями так же строго, как проекцию без читателя (`docs/architecture/18-bank-ontology.md:70-72`), и +писателями так же строго, как проекцию без читателя (`docs/architecture/18-bank-ontology.md:70-72`=`Отсюда правило таблицы выше`), и консилиум на этом уже спотыкался. ### 4.4. Форма отпечатка — РЕШИ САМА, но развилку знай: от неё зависит, переживёт ли пак следующую работу @@ -145,7 +145,7 @@ Отпечаток — хеш того, что читает роль. Консилиум пишет «строки `ctx`». ⛔ **Так делать опасно**, и вот почему: `ctx` — это окна KWIC, а их отбор, число и ширина управляются тремя независимыми ручками (`AttachKWIC`, `backend/internal/terminology/terminology.go:340`=`func AttachKWIC`; вызов -`backend/internal/pipeline/terminologist.go:310`; ключи `kwic_per_term`/`kwic_width` — пар-данные). Любая из них молча обнулит набор +`backend/internal/pipeline/terminologist.go:310`=`terminology.AttachKWIC(cands, chunks`; ключи `kwic_per_term`/`kwic_width` — пар-данные). Любая из них молча обнулит набор решённых у КАЖДОЙ книги: отпечатки не совпадут ни у одного кандидата, и книга потратит остаток пожизненного потолка на пере-консолидацию. @@ -159,7 +159,7 @@ единственной шириной и была бы пар-слепой по случайности, причём на ДЕНЕЖНОМ предикате. ⇒ ширина — пар-данное с движковым умолчанием, и в отчёте ответь на ревью-вопрос канона: заработает ли пара, которой в репозитории нет, без правки Go. Инвариантность достигается тем, что отпечаток не читает ОТОБРАННЫЕ окна, а не тем, что ширина зашита. Якорь канона бери **по кандидату**, не по -батчу: `CanonFor` принимает батч (`backend/internal/terminology/terminology.go:856`), и отпечаток по батчу вернул бы зависимость от состава, +батчу: `CanonFor` принимает батч (`backend/internal/terminology/terminology.go:856`=`func CanonFor(batch []Candidate`), и отпечаток по батчу вернул бы зависимость от состава, от которой пак как раз уходит. В отпечатке НЕТ вариантов черновиков, `freq` и `since_ch`. ⚠ **Посылка «исходник книги приходит целиком» — ОТКРЫТЫЙ вопрос владельцу от 17.09, а не допущение пака**, и это @@ -182,7 +182,7 @@ завтра скачком двинет набор решённых, то есть деньги. ⚠ **И про «юнит целиком» знай ограничение.** Семьи и серии детектируются НАД `paid`, то есть ПОСЛЕ фильтра -(`backend/internal/pipeline/terminologist.go:483-487`), и комментарий `:481-482` объясняет причину: детектировать над полным набором +(`backend/internal/pipeline/terminologist.go:486`=`terminology.DetectFamilies(paid, fp)`, блок 483–487), и комментарий `:481-482` объясняет причину: детектировать над полным набором значит рассогласовать юниты с батчами, из них построенными. ⇒ это развилка, а не приказ: либо юнит для предиката считается отдельным проходом, не трогая батчер, либо «семья целиком» сужается и это называется. Решение — в записку-план. @@ -203,12 +203,12 @@ его строят и называют ценой, а не наследуют. Назови выбор и довод в записке-плане. ⛔ Отпечаток в СТРОКЕ авто-банка — мёртвая форма: `writeAutoBank` в -продакшне зовётся ровно один раз, внутри ветки «не останавливаемся» (`backend/internal/pipeline/mining.go:242` под `if !stopping` на +продакшне зовётся ровно один раз, внутри ветки «не останавливаемся» (`backend/internal/pipeline/mining.go:242`=`r.writeAutoBank(ctx, mined, proposals` под `if !stopping` на `:235`), то есть на стопе подписи ему негде лечь. ### 4.7. Что пак задевает наружу — поле контракта -Сегодня `never_asked` в проекции равно числу снятых банком (`backend/internal/pipeline/bankexport.go:118`) и +Сегодня `never_asked` в проекции равно числу снятых банком (`backend/internal/pipeline/bankexport.go:118`=`NeverAsked: t.BankSettled`) и означает «сид держит поверхность и все черновики согласны». Поле живёт в каноне (`docs/architecture/14-api-contract/openapi.yaml`) и читается платформой в десятке мест. ⇒ строки, решённые базисом, в это поле класть НЕЛЬЗЯ без смены смысла: заводи **аддитивное** поле, это минор контракта, и назови @@ -237,7 +237,7 @@ `backend/internal/pipeline/terminologist.go:541`=`This is a ONE-TIME cost; every later run replays for $0` (он в хвосте длинной строки — я обрезал вывод по ширине и прочёл обрезок как факт). Устарел только адрес ряда (`:498`). **Носителей ТРИ:** сама строка · голден каталога операторских сообщений `backend/internal/pipeline/testdata/operator-messages.txt:136`=`terminology: this book had already paid`, - который гейтит отдельный тест · два пина `backend/internal/pipeline/banksettled_test.go:193` (резюм: ноль обращений к провайдеру, $0, + который гейтит отдельный тест · два пина `backend/internal/pipeline/banksettled_test.go:193`=`func TestAResumeFindsItsCheckpointsAfterTheFilter` (резюм: ноль обращений к провайдеру, $0, и вдобавок ОТСУТСТВИЕ ключа `reconsolidated=true` в логе) и `:417` (обе половины: молчать на свежем прогоне, сработать в описанном случае). ⇒ пере-формулировка обязана обновить И голден: это не подгонка под зелень, а обслуживание заказанной смены поведения (`D39.183`), и она ОБЪЯВЛЯЕТСЯ в отчёте. @@ -355,8 +355,8 @@ ⛔ **Две ноты 17.09 — условия работы твоего пака, и обе про деньги ровно тех ролей, которые он фильтрует.** `D39.264` вынес петлю повторной попытки в общий контур и подключил банк-роли к вердикту; `D39.259` включил -`gates.terminology.regenerate: 1` во ВСЕХ трёх боевых конвейерах (`backend/configs/pipeline-c1.yaml:193`, -`backend/configs/pipeline-arm-glm.yaml:72`, `backend/configs/pipeline-arm-mistral.yaml:79`). ⇒ на батч возможна ВТОРАЯ платная ступень, и +`gates.terminology.regenerate: 1` во ВСЕХ трёх боевых конвейерах (`backend/configs/pipeline-c1.yaml:193`=`regenerate: 1`, +`backend/configs/pipeline-arm-glm.yaml:72`=`regenerate: 1`, `backend/configs/pipeline-arm-mistral.yaml:79`=`regenerate: 1`). ⇒ на батч возможна ВТОРАЯ платная ступень, и промт обязывает тебя назвать: **чей ответ ложится в базис, если батч куплен лестницей** (ответ выигравшей ступени, не первой) · не ломает ли базис посылку пина `backend/internal/pipeline/bankladder_test.go:111`=`func TestAHealthyBankTableIsNeverAskedAgain` («здоровая таблица покупается ровно раз»), чья посылка утверждается отдельной строкой —