From 6683345908280c1fd98816e3e305da22ec67b353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 26 Jun 2026 18:28:46 +0300 Subject: [PATCH] =?UTF-8?q?fix(secretary):=20SYSTEM-=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BC=D0=BF=D1=82=D1=8B=20=E2=80=94=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=D0=BE=20=D0=B4=D1=83=D0=B1=D0=BB=D0=B5=D0=B9=20+?= =?UTF-8?q?=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20=D0=B2=D1=8B=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=BF=D0=BE=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=D1=87=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/secretary-gardener.mjs | 2 +- tools/secretary-harvest.mjs | 11 ++++++----- tools/secretary-reconcile.mjs | 4 +++- tools/secretary-reconcile.test.mjs | 1 + 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/tools/secretary-gardener.mjs b/tools/secretary-gardener.mjs index cc657c2..972a527 100644 --- a/tools/secretary-gardener.mjs +++ b/tools/secretary-gardener.mjs @@ -6,7 +6,7 @@ import { collapseProtocol } from './secretary-reconcile.mjs'; export const SYS_G = [ 'Ты — САДОВНИК грядки ВЕТОК (СВ-N, горящие ПР-N/ХВ-N) + СТРЕЛОЧНИК моста с грядкой кандидатов (КД-N).', 'Ствол сделал шаг (дифф дан). Новых НЕ ищешь. Кандидатов НЕ точишь (это брейншторм) — их только ЗАБИРАЕШЬ', - 'наверх или хоронишь. Видишь НАДГРОБИЯ — можешь ВОСКРЕСИТЬ по id (reopen), если ствол ВЕРНУЛ повод.', + 'наверх или хоронишь. Мёртвые пункты тебе НЕ показывают (они в архиве) — воскрешением не занимайся.', '', 'ГЛАВНОЕ: ТИШИНА вокруг ветки — НЕ повод хоронить. Спящая ветка может пролежать полразговора и вытянуть', 'целый пласт. Хоронить «по простою» НЕЛЬЗЯ. Только две двери в смерть:', diff --git a/tools/secretary-harvest.mjs b/tools/secretary-harvest.mjs index 45ae37d..3f3dd1b 100644 --- a/tools/secretary-harvest.mjs +++ b/tools/secretary-harvest.mjs @@ -26,7 +26,7 @@ const TITLE_ADD = '\nДОП-ПОЛЯ в КАЖДЫЙ объект-находку + '\n "важность" — для ВЛАДЕЛЬЦА-не-программиста: "high"|"medium"|"low" (влияние НА ДЕЛО, не на технику).'; // Брейншторм v2: точит СВОИХ кандидатов (мутация) + критик полноты (зияющий пробел целого пласта). -const BRAINSTORM_ADD = '\n\nТЫ — САДОВНИК ГРЯДКИ КАНДИДАТОВ. Тебе даны ЖИВЫЕ кандидаты и ВСЕ ШАГИ. Три задачи:' +const BRAINSTORM_ADD = '\n\nТЫ — САДОВНИК ГРЯДКИ КАНДИДАТОВ. Тебе даны ТЕМА, БАЗА ЗНАНИЙ, СТВОЛ, ЖИВЫЕ ветки и кандидаты, ПОСЛЕДНИЕ ХОДЫ ЦЕЛИКОМ и КРАТКИЙ ЛОГ ОСТАЛЬНЫХ ХОДОВ. Три задачи:' + '\n 1) РОЖДАЙ в "forks" ТОЛЬКО действительно НОВЫЕ идеи.' + '\n 2) ТОЧИ СВОИХ: если ход заточил существующего — НЕ дубль, а в "mutate": {"id":"КД-N","newText","newTitle","why"}.' + '\n Спящих не трогай. Сплавленную сверху ветку можешь творчески ПЕРЕДУМАТЬ.' @@ -35,10 +35,11 @@ const BRAINSTORM_ADD = '\n\nТЫ — САДОВНИК ГРЯДКИ КАНДИД + '\n МАКС 1 за ход, не повторяй заведённую тему → в "gaps": {"тема","title","why"}. Нет — "gaps":[].' + '\nВЫХОД JSON: {"forks":[...],"mutate":[{"id","newText","newTitle","why"}],"gaps":[{"тема","title","why"}]}'; -// Ловец v2: видит все шаги + волю + реестр живых веток + надгробия → ловит ЗАБЫТОЕ, не дублируя. -const CATCH_ADD = '\n\nТЕБЕ ДАНЫ ВСЕ ШАГИ + ВОЛЯ + РЕЕСТР ЖИВЫХ ВЕТОК. Лови ЗАБЫТЫЕ нити: поднятые в ЛЮБОМ прошлом ходу' - + ' и брошенные без решения. НЕ лови то, что: ствол решил/закрыл, лежит в ВОЛЕ, уже ведётся ЖИВОЙ ВЕТКОЙ,' - + ' или в НАДГРОБИЯХ. Забытое ≠ убитое ≠ уже отслеживается.'; +// Ловец v2: видит тему+базу+ствол+живые ветки+живые кандидаты+ходы → ловит ЗАБЫТОЕ, не дублируя. +const CATCH_ADD = '\n\nТЕБЕ ДАНЫ: ТЕМА, БАЗА ЗНАНИЙ, СТВОЛ (решения/воля/открытые), РЕЕСТР ЖИВЫХ ВЕТОК, ЖИВЫЕ КАНДИДАТЫ,' + + ' ПОСЛЕДНИЕ ХОДЫ ЦЕЛИКОМ и КРАТКИЙ ЛОГ ОСТАЛЬНЫХ ХОДОВ. Лови ЗАБЫТЫЕ нити: поднятые в ЛЮБОМ прошлом ходу' + + ' и брошенные без решения. НЕ лови то, что: ствол решил/закрыл, лежит в ВОЛЕ, уже ведётся ЖИВОЙ ВЕТКОЙ.' + + ' Забытое ≠ убитое ≠ уже отслеживается.'; export const SYS_11 = [ 'Ты — сборщик скрытых веток (диагностич. линзы). Видишь НЕДАВНИЕ шаги (ствол), ЖИВЫЕ ветки (реестр) и', diff --git a/tools/secretary-reconcile.mjs b/tools/secretary-reconcile.mjs index 943e6fb..194c464 100644 --- a/tools/secretary-reconcile.mjs +++ b/tools/secretary-reconcile.mjs @@ -12,7 +12,9 @@ export function buildReconcilePrompt({ protocol = {}, lastExchange = {}, remark 'alternatives[{text,struck}], consequences[{text,struck}],', 'will[{text,struck}], open[{text,struck}], doneNext[{text,done,struck}], knowledge[{text,ref}]).', 'ПРАВИЛА:', - '1. НИЧЕГО НЕ УДАЛЯЙ. Решённое/отменённое/дубль — ЗАЧЕРКНИ ("struck":true), строка остаётся.', + '1. НИЧЕГО НЕ УДАЛЯЙ. Решённое/отменённое — ЗАЧЕРКНИ ("struck":true), строка остаётся.', + ' ДУБЛИ НЕ ЗАЧЁРКИВАЙ: повтор один-в-один — оставь ОДНУ запись (вторую не добавляй);', + ' та же мысль с НОВОЙ деталью — дай ОДНУ расширенную запись (деталь добавь через « — »), не плоди вторую строку.', '2. Существующие строки НЕ переписывай — только зачёркивай старую и добавляй новую.', '3. Открытый вопрос, на который дан ответ, — зачеркни (закрой), не оставляй открытым.', '4. "will" (воля/запреты) — ТОЛЬКО слова ВЛАДЕЛЬЦА [ЮЗЕР]; действия ассистента [АССИСТЕНТ] не сюда.', diff --git a/tools/secretary-reconcile.test.mjs b/tools/secretary-reconcile.test.mjs index 18daa09..abbee61 100644 --- a/tools/secretary-reconcile.test.mjs +++ b/tools/secretary-reconcile.test.mjs @@ -106,6 +106,7 @@ describe('buildReconcilePrompt', () => { expect(system.toLowerCase()).toContain('зачерк'); expect(system).toContain('[ЮЗЕР]'); expect(system.toLowerCase()).toContain('служебн'); + expect(system).toContain('ДУБЛИ НЕ ЗАЧЁРКИВАЙ'); // дубли расширяем/оставляем, не зачёркиваем }); it('в user — текущий протокол и обмен; замечание добавляется при возврате', () => { const { user } = buildReconcilePrompt({ protocol: proto, lastExchange: ex, remark: 'ВЕРНИ X' });