Audit & Compliance
AuditLogger (in-memory)
Every checkpoint produces hash-chained audit entries. Each entry links to the SHA-256 hash of the previous entry — tampering with a historical entry breaks every subsequent hash.
import { AuditLogger } from '@roadsidelab/keyspot-sdk';
const logger = new AuditLogger();
const entry = logger.log({ type: 'checkpoint', matchesFound: 3 });
// { event: { ... }, timestamp, prevHash, hash }
// Verify chain integrity
const valid = logger.verifyChain(logger.getEntries());
What is never logged: secret values, pattern IDs, field paths, agent identifiers, vault references — only outcomes.
{
"event": { "type": "checkpoint_end", "matchesFound": 2 },
"timestamp": 1717500000000,
"prevHash": "a3f9b2c1...",
"hash": "d7e2f4a9..."
}
PersistedAuditLogger (file-backed + Ed25519-signed)
For forensic-grade audit trails:
import {
PersistedAuditLogger,
generateSigningKeyPair,
} from '@roadsidelab/keyspot-sdk';
const kp = generateSigningKeyPair(); // Ed25519
const logger = new PersistedAuditLogger({
logDir: './audit-logs',
signingKeyPair: kp,
});
// Log with Ed25519 signature and cumulative chain root
logger.logSigned({ type: 'checkpoint', stateSummary: 'object' });
// Verify integrity of a log file
const result = logger.verifyAgainstFile();
// { valid: true, entries: 142, errors: [] }
// Anchor the chain root to Arbitrum One blockchain
await logger.anchorToArbitrum();
logger.close();
Compliance Utilities
import {
generateSigningKeyPair,
signEntry,
verifyEntrySignature,
} from '@roadsidelab/keyspot-sdk';
// Generate Ed25519 keys
const kp = generateSigningKeyPair();
// Sign and verify audit entries
const signature = signEntry(auditEntry, kp.privateKey);
const valid = verifyEntrySignature(auditEntry, signature, kp.publicKey);