← back to Approval Viewer
verification/tk10995-five-sweeps.mjs
95 lines
import fs from 'node:fs';
const base = 'http://127.0.0.1:9788';
const evidencePath = new URL('./tk10995-five-sweeps.json', import.meta.url);
function assert(condition, message) {
if (!condition) throw new Error(message);
}
async function request(path, options = {}) {
const response = await fetch(`${base}${path}`, options);
const text = await response.text();
let json = null;
try { json = JSON.parse(text); } catch {}
return { status: response.status, text, json };
}
const startedAt = new Date().toISOString();
const sweeps = [];
for (let pass = 1; pass <= 5; pass += 1) {
const correlationId = `TK-10995-sweep-${pass}-${Date.now()}`;
const root = await request('/');
assert(root.status === 200, `sweep ${pass}: root status ${root.status}`);
assert(root.text.includes('Gated approvals'), `sweep ${pass}: root UI missing title`);
assert(root.text.includes('do not publish, email, spend, deploy, delete'), `sweep ${pass}: safe-mode rail missing`);
const favicon = await request('/favicon.ico');
assert(favicon.status === 204, `sweep ${pass}: favicon status ${favicon.status}`);
const before = await request('/api/items');
assert(before.status === 200, `sweep ${pass}: items status ${before.status}`);
assert(Array.isArray(before.json?.items) && before.json.items.length > 0, `sweep ${pass}: no items`);
assert(before.json.writePerformed === false, `sweep ${pass}: GET claimed a write`);
const item = before.json.items[0];
assert(item.created_at, `sweep ${pass}: admin card data lacks created_at`);
const invalid = await request('/api/decision', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: '{not-json',
});
assert(invalid.status === 400 && invalid.json?.error === 'invalid json', `sweep ${pass}: invalid JSON was not rejected`);
const unknown = await request('/api/decision', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id: `UNKNOWN-${correlationId}`, action: 'revise' }),
});
assert(unknown.status === 404 && unknown.json?.error === 'unknown item', `sweep ${pass}: unknown item was not rejected`);
const recorded = await request('/api/decision', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id: item.id, action: 'revise', note: correlationId }),
});
assert(recorded.status === 200 && recorded.json?.ok === true, `sweep ${pass}: local decision was not recorded`);
assert(recorded.json?.writePerformed === false, `sweep ${pass}: response claimed an external write`);
const after = await request('/api/items');
const persisted = after.json?.decisions?.find((decision) => decision.note === correlationId);
assert(persisted?.id === item.id && persisted?.action === 'revise', `sweep ${pass}: decision did not persist`);
sweeps.push({
pass,
verdict: 'PASS',
correlationId,
itemId: item.id,
source: before.json.source,
rootStatus: root.status,
faviconStatus: favicon.status,
itemsStatus: before.status,
invalidJsonStatus: invalid.status,
unknownItemStatus: unknown.status,
recordStatus: recorded.status,
persisted: true,
externalWritePerformed: false,
});
}
const result = {
ticket: 'TK-10995',
intent: 'Five local end-to-end verification sweeps of the approval viewer',
riskTier: 'R2 local user-facing flow',
environment: base,
startedAt,
finishedAt: new Date().toISOString(),
constraints: { emailSent: false, spendUsd: 0, productionActions: false },
sweeps,
verdict: sweeps.length === 5 && sweeps.every((sweep) => sweep.verdict === 'PASS') ? 'PASS' : 'FAIL',
};
fs.writeFileSync(evidencePath, `${JSON.stringify(result, null, 2)}\n`);
console.log(JSON.stringify(result, null, 2));