From b846c0c57fdcf4db044c4b5e8986b7a1c25c9750 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: Tue, 23 Jun 2026 09:30:14 +0300 Subject: [PATCH] =?UTF-8?q?feat(secretary):=20=D1=88=D0=B0=D0=B3=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9?= =?UTF-8?q?=20=D1=81=D1=83=D1=82=D0=B8=20=D1=81=20=D1=84=D0=BE=D0=BB=D0=B1?= =?UTF-8?q?=D1=8D=D0=BA=D0=BE=D0=BC,=20step=20=D0=BD=D0=B5=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D1=81=D1=82=D0=B8=D1=82=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task 4/5 плана. stop-hook берёт updated.step (модельная суть хода) как essence для buildStepLine; нет step — прежний firstSentence-фолбэк. step срезается из updated перед записью (транзитное, в protocol.json не оседает). Доказано smoke-прогоном; свод секретаря зелёный. Co-Authored-By: Claude Opus 4.8 (1M context) --- tools/secretary-stop-hook.mjs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/secretary-stop-hook.mjs b/tools/secretary-stop-hook.mjs index 42b8208..fa10098 100644 --- a/tools/secretary-stop-hook.mjs +++ b/tools/secretary-stop-hook.mjs @@ -100,8 +100,12 @@ async function main() { // Шаг хода (Слой 1) ведёт хук детерминированно — пишется ВСЕГДА; протокол к записи через merge // (при срыве reconcile категории заморожены, но перечень ходов не получает дыр). + // Модельная суть хода (если reconcile её вернул) — иначе фолбэк firstSentence в buildStepLine. + const modelStep = (updated && updated.step) || null; + if (updated && 'step' in updated) delete updated.step; // транзитное — в protocol.json не сохраняем const step = { turn, session, - text: buildStepLine({ turn, user: ex.user, assistant: ex.assistant, actions: (ex.actions || []).map((a) => a.tool) }) }; + text: buildStepLine({ turn, user: ex.user, assistant: ex.assistant, + actions: (ex.actions || []).map((a) => a.tool), essence: modelStep }) }; const toWrite = mergeTurnIntoProtocol({ proto, updated, step }); // Вернуть реестр СВ из снимка (reconcile его НЕ владеет) — иначе он перенумеровывает СВ.