@journeykit/canon 0.30.0 → 0.32.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/dist/skills/SKILL.src.md +77 -32
- package/dist/skills/reference/brief-align.md +2 -2
- package/dist/skills/reference/brief-clarify.md +2 -2
- package/dist/skills/reference/brief-harden.md +2 -2
- package/dist/skills/reference/brief-polish.md +8 -8
- package/dist/skills/reference/brief-shape.md +40 -9
- package/dist/skills/reference/canon-authoring.md +6 -6
- package/dist/skills/reference/canon-gate.md +45 -36
- package/dist/skills/reference/canon-learn.md +2 -2
- package/dist/skills/reference/canon-plan-import.md +2 -2
- package/dist/skills/reference/canon-plugins.md +6 -6
- package/dist/skills/reference/canon-policy.md +7 -4
- package/dist/skills/reference/canon-report-dashboard.md +17 -10
- package/dist/skills/reference/canon-review.md +24 -24
- package/dist/skills/reference/canon-storage.md +2 -2
- package/dist/skills/reference/canon-subject.md +137 -103
- package/dist/skills/reference/role-implementer.md +52 -36
- package/dist/skills/reference/role-orchestrator.md +68 -38
- package/dist/skills/reference/role-planner.md +99 -45
- package/dist/skills/reference/role-reviewer.md +69 -43
- package/man/canon-adapter-authorize.1 +2 -2
- package/man/canon-adapter-validate.1 +2 -2
- package/man/canon-adapter.1 +2 -2
- package/man/canon-artifacts-move.1 +2 -2
- package/man/canon-artifacts-store.1 +2 -2
- package/man/canon-artifacts-verify.1 +2 -2
- package/man/canon-artifacts.1 +2 -2
- package/man/canon-brief-approve.1 +17 -5
- package/man/canon-brief-check.1 +2 -2
- package/man/canon-brief-show.1 +6 -3
- package/man/canon-brief.1 +8 -7
- package/man/canon-change-new.1 +4 -4
- package/man/canon-change.1 +3 -3
- package/man/canon-completion.1 +2 -2
- package/man/canon-context-pack-add.1 +2 -2
- package/man/canon-context-pack-show.1 +2 -2
- package/man/canon-context-pack-verify.1 +2 -2
- package/man/canon-context-pack.1 +2 -2
- package/man/canon-context.1 +2 -2
- package/man/canon-dashboard.1 +2 -2
- package/man/canon-demo-init.1 +2 -2
- package/man/canon-demo-review.1 +2 -2
- package/man/canon-demo.1 +2 -2
- package/man/canon-dispatch-begin.1 +10 -10
- package/man/canon-dispatch-diff.1 +2 -2
- package/man/canon-dispatch-end.1 +2 -2
- package/man/canon-dispatch.1 +2 -2
- package/man/canon-divergence-accept.1 +15 -6
- package/man/canon-divergence-add.1 +6 -6
- package/man/canon-divergence-defer.1 +6 -6
- package/man/canon-divergence-list.1 +2 -2
- package/man/canon-divergence-resolve.1 +6 -6
- package/man/canon-divergence.1 +2 -2
- package/man/canon-evidence-add.1 +16 -16
- package/man/canon-evidence-approval-payload.1 +10 -10
- package/man/canon-evidence-audit.1 +10 -10
- package/man/canon-evidence.1 +3 -3
- package/man/canon-export.1 +2 -2
- package/man/canon-feature-new.1 +6 -6
- package/man/canon-feature.1 +2 -2
- package/man/canon-finding-add.1 +11 -11
- package/man/canon-finding-close.1 +8 -8
- package/man/canon-finding-list.1 +4 -4
- package/man/canon-finding.1 +4 -4
- package/man/canon-format.1 +2 -2
- package/man/canon-gate-check.1 +2 -2
- package/man/canon-gate-install-hooks.1 +2 -2
- package/man/canon-gate-promote.1 +2 -2
- package/man/canon-gate.1 +2 -2
- package/man/canon-ingest-plans.1 +2 -2
- package/man/canon-ingest-records.1 +4 -4
- package/man/canon-ingest-sessions.1 +2 -2
- package/man/canon-ingest.1 +2 -2
- package/man/canon-init.1 +2 -2
- package/man/canon-inventory-sync.1 +2 -2
- package/man/canon-inventory.1 +2 -2
- package/man/canon-ledger-compact.1 +2 -2
- package/man/canon-ledger.1 +2 -2
- package/man/canon-migrate.1 +20 -3
- package/man/canon-plugin-sync.1 +2 -2
- package/man/canon-plugin.1 +2 -2
- package/man/canon-policy-approve.1 +9 -3
- package/man/canon-policy-show.1 +2 -2
- package/man/canon-policy.1 +2 -2
- package/man/canon-prompt-add.1 +2 -2
- package/man/canon-prompt-show.1 +2 -2
- package/man/canon-prompt.1 +2 -2
- package/man/canon-purge.1 +2 -2
- package/man/canon-query.1 +5 -5
- package/man/canon-regime-show.1 +2 -2
- package/man/canon-regime.1 +2 -2
- package/man/canon-report-build.1 +2 -2
- package/man/canon-report-check.1 +2 -2
- package/man/canon-report-snapshot.1 +2 -2
- package/man/canon-report.1 +2 -2
- package/man/canon-retrieve.1 +5 -5
- package/man/canon-review-change.1 +6 -6
- package/man/canon-review-scenario.1 +6 -6
- package/man/canon-review.1 +2 -2
- package/man/canon-scenario-new.1 +10 -10
- package/man/canon-scenario.1 +2 -2
- package/man/canon-schema.1 +2 -2
- package/man/canon-search.1 +104 -0
- package/man/canon-selftest.1 +2 -2
- package/man/canon-skills-check.1 +2 -2
- package/man/canon-skills-doctor.1 +2 -2
- package/man/canon-skills-install.1 +2 -2
- package/man/canon-skills-show.1 +2 -2
- package/man/canon-skills.1 +2 -2
- package/man/canon-status.1 +7 -2
- package/man/canon-strategy-approval-payload.1 +2 -2
- package/man/canon-strategy-promote.1 +2 -2
- package/man/canon-strategy-rollback.1 +5 -5
- package/man/canon-strategy.1 +2 -2
- package/man/canon-subject-adopt.1 +4 -4
- package/man/canon-subject-move.1 +5 -5
- package/man/canon-subject-new.1 +5 -5
- package/man/canon-subject-show.1 +2 -2
- package/man/canon-subject-unadopt.1 +5 -5
- package/man/canon-subject.1 +2 -2
- package/man/canon-task-done.1 +2 -2
- package/man/canon-task.1 +2 -2
- package/man/canon-tier-age.1 +2 -2
- package/man/canon-tier.1 +2 -2
- package/man/canon-trace.1 +56 -0
- package/man/canon.1 +8 -2
- package/package.json +4 -4
|
@@ -4,10 +4,12 @@ You turn a request into an approved scope: a subject, a change and a PRD
|
|
|
4
4
|
brief the human answers once. You build nothing. Declare the role with
|
|
5
5
|
`CANON_ROLE=planner` (or `--as planner`); `canon status` and `meta.next`
|
|
6
6
|
then show your steps and count the rest under `waitingOn`. The approvals are
|
|
7
|
-
the human's: `brief approve`, `policy approve
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
the human's: `brief approve`, `policy approve`, `divergence accept` and the
|
|
8
|
+
`migrate --commit` that re-binds `Approved:` lines refuse every agent role
|
|
9
|
+
(`HUMAN_ONLY`, `retryable: false`) unless you record the answer the human gave
|
|
10
|
+
you in the conversation, with `--relayed-via <tool>` (step 4). Without a human's
|
|
11
|
+
explicit answer you never run them, and you never remove or unset your role
|
|
12
|
+
(`env -u CANON_ROLE`, dropping `--as`) to get past the refusal.
|
|
11
13
|
|
|
12
14
|
## Commands
|
|
13
15
|
|
|
@@ -30,17 +32,17 @@ canon brief check
|
|
|
30
32
|
```
|
|
31
33
|
```text
|
|
32
34
|
# Show where the change stands and the next one to three steps; never edits
|
|
33
|
-
canon brief show [<CHANGE_ID>]
|
|
35
|
+
canon brief show [<CHANGE_ID>] [--body]
|
|
34
36
|
```
|
|
35
37
|
```bash
|
|
36
38
|
canon brief show
|
|
37
39
|
```
|
|
38
40
|
```text
|
|
39
41
|
# Write .canon/changes/<slug>/brief.md, import it, and adopt it into a subject
|
|
40
|
-
canon change new <CHANGE_ID> --subject
|
|
42
|
+
canon change new <CHANGE_ID> --subject <SUBJECT_ID> --title <TEXT> [--change-kind <feature|chore>] [--input]
|
|
41
43
|
```
|
|
42
44
|
```bash
|
|
43
|
-
canon change new add-search --subject
|
|
45
|
+
canon change new add-search --subject demo --title "Add search"
|
|
44
46
|
```
|
|
45
47
|
```text
|
|
46
48
|
# Write the shell completion script for canon (bash, zsh or fish)
|
|
@@ -65,17 +67,17 @@ canon divergence list --as-of 2030-01-01
|
|
|
65
67
|
```
|
|
66
68
|
```text
|
|
67
69
|
# Create a fresh .feature file for a new area.surface
|
|
68
|
-
canon feature new <SURFACE> --title <TEXT> [--actor
|
|
70
|
+
canon feature new <SURFACE> --title <TEXT> [--actor <ACTOR_ID>] [--session <SESSION_ID>] [--project <PROJECT_ID>] [--input]
|
|
69
71
|
```
|
|
70
72
|
```bash
|
|
71
73
|
canon feature new billing.invoice --title Invoices
|
|
72
74
|
```
|
|
73
75
|
```text
|
|
74
76
|
# List a change's committed findings at their latest version
|
|
75
|
-
canon finding list --change
|
|
77
|
+
canon finding list --change <CHANGE_ID> [--open] [--limit <N> | --all] [--cursor <CURSOR>] [--fields <FIELDS>]
|
|
76
78
|
```
|
|
77
79
|
```bash
|
|
78
|
-
canon finding list --change
|
|
80
|
+
canon finding list --change add-login
|
|
79
81
|
```
|
|
80
82
|
```text
|
|
81
83
|
# Validate a spec/artifact corpus against canon's format
|
|
@@ -93,21 +95,21 @@ canon gate check
|
|
|
93
95
|
```
|
|
94
96
|
```text
|
|
95
97
|
# Read stored records across every storage tier
|
|
96
|
-
canon query --kind <change|task|scenario|session|run|event|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding> [--since <TIMESTAMP>] [--plugin
|
|
98
|
+
canon query --kind <change|task|scenario|session|run|event|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding> [--since <TIMESTAMP>] [--plugin <PLUGIN_ID> | --history] [--change <CHANGE_ID>] [--status <STATUS>] [--domain <NAME>] [--include-sensitive] [--limit <N> | --all] [--cursor <CURSOR>] [--fields <FIELDS>]
|
|
97
99
|
```
|
|
98
100
|
```bash
|
|
99
101
|
canon query --kind evidence
|
|
100
102
|
```
|
|
101
103
|
```text
|
|
102
104
|
# Fetch role-scoped strategy guidance
|
|
103
|
-
canon retrieve --for-role <ROLE> [--regime <KEY>] [--domain <NAME>] [--subject
|
|
105
|
+
canon retrieve --for-role <ROLE> [--regime <KEY>] [--domain <NAME>] [--subject <SUBJECT_ID>] [--limit <N>]
|
|
104
106
|
```
|
|
105
107
|
```bash
|
|
106
108
|
canon retrieve --for-role reviewer --domain dev --limit 20
|
|
107
109
|
```
|
|
108
110
|
```text
|
|
109
111
|
# Append a tagged scenario stub to its .feature file (created if missing); many at once with `--input`
|
|
110
|
-
canon scenario new <SCENARIO_ID> --title <TEXT> [--subject
|
|
112
|
+
canon scenario new <SCENARIO_ID> --title <TEXT> [--subject <SUBJECT_ID>] [--lane <NAME>] [--case <NAME>] [--flow <FLOW_ID>] [--change <CHANGE_ID> (with --flow)] [--actor <ACTOR_ID>] [--session <SESSION_ID>] [--feature <FILE>] [--project <PROJECT_ID>] [--input]
|
|
111
113
|
```
|
|
112
114
|
```bash
|
|
113
115
|
canon scenario new auth.login.02 --title "Sign out" --feature .canon/specs/kind=feature/area=auth/login.feature
|
|
@@ -120,6 +122,13 @@ canon schema [<PATH>]* [--errors | --error <CODE>]
|
|
|
120
122
|
canon schema evidence add
|
|
121
123
|
```
|
|
122
124
|
```text
|
|
125
|
+
# Search records, brief sections and scenario text, with each hit's neighbors in the record graph
|
|
126
|
+
canon search <TEXT> [--kind <change|task|scenario|session|run|event|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding|brief>]* [--expand <N>] [--limit <N>]
|
|
127
|
+
```
|
|
128
|
+
```bash
|
|
129
|
+
canon search timeout --kind finding
|
|
130
|
+
```
|
|
131
|
+
```text
|
|
123
132
|
# Print a guide built into this binary (markdown on stdout); the installed SKILL.md is a stub that points here
|
|
124
133
|
canon skills show <NAME> [--full]
|
|
125
134
|
```
|
|
@@ -135,24 +144,31 @@ canon status
|
|
|
135
144
|
```
|
|
136
145
|
```text
|
|
137
146
|
# Link an imported plan change to a subject (adopting it under another subject adds that subject; a change may belong to several)
|
|
138
|
-
canon subject adopt <SUBJECT_ID> --change
|
|
147
|
+
canon subject adopt <SUBJECT_ID> --change <CHANGE_ID> [--dry-run] [--input]
|
|
139
148
|
```
|
|
140
149
|
```bash
|
|
141
|
-
canon subject adopt demo --change
|
|
150
|
+
canon subject adopt demo --change add-login
|
|
142
151
|
```
|
|
143
152
|
```text
|
|
144
153
|
# Author a new subject at status `proposed`
|
|
145
|
-
canon subject new <SUBJECT_ID> --domain <NAME> --title <TEXT> [--summary <TEXT>] [--owner-role <ROLE>] [--actor
|
|
154
|
+
canon subject new <SUBJECT_ID> --domain <NAME> --title <TEXT> [--summary <TEXT>] [--owner-role <ROLE>] [--actor <ACTOR_ID>] [--session <SESSION_ID>] [--input]
|
|
146
155
|
```
|
|
147
156
|
```bash
|
|
148
157
|
canon subject new payments --domain dev --title Payments
|
|
149
158
|
```
|
|
150
159
|
```text
|
|
151
160
|
# Take a change back out of a subject (the mirror of adopt; refused for a change whose brief is approved)
|
|
152
|
-
canon subject unadopt <SUBJECT_ID> --change
|
|
161
|
+
canon subject unadopt <SUBJECT_ID> --change <CHANGE_ID> [--dry-run] [--input]
|
|
162
|
+
```
|
|
163
|
+
```bash
|
|
164
|
+
canon subject unadopt demo --change add-login
|
|
165
|
+
```
|
|
166
|
+
```text
|
|
167
|
+
# Follow a finding's review loop in time order: review, finding, fix, re-review, evidence
|
|
168
|
+
canon trace <ID>
|
|
153
169
|
```
|
|
154
170
|
```bash
|
|
155
|
-
canon
|
|
171
|
+
canon trace add-login_1_1
|
|
156
172
|
```
|
|
157
173
|
<!-- canon:generated commands-planner end -->
|
|
158
174
|
|
|
@@ -180,10 +196,11 @@ ids); the human step comes after it. A policy that no longer matches its approva
|
|
|
180
196
|
`building`, `verifying` or `shipped` subject warns (stderr and JSON
|
|
181
197
|
`meta.warnings`) until its brief is approved: evidence for its existing scenarios is not
|
|
182
198
|
frozen and the subject can still be reopened and shipped for its approved
|
|
183
|
-
scope while no scenario is tagged for the draft
|
|
184
|
-
is, the subject cannot ship before the approval.
|
|
185
|
-
A scenario answers to the changes its `@flow:<change>.<F-id>`
|
|
186
|
-
tags name (`canon scenario new --flow <F-id>` tags one for this change)
|
|
199
|
+
scope while no scenario is tagged for the draft and it was never approved
|
|
200
|
+
(a pending draft); once one is, the subject cannot ship before the approval.
|
|
201
|
+
A tagged scenario answers to the changes its `@flow:<change>.<F-id>`
|
|
202
|
+
tags name (`canon scenario new --flow <F-id>` tags one for this change);
|
|
203
|
+
an untagged one answers to every change with an `Approved:` line.
|
|
187
204
|
To park a draft that should not gate a live subject, `subject unadopt`
|
|
188
205
|
it and adopt it into a `proposed` subject. Inside an approved scope there is no new
|
|
189
206
|
subject or change: a fix or follow-up stays in the existing change.
|
|
@@ -228,26 +245,63 @@ ids); the human step comes after it. A policy that no longer matches its approva
|
|
|
228
245
|
the advisories are gone or each remaining one is waived with a reason.
|
|
229
246
|
It never blocks approval, but you do not hand the human a brief with
|
|
230
247
|
unexamined advisories.
|
|
231
|
-
4. **
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
or evidence) until the human answers. The approval is never assumed, even
|
|
236
|
-
when the human said they cannot answer until you report: the brief is
|
|
237
|
-
that report. The one answer approves the brief and the policy
|
|
248
|
+
4. **Show, ask, count only an explicit approval.** Build nothing for that
|
|
249
|
+
scope (no scenarios, code or evidence) until the human has answered. The
|
|
250
|
+
approval is never assumed, even when the human said they cannot answer
|
|
251
|
+
until you show the brief. The one answer approves the brief and the policy
|
|
238
252
|
(`.canon/policy.yaml`, written by `canon init`), which is what the gate
|
|
239
253
|
grades the work against.
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
254
|
+
- **Show.** `canon brief show <slug> --body` prints the brief file's bytes
|
|
255
|
+
as they are and, as its last line, `digest: sha256:<hex>`, the value
|
|
256
|
+
`brief approve` records. Send that output to the human's own view; never
|
|
257
|
+
retype or paraphrase the brief into the conversation. In omp, redirect it
|
|
258
|
+
to `out://` (`canon brief show add-login --body > out://add-login`).
|
|
259
|
+
`out://` is off for subagents and non-TUI sessions (the redirect then
|
|
260
|
+
errors) and caps a reply at 64 KiB: there, and in a harness with no such
|
|
261
|
+
channel, leave the tool output visible, which is the same. Read the digest alone with `canon brief show add-login --body |
|
|
262
|
+
tail -n 1`. Show every brief of one request, each with its digest.
|
|
263
|
+
- **Ask.** Use the harness's question tool: `ask` in omp, `AskUserQuestion`
|
|
264
|
+
in Claude Code; a harness without one, ask in the chat and wait for the
|
|
265
|
+
reply. Two choices: approve, or request changes. Several briefs are one
|
|
266
|
+
question. Say in the brief's language what is approved: the brief and
|
|
267
|
+
the policy.
|
|
268
|
+
- **Count only an explicit approval.** The approve choice, or the human
|
|
269
|
+
saying in the chat that they approve. A question, a condition ("yes, if
|
|
270
|
+
…") or an approval of part of it is a revision request: change the brief,
|
|
271
|
+
`brief check` until clean, show it again and ask again. No answer means
|
|
272
|
+
nothing is recorded: wait.
|
|
273
|
+
A subagent has no question tool and no human in front of it: the
|
|
274
|
+
orchestrator (the session talking to the human) shows, asks and records.
|
|
275
|
+
They may also approve on `canon dashboard` (the briefs page,
|
|
276
|
+
`/briefs.html`); you never click Approve or fill that form yourself.
|
|
277
|
+
5. **Record the answer you were given.** Run `brief approve` with the relay
|
|
278
|
+
option: `canon brief approve add-login --approver <their name> --note "<their
|
|
279
|
+
answer, as they gave it>" --relayed-via <ask|AskUserQuestion|chat> --actor
|
|
280
|
+
<your actor id> --digest add-login=<the digest you showed>` (several slugs:
|
|
281
|
+
one `--digest <slug>=<digest>` each, one answer for all, nothing written if
|
|
282
|
+
any is refused). `--actor` may be `CANON_ACTOR` instead. The record keeps
|
|
283
|
+
their name and words and says that you, with your role and actor, recorded
|
|
284
|
+
them through that tool: the `Approved:` line gains `(relayed by <role>
|
|
285
|
+
<actor> via <tool>)`, which is outside the digest, and `status`, `brief
|
|
286
|
+
show` and the dashboard name it. Never approve in their name without their
|
|
287
|
+
answer, never write the answer for them, and never edit the policy to make
|
|
288
|
+
the gate pass. A digest that differs from the brief now
|
|
289
|
+
(`RELAY_DIGEST_MISMATCH`) means the brief changed after they saw it: show
|
|
290
|
+
it again and ask again; nothing was written. Without `--relayed-via` the call is
|
|
291
|
+
`HUMAN_ONLY`; with it and no role declared, `USAGE`. When `canon.yaml`
|
|
292
|
+
turns relaying off (`approval: { relay: deny }`), the refusal names that key:
|
|
293
|
+
report the human's call (`canon brief approve add-login --approver <their
|
|
294
|
+
name> --note "<their own words>"`) and wait for them to run it. Never
|
|
295
|
+
remove or unset your role (`env -u CANON_ROLE`, dropping `--as`) to run it.
|
|
296
|
+
`canon policy approve`, `canon divergence accept` and `canon migrate
|
|
297
|
+
--commit --plan-digest <d>` follow the same procedure, each taking
|
|
298
|
+
`--approver <their name> --note "<their answer>" --relayed-via <tool>` (and
|
|
299
|
+
`--actor <your actor id>`, which `divergence accept` already requires): show what is approved (the policy file, the divergent
|
|
300
|
+
evidence with its reason and tracking reference, the migrate plan), ask,
|
|
301
|
+
count only an explicit approval, then record with the relay option.
|
|
248
302
|
`canon brief show <slug>` then reports `state: approved`. A brief edited
|
|
249
303
|
after its approval is not approved (`BRIEF_CHANGED_SINCE_APPROVAL`): it
|
|
250
|
-
needs a new answer and a new `brief approve
|
|
304
|
+
needs a new answer, shown and asked again, and a new `brief approve`. A follow-up that
|
|
251
305
|
adds or changes a step of the brief is a scope change and needs a new
|
|
252
306
|
answer.
|
|
253
307
|
|
|
@@ -258,17 +312,17 @@ approval.
|
|
|
258
312
|
|
|
259
313
|
**Done when:** `canon brief check add-login` exits 0 (no blockers, and the
|
|
260
314
|
prose advisories are gone or waived with a reason) and `canon brief show
|
|
261
|
-
add-login` reports `state: ready`:
|
|
262
|
-
|
|
263
|
-
approved`; read it in `data.state` of `canon brief show
|
|
264
|
-
Nothing else starts before that.
|
|
315
|
+
add-login` reports `state: ready`: show it to the human and ask (step 4). The scope is approved
|
|
316
|
+
when you have recorded their explicit approval (step 5) and the same command
|
|
317
|
+
reports `state: approved`; read it in `data.state` of `canon brief show
|
|
318
|
+
add-login --json`. Nothing else starts before that.
|
|
265
319
|
|
|
266
320
|
## Non-behavior work is a chore
|
|
267
321
|
|
|
268
322
|
A refactor, dependency, build, CI or infra change that alters nothing a user
|
|
269
323
|
can observe: `change new --change-kind chore`. Its brief is short (intent,
|
|
270
324
|
category, invariants, checks, out of scope) and approved like any brief, one
|
|
271
|
-
human
|
|
325
|
+
human answer. A chore adds no scenarios: the
|
|
272
326
|
implementer runs the subject's suite again where the code changed and binds
|
|
273
327
|
it with `canon evidence add --all-scenarios` (a docs-only chore changes no
|
|
274
328
|
code and needs no new evidence), then the reviewer records one
|
|
@@ -295,9 +349,9 @@ old column, delete the old format) in its own later change.
|
|
|
295
349
|
|
|
296
350
|
| The thought | The reality |
|
|
297
351
|
|---|---|
|
|
298
|
-
| "The human is unavailable; I will assume the approval." | Never.
|
|
352
|
+
| "The human is unavailable; I will assume the approval." | Never. Show the brief and ask; without an explicit answer nothing is recorded and nothing is built. Put open questions into Questions and assumptions. |
|
|
299
353
|
| "This could change policy, but I will decide it." | Anything that could change policy goes to the questions. |
|
|
300
|
-
| "A small follow-up needs no new answer." | A follow-up that adds or changes a flow step is a scope change and needs a new `brief approve`. |
|
|
354
|
+
| "A small follow-up needs no new answer." | A follow-up that adds or changes a flow step is a scope change and needs a new answer and a new `brief approve`. |
|
|
301
355
|
| "This migration is just a chore." | Data, interface or output changes are feature changes. |
|
|
302
356
|
| "Put the file and line in the brief so nobody has to look." | Paths rot; describe behavior. |
|
|
303
357
|
|
|
@@ -4,10 +4,11 @@ You are the independent second look. Declare the role with
|
|
|
4
4
|
`CANON_ROLE=reviewer` (or `--as reviewer`); `--role` on `review scenario`,
|
|
5
5
|
`review change` and `finding add` then defaults to `reviewer`. The human's
|
|
6
6
|
acts refuse you (`HUMAN_ONLY`): `brief approve`, `policy approve` and
|
|
7
|
-
`divergence accept
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
`divergence accept`, unless you record the answer the human gave you in the
|
|
8
|
+
conversation with `--relayed-via <tool>` (the divergence acceptance below).
|
|
9
|
+
Name what the human has to decide; never look for another flag that grants it.
|
|
10
|
+
You never run them without that answer, and never remove or unset your role
|
|
11
|
+
(`env -u CANON_ROLE`, dropping `--as`) to get past the refusal.
|
|
11
12
|
|
|
12
13
|
## Commands
|
|
13
14
|
|
|
@@ -30,7 +31,7 @@ canon brief check
|
|
|
30
31
|
```
|
|
31
32
|
```text
|
|
32
33
|
# Show where the change stands and the next one to three steps; never edits
|
|
33
|
-
canon brief show [<CHANGE_ID>]
|
|
34
|
+
canon brief show [<CHANGE_ID>] [--body]
|
|
34
35
|
```
|
|
35
36
|
```bash
|
|
36
37
|
canon brief show
|
|
@@ -51,17 +52,17 @@ canon context
|
|
|
51
52
|
```
|
|
52
53
|
```text
|
|
53
54
|
# Add a divergence candidate, staged with no run_seq yet
|
|
54
|
-
canon divergence add <SCENARIO_ID> --actor
|
|
55
|
+
canon divergence add <SCENARIO_ID> --actor <ACTOR_ID> [--project <PROJECT_ID>] [--rev <REV>] [--state <open|still-divergent|resolved|deferred>] [--reason <TEXT>] [--expiry <TIMESTAMP>] [--round <N>] [--session <SESSION_ID>] [--detail <TEXT>] [--role <ROLE>] [--promote | --no-promote] [--input]
|
|
55
56
|
```
|
|
56
57
|
```bash
|
|
57
|
-
canon divergence add auth.login.01 --actor
|
|
58
|
+
canon divergence add auth.login.01 --actor alice --role reviewer
|
|
58
59
|
```
|
|
59
60
|
```text
|
|
60
61
|
# Directly record a deferred divergence (requires --reason/--expiry)
|
|
61
|
-
canon divergence defer <SCENARIO_ID> --actor
|
|
62
|
+
canon divergence defer <SCENARIO_ID> --actor <ACTOR_ID> --reason <TEXT> --expiry <TIMESTAMP> [--project <PROJECT_ID>] [--rev <REV>] [--round <N>] [--session <SESSION_ID>] [--role <ROLE>] [--input]
|
|
62
63
|
```
|
|
63
64
|
```bash
|
|
64
|
-
canon divergence defer auth.login.01 --actor
|
|
65
|
+
canon divergence defer auth.login.01 --actor alice --reason "waiting on the vendor" --expiry 2030-01-01T00:00:00Z --role reviewer
|
|
65
66
|
```
|
|
66
67
|
```text
|
|
67
68
|
# List the current divergence burn-down state
|
|
@@ -72,31 +73,31 @@ canon divergence list --as-of 2030-01-01
|
|
|
72
73
|
```
|
|
73
74
|
```text
|
|
74
75
|
# Directly record a resolved divergence
|
|
75
|
-
canon divergence resolve <SCENARIO_ID> --actor
|
|
76
|
+
canon divergence resolve <SCENARIO_ID> --actor <ACTOR_ID> [--project <PROJECT_ID>] [--rev <REV>] [--round <N>] [--session <SESSION_ID>] [--detail <TEXT>] [--role <ROLE>] [--input]
|
|
76
77
|
```
|
|
77
78
|
```bash
|
|
78
|
-
canon divergence resolve auth.login.01 --actor
|
|
79
|
+
canon divergence resolve auth.login.01 --actor alice --role reviewer
|
|
79
80
|
```
|
|
80
81
|
```text
|
|
81
82
|
# Record one code-review finding
|
|
82
|
-
canon finding add --change
|
|
83
|
+
canon finding add --change <CHANGE_ID> --round <N> --seq <N> --severity <blocker|should-fix|note> --actor <ACTOR_ID> --summary <TEXT> [--disposition <open|fixed|rejected|deferred>] [--rev <REV>] [--resolution-rev <REV>] [--introduced-rev <REV>] [--introduced-unknown] [--review <REVIEW_ID>] [--file-ref <TEXT>] [--scenario <SCENARIO_ID>]* [--role <ROLE>] [--session <SESSION_ID>] [--promote | --no-promote] [--input]
|
|
83
84
|
```
|
|
84
85
|
```bash
|
|
85
|
-
canon finding add --change
|
|
86
|
+
canon finding add --change add-login --round 1 --seq 2 --severity should-fix --introduced-unknown --actor alice --summary "Token is logged"
|
|
86
87
|
```
|
|
87
88
|
```text
|
|
88
89
|
# Move an already-committed finding's disposition
|
|
89
|
-
canon finding close <CHANGE_ID> --round <N> --seq <N> --disposition <open|fixed|rejected|deferred> [--resolution-rev <REV>] [--reason <TEXT>] [--actor
|
|
90
|
+
canon finding close <CHANGE_ID> --round <N> --seq <N> --disposition <open|fixed|rejected|deferred> [--resolution-rev <REV>] [--reason <TEXT>] [--actor <ACTOR_ID>] [--role <ROLE>] [--session <SESSION_ID>] [--promote | --no-promote] [--input]
|
|
90
91
|
```
|
|
91
92
|
```bash
|
|
92
93
|
canon finding close add-login --round 1 --seq 1 --disposition rejected --reason "works as designed"
|
|
93
94
|
```
|
|
94
95
|
```text
|
|
95
96
|
# List a change's committed findings at their latest version
|
|
96
|
-
canon finding list --change
|
|
97
|
+
canon finding list --change <CHANGE_ID> [--open] [--limit <N> | --all] [--cursor <CURSOR>] [--fields <FIELDS>]
|
|
97
98
|
```
|
|
98
99
|
```bash
|
|
99
|
-
canon finding list --change
|
|
100
|
+
canon finding list --change add-login
|
|
100
101
|
```
|
|
101
102
|
```text
|
|
102
103
|
# Validate a spec/artifact corpus against canon's format
|
|
@@ -114,31 +115,31 @@ canon gate check
|
|
|
114
115
|
```
|
|
115
116
|
```text
|
|
116
117
|
# Read stored records across every storage tier
|
|
117
|
-
canon query --kind <change|task|scenario|session|run|event|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding> [--since <TIMESTAMP>] [--plugin
|
|
118
|
+
canon query --kind <change|task|scenario|session|run|event|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding> [--since <TIMESTAMP>] [--plugin <PLUGIN_ID> | --history] [--change <CHANGE_ID>] [--status <STATUS>] [--domain <NAME>] [--include-sensitive] [--limit <N> | --all] [--cursor <CURSOR>] [--fields <FIELDS>]
|
|
118
119
|
```
|
|
119
120
|
```bash
|
|
120
121
|
canon query --kind evidence
|
|
121
122
|
```
|
|
122
123
|
```text
|
|
123
124
|
# Fetch role-scoped strategy guidance
|
|
124
|
-
canon retrieve --for-role <ROLE> [--regime <KEY>] [--domain <NAME>] [--subject
|
|
125
|
+
canon retrieve --for-role <ROLE> [--regime <KEY>] [--domain <NAME>] [--subject <SUBJECT_ID>] [--limit <N>]
|
|
125
126
|
```
|
|
126
127
|
```bash
|
|
127
128
|
canon retrieve --for-role reviewer --domain dev --limit 20
|
|
128
129
|
```
|
|
129
130
|
```text
|
|
130
131
|
# Write one attributed Review record for a chore change directly to the ledger (exactly one provenance ref required)
|
|
131
|
-
canon review change <CHANGE_ID> --actor
|
|
132
|
+
canon review change <CHANGE_ID> --actor <ACTOR_ID> (--upstream-ref <TEXT> | --original-spec-ref <TEXT>) [--project <PROJECT_ID>] [--rev <REV>] [--role <ROLE>] [--session <SESSION_ID>] [--review-outcome <signed|indeterminate|unavailable>] [--reviewer-provider <NAME>] [--reviewer-model <NAME>] [--reviewer-harness <NAME>] [--artifact <PATH>]* [--max-artifact-mib <N>] [--input]
|
|
132
133
|
```
|
|
133
134
|
```bash
|
|
134
|
-
canon review change add-login --actor
|
|
135
|
+
canon review change add-login --actor alice --role reviewer --original-spec-ref docs/prd.md
|
|
135
136
|
```
|
|
136
137
|
```text
|
|
137
138
|
# Write one attributed Review record per scenario directly to the ledger, nothing to promote (exactly one provenance ref required)
|
|
138
|
-
canon review scenario <SCENARIO_ID>+ --actor
|
|
139
|
+
canon review scenario <SCENARIO_ID>+ --actor <ACTOR_ID> (--upstream-ref <TEXT> | --original-spec-ref <TEXT>) [--project <PROJECT_ID>] [--rev <REV>] [--role <ROLE>] [--session <SESSION_ID>] [--review-outcome <signed|indeterminate|unavailable>] [--reviewer-provider <NAME>] [--reviewer-model <NAME>] [--reviewer-harness <NAME>] [--artifact <PATH>]* [--max-artifact-mib <N>] [--input]
|
|
139
140
|
```
|
|
140
141
|
```bash
|
|
141
|
-
canon review scenario auth.login.01 --actor
|
|
142
|
+
canon review scenario auth.login.01 --actor alice --role reviewer --original-spec-ref docs/prd.md
|
|
142
143
|
```
|
|
143
144
|
```text
|
|
144
145
|
# Describe canon's own commands
|
|
@@ -148,6 +149,13 @@ canon schema [<PATH>]* [--errors | --error <CODE>]
|
|
|
148
149
|
canon schema evidence add
|
|
149
150
|
```
|
|
150
151
|
```text
|
|
152
|
+
# Search records, brief sections and scenario text, with each hit's neighbors in the record graph
|
|
153
|
+
canon search <TEXT> [--kind <change|task|scenario|session|run|event|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding|brief>]* [--expand <N>] [--limit <N>]
|
|
154
|
+
```
|
|
155
|
+
```bash
|
|
156
|
+
canon search timeout --kind finding
|
|
157
|
+
```
|
|
158
|
+
```text
|
|
151
159
|
# Print a guide built into this binary (markdown on stdout); the installed SKILL.md is a stub that points here
|
|
152
160
|
canon skills show <NAME> [--full]
|
|
153
161
|
```
|
|
@@ -161,6 +169,13 @@ canon status [--fields <FIELDS>]
|
|
|
161
169
|
```bash
|
|
162
170
|
canon status
|
|
163
171
|
```
|
|
172
|
+
```text
|
|
173
|
+
# Follow a finding's review loop in time order: review, finding, fix, re-review, evidence
|
|
174
|
+
canon trace <ID>
|
|
175
|
+
```
|
|
176
|
+
```bash
|
|
177
|
+
canon trace add-login_1_1
|
|
178
|
+
```
|
|
164
179
|
<!-- canon:generated commands-reviewer end -->
|
|
165
180
|
|
|
166
181
|
`review scenario` needs exactly one of `--upstream-ref <ref>` or
|
|
@@ -174,20 +189,20 @@ found goes in `finding add --summary`.
|
|
|
174
189
|
The forms you reach for most (the story's ids; swap in yours):
|
|
175
190
|
|
|
176
191
|
```bash
|
|
177
|
-
canon review scenario auth.login.01 auth.login.02 --actor
|
|
178
|
-
canon review scenario auth.login.01 --actor
|
|
179
|
-
canon review change add-login --actor
|
|
180
|
-
canon finding add --change
|
|
192
|
+
canon review scenario auth.login.01 auth.login.02 --actor reviewer-1 --session session-7 --original-spec-ref docs/prd.md
|
|
193
|
+
canon review scenario auth.login.01 --actor reviewer-1 --session session-7 --review-outcome indeterminate --original-spec-ref docs/prd.md
|
|
194
|
+
canon review change add-login --actor reviewer-1 --session session-7 --original-spec-ref docs/prd.md
|
|
195
|
+
canon finding add --change add-login --round 1 --seq 2 --severity blocker --actor reviewer-1 --session session-7 --summary "No rate limit" --scenario auth.login.01 --scenario auth.login.02 --introduced-rev HEAD~3
|
|
181
196
|
canon finding close add-login --round 1 --seq 2 --disposition fixed --resolution-rev HEAD
|
|
182
197
|
canon finding close add-login --round 1 --seq 3 --disposition rejected --reason "works as designed"
|
|
183
|
-
canon finding list --change
|
|
198
|
+
canon finding list --change add-login --open
|
|
184
199
|
```
|
|
185
200
|
|
|
186
201
|
Several findings at once are one `--input` array (the keys are option names
|
|
187
202
|
in camelCase):
|
|
188
203
|
|
|
189
204
|
```text
|
|
190
|
-
canon finding add --input '[{"
|
|
205
|
+
canon finding add --input '[{"change":"add-login","round":1,"seq":3,"severity":"note","actor":"reviewer-1","summary":"Token is logged"},{"change":"add-login","round":1,"seq":4,"severity":"should-fix","introducedUnknown":true,"actor":"reviewer-1","summary":"Error text leaks the user name"}]'
|
|
191
206
|
```
|
|
192
207
|
|
|
193
208
|
A review pins what you saw: the scenario's digest plus the verdict
|
|
@@ -210,8 +225,8 @@ or `status` again.
|
|
|
210
225
|
## Separate session
|
|
211
226
|
|
|
212
227
|
You run as a separate process with your own session id, never the session
|
|
213
|
-
that wrote the code and evidence under another `--actor
|
|
214
|
-
`--session
|
|
228
|
+
that wrote the code and evidence under another `--actor` or
|
|
229
|
+
`--session` label. Pass your real session id as `--session` on
|
|
215
230
|
everything you record. A harness with no subagent tool starts you (a new
|
|
216
231
|
`codex exec` run in this repo, say). Review happens on every change.
|
|
217
232
|
|
|
@@ -257,6 +272,10 @@ should make it fail and run it if it is cheap; if the test stays green, record
|
|
|
257
272
|
the finding. For a fix, read `canon query --kind evidence --history --json`
|
|
258
273
|
for that scenario's records: expect an earlier non-faithful version, or a
|
|
259
274
|
named closest reproduction in `--ref`; record a finding when neither exists.
|
|
275
|
+
`canon trace <finding key>` lists the loop around a finding in time order (the
|
|
276
|
+
review that raised it, the fix, the re-review, the evidence at those commits);
|
|
277
|
+
`canon search "<text>"` finds earlier findings and the scenarios about the same
|
|
278
|
+
thing.
|
|
260
279
|
Put one blast-radius fact in the finding or review `--summary`: what else the
|
|
261
280
|
change touches that the checks do not exercise. Read the waivers too:
|
|
262
281
|
`status` lists every `--override-reason` an implementer or the orchestrator
|
|
@@ -269,14 +288,21 @@ sign.
|
|
|
269
288
|
`divergence accept` is for a scenario whose honest evidence is `divergent`
|
|
270
289
|
and whose gap is limited by something outside this change (an upstream
|
|
271
290
|
limit, a platform bug) and is tracked there. It records a human's decision,
|
|
272
|
-
so it refuses every agent role (`HUMAN_ONLY`), you included
|
|
273
|
-
|
|
274
|
-
change, then
|
|
275
|
-
tracking reference and an expiry when the limit
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
291
|
+
so it refuses every agent role (`HUMAN_ONLY`), you included, unless it records
|
|
292
|
+
the answer the human gave you. What you do: confirm the evidence really is
|
|
293
|
+
divergent and the limit is outside this change, then put to the human the
|
|
294
|
+
scenario ids, the reason, the tracking reference and an expiry when the limit
|
|
295
|
+
should be gone by a date, in their own view and not retyped (omp: `out://`).
|
|
296
|
+
Ask with the harness question tool (`ask` in omp, `AskUserQuestion` in Claude
|
|
297
|
+
Code, otherwise in the chat): accept the gap, or not. Only an explicit
|
|
298
|
+
approval counts; a question or a condition is not one, and no answer records
|
|
299
|
+
nothing. Then record it from a session that did not attest the evidence
|
|
300
|
+
(`DIVERGENCE_ACCEPT_REFUSED` otherwise): `canon divergence accept <ids> --actor
|
|
301
|
+
<your actor id> --reason "<why>" --tracking <ref> --approver <their name> --note
|
|
302
|
+
"<their answer>" --relayed-via <tool>`; the record carries the relay, the
|
|
303
|
+
approver and their answer. When `canon.yaml` has `approval: { relay: deny }` the
|
|
304
|
+
call is refused (`HUMAN_ONLY`, naming the key) and the human runs it themselves.
|
|
305
|
+
You never unset your role to run it. Never suggest it to skip
|
|
280
306
|
a fix the implementer can make in this change. The acceptance pins that
|
|
281
307
|
evidence: new evidence for the scenario, or its expiry, ends it, and the
|
|
282
308
|
human accepts (or the implementer fixes) again. An accepted gap counts as
|
|
@@ -302,9 +328,9 @@ covered for the ship guard and stays listed as `accepted-divergence` in
|
|
|
302
328
|
- Sign off in one batch with `review scenario <ids>`, all or nothing. It writes
|
|
303
329
|
directly; nothing to promote. canon stores and re-checks attached bytes
|
|
304
330
|
and never compares images.
|
|
305
|
-
- Pass `--scenario
|
|
331
|
+
- Pass `--scenario` for each scenario a finding is about. A blocker you
|
|
306
332
|
close `fixed` then stays blocking until the implementer records evidence
|
|
307
|
-
again for those scenarios alone (`evidence add --scenario
|
|
333
|
+
again for those scenarios alone (`evidence add --scenario <id>`); the
|
|
308
334
|
close inherits the list. A blocker naming no scenario asks for the whole
|
|
309
335
|
suite again (`evidence add --all-scenarios`), which on a big suite is
|
|
310
336
|
a long e2e run for a one-scenario fix, so name them. Your pinned review
|
|
@@ -313,7 +339,7 @@ covered for the ship guard and stays listed as `accepted-divergence` in
|
|
|
313
339
|
evidence changes a verdict or the checks and so stales your review, look
|
|
314
340
|
again before you sign it again.
|
|
315
341
|
A chore has no scenarios: review it with one change-level review, `canon
|
|
316
|
-
review change <slug> --actor
|
|
342
|
+
review change <slug> --actor <me> --session <session>
|
|
317
343
|
--upstream-ref <ref>` (or `--original-spec-ref <path>`). It signs the
|
|
318
344
|
chore's invariants and checks against the diff and pins its brief, so
|
|
319
345
|
editing the brief stales it. The chore also needs new evidence on every
|
|
@@ -322,7 +348,7 @@ covered for the ship guard and stays listed as `accepted-divergence` in
|
|
|
322
348
|
|
|
323
349
|
**Done when:** `canon gate check` lists no `unreviewed-promotion` violation
|
|
324
350
|
and no open blocker for the change (read `data.violations[]` in `canon gate
|
|
325
|
-
check --json`; `canon finding list --change
|
|
351
|
+
check --json`; `canon finding list --change add-login --open` shows the
|
|
326
352
|
open findings), or each remaining one is a finding you recorded and the
|
|
327
353
|
implementer owns. Your last write's `meta.next` names the next step.
|
|
328
354
|
|
|
@@ -344,6 +370,6 @@ disposition is a no-op too.
|
|
|
344
370
|
| "I cannot run the tests, but the evidence looks right." | Say so and record `indeterminate` or `unavailable`; never sign what you could not run. |
|
|
345
371
|
| "This is a minor defect; I will skip the finding." | Every defect is a finding; severity says how much it matters. |
|
|
346
372
|
| "I will edit the brief to fix it." | A brief defect is a finding, not an edit. |
|
|
347
|
-
| "I will accept the gap myself, the limit is real." |
|
|
373
|
+
| "I will accept the gap myself, the limit is real." | The human accepts it: ask them, and record only their explicit answer with `--relayed-via`. |
|
|
348
374
|
|
|
349
375
|
Reference: `canon skills show canon-review`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
.ie \n(.g .ds Aq \(aq
|
|
2
2
|
.el .ds Aq '
|
|
3
|
-
.TH canon-adapter-authorize 1 "authorize 0.
|
|
3
|
+
.TH canon-adapter-authorize 1 "authorize 0.32.0"
|
|
4
4
|
.SH NAME
|
|
5
5
|
canon\-adapter\-authorize \- Authorize declared capabilities against repository policy (preflight only)
|
|
6
6
|
.SH SYNOPSIS
|
|
@@ -41,4 +41,4 @@ Print help
|
|
|
41
41
|
\fB\-V\fR, \fB\-\-version\fR
|
|
42
42
|
Print version
|
|
43
43
|
.SH VERSION
|
|
44
|
-
v0.
|
|
44
|
+
v0.32.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
.ie \n(.g .ds Aq \(aq
|
|
2
2
|
.el .ds Aq '
|
|
3
|
-
.TH canon-adapter-validate 1 "validate 0.
|
|
3
|
+
.TH canon-adapter-validate 1 "validate 0.32.0"
|
|
4
4
|
.SH NAME
|
|
5
5
|
canon\-adapter\-validate \- Read and validate one provider\-neutral response envelope
|
|
6
6
|
.SH SYNOPSIS
|
|
@@ -41,4 +41,4 @@ Print help
|
|
|
41
41
|
\fB\-V\fR, \fB\-\-version\fR
|
|
42
42
|
Print version
|
|
43
43
|
.SH VERSION
|
|
44
|
-
v0.
|
|
44
|
+
v0.32.0
|
package/man/canon-adapter.1
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
.ie \n(.g .ds Aq \(aq
|
|
2
2
|
.el .ds Aq '
|
|
3
|
-
.TH canon-adapter 1 "adapter 0.
|
|
3
|
+
.TH canon-adapter 1 "adapter 0.32.0"
|
|
4
4
|
.SH NAME
|
|
5
5
|
canon\-adapter \- Validate a provider\-neutral adapter response without executing a provider
|
|
6
6
|
.SH SYNOPSIS
|
|
@@ -43,4 +43,4 @@ Examples:
|
|
|
43
43
|
canon adapter validate \-\-response response.json
|
|
44
44
|
canon adapter validate \-\-response response.json \-\-repo . \-\-json
|
|
45
45
|
.SH VERSION
|
|
46
|
-
v0.
|
|
46
|
+
v0.32.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
.ie \n(.g .ds Aq \(aq
|
|
2
2
|
.el .ds Aq '
|
|
3
|
-
.TH canon-artifacts-move 1 "move 0.
|
|
3
|
+
.TH canon-artifacts-move 1 "move 0.32.0"
|
|
4
4
|
.SH NAME
|
|
5
5
|
canon\-artifacts\-move \- Move the local artifact blobs to an object\-store tier, verify them, and remove the local copies
|
|
6
6
|
.SH SYNOPSIS
|
|
@@ -60,4 +60,4 @@ The bare run previews: it lists every upload and removal and prints a planDigest
|
|
|
60
60
|
|
|
61
61
|
Idempotent and resumable: a run stopped anywhere leaves a repo the gate still passes, and the next run finishes; a second run finds nothing to do. A blob whose bytes do not match its name is never moved. Moving back to local is refused; `\-\-tier local` on a local repo is a no\-op.
|
|
62
62
|
.SH VERSION
|
|
63
|
-
v0.
|
|
63
|
+
v0.32.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
.ie \n(.g .ds Aq \(aq
|
|
2
2
|
.el .ds Aq '
|
|
3
|
-
.TH canon-artifacts-store 1 "store 0.
|
|
3
|
+
.TH canon-artifacts-store 1 "store 0.32.0"
|
|
4
4
|
.SH NAME
|
|
5
5
|
canon\-artifacts\-store \- Store the bound files of existing evidence records and current reviews in the artifact store (.canon/artifacts/sha256/)
|
|
6
6
|
.SH SYNOPSIS
|
|
@@ -51,4 +51,4 @@ For records written before canon stored bound bytes (0.11\-0.13), and for any ev
|
|
|
51
51
|
|
|
52
52
|
Exit 0 when the pass ran (the gate decides whether an unstored file matters), 2 when the ledger cannot be read or a write fails.
|
|
53
53
|
.SH VERSION
|
|
54
|
-
v0.
|
|
54
|
+
v0.32.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
.ie \n(.g .ds Aq \(aq
|
|
2
2
|
.el .ds Aq '
|
|
3
|
-
.TH canon-artifacts-verify 1 "verify 0.
|
|
3
|
+
.TH canon-artifacts-verify 1 "verify 0.32.0"
|
|
4
4
|
.SH NAME
|
|
5
5
|
canon\-artifacts\-verify \- Check that the artifact store holds every file the latest evidence and current reviews bind (\-\-full re\-hashes the stored bytes)
|
|
6
6
|
.SH SYNOPSIS
|
|
@@ -45,4 +45,4 @@ Asks the store canon.yaml\*(Aqs `artifacts:` block selects (default: local, .can
|
|
|
45
45
|
|
|
46
46
|
Exit 0 when every file is stored, 1 when one is missing or altered (data.problems names each), 2 when the store cannot be used or reached: an unreachable store is a refusal, never a pass.
|
|
47
47
|
.SH VERSION
|
|
48
|
-
v0.
|
|
48
|
+
v0.32.0
|