Files
brain/tools/registry-graph-health.test.mjs
T
Дмитрий a5d30f38a3 feat(registry): живой охват 2c — данности, граф, coverage-wiring, врезка в гейт
Этап 2c эпика роутер-реестр: оживление машины охвата как замена цепочкам L.
- registry-initial-inputs.mjs: токены-данности (category:given) для initialInputs.
- registry-graph-health.test.mjs: граф ацикличен, рёбра producer-consumer.
- coverage-wiring.mjs: мост recommended skills -> readinessChecklist -> {cards, ready, holes}; ready=нет-дыр.
- enforce-judge-gate.mjs: coverageCardsFor/coverageGate — карточки + стоп при дыре (инъекция-выкл).
- замок словаря (vocabTokens) на живом пути; гайд по стене: автономность + уроки сессии.
Регрессия: 4375 passed (канонический свод владельца).

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

38 lines
1.7 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import { buildDependencyGraph, topoOrder } from './coverage-machine.mjs';
import { loadRegistry } from './skill-contract-registry.mjs';
// D2: верификация ИНВАРИАНТА данных поверх существующих функций coverage-machine
// (нового модуля нет — тест-характеризация графа на полном наборе контрактов).
const reg = loadRegistry({ dir: 'docs/registry/contracts' });
const contracts = reg.contracts;
describe('здоровье графа зависимостей на полном наборе (D2)', () => {
it('реестр контрактов собрался без ошибок', () => {
expect(reg.errors).toEqual([]);
});
it('граф непуст — есть рёбра producer→consumer', () => {
const { edges } = buildDependencyGraph(contracts);
expect(edges.length).toBeGreaterThan(0);
});
it('заземляющее ребро owasp-zap → security-go-live (via dast-report)', () => {
const { edges } = buildDependencyGraph(contracts);
const e = edges.find((x) => x.from === 'owasp-zap' && x.to === 'security-go-live');
expect(e).toBeTruthy();
expect(e.via).toBe('dast-report');
});
it('граф ацикличен (topoOrder.cycle === null)', () => {
const { order, cycle } = topoOrder(contracts);
expect(cycle).toBeNull();
expect(Array.isArray(order)).toBe(true);
});
it('в топопорядке producer (owasp-zap) раньше consumer (security-go-live)', () => {
const { order } = topoOrder(contracts);
expect(order.indexOf('owasp-zap')).toBeLessThan(order.indexOf('security-go-live'));
});
});