Files
portal/tools/m3c-coverage-invariants.test.mjs
T
Дмитрий 80ebec9e82 test(m3-c): coverage-machine invariants on 3-A contracts + plan
Машина 3-C «Машина охвата A/B/C/D» собрана (TDD): coverage-machine.mjs —
A граф зависимостей (buildDependencyGraph/topoOrder/findHoles/decompositionGroups),
B реестр нужды↔решения (coverageRegistry: дыры+сироты), C requestsChecklist,
D ограничения как нужды (effectiveNeeds), хребет readinessChecklist (4 галочки + §).
Независимый верификатор охвата (рычаг E §6.3). 19 новых тестов, регрессия 2158 GREEN.
2026-06-04 19:26:21 +03:00

27 lines
1.4 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import { readFileSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import { dirname, join } from 'node:path';
import { buildRegistry } from './skill-contract-registry.mjs';
import { readinessChecklist, findHoles } from './coverage-machine.mjs';
const here = dirname(fileURLToPath(import.meta.url));
const cdir = join(here, '..', 'docs', 'registry', 'contracts');
describe('Машина 3-C — охват на реальных контрактах 3-A', () => {
it('контракты 3-A загружаются и прогоняются через машину охвата', () => {
const wp = JSON.parse(readFileSync(join(cdir, 'writing-plans.contract.json'), 'utf8'));
const pd = JSON.parse(readFileSync(join(cdir, 'operations-process-doc.contract.json'), 'utf8'));
const { contracts } = buildRegistry([{ contract: wp }, { contract: pd, currentContent: '' }]);
const r = readinessChecklist({ contracts, requests: ['implementation-plan'] });
expect(Array.isArray(r.items)).toBe(true);
expect(r.items).toHaveLength(4);
expect(r.items.find((i) => /просьб/i.test(i.label)).ok).toBe(true);
});
it('findHoles на контракте с непокрытой нуждой ловит дыру', () => {
const wp = JSON.parse(readFileSync(join(cdir, 'writing-plans.contract.json'), 'utf8'));
const holes = findHoles([wp]);
expect(holes.length).toBeGreaterThan(0);
});
});