d221ba499d
Аудит М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 уже гарантирует).
16 lines
908 B
JavaScript
16 lines
908 B
JavaScript
#!/usr/bin/env node
|
||
/** floor-escape-consume (М6) — чистое ядро одноразового погашения. */
|
||
import { canonicalAction, findOpenGrant } from './escape-grant.mjs';
|
||
|
||
/**
|
||
* Если исполненное действие совпало со свежим непогашенным пропуском — вернуть отметку, иначе null.
|
||
* Через единый findOpenGrant: гасим ИМЕННО тот грант, который открыл escape (один предикат
|
||
* свежести), без расхождения с open-проверкой при дублях/future-ts.
|
||
*/
|
||
export function consumeDecision({ action, grants, consumed, now = Date.now() }) {
|
||
const g = findOpenGrant(action, grants, consumed, now);
|
||
return g ? { action: g.action, ts: g.ts } : null;
|
||
}
|
||
|
||
export { canonicalAction }; // реэкспорт для обёртки
|