Files
portal/tools/floor-escape-consume.test.mjs
T
Дмитрий d221ba499d fix(m6): аудит-правки — G-5 egress токен, единый findOpenGrant, escape-журнал, уникальный id снимка
Аудит М6 (audit-context-building + sharp-edges + корректность; комплекс М1–М6), 4 практичных фикса (TDD):
- FIX-1: enforce-mcp-classification печатает точный FLOOR-ESCAPE токен в egress/verdict-блоке (G-5 для egress).
- FIX-2: escape-grant.findOpenGrant — единый предикат свежести для open и consume (гасит ИМЕННО открывший грант; чинит утечку one-shot при дублях/future-ts).
- FIX-3: enforce-supreme-gate.runGate — best-effort журнал escape (escape:true), указатель не двигается, сбой журнала не блокирует.
- FIX-4: enforce-snapshot — уникальный дефолтный id снимка (ts-pid-счётчик) против ms-коллизии refs/floor-snapshots.

Регрессия tools-only 2843 passed + 2 skip (+9, 0 регрессий). FIX-5 (подпись гранта) сознательно не делали (нулевая защита без ключа; protected-path уже гарантирует).
2026-06-07 19:43:05 +03:00

24 lines
1.4 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import { consumeDecision } from './floor-escape-consume.mjs';
describe('floor-escape-consume', () => {
const now = 1000;
it('исполненное действие с непогашенным пропуском → отметка', () => {
const r = consumeDecision({ action: 'bash:reset --hard',
grants: [{ action: 'bash:reset --hard', ts: now - 5 }], consumed: [], now });
expect(r).toEqual({ action: 'bash:reset --hard', ts: now - 5 });
});
it('уже погашено → null', () => {
const r = consumeDecision({ action: 'bash:x', grants: [{ action: 'bash:x', ts: 1 }], consumed: [{ action: 'bash:x', ts: 1 }], now });
expect(r).toBe(null);
});
it('нет совпадающего пропуска → null', () => {
expect(consumeDecision({ action: 'bash:y', grants: [{ action: 'bash:x', ts: 1 }], consumed: [], now })).toBe(null);
});
// floor-escape-consume.mjs FIX-2: гасить ИМЕННО открывший грант (единый findOpenGrant)
it('при дублях гасит свежий открывший грант, не future-ts', () => {
const r = consumeDecision({ action: 'bash:x',
grants: [{ action: 'bash:x', ts: now + 1000 }, { action: 'bash:x', ts: now - 5 }], consumed: [], now });
expect(r).toEqual({ action: 'bash:x', ts: now - 5 });
});
});