0.167.19
Fixed
/stop-divider не влиял ни на что:findLastTopicBreakискал роли, отфильтрованные SQL ( — P1)./stopчестно писалrole="interrupted"-маркер, actor честно искал его черезfindLastTopicBreakдля обрезки истории следующего хода — ноGetRecentDialogMessages(SQLdialogRoleFilterв SQLite/PostgreSQL) эти роли не пропускал, поэтомуfindLastTopicBreakвсегда возвращал -1, обе ветки обрезки были мёртвым кодом, и новый ход наследовал контекст отменённого (агент «доделывал» прерванную работу без просьбы). Фикс (вариант А из issue):topic_break/interruptedдобавлены вdialogRoleFilter/pgDialogRoleFilterи каноническийstore.dialogRoles(пинTestDialogRoleFilterSyncсинхронен) — маркеры проходят в окно как граница обрезки, но не доезжают до LLM:buildHistoryFromDBих пропускает (defence-in-depth для будущих вызовов без обрезки),archiveToConversation(компакция) уже скипал их явно. НовыйdropTopicMarkers(single-pass, без аллокаций на чистом окне) применяется после каждой обрезки — делает соответствиеhistory[i] ↔ dbMessages[i]структурным; вычисление границы summarylastOldMsgIDпереписано проходом с пропуском маркеров + degenerate-фолбэк прежнего guard (ocr review: молчаливый mis-hit кэша summary). Дополнительно:GetRecentDialogMessagesтеперь проверяетrows.Err()(SQLite+PG) — ошибка итерации больше не выглядит успехом, усечённое окно не может молча потерять маркер обрезки. КомментарийhandleStop(loop.go) приведён к реальности (устаревшие ссылки на строки). Тесты: пинTestIsDialogRole(маркеры — dialog roles), store-тест возврата обоих маркеров в окне, actor-тесты обрезки (маркер в середине / несколько маркеров — последний побеждает / без маркеров / маркер последним → пустая история при текущем user-сообщении, идущим отдельным аргументом), skip маркеров вbuildHistoryFromDB,dropTopicMarkers.