@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.
Files changed (120) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/README.md +67 -139
  3. package/SECURITY.md +3 -2
  4. package/capsules/erdos1056-k15/bin/linux-arm64/{10428801-10429000 → 10429201-10429400}/verifier +0 -0
  5. package/capsules/erdos1056-k15/bin/linux-x86_64/{10428801-10429000 → 10429201-10429400}/verifier +0 -0
  6. package/compatibility.json +25 -0
  7. package/dist/src/activity/events.d.ts +4 -1
  8. package/dist/src/activity/events.js +8 -2
  9. package/dist/src/activity/store.d.ts +2 -2
  10. package/dist/src/activity/store.js +4 -3
  11. package/dist/src/{receipt/map.d.ts → candidate/finalize.d.ts} +2 -9
  12. package/dist/src/candidate/finalize.js +71 -0
  13. package/dist/src/cli.js +88 -229
  14. package/dist/src/contracts/mission.d.ts +1 -13
  15. package/dist/src/contracts/mission.js +4 -42
  16. package/dist/src/contracts/validation.d.ts +1 -25
  17. package/dist/src/contracts/validation.js +1 -95
  18. package/dist/src/engines/codex-tools-native.js +2 -2
  19. package/dist/src/index.d.ts +5 -34
  20. package/dist/src/index.js +4 -34
  21. package/dist/src/mission/prepare.d.ts +10 -1
  22. package/dist/src/mission/prepare.js +29 -30
  23. package/dist/src/product/coverage.d.ts +17 -0
  24. package/dist/src/product/coverage.js +137 -0
  25. package/dist/src/product/doctor.d.ts +1 -2
  26. package/dist/src/product/doctor.js +29 -8
  27. package/dist/src/product/profile.js +8 -2
  28. package/dist/src/product/replay.js +11 -12
  29. package/dist/src/product/run.d.ts +5 -9
  30. package/dist/src/product/run.js +17 -88
  31. package/dist/src/product/submission.d.ts +40 -0
  32. package/dist/src/product/submission.js +217 -0
  33. package/dist/src/product/submit.d.ts +22 -0
  34. package/dist/src/product/submit.js +264 -0
  35. package/dist/src/product/version.d.ts +2 -2
  36. package/dist/src/product/version.js +27 -4
  37. package/dist/src/projection/current-run.d.ts +12 -0
  38. package/dist/src/projection/current-run.js +94 -0
  39. package/dist/src/projection/failure.d.ts +17 -7
  40. package/dist/src/projection/failure.js +43 -12
  41. package/dist/src/projection/retained-mission.d.ts +6 -0
  42. package/dist/src/projection/retained-mission.js +41 -0
  43. package/dist/src/projection/retained-run.d.ts +7 -0
  44. package/dist/src/projection/retained-run.js +50 -0
  45. package/dist/src/run.d.ts +43 -41
  46. package/dist/src/run.js +34 -412
  47. package/dist/src/util/canonical.d.ts +1 -5
  48. package/dist/src/util/canonical.js +1 -53
  49. package/dist/src/vela/cli.d.ts +7 -51
  50. package/dist/src/vela/cli.js +102 -523
  51. package/dist/src/vela/types.d.ts +3 -19
  52. package/dist/src/verifier/run.js +1 -1
  53. package/dist/src/workspace/prepare.d.ts +1 -1
  54. package/dist/src/workspace/prepare.js +15 -15
  55. package/docs/EVALUATION.md +142 -0
  56. package/docs/MISSIONS.md +42 -80
  57. package/docs/RUN_RECORD.md +77 -99
  58. package/docs/adr/0010-nonmutating-runs-and-explicit-submission.md +191 -0
  59. package/missions/erdos1056-k15-next/mission.draft.json +10 -8
  60. package/package.json +18 -22
  61. package/profiles/{erdos1056-k15-10428801-10429000.json → erdos1056-k15-10429201-10429400.json} +10 -10
  62. package/schemas/failure.v1.json +17 -0
  63. package/schemas/mission.v0.json +3 -4
  64. package/schemas/mission.v1.json +7 -28
  65. package/schemas/{run.v1.json → run.v2.json} +58 -116
  66. package/schemas/submission-bundle.v1.json +63 -0
  67. package/toolchain.lock.json +31 -0
  68. package/BUILD_WEEK.md +0 -198
  69. package/advisories/erdos1056-claim-fidelity/output.schema.json +0 -90
  70. package/advisories/erdos1056-claim-fidelity/registration.json +0 -42
  71. package/advisories/erdos1056-claim-fidelity/results/assessment.json +0 -1
  72. package/advisories/erdos1056-claim-fidelity/results/verification.json +0 -1
  73. package/capsules/formal-erdos-505-test-dim-one/verifier +0 -105
  74. package/capsules/quantum-10-1-4/verifier.py +0 -152
  75. package/capsules/sidon-a24/bin/linux-arm64/verifier +0 -0
  76. package/capsules/sidon-a24/bin/linux-x86_64/verifier +0 -0
  77. package/dist/src/capability/withdrawal.d.ts +0 -47
  78. package/dist/src/capability/withdrawal.js +0 -487
  79. package/dist/src/engines/codex-exec.d.ts +0 -17
  80. package/dist/src/engines/codex-exec.js +0 -136
  81. package/dist/src/engines/codex-tool-free.d.ts +0 -26
  82. package/dist/src/engines/codex-tool-free.js +0 -213
  83. package/dist/src/product/withdraw.d.ts +0 -8
  84. package/dist/src/product/withdraw.js +0 -255
  85. package/dist/src/projection/diagnostic.d.ts +0 -12
  86. package/dist/src/projection/diagnostic.js +0 -61
  87. package/dist/src/projection/public-run.d.ts +0 -59
  88. package/dist/src/projection/public-run.js +0 -106
  89. package/dist/src/projection/publication.d.ts +0 -36
  90. package/dist/src/projection/publication.js +0 -47
  91. package/dist/src/projection/run.d.ts +0 -95
  92. package/dist/src/projection/run.js +0 -173
  93. package/dist/src/receipt/map.js +0 -168
  94. package/dist/src/repair/plan.d.ts +0 -2
  95. package/dist/src/repair/plan.js +0 -22
  96. package/dist/src/roles.d.ts +0 -2
  97. package/dist/src/roles.js +0 -9
  98. package/docs/RELEASES.md +0 -1389
  99. package/evidence/build-week/run_eb6bcd46-cffd-4ae8-b630-2681bd84da71.public.json +0 -1
  100. package/evidence/build-week/run_f68e4cfc-e5c7-4c73-86cb-d79807c47ec4.public.json +0 -1
  101. package/evidence/erdos/run_192b3bef-9d6e-49e5-b72d-7ae903b29d5e/pending-commands.json +0 -1
  102. package/evidence/erdos/run_192b3bef-9d6e-49e5-b72d-7ae903b29d5e/public-run.json +0 -1
  103. package/evidence/erdos/run_192b3bef-9d6e-49e5-b72d-7ae903b29d5e/root-manifest.json +0 -1
  104. package/evidence/erdos/run_192b3bef-9d6e-49e5-b72d-7ae903b29d5e/web-import.json +0 -1
  105. package/evidence/erdos/run_b3b0cf07-b149-4d53-8258-76ba0e1fc0a5/pending-commands.json +0 -1
  106. package/evidence/erdos/run_b3b0cf07-b149-4d53-8258-76ba0e1fc0a5/public-run.json +0 -1
  107. package/evidence/erdos/run_b3b0cf07-b149-4d53-8258-76ba0e1fc0a5/root-manifest.json +0 -1
  108. package/evidence/erdos/run_b3b0cf07-b149-4d53-8258-76ba0e1fc0a5/web-import.json +0 -1
  109. package/missions/formal-erdos-505-test-dim-one-gpt56/mission.draft.json +0 -40
  110. package/missions/quantum-10-1-4-retry/mission.draft.json +0 -40
  111. package/missions/sidon-a24-at-least-7194-gpt56/mission.draft.json +0 -42
  112. package/missions/sidon-a24-at-least-7194-gpt56-v2/mission.draft.json +0 -42
  113. package/missions/sidon-a24-at-least-7194-gpt56-v3/mission.draft.json +0 -42
  114. package/profiles/formal-erdos-505-test-dim-one-gpt56.json +0 -35
  115. package/profiles/quantum-10-1-4-stabilizer-retry.json +0 -35
  116. package/profiles/sidon-a24-at-least-7194-gpt56-v2.json +0 -35
  117. package/profiles/sidon-a24-at-least-7194-gpt56-v3.json +0 -35
  118. package/profiles/sidon-a24-at-least-7194-gpt56.json +0 -35
  119. package/schemas/canopus.public-run.v1.json +0 -116
  120. package/scripts/run-claim-fidelity-advisory.mjs +0 -235
package/CHANGELOG.md CHANGED
@@ -1,5 +1,102 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ ## 0.8.0 - 2026-07-28
6
+
7
+ - Release the nonmutating Run, explicit Submission, and framework-neutral
8
+ evaluation boundary from the Vela product monorepo.
9
+ - Depend on the shared authority-free `@vela-science/protocol` package instead
10
+ of copying canonical JSON and validation primitives.
11
+ - Drive exact Vela and Codex composition from one toolchain lock rather than
12
+ copied source, test, documentation, and workflow versions.
13
+ - Preserve and reproduce the corrected Erdős Submission and scoped Verification
14
+ through the completed human Decision loop.
15
+
16
+ - Advance Canopus `0.8.0-rc.8` after real campaign replay exposed a retained
17
+ predecessor-epoch compatibility defect. Current readers now validate and
18
+ replay immutable Run and Mission bytes through bounded in-memory projections;
19
+ the retained records and their exact roots remain unchanged.
20
+ - Advance Canopus `0.8.0-rc.7` for the Vela `0.940.7` current Target Index
21
+ writer repair.
22
+ - Keep retained Run and Submission source identities unchanged while requiring
23
+ registration through the exact repaired Vela release.
24
+
25
+ - Advance Canopus `0.8.0-rc.6` for the Vela `0.940.6` retained-Artifact
26
+ repair. Current registration may reuse exact retained Artifact bytes and
27
+ canonical paths, while path substitution remains fail-closed.
28
+ - Refuse a duplicate verifier-passing mission before output creation or model
29
+ execution. Historical schemas remain replayable but do not weaken the
30
+ current Mission v1 coverage gate.
31
+ - Export immutable predecessor-root Run v2 records without rewriting their
32
+ bytes, and allow their authenticated Submission bundles to register only
33
+ against an exact source commit or its current descendant.
34
+ - Add a rooted, source-only framework-neutral evaluation contract. Optional
35
+ engine experiments and metadata-only trace export remain outside the npm
36
+ payload and cannot change Vela Standing or authority.
37
+ - Advance Canopus `0.8.0-rc.5` after real Erdős dogfood exposed stale
38
+ post-verifier wording at the Submission waist. New workers keep verifier
39
+ status out of the Claim, verifier-pending caveats are normalized after the
40
+ separate check, and export fails closed on stale verifier language or control
41
+ bytes. An explicit Claim-plus-scope-limit correction can author a new signed
42
+ producer Submission while preserving the immutable Run unchanged.
43
+ - Consume Vela's current `produce` lane directly when selecting the first
44
+ canonical offer. Remove the retired `attack`-lane and `task.packet_ref`
45
+ compatibility path that blocked real `0.940.5` Frontiers before a model call.
46
+ - Advance Canopus `0.8.0-rc.4` to the attested Vela `0.940.5` release. The
47
+ macOS and Linux archives and binaries are pinned by exact SHA-256;
48
+ the product contract is unchanged.
49
+ - Begin Canopus `0.8.0-rc.1` as an exact candidate composition with attested
50
+ Vela `0.930.0-rc.12`. The older `0.7.0`/`0.915.1` composition remains
51
+ available only from immutable release history; it is no longer an active
52
+ operating path.
53
+ - Advance the sole active Erdős 1056 k=15 profile to the next non-overlapping
54
+ range `10429201..10429400` before any model call. The closed profile root is
55
+ `sha256:2034d6b6a49ba1345518340ba74dfd75931035788924c53e629fb0260304ece1`;
56
+ its static Linux ARM64 and x86-64 verifier roots are
57
+ `sha256:6abe6125b5ed7cfeb256a1d86f3a66c6e7000a5542417d9dd04b2e5f9d3ffe81`
58
+ and
59
+ `sha256:ce73ca27d54a2ed31607a6d279d85ed36f28c2a830891b5d5d27b9cf50f0fcb4`.
60
+ The completed `10429001..10429200` run and pending Proposal remain
61
+ reproducible from immutable Git and Frontier history but are removed from
62
+ default discovery and the package payload.
63
+ - Preserve the first candidate artifact for `10429001..10429200` as a
64
+ verifier-rejected bounded failure, then retain the exact successful repair
65
+ separately from the new active range. No prior numeric result is supplied
66
+ to the new worker.
67
+ - Allow a verifier-passing review-only Run to export Submission v1 without an
68
+ optional `vela.execution-binding.v1`. The Submission still binds the exact
69
+ verifier capsule in its verification requirement and can only enter the
70
+ ordinary pending-review path; policy eligibility continues to require the
71
+ full execution binding and result contract.
72
+ - Pin Vela rc.12 after the repository-authority landing regression proved that
73
+ repository authorization must not occupy Receipt v1's scientific
74
+ `acceptance.policyRef`, signed agent observations require canonical
75
+ whole-second timestamps, and repository-authority landing must materialize
76
+ derived views inside the same recoverable transaction without adding those
77
+ views to the signed scientific delta. The released macOS binary is
78
+ `sha256:2e6c4f5aadf0d3e6e7102d71f8fa0a46d31567cc847c25914706183248167471`.
79
+ - Raise only the bounded Vela subprocess ceiling from two to ten minutes after
80
+ a real Erdős landing reached its frozen verifier and atomic authority
81
+ transaction but was killed during large-frontier materialization at exactly
82
+ 120 seconds. Model, verifier, workspace, and mission budgets remain
83
+ independently bounded.
84
+
85
+ ## 0.7.0 - 2026-07-25
86
+
87
+ - Retire long-lived proposal-withdrawal capabilities. Successful runs now
88
+ destroy the isolated producer key with the rest of the Vela home; `inspect`
89
+ reports only rooted run state, and the `withdraw` command and capability
90
+ store are removed. Historical activity records and Vela
91
+ `proposal.withdrawn` events remain readable, while pending proposals remain
92
+ canonical review records rather than reasons to retain a private key.
93
+ - Narrow the npm package to the active Canopus product boundary. Historical
94
+ Build Week records, release ledgers, advisories, and retained Erdős evidence
95
+ remain immutable in Git and tagged source archives but no longer inflate the
96
+ installed runtime. Stable README links point to the exact `v0.6.5` archive,
97
+ while missions, profiles, verifier capsules, schemas, runtime custody
98
+ fixtures, and current product guidance continue to ship.
99
+
3
100
  ## 0.6.5 - 2026-07-25
4
101
 
5
102
  - Advance the sole runnable Erdős 1056 profile to the adjacent,
package/README.md CHANGED
@@ -1,185 +1,113 @@
1
1
  <p align="center">
2
- <img src="docs/assets/canopus-readme-hero.jpg" width="960" alt="Canopus carries one bounded target through an isolated Codex worker and separate verifier into a Receipt pending human review." />
2
+ <img src="docs/assets/canopus-readme-hero.jpg" width="960" alt="One bounded Canopus Run moves from a rooted target through an isolated worker and verifier to an optional Vela Submission." />
3
3
  </p>
4
4
 
5
5
  <p align="center"><strong>Bounded research for Codex.</strong></p>
6
6
 
7
7
  <p align="center">
8
- Give Codex one finite mission. Verify the artifact independently. Keep humans in authority.
8
+ Run one exact mission. Reproduce the artifact. Submit only when you choose.
9
9
  </p>
10
10
 
11
11
  <p align="center">
12
12
  <a href="https://www.npmjs.com/package/@vela-science/canopus"><img alt="npm" src="https://img.shields.io/npm/v/@vela-science/canopus?style=flat-square&color=C9A664&labelColor=081224" /></a>
13
- <a href="https://github.com/vela-science/vela-research-harness/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/vela-science/vela-research-harness/ci.yml?branch=main&style=flat-square&label=build&labelColor=081224" /></a>
13
+ <a href="https://github.com/vela-science/vela/actions/workflows/product-ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/vela-science/vela/product-ci.yml?branch=main&style=flat-square&label=build&labelColor=081224" /></a>
14
14
  <a href="LICENSE-APACHE"><img alt="Apache-2.0 OR MIT" src="https://img.shields.io/badge/license-Apache--2.0%20OR%20MIT-4F8F8B?style=flat-square&labelColor=081224" /></a>
15
15
  </p>
16
16
 
17
- <p align="center">
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> ·
20
- <a href="docs/MISSIONS.md">Missions</a> ·
21
- <a href="docs/RUN_RECORD.md">Run records</a> ·
22
- <a href="https://github.com/vela-science/vela">Vela</a>
23
- </p>
24
-
25
- Canopus is a removable producer over released Vela and Git. It gives Codex one
26
- exact work offer, freezes the result, runs a separate verifier, and can land a
27
- Receipt through `vela land`.
28
-
29
- It cannot sign, accept a proposal, or make a scientific decision. Removing
30
- Canopus does not change accepted state or Vela replay.
31
-
32
- ## Where Canopus fits
33
-
34
- The Vela product story has five steps:
35
-
36
- 1. **Produce:** any suitable workbench may produce bounded work; Canopus is the
37
- optional isolated producer for Codex.
38
- 2. **Preserve:** the canonical frontier Git repository preserves the exact
39
- source, artifacts, and history.
40
- 3. **Check:** Vela replays the frontier and frozen verifiers fail closed.
41
- 4. **Decide:** signed policy or one protected human decision determines
42
- scientific standing.
43
- 5. **Reuse:** the read-only Observatory and other replaceable readers help
44
- people inspect, reproduce, and continue the work.
45
-
46
- Canopus owns **Produce** only. It reuses Git for preservation and Vela for
47
- checking, landing, replay, and authority; it does not become a second state
48
- store, verifier authority, or scientific workbench platform.
49
-
50
- ## Inspect one retained example
51
-
52
- **20 seconds — inspect the real result:** open the anonymous
53
- [retained Sidon run](https://app.vela.space/frontiers/sidon-sets/runs/run_f68e4cfc-e5c7-4c73-86cb-d79807c47ec4)
54
- and follow
55
- Mission → GPT-5.6 → artifact → verifier → Receipt → Defer.
56
-
57
- **90 seconds — inspect the shipped product:**
58
-
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
62
- ```
63
-
64
- **Retained historical result — reproduce without rebuilding Canopus:**
65
-
66
- This Sidon artifact remains bound to the Vela version recorded when it landed.
67
- Install the provenance-checked prebuilt
68
- [Vela 0.912.0 release](https://github.com/vela-science/vela/releases/tag/v0.912.0)
69
- for this replay only, then:
70
-
71
- ```sh
72
- git clone https://github.com/vela-science/sidon-frontier.git
73
- cd sidon-frontier
74
- git checkout 825657d7e87618c0aa6fc9af7e3182e05f324750
75
- vela reproduce artifacts/sidon-a24-gpt56-7194.witness.json
76
- node verification/verify-sidon-a24-7194.mjs \
77
- artifacts/sidon-a24-gpt56-7194.witness.json
78
- ```
17
+ Canopus is a removable research runner over Vela and Git. It gives Codex one
18
+ rooted target, freezes the produced bytes, runs a separate verifier, and
19
+ reproduces the result from a clean clone.
79
20
 
80
- The first command selects the pending artifact explicitly and runs Vela's
81
- frozen Sidon verifier. The second is an independent base-3 implementation that
82
- also rejects a bound collision injection. Neither command accepts the proposal.
21
+ A Run is nonmutating. It does not create a Proposal, Verification Record,
22
+ Decision, Event, or scientific Standing. A successful Run may be exported as an
23
+ authenticated `vela.submission.v1`; only the separate `submit` command registers
24
+ that Submission as pending review.
83
25
 
84
- For new missions, use Vela `0.915.1`, the version composed with Canopus
85
- `0.6.5` and enforced by `canopus doctor`.
26
+ ## The loop
86
27
 
87
- ## Quickstart
88
-
89
- Run the provenance-backed public package with Bun:
90
-
91
- ```sh
92
- bunx @vela-science/canopus@0.6.5 --version
28
+ ```text
29
+ doctor → run → show → replay → export → submit
93
30
  ```
94
31
 
95
- Inspect a clean frontier, then run its first ranked producer offer:
96
-
97
32
  ```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
33
+ bun install --frozen-lockfile
34
+ bun run build
35
+
36
+ canopus doctor /path/to/frontier
37
+ canopus run /path/to/frontier --first
38
+ canopus show latest
39
+ canopus replay /path/to/run.json
40
+ canopus export /path/to/run.json --output /path/to/submission-bundle
41
+ canopus submit /path/to/submission-bundle /path/to/frontier
102
42
  ```
103
43
 
104
- Export a completed Defer run without publishing or mutating anything:
44
+ - `doctor` binds the exact frontier, target, Vela, Codex, profile, packet, and
45
+ verifier identities.
46
+ - `run` executes in disposable workspaces and leaves the frontier unchanged.
47
+ - `show` inspects current and historical run records.
48
+ - `replay` reruns the frozen verifier without a model call.
49
+ - `export` creates a signed portable Submission and retains no producer key.
50
+ If a retained Run from an older worker contract still says verification is
51
+ pending after its verifier passed, export fails closed until the producer
52
+ supplies one corrected bounded Claim and explicit scope limit.
53
+ - `submit` explicitly registers that Submission through Vela. The expected
54
+ result is `pending_review` with accepted-event delta zero.
105
55
 
106
- ```sh
107
- canopus publish-run /path/to/run.json --mission /path/to/mission.json \
108
- --repository https://github.com/vela-science/<frontier> \
109
- --output ./public-evidence
110
- ```
111
-
112
- The new directory contains `public-run.json`, `root-manifest.json`, exact
113
- pending-state commands, and a read-only Observatory import descriptor. Run v1
114
- separates worker observations, verifier observations, and caveats that remain
115
- standing after verification; historical run v0 records remain inspectable.
56
+ `inspect`, `--no-land`, Receipt authoring, and automatic landing are not current
57
+ interfaces.
116
58
 
117
- Use `--no-land` for a diagnostic mission that cannot change the source frontier:
59
+ ## Authority boundary
118
60
 
119
- ```sh
120
- bunx @vela-science/canopus@0.6.5 run /path/to/frontier --first --no-land
121
- ```
122
-
123
- `doctor` binds the exact Vela, Codex, Git, frontier, packet, profile, and verifier
124
- roots. `run` refuses dirty frontiers, drifted roots, missing capsules, and
125
- unregistered targets. It never silently skips the first ranked offer.
61
+ | Component | Owns | Does not own |
62
+ | --- | --- | --- |
63
+ | Codex worker | One bounded attempt inside an isolated workspace | Host files, human keys, verifier, network tools |
64
+ | Frozen verifier | A scoped mechanical result over exact bytes | Scientific acceptance |
65
+ | Canopus | Run evidence, replay, Submission export | Verification Records, Decisions, Events, Standing |
66
+ | Vela | Registration, review, decisions, replay, Standing | Model execution |
126
67
 
127
- ## Custody and authority
68
+ The worker uses macOS Seatbelt or Codex Bubblewrap on Linux/WSL2. The verifier
69
+ runs separately with network and writes denied. Canopus never reads a human key
70
+ or interprets verifier success as acceptance.
128
71
 
129
- | Surface | Can do | Cannot do |
130
- | --- | --- | --- |
131
- | Codex worker | Use tools inside one bounded workspace | Reach the network, host home, human keys, or verifier |
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 |
72
+ ## Exact product contract
134
73
 
135
- The worker uses macOS Seatbelt or Codex's Bubblewrap sandbox on Linux and WSL2.
136
- The verifier runs in a separate pinned container with network and writes denied.
74
+ Current source is Canopus `0.8.0`. Its exact Vela, Codex, and platform
75
+ composition is declared once in `toolchain.lock.json`; compatible public
76
+ contracts are declared separately in `compatibility.json`. Historical releases
77
+ remain available for exact replay; they are not current writers.
137
78
 
138
- ## Everyday commands
79
+ Mission v1 and profile v2 remain the advanced portable interfaces:
139
80
 
140
81
  ```sh
141
- canopus doctor [frontier]
142
- canopus run [frontier] [--first | --target <id>] [--profile <name>] [--no-land]
143
- canopus inspect [run.json | latest]
144
- canopus replay <run.json>
82
+ canopus mission prepare ...
83
+ canopus mission validate bundle/mission.json
84
+ canopus profile list
85
+ canopus profile show <name>
86
+ canopus profile validate <name>
87
+ canopus profile pack <name> --output <directory>
145
88
  ```
146
89
 
147
- Advanced profile and withdrawal commands are documented in
148
- [Missions](docs/MISSIONS.md). Installed profiles are closed,
149
- content-addressed contracts that bind the target, packet, objective, artifact
150
- types, worker, verifier, replay command, budgets, and landing ceiling.
151
-
152
- ## Retained Build Week evidence
153
-
154
- Inspect the retained Mission → worker → artifact → verifier → Receipt → Defer
155
- chain on the [exact Sidon run](https://app.vela.space/frontiers/sidon-sets/runs/run_f68e4cfc-e5c7-4c73-86cb-d79807c47ec4).
156
- Exact commits, run roots, audit evidence, and nonclaims live in
157
- [`BUILD_WEEK.md`](BUILD_WEEK.md).
158
-
159
90
  ## Development
160
91
 
161
- Requires Bun 1.3.12, Vela 0.915.1, Codex CLI 0.145.0, and Docker. The built
162
- package also runs under Node 22 or 24; unsupported odd-numbered Node releases
163
- are rejected rather than silently treated as supported.
164
-
165
92
  ```sh
166
93
  bun install --frozen-lockfile
167
94
  bun run check
168
95
  bun run pack:check
169
96
  ```
170
97
 
98
+ The installed package has one runtime dependency:
99
+ `@vela-science/protocol`, Vela's authority-free public TypeScript contract.
100
+
171
101
  ## Documentation
172
102
 
173
103
  - [Missions and profiles](docs/MISSIONS.md)
174
- - [Run records and publication](docs/RUN_RECORD.md)
175
- - [Release evidence](docs/RELEASES.md)
176
- - [Why the harness stays removable](docs/adr/0001-harness-boundary-and-name.md)
104
+ - [Run, export, and submit records](docs/RUN_RECORD.md)
105
+ - [Evaluation gates](docs/EVALUATION.md)
106
+ - [Nonmutating Runs and explicit Submission](docs/adr/0010-nonmutating-runs-and-explicit-submission.md)
107
+ - [Why Canopus stays removable](docs/adr/0001-harness-boundary-and-name.md)
108
+ - [Historical Build Week evidence](https://github.com/vela-science/vela-research-harness/blob/v0.6.5/BUILD_WEEK.md)
177
109
 
178
110
  ## License
179
111
 
180
- Apache-2.0 OR MIT, at your option. Canopus is a replaceable producer; Vela
181
- remains the protocol and authority boundary.
182
-
183
- The published CLI has no runtime npm dependencies. See
184
- [Third-party components](THIRD_PARTY.md) for the bundled verifier and external
185
- toolchain boundary.
112
+ Apache-2.0 OR MIT, at your option. Vela remains the protocol and authority
113
+ boundary.
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
@@ -0,0 +1,25 @@
1
+ {
2
+ "schema": "canopus.compatibility.v1",
3
+ "repository_epoch": "current",
4
+ "required_schemas": [
5
+ "vela.repository.v1",
6
+ "vela.status.v1",
7
+ "vela.offer.v1",
8
+ "vela.submission.v1",
9
+ "vela.verification-record.v1"
10
+ ],
11
+ "required_commands": [
12
+ "status",
13
+ "next",
14
+ "start",
15
+ "submit",
16
+ "verification import",
17
+ "check",
18
+ "reproduce"
19
+ ],
20
+ "forbidden_authority_capabilities": [
21
+ "review accept",
22
+ "review reject",
23
+ "repository authority"
24
+ ]
25
+ }
@@ -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,
@@ -1,10 +1,10 @@
1
- import { type FrozenArtifactLocation } from "../artifact/freeze.js";
1
+ import type { FrozenArtifactLocation } from "../artifact/freeze.js";
2
2
  import type { BudgetSnapshot } from "../budget/enforce.js";
3
3
  import { type Candidate } from "../contracts/candidate.js";
4
4
  import type { Mission } from "../contracts/mission.js";
5
5
  import type { EngineResult } from "../engines/engine.js";
6
6
  import type { VerifierOutcome } from "../verifier/run.js";
7
- import type { AuthoredReceiptInput } from "../vela/cli.js";
7
+ export declare function finalizeWorkerCaveat(value: string): string;
8
8
  export declare function finalizeCandidate(options: {
9
9
  mission: Mission;
10
10
  engine: EngineResult;
@@ -16,10 +16,3 @@ export declare function finalizeCandidate(options: {
16
16
  kind: string;
17
17
  }>;
18
18
  }): Candidate;
19
- export declare function mapCandidateToReceipt(mission: Mission, candidate: Candidate, verifier: VerifierOutcome, work?: string): AuthoredReceiptInput;
20
- export declare function installFrozenArtifacts(options: {
21
- landingRepo: string;
22
- frontier: string;
23
- frozen: readonly FrozenArtifactLocation[];
24
- maxBytes: number;
25
- }): Promise<string[]>;
@@ -0,0 +1,71 @@
1
+ import { parseCandidate } from "../contracts/candidate.js";
2
+ function unique(values) {
3
+ return [...new Set(values)];
4
+ }
5
+ export function finalizeWorkerCaveat(value) {
6
+ if (/verif(?:y|ication|ier).*(?:pending|has not run|not (?:been )?(?:performed|executed|run))|pending.*verif(?:y|ication|ier)/iu.test(value)) {
7
+ return "The worker handed off without verifier authority; Canopus subsequently recorded the separate verifier outcome.";
8
+ }
9
+ return value;
10
+ }
11
+ export function finalizeCandidate(options) {
12
+ const draftPaths = options.engine.draft.artifacts
13
+ .map((artifact) => `${artifact.path}:${artifact.kind}`)
14
+ .sort();
15
+ const supporting = new Map((options.supportingArtifacts ?? []).map((entry) => [entry.path, entry.kind]));
16
+ const frozenPaths = options.frozen
17
+ .filter((entry) => !supporting.has(entry.artifact.path))
18
+ .map((entry) => `${entry.artifact.path}:${entry.artifact.kind}`)
19
+ .sort();
20
+ if (JSON.stringify(draftPaths) !== JSON.stringify(frozenPaths)) {
21
+ throw new Error("frozen artifacts do not exactly match the engine declaration");
22
+ }
23
+ for (const [path, kind] of supporting) {
24
+ const entry = options.frozen.find((candidate) => candidate.artifact.path === path);
25
+ if (entry === undefined || entry.artifact.kind !== kind) {
26
+ throw new Error(`supporting artifact ${path} is absent or misclassified`);
27
+ }
28
+ }
29
+ const verifierFailed = options.engine.draft.status === "success" && options.verifier.status !== "passed";
30
+ const status = verifierFailed ? "failed" : options.engine.draft.status;
31
+ const exactPositiveClaim = options.mission.schema === "canopus.mission.v1" &&
32
+ options.mission.result_contract !== undefined &&
33
+ options.engine.draft.status === "success" &&
34
+ options.verifier.status === "passed"
35
+ ? options.mission.result_contract.claim_exact
36
+ : undefined;
37
+ const claim = verifierFailed
38
+ ? `The engine proposed a candidate, but the declared verifier did not pass: ${options.engine.draft.claim}`
39
+ : exactPositiveClaim ?? options.engine.draft.claim;
40
+ const caveats = unique([
41
+ ...options.engine.draft.caveats.map(finalizeWorkerCaveat),
42
+ `Declared verifier outcome: ${options.verifier.status}.`,
43
+ "Canopus produced this record; it is not a Verification Record or Decision.",
44
+ ]);
45
+ const base = {
46
+ schema: "canopus.candidate.v0",
47
+ mission_id: options.mission.id,
48
+ status,
49
+ claim,
50
+ artifacts: options.frozen.map((entry) => entry.artifact),
51
+ observations: options.engine.draft.observations,
52
+ tests: [options.verifier.record],
53
+ costs: {
54
+ wall_time_ms: options.budget.research_elapsed_ms,
55
+ attempt: options.budget.attempts,
56
+ input_tokens: options.engine.usage.input_tokens,
57
+ output_tokens: options.engine.usage.output_tokens,
58
+ },
59
+ caveats,
60
+ engine: options.engine.engine,
61
+ };
62
+ return parseCandidate(options.mission.parent_candidate === undefined
63
+ ? base
64
+ : {
65
+ ...base,
66
+ repair: {
67
+ parent_candidate: options.mission.parent_candidate,
68
+ reason: options.mission.repair_reason ?? "Bounded repair of the named candidate.",
69
+ },
70
+ });
71
+ }