a5d30f38a3
Этап 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>
38 lines
1.7 KiB
JavaScript
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'));
|
|
});
|
|
});
|