Files
portal/tools/enforce-todowrite-skill-verifier.test.mjs
T
Дмитрий a29fa9caa9 feat(m7-phase4a): todowrite-skill-verifier — журнал-факт session-scope + fail-CLOSE + PreToolUse (§4.2)
Выполненный todo, claim'ящий Skill, теперь сверяется с ЖУРНАЛОМ вызовов (extractSkillCalls,
канал М1) вместо transcript-извлечения. Session-scope осознанно (выполненный todo мог
закрыться в прошлом ходе — отличие от coverage, которое turn-scoped). decide получает
journalSkillCalls; main грузит журнал через loadJournal+extractSkillCalls, обёрнут
exitDisciplineDecision (fail-CLOSE Фазы 0). Переориентирован на PreToolUse-семантику
(предотвращение, §4.2 [Pre]; регистрация matcher — шаг владельца Ф8). 5/5 тестов GREEN.
2026-06-08 11:08:56 +03:00

31 lines
1.4 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import { decide } from './enforce-todowrite-skill-verifier.mjs';
describe('enforce-todowrite-skill-verifier decide() (журнал-факт, session-scope)', () => {
it('allows when completed mention is in journal skill calls', () => {
const todoItems = [{ content: 'invoke superpowers:brainstorming', status: 'completed' }];
expect(decide({ todoItems, journalSkillCalls: ['superpowers:brainstorming'] }).block).toBe(false);
});
it('blocks when completed mention NOT in journal skill calls', () => {
const todoItems = [{ content: 'invoke superpowers:brainstorming', status: 'completed' }];
const r = decide({ todoItems, journalSkillCalls: [] });
expect(r.block).toBe(true);
expect(r.reason).toMatch(/v4\.1 TodoWrite hard sync/);
});
it('allows when mention is pending (not completed)', () => {
const todoItems = [{ content: 'invoke superpowers:brainstorming', status: 'pending' }];
expect(decide({ todoItems, journalSkillCalls: [] }).block).toBe(false);
});
it('allows when todoItems is empty', () => {
expect(decide({ todoItems: [], journalSkillCalls: [] }).block).toBe(false);
});
it('matches journal name across namespace (bare mention vs prefixed journal)', () => {
const todoItems = [{ content: 'invoke brainstorming', status: 'completed' }];
expect(decide({ todoItems, journalSkillCalls: ['superpowers:brainstorming'] }).block).toBe(false);
});
});