textmachine/docs/product-requirements.md

19 KiB
Raw Blame History

Реестр продуктовых требований — «что продукт обязан уметь»

Единый список требований владельца к продукту. Источники: ../START_PROMT.MD (ЖИВОЙ бриф, идеи V0V5) + владельческие находки H6H18 (architecture/09-target-architecture.md §3). Статусы сверены кодом и D-логом при D39.80 (02.08.2026), освежены свипом D39.101 (04.08.2026) и докс-паком №16 (09.08.2026, строка 167 — ПТ-9/19/20/25/35). При конфликте с D-логом побеждает D-лог. Правила: новую V-секцию владельца разбирает сюда оркестратор при первом касании; статус правится при лендинге пака, который его меняет; требование без носителя не оставлять.

Статусы: построено · 🔶 частично · не построено · снято (отменено владельцем ИЛИ закрыто отрицательным замером — с D-ссылкой) · 🔒 открытый вопрос владельца.

Ядро перевода

ID Требование (источник) Статус Носитель / доказательство
ПТ-1 Издательское художественное качество, победить translationese (V0 гл. цель; канон §1) 🔶 пайплайн draft→терминолог→editor→гейты→судья построен, адресная эскалация дорогой моделью есть (pipeline/escalation.go); качество добирается курсом «добор идеала» (D39.62/67, бэклог 24·65; 16 — непрогнанная edit-волна того же курса). Выводы-п.2 брифа (редкий узкий вызов за смыслами вне книги) — поглощён этим курсом, отдельный механизм не строится без замера
ПТ-2 Пары zh/en/ru/ja ВО ВСЕ СТОРОНЫ (V0-п.11; V4-п.5: в zh→en русский не участвует); движок общий, пара = данные (канон §2) 🔶 построено только →ru: zh→ru боевая; ja→ru безопасна без правки Go, en→ru — нет (карта D39.60); не-ru target = антицель §0.1 в 09; носители: строки 81 (ja-преп) · 35 (не-CJK майнер) · 34
ПТ-3 Книга ЦЕЛИКОМ (эталон 7,78 млн симв., ~2284 раздела) 🔶 гоняли ≤10 глав; волны/потолки/ETA на сотнях глав = строка 54 (МАСШТАБ)
ПТ-4 Референсы: предыдущие части серии / чужой перевод как контекст (V0-п.1314) 🔶 серийный шаринг банка = строка 48а; импорт «оригинал+чужой перевод» = 48б (юр-сторона — 67)
ПТ-5 Неологизмы/выдуманные автором слова переводятся консистентно (V1-п.6) 🔶 банк+майнер держат термины книги; замер на вне-претрейн тексте = строка 55
ПТ-6 Структурные традиции целевого языка (короткие zh-абзацы → читаемые ru-структуры) (V1-п.4) 🔶 редакторские мандаты в пар-промптах; спец-замера структуры нет — добор идеала
ПТ-7 Слабый оригинал: подправлять ли художественно — вопрос владельца не решён (V1-п.5) 🔒 канал вопросов; сейчас пайплайн верен оригиналу

Память и консистентность

ID Требование (источник) Статус Носитель / доказательство
ПТ-8 Банк памяти на всю книгу, «крайне точный» (V0-п.78; Выводы-п.1) D39.69/75/77/78; recall банка 0.918/0.980 на холодном прогоне (D39.58). Смежный остаток H6 (running-summary): carryover закрыт замером (D39.7/8), проза-суммарайзер закрыт (D39.69), нарратив-состояние = строка 80 (гейт пилота Ф2.5)
ПТ-9 Глоссарий автосборкой: модель переводит термины с контекстом/жанром (V4-п.4, H15) терминолог пака-20 (D39.4153), KWIC-контексты, подписной цикл. Вход владельца 02.08 (D39.89): банк = центральная ценность, арбитраж перевода термов должен быть консилиумом со скорами уверенности, но не ломать связность системы термов ⇒ качество МЕХАНИЗМА проверено полигоном: заход исполнен и ПРИНЯТ приёмкой №13 (research/24, D39.102): консилиум закрыт КЛАССОМ (равноправный совет · кросс-модельные веса · self-consistency · селекция не окупаются), остаток строки 5 (рецензент спорных кластеров) гейчен ре-пробой 74; статус ПТ-9 «построено» не меняется
ПТ-10 Веб-фетч для терминов без культурного контекста (V0-п.16, V4-п.4) гейт action-security = строка 70 (Ф3); до него — сид/бриф
ПТ-11 Голоса персонажей консистентны на книгу (V1-п.2; канон §1) 🔶 схема голосов построена (пак-19, D39.55/56); оси не подписаны — замер добора (строки 24 · 13б)

Деньги и телеметрия

ID Требование (источник) Статус Носитель / доказательство
ПТ-12 Низкий COGS: дешёвые модели + адресные дорогие вызовы (V0-п.3/12; канон §5) ~$0.85/ранобэ (D30.4); ре-проба исполнена и строка 74 закрыта (замер D39.86/91, закрытие D39.95); пере-калибровка цены — при следующем платном прогоне
ПТ-13 Телеметрия токенов/стоимости с первого вызова, БД (V0-п.25/31) SQLite request_log/леджер/смета; ⚠ леджер = нижняя граница (строка 78)
ПТ-14 Потолки бюджета и явное согласие на пере-оплату (канон §5) reserve/settle, потолки, projectRebill; щель терминолога = строка 38

Чувствительный контент

ID Требование (источник) Статус Носитель / доказательство
ПТ-15 18+/агрессивный контент при цензуре провайдеров, мультипровайдерность (V0-п.910) 🔶 канал B построен (пак-17), лейблы/ToS-мониторинг (строка 4); per-chunk L3-скрин = строка 8; explicit-редактор = строка 7

Управление прогоном (продукт)

ID Требование (источник) Статус Носитель / доказательство
ПТ-16 Абьюз/misuse-прескрин: дёшево, точно, до трат токенов, минимум false positive (V2-п.1, H8) строка 94; UI-контракт отказа — проект-решение D39.80 к Ф3-брифу (вывод оркестратора, не цитата брифа); статус отказа в API — открытый К-9 контракта 14 (D39.99)
ПТ-17 Лимит размера входа настройкой (V2-п.3, H7) строка 94
ПТ-18 Стоп и продолжение пайплайна; абьюзивный прогон НЕ продолжать (V2-п.2, H10) 🔶 graceful stop по сигналу (cmd/tmctl/main.go NotifyContext) + чекпойнты/redrive; продукт-кнопки и связка с прескрином = строка 94; API-форма в контракте 14 (D39.99: stop/resume; статус отказа прескрина — открытый К-9)
ПТ-19 Скорость: «очень быстрый перевод книги — киллерфича» (V4-п.1, H9); видимый прогресс/ETA — из Ф3-видения ридер-IDE (цветная полоса статуса), не из V4 🔶 волны параллельны по чанкам; замер скорости и ETA на целой книге = строка 54 (МАСШТАБ); пофазные счётчики draft/edit НА ГЛАВУ построены движком (D39.122 — строка 99 ЗАКРЫТА); ETA ПОКАЗЫВАТЬ — решение владельца 04.08 (D39.100/К-5), eta_seconds в спеке (0.2.0+, D39.115); оценка $/глава движком = строка 166

Фронт (Ф3)

ID Требование (источник) Статус Носитель / доказательство
ПТ-20 Ридер-IDE: VS Code-подобный фронт агентного перевода (V0-п.20/23) research/16 принят (D29); строки 6971; F3-brief — D29 п.3. Ф3 ОТКРЫТА 02.08 (D39.81): фронт-сессия живёт на моках (frontend/, S0S2 + контракт исполнены); контракт API ратифицирован (D39.99, живой 0.2.1); платформа построена до раннера P4: вход/кредиты/квоты (P0P3, D39.107/109/114) + River-очередь · транзиентные systemd-юниты · холд-до-спавна · реконсилятор (D39.123); фронт S3 — слой данных на 0.2.0 (D39.115); S4 гейчен «S3.5 фикс-паком оболочки» (D39.119 п.4)
ПТ-21 Параллельное чтение двух текстов с выравниванием по смыслам (V0-п.21); выравнивание грубое, по единицам экспорта — принято владельцем 02.08, спаны внутри текста не строятся 🔶 механизм готов: tmctl export --pairs выравнивает пары побайтно по единицам редактуры (internal/pipeline/export.go:89-93); якорь = edit-unit, НЕ чанк (переформулировано D39.84 — финальный текст существует только на уровне юнита, ~1.9 юнита/главу, местами глава = один блок; читалка обязана это выдерживать); UI-читалка = Ф3 (этап S6)
ПТ-22 Настройки от человека: 18+, жанр и т.п. (V0-п.22) 🔶 book.yaml (labels/жанр) данными; UI = Ф3
ПТ-23 Веб-ПЕРВЫЙ фронт; SEO/ранжирование Google — куки, страницы-сироты, актуальные алгоритмы (V5-п.2); продукт = SaaS, не локальное приложение (решение владельца 02.08, D39.81 — натив-прицел V0-п.26 СНЯТ этим решением, вернуть только новым словом владельца); SEO только под Google, Яндекс снят; рынок глобальный; десктоп = PWA первым шагом, Tauri по явным триггерам (решения владельца 02.08, D39.84) строка 71 (Ф3-бриф); SEO вошёл в стек-дизайн ДО выбора (D39.84, требование исполнено): двухконтурный деплой — SPA app.<домен> целиком под noindex + статический публичный контур ≤3 кликов от главной (лечение страниц-сирот), frontend/docs/STACK_DECISIONS.md §4; SSR-вопрос закрыт этим решением
ПТ-24 Цикл согласования глоссария с профпереводчиком/редактором (V0-п.23) 🔶 подписной цикл терминолога в бэкенде есть; UI = Ф3
ПТ-33 Интерфейс НЕ раскрывает конвейер: ни моделей, ни стадий, ни внутренней терминологии — пользователь видит «загрузка → разбор → перевод → подпись банка → финал → готово» (решение владельца 02.08) инвариант D39.81; контракт API v0 РАТИФИЦИРОВАН (D39.99, architecture/14-api-contract/): словарь десяти статусов принят владельцем 04.08 (D39.100/К-1); карта «вердикт → фраза» — приложение А компаньона, слова заполняет владелец (В-3); ревью-вопрос «сменится стадия — править ли фронт?» отвечен таблицей §5 компаньона
ПТ-34 Пользовательский перевод НИКОГДА не попадает на публично индексируемый URL — ни витрин примеров, ни «поделиться главой», ни публичных ссылок чтения (жёсткий продуктовый запрет, решение владельца 02.08; авторское право на исходники + политика Google по масштабируемому машин-контенту действуют на весь домен) инвариант D39.84; носители: двухконтурный деплой frontend/docs/STACK_DECISIONS.md §4 (SPA под X-Robots-Tag: noindex на каждом HTML-ответе; публичный контур без контента переводов) + контракт 14 (architecture/14-api-contract/, D39.99) + платформенный бэклог П-1
ПТ-35 Лимиты «как в Claude Code» (решение владельца 04.08, D39.100): страница лимитов/использования в настройках (статус, НЕ суммы — запрет денег на экране в силе); стоп по потолку = статус paused + оповещение «перевод остановлен: лимиты исчерпаны» 🔶 контракт К-8 закрыт, спека несёт paused/paused_reason (0.2.0+, D39.115); ручки /v0 — платформа-раннер P4 (D39.123); остаток: страница лимитов на фронте (S4+) · точное продуктовое слово — В-3 на владельце · К-13 (paused_reason не различает свой потолок и нет кредита, D39.115 п.6б)
ПТ-36 Интерфейс МУЛЬТИЯЗЫЧНЫЙ, русский не хардкодится в разметке (слово владельца 10.08; язык интерфейса — отдельная ось от языков перевода). ⚠ До 10.08 требование в реестре отсутствовало — пропуск поймал владелец (D39.127 п.2г) 🔶 ПОСТРОЕНО S3.7 (принят D39.129): каталог frontend/src/i18n/ru.ts (157 ключей) · механизм @internationalized/string · ESLint-гейт «текст местом» · стор языка с персистом · <html lang> следует выбору; содержимое — только ru; продуктовый список языков — 🔒 владелец (В-9 зоны фронта)

Качество процесса и самоулучшение

ID Требование (источник) Статус Носитель / доказательство
ПТ-25 Валидация влияния каждого решения на качество, вкл. пагубное (V1-п.3, V3-п.1; Выводы) методология полигона (exp0121 приняты, 22/23 живые; labels, судья, пре-рег); держится нормами D39.46/47
ПТ-25а Онлайн- и оффлайн-замер КАЧЕСТВА прогона (V0-п.31, H5 in-loop signal) 🔶 детерминированный $0-слой в петле построен (гейты/чекеры, телеметрия качества — слой 5 в 09); семантический in-loop сигнал = Ф2 (судья, строки 33 · 13а · 90-метрики)
ПТ-26 Самоулучшение пайплайна по данным больших прогонов (V3-п.2, H16) строка 90 (дизайн петли по данным судьи — при пилот-препе Ф2.5); AB-способность бэкенда — дальний хвост V1 (двойное хеджирование владельца), тем же дизайном
ПТ-27 Без-LLM анализ книги в помощь переводу/валидации (V1-п.1/п.9) майнер, $0-гейты/чекеры, экраны, KWIC — весь детерминированный слой
ПТ-28 Фронтир-модель внутри пайплайна / «судья над судьёй» (V3-п.3) отменено владельцем (V4-п.2)
ПТ-29 Полный проход книги наперёд перед переводом (V0-п.33) отклонено брифом V4-п.3 (вопросительная форма, отдельной ратификации в D-логе нет); контекст-вперёд несут сид/банк/бриф
ПТ-30 Язык промптов = язык цели/оригинала (V4-п.5) ru/en-срез закрыт отрицательно ЗАМЕРОМ (D39.61; там же оговорка «не закрыт окончательно», N=12); реопен только с новой парой по данным
ПТ-31 Локальная модель ради экономии (V0-п.6) 🔶 стенд есть (ollama/llama.cpp, память textmachine-local-stand); в пайплайне не задействована = строка 90 (llama-server)
ПТ-32 Рынок/юридика: анализ рынка, право на перевод и распространение (V0-п.29, преамбула) 🔶 ToS-мониторинг (строка 4, D39.57); юр-пакет к проду = строка 67; рыночный анализ — ресёрчи 04.07