From e201eb4a493b2f2dacf47cb195338b12b81df3a2 Mon Sep 17 00:00:00 2001 From: Gwani-28 Date: Mon, 1 Jun 2026 22:52:31 +0900 Subject: [PATCH] Add compute meter replay guard --- compute-meter-replay-guard/README.md | 76 +++++ .../demo/compute-meter-replay-demo.mp4 | Bin 0 -> 55120 bytes .../demo/decision-flow.png | Bin 0 -> 74247 bytes .../demo/decision-flow.svg | 25 ++ .../demo/sample-report.json | 96 ++++++ .../demo/sample-report.md | 59 ++++ .../fixtures/compute-meter-events.json | 140 ++++++++ .../src/compute-meter-replay-guard.mjs | 307 ++++++++++++++++++ compute-meter-replay-guard/test/run-tests.mjs | 79 +++++ 9 files changed, 782 insertions(+) create mode 100644 compute-meter-replay-guard/README.md create mode 100644 compute-meter-replay-guard/demo/compute-meter-replay-demo.mp4 create mode 100644 compute-meter-replay-guard/demo/decision-flow.png create mode 100644 compute-meter-replay-guard/demo/decision-flow.svg create mode 100644 compute-meter-replay-guard/demo/sample-report.json create mode 100644 compute-meter-replay-guard/demo/sample-report.md create mode 100644 compute-meter-replay-guard/fixtures/compute-meter-events.json create mode 100644 compute-meter-replay-guard/src/compute-meter-replay-guard.mjs create mode 100644 compute-meter-replay-guard/test/run-tests.mjs diff --git a/compute-meter-replay-guard/README.md b/compute-meter-replay-guard/README.md new file mode 100644 index 00000000..6e8c0a2d --- /dev/null +++ b/compute-meter-replay-guard/README.md @@ -0,0 +1,76 @@ +# Compute Meter Replay Guard + +This module adds a deterministic guard for AI compute revenue metering before +usage events are converted into invoice lines. + +It is scoped to synthetic billing telemetry only. It does not connect to Stripe, +PayPal, bank accounts, wallets, customer systems, cloud meters, or private +research data. + +## Why This Belongs In Revenue Infrastructure + +Usage-based AI billing depends on reliable metering. A replay job, duplicate +event, missing idempotency key, stale correction, or unauthorized negative +adjustment can overbill customers, underbill usage, or create finance disputes. +This guard reviews a batch of synthetic meter events and decides whether the +invoice run can proceed, needs repricing, or must be held. + +## Checks + +- Missing idempotency keys before billing. +- Duplicate idempotency keys inside the replay window. +- Reused invoice-line IDs across separate usage events. +- Source sequence gaps that may indicate lost meter events. +- Corrections older than the allowed correction window. +- Negative adjustments without an authorized finance or meter role. +- Plan and entitlement mismatches between event metadata and account state. +- Event timestamp ordering problems. + +## Usage + +```bash +node compute-meter-replay-guard/src/compute-meter-replay-guard.mjs \ + compute-meter-replay-guard/fixtures/compute-meter-events.json \ + --format markdown +``` + +JSON output: + +```bash +node compute-meter-replay-guard/src/compute-meter-replay-guard.mjs \ + compute-meter-replay-guard/fixtures/compute-meter-events.json \ + --format json +``` + +## Validation + +```bash +node compute-meter-replay-guard/test/run-tests.mjs +``` + +Expected result: + +```text +compute meter replay guard tests passed +``` + +## Demo Artifacts + +- `demo/sample-report.md` +- `demo/sample-report.json` +- `demo/decision-flow.svg` +- `demo/decision-flow.png` +- `demo/compute-meter-replay-demo.mp4` + +## Scope Boundaries + +This assistant intentionally avoids: + +- live payment processors, banks, wallets, cards, or invoices; +- real customer data; +- external APIs or cloud billing systems; +- tax, accounting, legal, or financial advice; +- replacing human finance approval. + +It is a pre-invoice control that highlights billing evidence gaps and replay +risks for review. diff --git a/compute-meter-replay-guard/demo/compute-meter-replay-demo.mp4 b/compute-meter-replay-guard/demo/compute-meter-replay-demo.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ed88919abaeca4b35dff0d51867bb2ecd5dc8f85 GIT binary patch literal 55120 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 Y#Ae1nh#^ctfMxmwuuR#34;$P60He2f;{X5v literal 0 HcmV?d00001 diff --git a/compute-meter-replay-guard/demo/decision-flow.png b/compute-meter-replay-guard/demo/decision-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..1bcf5fc386589444a43fbb93fc681cc5779425a2 GIT binary patch literal 74247 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

AntB(=!J6Q<^hO?vu8-v55IuLSe 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 literal 0 HcmV?d00001 diff --git a/compute-meter-replay-guard/demo/decision-flow.svg b/compute-meter-replay-guard/demo/decision-flow.svg new file mode 100644 index 00000000..1e0847ee --- /dev/null +++ b/compute-meter-replay-guard/demo/decision-flow.svg @@ -0,0 +1,25 @@ + + + Compute Meter Replay Guard + Pre-invoice control for replayed AI usage-meter events + + 1. Load meter events + Synthetic usage, corrections, accounts + + 2. Detect replay risk + Idempotency, sequence gaps, stale fixes + + 3. Hold or reprice + Prevent duplicate billing and disputes + + + + Demo result: HOLD + Critical: duplicate idempotency key, duplicate invoice line, unauthorized negative adjustment + High: source sequence gap, stale correction, plan mismatch, missing idempotency key + + + + + + diff --git a/compute-meter-replay-guard/demo/sample-report.json b/compute-meter-replay-guard/demo/sample-report.json new file mode 100644 index 00000000..dd16bd65 --- /dev/null +++ b/compute-meter-replay-guard/demo/sample-report.json @@ -0,0 +1,96 @@ +{ + "runId": "REV-METER-001", + "title": "June AI compute replay pre-invoice check", + "generatedAt": "2026-06-01T13:50:00Z", + "assistant": "compute-meter-replay-guard", + "decision": "hold", + "severityCounts": { + "critical": 3, + "high": 4, + "medium": 1, + "low": 0 + }, + "findings": [ + { + "severity": "critical", + "eventIds": [ + "E-001", + "E-002" + ], + "check": "duplicate-idempotency-key", + "evidence": "Idempotency key lab-pro:run-77:chunk-1 appears 2 times over 0.0 hours.", + "remediation": "Bill only the first accepted event and quarantine replay duplicates before invoice lines are generated." + }, + { + "severity": "critical", + "eventIds": [ + "E-007", + "E-008" + ], + "check": "duplicate-invoice-line", + "evidence": "Invoice line line-502 is referenced by 2 events.", + "remediation": "Hold the invoice run and regenerate invoice-line mapping from accepted meter events." + }, + { + "severity": "critical", + "eventIds": [ + "E-004" + ], + "check": "unauthorized-negative-adjustment", + "evidence": "E-004 applies -2400 cents with role support-agent.", + "remediation": "Require finance or meter-admin approval before applying a negative adjustment." + }, + { + "severity": "high", + "eventIds": [ + "E-005" + ], + "check": "entitlement-plan-mismatch", + "evidence": "E-005 was metered as individual-pro, but account acct-institution is on institution.", + "remediation": "Reprice the event under the account's active plan or hold invoice release." + }, + { + "severity": "high", + "eventIds": [ + "E-006" + ], + "check": "missing-idempotency-key", + "evidence": "E-006 has no idempotency key.", + "remediation": "Reject or enrich the event before it can create an invoice line." + }, + { + "severity": "high", + "eventIds": [ + "E-002", + "E-003" + ], + "check": "source-sequence-gap", + "evidence": "acct-lab-pro:usage-api jumps from sequence 101 to 104.", + "remediation": "Check replay source logs for missing usage before releasing invoice totals." + }, + { + "severity": "high", + "eventIds": [ + "E-004" + ], + "check": "stale-correction", + "evidence": "E-004 correction age is 167.1 hours.", + "remediation": "Route old corrections through a manual reprice or credit memo review." + }, + { + "severity": "medium", + "eventIds": [ + "E-006" + ], + "check": "timestamp-ordering", + "evidence": "E-006 was received before it occurred.", + "remediation": "Normalize source clocks or hold the event from invoice release." + } + ], + "financePrompts": [ + "Which replay jobs can create duplicate invoice lines, and where should idempotency be enforced?", + "Which meter source logs prove whether missing sequence numbers represent lost usage or skipped test events?", + "Which correction approvals should route to credit memo review instead of automatic invoice repricing?", + "Which account plan snapshot should be used as the billable source of truth for this invoice run?" + ] +} diff --git a/compute-meter-replay-guard/demo/sample-report.md b/compute-meter-replay-guard/demo/sample-report.md new file mode 100644 index 00000000..85f49f06 --- /dev/null +++ b/compute-meter-replay-guard/demo/sample-report.md @@ -0,0 +1,59 @@ +# Compute Meter Replay Guard - REV-METER-001 + +Decision: HOLD + +## Severity Counts + +- Critical: 3 +- High: 4 +- Medium: 1 +- Low: 0 + +## Findings + +### [CRITICAL] duplicate-idempotency-key +- Events: E-001, E-002 +- Evidence: Idempotency key lab-pro:run-77:chunk-1 appears 2 times over 0.0 hours. +- Remediation: Bill only the first accepted event and quarantine replay duplicates before invoice lines are generated. + +### [CRITICAL] duplicate-invoice-line +- Events: E-007, E-008 +- Evidence: Invoice line line-502 is referenced by 2 events. +- Remediation: Hold the invoice run and regenerate invoice-line mapping from accepted meter events. + +### [CRITICAL] unauthorized-negative-adjustment +- Events: E-004 +- Evidence: E-004 applies -2400 cents with role support-agent. +- Remediation: Require finance or meter-admin approval before applying a negative adjustment. + +### [HIGH] entitlement-plan-mismatch +- Events: E-005 +- Evidence: E-005 was metered as individual-pro, but account acct-institution is on institution. +- Remediation: Reprice the event under the account's active plan or hold invoice release. + +### [HIGH] missing-idempotency-key +- Events: E-006 +- Evidence: E-006 has no idempotency key. +- Remediation: Reject or enrich the event before it can create an invoice line. + +### [HIGH] source-sequence-gap +- Events: E-002, E-003 +- Evidence: acct-lab-pro:usage-api jumps from sequence 101 to 104. +- Remediation: Check replay source logs for missing usage before releasing invoice totals. + +### [HIGH] stale-correction +- Events: E-004 +- Evidence: E-004 correction age is 167.1 hours. +- Remediation: Route old corrections through a manual reprice or credit memo review. + +### [MEDIUM] timestamp-ordering +- Events: E-006 +- Evidence: E-006 was received before it occurred. +- Remediation: Normalize source clocks or hold the event from invoice release. + +## Finance Prompts + +- Which replay jobs can create duplicate invoice lines, and where should idempotency be enforced? +- Which meter source logs prove whether missing sequence numbers represent lost usage or skipped test events? +- Which correction approvals should route to credit memo review instead of automatic invoice repricing? +- Which account plan snapshot should be used as the billable source of truth for this invoice run? diff --git a/compute-meter-replay-guard/fixtures/compute-meter-events.json b/compute-meter-replay-guard/fixtures/compute-meter-events.json new file mode 100644 index 00000000..f7912b00 --- /dev/null +++ b/compute-meter-replay-guard/fixtures/compute-meter-events.json @@ -0,0 +1,140 @@ +{ + "runId": "REV-METER-001", + "title": "June AI compute replay pre-invoice check", + "generatedAt": "2026-06-01T13:50:00Z", + "policy": { + "duplicateReplayWindowHours": 24, + "maxCorrectionAgeHours": 72, + "allowedNegativeAdjustmentRoles": ["finance-ops", "meter-admin"], + "invoiceHoldThresholdCents": 10000 + }, + "accounts": [ + { + "id": "acct-lab-pro", + "currentPlan": "lab-pro", + "allowedMeterSources": ["usage-api", "batch-replay"], + "monthlyQuotaTokens": 1000000 + }, + { + "id": "acct-institution", + "currentPlan": "institution", + "allowedMeterSources": ["meter-gateway"], + "monthlyQuotaTokens": 5000000 + } + ], + "events": [ + { + "eventId": "E-001", + "accountId": "acct-lab-pro", + "source": "usage-api", + "sequence": 100, + "type": "usage", + "plan": "lab-pro", + "idempotencyKey": "lab-pro:run-77:chunk-1", + "invoiceLineId": "line-100", + "usageTokens": 120000, + "amountCents": 2400, + "occurredAt": "2026-05-31T09:00:00Z", + "receivedAt": "2026-05-31T09:00:08Z" + }, + { + "eventId": "E-002", + "accountId": "acct-lab-pro", + "source": "usage-api", + "sequence": 101, + "type": "usage", + "plan": "lab-pro", + "idempotencyKey": "lab-pro:run-77:chunk-1", + "invoiceLineId": "line-101", + "usageTokens": 120000, + "amountCents": 2400, + "occurredAt": "2026-05-31T09:01:00Z", + "receivedAt": "2026-05-31T09:01:06Z" + }, + { + "eventId": "E-003", + "accountId": "acct-lab-pro", + "source": "usage-api", + "sequence": 104, + "type": "usage", + "plan": "lab-pro", + "idempotencyKey": "lab-pro:run-77:chunk-4", + "invoiceLineId": "line-104", + "usageTokens": 80000, + "amountCents": 1600, + "occurredAt": "2026-05-31T09:04:00Z", + "receivedAt": "2026-05-31T09:04:04Z" + }, + { + "eventId": "E-004", + "accountId": "acct-lab-pro", + "source": "batch-replay", + "sequence": 105, + "type": "correction", + "plan": "lab-pro", + "idempotencyKey": "lab-pro:correction:E-001", + "correctionOf": "E-001", + "adjustmentRole": "support-agent", + "usageTokens": -120000, + "amountCents": -2400, + "occurredAt": "2026-05-25T10:00:00Z", + "receivedAt": "2026-06-01T09:05:00Z" + }, + { + "eventId": "E-005", + "accountId": "acct-institution", + "source": "meter-gateway", + "sequence": 1, + "type": "usage", + "plan": "individual-pro", + "idempotencyKey": "inst:job-4:part-1", + "invoiceLineId": "line-500", + "usageTokens": 900000, + "amountCents": 18000, + "occurredAt": "2026-05-31T12:00:00Z", + "receivedAt": "2026-05-31T12:00:12Z" + }, + { + "eventId": "E-006", + "accountId": "acct-institution", + "source": "meter-gateway", + "sequence": 2, + "type": "usage", + "plan": "institution", + "idempotencyKey": "", + "invoiceLineId": "line-501", + "usageTokens": 300000, + "amountCents": 6000, + "occurredAt": "2026-05-31T12:06:00Z", + "receivedAt": "2026-05-31T12:05:55Z" + }, + { + "eventId": "E-007", + "accountId": "acct-institution", + "source": "meter-gateway", + "sequence": 3, + "type": "usage", + "plan": "institution", + "idempotencyKey": "inst:job-5:part-1", + "invoiceLineId": "line-502", + "usageTokens": 100000, + "amountCents": 2000, + "occurredAt": "2026-05-31T12:07:00Z", + "receivedAt": "2026-05-31T12:07:04Z" + }, + { + "eventId": "E-008", + "accountId": "acct-institution", + "source": "meter-gateway", + "sequence": 4, + "type": "usage", + "plan": "institution", + "idempotencyKey": "inst:job-5:part-2", + "invoiceLineId": "line-502", + "usageTokens": 100000, + "amountCents": 2000, + "occurredAt": "2026-05-31T12:08:00Z", + "receivedAt": "2026-05-31T12:08:04Z" + } + ] +} diff --git a/compute-meter-replay-guard/src/compute-meter-replay-guard.mjs b/compute-meter-replay-guard/src/compute-meter-replay-guard.mjs new file mode 100644 index 00000000..04e3655e --- /dev/null +++ b/compute-meter-replay-guard/src/compute-meter-replay-guard.mjs @@ -0,0 +1,307 @@ +#!/usr/bin/env node +import fs from "node:fs"; +import path from "node:path"; + +const SEVERITY_SCORE = { + critical: 4, + high: 3, + medium: 2, + low: 1 +}; + +function hoursBetween(startIso, endIso) { + const start = new Date(startIso).getTime(); + const end = new Date(endIso).getTime(); + return (end - start) / 36e5; +} + +function finding(severity, eventIds, check, evidence, remediation) { + return { severity, eventIds, check, evidence, remediation }; +} + +function makeAccountMap(packet) { + return new Map((packet.accounts || []).map((account) => [account.id, account])); +} + +function groupBy(events, keyFn) { + const grouped = new Map(); + for (const event of events) { + const key = keyFn(event); + if (!key) continue; + if (!grouped.has(key)) grouped.set(key, []); + grouped.get(key).push(event); + } + return grouped; +} + +function checkEventBasics(packet, accountMap) { + const findings = []; + const policy = packet.policy || {}; + const allowedNegativeRoles = new Set(policy.allowedNegativeAdjustmentRoles || []); + + for (const event of packet.events || []) { + const account = accountMap.get(event.accountId); + + if (!account) { + findings.push(finding( + "critical", + [event.eventId], + "unknown-account", + `${event.eventId} references missing account ${event.accountId}.`, + "Hold billing until the meter event is linked to a valid account record." + )); + continue; + } + + if (!event.idempotencyKey) { + findings.push(finding( + "high", + [event.eventId], + "missing-idempotency-key", + `${event.eventId} has no idempotency key.`, + "Reject or enrich the event before it can create an invoice line." + )); + } + + if (!account.allowedMeterSources.includes(event.source)) { + findings.push(finding( + "high", + [event.eventId], + "unauthorized-meter-source", + `${event.source} is not an allowed meter source for ${event.accountId}.`, + "Route the event through an approved metering source or hold billing." + )); + } + + if (event.plan !== account.currentPlan) { + findings.push(finding( + "high", + [event.eventId], + "entitlement-plan-mismatch", + `${event.eventId} was metered as ${event.plan}, but account ${event.accountId} is on ${account.currentPlan}.`, + "Reprice the event under the account's active plan or hold invoice release." + )); + } + + if (event.usageTokens > account.monthlyQuotaTokens) { + findings.push(finding( + "medium", + [event.eventId], + "quota-outlier", + `${event.eventId} reports ${event.usageTokens} tokens against quota ${account.monthlyQuotaTokens}.`, + "Confirm overage policy before invoice generation." + )); + } + + if (new Date(event.receivedAt).getTime() < new Date(event.occurredAt).getTime()) { + findings.push(finding( + "medium", + [event.eventId], + "timestamp-ordering", + `${event.eventId} was received before it occurred.`, + "Normalize source clocks or hold the event from invoice release." + )); + } + + if ((event.amountCents || 0) < 0 && !allowedNegativeRoles.has(event.adjustmentRole)) { + findings.push(finding( + "critical", + [event.eventId], + "unauthorized-negative-adjustment", + `${event.eventId} applies ${event.amountCents} cents with role ${event.adjustmentRole || "missing"}.`, + "Require finance or meter-admin approval before applying a negative adjustment." + )); + } + + if (event.type === "correction") { + const ageHours = hoursBetween(event.occurredAt, event.receivedAt); + if (ageHours > (policy.maxCorrectionAgeHours || 72)) { + findings.push(finding( + "high", + [event.eventId], + "stale-correction", + `${event.eventId} correction age is ${ageHours.toFixed(1)} hours.`, + "Route old corrections through a manual reprice or credit memo review." + )); + } + } + } + + return findings; +} + +function checkDuplicateKeys(packet) { + const findings = []; + const policy = packet.policy || {}; + const events = packet.events || []; + const byKey = groupBy(events, (event) => `${event.accountId}:${event.source}:${event.idempotencyKey}`); + + for (const [, matches] of byKey) { + if (matches.length < 2) continue; + const sorted = [...matches].sort((a, b) => new Date(a.receivedAt) - new Date(b.receivedAt)); + const spanHours = hoursBetween(sorted[0].receivedAt, sorted[sorted.length - 1].receivedAt); + const severity = spanHours <= (policy.duplicateReplayWindowHours || 24) ? "critical" : "medium"; + findings.push(finding( + severity, + sorted.map((event) => event.eventId), + "duplicate-idempotency-key", + `Idempotency key ${sorted[0].idempotencyKey} appears ${sorted.length} times over ${spanHours.toFixed(1)} hours.`, + "Bill only the first accepted event and quarantine replay duplicates before invoice lines are generated." + )); + } + + const byInvoiceLine = groupBy(events, (event) => event.invoiceLineId); + for (const [invoiceLineId, matches] of byInvoiceLine) { + if (matches.length < 2) continue; + findings.push(finding( + "critical", + matches.map((event) => event.eventId), + "duplicate-invoice-line", + `Invoice line ${invoiceLineId} is referenced by ${matches.length} events.`, + "Hold the invoice run and regenerate invoice-line mapping from accepted meter events." + )); + } + + return findings; +} + +function checkSequences(packet) { + const findings = []; + const byStream = groupBy(packet.events || [], (event) => `${event.accountId}:${event.source}`); + + for (const [stream, events] of byStream) { + const sorted = [...events].sort((a, b) => a.sequence - b.sequence); + for (let index = 1; index < sorted.length; index += 1) { + const previous = sorted[index - 1]; + const current = sorted[index]; + const gap = current.sequence - previous.sequence; + if (gap > 1) { + findings.push(finding( + "high", + [previous.eventId, current.eventId], + "source-sequence-gap", + `${stream} jumps from sequence ${previous.sequence} to ${current.sequence}.`, + "Check replay source logs for missing usage before releasing invoice totals." + )); + } + } + } + + return findings; +} + +function summarizeDecision(findings) { + const counts = findings.reduce((acc, item) => { + acc[item.severity] = (acc[item.severity] || 0) + 1; + return acc; + }, {}); + + let decision = "invoice"; + if ((counts.critical || 0) > 0) { + decision = "hold"; + } else if ((counts.high || 0) > 0 || (counts.medium || 0) >= 3) { + decision = "reprice"; + } + + return { + decision, + counts: { + critical: counts.critical || 0, + high: counts.high || 0, + medium: counts.medium || 0, + low: counts.low || 0 + } + }; +} + +function makeFinancePrompts(findings) { + const checks = new Set(findings.map((item) => item.check)); + const prompts = []; + if (checks.has("duplicate-idempotency-key") || checks.has("duplicate-invoice-line")) { + prompts.push("Which replay jobs can create duplicate invoice lines, and where should idempotency be enforced?"); + } + if (checks.has("source-sequence-gap")) { + prompts.push("Which meter source logs prove whether missing sequence numbers represent lost usage or skipped test events?"); + } + if (checks.has("stale-correction") || checks.has("unauthorized-negative-adjustment")) { + prompts.push("Which correction approvals should route to credit memo review instead of automatic invoice repricing?"); + } + if (checks.has("entitlement-plan-mismatch")) { + prompts.push("Which account plan snapshot should be used as the billable source of truth for this invoice run?"); + } + return prompts; +} + +export function analyzePacket(packet) { + const accountMap = makeAccountMap(packet); + const findings = [ + ...checkEventBasics(packet, accountMap), + ...checkDuplicateKeys(packet), + ...checkSequences(packet) + ]; + const summary = summarizeDecision(findings); + + return { + runId: packet.runId, + title: packet.title, + generatedAt: packet.generatedAt, + assistant: "compute-meter-replay-guard", + decision: summary.decision, + severityCounts: summary.counts, + findings: findings.sort((a, b) => { + return (SEVERITY_SCORE[b.severity] || 0) - (SEVERITY_SCORE[a.severity] || 0) + || a.check.localeCompare(b.check); + }), + financePrompts: makeFinancePrompts(findings) + }; +} + +export function renderMarkdown(report) { + const lines = [ + `# Compute Meter Replay Guard - ${report.runId}`, + "", + `Decision: ${report.decision.toUpperCase()}`, + "", + "## Severity Counts", + "", + `- Critical: ${report.severityCounts.critical}`, + `- High: ${report.severityCounts.high}`, + `- Medium: ${report.severityCounts.medium}`, + `- Low: ${report.severityCounts.low}`, + "", + "## Findings", + "" + ]; + + for (const item of report.findings) { + lines.push(`### [${item.severity.toUpperCase()}] ${item.check}`); + lines.push(`- Events: ${item.eventIds.join(", ")}`); + lines.push(`- Evidence: ${item.evidence}`); + lines.push(`- Remediation: ${item.remediation}`); + lines.push(""); + } + + lines.push("## Finance Prompts"); + lines.push(""); + for (const prompt of report.financePrompts) { + lines.push(`- ${prompt}`); + } + lines.push(""); + + return lines.join("\n"); +} + +function runCli() { + const [, scriptPath, fixturePath, , format = "json"] = process.argv; + if (!fixturePath || !scriptPath.endsWith("compute-meter-replay-guard.mjs")) return; + + const packet = JSON.parse(fs.readFileSync(path.resolve(fixturePath), "utf8")); + const report = analyzePacket(packet); + if (format === "markdown") { + process.stdout.write(renderMarkdown(report)); + } else { + process.stdout.write(`${JSON.stringify(report, null, 2)}\n`); + } +} + +runCli(); diff --git a/compute-meter-replay-guard/test/run-tests.mjs b/compute-meter-replay-guard/test/run-tests.mjs new file mode 100644 index 00000000..165e98a7 --- /dev/null +++ b/compute-meter-replay-guard/test/run-tests.mjs @@ -0,0 +1,79 @@ +#!/usr/bin/env node +import assert from "node:assert/strict"; +import fs from "node:fs"; +import path from "node:path"; +import { analyzePacket, renderMarkdown } from "../src/compute-meter-replay-guard.mjs"; + +const fixturePath = path.resolve("compute-meter-replay-guard/fixtures/compute-meter-events.json"); +const packet = JSON.parse(fs.readFileSync(fixturePath, "utf8")); +const report = analyzePacket(packet); + +assert.equal(report.assistant, "compute-meter-replay-guard"); +assert.equal(report.decision, "hold"); +assert.equal(report.severityCounts.critical, 3); +assert.equal(report.severityCounts.high, 4); +assert.equal(report.severityCounts.medium, 1); +assert.ok(report.findings.some((finding) => finding.check === "duplicate-idempotency-key")); +assert.ok(report.findings.some((finding) => finding.check === "duplicate-invoice-line")); +assert.ok(report.findings.some((finding) => finding.check === "unauthorized-negative-adjustment")); +assert.ok(report.findings.some((finding) => finding.check === "entitlement-plan-mismatch")); +assert.ok(report.financePrompts.some((prompt) => prompt.includes("idempotency"))); + +const markdown = renderMarkdown(report); +assert.match(markdown, /Decision: HOLD/); +assert.match(markdown, /Compute Meter Replay Guard/); +assert.match(markdown, /duplicate-invoice-line/); + +const cleanPacket = { + runId: "REV-CLEAN", + title: "Clean invoice run", + generatedAt: "2026-06-01T13:50:00Z", + policy: { + duplicateReplayWindowHours: 24, + maxCorrectionAgeHours: 72, + allowedNegativeAdjustmentRoles: ["finance-ops"], + invoiceHoldThresholdCents: 10000 + }, + accounts: [{ + id: "acct-clean", + currentPlan: "lab-pro", + allowedMeterSources: ["usage-api"], + monthlyQuotaTokens: 1000000 + }], + events: [ + { + eventId: "E-clean-1", + accountId: "acct-clean", + source: "usage-api", + sequence: 1, + type: "usage", + plan: "lab-pro", + idempotencyKey: "clean:1", + invoiceLineId: "clean-line-1", + usageTokens: 250000, + amountCents: 5000, + occurredAt: "2026-06-01T01:00:00Z", + receivedAt: "2026-06-01T01:00:03Z" + }, + { + eventId: "E-clean-2", + accountId: "acct-clean", + source: "usage-api", + sequence: 2, + type: "usage", + plan: "lab-pro", + idempotencyKey: "clean:2", + invoiceLineId: "clean-line-2", + usageTokens: 100000, + amountCents: 2000, + occurredAt: "2026-06-01T02:00:00Z", + receivedAt: "2026-06-01T02:00:02Z" + } + ] +}; + +const cleanReport = analyzePacket(cleanPacket); +assert.equal(cleanReport.decision, "invoice"); +assert.equal(cleanReport.findings.length, 0); + +console.log("compute meter replay guard tests passed");