@vela-science/canopus 0.6.5 → 0.8.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/CHANGELOG.md +97 -0
- package/README.md +67 -139
- package/SECURITY.md +3 -2
- package/capsules/erdos1056-k15/bin/linux-arm64/{10428801-10429000 → 10429201-10429400}/verifier +0 -0
- package/capsules/erdos1056-k15/bin/linux-x86_64/{10428801-10429000 → 10429201-10429400}/verifier +0 -0
- package/compatibility.json +25 -0
- package/dist/src/activity/events.d.ts +4 -1
- package/dist/src/activity/events.js +8 -2
- package/dist/src/activity/store.d.ts +2 -2
- package/dist/src/activity/store.js +4 -3
- package/dist/src/{receipt/map.d.ts → candidate/finalize.d.ts} +2 -9
- package/dist/src/candidate/finalize.js +71 -0
- package/dist/src/cli.js +88 -229
- package/dist/src/contracts/mission.d.ts +1 -13
- package/dist/src/contracts/mission.js +4 -42
- package/dist/src/contracts/validation.d.ts +1 -25
- package/dist/src/contracts/validation.js +1 -95
- package/dist/src/engines/codex-tools-native.js +2 -2
- package/dist/src/index.d.ts +5 -34
- package/dist/src/index.js +4 -34
- package/dist/src/mission/prepare.d.ts +10 -1
- package/dist/src/mission/prepare.js +29 -30
- package/dist/src/product/coverage.d.ts +17 -0
- package/dist/src/product/coverage.js +137 -0
- package/dist/src/product/doctor.d.ts +1 -2
- package/dist/src/product/doctor.js +29 -8
- package/dist/src/product/profile.js +8 -2
- package/dist/src/product/replay.js +11 -12
- package/dist/src/product/run.d.ts +5 -9
- package/dist/src/product/run.js +17 -88
- package/dist/src/product/submission.d.ts +40 -0
- package/dist/src/product/submission.js +217 -0
- package/dist/src/product/submit.d.ts +22 -0
- package/dist/src/product/submit.js +264 -0
- package/dist/src/product/version.d.ts +2 -2
- package/dist/src/product/version.js +27 -4
- package/dist/src/projection/current-run.d.ts +12 -0
- package/dist/src/projection/current-run.js +94 -0
- package/dist/src/projection/failure.d.ts +17 -7
- package/dist/src/projection/failure.js +43 -12
- package/dist/src/projection/retained-mission.d.ts +6 -0
- package/dist/src/projection/retained-mission.js +41 -0
- package/dist/src/projection/retained-run.d.ts +7 -0
- package/dist/src/projection/retained-run.js +50 -0
- package/dist/src/run.d.ts +43 -41
- package/dist/src/run.js +34 -412
- package/dist/src/util/canonical.d.ts +1 -5
- package/dist/src/util/canonical.js +1 -53
- package/dist/src/vela/cli.d.ts +7 -51
- package/dist/src/vela/cli.js +102 -523
- package/dist/src/vela/types.d.ts +3 -19
- package/dist/src/verifier/run.js +1 -1
- package/dist/src/workspace/prepare.d.ts +1 -1
- package/dist/src/workspace/prepare.js +15 -15
- package/docs/EVALUATION.md +142 -0
- package/docs/MISSIONS.md +42 -80
- package/docs/RUN_RECORD.md +77 -99
- package/docs/adr/0010-nonmutating-runs-and-explicit-submission.md +191 -0
- package/missions/erdos1056-k15-next/mission.draft.json +10 -8
- package/package.json +18 -22
- package/profiles/{erdos1056-k15-10428801-10429000.json → erdos1056-k15-10429201-10429400.json} +10 -10
- package/schemas/failure.v1.json +17 -0
- package/schemas/mission.v0.json +3 -4
- package/schemas/mission.v1.json +7 -28
- package/schemas/{run.v1.json → run.v2.json} +58 -116
- package/schemas/submission-bundle.v1.json +63 -0
- package/toolchain.lock.json +31 -0
- package/BUILD_WEEK.md +0 -198
- package/advisories/erdos1056-claim-fidelity/output.schema.json +0 -90
- package/advisories/erdos1056-claim-fidelity/registration.json +0 -42
- package/advisories/erdos1056-claim-fidelity/results/assessment.json +0 -1
- package/advisories/erdos1056-claim-fidelity/results/verification.json +0 -1
- package/capsules/formal-erdos-505-test-dim-one/verifier +0 -105
- package/capsules/quantum-10-1-4/verifier.py +0 -152
- package/capsules/sidon-a24/bin/linux-arm64/verifier +0 -0
- package/capsules/sidon-a24/bin/linux-x86_64/verifier +0 -0
- package/dist/src/capability/withdrawal.d.ts +0 -47
- package/dist/src/capability/withdrawal.js +0 -487
- package/dist/src/engines/codex-exec.d.ts +0 -17
- package/dist/src/engines/codex-exec.js +0 -136
- package/dist/src/engines/codex-tool-free.d.ts +0 -26
- package/dist/src/engines/codex-tool-free.js +0 -213
- package/dist/src/product/withdraw.d.ts +0 -8
- package/dist/src/product/withdraw.js +0 -255
- package/dist/src/projection/diagnostic.d.ts +0 -12
- package/dist/src/projection/diagnostic.js +0 -61
- package/dist/src/projection/public-run.d.ts +0 -59
- package/dist/src/projection/public-run.js +0 -106
- package/dist/src/projection/publication.d.ts +0 -36
- package/dist/src/projection/publication.js +0 -47
- package/dist/src/projection/run.d.ts +0 -95
- package/dist/src/projection/run.js +0 -173
- package/dist/src/receipt/map.js +0 -168
- package/dist/src/repair/plan.d.ts +0 -2
- package/dist/src/repair/plan.js +0 -22
- package/dist/src/roles.d.ts +0 -2
- package/dist/src/roles.js +0 -9
- package/docs/RELEASES.md +0 -1389
- package/evidence/build-week/run_eb6bcd46-cffd-4ae8-b630-2681bd84da71.public.json +0 -1
- package/evidence/build-week/run_f68e4cfc-e5c7-4c73-86cb-d79807c47ec4.public.json +0 -1
- package/evidence/erdos/run_192b3bef-9d6e-49e5-b72d-7ae903b29d5e/pending-commands.json +0 -1
- package/evidence/erdos/run_192b3bef-9d6e-49e5-b72d-7ae903b29d5e/public-run.json +0 -1
- package/evidence/erdos/run_192b3bef-9d6e-49e5-b72d-7ae903b29d5e/root-manifest.json +0 -1
- package/evidence/erdos/run_192b3bef-9d6e-49e5-b72d-7ae903b29d5e/web-import.json +0 -1
- package/evidence/erdos/run_b3b0cf07-b149-4d53-8258-76ba0e1fc0a5/pending-commands.json +0 -1
- package/evidence/erdos/run_b3b0cf07-b149-4d53-8258-76ba0e1fc0a5/public-run.json +0 -1
- package/evidence/erdos/run_b3b0cf07-b149-4d53-8258-76ba0e1fc0a5/root-manifest.json +0 -1
- package/evidence/erdos/run_b3b0cf07-b149-4d53-8258-76ba0e1fc0a5/web-import.json +0 -1
- package/missions/formal-erdos-505-test-dim-one-gpt56/mission.draft.json +0 -40
- package/missions/quantum-10-1-4-retry/mission.draft.json +0 -40
- package/missions/sidon-a24-at-least-7194-gpt56/mission.draft.json +0 -42
- package/missions/sidon-a24-at-least-7194-gpt56-v2/mission.draft.json +0 -42
- package/missions/sidon-a24-at-least-7194-gpt56-v3/mission.draft.json +0 -42
- package/profiles/formal-erdos-505-test-dim-one-gpt56.json +0 -35
- package/profiles/quantum-10-1-4-stabilizer-retry.json +0 -35
- package/profiles/sidon-a24-at-least-7194-gpt56-v2.json +0 -35
- package/profiles/sidon-a24-at-least-7194-gpt56-v3.json +0 -35
- package/profiles/sidon-a24-at-least-7194-gpt56.json +0 -35
- package/schemas/canopus.public-run.v1.json +0 -116
- package/scripts/run-claim-fidelity-advisory.mjs +0 -235
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { lstat, mkdir, mkdtemp, readFile, realpath, rm, writeFile } from "node:fs/promises";
|
|
4
|
-
import os from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
|
|
7
|
-
import { parseCodexEvents, summarizeCodexFailure } from "../dist/src/engines/codex-events.js";
|
|
8
|
-
import { prepareIsolatedCodexHome, removeIsolatedCodexHome } from "../dist/src/engines/codex-home.js";
|
|
9
|
-
import { sandboxedToolFreeCodexExecArgv } from "../dist/src/engines/codex-tool-free.js";
|
|
10
|
-
import { canonicalJson, contentDigest, sha256Bytes } from "../dist/src/util/canonical.js";
|
|
11
|
-
import { isolatedEnvironment, runCommand } from "../dist/src/util/command.js";
|
|
12
|
-
import { readBoundedRegularFile } from "../dist/src/util/files.js";
|
|
13
|
-
|
|
14
|
-
const ROOT_KEYS = ["actor_registry", "artifacts", "event_log", "proposals", "snapshot"];
|
|
15
|
-
const METRIC_KEYS = ["range_start", "range_end", "primes_tested", "max_multiplicity", "best_p", "best_residue"];
|
|
16
|
-
|
|
17
|
-
function parseArgs(argv) {
|
|
18
|
-
const values = new Map();
|
|
19
|
-
for (let index = 0; index < argv.length; index += 2) {
|
|
20
|
-
const key = argv[index];
|
|
21
|
-
const value = argv[index + 1];
|
|
22
|
-
if (!["--source", "--output", "--codex", "--codex-home"].includes(key) || value === undefined || values.has(key)) {
|
|
23
|
-
throw new Error(`invalid or duplicate option near ${key ?? "end"}`);
|
|
24
|
-
}
|
|
25
|
-
values.set(key, value);
|
|
26
|
-
}
|
|
27
|
-
for (const key of ["--source", "--output", "--codex"]) {
|
|
28
|
-
if (!values.has(key)) throw new Error(`${key} is required`);
|
|
29
|
-
}
|
|
30
|
-
return values;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function object(value, label) {
|
|
34
|
-
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
35
|
-
throw new Error(`${label} must be an object`);
|
|
36
|
-
}
|
|
37
|
-
return value;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function exactKeys(value, expected, label) {
|
|
41
|
-
const observed = Object.keys(value).sort();
|
|
42
|
-
const wanted = [...expected].sort();
|
|
43
|
-
if (JSON.stringify(observed) !== JSON.stringify(wanted)) {
|
|
44
|
-
throw new Error(`${label} fields are not exact`);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async function command(argv, cwd, home, timeoutMs = 30000, allowStderr = false) {
|
|
49
|
-
const result = await runCommand({
|
|
50
|
-
argv,
|
|
51
|
-
cwd,
|
|
52
|
-
env: isolatedEnvironment(home),
|
|
53
|
-
timeoutMs,
|
|
54
|
-
maxOutputBytes: 8 * 1024 * 1024,
|
|
55
|
-
});
|
|
56
|
-
if (result.exitCode !== 0 || (!allowStderr && result.stderr.length !== 0)) {
|
|
57
|
-
throw new Error(`${path.basename(argv[0])} failed with exit ${result.exitCode}`);
|
|
58
|
-
}
|
|
59
|
-
return result.stdout.toString("utf8").trim();
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function parseArtifact(text) {
|
|
63
|
-
const result = {};
|
|
64
|
-
for (const line of text.trim().split("\n")) {
|
|
65
|
-
const index = line.indexOf("=");
|
|
66
|
-
if (index < 1) throw new Error("source artifact is not the registered key-value format");
|
|
67
|
-
result[line.slice(0, index)] = line.slice(index + 1);
|
|
68
|
-
}
|
|
69
|
-
if (result.schema !== "canopus.erdos1056-k15-search.v1" || result.status !== "negative") {
|
|
70
|
-
throw new Error("source artifact schema or status drifted");
|
|
71
|
-
}
|
|
72
|
-
return Object.fromEntries(METRIC_KEYS.map((key) => {
|
|
73
|
-
const parsed = Number(result[key]);
|
|
74
|
-
if (!Number.isSafeInteger(parsed) || parsed < 0) throw new Error(`artifact ${key} is invalid`);
|
|
75
|
-
return [key, parsed];
|
|
76
|
-
}));
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function verifyAssessment(registration, artifactMetrics, assessment) {
|
|
80
|
-
const value = object(assessment, "assessment");
|
|
81
|
-
exactKeys(value, ["schema", "source", "numeric_correspondence", "language", "standing", "recommendation"], "assessment");
|
|
82
|
-
if (value.schema !== "canopus.claim-fidelity-assessment.v1") throw new Error("assessment schema drifted");
|
|
83
|
-
const source = object(value.source, "assessment.source");
|
|
84
|
-
exactKeys(source, ["run_id", "roots", "artifact_root", "reported_claim"], "assessment.source");
|
|
85
|
-
if (source.run_id !== registration.source.run_id || source.artifact_root !== registration.source.artifact_root || source.reported_claim !== registration.source.reported_claim) {
|
|
86
|
-
throw new Error("assessment source binding drifted");
|
|
87
|
-
}
|
|
88
|
-
const roots = object(source.roots, "assessment.source.roots");
|
|
89
|
-
exactKeys(roots, ROOT_KEYS, "assessment.source.roots");
|
|
90
|
-
for (const key of ROOT_KEYS) {
|
|
91
|
-
if (roots[key] !== registration.source.roots[key]) throw new Error(`assessment root ${key} drifted`);
|
|
92
|
-
}
|
|
93
|
-
const comparisons = object(value.numeric_correspondence, "assessment.numeric_correspondence");
|
|
94
|
-
exactKeys(comparisons, METRIC_KEYS, "assessment.numeric_correspondence");
|
|
95
|
-
for (const key of METRIC_KEYS) {
|
|
96
|
-
const comparison = object(comparisons[key], `assessment.numeric_correspondence.${key}`);
|
|
97
|
-
exactKeys(comparison, ["reported", "artifact", "matches"], `assessment.numeric_correspondence.${key}`);
|
|
98
|
-
if (comparison.reported !== registration.source.reported_metrics[key] || comparison.artifact !== artifactMetrics[key] || comparison.matches !== true || comparison.reported !== comparison.artifact) {
|
|
99
|
-
throw new Error(`assessment numeric comparison ${key} drifted`);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
const language = object(value.language, "assessment.language");
|
|
103
|
-
exactKeys(language, ["classification", "universal_claim_detected", "solved_language_detected", "flagged_phrases", "rationale"], "assessment.language");
|
|
104
|
-
if (language.classification !== "model_assessment" || typeof language.universal_claim_detected !== "boolean" || typeof language.solved_language_detected !== "boolean" || !Array.isArray(language.flagged_phrases) || typeof language.rationale !== "string") {
|
|
105
|
-
throw new Error("assessment semantic language fields are invalid");
|
|
106
|
-
}
|
|
107
|
-
const standing = object(value.standing, "assessment.standing");
|
|
108
|
-
exactKeys(standing, ["verifier_success_reported", "policy_route", "accepted_state_delta", "scientific_acceptance_reported", "distinction"], "assessment.standing");
|
|
109
|
-
if (standing.verifier_success_reported !== true || standing.policy_route !== "defer" || standing.accepted_state_delta !== 0 || standing.scientific_acceptance_reported !== false || typeof standing.distinction !== "string") {
|
|
110
|
-
throw new Error("assessment standing confused verification with acceptance");
|
|
111
|
-
}
|
|
112
|
-
const recommendation = object(value.recommendation, "assessment.recommendation");
|
|
113
|
-
exactKeys(recommendation, ["classification", "publishable_with_caveats", "revised_claim"], "assessment.recommendation");
|
|
114
|
-
if (recommendation.classification !== "model_assessment" || typeof recommendation.publishable_with_caveats !== "boolean" || typeof recommendation.revised_claim !== "string") {
|
|
115
|
-
throw new Error("assessment recommendation fields are invalid");
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
function prompt(registration, artifactText) {
|
|
120
|
-
return [
|
|
121
|
-
"Perform one bounded claim-fidelity audit. You have no tools and must use only the immutable evidence below.",
|
|
122
|
-
"Copy the source run, all five roots, artifact root, and reported claim exactly into the required schema.",
|
|
123
|
-
"For every numeric field, copy the registered reported value and the frozen artifact value and set matches true only when they are equal.",
|
|
124
|
-
"Assess whether the reported claim uses universal language beyond the bounded range or says the Erdős problem is solved. These are semantic judgments: keep classification exactly model_assessment.",
|
|
125
|
-
"Distinguish the recorded verifier pass from scientific acceptance: route is Defer and accepted-state delta is zero.",
|
|
126
|
-
"Do not claim that the advisory itself is scientific state. Return only the supplied JSON schema.",
|
|
127
|
-
"Registration:",
|
|
128
|
-
canonicalJson(registration),
|
|
129
|
-
"Frozen artifact:",
|
|
130
|
-
artifactText,
|
|
131
|
-
].join("\n");
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
const values = parseArgs(process.argv.slice(2));
|
|
135
|
-
const repoRoot = await realpath(new URL("../", import.meta.url).pathname);
|
|
136
|
-
const registrationPath = path.join(repoRoot, "advisories/erdos1056-claim-fidelity/registration.json");
|
|
137
|
-
const registrationBytes = await readBoundedRegularFile(registrationPath, 1024 * 1024);
|
|
138
|
-
const registration = JSON.parse(registrationBytes.toString("utf8"));
|
|
139
|
-
const source = await realpath(path.resolve(values.get("--source")));
|
|
140
|
-
const output = path.resolve(values.get("--output"));
|
|
141
|
-
const codex = await realpath(path.resolve(values.get("--codex")));
|
|
142
|
-
const codexHome = path.resolve(values.get("--codex-home") ?? process.env.CODEX_HOME ?? path.join(os.homedir(), ".codex"));
|
|
143
|
-
const schemaPath = path.join(repoRoot, registration.output_schema);
|
|
144
|
-
const schemaBytes = await readBoundedRegularFile(schemaPath, 1024 * 1024);
|
|
145
|
-
if (sha256Bytes(schemaBytes) !== registration.output_schema_sha256) throw new Error("registered output schema drifted");
|
|
146
|
-
try {
|
|
147
|
-
await lstat(output);
|
|
148
|
-
throw new Error("advisory output directory already exists");
|
|
149
|
-
} catch (error) {
|
|
150
|
-
if (error.code !== "ENOENT") throw error;
|
|
151
|
-
}
|
|
152
|
-
await mkdir(output, { recursive: true, mode: 0o700 });
|
|
153
|
-
const runtime = await mkdtemp(path.join(os.tmpdir(), "canopus-claim-fidelity-"));
|
|
154
|
-
try {
|
|
155
|
-
const head = await command(["git", "rev-parse", "HEAD"], source, runtime);
|
|
156
|
-
const clean = await command(["git", "status", "--porcelain=v1", "--untracked-files=all"], source, runtime);
|
|
157
|
-
if (head !== registration.source.commit || clean !== "") throw new Error("source frontier is not the exact clean registered commit");
|
|
158
|
-
const status = JSON.parse(await command(["vela", "status", ".", "--json"], source, runtime));
|
|
159
|
-
for (const key of ROOT_KEYS) {
|
|
160
|
-
if (status.roots?.[key] !== registration.source.roots[key]) throw new Error(`source frontier root ${key} drifted`);
|
|
161
|
-
}
|
|
162
|
-
const artifactBytes = await readBoundedRegularFile(path.join(source, registration.source.artifact_path), 1024 * 1024);
|
|
163
|
-
if (sha256Bytes(artifactBytes) !== registration.source.artifact_root) throw new Error("source artifact root drifted");
|
|
164
|
-
const artifactText = artifactBytes.toString("utf8");
|
|
165
|
-
const artifactMetrics = parseArtifact(artifactText);
|
|
166
|
-
for (const key of METRIC_KEYS) {
|
|
167
|
-
if (artifactMetrics[key] !== registration.source.reported_metrics[key]) throw new Error(`registered reported metric ${key} disagrees with the artifact`);
|
|
168
|
-
}
|
|
169
|
-
const version = await command([codex, "--version"], output, runtime, 30000, true);
|
|
170
|
-
if (version !== registration.runner.codex_version) throw new Error("Codex version drifted");
|
|
171
|
-
const work = path.join(runtime, "work");
|
|
172
|
-
const home = path.join(runtime, "home");
|
|
173
|
-
await mkdir(work, { mode: 0o700 });
|
|
174
|
-
await mkdir(home, { mode: 0o700 });
|
|
175
|
-
const finalPath = path.join(work, "assessment.json");
|
|
176
|
-
const isolatedCodexHome = await prepareIsolatedCodexHome(codexHome, home);
|
|
177
|
-
let result;
|
|
178
|
-
try {
|
|
179
|
-
const argv = await sandboxedToolFreeCodexExecArgv({
|
|
180
|
-
binary: codex,
|
|
181
|
-
model: registration.model,
|
|
182
|
-
reasoningEffort: registration.reasoning_effort,
|
|
183
|
-
outputSchema: schemaPath,
|
|
184
|
-
finalPath,
|
|
185
|
-
cwd: work,
|
|
186
|
-
authHome: isolatedCodexHome,
|
|
187
|
-
});
|
|
188
|
-
result = await runCommand({
|
|
189
|
-
argv,
|
|
190
|
-
cwd: work,
|
|
191
|
-
env: { ...isolatedEnvironment(home), CODEX_HOME: isolatedCodexHome, NO_COLOR: "1" },
|
|
192
|
-
timeoutMs: registration.runner.timeout_ms,
|
|
193
|
-
maxOutputBytes: registration.runner.max_output_bytes,
|
|
194
|
-
stdin: prompt(registration, artifactText),
|
|
195
|
-
});
|
|
196
|
-
} finally {
|
|
197
|
-
await removeIsolatedCodexHome(isolatedCodexHome);
|
|
198
|
-
}
|
|
199
|
-
if (result.exitCode !== 0) {
|
|
200
|
-
throw new Error(`Codex advisory failed: ${summarizeCodexFailure(result.stdout.toString("utf8"))}`);
|
|
201
|
-
}
|
|
202
|
-
const events = parseCodexEvents(result.stdout.toString("utf8"));
|
|
203
|
-
if (events.actionTypes.length !== 0) throw new Error("claim-fidelity advisory used tools");
|
|
204
|
-
const assessment = JSON.parse((await readBoundedRegularFile(finalPath, 1024 * 1024)).toString("utf8"));
|
|
205
|
-
verifyAssessment(registration, artifactMetrics, assessment);
|
|
206
|
-
const verification = {
|
|
207
|
-
schema: "canopus.claim-fidelity-verification.v1",
|
|
208
|
-
status: "pass",
|
|
209
|
-
authority: "non_authoritative_advisory",
|
|
210
|
-
scientific_state_landed: false,
|
|
211
|
-
model: registration.model,
|
|
212
|
-
registration_root: sha256Bytes(registrationBytes),
|
|
213
|
-
output_schema_root: sha256Bytes(schemaBytes),
|
|
214
|
-
assessment_root: contentDigest(assessment),
|
|
215
|
-
checks: {
|
|
216
|
-
source_run_bound: true,
|
|
217
|
-
all_five_roots_bound: true,
|
|
218
|
-
artifact_root_matched: true,
|
|
219
|
-
numeric_correspondence_matched: true,
|
|
220
|
-
verifier_acceptance_distinction_preserved: true,
|
|
221
|
-
},
|
|
222
|
-
semantic_fields: [
|
|
223
|
-
{ path: "language", classification: "model_assessment" },
|
|
224
|
-
{ path: "recommendation", classification: "model_assessment" },
|
|
225
|
-
],
|
|
226
|
-
usage: events.usage,
|
|
227
|
-
events_root: sha256Bytes(result.stdout),
|
|
228
|
-
stderr_root: sha256Bytes(result.stderr),
|
|
229
|
-
};
|
|
230
|
-
await writeFile(path.join(output, "assessment.json"), canonicalJson(assessment), { flag: "wx", mode: 0o644 });
|
|
231
|
-
await writeFile(path.join(output, "verification.json"), canonicalJson(verification), { flag: "wx", mode: 0o644 });
|
|
232
|
-
process.stdout.write(`${JSON.stringify({ ok: true, output, assessment_root: verification.assessment_root, model: registration.model, scientific_state_landed: false })}\n`);
|
|
233
|
-
} finally {
|
|
234
|
-
await rm(runtime, { recursive: true, force: true });
|
|
235
|
-
}
|