a11oy / test /gates /composition_overhead.test.ts
betterwithage's picture
sync(space): complete build context — fix BUILD_ERROR (CTO)
518343a verified
Raw
History Blame
7.57 kB
/**
* composition_overhead.test.ts
*
* Vitest tests for the Lutar.Composition.Overhead.composition_overhead_bound gate.
*
* Tests:
* 1. 1000-input random test — verifies totalOverhead ≤ N*C inequality holds
* 2. Edge cases: empty pipeline, singleton, large N
* 3. Pipeline append tests
* 4. Receipt emission with mock signer
*
* Lean commit: c4d13795689601324fce0236351bfe0ade990a43
*/
import { describe, it, expect } from "vitest";
import {
totalOverhead,
checkCompositionOverheadBound,
appendPipelines,
emitCompositionOverheadReceipt,
compositionOverheadGate,
type CostSystem,
type BoundedPipeline,
type Signer,
} from "../../src/gates/composition_overhead";
// ---------------------------------------------------------------------------
// Seeded LCG
// ---------------------------------------------------------------------------
function seedRandom(seed: number) {
let s = seed >>> 0;
return () => {
s = (Math.imul(1664525, s) + 1013904223) >>> 0;
return s / 0x100000000;
};
}
// ---------------------------------------------------------------------------
// Mock signer
// ---------------------------------------------------------------------------
const mockSigner: Signer = (payload: string) =>
`mock-sig::${Buffer.from(payload).slice(0, 16).toString("hex")}`;
// ---------------------------------------------------------------------------
// 1. 1000-input random overhead bound test
// ---------------------------------------------------------------------------
describe("composition_overhead: 1000-input random bound test", () => {
it("totalOverhead ≤ N * C always holds when all costs ≤ C", () => {
const rand = seedRandom(0xabcdef01);
let violations = 0;
for (let i = 0; i < 1000; i++) {
const cap = Math.ceil(rand() * 100) + 1; // cap in [1,101]
const N = Math.ceil(rand() * 20) + 1; // N in [1,21]
const systems: CostSystem[] = Array.from({ length: N }, () => ({
cost: Math.ceil(rand() * cap), // cost in [1, cap]
}));
const total = totalOverhead(systems);
const bound = N * cap;
if (total > bound) violations++;
}
expect(violations).toBe(0);
});
it("checkCompositionOverheadBound returns true for 1000 random valid pipelines", () => {
const rand = seedRandom(0xbeef1234);
let failures = 0;
for (let i = 0; i < 1000; i++) {
const cap = Math.ceil(rand() * 50) + 1;
const N = Math.ceil(rand() * 15) + 1;
const systems: CostSystem[] = Array.from({ length: N }, () => ({
cost: Math.ceil(rand() * cap),
}));
const pipeline: BoundedPipeline = { systems, cap };
if (!checkCompositionOverheadBound(pipeline)) failures++;
}
expect(failures).toBe(0);
});
});
// ---------------------------------------------------------------------------
// 2. Edge cases
// ---------------------------------------------------------------------------
describe("composition_overhead: edge cases", () => {
it("empty pipeline has totalOverhead = 0", () => {
expect(totalOverhead([])).toBe(0);
});
it("singleton pipeline: overhead = cost", () => {
const s: CostSystem = { cost: 7 };
expect(totalOverhead([s])).toBe(7);
});
it("singleton pipeline bound: 7 ≤ 1 * 10", () => {
const pipeline: BoundedPipeline = { systems: [{ cost: 7 }], cap: 10 };
expect(checkCompositionOverheadBound(pipeline)).toBe(true);
});
it("pipeline where all costs = cap → bound is tight (N*C = N*C)", () => {
const cap = 5;
const N = 4;
const systems: CostSystem[] = Array.from({ length: N }, () => ({ cost: cap }));
expect(totalOverhead(systems)).toBe(N * cap);
expect(checkCompositionOverheadBound({ systems, cap })).toBe(true);
});
it("returns false when a system cost exceeds cap", () => {
const pipeline: BoundedPipeline = {
systems: [{ cost: 5 }, { cost: 15 }],
cap: 10,
};
expect(checkCompositionOverheadBound(pipeline)).toBe(false);
});
it("returns false when cap = 0", () => {
const pipeline: BoundedPipeline = { systems: [{ cost: 1 }], cap: 0 };
expect(checkCompositionOverheadBound(pipeline)).toBe(false);
});
it("large N (1000) all costs = 1, cap = 1 → bound tight", () => {
const N = 1000;
const systems: CostSystem[] = Array.from({ length: N }, () => ({ cost: 1 }));
expect(totalOverhead(systems)).toBe(N);
expect(checkCompositionOverheadBound({ systems, cap: 1 })).toBe(true);
});
});
// ---------------------------------------------------------------------------
// 3. Pipeline append (BoundedPipeline.append)
// ---------------------------------------------------------------------------
describe("composition_overhead: pipeline append", () => {
it("appending two pipelines with same cap is valid", () => {
const p1: BoundedPipeline = { systems: [{ cost: 3 }, { cost: 2 }], cap: 5 };
const p2: BoundedPipeline = { systems: [{ cost: 1 }, { cost: 4 }], cap: 5 };
const merged = appendPipelines(p1, p2);
expect(merged.systems.length).toBe(4);
expect(merged.cap).toBe(5);
expect(checkCompositionOverheadBound(merged)).toBe(true);
});
it("appending throws on cap mismatch", () => {
const p1: BoundedPipeline = { systems: [{ cost: 3 }], cap: 5 };
const p2: BoundedPipeline = { systems: [{ cost: 2 }], cap: 7 };
expect(() => appendPipelines(p1, p2)).toThrow("cap mismatch");
});
it("overhead additivity: append preserves total overhead sum", () => {
const p1: BoundedPipeline = { systems: [{ cost: 3 }, { cost: 2 }], cap: 10 };
const p2: BoundedPipeline = { systems: [{ cost: 1 }, { cost: 4 }], cap: 10 };
const merged = appendPipelines(p1, p2);
expect(totalOverhead(merged.systems)).toBe(
totalOverhead(p1.systems) + totalOverhead(p2.systems)
);
});
});
// ---------------------------------------------------------------------------
// 4. Receipt emission
// ---------------------------------------------------------------------------
describe("composition_overhead: DSSE receipt emission", () => {
it("emits receipt with correct theorem and commit SHA", () => {
const pipeline: BoundedPipeline = {
systems: [{ cost: 3 }, { cost: 2 }],
cap: 5,
};
const receipt = emitCompositionOverheadReceipt(pipeline, mockSigner);
expect(receipt.theorem).toBe(
"Lutar.Composition.Overhead.composition_overhead_bound"
);
expect(receipt.lean_commit_sha).toBe(
"c4d13795689601324fce0236351bfe0ade990a43"
);
expect(receipt.output).toBe(true);
expect(receipt.inputs_hash).toMatch(/^[0-9a-f]{64}$/);
expect(receipt.sig).toContain("mock-sig::");
});
it("receipt output = false when bound violated", () => {
const pipeline: BoundedPipeline = {
systems: [{ cost: 20 }],
cap: 5,
};
const receipt = emitCompositionOverheadReceipt(pipeline, mockSigner);
expect(receipt.output).toBe(false);
});
it("gate returns boundHolds and receipt", () => {
const pipeline: BoundedPipeline = { systems: [{ cost: 4 }], cap: 4 };
const { boundHolds, receipt } = compositionOverheadGate(pipeline, mockSigner);
expect(boundHolds).toBe(true);
expect(receipt.output).toBe(true);
});
it("identical pipelines yield identical inputs_hash", () => {
const p: BoundedPipeline = { systems: [{ cost: 2 }], cap: 5 };
const r1 = emitCompositionOverheadReceipt(p, mockSigner);
const r2 = emitCompositionOverheadReceipt(p, mockSigner);
expect(r1.inputs_hash).toBe(r2.inputs_hash);
});
});