vdelta 0.1.0 → 0.1.1
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 +14 -4
- package/dist/adapters/vitest/recorder.js +11 -3
- package/dist/adapters/vitest/recorder.js.map +1 -1
- package/dist/adapters/vitest/reporter.js +13 -7
- package/dist/adapters/vitest/reporter.js.map +1 -1
- package/dist/canonical.js.map +1 -1
- package/dist/cli.js +12 -4
- package/dist/cli.js.map +1 -1
- package/dist/compare.d.ts +13 -2
- package/dist/compare.js +112 -18
- package/dist/compare.js.map +1 -1
- package/dist/gate.d.ts +7 -1
- package/dist/gate.js +11 -6
- package/dist/gate.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/redact.js +4 -1
- package/dist/redact.js.map +1 -1
- package/dist/render.js +12 -2
- package/dist/render.js.map +1 -1
- package/dist/run.d.ts +1 -1
- package/dist/run.js +30 -9
- package/dist/run.js.map +1 -1
- package/dist/schema.d.ts +12 -0
- package/dist/schema.js +127 -19
- package/dist/schema.js.map +1 -1
- package/dist/store.d.ts +5 -0
- package/dist/store.js +5 -3
- package/dist/store.js.map +1 -1
- package/dist/tree-digest.js +51 -14
- package/dist/tree-digest.js.map +1 -1
- package/package.json +5 -2
- package/spec/veridelta-1.md +58 -4
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ another" — a verification delta can, and when two runs are not comparable it
|
|
|
18
18
|
- Runner support (MVP): **vitest v4** (native reporter, structured channel only)
|
|
19
19
|
- Zero runtime dependencies; Node ≥ 20
|
|
20
20
|
- Machine-verified against the [conformance suite](conformance/) —
|
|
21
|
-
|
|
21
|
+
39 fixtures covering the spec's invariants, adversarial inputs, and a
|
|
22
22
|
10-mutation cheating corpus with 100% detection recall
|
|
23
23
|
|
|
24
24
|
## Quickstart (5 minutes)
|
|
@@ -142,6 +142,14 @@ consumers must treat unknown values as hard errors.
|
|
|
142
142
|
or digested.
|
|
143
143
|
- The run store lives in `.veridelta/` (repo-local, self-gitignored,
|
|
144
144
|
content-addressed, immutable).
|
|
145
|
+
- veridelta is read-only with respect to the observed repository: the only
|
|
146
|
+
things it writes are its own `.veridelta/` store and throwaway files under
|
|
147
|
+
the OS temp directory. Tree digesting uses a private index
|
|
148
|
+
(`GIT_INDEX_FILE`) and a private object directory
|
|
149
|
+
(`GIT_OBJECT_DIRECTORY`, with the repo's real objects supplied read-only
|
|
150
|
+
via `GIT_ALTERNATE_OBJECT_DIRECTORIES`), so no loose objects are ever
|
|
151
|
+
added to your `.git` — recording works even when the object database is
|
|
152
|
+
not writable (e.g. sandboxed environments).
|
|
145
153
|
|
|
146
154
|
## Protocol
|
|
147
155
|
|
|
@@ -154,7 +162,7 @@ intended success mode.
|
|
|
154
162
|
|
|
155
163
|
```bash
|
|
156
164
|
npm test # unit + full conformance suite
|
|
157
|
-
npm run test:conformance # the
|
|
165
|
+
npm run test:conformance # the 39-fixture suite only
|
|
158
166
|
```
|
|
159
167
|
|
|
160
168
|
The suite is authored independently of this implementation (the fixture
|
|
@@ -163,8 +171,10 @@ author reads only the spec and the harness contract in
|
|
|
163
171
|
and mechanically verifies, among the spec's §13.2 classes: byte-identical
|
|
164
172
|
determinism of re-executed comparisons, 100% detection recall on the
|
|
165
173
|
cheating corpus, zero false green, fail-open degradation (INV-5),
|
|
166
|
-
record-integrity tampering detection (INV-10),
|
|
167
|
-
staleness (INV-11)
|
|
174
|
+
record-integrity tampering detection (INV-10), exact tree-digest
|
|
175
|
+
staleness (INV-11), and read-only object-database recording (tree
|
|
176
|
+
digesting never writes loose objects into the observed repository's
|
|
177
|
+
`.git`, even when it is not writable).
|
|
168
178
|
|
|
169
179
|
## License
|
|
170
180
|
|
|
@@ -160,7 +160,10 @@ function mapVerdict(t) {
|
|
|
160
160
|
return { verdict: 'skip', suppression: { marker: 'todo' } };
|
|
161
161
|
return {
|
|
162
162
|
verdict: 'skip',
|
|
163
|
-
suppression: {
|
|
163
|
+
suppression: {
|
|
164
|
+
marker: 'runtime',
|
|
165
|
+
...(t.note !== undefined ? { note: t.note } : {}),
|
|
166
|
+
},
|
|
164
167
|
};
|
|
165
168
|
case 'pending':
|
|
166
169
|
return { verdict: 'not_run' };
|
|
@@ -175,7 +178,10 @@ function buildFinding(t) {
|
|
|
175
178
|
...(e.operator !== undefined ? { operator: e.operator } : {}),
|
|
176
179
|
rel_offsets: relOffsets(t, e.frames),
|
|
177
180
|
}));
|
|
178
|
-
const consoleEntries = t.console.map((c) => ({
|
|
181
|
+
const consoleEntries = t.console.map((c) => ({
|
|
182
|
+
type: c.type,
|
|
183
|
+
content: redactText(c.content),
|
|
184
|
+
}));
|
|
179
185
|
return {
|
|
180
186
|
evidence_digest: canonicalDigest({ errors }),
|
|
181
187
|
structural_fingerprint: canonicalDigest({
|
|
@@ -201,7 +207,9 @@ function buildFinding(t) {
|
|
|
201
207
|
function relOffsets(t, frames) {
|
|
202
208
|
if (t.location_line === null)
|
|
203
209
|
return [];
|
|
204
|
-
return frames
|
|
210
|
+
return frames
|
|
211
|
+
.filter((f) => f.file === t.module_id)
|
|
212
|
+
.map((f) => f.line - t.location_line);
|
|
205
213
|
}
|
|
206
214
|
function fileDigest(path) {
|
|
207
215
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../../src/adapters/vitest/recorder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,
|
|
1
|
+
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../../src/adapters/vitest/recorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* a project's vitest config (ambient recording, §4.2).
|
|
8
8
|
*/
|
|
9
9
|
import { writeFileSync } from 'node:fs';
|
|
10
|
-
import { CAPTURE_VERSION } from './capture.js';
|
|
10
|
+
import { CAPTURE_VERSION, } from './capture.js';
|
|
11
11
|
export default class VdeltaReporter {
|
|
12
12
|
ctx;
|
|
13
13
|
consoleByTask = new Map();
|
|
@@ -43,8 +43,7 @@ export default class VdeltaReporter {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
const config = this.ctx?.config;
|
|
46
|
-
const chaiConfig = config
|
|
47
|
-
?.chaiConfig;
|
|
46
|
+
const chaiConfig = config?.chaiConfig;
|
|
48
47
|
const capture = {
|
|
49
48
|
capture_version: CAPTURE_VERSION,
|
|
50
49
|
runner: 'vitest',
|
|
@@ -52,7 +51,8 @@ export default class VdeltaReporter {
|
|
|
52
51
|
reason,
|
|
53
52
|
unhandled_errors: unhandledErrors.length,
|
|
54
53
|
config: {
|
|
55
|
-
include_task_location: config
|
|
54
|
+
include_task_location: config
|
|
55
|
+
?.includeTaskLocation === true,
|
|
56
56
|
truncate_threshold: chaiConfig?.truncateThreshold ?? null,
|
|
57
57
|
},
|
|
58
58
|
tests,
|
|
@@ -67,12 +67,16 @@ export default class VdeltaReporter {
|
|
|
67
67
|
const err = e;
|
|
68
68
|
return {
|
|
69
69
|
name: typeof err.name === 'string' ? err.name : 'Error',
|
|
70
|
-
message: typeof err.message === 'string'
|
|
70
|
+
message: typeof err.message === 'string'
|
|
71
|
+
? err.message
|
|
72
|
+
: String(err.message ?? ''),
|
|
71
73
|
...(typeof err.expected === 'string' ? { expected: err.expected } : {}),
|
|
72
74
|
...(typeof err.actual === 'string' ? { actual: err.actual } : {}),
|
|
73
75
|
...(typeof err.operator === 'string' ? { operator: err.operator } : {}),
|
|
74
76
|
frames: (err.stacks ?? [])
|
|
75
|
-
.filter((f) => typeof f.file === 'string' &&
|
|
77
|
+
.filter((f) => typeof f.file === 'string' &&
|
|
78
|
+
typeof f.line === 'number' &&
|
|
79
|
+
typeof f.column === 'number')
|
|
76
80
|
.map((f) => ({ file: f.file, line: f.line, column: f.column })),
|
|
77
81
|
};
|
|
78
82
|
});
|
|
@@ -83,7 +87,9 @@ export default class VdeltaReporter {
|
|
|
83
87
|
state: result.state,
|
|
84
88
|
mode: tc.options.mode,
|
|
85
89
|
fails: tc.options.fails === true,
|
|
86
|
-
...(result.state === 'skipped' && result.note !== undefined
|
|
90
|
+
...(result.state === 'skipped' && result.note !== undefined
|
|
91
|
+
? { note: result.note }
|
|
92
|
+
: {}),
|
|
87
93
|
location_line: tc.location?.line ?? null,
|
|
88
94
|
errors,
|
|
89
95
|
console: this.consoleByTask.get(tc.id) ?? [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../src/adapters/vitest/reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../src/adapters/vitest/reporter.ts"],"names":[],"mappings":"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"}
|
package/dist/canonical.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACtC,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AAC9B,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,IAAY;IAC7C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IACjC,QAAQ,OAAO,KAAK,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;QACjC,KAAK,QAAQ;YACX,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,sBAAsB,
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACtC,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AAC9B,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,IAAY;IAC7C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IACjC,QAAQ,OAAO,KAAK,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;QACjC,KAAK,QAAQ;YACX,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,sBAAsB,CAC9B,yBAAyB,IAAI,KAAK,KAAK,EAAE,CAC1C,CAAA;YACH,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,sBAAsB,CAAC,qBAAqB,IAAI,KAAK,KAAK,EAAE,CAAC,CAAA;YACzE,CAAC;YACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;QACtB,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC9B,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;YACrG,CAAC;YACD,MAAM,MAAM,GAAG,KAAgC,CAAA;YAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;iBAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;iBACtC,IAAI,EAAE,CAAA;YACT,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;QACzG,CAAC;QACD;YACE,MAAM,IAAI,sBAAsB,CAC9B,kBAAkB,OAAO,KAAK,OAAO,IAAI,EAAE,CAC5C,CAAA;IACL,CAAC;AACH,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* gate — report-only: 0 whenever a report is produced, 2 otherwise
|
|
9
9
|
* The report goes to stdout; vdelta diagnostics go to stderr only.
|
|
10
10
|
*/
|
|
11
|
-
import { buildComparisonReport, CompareOperationError } from './compare.js';
|
|
11
|
+
import { buildComparisonReport, CompareOperationError, } from './compare.js';
|
|
12
12
|
import { buildGateReport, GateOperationError } from './gate.js';
|
|
13
13
|
import { renderReport } from './render.js';
|
|
14
14
|
import { runAndRecord, VDELTA_VERSION } from './run.js';
|
|
@@ -105,8 +105,16 @@ async function cmdCompare(argv) {
|
|
|
105
105
|
const resolved = await resolveRef(worktree, ref);
|
|
106
106
|
if (resolved === null)
|
|
107
107
|
die(`cannot resolve ref: ${ref}`);
|
|
108
|
-
spec = {
|
|
109
|
-
|
|
108
|
+
spec = {
|
|
109
|
+
mode: 'git-ref',
|
|
110
|
+
ref,
|
|
111
|
+
commit: resolved.commit,
|
|
112
|
+
tree: resolved.tree,
|
|
113
|
+
};
|
|
114
|
+
currentId =
|
|
115
|
+
positional[0] !== undefined
|
|
116
|
+
? store.resolveRunId(positional[0])
|
|
117
|
+
: store.lastRunId();
|
|
110
118
|
}
|
|
111
119
|
else if (positional.length === 2) {
|
|
112
120
|
spec = { mode: 'explicit-run-id', runId: positional[0] };
|
|
@@ -258,7 +266,7 @@ async function main() {
|
|
|
258
266
|
}
|
|
259
267
|
}
|
|
260
268
|
main().catch((err) => {
|
|
261
|
-
process.stderr.write(`vdelta: internal error: ${err instanceof Error ? err.stack ?? err.message : String(err)}\n`);
|
|
269
|
+
process.stderr.write(`vdelta: internal error: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}\n`);
|
|
262
270
|
process.exit(1);
|
|
263
271
|
});
|
|
264
272
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/compare.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { type
|
|
1
|
+
import { type BaselineMode, type ComparabilityDetail, type ComparisonReport, type NearMiss, type RunRecord } from './schema.js';
|
|
2
|
+
import { type RunStore } from './store.js';
|
|
3
3
|
export type BaselineSpec = {
|
|
4
4
|
mode: 'previous-comparable';
|
|
5
5
|
} | {
|
|
@@ -16,6 +16,17 @@ export declare class CompareOperationError extends Error {
|
|
|
16
16
|
}
|
|
17
17
|
/** Stream key (§5.1): repo + worktree + branch + cwd + command + selector + instrument. */
|
|
18
18
|
export declare function streamKey(r: RunRecord): string;
|
|
19
|
+
/**
|
|
20
|
+
* Near-miss disclosure (§5.4): given `candidates` (complete stored runs
|
|
21
|
+
* excluding the current run, oldest-first insertion order), select the
|
|
22
|
+
* candidate with the fewest mismatching stream-key components. Ties break
|
|
23
|
+
* on recency = latest store insertion order (last element wins). Returns
|
|
24
|
+
* undefined when there are no candidates. Deterministic: no timestamps.
|
|
25
|
+
*/
|
|
26
|
+
export declare function nearMissDisclosure(current: RunRecord, candidates: readonly {
|
|
27
|
+
runId: string;
|
|
28
|
+
record: RunRecord;
|
|
29
|
+
}[]): NearMiss | undefined;
|
|
19
30
|
export interface BaselineResolution {
|
|
20
31
|
record: RunRecord | null;
|
|
21
32
|
runId: string | null;
|
package/dist/compare.js
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* the three delta axes, and comparison-report construction. Deterministic:
|
|
4
4
|
* no timestamps, stable sort orders, recency = store insertion order.
|
|
5
5
|
*/
|
|
6
|
-
import { DEGRADED_CAPABILITIES,
|
|
6
|
+
import { COMPOSITION_ID, DEGRADED_CAPABILITIES, } from './adapters/vitest/recorder.js';
|
|
7
|
+
import { isRed, SCHEMA_VERSION, STREAM_KEY_FIELDS, } from './schema.js';
|
|
7
8
|
import { StoreCorruptError } from './store.js';
|
|
8
|
-
import { SCHEMA_VERSION, isRed, } from './schema.js';
|
|
9
9
|
export class CompareOperationError extends Error {
|
|
10
10
|
constructor(message) {
|
|
11
11
|
super(message);
|
|
@@ -26,6 +26,68 @@ export function streamKey(r) {
|
|
|
26
26
|
r.instrument.config_digest,
|
|
27
27
|
]);
|
|
28
28
|
}
|
|
29
|
+
/** Stream-key component value, rendered for near-miss disclosure (array fields joined with a single space). */
|
|
30
|
+
function streamKeyFieldValue(r, field) {
|
|
31
|
+
switch (field) {
|
|
32
|
+
case 'repo.identity':
|
|
33
|
+
return r.repo.identity;
|
|
34
|
+
case 'repo.worktree':
|
|
35
|
+
return r.repo.worktree;
|
|
36
|
+
case 'repo.branch':
|
|
37
|
+
return r.repo.branch;
|
|
38
|
+
case 'repo.cwd':
|
|
39
|
+
return r.repo.cwd;
|
|
40
|
+
case 'invocation.command':
|
|
41
|
+
return r.invocation.command.join(' ');
|
|
42
|
+
case 'invocation.selector':
|
|
43
|
+
return r.invocation.selector.join(' ');
|
|
44
|
+
case 'instrument.adapter':
|
|
45
|
+
return r.instrument.adapter;
|
|
46
|
+
case 'instrument.adapter_version':
|
|
47
|
+
return r.instrument.adapter_version;
|
|
48
|
+
case 'instrument.config_digest':
|
|
49
|
+
return r.instrument.config_digest;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function streamKeyFieldEqual(a, b, field) {
|
|
53
|
+
if (field === 'invocation.command') {
|
|
54
|
+
return (JSON.stringify(a.invocation.command) ===
|
|
55
|
+
JSON.stringify(b.invocation.command));
|
|
56
|
+
}
|
|
57
|
+
if (field === 'invocation.selector') {
|
|
58
|
+
return (JSON.stringify(a.invocation.selector) ===
|
|
59
|
+
JSON.stringify(b.invocation.selector));
|
|
60
|
+
}
|
|
61
|
+
return streamKeyFieldValue(a, field) === streamKeyFieldValue(b, field);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Near-miss disclosure (§5.4): given `candidates` (complete stored runs
|
|
65
|
+
* excluding the current run, oldest-first insertion order), select the
|
|
66
|
+
* candidate with the fewest mismatching stream-key components. Ties break
|
|
67
|
+
* on recency = latest store insertion order (last element wins). Returns
|
|
68
|
+
* undefined when there are no candidates. Deterministic: no timestamps.
|
|
69
|
+
*/
|
|
70
|
+
export function nearMissDisclosure(current, candidates) {
|
|
71
|
+
let best;
|
|
72
|
+
for (const { runId, record } of candidates) {
|
|
73
|
+
const mismatches = [];
|
|
74
|
+
for (const field of STREAM_KEY_FIELDS) {
|
|
75
|
+
if (!streamKeyFieldEqual(record, current, field)) {
|
|
76
|
+
mismatches.push({
|
|
77
|
+
field,
|
|
78
|
+
recorded: streamKeyFieldValue(record, field),
|
|
79
|
+
current: streamKeyFieldValue(current, field),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (best === undefined || mismatches.length <= best.mismatches.length) {
|
|
84
|
+
best = { runId, mismatches };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (best === undefined)
|
|
88
|
+
return undefined;
|
|
89
|
+
return { run_id: best.runId, mismatches: best.mismatches };
|
|
90
|
+
}
|
|
29
91
|
function sameInstrument(a, b) {
|
|
30
92
|
return (a.instrument.adapter === b.instrument.adapter &&
|
|
31
93
|
a.instrument.adapter_version === b.instrument.adapter_version &&
|
|
@@ -33,14 +95,16 @@ function sameInstrument(a, b) {
|
|
|
33
95
|
a.instrument.config_digest === b.instrument.config_digest);
|
|
34
96
|
}
|
|
35
97
|
function sameSelector(a, b) {
|
|
36
|
-
return JSON.stringify(a.invocation.selector) ===
|
|
98
|
+
return (JSON.stringify(a.invocation.selector) ===
|
|
99
|
+
JSON.stringify(b.invocation.selector));
|
|
37
100
|
}
|
|
38
101
|
function sameStreamScope(a, b) {
|
|
39
102
|
return (a.repo.identity === b.repo.identity &&
|
|
40
103
|
a.repo.worktree === b.repo.worktree &&
|
|
41
104
|
a.repo.branch === b.repo.branch &&
|
|
42
105
|
a.repo.cwd === b.repo.cwd &&
|
|
43
|
-
JSON.stringify(a.invocation.command) ===
|
|
106
|
+
JSON.stringify(a.invocation.command) ===
|
|
107
|
+
JSON.stringify(b.invocation.command));
|
|
44
108
|
}
|
|
45
109
|
/**
|
|
46
110
|
* Resolve the baseline per §5.2. Selection is content-addressed and
|
|
@@ -63,6 +127,7 @@ export function resolveBaseline(store, current, currentId, spec) {
|
|
|
63
127
|
case 'previous-comparable': {
|
|
64
128
|
const ids = store.listRunIds();
|
|
65
129
|
const key = streamKey(current);
|
|
130
|
+
const candidates = [];
|
|
66
131
|
for (let i = ids.length - 1; i >= 0; i--) {
|
|
67
132
|
const id = ids[i];
|
|
68
133
|
if (id === currentId)
|
|
@@ -70,6 +135,7 @@ export function resolveBaseline(store, current, currentId, spec) {
|
|
|
70
135
|
const record = store.readRun(id);
|
|
71
136
|
if (record.completeness.status !== 'complete')
|
|
72
137
|
continue;
|
|
138
|
+
candidates.push({ runId: id, record });
|
|
73
139
|
if (streamKey(record) !== key)
|
|
74
140
|
continue;
|
|
75
141
|
return {
|
|
@@ -79,12 +145,18 @@ export function resolveBaseline(store, current, currentId, spec) {
|
|
|
79
145
|
selectionReason: 'same-worktree-command-config-scope',
|
|
80
146
|
};
|
|
81
147
|
}
|
|
148
|
+
candidates.reverse();
|
|
149
|
+
const nm = nearMissDisclosure(current, candidates);
|
|
82
150
|
return {
|
|
83
151
|
record: null,
|
|
84
152
|
runId: null,
|
|
85
153
|
mode: 'previous-comparable',
|
|
86
154
|
selectionReason: 'no-complete-run-in-stream',
|
|
87
|
-
failure: {
|
|
155
|
+
failure: {
|
|
156
|
+
reason: 'baseline-missing',
|
|
157
|
+
kind: 'determined',
|
|
158
|
+
...(nm !== undefined ? { near_miss: nm } : {}),
|
|
159
|
+
},
|
|
88
160
|
};
|
|
89
161
|
}
|
|
90
162
|
case 'git-ref': {
|
|
@@ -128,7 +200,8 @@ function judgeComparability(baseline, current) {
|
|
|
128
200
|
},
|
|
129
201
|
];
|
|
130
202
|
if (baseline.instrument.adapter !== current.instrument.adapter ||
|
|
131
|
-
baseline.instrument.adapter_version !==
|
|
203
|
+
baseline.instrument.adapter_version !==
|
|
204
|
+
current.instrument.adapter_version ||
|
|
132
205
|
baseline.instrument.composition_id !== current.instrument.composition_id) {
|
|
133
206
|
events.push({
|
|
134
207
|
kind: 'adapter-capability-changed',
|
|
@@ -171,7 +244,10 @@ function judgeComparability(baseline, current) {
|
|
|
171
244
|
}
|
|
172
245
|
const bInventory = baseline.observations.map((o) => o.test_id).join('\n');
|
|
173
246
|
const cInventory = current.observations.map((o) => o.test_id).join('\n');
|
|
174
|
-
return {
|
|
247
|
+
return {
|
|
248
|
+
comparability: bInventory === cInventory ? 'exact' : 'scope_changed',
|
|
249
|
+
events: [],
|
|
250
|
+
};
|
|
175
251
|
}
|
|
176
252
|
function configSourceEvents(baseline, current) {
|
|
177
253
|
const events = [];
|
|
@@ -180,7 +256,8 @@ function configSourceEvents(baseline, current) {
|
|
|
180
256
|
...Object.keys(current.surface.config_sources),
|
|
181
257
|
]);
|
|
182
258
|
for (const path of [...paths].sort()) {
|
|
183
|
-
if (baseline.surface.config_sources[path] !==
|
|
259
|
+
if (baseline.surface.config_sources[path] !==
|
|
260
|
+
current.surface.config_sources[path]) {
|
|
184
261
|
events.push({ kind: 'config-source-changed', path });
|
|
185
262
|
}
|
|
186
263
|
}
|
|
@@ -205,7 +282,9 @@ function coverage(record) {
|
|
|
205
282
|
return `${observed}/${declared}`;
|
|
206
283
|
}
|
|
207
284
|
function redIds(record) {
|
|
208
|
-
return record.observations
|
|
285
|
+
return record.observations
|
|
286
|
+
.filter((o) => isRed(o.verdict))
|
|
287
|
+
.map((o) => o.test_id);
|
|
209
288
|
}
|
|
210
289
|
function shortId(runId) {
|
|
211
290
|
return runId.slice(0, 12);
|
|
@@ -234,7 +313,8 @@ export function buildComparisonReport(store, currentId, spec) {
|
|
|
234
313
|
const baseline = resolution.record;
|
|
235
314
|
const judged = judgeComparability(baseline, current);
|
|
236
315
|
if (judged.comparability === 'none') {
|
|
237
|
-
const detail = judged.detail ??
|
|
316
|
+
const detail = judged.detail ??
|
|
317
|
+
resolution.failure ?? {
|
|
238
318
|
reason: 'baseline-missing',
|
|
239
319
|
kind: 'determined',
|
|
240
320
|
};
|
|
@@ -276,7 +356,10 @@ function abstentionReport(current, currentId, detail, events, baseline, resoluti
|
|
|
276
356
|
anchors,
|
|
277
357
|
};
|
|
278
358
|
if (events.length > 0) {
|
|
279
|
-
report.verification_surface = {
|
|
359
|
+
report.verification_surface = {
|
|
360
|
+
status: 'changed',
|
|
361
|
+
events: sortEvents(events),
|
|
362
|
+
};
|
|
280
363
|
}
|
|
281
364
|
return report;
|
|
282
365
|
}
|
|
@@ -344,7 +427,8 @@ function claimsReport(baseline, resolution, current, currentId, comparability) {
|
|
|
344
427
|
test_id: id,
|
|
345
428
|
evidence_digest_before: bDigest ?? '',
|
|
346
429
|
evidence_digest_after: cDigest ?? '',
|
|
347
|
-
failure_mode_changed: b.finding?.structural_fingerprint !==
|
|
430
|
+
failure_mode_changed: b.finding?.structural_fingerprint !==
|
|
431
|
+
c.finding?.structural_fingerprint,
|
|
348
432
|
degraded_capabilities: [...DEGRADED_CAPABILITIES],
|
|
349
433
|
};
|
|
350
434
|
transitions.updated_fail.push(entry);
|
|
@@ -387,12 +471,19 @@ function claimsReport(baseline, resolution, current, currentId, comparability) {
|
|
|
387
471
|
}
|
|
388
472
|
}
|
|
389
473
|
events.push(...configSourceEvents(baseline, current));
|
|
390
|
-
const lostObservation = transitions.not_observed.length > 0 ||
|
|
474
|
+
const lostObservation = transitions.not_observed.length > 0 ||
|
|
475
|
+
(partial && hasLostObservation(baseline, current));
|
|
391
476
|
const reduced = transitions.fail_to_skip.length > 0 ||
|
|
392
477
|
transitions.fail_to_xfail.length > 0 ||
|
|
393
|
-
events.some((e) => e.kind === 'test-removed' ||
|
|
478
|
+
events.some((e) => e.kind === 'test-removed' ||
|
|
479
|
+
e.kind === 'fail-to-skip' ||
|
|
480
|
+
e.kind === 'fail-to-xfail') ||
|
|
394
481
|
lostObservation;
|
|
395
|
-
const status = reduced
|
|
482
|
+
const status = reduced
|
|
483
|
+
? 'reduced'
|
|
484
|
+
: events.length > 0
|
|
485
|
+
? 'changed'
|
|
486
|
+
: 'intact';
|
|
396
487
|
const outcome = deriveOutcome(transitions, partial);
|
|
397
488
|
const anchors = {};
|
|
398
489
|
for (const id of transitions.new_fail)
|
|
@@ -441,7 +532,9 @@ function claimsReport(baseline, resolution, current, currentId, comparability) {
|
|
|
441
532
|
};
|
|
442
533
|
}
|
|
443
534
|
function hasLostObservation(baseline, current) {
|
|
444
|
-
const observedNow = new Set(current.observations
|
|
535
|
+
const observedNow = new Set(current.observations
|
|
536
|
+
.filter((o) => o.verdict !== 'not_run')
|
|
537
|
+
.map((o) => o.test_id));
|
|
445
538
|
return baseline.observations.some((o) => o.verdict !== 'not_run' && !observedNow.has(o.test_id));
|
|
446
539
|
}
|
|
447
540
|
function relOf(testId) {
|
|
@@ -453,7 +546,8 @@ function deriveOutcome(t, partial) {
|
|
|
453
546
|
return 'regressed';
|
|
454
547
|
if (partial)
|
|
455
548
|
return 'inconclusive';
|
|
456
|
-
if (t.repaired_same_surface.length > 0 ||
|
|
549
|
+
if (t.repaired_same_surface.length > 0 ||
|
|
550
|
+
t.repaired_with_test_change.length > 0) {
|
|
457
551
|
return 'improved';
|
|
458
552
|
}
|
|
459
553
|
return 'unchanged';
|
|
@@ -471,6 +565,6 @@ function sortTransitions(t) {
|
|
|
471
565
|
const kb = typeof b === 'string' ? b : b.test_id;
|
|
472
566
|
return ka < kb ? -1 : ka > kb ? 1 : 0;
|
|
473
567
|
});
|
|
474
|
-
t.updated_fail.sort((a, b) =>
|
|
568
|
+
t.updated_fail.sort((a, b) => a.test_id < b.test_id ? -1 : a.test_id > b.test_id ? 1 : 0);
|
|
475
569
|
}
|
|
476
570
|
//# sourceMappingURL=compare.js.map
|