a27a848d7c
Машина 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 (журнал вопросов).
23 lines
1.1 KiB
JavaScript
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);
|
|
});
|
|
});
|