From 5838751574cd26e9320770f58c94f3bcbbca857d Mon Sep 17 00:00:00 2001 From: "Claude (backend session)" Date: Sat, 22 Aug 2026 18:11:44 +0300 Subject: [PATCH] Bring the navigation docs to the tree after the fix pack: the prompt-binding norm, the docs map, the zone README and the review prompt banner I got wrong --- docs/README.md | 4 ++-- docs/architecture/12-go-style-notes.md | 2 +- platform/README.md | 17 +++++++++++------ .../docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md | 8 ++++++-- platform/docs/STACK_DECISIONS.md | 3 ++- platform/docs/platform-PROGRESS.md | 2 +- 6 files changed, 23 insertions(+), 13 deletions(-) diff --git a/docs/README.md b/docs/README.md index ee8af27b..798f368a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,8 +17,8 @@ - `research/` — фактура ресёрчей 01–28; у принятых — ревью-шапки, часть тел под ⚠ superseded: **читай баннер прежде содержимого**. Ключевые для навигации: 15 голос · 16 ридер-IDE · 17 внешняя критика · 18 рычаги качества · 19 нарезка · 20 банк-майнинг · 21 обзор транспорта · 22 доменные харнессы · 23 шов движок↔платформа (транспорт superseded D39.106) · 25 холодное ревью шва — форма D39.106, отвергнутые альтернативы, требования к эмиттеру (читать перед любым кодом стыка) · 24 арбитраж банка (ПРИНЯТ D39.102: консилиум закрыт классом, вход фикс-пака банка — §G) · 26 официальные практики Anthropic (D39.121: записка-план, сниппеты хендоффов, карта «уже делаем/перенять») · **28 контракт-ревью API v0 (ПРИНЯТ D39.138: решения владельца 16.08 — §8, состав батча 0.3.0 — §5; НОСИТЕЛЬ для исполняющих сессий, читать оригинал, не пересказ)**. - [PROGRESS.md](PROGRESS.md) — журнал: CURRENT-STATE + **ЕДИНЫЙ БЭКЛОГ** (единственный трекер) + живой хвост хроники. НЕ источник решений. - `scripts/counts.py` — **производные числа доков считаются им, а не руками** (голова по трём носителям · счёт очереди и зон · вес открытых строк регистра платформы · полнота реестра нот); `--check` даёт ненулевой код на расхождении; `--lint` — линтер file:line-якорей живых доков (D39.126). Его же зовёт зонный хук `scripts/githooks/pre-commit`: **`--lint` якорей — при коммите, задевающем ЛЮБОЙ док или `CLAUDE.md`; `--check` чисел и головы — при коммите с D-логом или PROGRESS** (оба `--from-index`, предупреждает, не блокирует; вплетение линта — ревизия D39.148). Заведено по D39.112 п.5б: голова отставала трижды у трёх разных оркестраторов. -- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · **Контракт: активного промта НЕТ — канон стоит на 0.4.0, РАТИФИЦИРОВАН 20.08 (D39.152)**; батч 0.3.0 отработан целиком (D39.142+D39.143), промт в `archive/prompts/`, отчёт — `archive/reports/CONTRACT_BATCH_0.3.0_REPORT.md`; синк 0.4.0 сделан ОТДЕЛЬНОЙ контрактной сессией по записке зоны платформы (`platform/docs/archive/CONTRACT_SYNC_FROM_PLATFORM_2026-08-20.md`, разбор — §6в компаньона), следующий минор — сквозная полоса прогресса, строка 200 · **Полигон: [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md)** — фаза Д доводки эксп-22/23 ИДЁТ (заказ владельца 10.08; потолки фазы поднимал владелец напрямую — числа в CURRENT-STATE; выводы 22/23 заморожены до неё), хендофф живой сессии — [POLYGON_PHASE_D_HANDOFF.md](POLYGON_PHASE_D_HANDOFF.md) (испр. оркестратором №18: файл заленден `67e3260`, в составе не значился) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (отложен). **Фронт: ЗОНА ЗАМОРОЖЕНА (D39.136 п.2)** — S4 ИСПОЛНЕН и ПРИНЯТ (D39.135, лендинг `267aa35`; контракт 0.2.3 в каноне; промт в `frontend/docs/archive/`); ⚠ **разморозка БОЛЬШЕ НЕ привязана к P7** — слово владельца 17.08 (D39.147): зона морозится дальше лендинга P7, S5-промт не выдаётся, курс — движок и платформа до «работает и отдаёт результат»; разморозка отдельным словом. Перечень первого касания (синк зеркала на ТЕКУЩИЙ канон — версия к моменту разморозки, не «0.3.0» · типы · моки · гейт утечки · ФС-1..12 · Ф-63/Ф-28 · фразы В-11 по словарю кодов; ~~В-10~~ закрыт «вежливость») не отменён, ждёт разморозки; живой smoke против дев-стенда легитимен и во фризе; фикс-лист ФС — запись приёмки 15.08 в зонном журнале · **Платформа: активного промта НЕТ** — P6 + дофикс ИСПОЛНЕНЫ и ПРИНЯТЫ (D39.132, промты в `platform/docs/archive/`); **P7 ИСПОЛНЕН (пять актов 16–20.08), ПРИНЯТ С ФИКС-ЛИСТОМ и ЗАЛЕНДЕН, сессия ЗАКРЫТА владельцем 20.08** (D39.153; промт с баннером-исходом — `platform/docs/archive/PLATFORM_P7_SESSION_PROMPT_2026-08-16.md`); зонный фикс-лист из тринадцати пунктов плюс врезанный первым блокер свипа и то, что ушло в единый бэклог (198–203), — **пинг оркестратора №18 в `platform/docs/platform-PROGRESS.md`**; следующие работы зоны по порядку — дофикс-пак, ревью-пак четырёх непросмотренных осей, живой прогон насквозь (гейт — холодный прогон движка) · **Бэкенд: активного промта НЕТ** — пак «честные числа и статусы» ИСПОЛНЕН и ПРИНЯТ С ФИКС-ЛИСТОМ (D39.149, лендинг `f840867`; промт с баннером-исходом — `archive/prompts/BACKEND_HONESTY_PACK_SESSION_PROMPT_2026-08-17.md`); остаток — фикс-лист ФЧ-1…ФЧ-8 строкой бэклога **197**, носителя-сессии пока нет по слову владельца** (оба рубежа D39.141 закрыты: механическая сверка 11/11 блоков + ДВА прохода опровергателя другой моделью + узкая сверка вливания находок; первый проход сам принёс ошибку атрибуции — она вскрыта автором и подтверждена вторым проходом) (пак «честные числа и статусы»: строки 176 · 181 · 172-г · 187; п.5 живой вахты весов исполняется ТОЛЬКО при названной владельцем сумме) — ранее: пере-пин цен DeepSeek ИСПОЛНЕН и ПРИНЯТ (D39.137, лендинг `76049bb`; промт в `archive/prompts/`), потолки снова защищают; `tmctl migrate` — D39.134 (`d55edd4`), деплой эмиттер-бинаря разблокирован. Эмиттер шва ИСПОЛНЕН и ПРИНЯТ (D39.131, промт в архиве). Все ОТРАБОТАННЫЕ промты — в `archive/prompts/`, отчёты с ревью-шапками — в `archive/reports/`; статусы паков — CURRENT-STATE и D-лог, здесь не дублируются. Зонные журналы фронта/платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (прогресс зон только там, D39.100). -- Зоны фронта (чужие, читать при касании стыка; каждая ведёт СВОЙ зонный бэклог — единый бэклог их строк не принимает, D39.84): [../frontend/](../frontend/) — веб-интерфейс: промт фронт-сессий S0–S7 + [STACK_DECISIONS.md](../frontend/docs/STACK_DECISIONS.md) (пины версий точными числами и ловушки, сверены с вебом 02.08) + [BACKLOG.md](../frontend/docs/BACKLOG.md) · [../platform/](../platform/) — SaaS control plane: README + [BACKLOG.md](../platform/BACKLOG.md) (П-1..П-18) + `docs/` (зонный журнал `platform-PROGRESS.md` · регистр дефектов · архив промтов P0–P7). +- Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · **Контракт: активного промта НЕТ — канон стоит на 0.4.0, РАТИФИЦИРОВАН 20.08 (D39.152)**; батч 0.3.0 отработан целиком (D39.142+D39.143), промт в `archive/prompts/`, отчёт — `archive/reports/CONTRACT_BATCH_0.3.0_REPORT.md`; синк 0.4.0 сделан ОТДЕЛЬНОЙ контрактной сессией по записке зоны платформы (`platform/docs/archive/CONTRACT_SYNC_FROM_PLATFORM_2026-08-20.md`, разбор — §6в компаньона), следующий минор — сквозная полоса прогресса, строка 200 · **Полигон: [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md)** — фаза Д доводки эксп-22/23 ИДЁТ (заказ владельца 10.08; потолки фазы поднимал владелец напрямую — числа в CURRENT-STATE; выводы 22/23 заморожены до неё), хендофф живой сессии — [POLYGON_PHASE_D_HANDOFF.md](POLYGON_PHASE_D_HANDOFF.md) (испр. оркестратором №18: файл заленден `67e3260`, в составе не значился) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (отложен). **Фронт: ЗОНА ЗАМОРОЖЕНА (D39.136 п.2)** — S4 ИСПОЛНЕН и ПРИНЯТ (D39.135, лендинг `267aa35`; контракт 0.2.3 в каноне; промт в `frontend/docs/archive/`); ⚠ **разморозка БОЛЬШЕ НЕ привязана к P7** — слово владельца 17.08 (D39.147): зона морозится дальше лендинга P7, S5-промт не выдаётся, курс — движок и платформа до «работает и отдаёт результат»; разморозка отдельным словом. Перечень первого касания (синк зеркала на ТЕКУЩИЙ канон — версия к моменту разморозки, не «0.3.0» · типы · моки · гейт утечки · ФС-1..12 · Ф-63/Ф-28 · фразы В-11 по словарю кодов; ~~В-10~~ закрыт «вежливость») не отменён, ждёт разморозки; живой smoke против дев-стенда легитимен и во фризе; фикс-лист ФС — запись приёмки 15.08 в зонном журнале · **Платформа: активный промт — [PLATFORM_P8_REVIEW_SESSION_PROMPT.md](../platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md)** (read-only ревью четырёх осей: деньги и леджер · вход/сессии/CSRF · очередь и джобы · метрики; запуск по слову владельца; шапка несёт дельту после P8-FIX — ось 2 не тронута ничем, оси 1 и 4 задеты точечно). Прожито: P6 + дофикс (D39.132) · **P7 — пять актов, ПРИНЯТ С ФИКС-ЛИСТОМ, ЗАЛЕНДЕН, сессия закрыта владельцем 20.08** (D39.153) · **P8-FIX — фикс-лист P7 плюс блокер свипа, ПРИНЯТ и ЗАЛЕНДЕН 22.08** (D39.154, лендинг `31f1f82`: голодание свипа закрыто четырьмя механизмами, снят пер-термный write-путь банка). Все отработанные промты — `platform/docs/archive/`. Дальше по очереди: ревью-пак → живой прогон книги насквозь (гейт — холодный прогон движка, строка 202) · **Бэкенд: активного промта НЕТ** — пак «честные числа и статусы» ИСПОЛНЕН и ПРИНЯТ С ФИКС-ЛИСТОМ (D39.149, лендинг `f840867`; промт с баннером-исходом — `archive/prompts/BACKEND_HONESTY_PACK_SESSION_PROMPT_2026-08-17.md`); остаток — фикс-лист ФЧ-1…ФЧ-8 строкой бэклога **197**, носителя-сессии пока нет по слову владельца** (оба рубежа D39.141 закрыты: механическая сверка 11/11 блоков + ДВА прохода опровергателя другой моделью + узкая сверка вливания находок; первый проход сам принёс ошибку атрибуции — она вскрыта автором и подтверждена вторым проходом) (пак «честные числа и статусы»: строки 176 · 181 · 172-г · 187; п.5 живой вахты весов исполняется ТОЛЬКО при названной владельцем сумме) — ранее: пере-пин цен DeepSeek ИСПОЛНЕН и ПРИНЯТ (D39.137, лендинг `76049bb`; промт в `archive/prompts/`), потолки снова защищают; `tmctl migrate` — D39.134 (`d55edd4`), деплой эмиттер-бинаря разблокирован. Эмиттер шва ИСПОЛНЕН и ПРИНЯТ (D39.131, промт в архиве). Все ОТРАБОТАННЫЕ промты — в `archive/prompts/`, отчёты с ревью-шапками — в `archive/reports/`; статусы паков — CURRENT-STATE и D-лог, здесь не дублируются. Зонные журналы фронта/платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (прогресс зон только там, D39.100). +- Зоны фронта (чужие, читать при касании стыка; каждая ведёт СВОЙ зонный бэклог — единый бэклог их строк не принимает, D39.84): [../frontend/](../frontend/) — веб-интерфейс: промт фронт-сессий S0–S7 + [STACK_DECISIONS.md](../frontend/docs/STACK_DECISIONS.md) (пины версий точными числами и ловушки, сверены с вебом 02.08) + [BACKLOG.md](../frontend/docs/BACKLOG.md) · [../platform/](../platform/) — SaaS control plane: README + [BACKLOG.md](../platform/BACKLOG.md) (П-1..П-18) + `docs/` (зонный журнал `platform-PROGRESS.md` · регистр дефектов · `STACK_DECISIONS.md` с рецептом стенда и инвентарём каналов шва · архив промтов P0–P8). - `archive/` — история ([правила архива](archive/README.md)): закрытые промты (`prompts/`) · отчёты с ревью-шапками (`reports/` — на них ссылаются приёмки) · исполненные арх-доки (`architecture/`) · слайсы хроники `PROGRESS-*.md`. Инструкции оттуда не исполнять. - Диаграммы: [../backend/docs/components.puml](../backend/docs/components.puml) · [../backend/docs/pipeline.puml](../backend/docs/pipeline.puml) — дом рядом с кодом (D39.80), правятся бэкендом одним коммитом с кодом; вручную НЕ рендерить (владелец смотрит PlantUML-расширением VS Code). diff --git a/docs/architecture/12-go-style-notes.md b/docs/architecture/12-go-style-notes.md index 4e785b16..3eb14ebb 100644 --- a/docs/architecture/12-go-style-notes.md +++ b/docs/architecture/12-go-style-notes.md @@ -7,7 +7,7 @@ 1. **Движок language/book-agnostic.** Go-ЛОГИКА не ветвится по паре языков или книге. Пара-специфичное — ДАННЫМИ: `internal/lang` + `configs/langpacks/<пара>/` (fail-loud loader, байты в `pack.Version()` → снапшот). Книго-специфичное — данными КНИГИ: сид-глоссарий / brief / book.yaml. Книжный канон в общем пар-слое = утечка (прецедент: 古月 в surnames-compound.txt). 2. **Пар-скоупнутые модули** (checkers_zh_ru и т.п.) легитимны как код за pair-гейтом, но их ДАННЫЕ (словники, руны, таблицы) подлежат выносу в langpack. 3. **Тест-данные пары легитимны**: zh/ru-строки в `*_test.go`/golden упражняют общую логику. Не путать с логикой. -4. **Промпты — pair-keyed файлы** (`prompts: {<пара>: файл}`, fail-loud на чужую пару); конвенции пары (меры, стихи, дискурс) живут в теле промпта СВОЕЙ пары — это данные. Дальний план — извлечение в структурированный пакет конвенций пары (10-prompt-architecture, гейтится формой пакета). +4. **Промпты резолвятся КОНВЕНЦИЕЙ ПУТИ, а не ключом конфига** (форма пака-15; ⚠ прежняя редакция этой строки писала `prompts: {<пара>: файл}` — такого ключа нет, испр. 22.08 аудитом доков): пара-пак — `configs/pairs/<пара>.yaml`, роль — `prompts/<пара>/<роль>.md`, и пара без пакета падает ГРОМКО на загрузке с именем пути, который искали (`internal/config/pair.go`; пины `config.TestPromptResolvesByPairAndRoleConvention` и `config.TestPromptMissingPairPackFailsLoud`). ⚠ Прежний ключ не просто снят — он ОТВЕРГАЕТСЯ загрузкой (`config.TestRetiredPromptKeysAreRejected`), то есть конфиг, написанный по старой редакции этого норматива, не поднимется вовсе. Конвенции пары (меры, стихи, дискурс) живут в теле промпта СВОЕЙ пары — это данные. Дальний план — извлечение в структурированный пакет конвенций пары (10-prompt-architecture, гейтится формой пакета). 5. Ревью-вопрос по умолчанию: **«заработает ли это на паре, которой в репо ещё НЕТ, без правки Go?»** Если нет — данные наружу. 6. **Контент-свойства — тем же правилом (владелец 25.07, D39.25):** движок НЕ ветвится по типу контента (18+/архаика/жанр). Механизм generic: content-label книги/глав = данные книги · capability провайдера = данные models.yaml · сопоставление и политика цепочки = движок/конфиг. «adult» — значение данных, не Go-идентификатор. Refusal-обработка причино-агностична (D12: детектим ФАКТ отказа; причина — операторская диагностика). Ревью-вопрос: «добавится ли второй лейбл (archaic-register) без правки Go?» diff --git a/platform/README.md b/platform/README.md index ed783a9a..46969ef8 100644 --- a/platform/README.md +++ b/platform/README.md @@ -22,8 +22,11 @@ второй конец того же правила, и он в силе и в бою, и в рецепте дев-стенда. Бинари: `cmd/tmplatformd` (сервис) и `cmd/tmplatformctl` (админ: гранты, КОРРЕКТИРОВКИ (`adjust`), баланс, журнал входов, -отзыв сессий, дев-интейк `book add`, список книг для апгрейда движка `books`, сид дев-стенда `seed`, -и `exit-marker` — его зовёт systemd на конце прогона). Деплой — `deploy/`. +отзыв сессий, дев-интейк `book add`, список книг для апгрейда движка `books` и список книг, чью +читательскую поверхность построить не удалось (`books --abandoned` / `book refresh`), диагностика и +терминальный вердикт по застрявшим прогонам (`runs [--stalled]` / `run abandon`, P8-FIX), сид +дев-стенда `seed`, и `exit-marker` — его зовёт systemd на конце прогона). Что оператор делает, когда +свип не справляется, — `deploy/README.md` §«Застрявшая работа». Деплой — `deploy/`. Метрики — отдельным слушателем (`TM_PLATFORM_METRICS_ADDR`, дефолт `127.0.0.1:9464`), формат Prometheus; на контрактную поверхность они не выходят и наружу не привязываются (`docs/STACK_DECISIONS.md` §24). @@ -45,8 +48,9 @@ Prometheus; на контрактную поверхность они не вы | как это разворачивается и в каком порядке | `deploy/README.md` | | незакрытые куски работы | `BACKLOG.md` | -⚠ Документы вида `docs/P7_*` — **рабочие записи конкретной сессии**, а не состояние зоны: они несут -ход работы и полезны той же сессии после компакции. Для лендинга их читать не нужно. +⚠ Рабочие записи конкретной сессии (`P7_*`, `*_HANDOFF`, планы актов) — **не состояние зоны**: они +несут ход работы и полезны той же сессии после компакции. Все такие файлы уехали в +`docs/archive/` при лендингах, и новые туда же; для лендинга их читать не нужно. ## ⚠ Git и зона (читать ДО первой строки кода) @@ -85,8 +89,9 @@ Prometheus; на контрактную поверхность они не вы - очередь задач и запуск воркеров, статусы прогонов, ретраи — **есть (P4)**: River на том же Postgres; задание очереди выдаёт только РАЗРЕШЕНИЕ стартовать, а жизнь прогона ведёт реконсилятор, который читает мир (Postgres · журнал книги · маркер выхода) и не ждёт процесса; -- читающая поверхность контракта — **есть (P7)**: дерево глав и пары с текстом, замечания, банк и - подпись, `GET /capabilities`, машинная модель ошибок (`code` + `request_id`), условные чтения +- читающая поверхность контракта — **есть (P7)**: дерево глав и пары с текстом, замечания, ЧТЕНИЕ + банка (⚠ ЗАПИСЬ в банк снята 22.08 вместе с пер-термной моделью подписи — `PD-370`, D39.144: подпись + это `resume`, а ручки «поправить/добавить термин» нет ни в зоне, ни в каноне), `GET /capabilities`, машинная модель ошибок (`code` + `request_id`), условные чтения (`ETag`/304) и сжатие JSON, `Idempotency-Key` на двух создающих вызовах; - SSE-поток прогресса во фронт — **есть (P7)**: поток на КНИГЕ (не на прогоне), кадры минтит писатель в свою транзакцию, клиент продолжает по `Last-Event-ID` (⚠ денежные суммы на провод и на diff --git a/platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md b/platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md index 9e746dcf..5cd8b60b 100644 --- a/platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md +++ b/platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md @@ -12,8 +12,12 @@ > Абзац про найденный блокер ниже оставлен как описание НАЙДЕННОГО — зона пере-нацелила его якоря и > сказала об этом прямо. Ищи сиблингов класса, но теперь И в самом лечении: оно свежее, его смотрели > ревьюеры зоны и приёмка, и у него уже есть четыре открытых строки — `PD-371`…`PD-374`. -> **(2) Оси 1, 2 и 4 (деньги и леджер · вход/сессии/CSRF · метрики) не тронуты вообще** — там пак -> по-прежнему первый взгляд, и он и есть главная ценность этого захода. +> **(2) ⚠ Поправка к первой редакции этого баннера (её ошибку нашёл аудит доков в тот же день):** +> «оси 1, 2 и 4 не тронуты» — НЕВЕРНО. Ось 2 (вход · сессии · CSRF) действительно не тронута ничем, там +> ты первый взгляд целиком. А оси 1 и 4 дофикс ЗАДЕЛ точечно, и ты обязан это знать, чтобы не искать +> уже найденное: `internal/metrics/metrics.go` (+гейдж `runs_stalled`) и `internal/pgstore/credits_test.go` +> (+пин `PD-334`), плюс `internal/pgstore/isolation_test.go` (`PD-333`). Системного разбора ни та, ни +> другая ось не получила — точечные находки при постройке это не он. > **(3) §4.7 работает В ОБРАТНУЮ СТОРОНУ:** релея тебе ждать не от кого, твои находки поедут в > СЛЕДУЮЩИЙ кодовый пак — тем же протоколом, через оркестратора, с эхо-подтверждением. diff --git a/platform/docs/STACK_DECISIONS.md b/platform/docs/STACK_DECISIONS.md index 0eb61f32..4ea69fe8 100644 --- a/platform/docs/STACK_DECISIONS.md +++ b/platform/docs/STACK_DECISIONS.md @@ -331,7 +331,7 @@ совпадает ровно тогда, когда обе записи сделала одна транзакция. Найдено тем, что два пина этого же акта прошли под мутацией, которую сами называют. -## Инвентарь каналов движка — полная таблица (собран паком P8-FIX 22.08 ЧТЕНИЕМ кода движка) +## Инвентарь каналов движка (собран паком P8-FIX 22.08 ЧТЕНИЕМ кода движка) > Перенесено оркестратором №18 при лендинге P8-FIX из отчёта пака: это был его артефакт §4.4, и > ДРУГОГО носителя у таблицы в репозитории нет (грепом — `research/23` описывает ФОРМУ шва, а не @@ -350,6 +350,7 @@ | `.auto-bank.yaml` | `pipeline/mining.go` `os.WriteFile` | **НЕ атомарно** | читателя нет | ✅ то же правило | | `mined_delta` (путь из `book.yaml`) | **писателя в движке НЕТ** — только читатель `loadMinedDelta`; формат `seed.File` (`terms:`), грузится `membank.LoadGlossarySeed`, `Source` пере-штампуется на `"mined"` | — | **писателя НЕТ и у платформы** | ❌ **разрыв — это строка 199(а) единого бэклога**, развилка ждёт ратификации | | `mined_rejects` | читатель `loadMinedRejects`; формат `rejects: [{src, note}]` — это ФИЛЬТР ПРЕДЛОЖЕНИЙ, в банк не входит | — | писателя нет | ❌ тот же разрыв | +| `tmctl export --json --pairs` | движок (`pipeline/export.go`) | — (одноразовая выдача на вызов) | `internal/runner/engine.go` `ExportArgs`/`Export` → `ingest.DecodeExport` → `internal/readmodel` | ✅ ⚠ **Единственный канал, несущий ТЕКСТ пары** — исходник и перевод; манифест несёт только структуру. Пропущен в первой редакции этой таблицы (найдено аудитом доков в тот же день) | | `events.jsonl` (NDJSON эмиттера) | движок, StreamVersion 1.1 | append-only | `internal/ingest/tail.go` + `pgstore.RunSink` | ✅ | | exit-коды `tmctl` | контракт движка | — | `ingest.OutcomeOf`, `internal/runs/reconcile.go` `outcome` | ✅ | | `tmctl status --json` | движок | — | `internal/runner/engine.go` → `ingest.StatusReport`; расчёт денег | ✅ форму P8-FIX не менял; изменил лишь то, СКОЛЬКО раз его зовут при неудаче (бэкофф отсрочки) | diff --git a/platform/docs/platform-PROGRESS.md b/platform/docs/platform-PROGRESS.md index 923e8579..06848ab6 100644 --- a/platform/docs/platform-PROGRESS.md +++ b/platform/docs/platform-PROGRESS.md @@ -16,7 +16,7 @@ остаётся то, что рецепт объявляет у батареи ДВА гейта, а их три — `PD-374`. - **Тесты 561 против 532 на HEAD** — сходится, сверено `git show HEAD:<файл>` по всем `_test.go` против дерева. Удалённых имён ровно **три**, все три описывали снятую пер-термную подпись. - - **Отпечатки миграций:** пере-считаны все 41, расхождений нет; в диффе `migrations.sha256` ровно + - **Отпечатки миграций:** пере-считаны все 25, расхождений нет (⚠ испр. 22.08 аудитом доков: первая редакция этой строки писала «41» — число взято из головы, а не из команды; `grep -c '^[0-9a-f]\{64\}' migrations.sha256` = 25, файлов миграций тоже 25); в диффе `migrations.sha256` ровно одна ДОБАВЛЕННАЯ строка — заявление «релизные миграции не тронуты» держится механически. - **Пол поверхности 15 → 14** равен реальной длине таблицы маршрутов (14), то есть запаса не оставлено и следующее сужение гейт поймает. Причина стоит в комментарии рядом.