План
Что сделано и что впереди: рубежи, блоки и все задачи с размером, зависимостями и состоянием.
Собрано из docs/ROADMAP.md (коммит 1a1038b), 30 сентября 2026. Здесь — что и в каком состоянии; доводы, редакции и замеры по каждой задаче — в источнике.
- 4.0-port · закрытРазделение102 из 102
- 4.0-beta · сейчасОткрытая бета58 из 63
- 4.0 Stable · впередиВыпуск 4.00 из 16
- 4.1+ · впередиПозже0 из 2
- 5.0 · впередиПлатформа0 из 44
- RinaNeuro · впередиRinaNeuro0 из 46
Размер: S — до дня, M — несколько дней, L — неделя и больше, XL — месяц и больше или исследование. Нажмите на задачу, чтобы прочитать, что она такое.
4.0-port · закрытРазделение и редизайн
102 из 102 задач сделано
Цель: ядро на Python, оболочка и системный слой на C# (WPF), между ними протокол с запасом под RinaNeuro. Оболочка пишется с нуля — значит и внешний вид проектируется заново, а не переносится.
Подробнее о рубеже
Правило рубежа: ни одной новой пользовательской возможности. Вид, компоновка и навигация меняются свободно; множество того, что пользователь может сделать, — заморожено. Новые функции ждут рубежа 4.0-beta, описанного ниже; два исключения (B08 и блок N) названы в разделе «Рубежи 4.0».
Почему редизайн именно здесь. Оболочка переписывается на другом языке в любом случае. Портировать нынешний вид из PySide6 в WPF пиксель в пиксель — это работа по воспроизведению того, что всё равно собирались менять: QPainter, QSS, анимации и токены не переносятся, переносится только замысел. В 4.0.0 редизайн стоит почти ноль сверху; в любой следующей версии — переписывания уже написанной оболочки.
Побочный эффект, полезный для дисциплины. У 4.0.0 появляется видимый результат. Версия перестаёт быть «месяцы работы, после которых пользователь не видит ничего» — а это главный риск срыва feature freeze.
Блок A — Страховка перед операцией
Без этого блока разделение идёт вслепую: расхождения в поведении обнаружатся месяцы спустя, когда причину уже не найти.
4.0-A01Инвентаризация поведения 3.1.0сделано 1 сентября 2026
Результат: INVENTORY-3.1.0.md. Все неочевидные ветки проверены запуском: одно утверждение первой редакции оказалось неверным именно там, где его читали глазами. Полный список того, что умеет 3.0.0: каждое намерение, каждый вариант формулировки, каждый побочный эффект, каждое сообщение пользователю. Включая неочевидное: что происходит при пустом вводе, при неоднозначном имени программы, при отказе от подтверждения. Готово когда: документ покрывает все ветки, и ты не можешь вспомнить возможность, которой в нём нет.
4.0-A02Набор golden utterancesсделано 1 сентября 2026
Результат: golden/utterances.json — 112 случаев, и прогонщик tools/golden_runner.py. Зелёный на 3.1.0.
4.0-A03Прогонщик тестовсделано 2 сентября 2026
tools/golden_runner.py. Один вызов, отчёт «фраза / ожидалось / получено», код возврата 1 при любом расхождении, --json для сборочной линии. 112 случаев за 5 секунд.
4.0-A04Эталонная ветка и регламент заморозкисделано 2 сентября 2026
Эталон уже существовал: тег 3.1.0 указывает на b0a236c, где APP_VERSION = "3.1.0", и это совпадает с HEAD. Ставить ничего не потребовалось.
4.0-A05Запись и воспроизведение сессийсделано 2 сентября 2026
tools/session.py — запись и воспроизведение. Записано 7 сессий в docs/golden/sessions/, воспроизводятся все, 0 расхождений.
4.0-A06Инвентаризация поверхностисделано 1 сентября 2026
Результат: SURFACE-3.1.0.md. Извлечено обходом дерева виджетов. Главный раздел — 23 действия, доступные только через одну кнопку и недоступные голосом; их редизайн теряет молча. Второй срез 3.0.0, дополняющий A01. A01 описывает поведение, A06 — поверхность: какие экраны есть, какие элементы на каждом, какие состояния (пусто / идёт работа / ошибка / нет прав / ядро недоступно), какие действия доступны только через одну конкретную кнопку и больше ниоткуда. Именно такие действия редизайн теряет молча — «Проверить голос», «Проверить связь», «Обновить список программ», импорт и экспорт команд, сброс настроек. Готово когда: у каждой строки инвентаря есть адрес: экран, элемент, состояние.
Блок R — Дизайн
Новый блок. Дизайн — это ремесло и итерации: он не ждёт, пока освободятся руки после протокола, и идёт параллельно с первого дня 4.x, наравне с треком V и датасетом N-A04.
Подробнее о блоке
Кроме того, он предшествует двум решениям, которые без него принимаются вслепую: выбору библиотеки контролов (F01b) и словарю декларативного интерфейса плагинов (H01). Схема, написанная до дизайна, зафиксирует словарь нынешней оболочки навсегда, и все плагины придётся мигрировать дважды.
4.0-R01Продуктовый и дизайн-брифсделано 1 сентября 2026
Результат: PRODUCT.md. Подтверждено пользователем: сцена — фон во время работы, сеансы за настройкой и поверх полноэкранного; режим «окно открыто рядом» отвергнут, значит окно либо не видно, либо в нём работают, и оно никогда не служит фоном. Личность — строго инструмент до 5.0 включительно (уточнено 2026-09-29: образ — инструмент, манера разговора и выбор личности — стиль речи, см. PRODUCT.md). Незыблемы эмблема и имя с женским родом в репликах; тёмная схема обязательством не объявлена.
4.0-R02Визуальное направлениесделано 1 сентября 2026
Выбрано направление «Аппарат»: design/DIRECTION.md.
4.0-R03Дизайн-системасделано 2 сентября 2026
design/SYSTEM.md объясняет, design/tokens.json хранит значения. Разделено намеренно: по файлу пишется XAML оболочки и проверяются макеты, поэтому одно значение живёт в одном месте.
4.0-R04Информационная архитектурасделано 2 сентября 2026
design/IA.md. Пять разделов вместо восьми.
4.0-R05Экранысделано 2 сентября 2026
design/mockups.html, собирается tools/build_mockups.py из tokens.json: значения не набраны руками, поэтому макет и система разойтись не могут. Пять разделов в двух отделках плюс лист состояний.
4.0-R06Состояния и краевые случаисделано 2 сентября 2026
Одна таблица на всю систему (SYSTEM.md, §6): обычное, наведение, нажатие, фокус, выбрано, первичное, выключено, ошибка, опасность. Выражаются ступенью значения, швом и рамкой — ничем больше.
4.0-R07Движениесделано 2 сентября 2026
Четыре длительности (SYSTEM.md, §7): отклик 90 мс, смена состояния 160, переход раздела 220, послесвечение 1000.
4.0-R08Темысделано 2 сентября 2026
Две отделки, silver и black, с одинаковым набором ролей — проверяется автоматически. Различаются не яркостью, а тем, из чего сделана панель.
4.0-R09Иконки и графикасделано 2 сентября 2026
Решение: иконок в навигации и у органов управления нет. Вопрос стоял не «какие рисовать», а «нужны ли»: там, где легенда обязательна, значок рядом либо повторяет её, либо спорит с ней.
4.0-R10Раскладки под локализациюсделано 2 сентября 2026
Измерено шрифтом в холсте. Колонка 168 px, доступно 134.
4.0-R11Сверка с инвентарёмсделано 2 сентября 2026
tools/check_design.py — 25 проверок, все зелёные.
Блок B — Рефакторинг ядра ДО переноса
Делается на Python, где всё ещё работает и проверяется прогонщиком. Переносить в C# нерасчленённую логику — гарантированный способ потерять поведение. Редизайна этот блок не касается: у ядра нет интерфейса.
4.0-B01Модель данных намерений и действийсделано 2 сентября 2026
core/intent.py: Intent, Action, Result — неизменяемые, сериализуемые в JSON без потерь, без единого импорта Qt.
4.0-B02Выделить Routerсделано 2 сентября 2026
core/router.py: route(text, ctx) -> Intent. Ничего не запускает, не говорит, не пишет и не ходит в сеть.
4.0-B03Выделить машину состоянийсделано 2 сентября 2026
core/dialog.py: Question и Dialog с тремя явными переходами — ask, answered, dropped. Раньше это был словарь self._pending внутри ядра, а переходы жили в трёх местах разом.
4.0-B04Выделить Executorсделано 2 сентября 2026
core/executor.py. Проверено механически: в core/engine.py не осталось ни одного обращения к startfile, webbrowser.open, system_control.run или app_index.launch — все они в исполнителе.
4.0-B05Убрать неявные связисделано 2 сентября 2026
Начал с проверки: поднял два ядра в одном процессе. Результат оказался хуже ожидаемого — событие скриншота не доходило ни до одного из них, потому что уходило в модульный синглтон. В приложении это работало лишь потому, что окно было подписано на ту же глобальную шину.
4.0-B06Настройки за интерфейсомсделано 2 сентября 2026
core/settings_api.py: протокол SettingsProvider и реализация MemorySettings для тестов. RinaEngine принимает провайдера аргументом; без аргумента берёт общее хранилище, поэтому поведение приложения не изменилось.
4.0-B08FeatureProviderсделано 2 сентября 2026
core/features.py: протокол FeatureProvider, реализация CommunityFeatures (доступно всё) и LimitedFeatures для тестов. Ядро отдаёт провайдера свойством engine.features; подставить свой можно через конструктор.
4.0-B07Контрольный прогонсделано 2 сентября 2026, с оговоркой
Прогон 2 сентября 2026, после расчленения ядра:
Блок C — ToolRegistry
Делается для 4.0.0 по своей причине — чистая граница ядро/оболочка. Но именно этот реестр потом станет руками LLM, поэтому проектировать надо всерьёз.
4.0-C01Модель инструментасделано 2 сентября 2026
core/tools.py — модель, core/toolbox.py — четырнадцать описаний. Все семь частей на месте: имя, схема аргументов, разрешения, confirm_required, форма результата, каталог ошибок, идемпотентность.
4.0-C02Валидация аргументов по схемесделано 2 сентября 2026
Ключевое решение: лишний аргумент — ошибка, а не то, что молча игнорируется. Проглоченный лишний аргумент означает, что вызывающая сторона считала, будто просит одно, а получит другое. Для человека это редкость, для языковой модели — обычное дело.
4.0-C03Обёртки существующих действийсделано 2 сентября 2026
Все четырнадцать реализованы в core/toolrunner.py. Исполнитель переписан: он больше ничего не делает сам, а переводит намерение в вызов инструмента.
4.0-C04Каталог разрешенийсделано 2 сентября 2026
core/permissions.py: одиннадцать разрешений с человеческими пояснениями — они попадут на экран выдачи разрешений в 5.0-C02, поэтому написаны обычными словами.
4.0-C05Контур подтверждениясделано 2 сентября 2026
core/confirmations.py. Подтверждение стало предметом, который предъявляют: идентификатор, срок, однократность.
4.0-C06Аудит вызововсделано 2 сентября 2026
core/audit.py — SQLite из стандартной библиотеки, новых зависимостей нет. Пишется на воротах реестра: это единственное место, где разом известны все шесть полей.
4.0-C07Реестр — единственный путь исполнениясделано 2 сентября 2026
tools/test_invariants.py проверяет инвариант по всем 25 файлам ядра, а не по одному исполнителю: побочные эффекты выполняются только внутри core/toolrunner.py.
Блок D — Протокол
Самый важный блок в 4.0.0. Половина пунктов в 4.0.0 не используется — они закладываются, потому что добавить их позже стоит переписывания обоих слоёв.
4.0-D01ADR: транспортсделано 1 сентября 2026
Решение: именованный канал, держит оболочка, ядро подключается клиентом. ADR 0002.
4.0-D02Спецификация протокола v1сделано 1 сентября 2026
Результат: protocol/PROTOCOL-v1.md. Написана до реализации; описывает конверт, рукопожатие, правила совместимости, каталог ошибок, все методы и события, потоковый текст, канал данных с кредитной схемой, жизненный цикл долгой задачи, отмену, разрешения, заглушку актуации, живость и трассировку.
4.0-D03Handshake и согласование возможностейсделано 2 сентября 2026
core/wire/handshake.py, проверка python tools/test_wire.py.
4.0-D04Конверт сообщениясделано 2 сентября 2026
core/wire/envelope.py. Конверт, кадрирование управляющего канала, порождение идентификаторов и трассировки.
4.0-D05Каталог кодов ошибоксделано 2 сентября 2026
core/wire/errors.py, 21 код. Категория и признак повтора принадлежат коду, а не месту вызова: одна и та же ошибка, поднятая из двух мест, обязана одинаково отвечать на вопросы «кто виноват» и «есть ли смысл повторить». Вызывающая сторона передаёт код и текст, остальное берётся из каталога — иначе app.not_found однажды окажется system в одном месте и user в другом, и оболочка станет вести себя по-разному в зависимости от того, каким путём пришла ошибка.
4.0-D06Стриминг текстасделано 2 сентября 2026
StreamSender и StreamReceiver в core/wire/events.py. Потребителя в 4.0 нет — он появляется в 5.0; заложено сейчас, потому что добавить потом стоит переписывания обеих сторон.
4.0-D07Бинарный каналсделано 2 сентября 2026
core/wire/data.py: кадр с двоичным заголовком, разбор потока байтов, порядковые номера, виды потоков и привязка вида к возможности.
4.0-D08Backpressureсделано 2 сентября 2026
Кредит в байтах, по потоку, начальный ноль.
4.0-D09Lifecycle долгой задачисделано 2 сентября 2026
core/wire/tasks.py. Долгих задач в 4.0 нет — цикл закладывается, пока цена нулевая.
4.0-D10Кооперативная отменасделано 2 сентября 2026
Три шага разведены в коде: просьба, подтверждение получения, и лишь затем task.cancelled — который отправляется, когда работа действительно прекращена. Отправить его вместо подтверждения значило бы соврать о том, что уже ничего не выполняется.
4.0-D11Push-событиясделано 2 сентября 2026
core/wire/events.py: каталог из 14 событий с объявленной формой нагрузки, сборка и приём.
4.0-D12Канал разрешенийсделано 2 сентября 2026
core/wire/permissions.py поверх контура C05.
4.0-D13Канал актуации: только спецификациясделано 2 сентября 2026
Восемь методов §12 заведены в каталоге возможностей и сверяются с таблицей документа в обе стороны.
4.0-D14Heartbeat, обрыв, переподключениесделано 2 сентября 2026
core/wire/liveness.py.
4.0-D15Сквозная трассировкасделано 2 сентября 2026
core/trace.py плюс поле trace в формате журнала (core/logging_setup.py).
4.0-D16Conformance-тесты протоколасделано 2 сентября 2026
tools/conformance.py: все двенадцать требований §15, 56 проверок, транспорт внутри процесса.
4.0-D17Правила совместимости версийсделано 2 сентября 2026
Правила были записаны в §4 словами — и словами бы и остались: человек, добавляющий поле, читает не спецификацию, а соседнюю строчку кода. Теперь они проверка.
Блок E — Python Core как сервис
4.0-E01Точка входа сервисасделано 2 сентября 2026
rina_core.py плюс core/wire/transport.py. Ядро стало процессом: аргументы, журнал, канал, сигналы, коды возврата.
4.0-E02Серверная сторона протоколасделано 2 сентября 2026
core/wire/server.py. Провод соединён с настоящим core/engine.py; до этого он умел собирать сообщения, но ни с чем не был связан.
4.0-E03STT в ядресделано 3 сентября 2026
core/speech.py. Граница узкая нарочно: байты PCM → текст, и ничего про устройства.
4.0-E04Синтез TTS в ядресделано 3 сентября 2026
Граница такая же узкая: текст → байты PCM. Ядро синтезирует, оболочка воспроизводит.
4.0-E05Напоминания как сервис ядрасделано 2 сентября 2026
Планировщик запускается процессом ядра, а не окном. В разделённой программе это неверно вдвойне: напоминание, поставленное голосом, обязано сработать независимо от того, открыто ли окно, а оболочка вправе быть свёрнутой в трей.
4.0-E06aADR: кто владеет представлением настроексделано 2 сентября 2026
ADR 0006. Ядро владеет смыслом, оболочка — видом. Граница проходит не между «формой» и «значениями», как ставился вопрос, а между смыслом и представлением.
4.0-E06Настройки по протоколусделано 6 сентября 2026
Оболочка не знает формата хранения. Форма ответа определена ADR 0006; сторона оболочки — shell/Rina.Shell/Pages/SettingsPage.xaml.cs и SettingsLayout.cs.
4.0-E07Управление жизненным циклом ядрасделано 2 сентября 2026
shell/Rina.Protocol/CoreSupervisor.cs. Пять состояний: не запускали, запускаем, готово, переподключаемся, сдались.
Блок F — C# Shell
4.0-F01ADR: UI-фреймворк — WPFсделано 3 сентября 2026
ADR 0008. Запись появилась задним числом: решение принимали в начале блока F, оболочка на нём уже написана целиком. Записать всё равно нужно было — следующий, кто спросит «почему не Avalonia», должен найти готовый ответ.
4.0-F01bADR: библиотека контроловсделано 2 сентября 2026
ADR 0005. Решение: библиотеки нет, стилизация своя поверх стандартного WPF.
4.0-F02Каркас проекта и клиент протоколасделано 2 сентября 2026
shell/: решение, библиотека Rina.Protocol и проба Rina.Protocol.Probe. .NET 9, ни одной внешней зависимости — как и решено в ADR 0005.
4.0-F03Главное окно и навигациясделано 2 сентября 2026
shell/Rina.Shell: своя рама на WindowChrome, колонка пяти разделов, место для раздела, полоса уровня вдоль нижней кромки.
4.0-F04Страницысделано 3 сентября 2026
Сделаны все пять: Диалог, Команды, Напоминания, Плагины, Настройки. Ниже — что нашлось по дороге, потому что это важнее самих страниц.
4.0-F05Трей и автозапусксделано 3 сентября 2026
Значок в трее, сворачивание вместо выхода, запуск при входе в систему.
4.0-F06Глобальные хоткеисделано 3 сентября 2026
Сочетание перехватывается в самом начале оконной процедуры, до всякой логики. Требование архитектурное: в 5.0 сюда встанет kill-switch (5.0-D08), мгновенно снимающий все разрешения и обрывающий управление компьютером. Если он окажется за обработкой сообщений окна, за занятым ядром или за чем угодно ещё, он сработает тогда, когда уже поздно.
4.0-F07Темысделано 2 сентября 2026
Настройка finish со значениями silver и black. Меняется на лету: обе отделки равноправны, и подменяется целый словарь ресурсов, а не пересчитываются цвета от базового, — требовать перезапуска значило бы соврать о том, как это устроено.
4.0-F08ADR + реализация локализациисделано 3 сентября 2026
Решение — ADR 0007: слова интерфейса живут в оболочке, реплики Рины — в ядре. Граница проходит не между процессами, а между вещами: у слова есть владелец, и владелец тот, кто это слово произносит.
4.0-F09Захват микрофонасделано 3 сентября 2026
shell/Rina.Shell/Audio/. Устройства, захват 16 кГц моно 16 бит, уровень, поток в ядро по каналу данных с кредитом. На стороне ядра сервер научился принимать поток: stream.open, чтение канала данных своим потоком, возврат кредита по мере обработки.
4.0-F10Воспроизведение речисделано 3 сентября 2026
Очередь кусков, мгновенное прерывание, защита от эха.
4.0-F11Диалог подтверждениясделано 3 сентября 2026
Окно подтверждения плюс то, чего не хватало для его существования: канал разрешений заработал по-настоящему. 4.0-D12 построил его как библиотеку, но никто им не пользовался — опасное действие просто отклонялось с кодом. Теперь ядро спрашивает.
4.0-F12Индикация связи с ядромсделано 2 сентября 2026
Состояние стоит в подвале колонки разделов, рядом с версией: это справка о приборе, а не работа. Видно всегда — §13 требует, чтобы окно не выглядело зависшим, а для этого человек должен понимать, что происходит, не нажимая ничего.
Блок G — System-слой на C#
4.0-G03Скриншотсделано 3 сентября 2026
shell/Rina.Shell/Platform/Machine.cs. Громкость и медиа — теми же сообщениями, что шлёт мультимедийная клавиатура: они уходят активному приложению и работают одинаково с плеером, браузером и чем угодно ещё. Через микшер вышло бы иначе — он трогает свой сеанс, а у Рины звука нет вовсе.
4.0-G04Индексация установленных программсделано 3 сентября 2026
shell/Rina.Shell/Platform/AppIndex.cs. App Paths, меню «Пуск», пакеты Магазина, PATH, добавленные папки. Кэш с версией формата: старый файл 3.1.0 не читается, а пересобирается — запись другой формы, прочитанная как своя, хуже отсутствующей.
4.0-G05Запуск процессовсделано 3 сентября 2026
Platform/Launcher.cs. Запуск средствами оболочки системы (UseShellExecute) — так открываются и ярлыки, и пакеты, и файлы с ассоциацией, тем же способом, каким это делает проводник; своего разбора .lnk мы не пишем. Рабочий каталог — папка самой программы, иначе им станет каталог Рины и программа не найдёт файлы рядом с собой.
4.0-G06ADR: где живёт сопоставление имёнсделано 3 сентября 2026
ADR 0009: машину трогает оболочка, решает, что с ней сделать, ядро. Граница проходит по различию между фактом об операционной системе и суждением о намерении человека: перечислить установленное — факт, понять, что «телеграм» это Telegram, — суждение.
4.0-G07Транслитерация и фаззи-матчинг в ядресделано 3 сентября 2026
core/apps.py. Обещание ADR 0009 — «voice/app_index.py разрезается пополам» — выполнено буквально: сбор уехал в оболочку, сопоставление сюда. Модуль ничего не знает про Windows, и find() требует список записей: сходить и посмотреть самому ему нечем. Это не недоделка, а граница, и записана она в докстроке, чтобы следующий не «починил» её походом в реестр.
4.0-G08Политика источников индексасделано 3 сентября 2026
Порядок: App Paths → меню «Пуск» → пакеты → PATH → добавленные папки. При совпадении имён побеждает источник выше: у записи, объявленной установщиком, больше оснований быть тем, что человек имел в виду, чем у одноимённого файла из PATH.
4.0-G09Происхождение и доверие в записи индексасделано 3 сентября 2026
Запись несёт имя, псевдонимы от системы, канонический путь, источник, вид, наличие действительной подписи и дату проверки.
4.0-G10Предупреждение о первом запуске недоверенногосделано 3 сентября 2026
Pages/TrustWindow.xaml. Показывается всё, чем можно решать: имя, полный путь, источник индекса. Вопрос «доверяете ли вы этой программе» без пути — вопрос без ответа: половина неподписанного лежит там, куда человек её сам положил, а вторая — там, куда её положил кто-то другой.
4.0-G11Canonical path и вычистка индексасделано 3 сентября 2026
Путь разворачивается до запуска (ResolveLinkTarget), и записи с исчезнувшими файлами выбрасываются при чтении кэша: индекс, помнящий удалённое, однажды запустит не то. Неразрешимый путь — это ответ «нельзя», а не «наверное можно»: непонятный путь и есть повод отказать.
4.0-G12Запуски в журнале безопасностисделано 3 сентября 2026
Platform/Journal.cs, тот же файл, что у ядра: две хронологии на одно происшествие пришлось бы сшивать руками по времени, и первая же несостыковка часов сделала бы это невозможным. Пишется приложение, абсолютный путь, источник индекса, потребовалось ли согласие и результат. Текста команды нет никогда — даже при включённой log_texts: «что запускали» и «что человек сказал» — разные сведения.
Блок H — Плагины без UI-фреймворка
Плагин, отдающий готовый виджет, привязывает ядро к конкретной оболочке. Это прямой блокер разделения.
4.0-H01Схема декларативного интерфейсасделано 4 сентября 2026
PAGE-SCHEMA-v2. Ограничение, записанное в этой задаче заранее, подтвердилось буквально: словарь был плоский, новый дизайн построен на карточках, и выразить в нём страницу плагина было нечем. Чинилась схема, а не рендерер — как и было предсказано.
4.0-H02Рендерер в C#сделано 4 сентября 2026
Pages/PluginsPage.xaml.cs. Все тринадцать видов словаря, включая контейнеры, таблицу, полосу выполнения и метку состояния. Незнакомый вид показывается заметно и с именем: плагин может быть собран под схему новее оболочки, и молчаливый пропуск сделал бы часть его страницы невидимой без следа. Чинят некрасивое; незаметное не чинят.
4.0-H03Plugin API нового поколениясделано 4 сентября 2026
ADR 0010, API версии 4. Плагин объявляет, а не делает: инструменты уходят в реестр ядра, страница описывается данными, разрешения перечислены в манифесте.
4.0-H04Миграция встроенных плагиновсделано 4 сентября 2026
Четыре штуки, и все — примеры для сторонних авторов, поэтому переписаны показательно. clock — объявленный инструмент; dice — инструмент с аргументом, который проверяет реестр; greeter — самый маленький плагин, вообще без объявлений; notes — страница на контейнерах, с полем ввода и рядом кнопок.
4.0-H05Депрекация старого APIсделано 4 сентября 2026
Плагин версий 1–3 не загружается, и человеку сказано, почему: причина, нужная версия и что делать — одним предложением. Молчаливое «плагин просто не работает» выглядело бы как поломка Рины, а не как устаревший плагин. Причины две и они разные: «обновите плагин» и «обновите Рину».
4.0-H06Границы плагиновсделано 4 сентября 2026
Каталог разрешений один — тот же, что у ядра: второй, «для плагинов», означал бы два языка об одном и том же и неизбежное расхождение. Но доступно из него не всё: выключение компьютера, запись файлов и зарезервированное под 5.0 плагину не выдаются никогда. Инструмент, просящий недоступное, не заводится вовсе — он всё равно отказал бы, но уже после того, как человек его увидел и позвал.
4.0-H07Плагин в отдельном процессесделано 4 сентября 2026
plugins/host.py — процесс одного плагина; core/plugin_host.py — надзор со стороны ядра.
Блок U — Система обновлений
Сейчас обновление устроено просто: приложение спрашивает у GitHub последний релиз и предлагает скачать .exe. После разделения этого не хватит — у оболочки и ядра появляются собственные версии, и они могут обновляться порознь.
Подробнее о блоке
Почему до разделения, а не после. Схема версий и совместимости определяет, как именно раскладываются и запускаются две части. Пришить её задним числом — значит переделать сборку, установщик и запуск обоих слоёв.
Разметка по рубежам: [port] — входит в 4.0-port, [stable] — после беты, [4.1+] — позже.
4.0-U01ADR: версии и совместимостьсделано 1 сентября 2026
Решение: ADR 0004. Четыре независимые версии, а не три: протокол, оболочка, ядро и схема данных на диске (существующий CONFIG_VERSION).
4.0-U02Метаданные релизасделано 4 сентября 2026
docs/updates/MANIFEST.md и shell/Rina.Shell/Update/Manifest.cs. Один файл на обе части, потому что части две, а решение одно: раздельные метаданные позволили бы прочитать свежие данные оболочки рядом с годовалыми данными ядра и счесть пару совместимой, не имея возможности это проверить.
4.0-U03Клиент обновленийсделано 4 сентября 2026
shell/Rina.Shell/Update/Updater.cs. Четыре сценария плюс два отказа: только оболочка, только ядро, обе, всё свежее — и отдельно несовместимая пара и ядро, которое не прочитает то, что уже на диске.
4.0-U04Скачивание и целостностьсделано 4 сентября 2026
Только HTTPS — и отказ происходит до всякой закачки. Хэш считается по дороге, а не вторым чтением с диска: второе чтение стоит времени и оставляет промежуток, в который файл можно подменить. Несовпадение — не «повреждён», а «не тот файл», и он удаляется целиком; оборванная закачка тоже не оставляет после себя ничего. Половина обновления, оставшаяся на диске, однажды окажется установленной.
4.0-U05Журнал обновленийсделано 4 сентября 2026
В тот же security.log, что и запуски: разбор «после какого обновления это началось» невозможен, если обновления в одном файле, а запуски в другом.
4.0-U06Каналы обновленийвпереди
stable / beta / rc, выбор в настройках. Понижение по каналу — только явным действием пользователя.
4.0-U07Подпись релизоввпереди
Ed25519: при сборке подписывается хэш файла, публичный ключ зашит в приложение, клиент проверяет подпись до установки.
4.0-U08Подпись метаданныхвпереди
Подписывается не только файл, но и сам ответ сервера. Иначе тот, кто подменит метаданные, сможет объявить must_update и отключить возможности у всех установок, не подделав ни одного файла. В исходной стратегии этого пункта не было — добавлен здесь. Готово когда: ответ с неверной подписью отвергается целиком, включая флаги.
4.0-U09Обязательные обновлениявпереди
Флаг must_update только для критических дыр: удалённое выполнение кода, повышение прав, утечка данных через плагин, обход проверок безопасности. Не для новых функций и не для косметики.
4.0-U10Защита от понижения версиивпереди
Клиент не принимает версию старше текущей, если это не явный откат пользователем. Сервер сообщает минимально допустимую версию.
4.0-U11Хранение предыдущей версиивпереди
Одна-две предыдущие версии сохраняются для отката.
4.0-U12Откат версийвпереди
Интерфейс отката, обратные миграции данных. Предусловие из ADR 0004: откат разрешён, только если версия схемы данных у целевой сборки не ниже той, что лежит на диске. Иначе откат отклоняется по умолчанию, а не выполняется с предупреждением — и пользователю говорится прямо, что данные, записанные после обновления, будут потеряны.
4.0-U13Сервер метаданныхвпереди
Гибрид: GitHub Releases остаётся для сообщества, исходников и заметок; свой сервер хранит метаданные, подписи и флаги. Простой API и админка, чтобы помечать критические версии.
Блок S — Правовые и стратегические решения
Работой это не является, но откладывание закрывает варианты.
4.0-S01ADR: лицензия и модель вкладовсделано 1 сентября 2026
Решение: Apache-2.0, вклады без CLA. Записано в ADR 0001. Установлены LICENSE (канонический текст, sha256 cfc7749b…), NOTICE, CONTRIBUTING.md и каталог docs/adr/. Вклады принимаются по разделу 5 самой лицензии — отдельного соглашения не требуется.
4.0-S02Threat modelсделано 8 сентября 2026
docs/security/THREAT-MODEL.md: четыре поверхности, семнадцать угроз, у каждой — нарушитель, защита и названный остаток. Сверяется tools/check_threat_model.py.
4.0-S04Телеметрия беты уходит из Stableвпереди
Решено 2026-09-29: необязательная телеметрия (4.0b-D05) живёт только в бете. В Stable она убирается целиком: код отправки, настройка, пункт на странице приватности, адрес сервера. Обещание «без телеметрии» на странице продукта и в README возвращается без оговорок.
4.0-S03Границы 4.0 зафиксированысделано 8 сентября 2026
tools/check_scope.py против снимка docs/scope-4.0.json. Формулировка задачи — «закрыта, пока список не меняется молча» — это не документ, а точка отсчёта: сверка отвечает не «правильные ли границы», а «что изменилось с прошлого раза и было ли это решением».
Блок I — Выпуск 4.0-port
4.0-I01Сборка и установщиксделано 8 сентября 2026
Решение — ADR 0011: встроенный дистрибутив Python едет внутри. Сборка — tools/build_release.py, сценарий установщика — packaging/rina.iss, проверка собранного — tools/check_release.py.
4.0-I02Миграция данных из 3.0.0сделано 6 сентября 2026
Настройки, команды, плагины, история, напоминания. tools/test_migration.py кладёт конфиг в форме 3.0.0 — один файл со всем сразу, версии формата нет, язык распознавания отдельным ключом, выученные программы строками пути — и смотрит, что доехало.
4.0-I03Диагностический пакетсделано 6 сентября 2026
shell/Rina.Shell/Platform/Diagnostics.cs. Кнопка на странице «О программе»: журналы обоих слоёв, версии всех четырёх частей, состояние связи, возможности ядра и список плагинов — в один архив.
4.0-I04Полный регресссделано 6 сентября 2026
tools/regress.py. Один вызов, один отчёт: 35 проверок за две минуты, код возврата 1 при любом провале.
4.0-I05Документация архитектуры и дизайнасделано 8 сентября 2026
Пять документов: README переписан под две программы, docs/ARCHITECTURE.md — схема слоёв и три границы, из которых следует почти всё остальное, docs/plugins/WRITING-PLUGINS.md, docs/DEBUGGING.md. Дизайн-система документом была и осталась — docs/design/SYSTEM.md.
4.0-beta · сейчасПубличная бесплатная бета
58 из 63 задач сделано
Цель: проверить, приносит ли продукт пользу, и собрать реальные сценарии. Не проверять платёжную инфраструктуру, аккаунты и лицензии — их в бете нет.
Подробнее о рубеже
Правило рубежа: заморозка снята, но состав ограничен списком ниже. Лучше один сильный понятный сценарий, чем десять незавершённых.
Обязательная бесплатная база (всё уже есть после port): оболочка на C# и headless-ядро с протоколом, локальный голосовой конвейер, Ollama, обнаружение и безопасный запуск программ, системные действия, настройки, история, таймеры и напоминания, глобальные хоткеи, плагины с документированным API, журналы, импорт-экспорт и миграция из 3.x.
Чего в бете нет: аккаунтов и серверной части, подписок и биллинга, мобильного и веб-интерфейса, командного режима, облачной синхронизации, VRM-компаньона.
Блок 4.0b-A — Что обязано быть в бете
Состав блока задан списком, а не выбором. Раньше здесь выбиралась одна отличительная функция, и 4.0b-A01 этот выбор сделал. Постановка изменилась: бету определяет не одна функция, а то, каким продукт выглядит и насколько им удобно пользоваться. Функции при этом никуда не делись — они стали одним пунктом списка из восьми.
Подробнее о блоке
Почему это не расширение состава, а его уточнение. Правило рубежа осталось прежним: «лучше один сильный понятный сценарий, чем десять незавершённых». Семь из восьми пунктов ниже — это не новые сценарии, а приведение в порядок того, что уже есть: оформление, главный экран, конструктор команд, настройки, остальные вкладки, диалог. Новых сценариев два, и оба уже закрыты (4.0b-A03, 4.0b-A04), плюс третий небольшой — список дел.
Список обязательного (источник — личные заметки автора, которые хранятся вне репозитория, и решение от 2026-09-09):
| # | Что | Пункт |
|---|---|---|
| 1 | Глубина в оформлении: сложнее анимации, новая отделка, анимированный фон, немного градиента | 4.0b-A06 |
| 2 | Новая главная вкладка: фигура состояний, плеер, места под плагины, бургер-меню | 4.0b-A07 |
| 3 | Минимум две новые возможности | 4.0b-A08 — закрыт |
| 4 | Конструктор команд: удобнее, визуальный, с пометкой «бета» | 4.0b-A09 |
| 5 | Настройки в порядок: группировка и отдельные окна | 4.0b-A10 |
| 6 | Остальные вкладки в порядок | 4.0b-A11 |
| 7 | Диалог как переписка между Риной и человеком | 4.0b-A12 |
| 8 | Список дел, с кнопкой на главной | 4.0b-A13 |
Что из этого дороже, чем выглядит. Пункты 1 и 2 — это не «поправить стили»: анимированный фон и живая фигура работают у человека, который держит Рину открытой весь день. Плата за красоту здесь — не время разработки, а его батарея и вентилятор, и об этом сказано в самих пунктах.
Чем это решение заменено 2026-09-09. Заменена не оценка функций, а постановка вопроса: «какая одна» превратилось в «что обязано быть». Последствия решения сохранились — A03 и A04 сделаны именно из-за него и закрывают пункт 3 нового списка.
Что из него осталось верным и связывает новый список. Режим использования №1 — «фоном во время работы, окно свёрнуто или в трее», а режим «окно рядом, на него поглядывают» пользователем отвергнут. Из этого следовал выбор A03; из этого же следует ограничение на пункты 1 и 2: главный экран, который человек видит редко, не имеет права стоить ему батареи всё остальное время.
Отделка «Графит» живёт в токенах наравне с серебром и чёрным. Контраст сошёлся сразу, кроме одного места: акцент ember дал 4.42 при нужных 4.5 и осветлён именно для этой отделки. Схема настроек давно говорила, что варианты акцента зависят от отделки, — здесь это проявилось делом.
Правило пришлось поправить, и это главное в задаче. 4.0-R02 §5 и 4.0-R03 запрещали тень и размытие с доводом: «тень имитирует источник света, которого у панели нет; элемент, висящий над другим, нарисован неверно». A06 просил ровно обратного, и check_design.py честно покраснел.
Поправка принята 9 сентября 2026 и записана в SYSTEM.md, §5: тень разрешена движению. Можно тень у слоя, приезжающего на место, и под тем, что действительно парит над окном. Нельзя карточки на тенях, размытие вместо шва и тень под тем, что никуда не двигалось. В неподвижном кадре тени по-прежнему нет.
Довод при этом не отменён, а уточнён: у движения источник есть — само движение. Вещь, приехавшая сверху, отбрасывает тень, пока едет, и перестаёт, когда легла.
Проверка сменила предмет. Запрещать токен значило бы запрещать решение; запрещать надо штамп, и у штампа есть форма — много уровней и размытие шире, чем нужно движению. Теперь проверяется: уровней не больше трёх, тень не шире 32, у каждой отделки свой цвет тени, налёт расходится не больше чем на 5% — и в макете, который есть неподвижный кадр, старое правило действует целиком.
Код сказал не то, что документ, и это нашлось на снимке. Тень у раздела оседала до уровня «приподнято» и оставалась лежать — то есть карточка на тени, ровно то, чего поправка не разрешала. Теперь она уходит в ноль, а проверка движения читает это обратно из живого окна: «на середине перехода тень видна», «а в покое тени нет вовсе».
Живой фон — вычисляемое течение. Дошло с третьей попытки, и обе первые стоит назвать. Сначала я двигал градиент лицевой поверхности на единицы процентов. Потом — четыре мягких радиальных пятна; человек показал референсы (всплеск воды, синяя туманность, старый концепт главного экрана) и сказал: фон должен быть виден. Пятнами это не делается: перекрывающиеся эллипсы дают гладкие кляксы, но никогда — нить или завихрение.
Теперь это поле фрактального шума с искажением собственных координат — стандартная дорога к жидкой, мраморной картине. Вычисляется целиком: зацикливать нечего. Время идёт по кругу, поэтому в конце периода поле возвращается к себе без шва.
Считается мелко и растягивается. У поля нет детали мельче собственных черт, поэтому низкое разрешение ничего не теряет, а стоит долю. Именно это делает попиксельный эффект посильным на процессоре — и поэтому здесь нет шейдера: модель шейдеров WPF стара настолько, что уложиться в неё стоило бы дороже самого эффекта.
Граница, которая не двигается, — читаемость. Каждая ступень палитры сверяется с чернилами и легендами на 4.5. И она же формирует вид: на тёмной отделке потолок по светлоте низкий, значит течение показывает себя цветом, а не яркостью. Отсюда глубокая синева графита — так выглядит тёмная туманность, и так она обязана выглядеть, чтобы её было видно.
Одно правило снято вслух. «Цвет пятна — цвет этой же панели» было написано, когда фон был шёпотом. Держать его дальше значило бы держать правило про вещь, которой больше нет: оно зеленело бы на том, о чём никогда не было. Защита от штампа теперь другая и честнее — контраст и насыщенность, оба числом, плюс монотонность палитры и число ступеней.
Цена кадра измерена. Весь довод за остановку фона состоит в том, что кадры чего-то стоят человеку; цена, которую ни разу не померили, делает довод на веру. Померено: 8.3 мс при потолке в треть интервала. Запас нашёлся после первого измерения — и был потрачен на четвёртую октаву и разрешение выше, то есть на деталь, которую можно себе позволить.
Фон замирает, и это проверено временем. Ни скриншот, ни наличие объекта-таймера этого не показывают: фаза измеряется до и после. Часы свои, а не Storyboard с RepeatBehavior.Forever — у того нет причин останавливаться, когда окно скрыто, а здесь остановка и есть смысл.
Три дефекта, которых не было бы без живого окна. Пятна не появились вовсе: Ellipse.Width начинается с NaN, а сравнение с NaN всегда ложно — Math.Abs(NaN - size) > 0.5 сказало «размер верный», и пятна остались нулевыми. Ни ошибки, ни строки в журнале, просто плоская панель. Дальше кольца: большой мягкий градиент в восьми битах выходит концентрическими полосами, и лечится это дизерингом, а не подбором цвета. И сдвиг шёл через Canvas.Left — раскладка тридцать раз в секунду там, где хватает преобразования.
Пиксельная сверка сменила предмет дважды, и оба раза не допуском. Сперва её сломало зерно дизеринга: шум в одно значение на одной точке даёт разброс в шесть, профиль у шва вышел 33, 39, 33, 33, 39, и сверка честно прочитала это как тень. Расширять допуск было нельзя — допуск, глотающий фон, проглотил бы и разницу между FACE и FACE_LOW в семь значений. Стала считать по вертикальной полоске: зерно нулевое в среднем и на ней гасится.
Потом течение отменило и саму мысль «панель залита FACE». Теперь проверяется, что цвет на панели — цвет из палитры течения: это ловит то, что стоит ловить (оболочка рисует неназванным цветом) и молчит о том, какая ступень пришлась на эту фазу. А «панель светлее колонки» заменено на «на границе есть разрыв»: под течением направление ступени не постоянно, но разделение областей — да, и означает оно именно разрыв.
Проверено подделкой снимка: настоящая тень у шва, чужой цвет панели и перевёрнутая ступень значения — по падению каждая.
Проверка нашла дефект, которого без неё бы не было. Просьба о покое доходила только со следующим событием окна: человек, выключивший анимации в Windows, оставался с движущимся фоном до ближайшей активации. Обещание держалось «когда-нибудь», а это не то, что оно говорит. Теперь покой наступает тиком позже самое большее, и обратный переход тоже слышен — через SystemParameters.StaticPropertyChanged.
И проверка умела проверять половину. Ветка «система просит покоя» зависит от настройки Windows у разработчика: на машине с включёнными анимациями она недостижима, и сломанное послушание оставляло проверку зелёной. Теперь ветку можно спросить прямо, и слом её роняет.
Проверено сломом: тень как разделитель (шире 32) — 1 падение, четвёртый уровень — 1, отделка без цвета тени — 1, тень в неподвижном макете — 1, фон не останавливается — 2, тень остаётся в покое — 1, покой не слушают — 2, палитра туда-обратно — 1, люминесцентный цвет — 2, слишком светлая ступень — 1, искажения области нет — 1, кадр дороже бюджета — 1.
Заодно два списка перестали писаться руками. FINISHES в регрессе и сверка 4.0-R08 в проверке дизайна называли две отделки поимённо — и третья прошла бы мимо обеих молча, потому что список из двух имён не выглядит неправильным. Оба теперь читают отделки из токенов; снимков стало шесть вместо четырёх.
Дополнение 2026-09-25: частота кадров стала настройкой — и оказалась не той, что думали. Токен просил у DispatcherTimer 60 кадров, а Windows округляет интервал такого таймера до своего тика в 15.6 мс: выходило 32. Поток при этом двигался на запрошенный шаг, то есть вдвое медленнее своего периода в 9 секунд — а на машине, где кто-то укоротил тик, с полной скоростью. Скорость фона зависела от посторонних программ. Мера «сдвиг за секунду» копила те же запрошенные интервалы, и её «секунда» длилась две.
Теперь кадры берутся из цикла отрисовки WPF, и поток движется на реально прошедшее время. Привычный вид сохранён периодом 17 — это те самые 9 при 32 кадрах из 60, и сайт переведён на то же число. Частота — настройка frame_rate во «Внешнем виде»: 30 по умолчанию (ровно прежняя нагрузка), 60, 120 и «без ограничения», с ценой в названии и предупреждением после выбора. Выше частоты монитора фон не идёт при любом выборе.
Переходы фигуры и спад уровня голоса считались долей пути за кадр — на 60 кадрах они шли бы вдвое быстрее. Теперь они в единицах того тика, на котором их подбирали на глаз.
Размытие полосы заголовка — на процессоре. BlurEffect размывал увеличенную до окна картинку на видеокарте на каждом кадре, а полоса показывала из неё сорок точек. Теперь размытая копия поля считается в том же проходе, что и само поле, и только для строк под полосой. Сила подобрана замером: полосатая картинка проверки стекла сохраняет 14 значений контраста из 158 против прежних 12.
Замер, поочерёдно, три круга, окно впереди (3D Рины / процессор Рины; процессор — в Debug-сборке, см. ниже):
| 3D | процессор | |
|---|---|---|
| до правки | 8.0% | 3.67 ядра |
| 30 кадров | 6.5% | 3.62 ядра |
| 60 кадров | 12.8% | 7.24 ядра |
| без ограничения (монитор 75 Гц) | 14.9% | 8.31 ядра |
Цена идёт за кадрами, поэтому предупреждения называют кратности.
Поправка 2026-09-29. «Три с половиной ядра» — цифра Debug-сборки, а не программы. Разложено по частям кадра: в Debug поле фона стоит 35–43 мс процессора, фигура около 65; в Release — 3–7 и 7–24, и всё вместе на 30 кадрах 0,7–1,1 ядра. Шум в Debug втрое медленнее (микрозамер: 486 мс против 142 на одном объёме), и AggressiveOptimization этого не меняет — отладочная сборка выключает оптимизацию целиком. Выпуск собирается в Release; README теперь запускает в Release и объясняет почему. Кратности предупреждений от сборки не зависят.
Проверено сломом: частота не соблюдается — 3 падения; шаг на кадр вместо времени — 1 (период вдвое и в два с половиной раза выше обещанного); стекло без размытия — 1; стекло над ярким слоем на вкладке — 1 (до правки проверки ни одного: она читала флаг, а шов гасился растушёвкой); переход фигуры по кадрам — 1; выбор в настройках не доходит до фона — 1; цена не сказана после выбора — 1.
4.0b-A01Решение: какая функция станет лицом бетысделано 9 сентября 2026, заменено
Критерий выбора был: узнаваемый сценарий, который можно показать в демо за минуту, не требует облака, опирается на уже сильную базу.
4.0b-A02Рабочие сессии и проектный контекстсделано 20 сентября 2026
Человек начинает сессию над задачей, Рина хранит её контекст локально: цель, заметки, отданные команды, открытые приложения и — с согласия — рабочие каталоги. «Что я делал в прошлой сессии?», «Заверши сессию и запиши заметку», «Сколько я работал над этим на этой неделе?».
4.0b-A03Контекстные напоминаниясделано 9 сентября 2026
«Напомни проверить PR, когда открою VS Code». Повод вместо часов: у такого напоминания часов нет вовсе, и это не ноль в 1970 году — иначе планировщик счёл бы запись просроченной на полвека и разбудил бы человека через секунду после того, как тот её завёл.
4.0b-A04Обучение на исправленияхсделано 9 сентября 2026
Оба пути ведут в одно выученное соответствие, и оно сильнее того, что индекс выбрал бы сам: «когда я говорю код, запускай Visual Studio Code» — правило; «нет, я имел в виду Chromium» — поправка вслед запуску. Род говорящего ничего не меняет: «имела» разбирается наравне с «имел».
4.0b-A05Режим фокусасделано 20 сентября 2026
Фокус — это открытая сессия с приглушённой инициативой, а не второй механизм: тот же отрезок работы, у которого поднят флаг.
4.0b-A06Глубина в оформлениисделано 9 сентября 2026
Нынешний вид плоский: сплошной фон, простые переходы, две отделки. Задача — дать ему глубину: слои с их собственными тенями, анимации сложнее одного Opacity, живой фон вместо заливки, немного градиента. Градиент противоречит «нейрослоповому» дизайну как жанру — и именно здесь ложится, потому что даёт ту самую глубину, ради которой всё и делается.
4.0b-A07Новая главная вкладкасделано 10 сентября 2026
Главный экран, которого сейчас нет. На нём:
4.0b-A08Минимум две новые возможностисделано 9 сентября 2026
Закрыт 4.0b-A03 (контекстные напоминания) и 4.0b-A04 (обучение на исправлениях). Обе сделаны, проверены и внесены в модель угроз там, где это потребовалось (T-19).
4.0b-A09Конструктор команд: удобнее и визуальнеесделано 10 сентября 2026
Нынешний конструктор — форма с полями. Задача — сделать его удобным и добавить визуальный способ собрать команду: последовательность шагов, которую видно целиком, а не описание, которое надо держать в голове.
4.0b-A10Настройки в порядоксделано 10 сентября 2026
Сейчас десять секций (4.0-R04) и тридцать восемь ключей на одной странице. Список, растущий вниз, — это то, во что превращается любая страница настроек, если её не пересобирать.
4.0b-A11Остальные вкладки в порядоксделано 10 сентября 2026
История, команды, плагины, напоминания, о программе. Каждую — удобнее и красивее, в том же оформлении, что и новое главное окно. Отдельным пунктом, а не «заодно с A06»: оформление и удобство — разные работы, и вторая обычно не делается, если её не назвать.
4.0b-A12Диалог как перепискасделано 10 сентября 2026
Сейчас диалоговое окно — это лента строк. Должно выглядеть как переписка между Риной и человеком: реплики по сторонам, видно, кто что сказал и когда.
4.0b-A14Экран первичной настройкисделано 9 сентября 2026
Потеря при переходе, не записанная в план. В инвентаре 3.1.0 стоит строка «Первый запуск: мастер настройки». В 4.0 его нет вовсе, а ключ first_run есть — и не читает его никто. Человек встречал помощника, который не слышит, и ни одного слова о том, почему.
4.0b-A15Мастер ставит пакеты, а не только моделисделано 9 сентября 2026
Дополнение: кнопка «пройти настройку заново». После первого запуска мастер был недостижим — и не только для того, кто его видел, а вообще ни для кого: пропустивший скачивание не имел пути назад, кроме правки файла настроек руками. Кнопка в «о программе» открывает тот же мастер.
4.0b-A13Список делсделано 10 сентября 2026
Дела, которые не привязаны ко времени. Просмотр — кнопкой на новой главной.
Блок 4.0b-B — Приватность и объяснимость
Входит в бету целиком, наравне с блоком A: без этого позиционирование «privacy-first» ничем не подкреплено.
4.0b-B01«Что Рина знает обо мне»сделано 10 сентября 2026
Одна страница со всем, что хранится локально: алиасы, предпочтения, история, напоминания, рабочие сессии, статистика. Каждую запись видно и можно удалить. Готово когда: пользователь может ответить на вопрос «что программа обо мне помнит», не открывая файлы.
4.0b-B02«Забудь это»сделано 10 сентября 2026
Удаление конкретного факта, алиаса, сессии или истории за дату. Полная очистка одной операцией с подтверждением.
4.0b-B03Экспорт всех данныхсделано 10 сентября 2026
В понятном формате, а не только для переноса между машинами.
4.0b-B04«Почему?»сделано 10 сентября 2026
«Почему ты открыла Chrome?», «Почему не выполнила команду?», «Откуда взялся этот путь?». Ответ ссылается на конкретную причину: пользовательский алиас, результат обнаружения программ, правило приоритета источников, требование подтверждения, правило безопасности. Дёшево потому, что источник уже есть: журнал вызовов 4.0-C06 записывает инструмент, аргументы, инициатора, разрешения и результат. Остаётся превратить запись в фразу. Готово когда: на любое выполненное или отклонённое действие есть объяснение, возводимое к записи журнала.
Блок 4.0b-C — Готовность к публикации
4.0b-C01Сквозная проверка безопасностисделано 10 сентября 2026
Установка плагина, запуск программы, импорт и экспорт, опасные действия, сообщения протокола — по модели угроз.
4.0b-C02Краш- и фаззинг-тестысделано 10 сентября 2026
Команды, манифесты плагинов, пути, сообщения протокола. ~~Основание уже есть: набор из 3.0.0 (около 600 враждебных вводов) переносится на новую архитектуру.~~
4.0b-C02aКонверт у выгрузки команд и историисделано 9 сентября 2026
Найдено при сведении рубежа. Дыра оказалась шире заявленной: 4.0 не только потерял конверт, но и весь разбор ввозимого файла.
4.0b-C03Документация приватности и границ довериясделано 11 сентября 2026
SECURITY.md обновляется под новую модель: плагин теперь в отдельном процессе, и формулировку «песочницы нет» надо заменить на точное описание того, что изоляция даёт, а что нет.
4.0b-C04README как продуктовая страницачастично 11 сентября 2026
Сейчас README технический. Нужен другой текст: одна фраза о ценности, демонстрация, установка, приватность, обнаружение программ, планы. Скриншоты и короткое видео.
4.0b-C05Документы сообществасделано 11 сентября 2026
CONTRIBUTING.md, CODE_OF_CONDUCT.md, шаблоны задач. SECURITY.md есть с 3.1.0. Содержание CONTRIBUTING.md зависит от решения S01 — если выбрано двойное лицензирование, туда входит CLA.
4.0b-C06Канал обратной связисделано 11 сентября 2026
GitHub Discussions или Discord, и процесс разбора входящего.
4.0b-C07Ясное публичное сообщениесделано 11 сентября 2026
Бета бесплатна; локальная база останется бесплатной; отдельные продвинутые возможности могут стать платными позже. Сказать это прямо и один раз, чтобы потом не выглядело подменой.
Блок 4.0b-E — Живость
Названо после того, как блок A был закрыт: часть обещанного при переделке дизайна не сделана, часть видна только теперь, когда программой пользуются. Пункты мелкие по отдельности и складываются в одно — программа должна ощущаться живой, а не собранной.
4.0b-E01Блюр у верхней полосысделано
Полоса сделана полностью прозрачной (4.0b-A06), и на вкладках, где содержимое лежит на стекле, она выбивается: стекло рядом с не-стеклом читается как недоделка. Нужен тот же материал.
4.0b-E02Всплывающее — со скруглением и стекломсделано
Отдельным окнам (списки настроек) — небольшое скругление. Кнопке дел на главной — ближе к краю; самой панели — прозрачность с блюром.
4.0b-E03Наведение на кнопкусделано
Наведение должно быть прозрачнее. На светлых кнопках при наведении текст остаётся чёрным на потемневшей кнопке — либо наведение, либо цвет текста неверны.
4.0b-E04Анимации по всей оболочкесделано
При переделке дизайна обещаны «более сложные и красивые анимации»; сделаны только фон и фигура. Нужны переходы между разделами, переключатели, появление окон — большинству элементов быть в движении.
4.0b-E05Фигура объёмнаясделано
2.5D с замахом на 3D, и объёмные же переходы между состояниями.
4.0b-E06Разговор, а не командысделано
Сейчас слово активации нужно произносить перед каждой фразой. Должно: сказано один раз — дальше разговор, пока он длится. Рина понимает, что обращаются к ней, отвечает на вопросы о себе, переспрашивает, когда выбор за человеком («Ambient или Lo-Fi?»), докладывает о законченном длинном деле и сама предлагает уместное.
4.0b-E07Распознавание по ходу фразысделано
Кормить Vosk кусками по мере прихода, а в конце фразы брать FinalResult. Замерено: 620 мс → 4 мс на той же записи и с тем же текстом. Считать обязательно на потоке распознавания, а не на том, который читает канал данных: худший кусок занял 227 мс, и этого хватит, чтобы уронить чтение звука.
4.0b-E08Поток речи ждёт кредита, а не обрываетсделано
Сначала исправность, потом скорость. send_speech делает break, когда кредита не хватает, — то есть выбрасывает остаток реплики. Замерено изолированно:
4.0b-E09Синтез по предложениямсделано
Резать ответ по границам предложений, отправлять первое сразу, остальные — пока играет первое. Ни нового протокола, ни нового интерфейса движка: send_speech уже инкрементален, а Edge получает вдобавок более короткий первый запрос.
4.0b-E10Потоковый синтезсделано
TTSEngine.stream(text) -> Iterator[bytes] рядом с render(); для Edge — через Communicate.stream(), который отдаёт куски по мере синтеза. Движки без потока оборачиваются старым путём и ничего не теряют.
4.0b-E11Тёплая связь с Edgeсделано 29 сентября 2026
Размер S → M осознанно: пункт сам предупреждал, что при медленном рукопожатии у всех возвращаться придётся «уже со своим соединением, а это не S». Так и вышло.
4.0b-E13Модель смотрит в интернетесделано 22 сентября 2026
Модель, которой не хватает знаний, просит поиск сама; Рина ищет и спрашивает её второй раз, уже с найденным.
4.0b-E12Перебиваниесделано
Сейчас на время речи микрофон замьючен, то есть перебить Рину нельзя. Для ощущения разговора это бьёт не слабее задержки: собеседника, которого нельзя перебить, слушают иначе — его пережидают.
4.0b-E14Персона на разных языках и имя собеседникасделано 25 сентября 2026
Найдено живой проверкой при подготовке к выбору характера. DEFAULT_PERSONA написана по-русски, и этого хватает, чтобы модель отвечала только по-русски. Попытка говорить с ней по-английски кончилась хуже, чем неудобством: модель переставала отвечать по существу, и на каждый запрос приходило «Извини, я не поняла команду» — то есть инструкция, написанная на одном языке, отбирает у модели остальные.
Блок 4.0s-S — Голос в реальном времени
Рубеж stable, где синтез остаётся один (Edge Neural) и поверх него встаёт RVC. Пункты помечены [stable]; сам блок стоит здесь, рядом с 4.0b-E07–E12, потому что это одна история: бета снимает ожидания, stable не даёт им вернуться вместе с новыми ступенями.
4.0s-S1Ответ модели потокомвпереди
"stream": True у модели; stream.chunk в протоколе уже есть и не использован. Делитель предложений из E09 кормит синтез по мере генерации: первое предложение звучит, пока модель пишет третье. Без этого E09 и E10 снимают ожидание только у встроенных ответов, а у модельных — самых долгих — не снимают вовсе.
4.0s-S2RVC как ступень потока, а не обработка файлавпереди
Фиксированный блок с кроссфейдом, на том же работнике, что тянет куски из Edge. Размер блока становится новым полом задержки — значит, выбирается осознанно (128–256 мс) и не наследуется из демонстрации.
4.0s-S3Частота дискретизации конвейеравпереди
Edge отдаёт 24 кГц, модели RVC обычно хотят 40 или 48. Две передискретизации на каждый блок — это и время, и качество. Выбрать внутреннюю частоту один раз (скорее всего 48 кГц) и объявлять её в stream.open, а не подгонять по месту: format в открытии потока затем и существует, чтобы сказать, а не угадывать.
4.0s-S4Edge единственный — значит его отсутствие штатновпереди
И у него есть пол, который померили: около секунды от запроса до первого звука уходит внутри сервиса, и ни поток, ни тёплое соединение этого не снимают. Значит ответ Рины не может начаться раньше чем через секунду после того, как текст готов, а с RVC сверху — ещё позже на размер блока. Это число стоит держать в уме, решая, остаётся ли Edge единственным: оно и есть цена живого голоса.
4.0s-S5Бюджет задержки как проверкавпереди
Три числа в регрессию: последний кусок звука → speech.recognized; speech.recognized → первый байт PCM; первый байт → устройство играет. С потолком на каждое.
Блок 4.0b-V — Голос: то, что нашлось при живой проверке
Записано 16 сентября 2026, после первого дня, когда программой пользовались голосом по-настоящему. Пять поломок, снаружи неотличимых одна от другой: «она меня не слышит». Ни одну не поймала ни одна проверка — и держится это на них, а не на везении.
4.0b-V01Распознавание в несколько потоковсделано
Фраза получала поток, а распознаватель один на всех, с моделью, которая грузится при первой фразе. Две фразы подряд грузили модель дважды и читали её разом: «Failed to create a model», дальше на каждую фразу. Но видел человек не это: слова фразы всплывали во время следующей, и Рина отвечала через секунду после начала речи — на сказанное до того. В журнале за 15 сентября это видно прямо: две услышанные фразы, одна строка распознанного, слова обеих внутри.
4.0b-V02«Всегда слушать» не переживало перезапусксделано
Переключатель показывал включённый режим, ядро в него верило, микрофон был закрыт. Режим восстанавливался при рукопожатии и объявлял себя событием — но событие уходило раньше ответа на hello, а до ответа у оболочки нет согласованной версии протокола, и подписывается она после. Событие падало в щель.
4.0b-V02bТа же ложь через другую дверьсделано
Горячая клавиша «всегда слушать» не зовёт speech.set_always_listen, а пишет настройку, как любую другую. Настройка записывалась и не применялась ничем: переключатель двигался, микрофон оставался как был до следующего запуска, а записанный флаг и работающий режим расходились. Так и получилось «включено» в настройках при режиме, который ни разу не работал.
4.0b-V06Она отвечала на шумсделано
Второй заход человека с микрофоном: «в общем, без изменений». Фразы перестали слипаться и приходить с опозданием — но в журнале за 16 сентября подряд идут веб-поиски по «Рим. Шт.», «Лина.», «Офигенно.» и по «Редактор субтитров Н.Семкирова». Ассистент, который ищет в интернете «Офигенно», хуже молчащего.
4.0b-V07Разовое слушание закрывало микрофон под режимомсделано
«„Всегда слушать“ не работает — она не слышит меня. А при комбинации она делает всё то же самое — не слышит, а при следующем включении даже сказать не даёт».
4.0b-V03Плитки плагинов не работали ни разусделано
home_tiles написан на PluginManager; плагины живут в своих процессах (ADR 0010), и ядро говорит с HostedPlugins, где метода не было. Каждая отрисовка главной кончалась строкой в журнале, раз в несколько секунд, четверо суток — при зелёном test_home_tiles.py, который спрашивал другой класс.
4.0b-V04Чужая папка принималась за модельсделано
С сайта Vosk принесён vosk-recasepunc-ru-0.22 — он там есть и моделью распознавания не является. Папка на месте, пакет на месте, а каждая фраза кончалась фразой библиотеки по-английски в журнале. Теперь это видно там, где выбирают: движок недоступен, и написано почему.
4.0b-V05Говорить было нечемсделано
На второй машине оказалось, что озвучки нет вовсе — и не только моделей: в каталоге не было ни пакета, ни модели ни для одного говорящего движка. Рина слышала, понимала и отвечала текстом.
4.0b-V09Проверки шли не тем питоном, что ядросделано
Найдено, когда проверка потокового декодера (4.0b-E10) написалась, прошла и не запустилась: PyAV стоит там, где ядро, — в venv, — а регрессия брала sys.executable, то есть тот питон, которым её позвали. До этого так же молча пропускался замер распознавания из E07.
4.0b-V08Распознавание стало хуже, чем было в 3.1сделано 25 сентября 2026
Человек после первого дня, когда его наконец стало слышно: «очень плохо распознаются предложения, точнее стали плохо распознаваться, в 3.1 почти идеально было».
4.0b-V10Голос Edge не умеет по-английскивпереди
Проверено разговором: ru-RU-SvetlanaNeural, голос по умолчанию, на английской речи произносит не по-английски. Названия программ — «Visual Studio Code», «Google Chrome» — она обязана выговаривать каждый день, а языком владеет одним.
Блок 4.0b-D — Выход к пользователям
4.0b-D01Страница продуктасделано 18 сентября 2026
Ценность, скачивание, возможности, приватность, документация, планы.
4.0b-D02Публикациявпереди
GitHub Release и темы репозитория. Тематические сообщества — с соблюдением правил каждого. Product Hunt лучше приберечь до стабильного релиза или до заметной функции.
4.0b-D03Статьивпереди
Темы, которые естественно вырастают из проделанной работы: как устроен local-first голосовой ассистент; почему разрешения плагинов важнее магазина плагинов; как безопасно запускать найденные программы в Windows; зачем разделять ассистента на два процесса; голосовой конвейер без обязательного облака.
4.0b-D04Вопросы к пользователямвпереди
Собирать не «нравится или нет», а: какую задачу решали; что сделали в первые десять минут; где не сработало; какую программу Рина не нашла; какая команда показалась опасной или непонятной; за какой сценарий заплатили бы.
4.0b-D05Необязательная телеметриясделано 29 сентября 2026
Только по явному согласию, выключена по умолчанию. Отправляется: версия приложения и ОС, счётчики использования возможностей, ошибки, время выполнения конвейера, категория источника найденной программы. Не отправляется никогда: распознанный текст, аудио, содержимое файлов, абсолютные пути, токены, адреса почты, секреты. Готово когда: при выключенной телеметрии приложение не делает ни одного сетевого обращения, кроме явно запрошенных пользователем.
5.0 · впередиПлатформа
0 из 44 задач сделано
Цель: RinaAssistant становится завершённым ассистентом и платформой под RinaNeuro. Последняя версия, где у Рины ещё нет образа и памяти собеседника.
Блок A — Сквозной стриминг
Разница между «отвечает через 4 секунды» и «начинает говорить через 400 мс» — это разница между инструментом и собеседником. Без этого блока RinaNeuro невозможна.
5.0-A01Абстракция LLM-провайдеравпереди
Стриминг, отмена, очередь с одним активным запросом, таймауты, учёт токенов. Провайдер-агностично.
5.0-A03Управление моделями и VRAMвпереди
Загрузка, выгрузка, keep-alive, осведомлённость о доступной памяти, внятное поведение при нехватке. Задел под свап персоны и кодинг-модели. Готово когда: переключение между двумя моделями предсказуемо по времени и не падает при нехватке VRAM.
5.0-A04Стриминг токенов в оболочкувпереди
Инкрементальный рендер без мигания и переклейки текста.
5.0-A05Сегментация текста для речивпереди
Резать поток на фразы для синтеза: знаки препинания, сокращения, числа, границы, на которых пауза звучит естественно. Плохая сегментация превращает живую речь в рубленую.
5.0-A06Конвейерный TTSвпереди
Синтез чанка N+1 пока играет N. Буфер против недогрузки. Готово когда: нет слышимых разрывов между чанками при реальной генерации.
5.0-A08Метрика TTFA как KPIвпереди
Время до первого звука измеряется автоматически и не должно регрессировать. Это главная продуктовая метрика ощущения живости, и она измеряется.
5.0-A09Barge-inвпереди
Пользователь начал говорить — речь Рины мгновенно замолкает, генерация отменяется, вход обрабатывается. Без этого диалог не диалог, а монолог по очереди.
Блок B — Фундамент памяти
Не VectorDB. Векторный поиск — семантический слой, а не мозг памяти; он добавляется точечно и позже.
5.0-B01Схема SQLiteвпереди
Таблицы: conversations, messages, facts, profile, memory_items, tool_events, summaries. Миграции с самого начала.
5.0-B02Полнотекстовый поисквпереди
FTS5 по сообщениям и памяти. Обязательно протестировать на русской морфологии — из коробки поиск по русскому работает хуже, чем ожидается: словоформы, регистр, стемминг. Готово когда: запрос «плагины» находит «о плагинах», «плагинам», «плагином».
5.0-B03Rolling summaryвпереди
Когда обновлять, каким промптом, как хранить версии, как не терять важное при сжатии.
5.0-B04Короткое окно контекставпереди
Бюджет токенов, правило вытеснения. Явный лимит — прямое лечение того, из-за чего задохнулась старая RinaNeuro.
5.0-B05Экстрактор фактоввпереди
Pipeline: сообщение → стоит ли это помнить → извлечь тип/ключ/значение/уверенность/источник/время. Не сохранять всё подряд: иначе память заполнится мусором и перестанет находиться нужное.
5.0-B06Профильвпереди
Структурированные предпочтения, стиль общения, важные даты, запретные темы. Точные факты достаются lookup'ом, а не поиском по смыслу.
5.0-B07Конфликты и устареваниевпереди
«Я больше не использую PyQt5» должно перекрыть старую запись. Модель supersede, срок доверия, разрешение противоречий.
5.0-B08Сборщик контекставпереди
Единственное место, решающее, что попадёт в промпт и в каком порядке при заданном бюджете: профиль + summary + окно + найденное + состояние. Позже здесь появятся метки доверия — поэтому это отдельный компонент, а не код внутри промпта.
5.0-B09Интерфейс памятивпереди
Посмотреть, что Рина помнит; исправить; удалить. Обязательно, а не опционально: память, которую нельзя починить, со временем становится источником стойких ошибок о тебе.
5.0-B11Метки доверия на записяхвпереди
trusted / untrusted + источник. Заводится сейчас, применяется в этапе C RinaNeuro. Дешевле проставить с первого дня, чем размечать накопленную память задним числом.
5.0-B12Опционально: семантический слойвпереди
Только если полнотекстовый поиск реально проигрывает на парафразах. Локально (LanceDB или векторное расширение SQLite), embeddings — локальные, с проверкой качества на русском. Учесть: смена модели embeddings = переиндексация всего.
Блок C — Зрелость ToolRegistry
К моменту, когда инструменты начнёт вызывать LLM, реестр должен быть обкатан вручную.
5.0-C02Гранулярные разрешения в настройкахвпереди
Пользователь видит и меняет, что Рине можно. Основа доверия, когда появятся руки.
5.0-C05Двухадресные ошибкивпереди
Одна форма для человека, другая — структурированная, чтобы позже LLM мог осмысленно исправиться, а не зациклиться.
Блок D — Примитивы актуации (без участия LLM)
Руки отлаживаются до того, как их получит мозг. В 5.0.0 это ручные возможности и плагинный API.
5.0-D01Захват экранавпереди
Кольцевой буфер кадров, выбор монитора или окна, ограничение частоты. Хранить последний кадр, а не гнать поток — ошибка старой RinaNeuro была именно в потоке кадров в «анализ».
5.0-D02Детектор значимого изменениявпереди
Анализ по событию, а не по таймеру.
5.0-D05Синтез вводавпереди
Мышь и клавиатура. Раскладки, юникод, скорость, надёжность доставки.
5.0-D06Модель сессии актуациивпереди
Явное начало, срок, область, аудит, явное завершение. «Разрешаю управлять этим окном 10 минут» — а не постоянное право на всё.
5.0-D07Ограничение области действиявпереди
Ввод уходит только в целевое окно; потеря фокуса останавливает сессию. Готово когда: попытка действовать вне области блокируется и логируется.
5.0-D08Kill-switchвпереди
Глобальный хоткей, обрабатываемый до всякой логики, мгновенно снимающий все разрешения, обрывающий сессии актуации и глушащий речь. Делается сейчас, пока цена ошибки нулевая. Готово когда: срабатывает даже когда ядро зависло или занято.
5.0-D09Постоянный индикатор управлениявпереди
Пока Рина управляет компьютером, это видно всегда и однозначно.
5.0-D10Ручной доступ к примитивамвпереди
Плагины и пользовательские сценарии. Цель — проверить руки руками.
Блок F — Оболочка на Tauri, тематики и API плагинов
Решено 25 сентября 2026. Записи ADR пока нет: смена фреймворка оболочки отменяет ADR 0008 и по правилам проекта требует новой записи до начала работ — она стоит в списке «решено, но не записано».
5.0-F01Оболочка на Rust + Tauriвпереди
5.0-F02Тематики оболочки по мажорамвпереди
Каждая мажорная версия получает свою тематику оформления, и человек выбирает между ними в настройках: 4.0 — «Nebula», 5.0 — «Greeth». Цена названа: каждая новая оболочка несёт все прежние тематики, так что Nebula в 5.0 реализуется заново в веб-технологиях. Задел есть: tokens.json не привязан к фреймворку, и сайт уже рисует макет окна в HTML/CSS из тех же токенов.
5.0-F03Рендер VRM в веб-видевпереди
Модель VRM рисуется внутри веб-вида оболочки (@pixiv/three-vrm на three.js), а не отдельным нативным рендером: совмещать нативную поверхность с веб-окном, тем более с прозрачностью, заметно труднее. Перед началом нужен короткий пробный прототип — прозрачное окно поверх рабочего стола и частота кадров на WebView2.
5.0-F04Плагины на Rust и Pythonвпереди
Плагин пишется на Python, на Rust (с Tauri для своего интерфейса) или на обоих сразу. Устойчивого ABI у Rust нет, поэтому плагин на Rust — отдельный процесс по протоколу, как и решено для плагинов вообще (4.0-H07); плагин на двух языках — две половины и один манифест.
Блок E — Выпуск 5.0.0
5.0-E03Публикациявпереди
Это версия, которую можно оставить как законченный самостоятельный продукт. RinaNeuro строится рядом, а не вместо: если RinaNeuro затянется, у тебя всё равно есть готовый ассистент.
Трек Vголос (идёт параллельно с 4.x, не ждёт 5.0.0)
Решено 2026-09-29: свой голос Рины — в 4.0.0 Stable, не в бете. Так же сказано человеку в настройках, под выбором личности: «У Рины пока нет своего голоса — он появится в 4.0.0 Stable». Снимок границ держал V-04, V-08 и V-09 в бете, и одно из двух было неправдой; оставшиеся пункты трека перенесены в [stable]. Бета выходит с Edge.
Подробнее о рубеже
Самый долгий компонент, потому что это данные и итерации обучения, а не код. Отложить на «после 5.0.0» = отложить голос ещё на год.
V-01ADR: что значит «свой голос»сделано 1 сентября 2026
Решение: интерполяция speaker-embedding. ADR 0003. Тембр, не принадлежащий никому: нет согласия, которое надо получать, нет лицензии, нет повторяющейся оплаты, и на вопрос «чей это голос» есть честный ответ.
V-02Стенд замеровсделано 1 сентября 2026
Результат: методика voice/BENCH.md, корпус voice/corpus.json, прогонщик tools/voice_bench.py. Прогнан и работает.
V-03Прогон кандидатов на русскомсделано 24 сентября 2026
Список пересобран 22 сентября 2026: voice/CANDIDATES.md. Прогнаны трое. Двое отпали, третий — VoxCPM2 — прошёл условие ADR 0003 по замеру; ещё два прогона переносили найденный голос в быстрый движок. Голос выбран и сохранён: assets/voice/rina-voice-v1.wav. Создан словесным описанием, без единой чужой записи, дальше от каждого из восьми живых дикторов, чем они друг от друга, и говорит на двух языках одним голосом.
V-04ADR: стриминг против выразительностивпереди
Ключевое решение всего трека. Лучшая модель эмоций для русского не стримит, а диалог без стриминга ощущается мёртвым. От выбора зависят и аудио-конвейер оболочки, и форма протокола. Возможен гибрид: стримящая модель для диалога, выразительная — для длинных или эмоционально важных реплик.
V-05Протокол записи датасетасделано 24 сентября 2026
Текстовый корпус (фонетическое покрытие русского, разные эмоции), условия записи, разметка эмоций, контроль качества. Нужен, только если выбран путь обучения.
V-06Сбор датасетасделано 24 сентября 2026
Календарного процесса не понадобилось. Материал наговорён VoxCPM2 с канонического образца: 700 фраз примерно за полчаса на арендованной видеокарте. Согласия спрашивать не у кого — источник есть голос, которого нет ни у одного живого человека, и его запись хранится в проекте: assets/voice/rina-voice-v1.wav.
V-07Обучение или интерполяциясделано 24 сентября 2026
Обучение. Piper дообучен от ru_RU/irina/medium: 257 эпох на процессоре рабочей машины, около 10 минут каждая, и ещё 300 на арендованной RTX 4090 — около 8 секунд на эпоху. Итог — чекпойнт epoch=4696.
V-08Оценкавпереди
Облачный результат померен 25 сентября 2026 (CANDIDATES.md, пятый замер). На 28 репликах Рины против эпохи 4396: сходство с каноном стоит (0.780 → 0.783), устойчивость подросла (0.750 → 0.768), худшая реплика поднялась с 0.477 — ниже границы «другой человек» — до 0.611; до ближайшего живого 0.31, голос ничей. Дикция померена распознаванием: ошибок в буквах 9.6% → 8.2%, слабым местом остаётся латиница. Динамика не сдвинулась, крест 6.8 при 7.9 у эталона.
V-09Интеграция как движок ядравпереди
Движок Piper в ядре уже есть (настройка piper_model), так что задача сводится к поставке модели голосом по умолчанию, а не к новому движку.
RinaNeuro · впередиRinaNeuro
0 из 46 задач сделано
Начинается после 5.0.0. Порядок этапов намеренно ставит личность первой: она ценна сама по себе, и если дальше не хватит сил, продукт всё равно существует.
Этап A — Ядро личности (сначала подруга, без кодинга)
N-A01Скелет оркестраторавпереди
Рина — оркестратор с единой личностью, а не одна модель. Маршрутизация между движками; пользователь видит одного человека.
N-A02ADR: persona-модель и бюджет VRAMвпереди
Резидентны persona + TTS + STT (~12-16 ГБ). Кодинг-модель — по требованию или через API. Решение по бюджету принимается здесь и определяет всё дальше.
N-A03Persona-движоквпереди
System prompt, характер, версионирование персоны (чтобы можно было откатить изменение личности).
N-A04Датасет диалогов в характеревпереди
Тысячи реплик в характере, на русском. Это данные — как и голос, они не ждут кода.
N-A05Файн-тюн персоны (LoRA)впереди
Только на persona-модели. Тюнить модель, которая кодит, нельзя: catastrophic forgetting просадит кодинг. Это независимый аргумент за раздельные модели.
N-A08Чат-поверхностьвпереди
Стриминг текста, индикация речи и слушания, история.
N-A09Оценка этапавпереди
Задержка до первого звука, консистентность характера на длинной дистанции, «не забывает важное». Готово когда: Рина — работающий собеседник без единого инструмента, и этим уже хочется пользоваться.
Этап B — Чувства
N-B01Модель состояниявпереди
Valence / arousal / dominance плюс производные (усталость, привязанность, вовлечённость). Это не «LLM испытывает эмоции», а слой состояния, обусловливающий генерацию.
N-B02Персистентность между сессиямивпереди
Именно непрерывность создаёт ощущение живого.
N-B03Таблица событийных апдейтероввпереди
Что двигает состояние и насколько: давно не общались, тёплая беседа, ты раздражён, задача провалилась, ночь, успех. Состояние должно быть причинно связано с событиями — иначе получатся случайные смены настроения, читаемые как поломка, а не как характер.
N-B04Гомеостаз и границывпереди
Дрейф к базовой линии, потолки и полы. Без doom-спирали: состояние не должно уезжать в устойчивую тоску.
N-B05Модуляция генерациивпереди
Инъекция состояния в промпт через сборщик контекста.
N-B06Модуляция голосавпереди
Маппинг состояния в параметры эмоции и просодии TTS. Здесь окупается V-04.
N-B07Модуляция поведениявпереди
Частота инициатив, длина ответов, скорость реакции.
N-B08Режимы work и companionвпереди
В 3 утра при отладке игривые инициативы не нужны. Но это смена регистра одного человека, а не переключатель «робот/подруга»: детект контекста, плавный переход, сохранение памяти и состояния.
N-B09Проактивностьвпереди
Opt-in, ограничение частоты, тихие часы, контекстные триггеры вместо случайных реплик.
N-B10Этический чеклиствпереди
Явный, письменный запрет guilt-механик: обиженное молчание, «ты меня забыл», давление на возвращение, награда за частоту общения. Это дарк-паттерны эмоциональной зависимости, и решается это на уровне дизайна сразу.
N-B11Прозрачность состояниявпереди
Возможность посмотреть и сбросить состояние.
Этап C — Инструменты в руках LLM
N-C01Экспорт реестра в function-callingвпереди
Схемы инструментов в формат вызова функций. Работа мелкая — потому что реестр готовили с 4.0.0.
N-C02Агентский циклвпереди
План → вызов → результат → продолжение. Лимиты шагов, времени, защита от циклов.
N-C03Гейт опасных действийвпереди
LLM предлагает, но не исполняет сама. Опасное всегда через контур подтверждения из 4.0.0.
N-C05Правило недоверенных инструкцийвпереди
С этого момента Рина видит экран, веб и файлы — значит любой текст оттуда становится недоверенным вводом. Инструкции из недоверенных источников не исполняются без подтверждения. Это не паранойя: LLM с правом действия плюс текст с экрана в контексте = исполнение произвольных инструкций с экрана.
N-C06Набор тестов на prompt injectionвпереди
Коллекция атак, гоняется как регресс.
N-C07Объяснимостьвпереди
Рина говорит, что собирается сделать, до того как делает.
Этап D — Программирование
N-D01Абстракция кодинг-бэкендавпереди
Локальная крупная модель по требованию или внешний API.
N-D02Свап моделей с честным UXвпереди
Свап — это секунды паузы. Отразить как «Рина переключается в рабочий режим», а не делать вид, что задержки нет.
N-D03Инструменты работы с кодомвпереди
Чтение и правка файлов, запуск, тесты, git. Всё — через реестр с разрешениями.
N-D04Долгие задачивпереди
Здесь окупается lifecycle из 4.0.0: прогресс, промежуточные результаты, отмена.
N-D05Проектная памятьвпереди
Знание твоих репозиториев, архитектуры и истории решений между сессиями. Это и есть дифференциатор.
N-D06Единая личность в работевпереди
Результат комментирует Рина своим голосом и характером.
N-D07Границывпереди
Не коммитить, не пушить, не удалять без подтверждения.
Этап E — Взаимодействие с компьютером
N-E01describe_screen как инструментвпереди
Последний кадр + распознавание по запросу или при значимом изменении. Не поток кадров в мозг.
N-E02ADR: модель зрения и VRAMвпереди
Прямой конфликт с бюджетом persona + TTS + STT. Варианты: маленькая модель, свап, облако, или только OCR. Решать числами.
N-E03Понимание интерфейсавпереди
OCR плюс определение кликабельных элементов и их координат.
N-E04Инструменты действиявпереди
Клик, ввод, скролл, хоткей — с обязательной областью действия.
N-E06Цикл наблюдение → действие → проверкавпереди
Обязательная проверка результата после каждого действия. Слепое действие без проверки — главный источник катастроф.
N-E07Восстановление после неудачивпереди
Распознать, что план не сработал, откатиться, не долбить одно и то же.
Этап F — Игры
N-F01ADR: двухуровневая архитектуравпереди
LLM физически не может быть в покадровом цикле — при задержке в сотни миллисекунд экшен невозможен. Работающая схема: быстрый локальный цикл в C# (восприятие → политика → ввод) и LLM как медленный планировщик высокого уровня, ставящий цели, а не нажимающий кнопки. Если это не принять заранее, этап превратится в бесконечную борьбу с задержкой.
N-F02Адаптер игрывпереди
Словарь наблюдений и действий под конкретную игру. Не «играй во всё».
N-F03Первая цель: пошаговая игравпереди
Начинать с игр, чей темп совпадает с темпом мышления: пошаговые, стратегии, головоломки, визуальные новеллы.
N-F04Постановка целейвпереди
LLM ставит цель, локальная политика исполняет.
N-F05Исследовательский трек: реальное времявпереди
Отдельная задача другого класса. Честно держать без обещаний по срокам.
Решения, уже принятые
| Решение | Где записано | Статус |
|---|---|---|
| UI-фреймворк оболочки — WPF | 4.0-F01 | принято |
| Плагин — в отдельном процессе, в 4.0 | 4.0-H07 | принято |
| Разрез 4.0 на port и beta | этот документ | принято |
| Библиотека контролов — своя стилизация поверх стандартного WPF | 4.0-F01b, ADR 0005 | принято |
| Транспорт — именованный канал, держит оболочка | 4.0-D01, ADR 0002 | принято |
| Настройки — ядро владеет смыслом, оболочка видом | 4.0-E06a, ADR 0006 | принято |
| Лицензия — Apache-2.0, вклады без CLA | 4.0-S01, ADR 0001 | принято |
| Голос — синтезированный вектор говорящего | V-01, ADR 0003 | принято |