Skip to content

feat(memory-quality): замер ответов берёт инструкции хода из прода - #359

Merged
nyxandro merged 7 commits into
developfrom
feat/answers-harness-prepared
Oct 8, 2026
Merged

nyxandro merged 7 commits into
developfrom
feat/answers-harness-prepared

Conversation

@nyxandro

@nyxandro nyxandro commented Oct 8, 2026

Copy link
Copy Markdown
Owner

Зачем

Харнесс замера ответов модели (слой 4) пересобирал запрос хода сам и в нескольких местах расходился с продом (#348). Сравнение вариантов памяти это почти не портило, но абсолютные цифры занижались во всех вариантах сразу. Этот PR делает два пункта, которые issue предлагал сделать до следующего прогона.

Что сделано

  • Системная часть запроса строится из блоков, которые прод сохранил с ходом (agent_turns.prepared). Собирает её та же функция, что и в ядре: preparedSystemPrompt вынесена из run-turn.ts в agent/runtime/prompt/system-prompt.ts, поведение ядра не меняется. Подменяется только блок памяти — единственное, чем различаются варианты. В запрос вернулись блоки делегирования, предпочтений оформления, набора реакций, список skills и пользовательские блоки хода.
  • search_memories предлагается так, как его показала настоящая выдача инструментов хода (resolveToolSurface): во внешней группе без гранта модель инструмента не получает, описание то же, что видел прод. Исполняется сам инструмент продукта, без обёрток выдачи. В личном чате обёртка забирала бы досланные сообщения на копии базы и могла бы расшифровывать голос через провайдера.
  • Исторические ходы 4 групп, у которых до миграции 132 был грант manage_memory_conflict, получают поиск, как было тогда: удалённое имя убирается из сохранённых прав только внутри харнесса.
  • Ход без ровно одного блока памяти отклоняется с ошибкой AGENT_MEMORY_ANSWERS_MEMORY_SLOT_INVALID.

Проверка

  • Побайтное совпадение. Тест: если вернуть на место боевой блок памяти, системная часть совпадает с тем, что собирает ядро, байт в байт. Property-тест на подмену блока прошёл без контрпримеров. Две подложенные ошибки он поймал: потерю соседнего блока и упоминание тега в тексте правил, принятое за блок.
  • Выдача инструмента. Тесты: личный чат, внешняя группа с грантом и без, ход со старым грантом.
  • Боевая база (только чтение). У всех 153 ходов эталона есть подготовленные инструкции и ровно один блок памяти.
  • Независимое ревью. Нашло, что прежняя версия падала на каждом ходе личного чата, — исправлено, тест есть.

Что не сделано (пункты 3–5 issue, одинаковы для всех вариантов)

  • Нити памяти не откатываются к моменту вопроса.
  • История режется до хвоста в 12 тыс. знаков.
  • Профиль собеседника не входит ни в один вариант: он жил в боевом блоке памяти, который заменяется целиком.
  • Основная часть системных инструкций (agent/instructions.md) берётся из текущего кода, а не из релиза, который отвечал ход.

Ветка лежит поверх #358.

Closes #348

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 48 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 159f40cf-eaf6-4f09-80ad-6bbbe547e0f8
📥 Commits

Reviewing files that changed from the base of the PR and between 534bb0d and b94ccd4.

⛔ Files ignored due to path filters (2)
  • docs/releases/v0.42.0.md is excluded by !docs/**
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (66)
  • agent/lib/agent-schedules/ai-digest-repair.ts
  • agent/lib/manage-memory-conflict-tool.test.ts
  • agent/lib/memory-automatic-selection.test.ts
  • agent/lib/memory-automatic-selection.ts
  • agent/lib/memory-conflict-grant-cleanup-migration.integration.test.ts
  • agent/lib/memory-conflict-repository.integration.test.ts
  • agent/lib/memory-conflict-repository.ts
  • agent/lib/memory-live-read-authorization.integration.test.ts
  • agent/lib/memory-observability.ts
  • agent/lib/memory-retrieval-diagnostics.test.ts
  • agent/lib/memory-retrieval-repository.integration.test.ts
  • agent/lib/memory-retrieval-repository.ts
  • agent/lib/memory-retrieval-stages.test.ts
  • agent/lib/memory-retrieval-turn-context.test.ts
  • agent/lib/memory-retrieval.test.ts
  • agent/lib/memory-retrieval.ts
  • agent/lib/memory-show-journal.integration.test.ts
  • agent/lib/memory-show-journal.ts
  • agent/lib/memory-thread-brief-generator.ts
  • agent/lib/memory-thread-brief.test.ts
  • agent/lib/memory-thread-context.ts
  • agent/lib/memory-thread-source-repository.ts
  • agent/lib/memory-tool-results.test.ts
  • agent/lib/memory-tool-shows.ts
  • agent/lib/memory-upgrade-ledger.integration.test.ts
  • agent/lib/memory-usage-report.test.ts
  • agent/lib/memory-usage-report.ts
  • agent/lib/memory-usage-repository.integration.test.ts
  • agent/lib/memory-usage-repository.ts
  • agent/lib/model-facing-error.ts
  • agent/lib/profile-view-repository.ts
  • agent/lib/prompt/common-fragments.ts
  • agent/lib/prompt/turn-blocks.test.ts
  • agent/lib/prompt/turn-blocks.ts
  • agent/lib/prompt/turn-memory-budget.test.ts
  • agent/lib/prompt/turn-memory-budget.ts
  • agent/lib/prompt/turn-memory-context.ts
  • agent/lib/r3-external-projection-retrieval.integration.test.ts
  • agent/lib/r3-profile-projection.integration.test.ts
  • agent/lib/tool-policy/group-tool-catalog.test.ts
  • agent/lib/tool-policy/group-tool-catalog.ts
  • agent/lib/tool-policy/mode-tool-surface.ts
  • agent/lib/tool-policy/trusted-mode-tool-catalog.ts
  • agent/lib/tool-surface.test.ts
  • agent/lib/tools/list_memories.ts
  • agent/lib/tools/manage_memory_conflict.ts
  • agent/lib/tools/search_memories.ts
  • agent/runtime/prompt/system-prompt.ts
  • agent/runtime/turn/run-turn.ts
  • infra/monitoring/rules/logs/osinara.yaml
  • infra/monitoring/rules/metrics/osinara.yaml
  • migrations/131_memory_show_sources.sql
  • migrations/132_remove_memory_conflict_grants.sql
  • monitoring-alert-rules.test.ts
  • package.json
  • scripts/memory-quality/answers/answer-turn.ts
  • scripts/memory-quality/answers/memory-conditions.ts
  • scripts/memory-quality/answers/run.ts
  • scripts/memory-quality/answers/turn-prompt.test.ts
  • scripts/memory-quality/answers/turn-prompt.ts
  • scripts/memory-quality/golden/candidate-pool.integration.test.ts
  • scripts/memory-quality/golden/candidate-pool.ts
  • scripts/memory-quality/golden/show-journal.integration.test.ts
  • scripts/memory-quality/usage-lines.test-fixtures.ts
  • scripts/memory-quality/usage-summary.test.ts
  • scripts/memory-quality/usage-summary.ts
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

nyxandro and others added 6 commits October 8, 2026 18:41
… сессии, а не только за автоподборку хода

#339: запись, которую модель нашла явным поиском, увидела в профиле или в ответе прошлого хода,
счётчик отклонял — в журнале показов была только автоподборка этого хода. Кривая забывания
старила именно то, что приходилось искать вручную; 141 из 280 названных записей отклонены.

- Журнал показов знает источник (миграция 131): selection, profile, search, list.
  search_memories и list_memories пишут свои показы, блок памяти — постоянные утверждения
  профиля. Ход без окна журнала (дочерний агент, запуск по расписанию) не пишет ничего.
- Счётчик засчитывает запись, показанную в этой сессии беседы до этого хода в пределах журнала,
  один раз на показ и один раз на ответ: показ помнит, какой ход его потратил, и повторная
  обработка хода не тратит следующий. Другая сессия той же беседы не считается — её история не
  перед моделью. Ответ после подтверждения действия (новый turnId) теперь тоже засчитывается.
- Отбор повторов автоподборки смотрит только на её собственные показы: найденное поиском не
  прячется от следующей подборки.
- Ошибка записи в журнал не отнимает у человека результат поиска: строка
  AGENT_MEMORY_SHOW_RECORD_FAILED в лог, инструмент отвечает найденным.

Теперь rejectedRefs в AGENT_MEMORY_USAGE_DIRECTIVE значит одно: модель назвала то, чего этой
сессии не показывали.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
По ревью #339. Счётчик использования теперь засчитывает и записи,
найденные самой моделью, а запись хаба osinara_memory_used_1m и тревога
OsinaraMemoryNeverUsed сравнивают использованное с предложенным
автоподборкой. Без разделения тревога не заметила бы подборку, которая
предлагает бесполезное, пока модель находит нужное сама. Счётчик
возвращает отдельно записи из автоподборки, строка
AGENT_MEMORY_USAGE_DIRECTIVE несёт countedSelectionCount, правило хаба
считает по нему; пороги тревоги сняты именно на таком числителе.

Эталонный замер читал из журнала показов всё подряд: теперь только
показы автоподборки, и использованной считается запись, которую
засчитал тот же ход.

Тесты: оба читающих инструмента пишут показы, сбой записи уходит в лог
и не мешает ответу.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Споры не создаются с v0.12.0, а оставшаяся часть механизма прятала живую
запись, если вторую сторону спора удалили (#340). Убраны инструмент
manage_memory_conflict и его выдача во всех режимах, сборка спорных пар в
подборке и в search_memories, фильтры «участвует в споре» в профиле и в
ремонте дайджеста, ссылки на споры в нитях памяти, конфликтные ветки
бюджета блока памяти, журнала показов, харнессов замера.

Подборка теперь перепроверяет права на найденные записи отдельным
запросом (searchAuthorized), как раньше это делала сборка спорных пар:
отзыв членства посреди хода по-прежнему убирает выдачу целиком.

Миграция 132 вычищает manage_memory_conflict из разрешённых инструментов
внешних групп: неизвестное имя в списке иначе обнулило бы политику
группы целиком. Таблица claim_conflicts пуста и остаётся как история.

Closes #340

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Споров между версиями записей больше нет (#340), а ответ после
подтверждения с #339 засчитывается по показам всей сессии. В комментарии
правила хаба осталось одно принятое расхождение — запись из профиля,
которую бюджет убрал из блока.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Харнесс замера ответов пересобирал запрос хода сам и в нескольких местах
расходился с продом (#348). Теперь системная часть строится из блоков,
которые прод сохранил с ходом (agent_turns.prepared), той же функцией,
что и в ядре (preparedSystemPrompt). Подменяется только блок памяти: в
нём и различаются варианты замера. В запрос вернулись блоки
делегирования, предпочтений оформления, набора реакций, список skills и
пользовательские блоки хода.

search_memories предлагается так, как его показала настоящая выдача
инструментов хода (resolveToolSurface): во внешней группе без гранта
модель не получает инструмента, описание то же, что в проде. Исполняется
сам инструмент продукта, без обёрток выдачи: в личном чате обёртка
забирала бы досланные сообщения на копии базы и могла бы расшифровывать
голос через провайдера.

Ход без ровно одного блока памяти отклоняется с понятной ошибкой. На
боевой базе у всех 153 ходов эталона блок памяти ровно один.

Closes #348

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@nyxandro
nyxandro force-pushed the feat/answers-harness-prepared branch from 01e398d to 95c80c5 Compare October 8, 2026 18:42
…ресказе истории

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@nyxandro
nyxandro merged commit 56b53cc into develop Oct 8, 2026
4 checks passed
@nyxandro
nyxandro deleted the feat/answers-harness-prepared branch October 8, 2026 18:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Замер ответов модели (слой 4): запрос хода ещё в пяти местах отличается от продового

1 participant