Skip to content

Latest commit

 

History

History
290 lines (192 loc) · 56.5 KB

PRODUCT_SPEC.md

File metadata and controls

290 lines (192 loc) · 56.5 KB

Uberlang техническое задание для первой полезной версии

Основной сценарий — 23 октября 2026

ADR-025: этимологическое исследование становится входом и сквозным сценарием. Слово и язык → выбор подтверждённой истории → исследование узлов → сохранение открытия → продолжение после перезагрузки. Текст и Anki ведут в тот же экран. Грамматика и значения остаются вспомогательными. Сохраняются ветви, выбранный узел, масштаб, прокрутка, заметка и личные отметки. JSON-бэкап и восстановление не зависят от аккаунта. Сравнение показывает общие формы и их источники, без автоматического вывода об общем предке.

ADR-026: CI остаётся независимым, из Vercel/Pages убраны повторные тесты и проверки типов. Перед выпуском выполняются локальные проверки; публикация не ожидает завершения полного GitHub CI.

Текущее позиционирование и границы языковых режимов: MARKETING_POSITIONING. Сам продукт исследует связи между языками; начальный поиск и живая грамматика notebook остаются английскими. Исторические планы ниже не являются перечнем уже доступных функций.

Уточнение владельца от 18 октября 2026 года: рабочее имя продукта — Uberlang, строго с таким регистром. Аудитория — самостоятельно изучающие язык; основной мотив — живой интерес и удовольствие от исследования этимологии и лингвистики, с цельной эстетикой дерева. Актуальный бренд и продуктовый приоритет уточняют ранний фокус этого ТЗ на грамматике. Исторические сведения ниже сохраняются; видимое название интерфейса и новых экспортов — Uberlang, технические идентификаторы остаются Lingua.

Anki → Uberlang: локальное исследование своей колоды (19 октября 2026)

ANKI_IMPORT_MVP задаёт обратное направление: пользовательский .apkg либо UTF-8 TXT/TSV → локальный предпросмотр → mapping по типу заметки → явный язык и выбор записей → постоянная библиотека этого браузера. Иерархия колод, теги, GUID и все текстовые поля сохраняются. Дубли пропускаются по умолчанию; обновление существующих записей требует явного выбора режима.

Главная цель — открыть один пример в notebook для английской грамматики либо явно исследовать слово через существующий API истории для поддерживаемого языка. Загрузка и сохранение не отправляют колоду на сервер. Нет расписания повторений, переноса медиа/шаблонов или обещания полной двусторонней синхронизации.

Anki: локальная карточка из контекста (кандидат 19 октября 2026)

ANKI_EXPORT_MVP: компактный диалог из выбранного фрагмента или сохранённой заметки, редактирование, предпросмотр, язык/значение, колода, теги и опциональная этимология. UTF-8 TXT импортируется в Anki Desktop вручную; проверка повторного экспорта не выдаётся за проверку личной коллекции. Источники и точный контекст сохраняются. Этот кандидат основан прямо на опубликованном main, без неопубликованного declutter, AnkiConnect, localhost-разрешений и изменений CSP. Полный opt-in адаптер существует в отдельной ветке и проверен только на моках; совместимость реального origin не заявлена.

Рабочая версия 0.4 от 13 октября 2026 года. Сейчас Lingua — концепт и личное бесплатное демо: чтение иностранного текста, грамматика и история слов. Главный сценарий — разобрать предложение или выбранный фрагмент, понять связи слов и грамматические признаки, затем исследовать происхождение выбранного слова в красивом 2D-дереве. Production, платные тарифы, публичный desktop-релиз и мобильное приложение относятся к будущему этапу после того, как автору понравится готовый сценарий и появится бюджет.

Дополнение от 11 октября: архитектура редизайн и деплой — рекомендуемые границы UI и логики, Material UI, Cloudflare, минимальный backend и CI/CD. Это предложения для реализации после проверки движка, не действующие настройки production.

Обновление 13 октября: актуальные сценарии деревьев и анализа, ревью, ADR-011. В концепте уже есть отдельное раскрытие ветвей, фокус на линии предков, масштабирование, синтаксические дуги и Motion с reduced motion. Произвольный текст всё ещё не имеет живого грамматического анализа.

Решения владельца и рабочие предположения

Вопрос Решение или статус
Проект TypeScript-версия local TypeScript checkout, GitHub Godsdar/Uberlang. Старую JavaScript-версию не развиваем
Имя Рабочее имя — Uberlang (только U прописная, l строчная), последнее указание владельца от 18 октября 2026 года. Технические идентификаторы кода остаются Lingua; репозиторий — Godsdar/Uberlang; видимое название интерфейса и новых экспортов — Uberlang
Первая аудитория Автор, затем похожие пользователи
Главная задача Разбор смысла и грамматики предложения
Приоритет грамматики Подробные связи слов и грамматические признаки
Интерфейс Англоязычный
Первый язык синтаксического пилота Предлагается английский. Английский интерфейс сам по себе не определяет язык анализируемого текста
Дерево 2D, выразительное, умеренно плотное: предки и похожие слова, с раскрытием деталей
Визуальные ориентиры Минимализм Zen Notes и Monkeytype, спокойное пространство заметок/чата; Tokyo Night и выбираемые темы. Для формы дерева — blue-tree со сценой Пиррона и информационные деревья
Движок грамматики Сначала сравнить локальный и облачный варианты; конкретный провайдер пока не выбран
Бюджет сейчас $0 на хостинг и платные API; демо не требует платной подписки, покупки домена или услуги с возможным автоматическим списанием
Публикация Бесплатное веб-демо Vercel и зеркало GitHub Pages; production и публичные desktop/mobile-релизы позже

Предлагаемые числа и сроки ниже — ориентиры прототипа. Их уточняем после первых измерений. Этот черновик не заменяет принятые ADR и не означает, что перечисленные новые функции уже реализованы.

Что есть сейчас

Общее ядро src/core/ используется Electron, веб-приложением и Chrome MV3. UI написан на React/MUI, дерево — React SVG с d3-hierarchy и motion. Языки текущего публичного контракта: EN, RU, ES, FR. Словарь — English Wiktionary; переводческие провайдеры подключаются через providers.ts. Есть компоненты локальной коллекции и шаринга.

Исходный аудит 11 октября зафиксировал следующие ограничения (изменения 13 октября — в ревью):

  • analyze.ts берёт первые восемь уникальных слов. Повторения, позиции и пунктуация не сохраняются. Это словарный обзор, а не разбор синтаксиса предложения.
  • Часть речи и первый перевод словарной статьи не обязательно соответствуют употреблению в предложении. Переводы сейчас не привязаны к выбранному значению.
  • Этимология хранится линейными цепочками. buildEtymologyTree соединяет две цепочки — слово и перевод; боковые родственники требуют новой модели данных.
  • Парсер ветвящегося ety-tree складывает узлы в плоский список. Соседство в таком списке нельзя считать доказательством прямого происхождения.
  • Анализ и рендер используют разные правила поиска общего предка. Их нужно согласовать; одна доступная цепочка также не должна считаться общим корнем двух слов.
  • В сборке дерева теряется поле типа связи. Заимствование и наследование сейчас не различаются в геометрии.
  • Ошибку загрузки, неполноту парсинга и отсутствие словарных данных нужно показывать отдельными состояниями.

Локальная копия на коммите 29635e9 не имеет команды npm test; прочитанный GitHub main уже содержит node --test src/core/etymologyTree.test.ts. GitHub AGENTS всё ещё сообщает об отсутствии раннера. Перед кодированием выбрать актуальный базовый коммит и согласовать инструкции с фактическими тестами. Не перезаписывать локальную копию автоматически.

Старый docs/ETYMOLOGY_TREE.md ограничивает дерево двумя листьями; новый запрос расширяет объём. ADR-006 задаёт веб первым, локальное хранение и отсутствие ежедневного пазла на старте. Некоторые статусы DESIGN/PIPELINE устарели относительно README. Скриншот в README показывает старый UI и не служит образцом текущего рендера.

Первый законченный сценарий

  1. Пользователь выбирает язык и вводит одно предложение. В первом пилоте предлагаемый предел — 50 токенов или 500 символов; превышение объясняется, текст не обрезается молча.
  2. Явное действие Analyze sentence запускает выбранный грамматический движок. Ввод не должен автоматически отправляться новому облачному сервису во время набора.
  3. Первый результат — понятное объяснение смысла и структуры на английском. Перевод раскрывается по желанию, отдельно от объяснения и грамматики. Ошибка переводчика не скрывает доступный грамматический результат.
  4. В исходном тексте сохраняются все слова и пунктуация. Клик по слову выделяет его в предложении и показывает карточку.
  5. Карточка содержит исходную форму, лемму, часть речи в контексте, доступные грамматические признаки, главное слово и тип зависимости. Краткое объяснение термина доступно по запросу.
  6. Вид Sentence structure показывает зависимости слов. Переключение на Word origins открывает этимологию выбранной леммы и подходящего словарного значения.
  7. В этимологическом дереве видна основная линия происхождения и умеренное число подтверждённых родственников. Другие ветви раскрываются по действию пользователя.
  8. Пользователь сохраняет интересное открытие локально или экспортирует отчёт с контекстом, объяснением, грамматикой и деревом с источниками. Отправка отчёта другому человеку всегда ручная.

На первом экране не нужно одновременно показывать подробный синтаксис, все словарные значения и всю этимологическую семью. Полный разбор должен быть доступен без перегрузки начального вида.

Короткие фразы и длинный текст

Главный сценарий — небольшая фраза, которой пользователь хочет разобраться. Для длинного текста приложение становится пространством чтения: разбор запускается для выбранного слова или выражения, а не сразу для каждого слова во всём документе. Синтаксис требует контекста, поэтому движку передаётся выбранный фрагмент вместе с содержащим его предложением; границы отправляемого контекста видны до облачного запроса. Этимология строится для выбранной леммы и значения.

Сохранять исходный документ и диапазоны каждого выбранного вхождения. Повтор одного слова в другом месте — другая заметка. Выделение выражения может связывать несколько токенов, но выражению не приписывается единая история слова. Для идиомы объяснение значения и грамматика показываются отдельно; история выражения появляется лишь при наличии источника.

Предлагаемый предел первого живого разбора — одно предложение до 50 токенов / 500 символов. При превышении предложить сузить фрагмент; не обрезать ввод и не отправлять весь документ молча. В концепте текст до 6000 UTF-16 единиц предназначен для проверки чтения и выделения; это предел макета, а не обещание parser. Переполненный ввод должен иметь видимый статус до подключения настоящего анализа.

Заметки и наглядный экспорт

В заметке сохранять выбранный фрагмент, точный контекст, ID исходного документа, диапазон UTF-16 [start, end), область разбора (слово / выражение / предложение), объяснение и его происхождение, перевод с указанием контекста, признаки и зависимости, выбранное значение и доступные источники этимологии. Изменение ввода не должно менять ранее сохранённую заметку. Старый результат после редактирования нельзя сохранить как анализ нового текста.

Первый набор форматов: Markdown для личных заметок, JSON с версией схемы для повторной обработки, HTML report для наглядного просмотра и печати. HTML содержит статическое дерево с подписями, таблицу зависимостей и ссылки на источники; работает без сервера и ключей. Для печати раскрываются существенные данные. PDF через браузерную печать и PNG отдельного дерева — последующий этап. Экспортируемый текст экранируется; пользовательский ввод не исполняется как HTML или скрипт.

Частичный результат экспортируется со статусом недоступного слоя. Реконструкции, сокращённые исторические переходы, авторство Wiktionary и применимая лицензия сохраняются. Экспорт не должен выглядеть более достоверным, чем исходный анализ.

Что проверяет текущий интерактивный концепт

Два варианта рабочего пространства: Reading с чтением и раскрываемыми слоями и Study с разделением ввода и результата. В обоих доступны Tokyo Night / Light / Graphite, выбор вхождения слова, выделение выражения, сохранение заметок на время сеанса, копирование Markdown / JSON / HTML и предварительный просмотр HTML-отчёта. Три подготовленных предложения проверяют простой синтаксис, present perfect progressive и relative clause; две сверенные семьи — water и mother.

Новый произвольный текст остаётся выделяемым, но не получает выдуманных переводов, зависимостей и предков. Концепт не использует живой parser или API-переводчик. Заметки макета не переживают перезагрузку; надёжное локальное хранение относится к реализации. В репозиторном web-концепте доступны скачивание Markdown / JSON / HTML и предварительный просмотр HTML. Есть раскрытие ветвей, масштаб/reset, прокрутка графов, синтаксические дуги и базовые анимации. Drag/pinch pan/zoom, интеграция экспорта в Electron/extension, PDF и постоянные заметки пока не реализованы.

Перевод семантика и синтаксис

Слой Что отвечает Требование первой версии
Перевод Как передать предложение на другом языке Отдельный результат с названием провайдера, ошибкой и доступными альтернативами
Семантика Что означает слово именно здесь Выбранное значение, краткая глосса, различение омонимов; ручной выбор при неоднозначности
Морфология В какой грамматической форме употреблено слово Лемма, часть речи, доступные число, лицо, время, наклонение и другие признаки конкретного языка
Синтаксис От какого слова зависит это слово и какую функцию выполняет Главное слово, тип связи, выделение связи в тексте/схеме
Этимология Откуда исторически пришла форма Исторические отношения с источниками, родственники и границы достоверности

Поле, которого движок не определил, показывается как отсутствующее; приложение не заполняет его догадкой. Морфологическая форма и синтаксическая функция не смешиваются: например, словарный POS не заменяет роль слова в предложении.

Предлагаем использовать универсальные метки частей речи и зависимостей внутри данных, а в UI дать английские подписи и подсказки: Part of speech, Lemma, Head, Relation, Features. Конкретную схему меток согласовать с выбранным parser.

Сгенерированное объяснение, если оно появится, маркируется и хранится отдельно от результатов parser и словаря. Оно не создаёт этимологические связи. Не обещаем понимание сарказма, всех идиом, скрытых намерений или единственный бесспорный разбор любой фразы.

Сравнение движков до выбора

Вариант Что проверяем Последствия
Локальный специализированный parser Качество английских лемм, морфологии и зависимостей; размер модели, память, скорость, лицензия Подходит для приватного Electron; web и extension потребуют подходящей браузерной модели или другой реализации адаптера
Облачный специализированный parser Те же признаки и зависимости, поддержка языка, лимиты, стоимость, условия обработки текста Потребуется отправка текста и сетевой адаптер; возможный backend — пересмотр ADR-009
Облачная языковая модель Структурированный вывод, правильность связей, повторяемость, ошибки на неоднозначных фразах Удобное объяснение не доказывает точность грамматики; ключи и расходы защищаются на сервере

Сравнить два реализуемых кандидата на одном наборе 20 английских предложений: простые, вопросы, отрицания, сложные времена, придаточные, неоднозначность, повтор слова с разной ролью, апострофы и пунктуация. Фиксировать версии моделей, качество каждого слоя, холодный запуск, повторный запуск, память, задержку и стоимость. Выбрать вариант по полезности реальных результатов и ограничениям автора; не назначать заранее неподтверждённую точность «95%».

До выбора облака остаются открыты бюджет и допустимость отправки текста. Сравнение вариантов не разрешает отправлять личные предложения внешнему сервису. Для технического сравнения использовать подготовленные неперсональные примеры, соблюдая явный режим запуска.

Красивое 2D дерево

Содержание веток

Исторические предки и потомки образуют основной рисунок. Родственные слова в других языках раскрываются через подтверждённого общего предка. Слова с похожим написанием, звучанием или значением показываются в отдельной группе Similar words с пояснением вида сходства. Они не подключаются к историческому стволу без источника о родстве.

Перевод находится рядом с выбранным значением. При сравнении двух переводных эквивалентов приложение отдельно проверяет историческую связь. Совпадающее значение не создаёт общего предка.

Доступные отношения: наследование, заимствование, словообразование, компонент сложного слова, родство без полного пути и неклассифицированная связь. Достоверность утверждения хранится отдельно от типа отношения. Знак * означает реконструированную форму, а не автоматически сомнительное родство.

Корень — самый древний доступный подтверждённый этимон. Не каждое слово обязано вести к праиндоевропейскому языку. Отсутствующий промежуток обозначается разрывом или пояснением, а не выдуманными формами.

Композиция и взаимодействие

  • Корень внизу, современные формы вверху. Подпись направления истории; вертикальный шаг означает порядок этапов, а не точную шкалу лет.
  • Плавный ствол и непрерывные сужающиеся кривые, мягкая асимметрия и округлая крона. Геометрия воспроизводима при одинаковом графе.
  • В начале видна главная линия и ориентировочно 3–6 родственников, если они подтверждены. Это ограничение обзора, а не требование найти шесть для каждого слова.
  • Остальные формы свёрнуты. Надпись Show N more используется только при известном числе; иначе Load relatives.
  • Выбор узла подсвечивает путь и открывает карточку формы, языка, значения, отношения и источника.
  • Доступны pan/zoom, Fit tree, Focus selected, сворачивание ветвей и текстовое представление истории.
  • Подписи не уменьшаются до нечитаемого размера ради помещения всей кроны. При большом дереве часть подписей скрывается до приближения/выбора, а карточка остаётся читаемой.
  • Декоративная листва не имеет смысловых подписей и интерактивных точек. Её отключение не меняет данные.

Новое направление владельца — минимализм Zen Notes/Monkeytype с выбираемыми темами. Первый прототип — Tokyo Night, дополнительная светлая тема и нейтральная тёмная. Палитра выбирается через токены; роли «выбранное слово», «общий предок», «заимствование» сохраняются во всех темах, но конкретные цвета меняются. Тип связи выражается также линией и текстом. Реконструкции — курсив со звёздочкой, диакритика и индексы не обрезаются. Atlas из прежнего ADR-008 остаётся возможной темой, а не обязательным стилем всего приложения. Перед реализацией оформить новое ADR с уточнением старого решения.

Параметры рабочего рендера: межуровневый шаг 100–140 CSS px, зазор подписей от 16 px, читаемые карточки/подписи около 14–16 CSS px в рабочем масштабе. Компактный концепт проверяет композицию; параметры рабочего масштаба уточняются на контрольных деревьях.

Плавные анимации — отдельный этап

Требование владельца: плавные выразительные анимации выбора, переходов между слоями и раскрытия дерева. На первом концепте достаточно спокойной обратной связи; полировку делать после согласования чтения, плотности и модели данных.

При раскрытии ветви узлы с теми же ID плавно перемещаются, существующие связи перестраиваются непрерывно; контекст выбранного слова остаётся на месте. Подсветка пути и смена карточки занимают ориентировочно 160–280 ms, перестройка ветви 300–500 ms. При сложном каскаде общая длительность до 1200 ms; пользователь может сразу выбрать другой узел, предыдущая анимация прерывается корректно. Это ориентиры, а не обязательная задержка каждой операции.

Без бесконечно качающихся веток, печати объяснений по букве и ожидания завершения декора перед кликом. Уважать prefers-reduced-motion: сразу показывать конечную геометрию и сохранять понятное выделение. Тестировать отсутствие наложений подписей во время переходов, стабильность фокуса и отзывчивость на согласованном Mac. Не маскировать анимацией сетевую загрузку или отсутствующий разбор.

Референсы

Источник Что взять для Lingua
Собственный blue-tree/src/tree.js, сцена Пиррона в src/main.js Округлую крону, плавный изгиб и сужение ветвей. Два дерева сцены используют одну геометрию с разным размещением и палитрой. Не переносить процедурное число детей: содержательные ветки определяются графом слов
Tree of tree Ближайший тематический ориентир: рост снизу вверх, исследование пути, подробности и источники узлов. Лингвистические утверждения из проекта не копировать без собственной проверки
etytree Различение предков, когнатов и производных форм. Исторический проект; наличие репозитория не гарантирует актуальность его сервисов
D3 Collapsible tree Постепенное раскрытие дерева и сохранение контекста
JSFiddle с раскрываемым деревом Эксперимент с разведением ветвей и кривыми; не основной радиальный вид продукта

Референсы просмотрены по исходникам и описаниям; визуальную композицию Lingua выбираем на собственных трёх 2D-прототипах. Перед переносом чужого кода/ассетов проверяем конкретную лицензию. Из blue-tree берём форму, не добавляем Three.js в этимологический рендер.

Архитектура и данные

Создать отдельный контракт SentenceAnalysis, не превращая словарный WordAnalysis в синтаксический результат. Минимальные поля: исходный текст, язык, предложения, все токены с диапазонами, леммы, POS, морфологические признаки, head/deprel, версия движка, статусы и предупреждения. Диапазоны должны однозначно соответствовать JS-строке, включая Unicode; соглашение об индексах документируется. Повторяющиеся слова имеют разные ID, словарные запросы можно дедуплицировать отдельно.

Этимологию хранить графом nodes + edges. Узел имеет стабильный ID, язык, форму, словарную статью/этимологический раздел, статус реконструкции и доступные значения. Ребро имеет тип исторического отношения, источник и статус достоверности. Омонимы разных происхождений не сливаются только по написанию.

Дерево — проекция графа для выбранного слова. Несколько родителей и сложные слова не превращаются молча в одну историческую цепочку: дополнительные связи раскрываются отдельно. Исторические данные, переводные отношения, семантическое сходство и синтаксические зависимости — отдельные наборы связей.

Сохранить браузеросовместимое ядро. Локальный parser, если ему нужен процесс или нативная модель, подключается через Electron-адаптер, а не импортируется в src/core/. Для web/extension способность анализировать предложение явно обозначается, если такой движок недоступен.

Графика остаётся d3-hierarchy + React SVG + motion. В документах упомянуты d3-zoom/modern-screenshot, но их наличие в установленном стеке надо проверять перед использованием. Нет причины менять весь графический движок ради новой кроны.

На первом этапе подготовить три сверенных этимологических графа, затем набор 12 слов с разными случаями. Прототип визуально может использовать тестовую структуру, но вымышленный граф не публикуется как реальная этимология. Живые боковые ветви подключать по одному проверенному формату Wiktionary с пакетными запросами, ограничением глубины, кэшем и обработкой 429.

Состояния приватность и хранение

Различать загрузку, частичный результат, неподдержанный язык/формат, отсутствие статьи, недостаток данных, сетевую ошибку и ошибку движка. Формулировка No shared ancestor found in available data не означает доказанное отсутствие родства. Повтор запроса не удаляет уже доступный результат.

Устаревший ответ предыдущего предложения не заменяет текущий анализ. Пустой ввод не создаёт запросы. Установить явные таймауты; сбой одного слоя не блокирует остальные.

Коллекции остаются локальными, без аккаунта и телеметрии. Для первого релиза не сохранять введённые предложения автоматически; сохранение примера — явное действие, удаление доступно. Словарные и переводческие сетевые запросы объясняются пользователю; локальная коллекция не означает полностью офлайн-приложение.

Каждое историческое утверждение доступно через источник; экспорт содержит атрибуцию Wiktionary и применимую CC BY-SA. Не скрейпить Etymonline. API-ключи не попадают в web/extension bundle, localStorage или синхронизируемый публичный файл. Новый host требует обновления CSP/manifest. Облачная грамматика или backend меняют текущие ограничения приватности и ADR-009: это отдельное решение после сравнения вариантов.

Приёмка первой версии

Область Проверяемый результат
Предложение Токены сохраняют порядок, повторы, пунктуацию и диапазоны; выбор подсвечивает правильный фрагмент, включая Unicode
Грамматика На 20 размеченных примерах отдельно оцениваются lemma, POS, признаки и зависимости; обнаруженные расхождения записаны, критические для сценария исправлены до пилота
Структура Нет зависимостей на несуществующие ID; соглашение о корне/пунктуации документировано; пользователь видит head, relation и признаки выбранного слова
Значение Неоднозначное слово не связывается молча с первым словарным переводом; выбранное значение и источник видны
История На 12 сверенных словах все исторические рёбра имеют источники; минимум три примера действительно ветвятся. Декор и похожее написание не создают родство
Согласованность Карточка, статус общего предка и граф используют одну модель; одна доступная цепочка не называется общим предком пары
Читаемость Проверить 12, 40 и 80 загруженных узлов. Большие наборы свёрнуты. На 1280×800 подписи видимого обзора не перекрывают друг друга; на узкой ширине доступны карточка и текстовая история
Управление Клавиатурный выбор и раскрытие, видимый фокус, pan/zoom/reset, reduced-motion; типы связи читаются без цвета
Устойчивость 429, timeout, offline и ошибочный результат движка дают ясный статус; повтор и смена ввода не показывают чужой устаревший результат
Длинный текст Выбранные вхождения и выражения сохраняют точные диапазоны и контекст; весь документ не отправляется автоматически; после редактирования старый результат не становится новым
Экспорт Markdown / JSON / HTML содержат выбранный фрагмент и контекст, доступную грамматику, источники и статусы; статическое дерево читаемо; повторные слова и Unicode не меняют координаты. Печать, PNG и пермалинк проверяются при реализации соответствующего этапа
Анимации Раскрытие и смена выбора сохраняют контекст, допускают прерывание; reduced-motion даёт тот же результат без движения
Сборки После изменения ядра проходят typecheck и desktop/web/extension builds. Запускаются актуальные тесты дерева и содержательные проверки нового контракта

Целевой ориентир локальной раскладки — до 200 ms для небольшого видимого обзора после получения данных на согласованном Mac. Измерять отдельно от сети и parser. Не обещать одинаковую задержку на всех устройствах.

План реализации небольшими задачами

Для текущего концепта сначала сделать минималистичный интерактивный прототип с темами и проверенными демонстрационными разборами. Демо-данные явно обозначены. Затем подключать доступные бесплатные источники и исследовать локальный parser. Отсутствующий живой синтаксис не выдавать за реализованный. Платный облачный benchmark и backend не являются условиями показа концепта; их сравнение пока может быть документальным.

Этап Результат Условие перехода
0. Зафиксировать базу Актуальная TypeScript-копия, согласованные docs/тесты, личные сценарии Известно, от какого коммита работаем; английский язык пилота подтверждён
1. Сравнить грамматику 20 примеров, два кандидата, таблица качества/скорости/размера/стоимости Выбран engine и согласованы отправка текста/бюджет при необходимости
2. Прототип предложения UI на проверенных данных: токены, связи, признаки, выбор слова Автор может разобрать свою фразу и понимает отображаемые связи
3. Выбрать 2D композицию Три версии на простом, богатом и неполном графах Выбраны силуэт, плотность, подписи и поведение раскрытия
4. Подключить данные Новый контракт, адаптер engine, граф происхождения со стабильными ID и источниками Проверки достоверности и состояний проходят
5. Довести целый сценарий Предложение → грамматика → лемма/значение → дерево → сохранение/экспорт Приёмка и три сборки проходят; готов личный ежедневный инструмент
6. Пилот 8–12 добровольцев на 10–14 дней Есть конкретные результаты и следующий приоритет

Этапы 1–3 дают ранние проверяемые решения. Не строить сразу полный многоязычный parser, глобальную сеть Wiktionary, синхронизацию, ежедневную игру и все магазины расширений. Оценку календаря дать после выбора движка и первой вертикальной реализации; сейчас точный срок был бы гаданием.

Для задачи агенту давать один результат, примеры входа/выхода, ограничения и критерий готовности. Например: «Сохрани повторяющиеся токены и диапазоны; предложение I know that you know. должно иметь два отдельных know; этимологический поиск дедуплицируй отдельно». Это проще проверить, чем поручение «сделай всю лингвистику».

Первые реальные пользователи

Сейчас достаточно личного использования и бесплатного веб-демо. Electron можно запускать локально для разработки, а его публичный выпуск, подпись, магазины и мобильное приложение отложены. План внешнего пилота ниже применяется после того, как автору понравится концепт. Веб-версия не должна обещать отсутствующую грамматику.

После личной проверки пригласить 8–12 добровольцев с похожими интересами. Дать три задания: разобрать пример, объяснить выбранную зависимость, открыть происхождение собственного слова. Повторное использование проверить через добровольный опрос через неделю. Не добавлять телеметрию ради измерений.

Предложенные пороги для группы из десяти: восемь получают результат без помощи; семь правильно читают одну грамматическую связь и направление этимологической истории; шесть описывают полезное открытие на своём тексте; четверо сообщают о самостоятельном возврате. Самоотчёт не является точной D7-аналитикой, маленький пилот не доказывает массовый спрос.

До широкого запуска: рабочая ссылка/конкретный desktop release, три проверенных примера, скриншот фактического UI, краткая инструкция, форма добровольного отзыва и понятное удаление локальных данных. Неподписанный Electron создаёт трение установки; не делать обход системной защиты обязательным первым шагом для всей аудитории.

Затем один тематический канал с полезным проверенным примером и просьбой о конкретной обратной связи. Массовый SEO, Product Hunt, ежедневный контент и платные сертификаты обсуждать после результата пилота. Публикации и сообщения людям не входят в создание этого ТЗ.

Что уточнить в следующем обсуждении

  1. Английский — только язык UI или также первый язык разбора? Какие 2–3 предложения автор разбирает в реальной жизни?
  2. Какой целевой язык перевода оставить по умолчанию? Нужны ли английские определения вместо перевода при EN-тексте?
  3. Для бесплатного прототипа: допустимый размер локальной модели и какие разборы нужны первыми? Бюджет облака сейчас нулевой.
  4. Какие части бесплатного веб-демо должны работать с живыми данными, а какие сначала показать на явно отмеченных примерах?
  5. Какой из трёх 2D-прототипов ближе к желаемому виду деревьев Пиррона?

Основания для решений

Внутренние источники: AGENTS.md, README.md, docs/DESIGN.md, POSITIONING.md, PIPELINE.md, GRAPHICS.md, ETYMOLOGY_TREE.md, ADR-003/006/007/008/009; src/shared/types.ts, src/core/analyze.ts, wiktionary.ts, providers.ts, etymologyTree.ts, components/EtymologyTree.tsx. Локальный blue-tree: src/tree.js, src/main.js. GitHub проверен по репозиторию и файлам package/AGENTS/tree builder; это не утверждение о полном совпадении всех файлов с локальной копией.

ТЗ составлено на основании чтения кода и документов с участием трёх агентов: архитектура и лингвистика, 2D-дерево, первые пользователи. 13 октября исправлено превращение ветвящегося ety-tree в ложную цепочку. Концепт перенесён в web/concept/ и собирается Vite; TypeScript-модули графов и выбора вхождений проверяются тестами. Качество живых ответов и NLP-моделей ещё требует отдельной оценки.

Backend foundation — 2026-10-13

ADR-012 authorizes a Node.js 24 / Fastify backend with prepared analysis, optional translation and request resilience. See BACKEND_ARCHITECTURE.md and BACKEND_RUNBOOK.md. This supersedes earlier no-backend planning, but does not activate paid hosting, public browser access, live grammar or account synchronization.

Live English grammar alpha — 2026-10-16

ADR-013 adds explicit sentence-level spaCy parsing via Node/Python Vercel functions. It supplies statistical morphology and dependencies; semantic explanations and word families retain their independent curated/unavailable status. The first-user pilot must evaluate correctness/usefulness with actual reader sentences before broader promotion. No paid API, subscription, persistence or account system added.