a11oy / src /gates /composition_overhead.ts
betterwithage's picture
sync(space): complete build context — fix BUILD_ERROR (CTO)
518343a verified
Raw
History Blame
5.83 kB
/**
* composition_overhead.ts
*
* Runtime instillation of Lean theorem:
* Lutar.Composition.Overhead.composition_overhead_bound
* File: Lutar/Composition/CompositionOverhead.lean
* Commit: c4d13795689601324fce0236351bfe0ade990a43
*
* Lean theorems formalised here:
* - `composition_overhead_bound` (line ~79): totalOverhead(systems) ≤ N * C
* - `totalOverhead_append` (line ~41): overhead is additive over list concat
* - `composition_overhead_strict_bound` (line ~96): strict bound for non-empty pipelines
*
* Runtime contract:
* Given a list of cost-bearing systems and a cap C, verify that the
* sum of their overhead costs does not exceed N * C.
*
* Doctrine v7: No new axioms. No sorries. STAGED label: FULLY WIRED.
*/
import { createHash } from "crypto";
// ---------------------------------------------------------------------------
// Domain types — mirrors Lean `CostSystem` and `BoundedPipeline`
// ---------------------------------------------------------------------------
/** Mirrors Lean `CostSystem`. Every system must have cost ≥ 1. */
export interface CostSystem {
/** Abstract overhead cost (positive integer). */
cost: number;
/** Human-readable system identifier. */
id?: string;
}
/** Mirrors Lean `BoundedPipeline`. */
export interface BoundedPipeline {
systems: CostSystem[];
cap: number;
}
/** DSSE-shaped receipt. */
export interface DSSEReceipt {
theorem: string;
lean_commit_sha: string;
inputs_hash: string;
output: boolean;
ts: string;
sig: string;
}
export type Signer = (payload: string) => string;
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
const LEAN_THEOREM = "Lutar.Composition.Overhead.composition_overhead_bound";
const LEAN_FILE_LINE = "Lutar/Composition/CompositionOverhead.lean:79";
const LEAN_COMMIT_SHA = "c4d13795689601324fce0236351bfe0ade990a43";
// ---------------------------------------------------------------------------
// Core functions — mirror Lean definitions
// ---------------------------------------------------------------------------
/**
* Computes the total overhead of a pipeline.
* Mirrors Lean: `totalOverhead (systems : List CostSystem) : OverheadCost`
*
* @param systems - List of cost systems.
* @returns Sum of all system costs.
*/
export function totalOverhead(systems: CostSystem[]): number {
return systems.reduce((acc, s) => acc + s.cost, 0);
}
/**
* Verifies the composition overhead bound:
* totalOverhead(systems) ≤ systems.length * C
*
* Lean theorem: `composition_overhead_bound`
* Lean file: Lutar/Composition/CompositionOverhead.lean:79
* Commit: c4d13795689601324fce0236351bfe0ade990a43
*
* Preconditions:
* - C > 0 (positive cap)
* - every system.cost ≤ C (individual bound)
*
* @param pipeline - The bounded pipeline to verify.
* @returns true iff the bound holds.
*/
export function checkCompositionOverheadBound(pipeline: BoundedPipeline): boolean {
const { systems, cap } = pipeline;
if (cap <= 0) return false;
const allUnderCap = systems.every((s) => s.cost >= 1 && s.cost <= cap);
if (!allUnderCap) return false;
const total = totalOverhead(systems);
return total <= systems.length * cap;
}
/**
* Concatenates two bounded pipelines with the same cap.
* Mirrors Lean `BoundedPipeline.append`.
*
* @param p1 - First pipeline.
* @param p2 - Second pipeline (must share same cap as p1).
* @returns A new BoundedPipeline.
*/
export function appendPipelines(
p1: BoundedPipeline,
p2: BoundedPipeline
): BoundedPipeline {
if (p1.cap !== p2.cap) {
throw new Error(
`appendPipelines: cap mismatch (${p1.cap} vs ${p2.cap}). ` +
"Lean BoundedPipeline.append requires equal caps."
);
}
return { systems: [...p1.systems, ...p2.systems], cap: p1.cap };
}
// ---------------------------------------------------------------------------
// Inputs hash helper
// ---------------------------------------------------------------------------
function hashInputs(pipeline: BoundedPipeline): string {
const payload = JSON.stringify({
systems: pipeline.systems.map((s) => s.cost),
cap: pipeline.cap,
});
return createHash("sha256").update(payload).digest("hex");
}
// ---------------------------------------------------------------------------
// DSSE receipt emitter
// ---------------------------------------------------------------------------
/**
* Evaluates the composition overhead bound and emits a DSSE receipt.
*
* Lean theorem: `Lutar.Composition.Overhead.composition_overhead_bound`
* File: Lutar/Composition/CompositionOverhead.lean:79
* Commit: c4d13795689601324fce0236351bfe0ade990a43
*
* @param pipeline - BoundedPipeline to verify.
* @param signer - Signing function.
* @returns DSSEReceipt with `output = true` iff bound holds.
*/
export function emitCompositionOverheadReceipt(
pipeline: BoundedPipeline,
signer: Signer
): DSSEReceipt {
const output = checkCompositionOverheadBound(pipeline);
const inputs_hash = hashInputs(pipeline);
const ts = new Date().toISOString();
const sigPayload = JSON.stringify({
theorem: LEAN_THEOREM,
lean_commit_sha: LEAN_COMMIT_SHA,
inputs_hash,
output,
ts,
});
return {
theorem: LEAN_THEOREM,
lean_commit_sha: LEAN_COMMIT_SHA,
inputs_hash,
output,
ts,
sig: signer(sigPayload),
};
}
/**
* Gate entry point for Lutar.Composition.Overhead.composition_overhead_bound.
*/
export function compositionOverheadGate(
pipeline: BoundedPipeline,
signer: Signer
): { boundHolds: boolean; receipt: DSSEReceipt } {
const receipt = emitCompositionOverheadReceipt(pipeline, signer);
return { boundHolds: receipt.output, receipt };
}