harnery 0.24.0 → 0.26.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/dist/commands/harness.d.ts +2 -1
- package/dist/commands/harness.d.ts.map +1 -1
- package/dist/commands/harness.js +113 -3
- package/dist/commands/supervisor.d.ts.map +1 -1
- package/dist/commands/supervisor.js +3 -13
- package/dist/commands/work.d.ts.map +1 -1
- package/dist/commands/work.js +2 -7
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +3 -13
- package/dist/core/harnesses/attest.d.ts +53 -0
- package/dist/core/harnesses/attest.d.ts.map +1 -0
- package/dist/core/harnesses/attest.js +120 -0
- package/dist/core/harnesses/attestation.d.ts +82 -0
- package/dist/core/harnesses/attestation.d.ts.map +1 -0
- package/dist/core/harnesses/attestation.js +171 -0
- package/dist/core/harnesses/bench.d.ts +26 -1
- package/dist/core/harnesses/bench.d.ts.map +1 -1
- package/dist/core/harnesses/bench.js +137 -32
- package/dist/core/harnesses/index.d.ts +6 -2
- package/dist/core/harnesses/index.d.ts.map +1 -1
- package/dist/core/harnesses/index.js +3 -1
- package/dist/core/harnesses/profiles.d.ts +6 -6
- package/dist/core/harnesses/profiles.js +3 -3
- package/dist/core/workflow/engine.js +3 -0
- package/dist/core/workflow/proof.d.ts +4 -1
- package/dist/core/workflow/proof.d.ts.map +1 -1
- package/dist/core/workflow/proof.js +3 -2
- package/dist/core/workflow/spawn-claude.d.ts.map +1 -1
- package/dist/core/workflow/spawn-claude.js +2 -1
- package/dist/core/workflow/spawn-codex.d.ts.map +1 -1
- package/dist/core/workflow/spawn-codex.js +2 -1
- package/dist/core/workflow/spawn-cursor.d.ts.map +1 -1
- package/dist/core/workflow/spawn-cursor.js +2 -1
- package/dist/core/workflow/spawn-failure.d.ts +18 -0
- package/dist/core/workflow/spawn-failure.d.ts.map +1 -0
- package/dist/core/workflow/spawn-failure.js +24 -0
- package/dist/core/workflow/types.d.ts +14 -0
- package/dist/core/workflow/types.d.ts.map +1 -1
- package/package.json +4 -2
- package/src/commands/harness.ts +135 -2
- package/src/commands/supervisor.ts +11 -15
- package/src/commands/work.ts +8 -8
- package/src/commands/workflow.ts +11 -15
- package/src/core/harnesses/attest.ts +181 -0
- package/src/core/harnesses/attestation.ts +249 -0
- package/src/core/harnesses/bench.ts +192 -32
- package/src/core/harnesses/index.ts +26 -1
- package/src/core/harnesses/profiles.ts +3 -3
- package/src/core/workflow/engine.ts +3 -0
- package/src/core/workflow/proof.ts +7 -1
- package/src/core/workflow/spawn-claude.ts +2 -1
- package/src/core/workflow/spawn-codex.ts +2 -1
- package/src/core/workflow/spawn-cursor.ts +2 -1
- package/src/core/workflow/spawn-failure.ts +28 -0
- package/src/core/workflow/types.ts +15 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable record of what an installed vendor CLI was actually observed doing
|
|
3
|
+
* (ADR 0038).
|
|
4
|
+
*
|
|
5
|
+
* The conformance bench proves Harnery's own planner and normalizer against a
|
|
6
|
+
* committed fixture. That is an adapter check, not a vendor check
|
|
7
|
+
* (ADR 0037). An attestation is the other half: one bounded live turn, its
|
|
8
|
+
* observations, and the vendor version they were observed on.
|
|
9
|
+
*
|
|
10
|
+
* A record stores structural facts only. No prompt text, no completion text,
|
|
11
|
+
* no host paths. It lives under the host's coordination directory and is never
|
|
12
|
+
* published.
|
|
13
|
+
*/
|
|
14
|
+
import { mkdirSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
15
|
+
import { resolve } from "node:path";
|
|
16
|
+
import { monorepoRoot } from "../agents/coord-client.js";
|
|
17
|
+
import { stableDigest } from "../workflow/durable-record.js";
|
|
18
|
+
export const ATTESTATION_SCHEMA_VERSION = 2;
|
|
19
|
+
/** Dimensions one minimal live turn can honestly establish. Everything else
|
|
20
|
+
* needs a purpose-built scenario and stays outside the record rather than
|
|
21
|
+
* being guessed at. */
|
|
22
|
+
export const ATTESTABLE_DIMENSIONS = ["invocation", "finalResult", "sessionId", "cost"];
|
|
23
|
+
export function attestationsDir(opts = {}) {
|
|
24
|
+
const root = opts.coordRoot ?? monorepoRoot();
|
|
25
|
+
if (!root)
|
|
26
|
+
throw new Error("Not in a coord-aware repo (coord root resolved to null).");
|
|
27
|
+
return resolve(root, ".harnery", "harnesses", "attestations");
|
|
28
|
+
}
|
|
29
|
+
/** Stable identity of a declaration, so editing a claim invalidates the
|
|
30
|
+
* attestation that was recorded against the old one. */
|
|
31
|
+
export function profileDigest(profile) {
|
|
32
|
+
return stableDigest({
|
|
33
|
+
id: profile.id,
|
|
34
|
+
binary: profile.binary,
|
|
35
|
+
capabilities: profile.capabilities,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function digestOf(record) {
|
|
39
|
+
return stableDigest(record);
|
|
40
|
+
}
|
|
41
|
+
export function sealAttestation(record) {
|
|
42
|
+
return { ...record, record_digest: digestOf(record) };
|
|
43
|
+
}
|
|
44
|
+
function attestationPath(harness, opts) {
|
|
45
|
+
if (!/^[a-z0-9][a-z0-9._-]*$/i.test(harness)) {
|
|
46
|
+
throw new Error(`unsafe harness id for an attestation path: ${harness}`);
|
|
47
|
+
}
|
|
48
|
+
return resolve(attestationsDir(opts), `${harness}.json`);
|
|
49
|
+
}
|
|
50
|
+
/** Replace-in-place write. Unlike a workflow record an attestation is meant to
|
|
51
|
+
* be re-recorded, so this is a mutable atomic swap rather than an immutable
|
|
52
|
+
* create. */
|
|
53
|
+
export function writeAttestation(record, opts = {}) {
|
|
54
|
+
const path = attestationPath(record.harness, opts);
|
|
55
|
+
mkdirSync(attestationsDir(opts), { recursive: true, mode: 0o700 });
|
|
56
|
+
const temporary = `${path}.tmp-${process.pid}`;
|
|
57
|
+
try {
|
|
58
|
+
writeFileSync(temporary, `${JSON.stringify(record, null, 2)}\n`, {
|
|
59
|
+
encoding: "utf8",
|
|
60
|
+
mode: 0o600,
|
|
61
|
+
});
|
|
62
|
+
renameSync(temporary, path);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
try {
|
|
66
|
+
unlinkSync(temporary);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// The temp file may never have been created; the original error wins.
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
return path;
|
|
74
|
+
}
|
|
75
|
+
/** Null for absent, unreadable, malformed, wrong-schema, or tampered records.
|
|
76
|
+
* A record that fails its own digest is discarded rather than trusted, because
|
|
77
|
+
* the whole point of the file is that it was not hand-written. */
|
|
78
|
+
export function readAttestation(harness, opts = {}) {
|
|
79
|
+
let raw;
|
|
80
|
+
try {
|
|
81
|
+
raw = readFileSync(attestationPath(harness, opts), "utf8");
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
let parsed;
|
|
87
|
+
try {
|
|
88
|
+
parsed = JSON.parse(raw);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
return validateAttestation(parsed, harness);
|
|
94
|
+
}
|
|
95
|
+
export function validateAttestation(value, harness) {
|
|
96
|
+
if (!value || typeof value !== "object")
|
|
97
|
+
return null;
|
|
98
|
+
const record = value;
|
|
99
|
+
if (record.schema_version !== ATTESTATION_SCHEMA_VERSION)
|
|
100
|
+
return null;
|
|
101
|
+
if (typeof record.harness !== "string" || (harness && record.harness !== harness))
|
|
102
|
+
return null;
|
|
103
|
+
if (typeof record.binary_version !== "string" || typeof record.profile_digest !== "string") {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
if (typeof record.observed_at !== "string" || typeof record.record_digest !== "string")
|
|
107
|
+
return null;
|
|
108
|
+
if (!record.observations || typeof record.observations !== "object")
|
|
109
|
+
return null;
|
|
110
|
+
const { record_digest, ...body } = record;
|
|
111
|
+
if (digestOf(body) !== record_digest)
|
|
112
|
+
return null;
|
|
113
|
+
return record;
|
|
114
|
+
}
|
|
115
|
+
/** An attestation speaks only for the vendor version and declaration it was
|
|
116
|
+
* recorded against. */
|
|
117
|
+
export function isAttestationCurrent(record, binaryVersion, profile, subscriptionOnly) {
|
|
118
|
+
if (!record || !binaryVersion)
|
|
119
|
+
return false;
|
|
120
|
+
if (record.binary_version !== binaryVersion)
|
|
121
|
+
return false;
|
|
122
|
+
if (subscriptionOnly !== undefined && record.subscription_only !== subscriptionOnly)
|
|
123
|
+
return false;
|
|
124
|
+
return record.profile_digest === profileDigest(profile);
|
|
125
|
+
}
|
|
126
|
+
export function listAttestations(opts = {}) {
|
|
127
|
+
let names;
|
|
128
|
+
try {
|
|
129
|
+
names = readdirSync(attestationsDir(opts));
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
const records = [];
|
|
135
|
+
for (const name of names) {
|
|
136
|
+
if (!name.endsWith(".json"))
|
|
137
|
+
continue;
|
|
138
|
+
const record = readAttestation(name.slice(0, -".json".length), opts);
|
|
139
|
+
if (record)
|
|
140
|
+
records.push(record);
|
|
141
|
+
}
|
|
142
|
+
return records.sort((a, b) => a.harness.localeCompare(b.harness));
|
|
143
|
+
}
|
|
144
|
+
/** Both harness-derived proof inputs, read once, for a workflow run
|
|
145
|
+
* (ADR 0038). Callers inject the result so the engine performs no capability
|
|
146
|
+
* lookups of its own. A harness with no current attestation simply has no
|
|
147
|
+
* citation; that absence is not a proof unknown. */
|
|
148
|
+
export function harnessProofInputs(profiles, opts) {
|
|
149
|
+
const harnessEvidence = {};
|
|
150
|
+
const harnessAttestations = {};
|
|
151
|
+
for (const profile of profiles) {
|
|
152
|
+
harnessEvidence[profile.id] = { toolEvidence: profile.capabilities.toolEvidence };
|
|
153
|
+
let record = null;
|
|
154
|
+
try {
|
|
155
|
+
record = readAttestation(profile.id, opts);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// No coord root or unreadable store: run unattested rather than fail.
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (!isAttestationCurrent(record, opts.versionProbe(profile.binary), profile, opts.subscriptionOnly)) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
harnessAttestations[profile.id] = {
|
|
165
|
+
binary_version: record.binary_version,
|
|
166
|
+
observed_at: record.observed_at,
|
|
167
|
+
record_digest: record.record_digest,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
return { harnessEvidence, harnessAttestations };
|
|
171
|
+
}
|
|
@@ -1,13 +1,23 @@
|
|
|
1
|
+
import type { HarnessAttestation } from "./attestation.js";
|
|
1
2
|
import type { HarnessRegistry } from "./registry.js";
|
|
2
3
|
import type { CapabilitySupport, HarnessCapabilityDimension, HarnessId } from "./types.js";
|
|
3
4
|
export type BenchVerdict = "supported" | "partial" | "unsupported" | "not_applicable" | "unknown" | "skipped" | "drift";
|
|
4
|
-
export type BenchDimension = "registration" | "binary" | HarnessCapabilityDimension;
|
|
5
|
+
export type BenchDimension = "registration" | "binary" | "contract" | HarnessCapabilityDimension;
|
|
6
|
+
/** How a result was established (ADR 0037). Orthogonal to the verdict: this
|
|
7
|
+
* answers "how do we know", not "what is true".
|
|
8
|
+
*
|
|
9
|
+
* - `adapter`: checked against Harnery's own planner, normalizer, or fixture.
|
|
10
|
+
* Proves the adapter contract, says nothing about the installed vendor CLI.
|
|
11
|
+
* - `attested`: checked by observing the installed vendor CLI on this host.
|
|
12
|
+
* - `declared`: not checked. The value is the declaration, repeated. */
|
|
13
|
+
export type BenchBasis = "adapter" | "attested" | "declared";
|
|
5
14
|
export interface BenchResult {
|
|
6
15
|
harness: HarnessId;
|
|
7
16
|
dimension: BenchDimension;
|
|
8
17
|
declared: CapabilitySupport | "not_applicable";
|
|
9
18
|
observed: BenchVerdict;
|
|
10
19
|
verdict: BenchVerdict;
|
|
20
|
+
basis: BenchBasis;
|
|
11
21
|
note?: string;
|
|
12
22
|
}
|
|
13
23
|
export interface HarnessBenchReport {
|
|
@@ -16,6 +26,9 @@ export interface HarnessBenchReport {
|
|
|
16
26
|
harnesses: HarnessId[];
|
|
17
27
|
results: BenchResult[];
|
|
18
28
|
summary: Record<BenchVerdict, number>;
|
|
29
|
+
/** Result counts per basis, so a caller can tell a clean report from an
|
|
30
|
+
* unmeasured one without walking every result. */
|
|
31
|
+
basisSummary: Record<BenchBasis, number>;
|
|
19
32
|
drift: boolean;
|
|
20
33
|
skipped: boolean;
|
|
21
34
|
}
|
|
@@ -24,6 +37,18 @@ export interface HarnessBenchOptions {
|
|
|
24
37
|
dimensions?: readonly HarnessCapabilityDimension[];
|
|
25
38
|
/** Test seam and alternate host probe. A null version means unavailable. */
|
|
26
39
|
versionProbe?: (binary: string) => string | null;
|
|
40
|
+
/** Where to look for live attestations (ADR 0038). Defaults to the coord
|
|
41
|
+
* root. Reading them never runs a model turn. */
|
|
42
|
+
coordRoot?: string;
|
|
43
|
+
/** Test seam. Defaults to reading the attestation store. */
|
|
44
|
+
attestationReader?: (harness: HarnessId) => HarnessAttestation | null;
|
|
45
|
+
/** Only cite attestations recorded under this billing mode. Omitted means
|
|
46
|
+
* any mode is acceptable for reporting purposes. */
|
|
47
|
+
subscriptionOnly?: boolean;
|
|
27
48
|
}
|
|
28
49
|
export declare function runHarnessBench(registry: HarnessRegistry, opts?: HarnessBenchOptions): HarnessBenchReport;
|
|
50
|
+
/** Ask an installed vendor CLI what version it is. Null when it is absent or
|
|
51
|
+
* refuses to answer. Shared with the live attestation probe so both halves of
|
|
52
|
+
* the capability story key on the same string. */
|
|
53
|
+
export declare function probeBinaryVersion(binary: string): string | null;
|
|
29
54
|
//# sourceMappingURL=bench.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bench.d.ts","sourceRoot":"","sources":["../../../src/core/harnesses/bench.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EACV,iBAAiB,EAEjB,0BAA0B,EAC1B,SAAS,EACV,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,SAAS,GACT,aAAa,GACb,gBAAgB,GAChB,SAAS,GACT,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,QAAQ,GAAG,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"bench.d.ts","sourceRoot":"","sources":["../../../src/core/harnesses/bench.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EACV,iBAAiB,EAEjB,0BAA0B,EAC1B,SAAS,EACV,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,SAAS,GACT,aAAa,GACb,gBAAgB,GAChB,SAAS,GACT,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,0BAA0B,CAAC;AAEjG;;;;;;wEAMwE;AACxE,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,cAAc,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,GAAG,gBAAgB,CAAC;IAC/C,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACtC;sDACkD;IAClD,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;IACnD,4EAA4E;IAC5E,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACjD;qDACiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,kBAAkB,GAAG,IAAI,CAAC;IACtE;wDACoD;IACpD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAkDD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,eAAe,EACzB,IAAI,GAAE,mBAAwB,GAC7B,kBAAkB,CAwEpB;AA2KD;;kDAEkD;AAClD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIhE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
2
|
import { HARNESS_SPECS } from "../hooks/harness/events.js";
|
|
3
|
+
import { isAttestationCurrent, readAttestation } from "./attestation.js";
|
|
3
4
|
import { HARNESS_CAPABILITY_DIMENSIONS } from "./types.js";
|
|
4
5
|
const EMPTY_SUMMARY = {
|
|
5
6
|
supported: 0,
|
|
@@ -10,12 +11,44 @@ const EMPTY_SUMMARY = {
|
|
|
10
11
|
skipped: 0,
|
|
11
12
|
drift: 0,
|
|
12
13
|
};
|
|
14
|
+
const EMPTY_BASIS_SUMMARY = {
|
|
15
|
+
adapter: 0,
|
|
16
|
+
attested: 0,
|
|
17
|
+
declared: 0,
|
|
18
|
+
};
|
|
19
|
+
/** A stored attestation only counts when it still matches the installed
|
|
20
|
+
* version and the current declaration. A stale one is ignored rather than
|
|
21
|
+
* trusted, so an upgraded vendor CLI silently drops back to adapter basis. */
|
|
22
|
+
function loadAttestation(id, version, adapter, opts) {
|
|
23
|
+
let record = null;
|
|
24
|
+
try {
|
|
25
|
+
record = opts.attestationReader
|
|
26
|
+
? opts.attestationReader(id)
|
|
27
|
+
: readAttestation(id, { coordRoot: opts.coordRoot });
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// No coord root, unreadable store: the bench still runs, just unattested.
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return isAttestationCurrent(record, version, adapter.profile, opts.subscriptionOnly)
|
|
34
|
+
? record
|
|
35
|
+
: null;
|
|
36
|
+
}
|
|
37
|
+
/** First version-shaped token in a string, or null when there is none.
|
|
38
|
+
* Tolerates the vendor prefixes and suffixes real CLIs print, so
|
|
39
|
+
* `codex-cli 0.144.5` and `2.1.197 (Claude Code)` both reduce to a token. */
|
|
40
|
+
function versionToken(value) {
|
|
41
|
+
if (!value)
|
|
42
|
+
return null;
|
|
43
|
+
const match = value.match(/\d+(?:\.\d+)+(?:[-.][0-9a-z]+)*/i);
|
|
44
|
+
return match ? match[0].toLowerCase() : null;
|
|
45
|
+
}
|
|
13
46
|
export function runHarnessBench(registry, opts = {}) {
|
|
14
47
|
const ids = opts.harnesses?.length ? [...opts.harnesses] : registry.ids();
|
|
15
48
|
const dimensions = opts.dimensions?.length
|
|
16
49
|
? [...new Set(opts.dimensions)]
|
|
17
50
|
: [...HARNESS_CAPABILITY_DIMENSIONS];
|
|
18
|
-
const versionProbe = opts.versionProbe ??
|
|
51
|
+
const versionProbe = opts.versionProbe ?? probeBinaryVersion;
|
|
19
52
|
const results = [];
|
|
20
53
|
for (const id of ids) {
|
|
21
54
|
const adapter = registry.require(id);
|
|
@@ -25,6 +58,7 @@ export function runHarnessBench(registry, opts = {}) {
|
|
|
25
58
|
declared: "supported",
|
|
26
59
|
observed: "supported",
|
|
27
60
|
verdict: "supported",
|
|
61
|
+
basis: "adapter",
|
|
28
62
|
note: `${adapter.profile.integrationMode}; ${adapter.profile.authModel}`,
|
|
29
63
|
});
|
|
30
64
|
const version = versionProbe(adapter.profile.binary);
|
|
@@ -34,35 +68,105 @@ export function runHarnessBench(registry, opts = {}) {
|
|
|
34
68
|
declared: "supported",
|
|
35
69
|
observed: version ? "supported" : "skipped",
|
|
36
70
|
verdict: version ? "supported" : "skipped",
|
|
71
|
+
// A skip establishes nothing about the vendor, so it is not an attestation.
|
|
72
|
+
basis: version ? "attested" : "declared",
|
|
37
73
|
note: version ?? `${adapter.profile.binary} not found on PATH`,
|
|
38
74
|
});
|
|
75
|
+
results.push(contractResult(id, adapter, version));
|
|
39
76
|
const observations = observeAdapter(adapter);
|
|
77
|
+
const attestation = loadAttestation(id, version, adapter, opts);
|
|
40
78
|
for (const dimension of dimensions) {
|
|
41
79
|
const claim = adapter.profile.capabilities[dimension];
|
|
42
|
-
const
|
|
80
|
+
const live = attestation?.observations[dimension];
|
|
81
|
+
// A live observation of the installed CLI outranks a fixture check of
|
|
82
|
+
// Harnery's own normalizer. Everything else keeps its adapter basis.
|
|
83
|
+
const { observed, basis } = live
|
|
84
|
+
? { observed: live, basis: "attested" }
|
|
85
|
+
: observations[dimension];
|
|
43
86
|
results.push({
|
|
44
87
|
harness: id,
|
|
45
88
|
dimension,
|
|
46
89
|
declared: claim.support,
|
|
47
90
|
observed,
|
|
48
91
|
verdict: reconcile(claim.support, observed),
|
|
49
|
-
|
|
92
|
+
basis,
|
|
93
|
+
note: live ? `attested on ${attestation?.binary_version}` : claim.note,
|
|
50
94
|
});
|
|
51
95
|
}
|
|
52
96
|
}
|
|
53
97
|
const summary = { ...EMPTY_SUMMARY };
|
|
54
|
-
|
|
98
|
+
const basisSummary = { ...EMPTY_BASIS_SUMMARY };
|
|
99
|
+
for (const result of results) {
|
|
55
100
|
summary[result.verdict]++;
|
|
101
|
+
basisSummary[result.basis]++;
|
|
102
|
+
}
|
|
56
103
|
return {
|
|
57
104
|
generatedAt: new Date().toISOString(),
|
|
58
105
|
mode: "offline",
|
|
59
106
|
harnesses: ids,
|
|
60
107
|
results,
|
|
61
108
|
summary,
|
|
109
|
+
basisSummary,
|
|
62
110
|
drift: summary.drift > 0,
|
|
63
111
|
skipped: summary.skipped > 0,
|
|
64
112
|
};
|
|
65
113
|
}
|
|
114
|
+
/** Compare the vendor contract a declaration was validated against with the
|
|
115
|
+
* one actually installed (ADR 0037). This is the only dimension attested
|
|
116
|
+
* without a model turn, because a version string costs nothing to read.
|
|
117
|
+
*
|
|
118
|
+
* A mismatch is `drift`, not failure: a newer vendor CLI is not automatically
|
|
119
|
+
* broken, but the declaration is no longer backed by an observation. An
|
|
120
|
+
* unrecorded or unparseable declared version stays `unknown` rather than being
|
|
121
|
+
* inferred from the installed one. */
|
|
122
|
+
function contractResult(id, adapter, version) {
|
|
123
|
+
const recorded = adapter.profile.verified;
|
|
124
|
+
const base = { harness: id, dimension: "contract", declared: "supported" };
|
|
125
|
+
if (!version) {
|
|
126
|
+
return {
|
|
127
|
+
...base,
|
|
128
|
+
observed: "skipped",
|
|
129
|
+
verdict: "skipped",
|
|
130
|
+
basis: "declared",
|
|
131
|
+
note: `${adapter.profile.binary} not found on PATH; installed contract unobservable`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const declaredToken = versionToken(recorded?.version);
|
|
135
|
+
if (!declaredToken) {
|
|
136
|
+
return {
|
|
137
|
+
...base,
|
|
138
|
+
observed: "unknown",
|
|
139
|
+
verdict: "unknown",
|
|
140
|
+
basis: "declared",
|
|
141
|
+
note: recorded
|
|
142
|
+
? `verified.version "${recorded.version}" is not a version; installed ${version}`
|
|
143
|
+
: `no verified vendor contract recorded; installed ${version}`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const installedToken = versionToken(version) ?? version.trim().toLowerCase();
|
|
147
|
+
if (installedToken === declaredToken) {
|
|
148
|
+
return {
|
|
149
|
+
...base,
|
|
150
|
+
observed: "supported",
|
|
151
|
+
verdict: "supported",
|
|
152
|
+
basis: "attested",
|
|
153
|
+
note: `declaration validated against ${recorded?.version} on ${recorded?.date}`,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
...base,
|
|
158
|
+
observed: "drift",
|
|
159
|
+
verdict: "drift",
|
|
160
|
+
basis: "attested",
|
|
161
|
+
note: `declaration validated against ${recorded?.version} (${recorded?.date}); installed ${version}`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/** Checked against Harnery's planner, normalizer, or fixture. */
|
|
165
|
+
function fromAdapter(observed) {
|
|
166
|
+
return { observed, basis: "adapter" };
|
|
167
|
+
}
|
|
168
|
+
/** No check exists for this dimension yet. */
|
|
169
|
+
const NOT_CHECKED = { observed: "unknown", basis: "declared" };
|
|
66
170
|
function observeAdapter(adapter) {
|
|
67
171
|
const profile = adapter.profile;
|
|
68
172
|
const effort = profile.effortValues[0];
|
|
@@ -98,43 +202,41 @@ function observeAdapter(adapter) {
|
|
|
98
202
|
: undefined;
|
|
99
203
|
const hookSubcommands = new Set(hookSpec?.events.map((event) => event.subcommand) ?? []);
|
|
100
204
|
return {
|
|
101
|
-
invocation: !planningFailed && argv[0] === profile.binary && argv.includes(request.prompt)
|
|
205
|
+
invocation: fromAdapter(!planningFailed && argv[0] === profile.binary && argv.includes(request.prompt)
|
|
102
206
|
? "supported"
|
|
103
|
-
: "unsupported",
|
|
104
|
-
modelSelection: !planningFailed && argv.includes(request.model ?? "") ? "supported" : "unsupported",
|
|
105
|
-
effortSelection: effort === undefined
|
|
207
|
+
: "unsupported"),
|
|
208
|
+
modelSelection: fromAdapter(!planningFailed && argv.includes(request.model ?? "") ? "supported" : "unsupported"),
|
|
209
|
+
effortSelection: fromAdapter(effort === undefined
|
|
106
210
|
? "unsupported"
|
|
107
211
|
: !planningFailed && argv.some((arg) => arg.includes(effort))
|
|
108
212
|
? "supported"
|
|
109
|
-
: "unsupported",
|
|
110
|
-
maxTurns: !planningFailed && argv.includes(String(request.maxTurns)) ? "supported" : "unsupported",
|
|
111
|
-
finalResult: finalMatches ? "supported" : "unsupported",
|
|
112
|
-
sessionId: sessionObserved === "supported" && normalized?.sessionId !== fixture.sessionId
|
|
213
|
+
: "unsupported"),
|
|
214
|
+
maxTurns: fromAdapter(!planningFailed && argv.includes(String(request.maxTurns)) ? "supported" : "unsupported"),
|
|
215
|
+
finalResult: fromAdapter(finalMatches ? "supported" : "unsupported"),
|
|
216
|
+
sessionId: fromAdapter(sessionObserved === "supported" && normalized?.sessionId !== fixture.sessionId
|
|
113
217
|
? "unsupported"
|
|
114
|
-
: sessionObserved,
|
|
115
|
-
cost: costObserved === "supported" && normalized?.costUsd !== fixture.costUsd
|
|
218
|
+
: sessionObserved),
|
|
219
|
+
cost: fromAdapter(costObserved === "supported" && normalized?.costUsd !== fixture.costUsd
|
|
116
220
|
? "unsupported"
|
|
117
|
-
: costObserved,
|
|
118
|
-
toolEvidence: normalized && "toolEvidence" in normalized ? "supported" : "unsupported",
|
|
119
|
-
policyMapping:
|
|
120
|
-
interruption:
|
|
121
|
-
streaming:
|
|
122
|
-
steering:
|
|
123
|
-
resume:
|
|
124
|
-
images:
|
|
125
|
-
contextTelemetry:
|
|
221
|
+
: costObserved),
|
|
222
|
+
toolEvidence: fromAdapter(normalized && "toolEvidence" in normalized ? "supported" : "unsupported"),
|
|
223
|
+
policyMapping: NOT_CHECKED,
|
|
224
|
+
interruption: NOT_CHECKED,
|
|
225
|
+
streaming: NOT_CHECKED,
|
|
226
|
+
steering: NOT_CHECKED,
|
|
227
|
+
resume: NOT_CHECKED,
|
|
228
|
+
images: NOT_CHECKED,
|
|
229
|
+
contextTelemetry: NOT_CHECKED,
|
|
126
230
|
preCompactionSignal: hookSpec
|
|
127
|
-
? hookSubcommands.has("pre-compact")
|
|
128
|
-
|
|
129
|
-
: "unsupported"
|
|
130
|
-
: "unknown",
|
|
231
|
+
? fromAdapter(hookSubcommands.has("pre-compact") ? "supported" : "unsupported")
|
|
232
|
+
: NOT_CHECKED,
|
|
131
233
|
postCompactionSignal: hookSpec
|
|
132
|
-
? hookSubcommands.has("post-compact") ||
|
|
234
|
+
? fromAdapter(hookSubcommands.has("post-compact") ||
|
|
133
235
|
(adapter.profile.id === "claude-code" && hookSubcommands.has("session-start"))
|
|
134
236
|
? "supported"
|
|
135
|
-
: "unsupported"
|
|
136
|
-
:
|
|
137
|
-
compaction:
|
|
237
|
+
: "unsupported")
|
|
238
|
+
: NOT_CHECKED,
|
|
239
|
+
compaction: NOT_CHECKED,
|
|
138
240
|
};
|
|
139
241
|
}
|
|
140
242
|
function reconcile(declared, observed) {
|
|
@@ -143,7 +245,10 @@ function reconcile(declared, observed) {
|
|
|
143
245
|
}
|
|
144
246
|
return declared === observed ? observed : "drift";
|
|
145
247
|
}
|
|
146
|
-
|
|
248
|
+
/** Ask an installed vendor CLI what version it is. Null when it is absent or
|
|
249
|
+
* refuses to answer. Shared with the live attestation probe so both halves of
|
|
250
|
+
* the capability story key on the same string. */
|
|
251
|
+
export function probeBinaryVersion(binary) {
|
|
147
252
|
const result = spawnSync(binary, ["--version"], { encoding: "utf8", timeout: 5_000 });
|
|
148
253
|
if (result.error || result.status !== 0)
|
|
149
254
|
return null;
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
export type { Spawner, SpawnRequest, SpawnResult } from "../workflow/types.js";
|
|
2
|
-
export type {
|
|
3
|
-
export {
|
|
2
|
+
export type { AttestationOutcome, HarnessAttestationReport, HarnessAttestationResult, RunHarnessAttestationOptions, } from "./attest.js";
|
|
3
|
+
export { ATTESTATION_PROMPT, runHarnessAttestation } from "./attest.js";
|
|
4
|
+
export type { AttestableDimension, AttestationStoreOptions, HarnessAttestation, } from "./attestation.js";
|
|
5
|
+
export { ATTESTABLE_DIMENSIONS, ATTESTATION_SCHEMA_VERSION, attestationsDir, harnessProofInputs, isAttestationCurrent, listAttestations, profileDigest, readAttestation, validateAttestation, writeAttestation, } from "./attestation.js";
|
|
6
|
+
export type { BenchBasis, BenchDimension, BenchResult, BenchVerdict, HarnessBenchOptions, HarnessBenchReport, } from "./bench.js";
|
|
7
|
+
export { probeBinaryVersion, runHarnessBench } from "./bench.js";
|
|
4
8
|
export type { BuiltinHarnessId } from "./profiles.js";
|
|
5
9
|
export { BUILTIN_HARNESS_IDS, BUILTIN_HARNESS_PROFILES, builtinHarnessProfile, isBuiltinHarness, validateHarnessEffort, } from "./profiles.js";
|
|
6
10
|
export { createBuiltinHarnessRegistry, HarnessRegistry } from "./registry.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/harnesses/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC/E,YAAY,EACV,cAAc,EACd,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/harnesses/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC/E,YAAY,EACV,kBAAkB,EAClB,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EACV,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,UAAU,EACV,cAAc,EACd,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACjE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,4BAA4B,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { ATTESTATION_PROMPT, runHarnessAttestation } from "./attest.js";
|
|
2
|
+
export { ATTESTABLE_DIMENSIONS, ATTESTATION_SCHEMA_VERSION, attestationsDir, harnessProofInputs, isAttestationCurrent, listAttestations, profileDigest, readAttestation, validateAttestation, writeAttestation, } from "./attestation.js";
|
|
3
|
+
export { probeBinaryVersion, runHarnessBench } from "./bench.js";
|
|
2
4
|
export { BUILTIN_HARNESS_IDS, BUILTIN_HARNESS_PROFILES, builtinHarnessProfile, isBuiltinHarness, validateHarnessEffort, } from "./profiles.js";
|
|
3
5
|
export { createBuiltinHarnessRegistry, HarnessRegistry } from "./registry.js";
|
|
4
6
|
export { HARNESS_CAPABILITY_DIMENSIONS } from "./types.js";
|
|
@@ -14,8 +14,8 @@ export declare const BUILTIN_HARNESS_PROFILES: {
|
|
|
14
14
|
readonly modelFamily: "claude";
|
|
15
15
|
readonly effortValues: readonly ["low", "medium", "high", "xhigh", "max"];
|
|
16
16
|
readonly verified: {
|
|
17
|
-
readonly date: "2026-07-
|
|
18
|
-
readonly version: "
|
|
17
|
+
readonly date: "2026-07-25";
|
|
18
|
+
readonly version: "2.1.197 (Claude Code)";
|
|
19
19
|
};
|
|
20
20
|
readonly capabilities: HarnessCapabilities;
|
|
21
21
|
};
|
|
@@ -31,8 +31,8 @@ export declare const BUILTIN_HARNESS_PROFILES: {
|
|
|
31
31
|
readonly modelFamily: "gpt";
|
|
32
32
|
readonly effortValues: readonly ["none", "minimal", "low", "medium", "high", "xhigh"];
|
|
33
33
|
readonly verified: {
|
|
34
|
-
readonly date: "2026-07-
|
|
35
|
-
readonly version: "codex-cli 0.
|
|
34
|
+
readonly date: "2026-07-25";
|
|
35
|
+
readonly version: "codex-cli 0.144.5";
|
|
36
36
|
};
|
|
37
37
|
readonly capabilities: HarnessCapabilities;
|
|
38
38
|
};
|
|
@@ -48,8 +48,8 @@ export declare const BUILTIN_HARNESS_PROFILES: {
|
|
|
48
48
|
readonly modelFamily: "multi";
|
|
49
49
|
readonly effortValues: readonly [];
|
|
50
50
|
readonly verified: {
|
|
51
|
-
readonly date: "2026-07-
|
|
52
|
-
readonly version: "2026.07.
|
|
51
|
+
readonly date: "2026-07-25";
|
|
52
|
+
readonly version: "2026.07.23-e383d2b";
|
|
53
53
|
};
|
|
54
54
|
readonly capabilities: HarnessCapabilities;
|
|
55
55
|
};
|
|
@@ -39,7 +39,7 @@ export const BUILTIN_HARNESS_PROFILES = {
|
|
|
39
39
|
authModel: "own-auth",
|
|
40
40
|
modelFamily: "claude",
|
|
41
41
|
effortValues: ["low", "medium", "high", "xhigh", "max"],
|
|
42
|
-
verified: { date: "2026-07-
|
|
42
|
+
verified: { date: "2026-07-25", version: "2.1.197 (Claude Code)" },
|
|
43
43
|
capabilities: capabilities({
|
|
44
44
|
effortSelection: supported("Mapped to `--effort <level>`."),
|
|
45
45
|
maxTurns: supported("Mapped to `--max-turns <n>`."),
|
|
@@ -61,7 +61,7 @@ export const BUILTIN_HARNESS_PROFILES = {
|
|
|
61
61
|
authModel: "own-auth",
|
|
62
62
|
modelFamily: "gpt",
|
|
63
63
|
effortValues: ["none", "minimal", "low", "medium", "high", "xhigh"],
|
|
64
|
-
verified: { date: "2026-07-
|
|
64
|
+
verified: { date: "2026-07-25", version: "codex-cli 0.144.5" },
|
|
65
65
|
capabilities: capabilities({
|
|
66
66
|
effortSelection: supported('Mapped to `-c model_reasoning_effort="<level>"`.'),
|
|
67
67
|
maxTurns: unsupported("codex exec exposes no turn-ceiling flag."),
|
|
@@ -83,7 +83,7 @@ export const BUILTIN_HARNESS_PROFILES = {
|
|
|
83
83
|
authModel: "own-auth",
|
|
84
84
|
modelFamily: "multi",
|
|
85
85
|
effortValues: [],
|
|
86
|
-
verified: { date: "2026-07-
|
|
86
|
+
verified: { date: "2026-07-25", version: "2026.07.23-e383d2b" },
|
|
87
87
|
capabilities: capabilities({
|
|
88
88
|
effortSelection: unsupported("Cursor embeds effort in some parameterized model ids; Harnery does not rewrite model ids."),
|
|
89
89
|
maxTurns: unsupported("cursor-agent exposes no turn-ceiling flag."),
|
|
@@ -245,6 +245,7 @@ async function executeWorkflow(scriptPath, absScript, opts, resumeState, workCon
|
|
|
245
245
|
agents: [],
|
|
246
246
|
evidence: [],
|
|
247
247
|
harnessEvidence: opts.harnessEvidence,
|
|
248
|
+
harnessAttestations: opts.harnessAttestations,
|
|
248
249
|
policy: policy
|
|
249
250
|
? {
|
|
250
251
|
config: policy,
|
|
@@ -925,6 +926,7 @@ async function executeWorkflow(scriptPath, absScript, opts, resumeState, workCon
|
|
|
925
926
|
agents: Array.from(agentProofs.values()),
|
|
926
927
|
evidence: evidenceRecords,
|
|
927
928
|
harnessEvidence: opts.harnessEvidence,
|
|
929
|
+
harnessAttestations: opts.harnessAttestations,
|
|
928
930
|
policy: policy
|
|
929
931
|
? {
|
|
930
932
|
config: policy,
|
|
@@ -1002,6 +1004,7 @@ async function executeWorkflow(scriptPath, absScript, opts, resumeState, workCon
|
|
|
1002
1004
|
agents: Array.from(agentProofs.values()),
|
|
1003
1005
|
evidence: evidenceRecords,
|
|
1004
1006
|
harnessEvidence: opts.harnessEvidence,
|
|
1007
|
+
harnessAttestations: opts.harnessAttestations,
|
|
1005
1008
|
policy: policy
|
|
1006
1009
|
? {
|
|
1007
1010
|
config: policy,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RepoSnapshot } from "../context/index.js";
|
|
2
2
|
import type { NormalizedPolicy, PolicyDecision, PolicyIsolation, PolicyNetworkAccess } from "../policy/index.js";
|
|
3
|
-
import type { AcceptanceCriterion, AcceptanceResult, AcceptanceSummary, HarnessEvidenceCapability, ResultDigest, WorkflowAgentProof, WorkflowAttemptContext, WorkflowEvidenceInput, WorkflowEvidenceRecord, WorkflowMeta, WorkflowProof, WorkflowWorkContext } from "./types.js";
|
|
3
|
+
import type { AcceptanceCriterion, AcceptanceResult, AcceptanceSummary, HarnessAttestationCitation, HarnessEvidenceCapability, ResultDigest, WorkflowAgentProof, WorkflowAttemptContext, WorkflowEvidenceInput, WorkflowEvidenceRecord, WorkflowMeta, WorkflowProof, WorkflowWorkContext } from "./types.js";
|
|
4
4
|
import type { WorkspaceAttestation, WorkspaceBinding, WorkspaceUnsupportedExecutionEvidence } from "./workspaces/index.js";
|
|
5
5
|
export interface NormalizedWorkflowMeta {
|
|
6
6
|
name: string;
|
|
@@ -24,6 +24,9 @@ export interface BuildWorkflowProofInput {
|
|
|
24
24
|
agents: WorkflowAgentProof[];
|
|
25
25
|
evidence: WorkflowEvidenceRecord[];
|
|
26
26
|
harnessEvidence?: Readonly<Record<string, HarnessEvidenceCapability | undefined>>;
|
|
27
|
+
/** Live attestations backing each harness's claims (ADR 0038). Injected by
|
|
28
|
+
* the caller so proof stays free of filesystem lookups. */
|
|
29
|
+
harnessAttestations?: Readonly<Record<string, HarnessAttestationCitation | undefined>>;
|
|
27
30
|
policy?: {
|
|
28
31
|
config: Readonly<NormalizedPolicy>;
|
|
29
32
|
decisions: readonly PolicyDecision[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proof.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/proof.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"proof.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/proof.ts"],"names":[],"mappings":"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"}
|