Files
brain/tools/m3a-contract-invariants.test.mjs
T
Дмитрий 5a7c5c255c feat: разворачивание комка superpowers — 14 навыков (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик superpowers (14 meta-skills
одной карточкой) развёрнут в 14 отдельных карточек-навыков + 14 под-узлов
ради точного подбора роутером.

- 14 карточек superpowers__<навык>.contract.json (skill = superpowers:навык)
- nodes.yaml: узел #19 развёрнут в #19a..#19n; классификации-триггеры
  распределены: feature в brainstorming, planning в writing-plans, tdd в TDD, debug в debugging
- writing-plans приведён к конвенции (был own без префикса/узла → external + узел)
- зонтик superpowers убран (карточка + узел)
- тесты: registry-load 103 узла/95 active; m3a/m3c образцы own/external
- splitting-inventory: прогресс + доп-каскады для крупных комков

Регрессия свода: 4361 passed, 0 failed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 22:53:20 +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 { validateContract } from './skill-contract.mjs';
import { loadRegistry } from './skill-contract-registry.mjs';
const here = dirname(fileURLToPath(import.meta.url));
const contractsDir = join(here, '..', 'docs', 'registry', 'contracts');
describe('Машина 3-A — инварианты контрактов', () => {
it('образец own (marketing-ru) валиден по форме', () => {
// writing-plans мигрирован в superpowers__writing-plans (external) при разворачивании superpowers
const c = JSON.parse(readFileSync(join(contractsDir, 'marketing-ru.contract.json'), 'utf8'));
expect(validateContract(c)).toEqual({ ok: true, errors: [] });
});
it('образец external (operations:process-doc) валиден по форме', () => {
const c = JSON.parse(readFileSync(join(contractsDir, 'operations-process-doc.contract.json'), 'utf8'));
expect(validateContract(c).ok).toBe(true);
});
it('ВСЕ файлы contracts/ form-валидны (нет ошибок формы/дублей/дрейфа)', () => {
const reg = loadRegistry({ dir: contractsDir });
expect(reg.errors).toEqual([]);
expect(reg.driftFlags).toEqual([]);
});
});