Releases: stas130286-blip/dsh-brainagent
Release list
v0.9.19 — фильтрация шумных корреляционных инсайтов
Исправлено
- Корреляционные инсайты больше не рождаются из структурного шума. Все модули получают одну и ту же награду одновременно (credit assignment делится поровну), поэтому попарная корреляция наград всегда была r=1.00 — чистой формальностью. Такие пары теперь пропускаются, и память не заполняется записями вида «Modules X and Y are strongly correlated (r=1.00)», которые не несут информации и могли становиться поводом для автономной инициативы агента.
- Реально расходящиеся модули (включая анти-корреляции) по-прежнему отслеживаются.
Добавлено
correlation-insights.test.ts: синхронные одинаковые награды не дают инсайтов; антифазные модули дают.
Проверки
- tsc --noEmit — чисто
- 862/862 тестов зелёные (58 файлов)
- L3 security review — 0 замечаний
Эта версия завершает тройку источников шума: ложные «Language mismatch» (v0.9.17), проактивные сообщения сразу после пользователя (v0.9.18), мусорные r=1.00 инсайты (v0.9.19).
v0.9.14 — качество процедурной памяти, кросс-сессионный recall, пэйсинг в плагине
Highlights (v0.9.10 → v0.9.14)
- Cross-session recall fixed (v0.9.12): top user_info facts are pinned into every recall + explicit Memory-Usage instructions — the agent no longer answers “I don't know you” to «что ты знаешь обо мне?».
- Goal-round pacing built into the plugin (v0.9.11): no more host source patching needed; armed host goals are paused/resumed through public seams only.
- Procedural memory quality (v0.9.13–v0.9.14): only real multi-step procedures are stored, placeholder steps are filtered, and duplicate procedures (LLM trigger paraphrases) are merged — including cleanup of already-accumulated junk at startup.
- Long time-reminders fixed (v0.9.10): “remind me in a month” goals no longer expire silently.
Battle-tested live in the dsh Web UI: cross-session memory recall, timed reminders with autonomous delivery, procedural dictation → reuse in a fresh session, prompt-injection refusal. 850/850 tests, errors: {}.
Install:
npx @deepseek-ai/dsh plugin --profile web add github:stas130286-blip/dsh-brainagent
npx @deepseek-ai/dsh web0.9.14 - 2026-08-25
Дедупликация процедур по набору шагов.
- Дедупликация по отпечатку шагов (storeWorkflow): записи с одинаковым набором шагов сливаются, даже если LLM сформулировал триггер иначе (боевой тест v0.9.13: идентичная диктовка создала вторую запись из-за парафраза триггера).
- Слияние накопленных дублей при старте (
mergeDuplicateWorkflows): оставляет самую используемую запись, суммирует usageCount, берёт лучший successRate; идемпотентно. - Тесты: +4 (846 → 850), все проходят.
0.9.13 - 2026-08-25
Качество процедурной памяти: стор больше не засоряется «псевдопроцедурами».
- Гейт сохраняемости (
isStorableProcedure): в стор попадают только процедуры с ≥2 реальными уникальными шагами. Одиночные команды («Action: ANY», «Действие: напоминание») больше не сохраняются — в боевом сторе 14 из 16 записей были таким мусором. - Фильтр шагов (
isMeaningfulStep): плейсхолдеры («...», «any», «шаг 1», «TODO») и повторы триггера отбрасываются и в regex-, и в LLM-извлечении. - Промпт LLM-извлечения: шаги берутся только из текста сообщения (без выдумывания); одиночная команда без последовательности — не процедура.
- Чистка стора при старте (
pruneWeakWorkflows): слабые записи (<2 содержательных шагов) удаляются из процедурного стора и векторного индекса; вызывается в инициализации плагина, идемпотентна. - Тесты: +15 (831 → 846), все проходят.
0.9.12 - 2026-08-25
Память о пользователе больше не теряется на вопросе «что ты знаешь обо мне?».
Боевое тестирование перед заявкой в registry выявило: инъекция памяти
работает (метрики), но модель отвечала «я ничего не знаю о тебе» или
вспоминала 2 из 3 фактов. Две причины, обе закрыты:
- Recall чисто релевантен: identity-факты (имя и т.п.) могли не попасть
в top-N при лексическом fallback (эмбеддинг-бэкенд недоступен).
Теперь топ-3 user_info-факта по confidence закрепляются в начале
semantic-recall каждого цикла (memory-identity.ts, pinIdentityFacts)
и попадают в секцию Known Facts независимо от запроса. - Инструкции противоречили друг другу: Honesty Rules требовали «честно
сказать, что не помнишь», и модель отказывалась от уже влитых фактов.
Добавлен блок Memory Usage («факты выше — твоя реальная память,
используй их уверенно»), правило честности уточнено: отрицать можно
только то, чего в блоке фактов нет.
+8 тестов: 831 тест.
0.9.11 - 2026-08-25
Пейсинг гол-раундов встроен в сам плагин.
Реестровая версия dsh-goal-round-driver не имеет пейсинга: armed-цель
хоста получает инжект раунда при каждом переходе агента в idle
(несколько автономных раундов в минуту). Раньше это лечилось патчем
исходников моно-репо (host-patches/), который на npx/registry-установках
не работает. Теперь пейсер живёт внутри плагина (goal-round-pacer.ts),
используя только публичные швы хоста:
- перехватывает
agent/inbox/insertedи снимает преждевременные раунды
(source.kind === "goal", round > 0) из inbox; - ставит цель на паузу сервисом целей и возвращает её по истечении окна
тишины — раунд откладывается, а не теряется; - окно:
DSH_GOAL_ROUND_MIN_IDLE_MS(по умолчанию 180000 мс; 0 — выключить); - корректен и на уже пропатченном хосте (двойной пейсинг безвреден).
+18 тестов: 823 теста. На собственные цели BrainAgent не влияет — они
живут в отдельном сторе и доставляются планировщиком goal-reminder.
0.9.10 - 2026-08-25
Напоминания «через месяц» больше не умирают в тишине.
Два боевых дефекта долгих time-напоминаний, найдены живым тестом
на переустановленном dsh:
- TTL time-цели был фиксированным (дефолт 24ч) — цель «напомни
через месяц» молча истекала задолго до триггера. Теперь при
экстракции TTL time-цели вычисляется как время до триггера- час буфера (но не меньше дефолтного TTL) — goal-stack.ts.
- hasGoalIntent не ловил форму «Поставь мне напоминание…» и
краткое «напомни» без «мне» — экстракция целей не запускалась,
и модель лишь обещала напоминание, не создавая цель. Паттерн
расширен (поставь напоминание / напоминание на|через|о|об|про /
напомни(те)( мне)? / remind).
Проверено вживую: 3-минутный таймер, поставленный в сессии A,
сработал в другой сессии B (доставка pickAgent по последней
активности); месячная цель создана с триггером +31 день и TTL 745ч.
+4 проверки (goal-intent.test.ts): 805 тестов, 52 файла.
v0.9.9 — напоминание может действовать (инструменты по времени)
Что нового
Напоминание может не только напоминать, но и действовать.
Уточнение правила из v0.9.8: запрет касается только самодельных
таймеров. Когда время настало, агент вправе полностью выполнить то,
о чём просил пользователь — включая запуск инструментов
(«запусти проверку диска в 9:00»). Ожидание ведёт внутренний
планировщик, само действие — агент.
Изменения
prefrontal-cortex.ts: в секции## Remindersдобавлена строка
«When the reminder time arrives... including using your tools».
Проверка
- 805 unit-тестов, 52 файла (+1: prefrontal-context.test.ts)
- Боевые тесты: память между сессиями работает (факт о сервере
«Атлас» вспомнен в новом чате), напоминание доставляется
в самую свежую активную сессию, дублей нет.
Установка
# из корня monorepo dsh — патч хоста применится автоматически
pnpm install
# либо в существующей копии brainagent:
node host-patches/apply-goal-round-pacing.cjs [путь-к-dsh]v0.9.8 — фикс дубля напоминаний (боевой тест)
Что нового
Фикс дубля напоминаний — найдено боевым тестом.
На «напомни через 3 минуты» напоминание приходило дважды:
сначала от внутреннего планировщика BrainAgent, потом ещё раз
от таймера, который модель завела сама (фоновая Pwsh-задача).
Каждый дубль — отдельный LLM-вызов и лишние деньги.
Теперь в контекстном блоке каждого цикла есть секция ## Reminders:
напоминание уже ведёт внутренний планировщик, собственные таймеры,
sleep-команды и фоновые задачи для напоминаний запрещены.
Изменения
prefrontal-cortex.ts: секция## RemindersвassembleContext—
входит в каждый контекстный блок (~25 входных токенов, кэшируются).
Проверка
- 804 unit-теста, 52 файла (+2 новых: prefrontal-context.test.ts)
- Бандл: 629.4kb, smoke-прогоны OK
- Боевой тест: память («Атлас»/IP вспомнил), эмпатия, ориентация
во времени (вторник, 25 августа) — всё отработало.
Установка
# из корня monorepo dsh — патч хоста применится автоматически
pnpm install
# либо в существующей копии brainagent:
node host-patches/apply-goal-round-pacing.cjs [путь-к-dsh]v0.9.7 — напоминания звонят и в тишине; патч хоста ставится сам
Что нового
Напоминания по времени теперь реально звонят — даже в тишине.
Раньше «напомни через 10 минут» никогда не срабатывало, пока пользователь
молчал: time-цели проверялись только внутри Vital Impulse по сигналам шины,
а фоновый тик был убран ради анти-спам-борьбы. Теперь напоминания проверяет
отдельный фоновый таймер (по умолчанию раз в 30 с).
Патч хоста ставится сам. Анти-спам-патч goal-round-driver
(host-patches/) применяется автоматически при установке пакета
(postinstall) — отдельный ручной шаг больше не нужен, забытый патч
не сломает агента.
Изменения
goal-reminder.ts(новый): фоновый планировщик time-напоминаний —
интервал 30 с по умолчанию, настраиваетсяBRAINAGENT_REMINDER_CHECK_MS
(минимум 5 с); ошибки проверки не убивают таймер.- Приоритетная доставка напоминаний: маркер
<autonomy-priority>—
напоминание проходит мимо loop-breaker и 10-минутного минимума-гэпа
проактивных сообщений (напоминание — обязательство, а не спонтанный
выход на связь). host-patches/postinstall.cjs: при установке сам находит корень dsh
и применяет патч хоста идемпотентным скриптом; установку никогда
не роняет.- Защита: если хост всё же без патча и спамит гол-раундами
(> 2 за минуту), агент один раз предупреждает в лог и называет
команду исправления.
Проверка
- 802 unit-теста, 51 файл (+9 новых: goal-reminder.test.ts)
- Бандл: 629.0kb, smoke-прогоны OK
Установка
# из корня monorepo dsh — патч хоста применится автоматически
pnpm install
# либо в существующей копии brainagent:
node host-patches/apply-goal-round-pacing.cjs [путь-к-dsh]v0.9.6 — патч хоста в репозитории, формат дат DD.MM.YYYY
Что нового
Патч хоста — теперь часть репозитория; запасной формат дат.
host-patches/
- Анти-спам-патч хостового
goal-round-driver(из v0.9.5) зафиксирован
в репозитории: идемпотентный скриптhost-patches/apply-goal-round-pacing.cjs.
После обновления dsh достаточно выполнить его заново — повторный запуск
ничего не меняет, при несовместимых изменениях хоста скрипт
останавливается без правок. Больше не теряется при переустановке dsh.
Парсер дат
parseTimeTriggerCondition()дополнительно понимает европейский формат
DD.MM.YYYY[, HH:MM[:SS]](боевой кейс: LLM отдала его вместо ISO)
с защитой от несуществующих дат и времени («31.02.2026», «25:00»).
Тесты
+3 теста (goal-time): 793 теста, 50 файлов, tsc чистый.
Полные детали — в CHANGELOG.md и коммите этого релиза.
v0.9.5 — календарное время и анти-спам гол-раундов
Что нового
Ориентация во времени и анти-спам гол-раундов.
Календарное время для агента
- В каждый цикл агенту инжектируются точные локальные дата и время
(день недели, число, месяц, год, часы:минуты) — хост dsh не передаёт
модели календарное время, и сроки вида «эта неделя»/«завтра» повисали
в воздухе. - Извлечение целей теперь знает текущую дату: time-триггеры LLM отдаёт
ISO-датой (2026-08-28T09:00), плагин конвертирует её в epoch-мс.
Мусорные условия и даты до 2000 года отклоняются.
Анти-спам автономных гол-раундов (патч хоста dsh)
goal-round-driverдопускает раунд только после непрерывного idle
агента ≥DSH_GOAL_ROUND_MIN_IDLE_MS(по умолчанию 3 минуты,0—
прежнее поведение). До фикса цель-напоминание порождала четыре раунда
за минуту.
Тесты
+8 тестов (goal-time, clock-context): 790 тестов, 50 файлов, tsc чистый.
Полные детали — в CHANGELOG.md и коммите 8b13d07.
v0.9.4 — Goal Stack: явные цели извлекаются сразу
v0.9.4 — Goal Stack: явные цели извлекаются сразу
Найдено полным аудитом способностей (боевой тест h6): когда
пользователь говорил «планирую на этой неделе две задачи…», план
попадал в семантическую память, а Goal Stack оставался пустым.
Причина
LLM-извлечение целей запускалось строго раз в extractionInterval
(10) реплик и анализировало ТОЛЬКО текущую реплику. Цель,
сформулированная в «не тот» цикл, терялась для Goal Stack.
Фикс
goal-stack.ts:hasGoalIntent()— детектор явного целеполагания:
«планирую…», «запланировал…», «моя цель…», «поставь цель…»,
«напомни…», «не забудь…», «хочу успеть…», «задачи на
неделю/сегодня/завтра…», plan/goal/todo/remind me.
Защита от ложных срабатываний: «планшет» и «goalkeeper» не
срабатывают (границы слов).cycles.ts: при явном намерении извлечение целей запускается
сразу, не дожидаясь периодического цикла. Периодика раз в
10 реплик сохранена как фоновый механизм для неявных целей.
Проверка
- 782 unit-теста, 48 файлов — все зелёные.
- Новый
goal-intent.test.ts: 6 тестов на русские/английские
формулировки и ложные срабатывания.
v0.9.3 — процедурная память: дедупликация, шаги «1) 2) 3)», фильтр инъекций хоста
Что нового
Длинный боевой прогон: найдены и закрыты четыре дефекта процедурной памяти и контура обучения.
Процедурная память
storeWorkflowдедуплицирует по триггеру — повторное извлечение усиливает существующую запись вместо плождения копий (боевой тест: 11 копий одного триггера).- Процедуры без шагов (вопросы вида «как у тебя дела») больше не сохраняются и не попадают в инъекции пустыми «Learned Workflow».
- Экстрактор распознаёт нумерованные перечисления «1) … 2) … 3)» — так пользователи диктуют процедуры.
Контур обучения
- Наблюдатель
user/messageучится только на прямых репликах человека (source.kind === 'user'). dsh вбрасывает runtime-context снапшоты, каталог скиллов и goal-продолжения как user-role сообщения; снапшот, пришедший в тёрне после реплики пользователя, перезаписывал цикл — обучающее сообщение не доходило до контура обучения. message-guard: текстовые маркеры runtime-context снапшотов («Current runtime context…») — защита в глубину.
Боевой тест
Продиктованная процедура «подготовить отчёт» сохранилась, и в НОВОЙ сессии агент выполнил ровно три шага без уточняющих вопросов — по инъекции Learned Workflow. Кросс-сессионная семантическая память (факты «синий», «Нейроклав») подтверждена ранее.
Проверки
- tsc без ошибок, 776 unit-тестов (47 файлов), smoke-phase2/3 OK.
- Обновлены README и CHANGELOG.
v0.9.2 — каталог скиллов dsh не попадает в память
Фикс: каталог скиллов dsh больше не попадает в память
Боевой тест выявил второй канал самоотравления: пакет dsh tool-skill
вставляет в сессию каталог скиллов как самостоятельное user-сообщение
в обёртке <system-reminder>. Контур обучения BrainAgent обрабатывал
его как реплику пользователя — эпизодическая память сохраняла
«разговор о скиллах», а семантическая извлекала из каталога «факты».
Что исправлено
- Новый фильтр
isHarnessSystemMessageвmessage-guard.ts:
сообщения, начинающиеся с<system-reminder>, признаны служебными
сообщениями хоста (по аналогии с фильтром собственных инъекций). - Наблюдатель сессии пропускает их до startCycle и контуров обучения.
Итоги боевого теста
- Память подтверждена: факты «любимый цвет — синий» и «проект
Нейроклав» запомнены и точно воспроизведены на проверочном вопросе. - Инъекции: 2 цикла, в среднем ~842 токена, перерасхода бюджета нет.
- После фикса служебные сообщения хоста в память не попадают.
Проверки
- 770/770 теста, 46 файлов (+3 новых теста); tsc без ошибок;
esbuild-бандл 618.8kb; smoke-phase2/3 ОК.