@vela-science/canopus 0.4.6 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.1 - 2026-07-20
4
+
5
+ - Preserve exact pending-result replay roots instead of recomputing a receipt
6
+ projection with incomplete post-run state.
7
+ - Keep the published `0.5.0` package and failed post-publication workflow as
8
+ audit evidence; `0.5.1` is the corrected default install target.
9
+
10
+ ## 0.5.0 - 2026-07-20
11
+
12
+ - Compose against released Vela 0.911.0 and surface configured, available, and
13
+ leased producer work without treating a lease as an empty frontier.
14
+ - Restore the packaged quantum-codes profile, mission draft, and verifier
15
+ capsule so all four published frontiers have reproducible product coverage.
16
+ - Make Bun 1.3.12 the canonical development and public invocation path while
17
+ preserving the supported Node runtime for the installed package.
18
+ - Keep historical Build Week registrations and evidence byte-identical; this
19
+ release adds composition and usability, not scientific authority.
20
+
3
21
  ## 0.4.6 - 2026-07-20
4
22
 
5
23
  - Register and complete the GPT-5.6 Sidon mission that produces a new
package/README.md CHANGED
@@ -38,8 +38,8 @@ Mission → GPT-5.6 → artifact → verifier → Receipt → Defer.
38
38
  **90 seconds — inspect the shipped product:**
39
39
 
40
40
  ```sh
41
- npx -p @vela-science/canopus@0.4.6 canopus --version
42
- npx -p @vela-science/canopus@0.4.6 canopus profile validate sidon-a24-at-least-7194-gpt56-v3
41
+ bunx @vela-science/canopus@0.5.1 --version
42
+ bunx @vela-science/canopus@0.5.1 profile validate sidon-a24-at-least-7194-gpt56-v3
43
43
  ```
44
44
 
45
45
  **Full workflow — reproduce without rebuilding Canopus:**
@@ -53,26 +53,25 @@ vela reproduce .
53
53
 
54
54
  ## Quickstart
55
55
 
56
- Install the provenance-backed public package:
56
+ Run the provenance-backed public package with Bun:
57
57
 
58
58
  ```sh
59
- npm install --global @vela-science/canopus@0.4.6
60
- canopus --version
59
+ bunx @vela-science/canopus@0.5.1 --version
61
60
  ```
62
61
 
63
62
  Inspect a clean frontier, then run its first ranked producer offer:
64
63
 
65
64
  ```sh
66
- canopus doctor /path/to/frontier
67
- canopus run /path/to/frontier --first
68
- canopus inspect latest
69
- canopus replay /path/to/run.json
65
+ bunx @vela-science/canopus@0.5.1 doctor /path/to/frontier
66
+ bunx @vela-science/canopus@0.5.1 run /path/to/frontier --first
67
+ bunx @vela-science/canopus@0.5.1 inspect latest
68
+ bunx @vela-science/canopus@0.5.1 replay /path/to/run.json
70
69
  ```
71
70
 
72
71
  Use `--no-land` for a diagnostic mission that cannot change the source frontier:
73
72
 
74
73
  ```sh
75
- canopus run /path/to/frontier --first --no-land
74
+ bunx @vela-science/canopus@0.5.1 run /path/to/frontier --first --no-land
76
75
  ```
77
76
 
78
77
  `doctor` binds the exact Vela, Codex, Git, frontier, packet, profile, and verifier
@@ -113,12 +112,14 @@ commits, run roots, audit evidence, and nonclaims live in
113
112
 
114
113
  ## Development
115
114
 
116
- Requires Node 22 or 24, pnpm 10, Vela 0.910.0, Codex CLI 0.144.6, and Docker.
115
+ Requires Bun 1.3.12, Vela 0.911.0, Codex CLI 0.144.6, and Docker. The built
116
+ package also runs under Node 22 or 24; unsupported odd-numbered Node releases
117
+ are rejected rather than silently treated as supported.
117
118
 
118
119
  ```sh
119
- pnpm install --frozen-lockfile
120
- pnpm check
121
- pnpm pack --dry-run
120
+ bun install --frozen-lockfile
121
+ bun run check
122
+ bun run pack:check
122
123
  ```
123
124
 
124
125
  ## Documentation
File without changes
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env python3
2
+ """Verify one explicit [[10,1,d>=4]] stabilizer witness."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import itertools
7
+ import json
8
+ import pathlib
9
+ import sys
10
+
11
+ SCHEMA = "canopus.quantum-stabilizer-witness.v1"
12
+ TARGET = "quantum:[[10,1,4]]"
13
+ N = 10
14
+ K = 1
15
+ EXPECTED_KEYS = {"schema", "target", "n", "k", "generators"}
16
+
17
+
18
+ def fail(message: str) -> "NoReturn":
19
+ print(f"quantum verifier: {message}", file=sys.stderr)
20
+ raise SystemExit(1)
21
+
22
+
23
+ def pauli_vector(pauli: str) -> int:
24
+ if len(pauli) != N or any(symbol not in "IXYZ" for symbol in pauli):
25
+ fail("each generator must be a length-10 string over I, X, Y, Z")
26
+ vector = 0
27
+ for qubit, symbol in enumerate(pauli):
28
+ if symbol in "XY":
29
+ vector |= 1 << qubit
30
+ if symbol in "ZY":
31
+ vector |= 1 << (N + qubit)
32
+ return vector
33
+
34
+
35
+ def symplectic(left: int, right: int) -> int:
36
+ mask = (1 << N) - 1
37
+ left_x, left_z = left & mask, left >> N
38
+ right_x, right_z = right & mask, right >> N
39
+ return ((left_x & right_z).bit_count() + (left_z & right_x).bit_count()) & 1
40
+
41
+
42
+ def binary_rank(rows: list[int]) -> int:
43
+ basis: dict[int, int] = {}
44
+ for original in rows:
45
+ row = original
46
+ while row:
47
+ pivot = row.bit_length() - 1
48
+ if pivot in basis:
49
+ row ^= basis[pivot]
50
+ else:
51
+ basis[pivot] = row
52
+ break
53
+ return len(basis)
54
+
55
+
56
+ def stabilizer_span(generators: list[int]) -> set[int]:
57
+ span = {0}
58
+ for generator in generators:
59
+ span.update(value ^ generator for value in tuple(span))
60
+ return span
61
+
62
+
63
+ def error_vector(positions: tuple[int, ...], symbols: tuple[str, ...]) -> int:
64
+ vector = 0
65
+ for qubit, symbol in zip(positions, symbols, strict=True):
66
+ if symbol in "XY":
67
+ vector |= 1 << qubit
68
+ if symbol in "ZY":
69
+ vector |= 1 << (N + qubit)
70
+ return vector
71
+
72
+
73
+ def main() -> None:
74
+ if len(sys.argv) != 2:
75
+ fail("usage: verifier.py WITNESS.json")
76
+ witness_path = pathlib.Path(sys.argv[1])
77
+ metadata = witness_path.lstat()
78
+ if not witness_path.is_file() or witness_path.is_symlink() or metadata.st_size > 65_536:
79
+ fail("witness must be one bounded regular file")
80
+ with witness_path.open("rb") as source:
81
+ raw = source.read(65_537)
82
+ if len(raw) > 65_536:
83
+ fail("witness exceeds 65536 bytes")
84
+ try:
85
+ witness = json.loads(raw)
86
+ except (UnicodeDecodeError, json.JSONDecodeError) as error:
87
+ fail(f"witness is not valid UTF-8 JSON: {error}")
88
+ if not isinstance(witness, dict) or set(witness) != EXPECTED_KEYS:
89
+ fail("witness fields must be exactly schema, target, n, k, generators")
90
+ if witness["schema"] != SCHEMA or witness["target"] != TARGET:
91
+ fail("witness schema or target is wrong")
92
+ if type(witness["n"]) is not int or type(witness["k"]) is not int:
93
+ fail("n and k must be integers")
94
+ if witness["n"] != N or witness["k"] != K:
95
+ fail("witness must declare n=10 and k=1")
96
+ declared = witness["generators"]
97
+ if not isinstance(declared, list) or len(declared) != N - K:
98
+ fail("witness must contain exactly nine generators")
99
+ if any(not isinstance(generator, str) for generator in declared):
100
+ fail("every generator must be a string")
101
+ if len(set(declared)) != len(declared):
102
+ fail("generators must be distinct")
103
+ generators = [pauli_vector(generator) for generator in declared]
104
+ if any(generator == 0 for generator in generators):
105
+ fail("identity is not a generator")
106
+ for left, right in itertools.combinations(generators, 2):
107
+ if symplectic(left, right) != 0:
108
+ fail("generators do not commute")
109
+ rank = binary_rank(generators)
110
+ if rank != N - K:
111
+ fail(f"generator rank is {rank}, expected nine")
112
+ span = stabilizer_span(generators)
113
+ if len(span) != 1 << (N - K):
114
+ fail("stabilizer span has the wrong cardinality")
115
+
116
+ tested = 0
117
+ degenerate = 0
118
+ for weight in range(1, 4):
119
+ for positions in itertools.combinations(range(N), weight):
120
+ for symbols in itertools.product("XYZ", repeat=weight):
121
+ tested += 1
122
+ error = error_vector(positions, symbols)
123
+ if all(symplectic(error, generator) == 0 for generator in generators):
124
+ if error not in span:
125
+ fail(
126
+ "found an undetectable non-stabilizer Pauli below weight four: "
127
+ f"positions={positions}, symbols={''.join(symbols)}"
128
+ )
129
+ degenerate += 1
130
+ if tested != 3_675:
131
+ fail(f"internal enumeration count is {tested}, expected 3675")
132
+ print(
133
+ json.dumps(
134
+ {
135
+ "schema": "canopus.quantum-stabilizer-verification.v1",
136
+ "target": TARGET,
137
+ "n": N,
138
+ "k": K,
139
+ "rank": rank,
140
+ "stabilizer_size": len(span),
141
+ "errors_weight_1_to_3_tested": tested,
142
+ "low_weight_stabilizers": degenerate,
143
+ "distance_at_least": 4,
144
+ },
145
+ sort_keys=True,
146
+ separators=(",", ":"),
147
+ )
148
+ )
149
+
150
+
151
+ if __name__ == "__main__":
152
+ main()
File without changes
File without changes
@@ -28,10 +28,26 @@ function nonnegative(value, at) {
28
28
  }
29
29
  return value;
30
30
  }
31
+ function noAvailableProducerTarget(offer) {
32
+ const leased = Array.isArray(offer.leased_targets) ? offer.leased_targets : [];
33
+ if (leased.length > 0) {
34
+ const summaries = leased.map((value, index) => {
35
+ const lease = objectAt(value, `vela next.leased_targets[${index}]`);
36
+ const target = stringAt(lease.target_id, "leased target id", { min: 1, max: 256 });
37
+ const actor = stringAt(lease.actor, "leased target actor", { min: 1, max: 256 });
38
+ const expires = lease.expires_at === undefined
39
+ ? "unknown expiry"
40
+ : stringAt(lease.expires_at, "leased target expiry", { min: 1, max: 64 });
41
+ return `${target} by ${actor} until ${expires}`;
42
+ });
43
+ return new Error(`no producer target is currently available; configured work is leased: ${summaries.join(", ")}`);
44
+ }
45
+ return new Error("vela next returned no producer target");
46
+ }
31
47
  export function selectProductOffer(offer, profile, requestedTarget) {
32
48
  const targets = offer.targets;
33
49
  if (!Array.isArray(targets) || targets.length === 0) {
34
- throw new Error("vela next returned no producer target");
50
+ throw noAvailableProducerTarget(offer);
35
51
  }
36
52
  if (requestedTarget !== undefined && requestedTarget !== profile.target) {
37
53
  throw new Error(`registered profile ${profile.name} targets ${profile.target}, not requested target ${requestedTarget}`);
@@ -62,7 +78,7 @@ export async function resolveProductProfile(offer, profileName, requestedTarget)
62
78
  return loadProductProfile(profileName);
63
79
  const targets = offer.targets;
64
80
  if (!Array.isArray(targets) || targets.length === 0) {
65
- throw new Error("vela next returned no producer target");
81
+ throw noAvailableProducerTarget(offer);
66
82
  }
67
83
  const selectedOffer = requestedTarget === undefined
68
84
  ? objectAt(targets[0], "vela next.targets[0]")
@@ -104,8 +120,8 @@ export async function doctorProduct(options) {
104
120
  runtimeIdentity({ name: "vela", cwd: frontier, home: runtime, runner }),
105
121
  runtimeIdentity({ name: "git", cwd: frontier, home: runtime, runner }),
106
122
  ]);
107
- if (vela.version !== "vela 0.910.0") {
108
- throw new Error(`Canopus ${CANOPUS_VERSION} requires vela 0.910.0, observed ${vela.version}`);
123
+ if (vela.version !== "vela 0.911.0") {
124
+ throw new Error(`Canopus ${CANOPUS_VERSION} requires vela 0.911.0, observed ${vela.version}`);
109
125
  }
110
126
  const [status, offer, gitStatus] = await Promise.all([
111
127
  jsonCommand({ runner, argv: [vela.binary, "status", ".", "--json"], cwd: frontier, home: runtime, label: "vela status" }),
@@ -16,6 +16,9 @@ function publicCaveat(value) {
16
16
  }
17
17
  return value;
18
18
  }
19
+ function shellArgument(value) {
20
+ return `'${value.replaceAll("'", `'"'"'`)}'`;
21
+ }
19
22
  export function projectPublicRun(options) {
20
23
  const { record, mission } = options;
21
24
  if (mission.schema !== "canopus.mission.v1") {
@@ -91,7 +94,7 @@ export function projectPublicRun(options) {
91
94
  `git clone ${repository.url}.git`,
92
95
  `cd ${repository.directory}`,
93
96
  `git checkout ${record.final_roots.git_commit}`,
94
- "vela reproduce .",
97
+ ...mission.allowed_paths.map((artifact) => `vela reproduce ${shellArgument(artifact)}`),
95
98
  ],
96
99
  },
97
100
  nonclaims: [
@@ -6,6 +6,12 @@ import { parseCandidate } from "../contracts/candidate.js";
6
6
  function unique(values) {
7
7
  return [...new Set(values)];
8
8
  }
9
+ function finalizeWorkerCaveat(value) {
10
+ if (/verif(?:y|ication|ier).*(?:pending|has not run)|pending.*verif(?:y|ication|ier)/iu.test(value)) {
11
+ return "The worker handed off without verifier authority; Canopus subsequently recorded the separate verifier outcome.";
12
+ }
13
+ return value;
14
+ }
9
15
  export function finalizeCandidate(options) {
10
16
  const draftPaths = options.engine.draft.artifacts.map((artifact) => `${artifact.path}:${artifact.kind}`).sort();
11
17
  const supporting = new Map((options.supportingArtifacts ?? []).map((entry) => [entry.path, entry.kind]));
@@ -34,7 +40,7 @@ export function finalizeCandidate(options) {
34
40
  ? `The engine proposed a candidate, but the declared verifier did not pass: ${options.engine.draft.claim}`
35
41
  : exactPositiveClaim ?? options.engine.draft.claim;
36
42
  const caveats = unique([
37
- ...options.engine.draft.caveats,
43
+ ...options.engine.draft.caveats.map(finalizeWorkerCaveat),
38
44
  `Declared verifier outcome: ${options.verifier.status}.`,
39
45
  "Canopus produced this record; it is not a human acceptance decision.",
40
46
  ]);
@@ -432,7 +432,7 @@ export class VelaClient {
432
432
  if (replay.source_hash !== undefined) {
433
433
  assertEqual(normalizeSha256(replay.source_hash, "vela check.replay.source_hash"), checkCurrent, "Vela source snapshot");
434
434
  }
435
- const proof = version === "0.900.0" || version === "0.900.1" || version === "0.900.2" || version === "0.901.0" || version === "0.910.0"
435
+ const proof = version === "0.900.0" || version === "0.900.1" || version === "0.900.2" || version === "0.901.0" || version === "0.910.0" || version === "0.911.0"
436
436
  ? {
437
437
  ok: true,
438
438
  command: "status_root_projection",
package/docs/RELEASES.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # Release evidence
2
2
 
3
+ ## Canopus v0.4.6
4
+
5
+ Version `0.4.6` is the primary Build Week science release. It registers the
6
+ bounded `gpt-5.6-sol` Sidon mission, securely retains the worker's declared
7
+ large artifact before workspace teardown, packages the frozen Sidon verifier
8
+ capsules, and publishes the sanitized public projection of the successful
9
+ 7,194-point construction.
10
+
11
+ The exact run completed the full product chain: worker success, frozen
12
+ verifier pass, Vela route `defer`, accepted-state delta zero, and matching
13
+ clean-clone replay. The pending proposal is evidence, not scientific
14
+ acceptance.
15
+
16
+ - Source/tag: `ad72a7aca63aaa6c060f840020cca6871e4a9f11` / `v0.4.6`
17
+ - Cross-platform CI and installed-package smoke:
18
+ [run 29783128714](https://github.com/vela-science/vela-research-harness/actions/runs/29783128714)
19
+ - CodeQL:
20
+ [run 29783117151](https://github.com/vela-science/vela-research-harness/actions/runs/29783117151)
21
+ - OIDC publish and GitHub build attestation:
22
+ [run 29783128737](https://github.com/vela-science/vela-research-harness/actions/runs/29783128737)
23
+ - Package SHA-256: `d1c30b0c35b56cb7d874e3646a5d3ddc2abe2f61e38da0c6d2c7163d6de09300`
24
+ - npm shasum: `ca9e9f5a8c064c749523f2e47a4936030367eed3`
25
+ - npm integrity:
26
+ `sha512-Y3vL/29YEYnKt6iniPvSi5C85UHEOWZ+vtlXiqZSyyyNo5emXkC5gt8fJ4chzEMi7iTYzaRPOv0hsNuPnbUhVQ==`
27
+ - A fresh `npm audit signatures --include-attestations` verifies the registry
28
+ signatures and the SLSA provenance v1 attestation.
29
+ - A clean registry execution under Node `v24.14.0` returned `canopus 0.4.6`
30
+ and validated the exact packaged Sidon v3 profile root.
31
+ - Public package and matching release:
32
+ [npm](https://www.npmjs.com/package/@vela-science/canopus/v/0.4.6),
33
+ [GitHub](https://github.com/vela-science/vela-research-harness/releases/tag/v0.4.6)
34
+
35
+ The OIDC workflow published successfully, but its immediate registry
36
+ attestation audit encountered a transient npm attestations-endpoint `404`, so
37
+ the final GitHub-release step did not run. Once the same registry tarball
38
+ passed both `gh attestation verify` against the exact release workflow/tag and
39
+ the npm signature audit, the matching GitHub release was created from those
40
+ bytes. The tag did not move and no reusable npm token was introduced. The
41
+ workflow now retries the full audit while the registry endpoint propagates.
42
+
3
43
  ## Canopus v0.4.5
4
44
 
5
45
  Version `0.4.5` is a documentation-only truthfulness correction over 0.4.4.
@@ -44,7 +44,10 @@ canopus public-run /local/run/run.json \
44
44
  `canopus.public-run.v1` contains only mission and model identity, a bounded
45
45
  activity summary, claim and caveats, artifact/verifier/Receipt roots, route,
46
46
  accepted delta, usage, source/final commits, and clean-clone reproduction
47
- commands. It cannot export a failed or admitted run. Never publish the raw run
47
+ commands. Those public commands target the mission's exact allowed artifact
48
+ paths; they do not substitute frontier-wide accepted-state replay for
49
+ verification of a pending artifact. It cannot export a failed or admitted run.
50
+ Never publish the raw run
48
51
  directory, isolated homes, authentication, private paths, or unrestricted logs.
49
52
 
50
53
  The run root also contains isolated checkouts and content-addressed artifacts.
@@ -0,0 +1,40 @@
1
+ {
2
+ "id": "mission_quantum_10_1_4_stabilizer_v2",
3
+ "target": "quantum:[[10,1,4]]",
4
+ "frontier": ".",
5
+ "actor": "agent:canopus-local",
6
+ "role": "producer",
7
+ "claim_type": "computational",
8
+ "replayability": "exact",
9
+ "objective": "Produce exactly one explicit stabilizer witness at artifacts/quantum-10-1-4.witness.json. The JSON fields must be exactly schema, target, n, k, and generators. Set schema to canopus.quantum-stabilizer-witness.v1, target to quantum:[[10,1,4]], n to 10, k to 1, and generators to exactly nine distinct length-10 strings over I, X, Y, Z. The generators must be non-identity, pairwise commuting, GF(2)-independent, and define no undetectable non-stabilizer Pauli of weight one, two, or three. A null or failed result is valid if no candidate is found. Work only from the supplied frontier and do not assume access to any earlier run artifact. Do not claim classification, optimality, or universal nonexistence.",
10
+ "completion_condition": "The frozen verifier independently checks generator validity, pairwise symplectic commutation, rank nine, stabilizer-span membership, and all 3,675 Pauli errors of weight one through three in a separate network-denied and write-denied container.",
11
+ "allowed_paths": [
12
+ "artifacts/quantum-10-1-4.witness.json"
13
+ ],
14
+ "budgets": {
15
+ "max_research_wall_time_ms": 1800000,
16
+ "max_research_processes": 16,
17
+ "max_research_output_bytes": 16777216,
18
+ "max_prompt_bytes": 2097152,
19
+ "max_artifact_bytes": 65536,
20
+ "max_attempts": 1,
21
+ "max_observed_tokens": 400000
22
+ },
23
+ "worker": {
24
+ "model": "gpt-5.4"
25
+ },
26
+ "verifier": {
27
+ "argv": [
28
+ "capsule/verifier",
29
+ "{artifact:artifacts/quantum-10-1-4.witness.json}"
30
+ ],
31
+ "cwd": "targets",
32
+ "timeout_ms": 30000,
33
+ "max_output_bytes": 65536,
34
+ "capsule_path": "capsule/verifier"
35
+ },
36
+ "scientific_chain": {
37
+ "predicted_observable": "The frozen verifier reports rank nine, stabilizer size 512, exactly 3,675 checked Pauli errors, and distance_at_least=4 for the supplied generator set.",
38
+ "performed_test": "capsule/verifier artifacts/quantum-10-1-4.witness.json"
39
+ }
40
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vela-science/canopus",
3
- "version": "0.4.6",
3
+ "version": "0.5.1",
4
4
  "description": "A bounded, replaceable research harness over released Vela interfaces",
5
5
  "type": "module",
6
6
  "private": false,
@@ -16,6 +16,7 @@
16
16
  "engines": {
17
17
  "node": ">=22 <23 || >=24 <25"
18
18
  },
19
+ "packageManager": "bun@1.3.12",
19
20
  "bin": {
20
21
  "canopus": "dist/src/cli.js"
21
22
  },
@@ -55,6 +56,7 @@
55
56
  "capsules/erdos1056-k15/bin/linux-arm64/10428401-10428600/verifier",
56
57
  "capsules/erdos1056-k15/bin/linux-x86_64/10428401-10428600/verifier",
57
58
  "capsules/formal-erdos-505-test-dim-one/verifier",
59
+ "capsules/quantum-10-1-4/verifier.py",
58
60
  "capsules/sidon-a24/bin/linux-arm64/verifier",
59
61
  "capsules/sidon-a24/bin/linux-x86_64/verifier",
60
62
  "missions",
@@ -76,18 +78,19 @@
76
78
  "LICENSE-APACHE",
77
79
  "LICENSE-MIT"
78
80
  ],
79
- "devDependencies": {
80
- "@types/node": "^24.0.0",
81
- "typescript": "^5.9.0"
82
- },
83
81
  "scripts": {
84
82
  "build": "node scripts/clean-dist.mjs && tsc -p tsconfig.json",
85
83
  "typecheck": "tsc -p tsconfig.json --noEmit",
86
84
  "lint": "tsc -p tsconfig.json --noEmit",
87
- "test": "pnpm run build && node --test 'dist/tests/**/*.test.js' 'tests/**/*.test.mjs'",
88
- "check": "pnpm run lint && pnpm run test",
89
- "pack:check": "pnpm pack --dry-run",
85
+ "test": "bun run build && node --test 'dist/tests/**/*.test.js' 'tests/**/*.test.mjs'",
86
+ "check": "bun run lint && bun run test",
87
+ "prepack": "bun run build",
88
+ "pack:check": "bun pm pack --dry-run",
90
89
  "fixture:hostile-custody": "node scripts/run-hostile-native-custody-fixture.mjs",
91
90
  "fixture:hostile-verifier": "node scripts/run-hostile-verifier-fixture.mjs"
91
+ },
92
+ "devDependencies": {
93
+ "@types/node": "^24.0.0",
94
+ "typescript": "^5.9.0"
92
95
  }
93
- }
96
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "schema": "canopus.profile.v2",
3
+ "name": "quantum-10-1-4-stabilizer-retry",
4
+ "target": "quantum:[[10,1,4]]",
5
+ "target_packet_schema": "quantum-codes.stabilizer-work.v1",
6
+ "draft": "missions/quantum-10-1-4-retry/mission.draft.json",
7
+ "draft_sha256": "sha256:e19f77440210492229e77014766abda013ab08ae5d8780a1ba7ae88f299c6c9d",
8
+ "objective_sha256": "sha256:bb432a7dedff4ed91facabc519f9d822988fe5a071342e6b1b7da15ab922e81e",
9
+ "completion_condition_sha256": "sha256:3f8efa58f9262d0e7a5cf3c7357a52b41331c8de4996c8d46d4bc187893a2372",
10
+ "allowed_artifacts_sha256": "sha256:17c9b63d133d87c3f8947805a414772597b99babcebdf95645c80a8357b67e35",
11
+ "budgets_sha256": "sha256:af61ff3790f8a96491fecca0693b6498f89b87ae7f67cebdbe85bef1670c48a0",
12
+ "replay_argv_sha256": "sha256:db20f2bd15f3bad1de911942247efbc190199d9d3683462a41723302b7ffacce",
13
+ "landing": {
14
+ "expected_routes": [
15
+ "defer"
16
+ ],
17
+ "max_accepted_delta": 0
18
+ },
19
+ "platforms": {
20
+ "darwin-arm64": {
21
+ "worker_profile": "runtime/native-worker/config.toml",
22
+ "worker_profile_sha256": "sha256:12b58762819481ad101e7a172a296224b6050a8a07a7431272e521a4102908da",
23
+ "verifier_capsule": "capsules/quantum-10-1-4/verifier.py",
24
+ "verifier_capsule_sha256": "sha256:7070364ac9017b597b7765efd772f68f543008b64217df4b0d43e72719527160",
25
+ "verifier_image": "ghcr.io/vela-science/canopus-verifier@sha256:a6f354862f2a3f7d72eb99244c65fa8583c98b74e17e3d5ce6e31ef48aa16536"
26
+ },
27
+ "linux-x86_64": {
28
+ "worker_profile": "runtime/native-worker/config-linux.toml",
29
+ "worker_profile_sha256": "sha256:fddecc4b7458b91f6d55ae16b666d297ae7bcd1a2f5deeb6650dcea60fc0242c",
30
+ "verifier_capsule": "capsules/quantum-10-1-4/verifier.py",
31
+ "verifier_capsule_sha256": "sha256:7070364ac9017b597b7765efd772f68f543008b64217df4b0d43e72719527160",
32
+ "verifier_image": "ghcr.io/vela-science/canopus-verifier@sha256:a6f354862f2a3f7d72eb99244c65fa8583c98b74e17e3d5ce6e31ef48aa16536"
33
+ }
34
+ }
35
+ }