textmachine/docs/PLATFORM_BANK_READOUT_SESSION_PROMPT.md

134 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Платформенный пак: ЧЕЛОВЕКУ ПОКАЗЫВАЮТ ПУСТОЙ ЭКРАН, КОГДА ЕМУ ЕСТЬ ЧТО ПОДПИСАТЬ
## 1. Какая проблема и что решит твой результат
Движок переводит книгу и один раз за прогон **останавливается**, чтобы человек подписал термины: как зовут героя, гору, секту. Это единственный момент во всём продукте, когда у человека спрашивают решение, и от него зависит связность всей книги — подписанный термин дальше едет законом.
В этот момент движок кладёт рядом с базой книги файл-проекцию банка. Замерено на двух купленных боевых прогонах:
| прогон | `terms` | `proposed` | `consolidation` |
|---|---|---|---|
| A (платная стоп-граница) | **0** | **69** | объект из 7 полей |
| B (платная стоп-граница) | **0** | **66** | объект из 7 полей |
Платформа читает из этого файла **только секцию `terms`** — и отдаёт человеку ноль. Десятки предложений лежат в том же файле непрочитанными, и первый слой ратифицированного `D39.256` («в продолжение едет подписанное») у любого пользователя пуст фактически: подписывать нечего, потому что предложения до него не доехали.
**Ряды трекера, которые пак закрывает:** **224** (движковая половина закрыта 07.09, остаётся платформенная — у секции предложений ноль читателей) и **253** (поля на странице банка нет, у секции консолидации ноль читателей). Оба — заказ этого пака слово в слово.
## 2. Зона записи и git
**Твоя зона — `platform/`** плюс зонный журнал `platform/docs/platform-PROGRESS.md` и, если понадобится, `platform/BACKLOG.md`. **Контракт `docs/architecture/14-api-contract/` — исключение: туда писать можно и нужно** (прецеденты: миноры 0.13.0, 0.14.0, 0.15.0 сданы платформенными паками), но только туда; остальной `docs/` не трогай. **Ты не коммитишь** — готовишь дерево и передаёшь оркестратору. Git-дисциплина целиком — `CLAUDE.md` §«Git-координация мультисессий».
**`frontend/docs/api-contract/` НЕ ТРОГАТЬ.** Зеркало фронта отстало на тринадцать миноров (`0.2.3` против `0.15.0`), и это **ратифицированное** отставание на время заморозки зоны (`D39.142` п.5). Типы фронта генерятся из зеркала — правка разбудит замороженную зону.
## 3. Карта чтения — ЗАКОН
1. `CLAUDE.md` в корне — канон проекта целиком.
2. **`platform/docs/ENGINEERING_STANDARDS.md`** — ратифицированный стандарт зоны; карта доков требует, чтобы каждый платформенный промт на него ссылался, отступление — пинг. Рядом `platform/docs/PLATFORM_DIRECTION.md` — ратифицированное направление зоны.
3. `platform/internal/ingest/bank.go` (153 строки) — существующий ридер проекции. **Читать целиком, включая комментарии: в них дисциплина, которую ты наследуешь** (§4.2).
4. **Путь артефакта целиком:** `platform/internal/runner/artifacts.go``platform/internal/pgstore/readmodel.go` (функция сохранения банка) → миграции `platform/internal/pgstore/migrations/`. Там решается, ломает ли новая секция дельта-чтение.
5. Контракт: `docs/architecture/14-api-contract/openapi.yaml` (адресно: страница банка, схемы термина и статуса) **и его компаньон `README.md` рядом** — компаньон ратифицирован и ведёт провенанс каждой строки; минор без него разойдётся с конструкцией.
Код первичен: адреса — отправные точки. ⚠ **Числа этого промта сняты оркестратором; те, на которых строишь решение, пере-снимай сама.**
## 4. Что построить
### 4.1. Прочитать секции — поля снимаешь ЗАМЕРОМ, не по этому списку
Научить ридер разбирать две секции, которые он сегодня игнорирует: **`proposed`** (предложения движка) и **`consolidation`** (итог прохода терминолога).
**Список полей НЕ переписывай из промта — сними сама, и НЕ с файлов, а С ПИСАТЕЛЯ.** ⚠ Первая редакция этого промта называла состав по двум снимкам сырья и ошиблась в членстве: обязательность определяется наличием `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` — то самое поле, ради которого экран и существует:** движок объявляет его классом, который читают ПЕРВЫМ («консолидированная передача — НЕ та, что дали черновики»). Ридер без него покажет человеку список, в котором не видно, что движок выдумал имя. Не потеряй его так, как потерял первый черновик этого промта.
**САМОЕ ОПАСНОЕ МЕСТО ПАКА — слово `proposed` значит здесь ДВЕ разные вещи.** В контракте это значение статуса строки (движковый `auto` переводится в него); в проекции — имя секции с предложениями, и это другой объект с другими полями. Не заводи третий смысл и не переименовывай существующий. Как назвать новое во внешнем контракте — решай сама и аргументируй; мой приор, опровергаемый: во внешнем имени слова `proposed` избегать вовсе.
### 4.2. Взять у образца не форму, а ГАРАНТИЮ — ДЕЛАЙ РОВНО ТАК
Существующий ридер несёт три решения, каждое с ценой ошибки в комментарии: документ **без версии банка отвергается** («пустой банк и документ, который эта сборка не умеет читать, декодируются одинаково, и один из них заменил бы весь банк книги ничем»); **неизвестный статус** читается как «просит решения»; **неизвестное происхождение** — как то, что заявляет о себе меньше всего.
Твои секции наследуют **этот класс гарантий**. Конкретно спроси себя:
- чем у тебя отличается «секции в файле нет» от «секция есть и пуста»? Если ничем — ты воспроизвёл ложный ноль, ради устранения которого пак заказан;
- **то же про ПОЛЯ**: четыре из двенадцати опциональны, и «поля нет» не равно «значение ложно»;
- **граница.** Проекция пишется на ПЯТИ границах прогона и сама это объявляет, несёт отметку границы и идентификатор прогона, а её экспорт трижды предупреждает, что файл может быть несвежим. Ридер сегодня эти поля не читает вовсе. ⇒ секция предложений читается только вместе с отметкой границы, и **«граница не та» обязано отличаться от «предложений нет»**.
### 4.3. Отдать наружу — контрактный минор, РЕШАЕШЬ САМА
Канон `0.15.0`, полоса мажора `0`, добавление — минор. Форму решаешь ты: расширить ответ существующей ручки, добавить секцию рядом или отдельный ресурс. Аргумент обязан отвечать на вопрос «что увидит человек, которому надо подписать».
**Развилка, которую надо знать заранее: у предложения НЕТ идентичности.** У термина есть `id` и он несёт объяснение зачем; у предложения `id` нет ни в одном из 135 замеренных объектов. Вся платформенная сторона построена поверх этого `id`: сохранение банка ключует по нему, бампает ревизию книги, а исчезновение строки переводит книгу в сброс ревизии, «потому что исчезнувшую строку нельзя выразить дельтой». Контракт при этом отдаёт страницы с курсором и версией, а порядок предложений — **ранжирование**, которое между прогонами меняется. ⇒ «чем адресуется предложение в дельта-чтении» — настоящий вопрос, движок тебе править нельзя, и **пинг с обоснованием здесь полноценный исход пункта**, а не срыв. Выдумывать `id` на стороне платформы — пере-реализация закона движка, это запрещено.
**Проза контракта едет в исходник генерируемого клиента** — ратифицированная конструкция. Описания пишутся как код.
### 4.4. Хранилище — назови решение явно
Секции сегодня хранить негде: таблица банка одна, миграций 35, и ни одна не знает ни предложений, ни консолидации. Решаешь сама, с аргументом: **хранить в базе** (тогда миграция — часть пака, и надо показать, что она не ломает дельта-чтение и ревизию) или **читать на лету** из артефакта (тогда назови, что происходит, когда артефакта нет или он с другой границы).
### 4.5. Чего НЕ делать
- Не строить UI и не размораживать фронт; читатель сегодня — API.
- Не трогать движок: проекцию пишет он, её формат — его зона. Расхождение формата — **пинг**, а не правка у себя.
-**Не подпирать заплаткой то, что просит перестройки.** Слово владельца 17.09 (`D39.258` п.3): чистый код, рефакторинг где нужен, техдолг не копить. Отрефакторила — **назови в отчёте, что и почему**.
## 5. Самопроверка ИСПОЛНЕНИЕМ
Гейт зоны (`make check`) обязателен и самопроверкой не является. Сверх него — адверсариальный проход по своей готовой работе; **субагентов поднимать разрешаю явно**. Тебе разрешён **один** старший советчик (`model: "fable"` явно) для развилки, которую не закрывает своё суждение: досылай вопросы ему, а не поднимай новых. Он советчик, не источник истины — его посылки проверяются деревом.
Четыре места, где этот пак мягок:
1. **Коллизия имени `proposed`** — проверь исполнением, что в одном ответе два смысла не смешались.
2. **Различение «нет» и «пусто»** — для секций И для опциональных полей; пин обязан краснеть, если их склеить.
3. **Полнота минора** — сверь, что каждое объявленное поле уходит на провод, а не только имеет тег.
4. **Ложный ноль на живом файле** — предъяви числа ДО и ПОСЛЕ на купленных проекциях: «было 0, стало 66» и есть доказательство.
## 6. Оси ревью
Две-три, можешь заменить: **контрактная** (минор законен, полон, описания говорят правду о поведении) · **дисциплина ридера** (гарантии §4.2 перенесены, а не процитированы) · **человеческий узел** (достаточно ли отданного, чтобы человек принял решение; чего не хватает — назови, даже если не строишь).
## 7. Чем мерить — купленное сырьё, ТОЛЬКО на чтение
- `/home/ubuntu/tm-coldrun-a/evidence/bankstop-paid/project.db.bank.json`
- `/home/ubuntu/tm-coldrun-b/evidence/paid-bankstop/project.db.bank.json`
⛔ Это купленные улики: открывать только на чтение, ничего в этих каталогах не создавать. ⚠ Рядом с проекцией B лежит база прогона — **её не открывать вовсе**: движковый стор молча мигрирует старую схему и уничтожает улику (ряд **475**), а рядом с ней уже появился временный файл от чьего-то чтения без флага неизменности (ряд **472**).
## 8. Записка-план
До первой правки кода — короткая записка в зонный журнал: что строишь, какой формой отдаёшь, что решила по коллизии имени, по идентичности предложения и по хранилищу.
## 9. Эхо-протокол старта
**Первым действием** — десять строк **своими словами**: скоуп, инварианты, чего не делаешь.
## 10. Что не удалось — и где прибор слеп
Секция обязательна, и вторая её половина тоже: **«где мой прибор слеп и я это знаю»** — что невидимо, почему не чинила, чем закрывается. В коде названо, в отчёте нет — значит для следующей смены не названо.
## 11. Канал вопросов и право отказа
Конфликт промта с кодом — **пинг**, не интерпретация. Право сказать «этого делать не надо» с аргументом у тебя есть. Прямой канал — механизм в `CLAUDE.md` §«Связь между сессиями»: впиши свой блок первым делом, эхо отправь по адресу оркестратора оттуда же.
## 12. Критерий завершённости — проверяемый
- у **каждого** пункта заказа исход: сделано · не делаю с доводом · пинг;
- круги **сошлись**, прежние находки закрыты таблицей «находка → что сделано → **чем предъявлено**»;
- **числа ДО и ПОСЛЕ на обоих купленных файлах** предъявлены командой;
- ряды **224** и **253** закрыты либо названо, что именно от них осталось;
- список «что отрефакторено и почему» либо явное «не потребовалось» с доводом;
- гейт зоны зелёный **целиком**; всё живое — **в дереве**;
- сказано явно: **«работа завершена, править не планирую»**.
## АДДЕНДУМ ВЛАДЕЛЬЦА 17.09 (передан сессии релеем; ратифицирован `D39.258` п.9)
1. **Тщательно проектируй решение** — замысел раньше кода, и он предъявляется запиской-планом.
2. **Комментарии только нужные, без странных гарантий.** Не пиши гарантию, которой не стережёт ни один пин; комментарий, несущий ВЫВОД, обязан назвать условие, при котором вывод перестаёт держаться.
3. **Прозы в коде нет.** Комментарий объясняет ПОЧЕМУ, а не пересказывает, что делает строка.
4. **Решение общее для книг и языков.** Go-логика не ветвится по паре или книге: пара-специфика — в данных и языковых пакетах, книжные каноны — в сиде и брифе. Ревью-вопрос по умолчанию: «заработает ли пара, которой в репозитории ещё НЕТ, без правки Go?»
5. **Советчиков разрешено ДО ДВУХ** (прежняя норма — один), с ПОСТОЯННЫМ контекстом; вопросы досылаются тем же агентам. Советоваться предписано на ПРОЕКТИРОВАНИИ и на ПРИЁМКЕ, а не только при затруднении.
6. **Грепать `docs/`, `research/`, `experiments/` можно в любое время** — карта чтения промта это МИНИМУМ, а не потолок.
⇒ приём аддендума эхо-подтверждается, и в отчёте он идёт ОТДЕЛЬНЫМ пунктом.
---
⭐ Приоритет №1 проекта — издательское качество перевода длинной книги: связные термины и голоса на всю книгу. Экран подписи — место, где человек этим управляет напрямую. Всё здесь меряется одним: **стало ли человеку видно, о чём его спрашивают.**