Files
brain/tools/secretary-protocol.test.mjs
T
Дмитрий 67fecd7149 feat(secretary): reconcile — модель-редактор правит весь протокол, хук-сторож против потерь
- secretary-reconcile.mjs: buildReconcilePrompt (весь протокол+обмен), parseReconcileResponse,
  reconcileGuard (ни одна старая строка не пропала), buildGuardRemark (обоснованный возврат),
  stampProvenance (turn+session по тексту), reconcileTurn (вызов->сторож->до 2 возвратов)
- stop-хук: вместо applyExtraction вызывает reconcileTurn; мотор инъектируется
- renderProtocol: зачёркивание во ВСЕХ разделах (закрытые вопросы видны ~~struck~~)
- ретайр: applyExtraction/buildExtractionPrompt/parseExtractionResponse (secretary-extract удалён)
- Слой 1, провенанс @session, флажок по сессии, оглавление — без изменений
- спека + план reconcile в docs/superpowers

33 теста green (мотор замокан, без сети). Модель для prod — Sonnet.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 10:54:20 +03:00

33 lines
1.3 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import { renderProtocol, EMPTY_PROTOCOL } from './secretary-protocol.mjs';
describe('EMPTY_PROTOCOL', () => {
it('пустой протокол со всеми разделами (вкл. history)', () => {
expect(EMPTY_PROTOCOL()).toEqual({ subject: '', decisions: [], will: [], open: [], doneNext: [], history: [] });
});
});
describe('renderProtocol', () => {
it('решение с провенансом [→N] и меткой сессии @ для навигации в raw', () => {
const md = renderProtocol({
subject: 'тема', history: [],
decisions: [{ text: 'A', why: 'w', turns: [7], session: '69992620-x' }],
will: [], open: [], doneNext: [],
});
expect(md).toContain('- A — w [→7] @69992620');
});
it('зачёркнутые пункты ВО ВСЕХ разделах показаны ~~...~~', () => {
const md = renderProtocol({
subject: '', history: [],
decisions: [{ text: 'D', struck: true }],
will: [{ text: 'W', struck: true }],
open: [{ text: 'Q', struck: true }],
doneNext: [{ text: 'N', struck: true, done: false }],
});
expect(md).toContain('~~D~~');
expect(md).toContain('~~W~~');
expect(md).toContain('~~Q~~');
expect(md).toContain('~~N~~');
});
});