Files
portal/tools/m3e-learning-invariants.test.mjs
T
Дмитрий a27a848d7c test(m3-e): learning hard-rule invariants + plan — Машина 3 собрана
Машина 3-E «Очередь одобрений + ручка разведки» собрана (TDD): router-learning-queue.mjs
(propose-only + owner batch approval + render/signal/persist; hard-rule «без да — никак»)
+ router-exploration.mjs (ручка %разведки=0 default, проба=вопрос владельцу, риск-гард).
19 новых тестов. Финальная регрессия tools-only 2212 GREEN.

МАШИНА 3 (Роутер-наставник) собрана целиком: 3-A контракты / 3-B граф узлов /
3-C машина охвата / 3-D движок роутера / 3-E очередь обучения. Доставка в живую
инфру (STATUS/brain-retro), K4-поправка, live-wiring, перенос волн — follow-up
после Машины 4 (журнал вопросов).
2026-06-04 19:51:45 +03:00

23 lines
1.1 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import { enqueue, applyApprovalBatch, pendingCount } from './router-learning-queue.mjs';
import { proposeProbe } from './router-exploration.mjs';
const cand = (id) => ({ id, kind: 'lesson', summary: `s-${id}`, why_proposed: `w-${id}` });
describe('Машина 3-E — несущие инварианты hard-rule', () => {
it('БЕЗ явного «да» владельца НИЧЕГО не входит в фонд (no auto-fill)', () => {
let q = [];
for (let i = 0; i < 10; i++) q = enqueue(q, cand(`c${i}`));
const r = applyApprovalBatch(q, {});
expect(r.fund).toEqual([]);
expect(pendingCount(r.queue)).toBe(10);
});
it('разведка по умолчанию НЕ инициирует пробу (rate=0)', () => {
expect(proposeProbe({ rate: 0, candidates: [{ id: '#x' }] })).toBe(null);
});
it('проба, даже включённая, требует одобрения владельца (никогда авто)', () => {
const p = proposeProbe({ rate: 0.5, candidates: [{ id: '#x' }], usageCounts: {} });
expect(p.requiresOwnerApproval).toBe(true);
});
});