import { describe, it, expect } from 'vitest'; import { shouldJournalSkill, extractSkillCalls } from './enforce-skill-journaler.mjs'; import { skillTakenByJournal } from './judge-gate-floor.mjs'; const entry = (op, object) => ({ seq: 1, ts: 0, payload: { op, object } }); describe('shouldJournalSkill — дедуп vs wall pre-write (M7 Фаза 3, SE-K)', () => { it('новый seed-навык (хвост ≠ этот Skill) → true', () => { expect(shouldJournalSkill('systematic-debugging', [entry('Bash', 'git status')])).toBe(true); }); it('пустой журнал → true', () => { expect(shouldJournalSkill('test-driven-development', [])).toBe(true); }); it('хвост уже = этот Skill (wall pre-write) → false (дедуп)', () => { expect(shouldJournalSkill('writing-plans', [entry('Skill', 'writing-plans')])).toBe(false); }); it('хвост = другой Skill → true', () => { expect(shouldJournalSkill('brainstorming', [entry('Skill', 'writing-plans')])).toBe(true); }); it('пустое/не-строковое имя → false', () => { expect(shouldJournalSkill('', [])).toBe(false); expect(shouldJournalSkill(null, [])).toBe(false); }); }); describe('extractSkillCalls — мост журнал → K2 (M7 Фаза 3)', () => { it('возвращает object всех op:Skill записей по порядку', () => { const entries = [entry('Bash', 'x'), entry('Skill', 'writing-plans'), entry('Edit', 'f'), entry('Skill', 'systematic-debugging')]; expect(extractSkillCalls(entries)).toEqual(['writing-plans', 'systematic-debugging']); }); it('нет Skill-записей → []', () => { expect(extractSkillCalls([entry('Bash', 'x')])).toEqual([]); }); it('битые/без payload записи игнорируются', () => { expect(extractSkillCalls([null, {}, { payload: null }, entry('Skill', 's')])).toEqual(['s']); }); it('не-массив → []', () => { expect(extractSkillCalls(null)).toEqual([]); }); }); describe('end-to-end: зажурналенный навык виден K2 (M7 Фаза 3 acceptance)', () => { it('extractSkillCalls журнала → skillTakenByJournal.ok', () => { const entries = [entry('Skill', 'systematic-debugging')]; const calls = extractSkillCalls(entries); expect(skillTakenByJournal({ requiredSkills: ['systematic-debugging'], journalSkillCalls: calls }).ok).toBe(true); }); });