@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.
Files changed (35) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +21 -15
  3. package/SECURITY.md +3 -2
  4. package/dist/src/activity/events.d.ts +4 -1
  5. package/dist/src/activity/events.js +8 -2
  6. package/dist/src/activity/store.d.ts +2 -2
  7. package/dist/src/activity/store.js +4 -3
  8. package/dist/src/cli.js +2 -37
  9. package/dist/src/product/run.js +0 -7
  10. package/dist/src/run.d.ts +0 -7
  11. package/dist/src/run.js +0 -15
  12. package/dist/src/vela/cli.d.ts +0 -9
  13. package/dist/src/vela/cli.js +0 -48
  14. package/package.json +1 -8
  15. package/BUILD_WEEK.md +0 -198
  16. package/advisories/erdos1056-claim-fidelity/output.schema.json +0 -90
  17. package/advisories/erdos1056-claim-fidelity/registration.json +0 -42
  18. package/advisories/erdos1056-claim-fidelity/results/assessment.json +0 -1
  19. package/advisories/erdos1056-claim-fidelity/results/verification.json +0 -1
  20. package/dist/src/capability/withdrawal.d.ts +0 -47
  21. package/dist/src/capability/withdrawal.js +0 -487
  22. package/dist/src/product/withdraw.d.ts +0 -8
  23. package/dist/src/product/withdraw.js +0 -255
  24. package/docs/RELEASES.md +0 -1389
  25. package/evidence/build-week/run_eb6bcd46-cffd-4ae8-b630-2681bd84da71.public.json +0 -1
  26. package/evidence/build-week/run_f68e4cfc-e5c7-4c73-86cb-d79807c47ec4.public.json +0 -1
  27. package/evidence/erdos/run_192b3bef-9d6e-49e5-b72d-7ae903b29d5e/pending-commands.json +0 -1
  28. package/evidence/erdos/run_192b3bef-9d6e-49e5-b72d-7ae903b29d5e/public-run.json +0 -1
  29. package/evidence/erdos/run_192b3bef-9d6e-49e5-b72d-7ae903b29d5e/root-manifest.json +0 -1
  30. package/evidence/erdos/run_192b3bef-9d6e-49e5-b72d-7ae903b29d5e/web-import.json +0 -1
  31. package/evidence/erdos/run_b3b0cf07-b149-4d53-8258-76ba0e1fc0a5/pending-commands.json +0 -1
  32. package/evidence/erdos/run_b3b0cf07-b149-4d53-8258-76ba0e1fc0a5/public-run.json +0 -1
  33. package/evidence/erdos/run_b3b0cf07-b149-4d53-8258-76ba0e1fc0a5/root-manifest.json +0 -1
  34. package/evidence/erdos/run_b3b0cf07-b149-4d53-8258-76ba0e1fc0a5/web-import.json +0 -1
  35. 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 record</a> ·
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.6.5 --version
61
- bunx @vela-science/canopus@0.6.5 profile validate sidon-a24-at-least-7194-gpt56-v3
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.6.5` and enforced by `canopus doctor`.
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.6.5 --version
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.6.5 doctor /path/to/frontier
99
- bunx @vela-science/canopus@0.6.5 run /path/to/frontier --first
100
- bunx @vela-science/canopus@0.6.5 inspect latest
101
- bunx @vela-science/canopus@0.6.5 replay /path/to/run.json
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.6.5 run /path/to/frontier --first --no-land
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, withdraw its own proposal | Sign, accept, reject, or call verifier success acceptance |
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 and withdrawal commands are documented in
148
- [Missions](docs/MISSIONS.md). Installed profiles are closed,
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
- [`BUILD_WEEK.md`](BUILD_WEEK.md).
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
- - [Release evidence](docs/RELEASES.md)
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, but operators remain
9
- responsible for deleting failed diagnostic runs and benchmark output.
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 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", "withdrawal_capability.retained", "reproduction.completed", "projection.written", "run.completed", "run.failed"];
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 ACTIVITY_TYPES = [
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 ActivityType } from "./events.js";
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: ActivityType, payload: Record<string, unknown>): Promise<ActivityEvent>;
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 (!ACTIVITY_TYPES.includes(type))
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
- const withdrawal = "proposal_id" in projection
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
- : command === "withdraw" ? withdrawUsage()
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");
@@ -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;
@@ -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;
@@ -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.6.5",
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",