@vela-science/canopus 0.6.5 → 0.7.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 +17 -0
- package/README.md +21 -15
- package/SECURITY.md +3 -2
- 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/cli.js +2 -37
- package/dist/src/product/run.js +0 -7
- package/dist/src/run.d.ts +0 -7
- package/dist/src/run.js +0 -15
- package/dist/src/vela/cli.d.ts +0 -9
- package/dist/src/vela/cli.js +0 -48
- package/package.json +1 -8
- 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/dist/src/capability/withdrawal.d.ts +0 -47
- package/dist/src/capability/withdrawal.js +0 -487
- package/dist/src/product/withdraw.d.ts +0 -8
- package/dist/src/product/withdraw.js +0 -255
- 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/scripts/run-claim-fidelity-advisory.mjs +0 -235
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
## 0.7.0 - 2026-07-25
|
|
6
|
+
|
|
7
|
+
- Retire long-lived proposal-withdrawal capabilities. Successful runs now
|
|
8
|
+
destroy the isolated producer key with the rest of the Vela home; `inspect`
|
|
9
|
+
reports only rooted run state, and the `withdraw` command and capability
|
|
10
|
+
store are removed. Historical activity records and Vela
|
|
11
|
+
`proposal.withdrawn` events remain readable, while pending proposals remain
|
|
12
|
+
canonical review records rather than reasons to retain a private key.
|
|
13
|
+
- Narrow the npm package to the active Canopus product boundary. Historical
|
|
14
|
+
Build Week records, release ledgers, advisories, and retained Erdős evidence
|
|
15
|
+
remain immutable in Git and tagged source archives but no longer inflate the
|
|
16
|
+
installed runtime. Stable README links point to the exact `v0.6.5` archive,
|
|
17
|
+
while missions, profiles, verifier capsules, schemas, runtime custody
|
|
18
|
+
fixtures, and current product guidance continue to ship.
|
|
19
|
+
|
|
3
20
|
## 0.6.5 - 2026-07-25
|
|
4
21
|
|
|
5
22
|
- Advance the sole runnable Erdős 1056 profile to the adjacent,
|
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
<p align="center">
|
|
18
18
|
<a href="https://app.vela.space/frontiers/sidon-sets/runs/run_f68e4cfc-e5c7-4c73-86cb-d79807c47ec4">Retained Sidon run</a> ·
|
|
19
|
-
<a href="BUILD_WEEK.md">Build Week
|
|
19
|
+
<a href="https://github.com/vela-science/vela-research-harness/blob/v0.6.5/BUILD_WEEK.md">Build Week archive</a> ·
|
|
20
20
|
<a href="docs/MISSIONS.md">Missions</a> ·
|
|
21
21
|
<a href="docs/RUN_RECORD.md">Run records</a> ·
|
|
22
22
|
<a href="https://github.com/vela-science/vela">Vela</a>
|
|
@@ -57,8 +57,8 @@ Mission → GPT-5.6 → artifact → verifier → Receipt → Defer.
|
|
|
57
57
|
**90 seconds — inspect the shipped product:**
|
|
58
58
|
|
|
59
59
|
```sh
|
|
60
|
-
bunx @vela-science/canopus@0.
|
|
61
|
-
bunx @vela-science/canopus@0.
|
|
60
|
+
bunx @vela-science/canopus@0.7.0 --version
|
|
61
|
+
bunx @vela-science/canopus@0.7.0 profile validate sidon-a24-at-least-7194-gpt56-v3
|
|
62
62
|
```
|
|
63
63
|
|
|
64
64
|
**Retained historical result — reproduce without rebuilding Canopus:**
|
|
@@ -82,23 +82,23 @@ frozen Sidon verifier. The second is an independent base-3 implementation that
|
|
|
82
82
|
also rejects a bound collision injection. Neither command accepts the proposal.
|
|
83
83
|
|
|
84
84
|
For new missions, use Vela `0.915.1`, the version composed with Canopus
|
|
85
|
-
`0.
|
|
85
|
+
`0.7.0` and enforced by `canopus doctor`.
|
|
86
86
|
|
|
87
87
|
## Quickstart
|
|
88
88
|
|
|
89
89
|
Run the provenance-backed public package with Bun:
|
|
90
90
|
|
|
91
91
|
```sh
|
|
92
|
-
bunx @vela-science/canopus@0.
|
|
92
|
+
bunx @vela-science/canopus@0.7.0 --version
|
|
93
93
|
```
|
|
94
94
|
|
|
95
95
|
Inspect a clean frontier, then run its first ranked producer offer:
|
|
96
96
|
|
|
97
97
|
```sh
|
|
98
|
-
bunx @vela-science/canopus@0.
|
|
99
|
-
bunx @vela-science/canopus@0.
|
|
100
|
-
bunx @vela-science/canopus@0.
|
|
101
|
-
bunx @vela-science/canopus@0.
|
|
98
|
+
bunx @vela-science/canopus@0.7.0 doctor /path/to/frontier
|
|
99
|
+
bunx @vela-science/canopus@0.7.0 run /path/to/frontier --first
|
|
100
|
+
bunx @vela-science/canopus@0.7.0 inspect latest
|
|
101
|
+
bunx @vela-science/canopus@0.7.0 replay /path/to/run.json
|
|
102
102
|
```
|
|
103
103
|
|
|
104
104
|
Export a completed Defer run without publishing or mutating anything:
|
|
@@ -117,7 +117,7 @@ standing after verification; historical run v0 records remain inspectable.
|
|
|
117
117
|
Use `--no-land` for a diagnostic mission that cannot change the source frontier:
|
|
118
118
|
|
|
119
119
|
```sh
|
|
120
|
-
bunx @vela-science/canopus@0.
|
|
120
|
+
bunx @vela-science/canopus@0.7.0 run /path/to/frontier --first --no-land
|
|
121
121
|
```
|
|
122
122
|
|
|
123
123
|
`doctor` binds the exact Vela, Codex, Git, frontier, packet, profile, and verifier
|
|
@@ -130,7 +130,7 @@ unregistered targets. It never silently skips the first ranked offer.
|
|
|
130
130
|
| --- | --- | --- |
|
|
131
131
|
| Codex worker | Use tools inside one bounded workspace | Reach the network, host home, human keys, or verifier |
|
|
132
132
|
| Verifier | Read frozen candidate bytes and declared inputs | Write, use the network, or make an authority decision |
|
|
133
|
-
| Canopus | Preserve evidence, replay, land a Receipt
|
|
133
|
+
| Canopus | Preserve evidence, replay, and land a Receipt | Sign, accept, reject, retain producer keys, or call verifier success acceptance |
|
|
134
134
|
|
|
135
135
|
The worker uses macOS Seatbelt or Codex's Bubblewrap sandbox on Linux and WSL2.
|
|
136
136
|
The verifier runs in a separate pinned container with network and writes denied.
|
|
@@ -144,17 +144,23 @@ canopus inspect [run.json | latest]
|
|
|
144
144
|
canopus replay <run.json>
|
|
145
145
|
```
|
|
146
146
|
|
|
147
|
-
Advanced profile
|
|
148
|
-
|
|
147
|
+
Advanced profile commands are documented in [Missions](docs/MISSIONS.md).
|
|
148
|
+
Installed profiles are closed,
|
|
149
149
|
content-addressed contracts that bind the target, packet, objective, artifact
|
|
150
150
|
types, worker, verifier, replay command, budgets, and landing ceiling.
|
|
151
151
|
|
|
152
|
+
Producer identities are ephemeral. After a successful landing and clean-clone
|
|
153
|
+
reproduction, Canopus destroys the isolated Vela home instead of retaining a
|
|
154
|
+
proposal-scoped private key. A proposal may remain pending until Vela policy or
|
|
155
|
+
a human reviewer decides it; Canopus does not need a second control channel.
|
|
156
|
+
|
|
152
157
|
## Retained Build Week evidence
|
|
153
158
|
|
|
154
159
|
Inspect the retained Mission → worker → artifact → verifier → Receipt → Defer
|
|
155
160
|
chain on the [exact Sidon run](https://app.vela.space/frontiers/sidon-sets/runs/run_f68e4cfc-e5c7-4c73-86cb-d79807c47ec4).
|
|
156
161
|
Exact commits, run roots, audit evidence, and nonclaims live in
|
|
157
|
-
|
|
162
|
+
the retained
|
|
163
|
+
[`v0.6.5` Build Week archive](https://github.com/vela-science/vela-research-harness/blob/v0.6.5/BUILD_WEEK.md).
|
|
158
164
|
|
|
159
165
|
## Development
|
|
160
166
|
|
|
@@ -172,7 +178,7 @@ bun run pack:check
|
|
|
172
178
|
|
|
173
179
|
- [Missions and profiles](docs/MISSIONS.md)
|
|
174
180
|
- [Run records and publication](docs/RUN_RECORD.md)
|
|
175
|
-
- [
|
|
181
|
+
- [Historical release evidence](https://github.com/vela-science/vela-research-harness/blob/v0.7.0/docs/RELEASES.md)
|
|
176
182
|
- [Why the harness stays removable](docs/adr/0001-harness-boundary-and-name.md)
|
|
177
183
|
|
|
178
184
|
## License
|
package/SECURITY.md
CHANGED
|
@@ -5,8 +5,9 @@ Report vulnerabilities privately through GitHub Security Advisories for
|
|
|
5
5
|
|
|
6
6
|
Canopus does not accept human signing keys. Do not place a human Vela key,
|
|
7
7
|
provider credential, or unpublished scientific secret inside a run root.
|
|
8
|
-
Successful runs scrub the isolated agent-key home
|
|
9
|
-
|
|
8
|
+
Successful runs scrub the isolated agent-key home and retain no producer
|
|
9
|
+
private key or withdrawal capability. Operators remain responsible for
|
|
10
|
+
deleting failed diagnostic runs and benchmark output.
|
|
10
11
|
|
|
11
12
|
Agent-authored Git commits and tags must explicitly disable ambient signing
|
|
12
13
|
(`commit.gpgSign=false`, `tag.gpgSign=false`) and verify that the resulting Git
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
export declare const ACTIVITY_SCHEMA: "canopus.activity.v0";
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const WRITABLE_ACTIVITY_TYPES: readonly ["run.started", "workspace.prepared", "roots.verified", "target.offered", "work.skipped", "work.claimed", "engine.started", "engine.completed", "artifact.frozen", "artifacts.published", "verifier.completed", "candidate.finalized", "receipt.mapped", "landing.observed", "landing.bound", "landing.completed", "reproduction.completed", "projection.written", "run.completed", "run.failed"];
|
|
3
|
+
export declare const HISTORICAL_ACTIVITY_TYPES: readonly ["withdrawal_capability.retained"];
|
|
4
|
+
export declare const ACTIVITY_TYPES: readonly ["run.started", "workspace.prepared", "roots.verified", "target.offered", "work.skipped", "work.claimed", "engine.started", "engine.completed", "artifact.frozen", "artifacts.published", "verifier.completed", "candidate.finalized", "receipt.mapped", "landing.observed", "landing.bound", "landing.completed", "reproduction.completed", "projection.written", "run.completed", "run.failed", "withdrawal_capability.retained"];
|
|
3
5
|
export type ActivityType = (typeof ACTIVITY_TYPES)[number];
|
|
6
|
+
export type WritableActivityType = (typeof WRITABLE_ACTIVITY_TYPES)[number];
|
|
4
7
|
export interface ActivityEventBody {
|
|
5
8
|
schema: typeof ACTIVITY_SCHEMA;
|
|
6
9
|
run_id: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const ACTIVITY_SCHEMA = "canopus.activity.v0";
|
|
2
|
-
export const
|
|
2
|
+
export const WRITABLE_ACTIVITY_TYPES = [
|
|
3
3
|
"run.started",
|
|
4
4
|
"workspace.prepared",
|
|
5
5
|
"roots.verified",
|
|
@@ -16,9 +16,15 @@ export const ACTIVITY_TYPES = [
|
|
|
16
16
|
"landing.observed",
|
|
17
17
|
"landing.bound",
|
|
18
18
|
"landing.completed",
|
|
19
|
-
"withdrawal_capability.retained",
|
|
20
19
|
"reproduction.completed",
|
|
21
20
|
"projection.written",
|
|
22
21
|
"run.completed",
|
|
23
22
|
"run.failed",
|
|
24
23
|
];
|
|
24
|
+
export const HISTORICAL_ACTIVITY_TYPES = [
|
|
25
|
+
"withdrawal_capability.retained",
|
|
26
|
+
];
|
|
27
|
+
export const ACTIVITY_TYPES = [
|
|
28
|
+
...WRITABLE_ACTIVITY_TYPES,
|
|
29
|
+
...HISTORICAL_ACTIVITY_TYPES,
|
|
30
|
+
];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ActivityEvent, type
|
|
1
|
+
import { type ActivityEvent, type WritableActivityType } from "./events.js";
|
|
2
2
|
export declare function readActivity(file: string): Promise<ActivityEvent[]>;
|
|
3
3
|
export declare class ActivityStore {
|
|
4
4
|
#private;
|
|
@@ -6,5 +6,5 @@ export declare class ActivityStore {
|
|
|
6
6
|
static open(file: string, runId: string): Promise<ActivityStore>;
|
|
7
7
|
get tip(): string | null;
|
|
8
8
|
get events(): readonly ActivityEvent[];
|
|
9
|
-
append(type:
|
|
9
|
+
append(type: WritableActivityType, payload: Record<string, unknown>): Promise<ActivityEvent>;
|
|
10
10
|
}
|
|
@@ -3,7 +3,7 @@ import { mkdir, open } from "node:fs/promises";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { canonicalJson, contentDigest } from "../util/canonical.js";
|
|
5
5
|
import { readBoundedRegularFile } from "../util/files.js";
|
|
6
|
-
import { ACTIVITY_SCHEMA, ACTIVITY_TYPES, } from "./events.js";
|
|
6
|
+
import { ACTIVITY_SCHEMA, ACTIVITY_TYPES, WRITABLE_ACTIVITY_TYPES, } from "./events.js";
|
|
7
7
|
const MAX_ACTIVITY_BYTES = 64 * 1024 * 1024;
|
|
8
8
|
const MAX_EVENT_BYTES = 1024 * 1024;
|
|
9
9
|
function parseEvent(value, line) {
|
|
@@ -129,8 +129,9 @@ export class ActivityStore {
|
|
|
129
129
|
});
|
|
130
130
|
this.#queue = this.#queue.then(async () => {
|
|
131
131
|
try {
|
|
132
|
-
if (!
|
|
133
|
-
throw new Error(`unknown activity type ${type}`);
|
|
132
|
+
if (!WRITABLE_ACTIVITY_TYPES.includes(type)) {
|
|
133
|
+
throw new Error(`retired or unknown activity type ${type}`);
|
|
134
|
+
}
|
|
134
135
|
const body = {
|
|
135
136
|
schema: ACTIVITY_SCHEMA,
|
|
136
137
|
run_id: this.#runId,
|
package/dist/src/cli.js
CHANGED
|
@@ -16,7 +16,6 @@ import { buildPublicationBundle } from "./projection/publication.js";
|
|
|
16
16
|
import { doctorProduct } from "./product/doctor.js";
|
|
17
17
|
import { replayProduct } from "./product/replay.js";
|
|
18
18
|
import { runProduct } from "./product/run.js";
|
|
19
|
-
import { withdrawProduct } from "./product/withdraw.js";
|
|
20
19
|
import { CANOPUS_VERSION } from "./product/version.js";
|
|
21
20
|
import { listProductProfiles, packProductProfile, validateProductProfile, } from "./product/profile-bundle.js";
|
|
22
21
|
import { loadProductProfile } from "./product/profile.js";
|
|
@@ -24,7 +23,6 @@ import { runCanopus } from "./run.js";
|
|
|
24
23
|
import { readBoundedRegularFile } from "./util/files.js";
|
|
25
24
|
import { canonicalJson, contentDigest } from "./util/canonical.js";
|
|
26
25
|
import { VelaClient } from "./vela/cli.js";
|
|
27
|
-
import { withdrawalCapabilityStatus } from "./capability/withdrawal.js";
|
|
28
26
|
function usage() {
|
|
29
27
|
return `Canopus — bounded Vela research harness
|
|
30
28
|
|
|
@@ -39,7 +37,6 @@ Primary workflow:
|
|
|
39
37
|
canopus publish-run <run.json> --mission <mission.json> \
|
|
40
38
|
--repository <public-url> --output <new-directory>
|
|
41
39
|
canopus replay <run.json>
|
|
42
|
-
canopus withdraw [frontier] [--run <run.json|latest>] --reason <text>
|
|
43
40
|
|
|
44
41
|
Mission v1 prepare/validate remains available under advanced help.
|
|
45
42
|
|
|
@@ -116,14 +113,6 @@ Creates a sanitized public projection, root manifest, proposal-scoped pending
|
|
|
116
113
|
commands, and a read-only Vela Observatory import descriptor. It never lands,
|
|
117
114
|
signs, accepts, pushes, or deploys.`;
|
|
118
115
|
}
|
|
119
|
-
function withdrawUsage() {
|
|
120
|
-
return `Usage:
|
|
121
|
-
canopus withdraw [frontier] [--run <run.json|latest>] --reason <text>
|
|
122
|
-
|
|
123
|
-
Uses only the retained proposal-scoped producer capability. The operation runs
|
|
124
|
-
in a disposable exact-head clone, verifies strict and clean-clone replay, then
|
|
125
|
-
fast-forwards the clean source. It never mounts a worker or human key.`;
|
|
126
|
-
}
|
|
127
116
|
function isHelp(value) {
|
|
128
117
|
return value === "--help" || value === "-h" || value === "help";
|
|
129
118
|
}
|
|
@@ -445,10 +434,7 @@ async function inspectCommand(value, rest) {
|
|
|
445
434
|
: schema === "canopus.failure.v0"
|
|
446
435
|
? projectFailure(parseFailureRecord(raw))
|
|
447
436
|
: projectRun(parseRunRecord(raw));
|
|
448
|
-
|
|
449
|
-
? await withdrawalCapabilityStatus(projection.proposal_id)
|
|
450
|
-
: { state: "not_applicable", available: false };
|
|
451
|
-
process.stdout.write(`${JSON.stringify({ ok: true, command: "inspect", run_file: file, projection, withdrawal })}\n`);
|
|
437
|
+
process.stdout.write(`${JSON.stringify({ ok: true, command: "inspect", run_file: file, projection })}\n`);
|
|
452
438
|
}
|
|
453
439
|
async function replayCommand(file, rest) {
|
|
454
440
|
if (file === undefined || rest.length !== 0)
|
|
@@ -514,22 +500,6 @@ async function publishRunCommand(file, rest) {
|
|
|
514
500
|
authority_effect: "none",
|
|
515
501
|
})}\n`);
|
|
516
502
|
}
|
|
517
|
-
async function withdrawCommand(args) {
|
|
518
|
-
const parsed = productOptions(args, ["--run", "--reason"], []);
|
|
519
|
-
if (parsed.positional.length > 1)
|
|
520
|
-
throw new Error("withdraw accepts at most one frontier");
|
|
521
|
-
const reason = parsed.values.get("--reason");
|
|
522
|
-
if (reason === undefined || reason.trim().length === 0)
|
|
523
|
-
throw new Error("withdraw requires --reason");
|
|
524
|
-
const runValue = parsed.values.get("--run") ?? "latest";
|
|
525
|
-
const runFile = runValue === "latest" ? await latestRunFile() : path.resolve(runValue);
|
|
526
|
-
const result = await withdrawProduct({
|
|
527
|
-
frontier: path.resolve(parsed.positional[0] ?? "."),
|
|
528
|
-
runFile,
|
|
529
|
-
reason,
|
|
530
|
-
});
|
|
531
|
-
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
532
|
-
}
|
|
533
503
|
async function main(argv) {
|
|
534
504
|
const [command, file, ...rest] = argv;
|
|
535
505
|
if (command === undefined || isHelp(command)) {
|
|
@@ -557,8 +527,7 @@ async function main(argv) {
|
|
|
557
527
|
: command === "replay" ? replayUsage()
|
|
558
528
|
: command === "public-run" ? publicRunUsage()
|
|
559
529
|
: command === "publish-run" ? publishRunUsage()
|
|
560
|
-
:
|
|
561
|
-
: usage()}\n`);
|
|
530
|
+
: usage()}\n`);
|
|
562
531
|
return;
|
|
563
532
|
}
|
|
564
533
|
if (command === "doctor") {
|
|
@@ -577,10 +546,6 @@ async function main(argv) {
|
|
|
577
546
|
await publishRunCommand(file, rest);
|
|
578
547
|
return;
|
|
579
548
|
}
|
|
580
|
-
if (command === "withdraw") {
|
|
581
|
-
await withdrawCommand(argv.slice(1));
|
|
582
|
-
return;
|
|
583
|
-
}
|
|
584
549
|
if (command === "validate") {
|
|
585
550
|
if (file === undefined)
|
|
586
551
|
throw new Error("validate requires a mission file");
|
package/dist/src/product/run.js
CHANGED
|
@@ -11,7 +11,6 @@ import { readBoundedRegularFile } from "../util/files.js";
|
|
|
11
11
|
import { VelaClient } from "../vela/cli.js";
|
|
12
12
|
import { doctorProduct } from "./doctor.js";
|
|
13
13
|
import { loadProfileDraft, loadProfileResultContract, packagedWorkerProfile, stageProfileCapsule, } from "./profile.js";
|
|
14
|
-
import { retainWithdrawalCapability } from "../capability/withdrawal.js";
|
|
15
14
|
function packageFile(relative) {
|
|
16
15
|
return fileURLToPath(new URL(`../../../${relative}`, import.meta.url));
|
|
17
16
|
}
|
|
@@ -220,12 +219,6 @@ export async function runProduct(options) {
|
|
|
220
219
|
bundleRoot,
|
|
221
220
|
dockerBinary: dockerRuntime.binary,
|
|
222
221
|
verifierRunner: runner,
|
|
223
|
-
retainWithdrawalCapability: async (context) => {
|
|
224
|
-
await retainWithdrawalCapability({
|
|
225
|
-
...context,
|
|
226
|
-
velaBinary: diagnosis.public.runtimes.vela.binary,
|
|
227
|
-
});
|
|
228
|
-
},
|
|
229
222
|
};
|
|
230
223
|
const run = options.noLand === true
|
|
231
224
|
? await runCanopus({ ...commonRun, noLand: true })
|
package/dist/src/run.d.ts
CHANGED
|
@@ -25,13 +25,6 @@ export interface CanopusRunOptions {
|
|
|
25
25
|
bundleRoot?: string;
|
|
26
26
|
dockerBinary?: string;
|
|
27
27
|
verifierRunner?: CommandRunner;
|
|
28
|
-
retainWithdrawalCapability?: (context: {
|
|
29
|
-
velaHome: string;
|
|
30
|
-
landingRepo: string;
|
|
31
|
-
mission: Mission;
|
|
32
|
-
landing: LandResult;
|
|
33
|
-
finalRoots: MissionRoots;
|
|
34
|
-
}) => Promise<void>;
|
|
35
28
|
noLand?: false;
|
|
36
29
|
}
|
|
37
30
|
export interface CanopusNoLandOptions extends Omit<CanopusRunOptions, "noLand"> {
|
package/dist/src/run.js
CHANGED
|
@@ -542,20 +542,6 @@ export async function runCanopus(options) {
|
|
|
542
542
|
roots: reproductionInspection.roots,
|
|
543
543
|
verifier_status: reproductionVerifier.status,
|
|
544
544
|
});
|
|
545
|
-
if (options.retainWithdrawalCapability !== undefined) {
|
|
546
|
-
phase = "withdrawal_capability";
|
|
547
|
-
await options.retainWithdrawalCapability({
|
|
548
|
-
velaHome: paths.velaHome,
|
|
549
|
-
landingRepo: paths.landing,
|
|
550
|
-
mission: options.mission,
|
|
551
|
-
landing,
|
|
552
|
-
finalRoots: final.roots,
|
|
553
|
-
});
|
|
554
|
-
await activity.append("withdrawal_capability.retained", {
|
|
555
|
-
proposal_id: landing.proposalId,
|
|
556
|
-
authority: "producer_withdrawal_only",
|
|
557
|
-
});
|
|
558
|
-
}
|
|
559
545
|
await rm(paths.velaHome, { recursive: true, force: true });
|
|
560
546
|
const record = {
|
|
561
547
|
schema: RUN_RECORD_SCHEMA,
|
|
@@ -630,7 +616,6 @@ export async function runCanopus(options) {
|
|
|
630
616
|
if (phase.startsWith("landing_") ||
|
|
631
617
|
phase === "receipt_binding" ||
|
|
632
618
|
phase === "clean_clone_reproduction" ||
|
|
633
|
-
phase === "withdrawal_capability" ||
|
|
634
619
|
phase === "record_finalization") {
|
|
635
620
|
let observedRoots = null;
|
|
636
621
|
let inspectionError = null;
|
package/dist/src/vela/cli.d.ts
CHANGED
|
@@ -44,14 +44,6 @@ export interface VelaLandCommandObservation {
|
|
|
44
44
|
stdout_digest: string;
|
|
45
45
|
stderr_digest: string;
|
|
46
46
|
}
|
|
47
|
-
export interface VelaWithdrawalResult {
|
|
48
|
-
proposal_id: string;
|
|
49
|
-
withdrawal_event_id: string;
|
|
50
|
-
withdrawn_at: string;
|
|
51
|
-
state_root_before: string;
|
|
52
|
-
state_root_after: string;
|
|
53
|
-
publication_commit: string;
|
|
54
|
-
}
|
|
55
47
|
export declare function strictBaselineFromCheck(check: Record<string, unknown>): StrictBaseline;
|
|
56
48
|
export declare function validateLandResult(mission: Mission, raw: Record<string, unknown>): LandResult;
|
|
57
49
|
export declare class VelaClient {
|
|
@@ -64,7 +56,6 @@ export declare class VelaClient {
|
|
|
64
56
|
next(mission: Mission, repoRoot: string): Promise<VelaCommandResponse>;
|
|
65
57
|
offer(repoRoot: string, frontier: string, roots: MissionRoots, strictBaseline?: StrictBaseline, limit?: number): Promise<VelaCommandResponse>;
|
|
66
58
|
work(mission: Mission, repoRoot: string, target: string, expected: MissionRoots): Promise<VelaCommandResponse>;
|
|
67
|
-
withdraw(repoRoot: string, frontier: string, proposalId: string, actor: string, reason: string): Promise<VelaWithdrawalResult>;
|
|
68
59
|
landAuthoredCommand(mission: Mission, repoRoot: string, input: AuthoredReceiptInput, _expected: MissionRoots): Promise<VelaLandCommandObservation>;
|
|
69
60
|
parseLandCommand(observation: VelaLandCommandObservation): Record<string, unknown>;
|
|
70
61
|
validateLandResult(mission: Mission, raw: Record<string, unknown>): LandResult;
|
package/dist/src/vela/cli.js
CHANGED
|
@@ -509,54 +509,6 @@ export class VelaClient {
|
|
|
509
509
|
}
|
|
510
510
|
return { ok: true, value };
|
|
511
511
|
}
|
|
512
|
-
async withdraw(repoRoot, frontier, proposalId, actor, reason) {
|
|
513
|
-
if (!/^vpr_[0-9a-f]{16}$/u.test(proposalId)) {
|
|
514
|
-
throw new VelaClientError("malformed_output", "withdrawal requires a full proposal id");
|
|
515
|
-
}
|
|
516
|
-
if (!actor.startsWith("agent:") || reason.trim().length === 0) {
|
|
517
|
-
throw new VelaClientError("malformed_output", "withdrawal requires an agent actor and reason");
|
|
518
|
-
}
|
|
519
|
-
const value = await this.#json(["review", "withdraw", frontierPath(frontier), proposalId, "--as", actor, "--reason", reason, "--json"], repoRoot, "vela review withdraw");
|
|
520
|
-
if (value.ok !== true || value.command !== "review.withdraw") {
|
|
521
|
-
throw new VelaClientError("malformed_output", "vela review withdraw returned an invalid envelope");
|
|
522
|
-
}
|
|
523
|
-
if (value.proposal_id !== proposalId || value.idempotent !== false || value.key_read !== true) {
|
|
524
|
-
throw new VelaClientError("malformed_output", "vela review withdraw did not bind one new key-backed withdrawal");
|
|
525
|
-
}
|
|
526
|
-
const eventId = stringAt(value.withdrawal_event_id, "vela review withdraw.withdrawal_event_id", {
|
|
527
|
-
max: 20,
|
|
528
|
-
pattern: /^vev_[0-9a-f]{16}$/u,
|
|
529
|
-
});
|
|
530
|
-
const withdrawnAt = stringAt(value.withdrawn_at, "vela review withdraw.withdrawn_at", {
|
|
531
|
-
min: 20,
|
|
532
|
-
max: 64,
|
|
533
|
-
});
|
|
534
|
-
if (!Number.isFinite(Date.parse(withdrawnAt))) {
|
|
535
|
-
throw new VelaClientError("malformed_output", "vela review withdraw returned an invalid timestamp");
|
|
536
|
-
}
|
|
537
|
-
const stateRootBefore = normalizeSha256(value.state_root_before, "vela review withdraw.state_root_before");
|
|
538
|
-
const stateRootAfter = normalizeSha256(value.state_root_after, "vela review withdraw.state_root_after");
|
|
539
|
-
if (stateRootBefore === stateRootAfter) {
|
|
540
|
-
throw new VelaClientError("malformed_output", "new withdrawal did not change the event-log root");
|
|
541
|
-
}
|
|
542
|
-
const publication = fieldObject(value, "publication", "vela review withdraw");
|
|
543
|
-
const publicationState = stringAt(publication.state, "vela review withdraw.publication.state", {
|
|
544
|
-
min: 1,
|
|
545
|
-
max: 32,
|
|
546
|
-
});
|
|
547
|
-
if (publicationState !== "committed_local" && publicationState !== "pushed") {
|
|
548
|
-
throw new VelaClientError("command_failed", `withdrawal publication is ${publicationState}, not committed`);
|
|
549
|
-
}
|
|
550
|
-
const publicationCommit = stringAt(publication.commit, "vela review withdraw.publication.commit", { max: 64, pattern: GIT_OBJECT_RE });
|
|
551
|
-
return {
|
|
552
|
-
proposal_id: proposalId,
|
|
553
|
-
withdrawal_event_id: eventId,
|
|
554
|
-
withdrawn_at: withdrawnAt,
|
|
555
|
-
state_root_before: stateRootBefore,
|
|
556
|
-
state_root_after: stateRootAfter,
|
|
557
|
-
publication_commit: publicationCommit,
|
|
558
|
-
};
|
|
559
|
-
}
|
|
560
512
|
async landAuthoredCommand(mission, repoRoot, input, _expected) {
|
|
561
513
|
if ((input.predictedObservable === undefined) === (input.notApplicable === undefined)) {
|
|
562
514
|
throw new VelaClientError("malformed_output", "authored receipt requires exactly one prediction mode");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vela-science/canopus",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "A bounded, replaceable research harness over released Vela interfaces",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
@@ -31,7 +31,6 @@
|
|
|
31
31
|
"dist/src/artifact",
|
|
32
32
|
"dist/src/budget",
|
|
33
33
|
"dist/src/candidate",
|
|
34
|
-
"dist/src/capability",
|
|
35
34
|
"dist/src/contracts",
|
|
36
35
|
"dist/src/engines",
|
|
37
36
|
"dist/src/evidence",
|
|
@@ -62,18 +61,12 @@
|
|
|
62
61
|
"missions",
|
|
63
62
|
"profiles",
|
|
64
63
|
"runtime",
|
|
65
|
-
"advisories",
|
|
66
|
-
"evidence/build-week",
|
|
67
|
-
"evidence/erdos",
|
|
68
|
-
"scripts/run-claim-fidelity-advisory.mjs",
|
|
69
64
|
"scripts/run-hostile-native-custody-fixture.mjs",
|
|
70
65
|
"scripts/run-hostile-verifier-fixture.mjs",
|
|
71
66
|
"tests/fixtures/hostile-verifier",
|
|
72
67
|
"README.md",
|
|
73
|
-
"BUILD_WEEK.md",
|
|
74
68
|
"THIRD_PARTY.md",
|
|
75
69
|
"docs/MISSIONS.md",
|
|
76
|
-
"docs/RELEASES.md",
|
|
77
70
|
"docs/RUN_RECORD.md",
|
|
78
71
|
"CHANGELOG.md",
|
|
79
72
|
"SECURITY.md",
|