diff --git a/src/frontier-coverage/cli.ts b/src/frontier-coverage/cli.ts index f7cad0e0..1e2dda11 100644 --- a/src/frontier-coverage/cli.ts +++ b/src/frontier-coverage/cli.ts @@ -9,7 +9,7 @@ import { renderEndpointInventory, type EndpointInventoryReport, } from "./evidence-capture.js"; -import { FRONTIER_COVERAGE_MATRIX } from "./matrix.js"; +import { FRONTIER_COVERAGE_MATRIX, lookupCapability } from "./matrix.js"; import { renderCoverageRoadmap } from "./roadmap.js"; import { type CoverageCapability, @@ -220,7 +220,7 @@ export function buildCoverageInspectOutput( matrix: CoverageMatrix, capabilityId: string, ): CoverageInspectOutput { - const capability = matrix.capabilities.find((candidate) => candidate.id === capabilityId); + const capability = lookupCapability(matrix, capabilityId); return { operation: "coverage.inspect", status: capability ? "ready" : "blocked", diff --git a/src/frontier-coverage/evidence-capture.ts b/src/frontier-coverage/evidence-capture.ts index e798915c..262e3db3 100644 --- a/src/frontier-coverage/evidence-capture.ts +++ b/src/frontier-coverage/evidence-capture.ts @@ -1,6 +1,7 @@ import { createHash } from "node:crypto"; import { readFile } from "node:fs/promises"; import type { CoverageCapability, CoverageMatrix, CoverageStatus } from "./schema.js"; +import { lookupCapability } from "./matrix.js"; export interface CaptureEndpoint { method: string; @@ -320,7 +321,7 @@ export function buildCaptureKitReport( inventoryFile?: string | undefined; } = {}, ): CaptureKitReport { - const capability = matrix.capabilities.find((candidate) => candidate.id === capabilityId); + const capability = lookupCapability(matrix, capabilityId); const generatedAt = (options.generatedAt ?? new Date()).toISOString(); if (!capability) { return { diff --git a/src/frontier-coverage/matrix.ts b/src/frontier-coverage/matrix.ts index 5d04d0a1..078ab042 100644 --- a/src/frontier-coverage/matrix.ts +++ b/src/frontier-coverage/matrix.ts @@ -323,6 +323,20 @@ export function getCoverageMatrix(): CoverageMatrix { return FRONTIER_COVERAGE_MATRIX; } +const capabilityCache = new WeakMap>(); + +export function lookupCapability( + matrix: CoverageMatrix, + capabilityId: string, +): CoverageCapability | undefined { + let cache = capabilityCache.get(matrix); + if (!cache) { + cache = new Map(matrix.capabilities.map((c) => [c.id, c])); + capabilityCache.set(matrix, cache); + } + return cache.get(capabilityId); +} + export function getCoverageCapabilitiesByDomain(domain: CapabilityDomain): CoverageCapability[] { return FRONTIER_COVERAGE_MATRIX.capabilities.filter((capability) => capability.domain === domain); }