@scanly/benchmark 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @scanly/benchmark
2
+
3
+ Machine-readable benchmark contracts and gates. Node pipeline timing and browser/device timing are separate measurement domains and must not be combined without labels.
package/dist/csv.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ /** RFC4180-style CSV field escaping. */
2
+ export declare function escapeCsvField(value: string | number | boolean | null | undefined): string;
3
+ export declare function toCsvRow(fields: Array<string | number | boolean | null | undefined>): string;
4
+ //# sourceMappingURL=csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../src/csv.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAO1F;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,CAE5F"}
package/dist/csv.js ADDED
@@ -0,0 +1,14 @@
1
+ /** RFC4180-style CSV field escaping. */
2
+ export function escapeCsvField(value) {
3
+ if (value === null || value === undefined)
4
+ return "";
5
+ const s = String(value);
6
+ if (/[",\r\n]/.test(s)) {
7
+ return `"${s.replace(/"/g, '""')}"`;
8
+ }
9
+ return s;
10
+ }
11
+ export function toCsvRow(fields) {
12
+ return fields.map(escapeCsvField).join(",");
13
+ }
14
+ //# sourceMappingURL=csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../src/csv.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,UAAU,cAAc,CAAC,KAAmD;IAChF,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAA2D;IAClF,OAAO,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { BenchmarkFixture } from "./types.js";
2
+ export interface FixtureEvaluation {
3
+ pass: boolean;
4
+ missingPayloads: string[];
5
+ unexpectedPayloads: string[];
6
+ }
7
+ export declare function expectedPayloads(fixture: BenchmarkFixture): string[];
8
+ export declare function requiredPayloads(fixture: BenchmarkFixture): string[];
9
+ export declare function requiredPayloadsForProfile(fixture: BenchmarkFixture, profile: "fast" | "balanced" | "robust"): string[];
10
+ export declare function evaluateFixture(fixture: BenchmarkFixture, payloads: string[], actual: boolean | {
11
+ ok: boolean;
12
+ errorCode?: string;
13
+ }): FixtureEvaluation;
14
+ //# sourceMappingURL=fixture-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixture-contract.d.ts","sourceRoot":"","sources":["../src/fixture-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAIpE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAMpE;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,EAAE,CAQvH;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,iBAAiB,CAyCnB"}
@@ -0,0 +1,65 @@
1
+ export function expectedPayloads(fixture) {
2
+ return (Array.isArray(fixture.expectedPayload)
3
+ ? fixture.expectedPayload
4
+ : [fixture.expectedPayload]).filter((payload) => payload.length > 0);
5
+ }
6
+ export function requiredPayloads(fixture) {
7
+ if (fixture.requiredInstances?.length)
8
+ return fixture.requiredInstances.flatMap((entry) => Array.from({ length: entry.count }, () => entry.payload));
9
+ if (fixture.requiredResults?.length)
10
+ return fixture.requiredResults.map((entry) => entry.payload);
11
+ return fixture.requiredPayloads?.length
12
+ ? fixture.requiredPayloads
13
+ : expectedPayloads(fixture);
14
+ }
15
+ export function requiredPayloadsForProfile(fixture, profile) {
16
+ const required = requiredPayloads(fixture);
17
+ const count = fixture.profileExpectedResultCount?.[profile];
18
+ if (count === undefined)
19
+ return required;
20
+ if (!Number.isInteger(count) || count < 1 || count > required.length) {
21
+ throw new RangeError(`Fixture '${fixture.id}' has invalid ${profile} profileExpectedResultCount ${String(count)} for ${required.length} required payload(s).`);
22
+ }
23
+ return required.slice(0, count);
24
+ }
25
+ export function evaluateFixture(fixture, payloads, actual) {
26
+ const decoded = typeof actual === "boolean" ? actual : actual.ok;
27
+ const errorCode = typeof actual === "boolean" ? undefined : actual.errorCode;
28
+ if (fixture.expectedOutcome !== "decode") {
29
+ const allowed = fixture.allowedFailureCodes?.length
30
+ ? fixture.allowedFailureCodes
31
+ : fixture.expectedOutcome === "no-symbol" ? ["no_symbol_found"] : ["invalid_image"];
32
+ return { pass: !decoded && payloads.length === 0 && errorCode !== undefined && allowed.includes(errorCode), missingPayloads: [], unexpectedPayloads: [] };
33
+ }
34
+ const required = requiredPayloads(fixture);
35
+ if (!decoded || payloads.length === 0) {
36
+ return { pass: false, missingPayloads: required, unexpectedPayloads: [] };
37
+ }
38
+ if (fixture.requiredPayloads?.length || fixture.requiredInstances?.length) {
39
+ const remaining = [...payloads];
40
+ const missing = required.filter((payload) => {
41
+ const index = remaining.indexOf(payload);
42
+ if (index < 0)
43
+ return true;
44
+ remaining.splice(index, 1);
45
+ return false;
46
+ });
47
+ const allowed = new Set([...required, ...expectedPayloads(fixture)]);
48
+ const unexpected = fixture.allowExtraPayloads === false
49
+ ? payloads.filter((payload) => !allowed.has(payload))
50
+ : [];
51
+ return {
52
+ pass: missing.length === 0 && unexpected.length === 0,
53
+ missingPayloads: missing,
54
+ unexpectedPayloads: unexpected,
55
+ };
56
+ }
57
+ const expected = expectedPayloads(fixture);
58
+ const exact = payloads.length === 1 && expected.includes(payloads[0]);
59
+ return {
60
+ pass: exact,
61
+ missingPayloads: exact ? [] : expected.filter((payload) => !payloads.includes(payload)),
62
+ unexpectedPayloads: payloads.filter((payload) => !expected.includes(payload)),
63
+ };
64
+ }
65
+ //# sourceMappingURL=fixture-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixture-contract.js","sourceRoot":"","sources":["../src/fixture-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const BENCHMARK_SCHEMA_VERSION: "2.0";
2
+ export * from "./types.js";
3
+ export * from "./csv.js";
4
+ export * from "./fixture-contract.js";
5
+ export * from "./quality-gates.js";
6
+ export * from "./measurement.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,EAAG,KAAc,CAAC;AACvD,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export const BENCHMARK_SCHEMA_VERSION = "2.0";
2
+ export * from "./types.js";
3
+ export * from "./csv.js";
4
+ export * from "./fixture-contract.js";
5
+ export * from "./quality-gates.js";
6
+ export * from "./measurement.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAc,CAAC;AACvD,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { BenchmarkFixtureResult, BenchmarkVariance } from "./types.js";
2
+ export declare function standardDeviation(values: number[]): number;
3
+ export declare function summarizeBenchmarkVariance(results: Array<Pick<BenchmarkFixtureResult, "elapsedMs" | "runTimingsMs">>): BenchmarkVariance;
4
+ export declare function summarizeIterationCorrectness(results: Array<Pick<BenchmarkFixtureResult, "pass" | "allPayloads" | "elapsedMs">>): {
5
+ pass: boolean;
6
+ iterationPassCount: number;
7
+ iterationFailureCount: number;
8
+ unstablePayload: boolean;
9
+ runTimingsMs: number[];
10
+ };
11
+ //# sourceMappingURL=measurement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measurement.d.ts","sourceRoot":"","sources":["../src/measurement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASnG,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAI1D;AAWD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,WAAW,GAAG,cAAc,CAAC,CAAC,GAAG,iBAAiB,CAWxI;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,aAAa,GAAG,WAAW,CAAC,CAAC;;;;;;EAQ/H"}
@@ -0,0 +1,43 @@
1
+ function median(values) {
2
+ if (!values.length)
3
+ return 0;
4
+ const sorted = [...values].sort((left, right) => left - right);
5
+ const middle = Math.floor(sorted.length / 2);
6
+ return sorted.length % 2 ? sorted[middle] : (sorted[middle - 1] + sorted[middle]) / 2;
7
+ }
8
+ export function standardDeviation(values) {
9
+ if (values.length < 2)
10
+ return 0;
11
+ const average = values.reduce((sum, value) => sum + value, 0) / values.length;
12
+ return Math.sqrt(values.reduce((sum, value) => sum + (value - average) ** 2, 0) / values.length);
13
+ }
14
+ function distribution(values) {
15
+ const sorted = [...values].sort((left, right) => left - right);
16
+ return {
17
+ average: values.reduce((sum, value) => sum + value, 0) / Math.max(1, values.length),
18
+ median: median(values),
19
+ p95: sorted[Math.max(0, Math.ceil(sorted.length * 0.95) - 1)] ?? 0,
20
+ };
21
+ }
22
+ export function summarizeBenchmarkVariance(results) {
23
+ const fixtureLatencies = results.map((result) => result.elapsedMs);
24
+ const center = median(fixtureLatencies);
25
+ return {
26
+ perFixtureRunStdDevMs: distribution(results.map((result) => standardDeviation(result.runTimingsMs ?? []))),
27
+ fixtureLatencySpreadMs: {
28
+ standardDeviation: standardDeviation(fixtureLatencies),
29
+ medianAbsoluteDeviation: median(fixtureLatencies.map((value) => Math.abs(value - center))),
30
+ },
31
+ suiteDurationMs: results.reduce((sum, result) => sum + (result.runTimingsMs ?? [result.elapsedMs]).reduce((subtotal, value) => subtotal + value, 0), 0),
32
+ };
33
+ }
34
+ export function summarizeIterationCorrectness(results) {
35
+ return {
36
+ pass: results.length > 0 && results.every((result) => result.pass),
37
+ iterationPassCount: results.filter((result) => result.pass).length,
38
+ iterationFailureCount: results.filter((result) => !result.pass).length,
39
+ unstablePayload: new Set(results.map((result) => JSON.stringify(result.allPayloads))).size > 1,
40
+ runTimingsMs: results.map((result) => result.elapsedMs),
41
+ };
42
+ }
43
+ //# sourceMappingURL=measurement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measurement.js","sourceRoot":"","sources":["../src/measurement.ts"],"names":[],"mappings":"AAEA,SAAS,MAAM,CAAC,MAAgB;IAC9B,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAgB;IAChD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9E,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,YAAY,CAAC,MAAgB;IACpC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAC/D,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC;QACnF,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAA0E;IACnH,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACxC,OAAO;QACL,qBAAqB,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1G,sBAAsB,EAAE;YACtB,iBAAiB,EAAE,iBAAiB,CAAC,gBAAgB,CAAC;YACtD,uBAAuB,EAAE,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;SAC3F;QACD,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;KACxJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,OAAkF;IAC9H,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;QAClE,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;QAClE,qBAAqB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;QACtE,eAAe,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAC9F,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC;KACxD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { BenchmarkRunSummary } from "./types.js";
2
+ export interface BenchmarkBaseline {
3
+ total: number;
4
+ passed: number;
5
+ successRate?: number;
6
+ averageMs: number;
7
+ medianMs: number;
8
+ p95Ms: number;
9
+ averageAttempts: number;
10
+ p95Attempts: number;
11
+ decodeRecall: number;
12
+ exactPayloadAccuracy: number;
13
+ falsePositiveCount: number;
14
+ falsePositiveRate: number;
15
+ timeoutCount: number;
16
+ multipleCompleteness: {
17
+ total: number;
18
+ complete: number;
19
+ };
20
+ runtime?: BenchmarkRunSummary["runtime"];
21
+ environment?: BenchmarkRunSummary["environment"];
22
+ }
23
+ export declare function evaluateBenchmarkGates(summary: BenchmarkRunSummary, baseline: BenchmarkBaseline, options: {
24
+ fullSuite: boolean;
25
+ }): string[];
26
+ //# sourceMappingURL=quality-gates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-gates.d.ts","sourceRoot":"","sources":["../src/quality-gates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,OAAO,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;CAClD;AAaD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,EAAE,CAwC3I"}
@@ -0,0 +1,71 @@
1
+ const HARD_ATTEMPT_LIMITS = {
2
+ fast: { "14-damaged": 18, "16-multiple-codes": 18, "50-multiple-three": 18 },
3
+ balanced: { "14-damaged": 110, "16-multiple-codes": 30, "50-multiple-three": 70 },
4
+ robust: { "14-damaged": 160, "16-multiple-codes": 40, "50-multiple-three": 90 },
5
+ };
6
+ const PROFILE_LIMITS = {
7
+ fast: { p95Attempts: 24, timingRelative: 1.75, averageMs: 250, medianMs: 180, p95Ms: 600 },
8
+ balanced: { p95Attempts: 100, timingRelative: 1.6, averageMs: 1_500, medianMs: 1_000, p95Ms: 4_000 },
9
+ robust: { p95Attempts: 160, timingRelative: 1.75, averageMs: 2_000, medianMs: 1_200, p95Ms: 7_000 },
10
+ };
11
+ export function evaluateBenchmarkGates(summary, baseline, options) {
12
+ const failures = [];
13
+ if (summary.regressionCount > 0)
14
+ failures.push(`${summary.regressionCount} previously-passing fixture(s) regressed`);
15
+ if (summary.environment.scenario !== "fast" && summary.multipleCompleteness.complete !== summary.multipleCompleteness.total)
16
+ failures.push(`multiple completeness is ${summary.multipleCompleteness.complete}/${summary.multipleCompleteness.total}`);
17
+ if (summary.falsePositiveCount > 0)
18
+ failures.push(`${summary.falsePositiveCount} false positive(s) detected`);
19
+ if (summary.timeoutCount > 0)
20
+ failures.push(`${summary.timeoutCount} benchmark timeout(s) detected`);
21
+ if (summary.engineInitializationFailures > 0)
22
+ failures.push(`${summary.engineInitializationFailures} engine initialization failure(s)`);
23
+ if (summary.engineExecutionFailures > 0)
24
+ failures.push(`${summary.engineExecutionFailures} engine execution failure(s)`);
25
+ if (summary.cancellationCorrectness.passed !== summary.cancellationCorrectness.total)
26
+ failures.push(`cancellation correctness is ${summary.cancellationCorrectness.passed}/${summary.cancellationCorrectness.total}`);
27
+ if (summary.phaseTimingAvailability.passed !== summary.phaseTimingAvailability.total)
28
+ failures.push(`phase timing availability is ${summary.phaseTimingAvailability.passed}/${summary.phaseTimingAvailability.total}`);
29
+ if (options.fullSuite) {
30
+ if (!baseline.environment || !baseline.runtime)
31
+ failures.push("baseline lacks required environment metadata");
32
+ else {
33
+ const compatible = baseline.environment.scenario === summary.environment.scenario
34
+ && baseline.environment.datasetManifestHash === summary.environment.datasetManifestHash
35
+ && baseline.runtime.kind === summary.runtime.kind
36
+ && baseline.runtime.platform === summary.runtime.platform
37
+ && baseline.runtime.arch === summary.runtime.arch
38
+ && baseline.runtime.nodeVersion?.split(".")[0] === summary.runtime.nodeVersion?.split(".")[0];
39
+ if (!compatible)
40
+ failures.push("benchmark environment is incompatible with the selected immutable baseline");
41
+ }
42
+ if (summary.passed < baseline.passed)
43
+ failures.push(`passed ${summary.passed}; baseline is ${baseline.passed}`);
44
+ if (summary.decodeRecall + Number.EPSILON < baseline.decodeRecall)
45
+ failures.push(`decode recall ${(summary.decodeRecall * 100).toFixed(2)}% is below baseline ${(baseline.decodeRecall * 100).toFixed(2)}%`);
46
+ if (summary.exactPayloadAccuracy + Number.EPSILON < baseline.exactPayloadAccuracy)
47
+ failures.push(`exact payload accuracy ${(summary.exactPayloadAccuracy * 100).toFixed(2)}% is below baseline`);
48
+ if (summary.falsePositiveRate > baseline.falsePositiveRate || summary.falsePositiveCount > baseline.falsePositiveCount)
49
+ failures.push("false-positive rate/count exceed baseline");
50
+ if (summary.multipleCompleteness.complete < baseline.multipleCompleteness.complete)
51
+ failures.push("multiple-code completeness is below baseline");
52
+ if (summary.averageAttempts > baseline.averageAttempts * 1.15)
53
+ failures.push(`average attempts ${summary.averageAttempts.toFixed(1)} exceed baseline tolerance`);
54
+ const limits = PROFILE_LIMITS[summary.environment.scenario];
55
+ if (summary.p95Attempts > Math.min(limits.p95Attempts, Math.ceil(baseline.p95Attempts * 1.15)))
56
+ failures.push(`P95 attempts ${summary.p95Attempts.toFixed(1)} exceed profile limit`);
57
+ if (summary.averageMs > baseline.averageMs * limits.timingRelative || summary.averageMs > limits.averageMs)
58
+ failures.push(`average latency exceeds ${limits.timingRelative}x baseline or ${limits.averageMs}ms absolute limit`);
59
+ if (summary.medianMs > baseline.medianMs * limits.timingRelative || summary.medianMs > limits.medianMs)
60
+ failures.push(`median latency exceeds ${limits.timingRelative}x baseline or ${limits.medianMs}ms absolute limit`);
61
+ if (summary.p95Ms > baseline.p95Ms * limits.timingRelative || summary.p95Ms > limits.p95Ms)
62
+ failures.push(`P95 latency exceeds ${limits.timingRelative}x baseline or ${limits.p95Ms}ms absolute limit`);
63
+ }
64
+ for (const result of summary.results) {
65
+ const limit = HARD_ATTEMPT_LIMITS[summary.environment.scenario][result.id];
66
+ if (limit !== undefined && result.attemptCount > limit)
67
+ failures.push(`${result.id} used ${result.attemptCount} attempts; limit is ${limit}`);
68
+ }
69
+ return failures;
70
+ }
71
+ //# sourceMappingURL=quality-gates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-gates.js","sourceRoot":"","sources":["../src/quality-gates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,376 @@
1
+ export type BenchmarkCategory = "clear" | "text" | "url" | "wifi" | "low_contrast" | "underexposed" | "overexposed" | "blur" | "motion_blur" | "noise" | "glare" | "inverted" | "rotation" | "perspective" | "small_in_large" | "near_edge" | "complex_background" | "multiple" | "occlusion" | "damaged" | "high_resolution" | "screen_capture" | "unusual_aspect" | "colored_background" | "phone_photo" | "negative" | "adversarial";
2
+ export type BenchmarkExpectedOutcome = "decode" | "no-symbol" | "invalid-input";
3
+ export type BenchmarkFailureCode = "no_symbol_found" | "invalid_image" | "timeout" | "cancelled" | "engine_execution_failure" | "engine_initialization_failure" | "worker_initialization_failure" | "resource_limit_exceeded" | "internal_invariant_failure" | "concurrent_call_rejected" | "session_disposed";
4
+ export type BenchmarkSourceType = "generated" | "project-photo" | "external-open-license";
5
+ export interface BenchmarkFixture {
6
+ id: string;
7
+ file: string;
8
+ category: BenchmarkCategory;
9
+ expectedPayload: string | string[];
10
+ format?: BarcodeFormat;
11
+ formatClass?: BarcodeFormatClass;
12
+ expectedRawBytes?: number[];
13
+ orientation?: number;
14
+ expectedOutcome: BenchmarkExpectedOutcome;
15
+ allowedFailureCodes?: BenchmarkFailureCode[];
16
+ sourceType: BenchmarkSourceType;
17
+ license: string;
18
+ /** Fixed generator seed for reproducible generated fixtures. */
19
+ generatedSeed?: number;
20
+ /** Generator/provenance note describing where transforms are defined. */
21
+ transformMetadata?: string;
22
+ /** Optional: primary payload when multiple codes (stable contract). */
23
+ primaryPayload?: string;
24
+ /** All payloads that must appear for a full pass (multiple fixtures). */
25
+ requiredPayloads?: string[];
26
+ requiredResults?: Array<{
27
+ format: BarcodeFormat;
28
+ payload: string;
29
+ }>;
30
+ /** Required physical instances, including repeated payloads. */
31
+ requiredInstances?: Array<{
32
+ payload: string;
33
+ count: number;
34
+ }>;
35
+ /** Expected unique decode count (benchmark stop hint). */
36
+ expectedResultCount?: number;
37
+ /** Explicit profile-specific completeness contract; omitted profiles require the full fixture truth. */
38
+ profileExpectedResultCount?: Partial<Record<"fast" | "balanced" | "robust", number>>;
39
+ /** Allow extra payloads beyond required set. */
40
+ allowExtraPayloads?: boolean;
41
+ primaryResultRule?: "top-to-bottom-left-to-right";
42
+ geometryMetadata?: Array<{
43
+ payload: string;
44
+ x: number;
45
+ y: number;
46
+ width: number;
47
+ height: number;
48
+ }>;
49
+ notes?: string;
50
+ }
51
+ export interface BenchmarkFixtureResult {
52
+ id: string;
53
+ category: BenchmarkCategory;
54
+ expectedPayload: string | string[];
55
+ actualPayload: string | null;
56
+ allPayloads: string[];
57
+ pass: boolean;
58
+ elapsedMs: number;
59
+ successfulDecoder: string | null;
60
+ preprocessingPath: string | null;
61
+ candidateIndex: number | null;
62
+ attemptCount: number;
63
+ failureReason: string | null;
64
+ expectedOutcome: BenchmarkExpectedOutcome;
65
+ missingPayloads?: string[];
66
+ unexpectedPayloads?: string[];
67
+ requiredPayloadCount?: number;
68
+ decodedPayloadCount?: number;
69
+ timeToFirstResultMs?: number;
70
+ heuristicMetrics?: {
71
+ entropyScore: number;
72
+ highFrequencyRatio: number;
73
+ candidateCountBeforeCap: number;
74
+ pathologicalPathActivated: boolean;
75
+ fallbackAttemptsUsed: number;
76
+ finalResult: "success" | "not-found" | "failure";
77
+ };
78
+ controlledMemoryPeakBytes?: number;
79
+ finalControlledMemoryBytes?: number;
80
+ iterationPassCount?: number;
81
+ iterationFailureCount?: number;
82
+ unstablePayload?: boolean;
83
+ runTimingsMs?: number[];
84
+ phaseTiming?: {
85
+ frameNormalizationMs?: number;
86
+ roiMs?: number;
87
+ localizationMs?: number;
88
+ candidateGenerationMs: number;
89
+ candidateDeduplicationMs?: number;
90
+ preprocessMs: number;
91
+ rotationMs: number;
92
+ engineMs: Record<string, number>;
93
+ validationMs?: number;
94
+ semanticParsingMs?: number;
95
+ };
96
+ }
97
+ export interface BenchmarkDistribution {
98
+ average: number;
99
+ median: number;
100
+ p95: number;
101
+ }
102
+ export interface BenchmarkSourceIdentity {
103
+ commitSha: string;
104
+ treeSha: string;
105
+ repositoryDirty: boolean;
106
+ packageLockHash: string;
107
+ scenarioHash: string;
108
+ datasetHash: string;
109
+ engineCompositionHash: string;
110
+ wasmBuildHash: string;
111
+ nativeAdapterHash: string;
112
+ loaderHash: string;
113
+ benchmarkRunnerHash: string;
114
+ }
115
+ export type BenchmarkEvidenceType = "development" | "ci-artifact" | "canonical-candidate" | "canonical-committed" | "baseline-candidate" | "active-baseline";
116
+ export type BenchmarkExecutionMode = "development" | "canonical" | "baseline-freeze" | "ci-artifact" | "canonical-candidate";
117
+ export interface BenchmarkExecutionPolicy {
118
+ mode: BenchmarkExecutionMode;
119
+ evidenceType?: BenchmarkEvidenceType;
120
+ canonical: boolean;
121
+ warmupIterations: number;
122
+ measuredIterations: number;
123
+ dirtyDevelopmentAllowed: boolean;
124
+ updatesDocumentation: boolean;
125
+ }
126
+ export interface BenchmarkVariance {
127
+ perFixtureRunStdDevMs: BenchmarkDistribution;
128
+ fixtureLatencySpreadMs: {
129
+ standardDeviation: number;
130
+ medianAbsoluteDeviation: number;
131
+ };
132
+ suiteDurationMs: number;
133
+ }
134
+ export interface BenchmarkRunSummary {
135
+ schemaVersion: "2.0";
136
+ runtime: {
137
+ kind: "node" | "browser-device";
138
+ nodeVersion?: string;
139
+ platform: string;
140
+ arch: string;
141
+ };
142
+ sourceIdentity: BenchmarkSourceIdentity;
143
+ executionPolicy: BenchmarkExecutionPolicy;
144
+ environment: {
145
+ gitCommit: string;
146
+ sdkVersion: string;
147
+ scenario: "fast" | "balanced" | "robust";
148
+ datasetManifestHash: string;
149
+ fixtureCount: number;
150
+ date: string;
151
+ warmupPolicy: string;
152
+ iterationCount: number;
153
+ coldInitializationMs?: number;
154
+ warmInitializationMs?: number;
155
+ selectedWasmVariant?: "standard" | "simd";
156
+ wasmLinearMemoryPeakBytes?: number;
157
+ };
158
+ generatedAt: string;
159
+ total: number;
160
+ passed: number;
161
+ failed: number;
162
+ successRate: number;
163
+ averageMs: number;
164
+ medianMs: number;
165
+ p95Ms: number;
166
+ p99Ms: number | null;
167
+ variance: BenchmarkVariance;
168
+ positiveCases: number;
169
+ decodeRecall: number;
170
+ exactPayloadAccuracy: number;
171
+ negativeCases: number;
172
+ falsePositiveCount: number;
173
+ falsePositiveRate: number;
174
+ timeoutCount: number;
175
+ cancellationCorrectness: {
176
+ passed: number;
177
+ total: number;
178
+ };
179
+ engineInitializationFailures: number;
180
+ engineExecutionFailures: number;
181
+ phaseTimingAvailability: {
182
+ passed: number;
183
+ total: number;
184
+ };
185
+ timeToFirstResult: BenchmarkDistribution;
186
+ averageAttempts: number;
187
+ medianAttempts: number;
188
+ p95Attempts: number;
189
+ decoderDistribution: Record<string, number>;
190
+ preprocessingDistribution: Record<string, number>;
191
+ candidateDistribution: Record<string, number>;
192
+ perFormatRecall: Record<string, {
193
+ total: number;
194
+ decoded: number;
195
+ recall: number;
196
+ }>;
197
+ perFormatExactAccuracy?: Record<string, {
198
+ total: number;
199
+ exact: number;
200
+ accuracy: number;
201
+ }>;
202
+ perFormatFalsePositives?: Record<string, number>;
203
+ formatConfusionMatrix?: Record<string, Record<string, number>>;
204
+ formatSelectionAccuracy?: number;
205
+ checksumRejectionCount?: number;
206
+ gs1RecognitionAccuracy?: number;
207
+ mixedFormatCompleteness?: {
208
+ total: number;
209
+ complete: number;
210
+ rate: number;
211
+ };
212
+ memoryObservations: string[];
213
+ controlledMemoryPeakBytes: number;
214
+ finalControlledMemoryBytes: number;
215
+ phaseTiming: Record<string, BenchmarkDistribution>;
216
+ perCategory: Record<string, {
217
+ total: number;
218
+ passed: number;
219
+ successRate: number;
220
+ averageMs: number;
221
+ }>;
222
+ multipleCompleteness: {
223
+ total: number;
224
+ complete: number;
225
+ incomplete: string[];
226
+ };
227
+ worstFixtures: Array<{
228
+ id: string;
229
+ elapsedMs: number;
230
+ attemptCount: number;
231
+ pass: boolean;
232
+ }>;
233
+ regressionCount: number;
234
+ remainingFailures: string[];
235
+ results: BenchmarkFixtureResult[];
236
+ }
237
+ export interface StrategySummary {
238
+ strategyId: string;
239
+ engineIds: Array<{
240
+ id: string;
241
+ version: string;
242
+ }>;
243
+ scenario?: {
244
+ id: string;
245
+ revision: number;
246
+ };
247
+ fixtureCount: number;
248
+ positiveRecall: number;
249
+ exactPayloadAccuracy: number;
250
+ falsePositiveCount: number;
251
+ multiCodeCompleteness: {
252
+ complete: number;
253
+ total: number;
254
+ };
255
+ averageMs: number;
256
+ medianMs: number;
257
+ p95Ms: number;
258
+ averageAttempts: number;
259
+ p95Attempts: number;
260
+ timeoutCount: number;
261
+ unsupportedCases: number;
262
+ initializationFailures: number;
263
+ executionFailures: number;
264
+ uniqueWins: string[];
265
+ installedPackageFootprintBytes: number;
266
+ initializationMs: number;
267
+ warmInitializationMs?: number;
268
+ wasmVariant?: "standard" | "simd";
269
+ wasmLinearMemoryPeakBytes?: number;
270
+ averageControlledMemoryPeakBytes: number;
271
+ }
272
+ export interface StrategyFixtureResult {
273
+ fixtureId: string;
274
+ strategyId: string;
275
+ expectedOutcome: BenchmarkExpectedOutcome;
276
+ payloads: string[];
277
+ pass: boolean;
278
+ exactPayload: boolean;
279
+ falsePositive: boolean;
280
+ multipleComplete: boolean;
281
+ elapsedMs: number;
282
+ attemptCount: number;
283
+ failureReason: string | null;
284
+ controlledMemoryPeakBytes?: number;
285
+ finalControlledMemoryBytes?: number;
286
+ iterationPassCount?: number;
287
+ iterationFailureCount?: number;
288
+ unstablePayload?: boolean;
289
+ runTimingsMs?: number[];
290
+ engineDiagnostics?: Array<{
291
+ engineId: string;
292
+ status: string;
293
+ elapsedMs: number;
294
+ attemptCount: number;
295
+ resultCount: number;
296
+ }>;
297
+ }
298
+ export interface ComparisonReport {
299
+ schemaVersion: "2.0";
300
+ generatedAt: string;
301
+ sdkVersion: string;
302
+ sourceIdentity: BenchmarkSourceIdentity;
303
+ executionPolicy: BenchmarkExecutionPolicy;
304
+ finalControlledMemoryBytes: number;
305
+ parallelExecution: {
306
+ status: "supported" | "experimental";
307
+ builtInScenarioUsage: boolean;
308
+ recallTolerance: number;
309
+ exactAccuracyTolerance: number;
310
+ reason?: string;
311
+ };
312
+ fixtureCount: number;
313
+ positiveCases: number;
314
+ negativeCases: number;
315
+ methodology: string;
316
+ strategies: StrategySummary[];
317
+ perFixture: StrategyFixtureResult[];
318
+ }
319
+ export interface BrowserBenchmarkMetadata {
320
+ browserName: string;
321
+ browserVersion: string;
322
+ operatingSystem: string;
323
+ architecture: string;
324
+ workerAvailable: boolean;
325
+ offscreenCanvasAvailable: boolean;
326
+ imageBitmapAvailable: boolean;
327
+ videoFrameAvailable: boolean;
328
+ userAgent: string;
329
+ testProjectName: string;
330
+ actualDecodePath: "worker" | "main-thread" | "mixed" | "unknown";
331
+ workerCreatedCount: number;
332
+ workerTerminationCount: number;
333
+ workerDecodeCount: number;
334
+ mainThreadDecodeCount: number;
335
+ observedEngineIds: string[];
336
+ observedWasmVariants: string[];
337
+ }
338
+ export interface BrowserBenchmarkSourceIdentity {
339
+ commitSha: string;
340
+ treeSha: string;
341
+ sdkVersion: string;
342
+ datasetHash: string;
343
+ scenarioHash: string;
344
+ engineVersions: Record<string, string>;
345
+ wasmBuildHash: string;
346
+ fixtureIds: string[];
347
+ }
348
+ export interface DeviceBenchmarkMetadata {
349
+ deviceModel: string;
350
+ operatingSystem: string;
351
+ browserOrRuntime: string;
352
+ cameraResolution?: string;
353
+ thermalState?: string;
354
+ powerMode?: string;
355
+ }
356
+ export interface BrowserBenchmarkReport {
357
+ schemaVersion: "2.0";
358
+ benchmarkKind: "smoke" | "full";
359
+ generatedAt: string;
360
+ sourceIdentity: BrowserBenchmarkSourceIdentity;
361
+ metadata: BrowserBenchmarkMetadata;
362
+ fixtureCount: number;
363
+ positiveRecall: number;
364
+ falsePositiveCount: number;
365
+ averageMs: number;
366
+ p95Ms: number;
367
+ memoryObservation: string;
368
+ results: Array<{
369
+ fixtureId: string;
370
+ pass: boolean;
371
+ elapsedMs: number;
372
+ payloads: string[];
373
+ }>;
374
+ }
375
+ import type { BarcodeFormat, BarcodeFormatClass } from "@scanly/scenario-schema";
376
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@scanly/benchmark",
3
+ "version": "2.0.0",
4
+ "description": "Benchmark contracts, conformance evaluation, and regression gates for Scanly",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.build.json"
22
+ }
23
+ }