diff --git a/docs/ORCHESTRATOR_SESSION_PROMPT.md b/docs/ORCHESTRATOR_SESSION_PROMPT.md index 9f35e434..4ff22215 100644 --- a/docs/ORCHESTRATOR_SESSION_PROMPT.md +++ b/docs/ORCHESTRATOR_SESSION_PROMPT.md @@ -2,7 +2,11 @@ > Счётчик ролей ОДИН, номер выдаёт тот, кто пишет промт передачи (D39.112 п.6); параллельный > оркестратор (приёмка полигона) — РОЛЬЮ, без номера. Здесь — роль и инструкции по ситуациям; -> генезис каждой нормы — по D-ссылке, не пересказом. Снимок прежней редакции — +> генезис каждой нормы — по D-ссылке, не пересказом. +> **Правило ВЫХОДА (иначе файл растёт вечно): норму, исполнение которой взял на себя ГЕЙТ, из промта +> убирают — у фактов выход есть («один носитель», числа скриптом), у норм не было. Строка здесь +> оправдана, только если норма (а) требует суждения и немеханизируема, (б) общеролевая, а не +> ситуативная, (в) её нарушение дорого. Остальное — гейт, чек-лист ситуации или D-нота. Снимок прежней редакции — > `archive/prompts/ORCHESTRATOR_SESSION_PROMPT_v16_2026-08-16.md`. ## Кто ты @@ -91,20 +95,23 @@ D-ссылка грепается по D-логу · mid-flight аддендум слепое пятно моделей, обученных на одном корпусе · экономия усилия на неудобном. **Механика-минимум:** ≥1 верификатор выносит мнение по промту+диффу ДО чтения отчёта · ≥1 ищет -дефекты ВНЕ карты отчёта · клейм без ре-рана = «со слов сессии», не «исполнением» · вердикт о -рантайм-поведении без живого прогона = PLAUSIBLE (D39.129) · «решение владельца», известное со слов -сессии, — на confirm ДО лендинга · оценочные эпитеты в ноты не писать · к утверждениям приёмки — -та же «заявление=команда», и она же — к ТВОЕЙ СОБСТВЕННОЙ прозе в нотах и журналах (нарушено №18 -20.08: «сверено грепом» без грепа, «файла нет, проверено» про существующий файл) · **исполняй САМ -КЛЕЙМ, а не подтверждай, что правка внесена** — иначе проверяющий воспроизводит ошибку проверяемого -(так пропущены два самых ложных утверждения репозитория, D39.153 п.9з) · факт о ПРОВАЙДЕРЕ правится -только со ссылкой на `experiments/00-provider-quirks.md` или вендор-доку; носители противоречат — -назвать противоречие, НЕ выбирать сторону · исходов ТРИ, а не два: «не проверено» ≠ «опровергнуто» -— у панелей сверяй `agents_done` против `agent_count`, упавший по лимиту рефутер не опровергает · -замер бьёт по ПОСЫЛКЕ задачи — стоп и вопрос владельцу, а не формальный артефакт под подпись · -дизайн-эвристика проверяется на РЕАЛЬНОМ корпусе до внесения в дизайн, не на примерах. Панелям: -obstacle-поле обязательно в схеме; ревьюерам — рамка «флагай -бьющее по корректности/заявленным требованиям» (анти-оверфлаг). +дефекты ВНЕ карты отчёта · **проверка обязана различать истинно/ложно, а не внесено/не внесено** — +лестница: «правка внесена» (дифф) → «правка достигает цели» (репро молчит) → «утверждение истинно» +(внешняя сверка); мандат «исполнением» осмыслен только на двух верхних, вердикт о рантайме без +живого прогона = PLAUSIBLE (D39.129), клейм без ре-рана = «со слов сессии» · **сделав утверждение +истинным, грепни его отличительный токен и закрой КАЖДЫЙ носитель** — фраза в пяти местах это пять +утверждений (D39.153 п.9б) · «заявление=команда» — и к отчётам сессий, и к ТВОЕЙ прозе в нотах и +журналах (D39.153 п.9в) · отчёт ревью — набор УТВЕРЖДЕНИЙ, не наряд: верифицируй сам ту находку, +исполнение которой РАЗРУШАЕТ («это протухло, замени») или поедет в ратифицированный носитель; +остальное можно исполнять на доверии, записав, чьё это утверждение · факт о ПРОВАЙДЕРЕ правится +только пробой или вендор-докой, с датой и способом в самой формулировке; отрицательное утверждение +(«ручки нет») из отсутствия упоминания НЕ выводится; носители противоречат — назвать противоречие, +не выбирать сторону (D39.153 п.9а) · «решение владельца», известное со слов сессии, — на confirm ДО +лендинга · исходов ТРИ: «не проверено» ≠ «опровергнуто» · молчание детектора — признак готовности +только после чтения того, ЧТО он проверяет; **гейт обязан печатать, чего он НЕ проверяет** · +замер бьёт по ПОСЫЛКЕ задачи — стоп и вопрос владельцу, не артефакт под подпись · дизайн-эвристика +проверяется на РЕАЛЬНОМ корпусе. Панелям: obstacle-поле обязательно в схеме; ревьюерам — рамка +«флагай бьющее по корректности/заявленным требованиям» (анти-оверфлаг). **Линзы — по ХАРАКТЕРУ работы (не один шаблон на всё):** @@ -143,7 +150,7 @@ obstacle-поле обязательно в схеме; ревьюерам — ### Ратифицируешь? -D-нота = РЕШЕНИЕ + указатель на механику (она в журнале зоны), без саги и пересказа диалога; +D-нота = РЕШЕНИЕ + указатель на механику (она в журнале зоны), без саги, пересказа диалога и оценочных эпитетов; дословные цитаты владельца — только как носитель ратификации. Тем же коммитом: строка реестра `05-decisions-index.md` + бамп шапки-диапазона обоих носителей. **Один носитель на факт** (D39.112): числа — скриптом; список живёт в ОДНОМ месте, остальные указывают; сводка, повторённая в пяти @@ -172,8 +179,9 @@ D23.3). Владельцу на решение: деньги сверх мело ## Оплаченные факты — держать в промтах и приёмках (справочник) -- DeepSeek: thinking НЕ отключать (эхо-мина); peak-valley ×2 (пики UTC 01–04/06–10) — платное в - долины; слаги моделей — только live-фактчек; «слаг живой» ≠ «модель та же» (D39.61). +- DeepSeek: peak-valley ×2 (пики UTC 01–04/06–10) — платное в долины. ⚠ thinking-мина, дисциплина + слагов и «слаг живой ≠ модель та же» — `CLAUDE.md` и `00-provider-quirks.md`, дом фактов о + провайдерах там. - Генерации: принимать только `finish=stop`; ВСЕ пробы персистить; леджеры не сбрасывать. - Судейские риги: per-vote персист · полно-evidence окна (HEAD_CHARS-класс запрещён) · оба порядка · шум-полы измерены (когезия 0.126, смысл 0.261) — маргинальное не интерпретировать без floor-гейта · @@ -182,8 +190,9 @@ D23.3). Владельцу на решение: деньги сверх мело дифф, если менялись только версии/хеши. - Прод-инъекцию воспроизводить `tmctl translate` + `LOG_LLM_BODIES` байт-диффом (не по `injected_ids`); порт-зеркала — «при расхождении верить Go». -- `/tmp` волатилен; артефакты — на диск стенда; книга и производные — вне git; `.env` не читать; - PUML не рендерить; `settings.local.json` не коммитить. +- `/tmp` волатилен; артефакты — на диск стенда. ⚠ Прочие гардрейлы этого класса (`.env`, PUML, + `settings.local.json`, книга вне git) живут в `CLAUDE.md` и читаются при онбординге — здесь НЕ + дублируются: третий носитель факта расходится с первыми двумя. - Промт-архивация: только отработанные, с баннером-исходом; residual-трекеры держать активными. ## Чего НЕ делать diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index e467b4b4..a44112a8 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -52,7 +52,7 @@ | 28 | Банк-линт латиницы в dst или строгая форма языкового предиката (7 строк утечки алфавита проходят экран); сюда же хвост закрытой 128 (D39.102: NoDst-почти-сентинел, латиница-target — дословно не переехал при закрытии, восстановлен аудитом D39.140) | бэкенд | когда-нибудь (добор идеала — носитель «свежий мини-прогон» растворён D39.67, актуализация D39.79) | касание чекеров при данных добора (помнить оговорку 36а: «甲等 → класс Цзя» строгой формой не ловится) | D39.52, D39.62, D39.64, D39.79 | | 28а | **Prompt-injection-проба входного текста** ($0): сепаратор ⟦TM-BANK-v1⟧ и якорь-подобные маркеры В ТЕКСТЕ КНИГИ — поведение среза/парсера/инъекции (книга = недоверенные данные; инструментов у моделей нет, но канал банкноты читает вывод по маркеру) | бэкенд/полигон | когда-нибудь | малая проба | сводка-ревью 26.07 | | **— СВИП ГИПОТЕЗ —** | | | | | | -| 30а | **Перерисовка puml-диаграмм под пост-пак-20 пайплайн** (терминолог, банкнота отдельным файлом); дом диаграмм теперь `backend/docs/` — правятся одним коммитом с кодом (D39.80); PUML НЕ рендерить (гардрейл). ⚠ **Ловушки activity-синтаксиса, поймавшие реальный баг 25.07** (перенесены из авто-памяти оркестратора при её чистке 21.08 — их не было ни в одном доке): `;` внутри многострочной метки ОБРЫВАЕТ её; строка метки, начинающаяся с `/ | < > ] }`, читается как спец-терминатор | бэкенд | когда-нибудь | ближайший пак, касающийся pipeline | аудит доков 26.07, D39.80 | +| 30а | **Перерисовка puml-диаграмм под пост-пак-20 пайплайн** (терминолог, банкнота отдельным файлом); дом диаграмм теперь `backend/docs/` — правятся одним коммитом с кодом (D39.80); PUML НЕ рендерить (гардрейл); ловушки activity-синтаксиса, стоившие реального бага 25.07, — `12-go-style-notes` §1 (дом на онбординг-пути бэкенда; строка держит указатель, а не сам факт — носитель с запланированной смертью для долговечного факта не годится) | бэкенд | когда-нибудь | ближайший пак, касающийся pipeline | аудит доков 26.07, D39.80 | | **— ОТДЕЛЬНЫЕ ПАКИ/РЕШЕНИЯ (бэкенд, добор идеала) —** | | | | | | | 31 | Слой-2: извлечение дискурс-норм/few-shot из ТЕЛ промтов (форсинг = ja→ru) | бэкенд | когда-нибудь | отдельный пак (идеал D39.33) | CURRENT-STATE, D39.33 | | 33 | **native-Gemini судья** (Ф2-механизм) ; до прод-заводки: $0.01-проба thinking⊆max_tokens на боевом слаге (D22.3) + включить sanitizer в pipeline-c2 при оживлении (D33.4б) | бэкенд | когда-нибудь | отдельный пак (идеал) | CURRENT-STATE, D39.33 | @@ -143,7 +143,7 @@ | 202 | **Живой перевод книги НАСКВОЗЬ через API платформы не гонялся НИ РАЗУ** (obstacle сессии P7, подтверждён приёмкой): всё после «прогон стартовал и остановился» — подпись банка, halt на потолке, резюм после пополнения — покрыто батареей против живого Postgres, но с движком-заглушкой; настоящий манифест, сайдкар банка и причины флагов будут ПЕРВЫМИ данными, форму которых платформа не сочинила сама. Форма проверки (решена): только через API, как ходил бы клиент — интейк → старт → живой движок с ключами провайдера → поток событий → подпись и продолжение → чтение глав/юнитов/замечаний/банка и сверка с тем, что движок реально произвёл; качество перевода НЕ предмет (полигон). Цена ≈ $0.05 на десятиглавую книгу. **Решение владельца 20.08: ПОСЛЕ холодного прогона движка** — гонять одну неготовую систему против другой смысла нет | платформа | скоро (гейт: холодный прогон движка) | короткая сессия по промту оркестратора | слово владельца 20.08, D39.153 | | 203 | **Хвосты контракта после синка 0.4.0 — ОТКРЫТА ЧЕТВЕРТЬ, остальное исполнено** (тела релеев — `platform/docs/archive/P7_ACCEPTANCE_HANDOFF_2026-08-17.md` §7; сюда переписаны НЕ тела, а статус — один носитель на факт). ⚠ Сверено грепом при лендинге, потому что первая редакция этой строки уже разошлась с деревом: **(б) ИСПОЛНЕН** — срезанная фраза компаньона §2.14 стоит на месте (`14-api-contract/README.md:510`) · **(д) ИСПОЛНЕН** — клетка приложения А заполнена `unspecified` (`README.md:1376` — ⚠ первая редакция писала `:1391`, это строка ДРУГОГО приложения; испр. 20.08) · **(г) наполовину** — `unspecified` ратифицирован в каноне (`openapi.yaml:1784-1787`), открыта только ГРАНИЦА ступеней замечаний (две ступени при девяти рангах движка) → это строка **148** · **(и)** закрыт полем `stop_requested` (D39.152) · (л)(м)(н)(о) закрыты контрактной сессией. **ОТКРЫТО РЕАЛЬНО:** (а) канон-половина про `/auth` — компаньон поверхность описывает (§2.14), а канон говорит только «Signing in is not part of this surface» (`openapi.yaml:35-36`) и НЕ предупреждает, что конверт вне `/v0` может прийти БЕЗ обязательного `code`; сгенерированный по канону клиент об это спотыкается · (з) расхождение семантики `--verify-bank`: D39.144 ратифицировал «подпись = ОДИН акт», движок держит пер-термный гейт полноты (`backend/internal/pipeline/mining.go:80-82,243`) — сегодня ОБОЙДЁН платформой, а не устранён (родня 191б); одно из двух должно уступить, это ратификация, не правка · (к) ключ `project_db` в `book.yaml`: договорить, кто им владеет — шаблон оператора его не содержит, движок делает необязательным. ⚠ **Следствие «на штатном деплое банк не читается» ОПРОВЕРГНУТО живым кодом** (проверено при лендинге): акт 5 внёс фолбэк `.db` и назвал прежний отказ багом (`platform/internal/runner/artifacts.go:82-90`); первая редакция этой строки повторила клейм хендоффа зоны, не сверив с деревом — остаток чисто договорной | контракт/доки | скоро (следующее касание контракта, вместе с 200) | контрактная сессия | приёмка P7 (D39.153) | | 204 | **Движок не публикует причины флагов ДАННЫМИ — карта причин у платформы рукописная и расходится молча** (релей §7(в) хендоффа P7; зона платформы в чужой бэклог не пишет и просила строку сюда — `platform/docs/archive/platform-PROGRESS-P7.md:206`). Сегодня `platform/internal/ingest/notes.go` держит рукописную копию закрытого словаря ЧУЖОЙ зоны: 15 причин движка → коды замечаний контракта, сверено побайтно на 20.08 и верно СЕЙЧАС. Импортировать движок платформе нельзя (D39.85 — разные модули), поэтому расхождение появится молча в тот день, когда движок добавит причину: платформа отдаст `unspecified` и напишет ERROR в лог, то есть деградация честная, но карта протухнет незаметно. Лечение: движок публикует свой словарь причин артефактом-данными (тем же классом, что манифест и сайдкары банка), платформа читает его вместо копии. ⚠ Носителем был ТОЛЬКО регистр платформы (PD-246) — то есть обязательство к зоне движка жило внутри зоны автора; поймано ревьюером полноты выгрузки при лендинге | бэкенд | когда-нибудь (со следующим касанием эмиссии флагов) | отдельное решение | приёмка P7 (D39.153), релей §7(в) | -| 205 | **Гейт якорей `--lint` даёт ЛОЖНУЮ ЗЕЛЕНЬ на целый класс — сдвиг содержимого он не видит по построению** (аудит собственной работы оркестратора, 21.08): скрипт проверяет ровно две вещи — существует ли файл и не больше ли номер длины файла (`docs/scripts/counts.py:337-339`), поэтому якорь, чья цель уехала на пять строк внутри длинного файла, проходит зелёным. Ровно так прошли ЧЕТЫРЕ якоря, сломанных архивацией P7: два из них стоят в источнике истины №1 и охраняют число, которое нота запрещает удалять как фантом. Плюс область: сканируются только `CLAUDE.md` + `docs/**/*.md` с выбросом всего, где в пути есть `archive` (`:316-320`) — `platform/docs/*` и `frontend/docs/*` не смотрятся ВООБЩЕ, хотя оба несут живые якоря в код. **Почему это дороже, чем кажется:** оркестратор опирался на зелень этого гейта ВМЕСТО ручной сверки, то есть инструмент не просто не поймал — он создал ложную уверенность. Лечение (выбрать при исполнении): якорь несёт не только номер, но и короткий отпечаток целевой строки, и линт сверяет его · либо номера строк в якорях запрещены в пользу имён функций и заголовков (как уже сделано в приложении А компаньона) · плюс расширить область на зонные доки | оркестратор/доки | скоро (следующее касание доков) | правка `docs/scripts/counts.py` + норма якорей | аудит работы №18, 21.08 | +| 205 | **Гейт якорей `--lint` даёт ЛОЖНУЮ ЗЕЛЕНЬ на целый класс — сдвиг содержимого он не видит по построению** (аудит собственной работы оркестратора, 21.08): скрипт проверяет ровно две вещи — существует ли файл и не больше ли номер длины файла (`docs/scripts/counts.py:337-339`), поэтому якорь, чья цель уехала на пять строк внутри длинного файла, проходит зелёным. Ровно так прошли ЧЕТЫРЕ якоря, сломанных архивацией P7: два из них стоят в источнике истины №1 и охраняют число, которое нота запрещает удалять как фантом. Плюс область: сканируются только `CLAUDE.md` + `docs/**/*.md` с выбросом всего, где в пути есть `archive` (`:316-320`) — `platform/docs/*` и `frontend/docs/*` не смотрятся ВООБЩЕ, хотя оба несут живые якоря в код. **Почему это дороже, чем кажется:** оркестратор опирался на зелень этого гейта ВМЕСТО ручной сверки, то есть инструмент не просто не поймал — он создал ложную уверенность. **Лечение — форма разобрана с внешним ревьюером 21.08, и ПЕРВАЯ редакция была слепа к породившему её инциденту:** «сверять только якоря на строках, которые трогает коммит» ловит сторону ДОКУМЕНТА, а якорь протухает, когда двигается ЦЕЛЬ — мои четыре якоря сломала архивация, и строки-носители коммит не трогал вовсе ⇒ односторонний гейт прошёл бы этот случай ЗЕЛЁНЫМ. **Честная форма — дельта ДВУСТОРОННЯЯ:** (а) якоря на затронутых строках — полная сверка; (б) все якоря живого корпуса, чья ЦЕЛЬ входит в состав коммита, — тоже (фильтр по `staged_files()`; скан корпуса и так гоняется каждый коммит). ⚠ Следствие: быстрый выход хука по `docs/**|CLAUDE.md` придётся расширить — чисто КОДОВЫЙ коммит и есть типовой триггер стороны (б). **Второе:** сверка по содержимому требует носителя ожидания, а `file:line` его не несёт; эвристика по окружающей прозе врала бы в обе стороны, а «хук, который врёт, учат игнорировать» (докстринг самого скрипта). Значит опт-ин формат: якорь несёт машинный токен (номер + дословная подстрока), безтокенные остаются на существовании и длине, а на ЗАТРОНУТЫХ строках токен-форма ТРЕБУЕТСЯ — корпус мигрирует по мере касания. **Три вещи, которые укусят:** диапазоны (`mining.go:80-82,243` — правило «токен в пределах диапазона», иначе гейт врёт на легитимной форме) · массовая переразметка дока помечает затронутыми ВСЕ строки и вываливает весь долг разом ⇒ кап вывода · и по новой норме гейт печатает, чего НЕ проверил. Плюс расширить область на зонные доки | оркестратор/доки | скоро (следующее касание доков) | правка `docs/scripts/counts.py` + норма якорей | аудит работы №18, 21.08 | | 49 | **Этапы Б+В спеки D15.2** (content-addressed resume / `guard_hash` — D39.31 сознательно не строил) ; этап В = tmctl export-контракт D29.1 (annot-v1 · цвет-мап+rollup · политика красных fail-closed) + операторский протокол-документ релиза гендер-твиста (D5.1): сам механизм УЖЕ построен — until_ch-правка → точечный re-edit со сметой и $0-пере-пином (`repin.go`/`rebill.go`, D39.42 п.5/D39.45) | бэкенд | скоро (ПОДТЯНУТА D39.81: annot-v1 = источник замечаний для фронта — критический путь подключения) | отдельное решение (annot-половина — по контракту 14, D39.99) | D39.34(4), D33 п.5, D39.81 | | 49а | **ALTER-шаги миграций v8–v14 не идемпотентны вопреки шапке `migrate.go:9-11`** (полу-применённая БД не сходится; счётчик версий скрывает) — находка критика полноты пака-19 | бэкенд | когда-нибудь | отдельное решение | D39.56, PACK19_BUILD §6.9 | | 50 | F3-остаток идемпотентности | бэкенд | когда-нибудь | отдельное решение | D39.34(4) | diff --git a/docs/architecture/12-go-style-notes.md b/docs/architecture/12-go-style-notes.md index 05327745..fbba0627 100644 --- a/docs/architecture/12-go-style-notes.md +++ b/docs/architecture/12-go-style-notes.md @@ -16,6 +16,7 @@ - **Язык кода (владелец 20.07): английский** — комменты, логи, операторские дашборды/error-msg, detail-флаги. **Русским (target-языком) ОСТАЮТСЯ и не трогаются:** wire/инъекц-промпты, которые читает модель (`glossaryBlockHeader`, маркер `⟨проверить⟩`, gender-аннотации; ⚠ снятие маркера с провода — санкционированная правка строкой 134 по D39.104, двигает RequestHash; правило неперевода остальных wire-строк в силе); lang-data таблицы гейтов; тест-данные перевода. Почему: перевод wire-строки = тихая смена инструкций модели → сдвиг вердиктов + `--resnapshot` (переоплата, D30.9); перевод lang-data ломает чекеры (матчат литералом). Проверка нейтральности правки: golden байт-идентичен по content_hash/final_hash. - **Имена без аббревиатур этапов (владелец 19.07):** ни `W0`/`W1`/`W1.5`/`W2` в идентификаторах, логах и комментариях — пишем `waveDraft`/`waveEdit`, «draft wave started». Аббревиатуры волн жили в разработке и в глоссарий попали как ИСТОРИЯ; в код и в операторский вывод они не возвращаются. - **Комментарий — одна-две строки «почему», а не эссе (владелец 26.07).** Doc-простыни на каждый символ избыточны; улики и разбор идут в отчёт пакета, а не в исходник. Несущее исключение — то, что из одной функции не выводится: порядок блокировок, инварианты между таблицами, цена забывания. ⚠ Норма измерима и уже нарушалась: `platform` PD-255 — миграция на 250 строк, наполовину проза. +- **PlantUML: две ловушки activity-синтаксиса, каждая уже стоила реального бага (25.07).** Точка с запятой ВНУТРИ многострочной метки обрывает её; строка метки, начинающаяся с `/ | < > ] }`, читается парсером как спец-терминатор. ⚠ Диаграммы НЕ рендерить в svg/png — владелец смотрит расширением VS Code (гардрейл `CLAUDE.md`); дом диаграмм — `backend/docs/`, правятся одним коммитом с кодом. - **Код группируется логическими папками по назначению, а не свалкой `archive/` (владелец, про КОД).** Архив-метафора законна для доков и промтов; для кода каталог обязан называть предмет. - **`_test.go` рядом с кодом — не бардак, а требование тулчейна**: `go test` собирает тесты только из каталога пакета; отдельных `tests/`-деревьев в Go не существует. - **Число/размер файлов — НЕ критерий сплита** (Google: «maintainers can move code between files without affecting callers»; эталон — stdlib `bytes`). Легитимный триггер — концептуально отдельная подсистема со своим узким API. **Этот тест прогнан против фактуры (пак-14, прил. A: связность измерена) — его проходят miner/checks/membank/chunk → сплит РАТИФИЦИРОВАН (D39.23, пак-15): сначала хойст общего субстрата (`internal/text` + value-типы), затем подсистемы; драйвер остаётся композит-корнем `internal/pipeline`.** Дробление «ради размера» по-прежнему запрещено (util-пакеты, течь деталей в API); crush-масштаб (~71 пакет) не эмулируем — сплит только по измеренному узкому API.