test(m7-phase4b): decomposition покрыт existenceCheck Гейт-1 через журнал (§5 coverage-map)

Proof покрытия: обещанный планировочный навык, не вызванный по журналу (extractSkillCalls),
→ existenceCheck.missingSkills непуст → NO-GO. Доказывает, что Гейт-1 М4 ловит скрытое
дробление через журнал-факт ДО retire no-op enforce-decomposition-detector (Ф8). Live-wiring
«обещанные навыки ← журнал» в judge-gate — Фаза 7. 39/39 GREEN (примитивы уже построены).
This commit is contained in:
Дмитрий
2026-06-08 12:21:12 +03:00
parent e048072093
commit a67d2014fa
+31
View File
@@ -244,3 +244,34 @@ describe('greenSignaturesValid (5.4, Δ5): green засчитан только
expect(greenSignaturesValid({ greenRuns: [run], key: undefined }).ok).toBe(false);
});
});
import { extractSkillCalls as extractSkillCalls4b } from './enforce-skill-journaler.mjs';
// М7 Фаза 4b §5 coverage-map: decomposition (скрытое дробление) ловит Гейт-1 existenceCheck
// через ЖУРНАЛ (обещанные навыки ← extractSkillCalls), не текст. Proof покрытия ДО retire
// no-op enforce-decomposition-detector (Ф8); live-wiring «обещанные ← журнал» в judge-gate — Ф7.
describe('existenceCheck как decomposition look-ahead через журнал (М7 Фаза 4b §4.2)', () => {
const journal = [
{ payload: { op: 'Skill', object: 'superpowers:test-driven-development' } },
{ payload: { op: 'Edit', object: 'foo.mjs' } },
];
it('promised planning skill НЕ вызван (по журналу) → existenceCheck ловит (missingSkills непуст)', () => {
const invoked = extractSkillCalls4b(journal);
const r = existenceCheck({
questions: [{ id: 'q1', answered: true }],
skillsPromised: ['superpowers:writing-plans'],
skillsInvoked: invoked,
});
expect(r.ok).toBe(false);
expect(r.missingSkills).toContain('superpowers:writing-plans');
});
it('promised skill вызван (в журнале) → existenceCheck ok', () => {
const invoked = extractSkillCalls4b(journal);
const r = existenceCheck({
questions: [{ id: 'q1', answered: true }],
skillsPromised: ['superpowers:test-driven-development'],
skillsInvoked: invoked,
});
expect(r.ok).toBe(true);
});
});