@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.
Files changed (127) hide show
  1. package/dist/skills/SKILL.src.md +77 -32
  2. package/dist/skills/reference/brief-align.md +2 -2
  3. package/dist/skills/reference/brief-clarify.md +2 -2
  4. package/dist/skills/reference/brief-harden.md +2 -2
  5. package/dist/skills/reference/brief-polish.md +8 -8
  6. package/dist/skills/reference/brief-shape.md +40 -9
  7. package/dist/skills/reference/canon-authoring.md +6 -6
  8. package/dist/skills/reference/canon-gate.md +45 -36
  9. package/dist/skills/reference/canon-learn.md +2 -2
  10. package/dist/skills/reference/canon-plan-import.md +2 -2
  11. package/dist/skills/reference/canon-plugins.md +6 -6
  12. package/dist/skills/reference/canon-policy.md +7 -4
  13. package/dist/skills/reference/canon-report-dashboard.md +17 -10
  14. package/dist/skills/reference/canon-review.md +24 -24
  15. package/dist/skills/reference/canon-storage.md +2 -2
  16. package/dist/skills/reference/canon-subject.md +137 -103
  17. package/dist/skills/reference/role-implementer.md +52 -36
  18. package/dist/skills/reference/role-orchestrator.md +68 -38
  19. package/dist/skills/reference/role-planner.md +99 -45
  20. package/dist/skills/reference/role-reviewer.md +69 -43
  21. package/man/canon-adapter-authorize.1 +2 -2
  22. package/man/canon-adapter-validate.1 +2 -2
  23. package/man/canon-adapter.1 +2 -2
  24. package/man/canon-artifacts-move.1 +2 -2
  25. package/man/canon-artifacts-store.1 +2 -2
  26. package/man/canon-artifacts-verify.1 +2 -2
  27. package/man/canon-artifacts.1 +2 -2
  28. package/man/canon-brief-approve.1 +17 -5
  29. package/man/canon-brief-check.1 +2 -2
  30. package/man/canon-brief-show.1 +6 -3
  31. package/man/canon-brief.1 +8 -7
  32. package/man/canon-change-new.1 +4 -4
  33. package/man/canon-change.1 +3 -3
  34. package/man/canon-completion.1 +2 -2
  35. package/man/canon-context-pack-add.1 +2 -2
  36. package/man/canon-context-pack-show.1 +2 -2
  37. package/man/canon-context-pack-verify.1 +2 -2
  38. package/man/canon-context-pack.1 +2 -2
  39. package/man/canon-context.1 +2 -2
  40. package/man/canon-dashboard.1 +2 -2
  41. package/man/canon-demo-init.1 +2 -2
  42. package/man/canon-demo-review.1 +2 -2
  43. package/man/canon-demo.1 +2 -2
  44. package/man/canon-dispatch-begin.1 +10 -10
  45. package/man/canon-dispatch-diff.1 +2 -2
  46. package/man/canon-dispatch-end.1 +2 -2
  47. package/man/canon-dispatch.1 +2 -2
  48. package/man/canon-divergence-accept.1 +15 -6
  49. package/man/canon-divergence-add.1 +6 -6
  50. package/man/canon-divergence-defer.1 +6 -6
  51. package/man/canon-divergence-list.1 +2 -2
  52. package/man/canon-divergence-resolve.1 +6 -6
  53. package/man/canon-divergence.1 +2 -2
  54. package/man/canon-evidence-add.1 +16 -16
  55. package/man/canon-evidence-approval-payload.1 +10 -10
  56. package/man/canon-evidence-audit.1 +10 -10
  57. package/man/canon-evidence.1 +3 -3
  58. package/man/canon-export.1 +2 -2
  59. package/man/canon-feature-new.1 +6 -6
  60. package/man/canon-feature.1 +2 -2
  61. package/man/canon-finding-add.1 +11 -11
  62. package/man/canon-finding-close.1 +8 -8
  63. package/man/canon-finding-list.1 +4 -4
  64. package/man/canon-finding.1 +4 -4
  65. package/man/canon-format.1 +2 -2
  66. package/man/canon-gate-check.1 +2 -2
  67. package/man/canon-gate-install-hooks.1 +2 -2
  68. package/man/canon-gate-promote.1 +2 -2
  69. package/man/canon-gate.1 +2 -2
  70. package/man/canon-ingest-plans.1 +2 -2
  71. package/man/canon-ingest-records.1 +4 -4
  72. package/man/canon-ingest-sessions.1 +2 -2
  73. package/man/canon-ingest.1 +2 -2
  74. package/man/canon-init.1 +2 -2
  75. package/man/canon-inventory-sync.1 +2 -2
  76. package/man/canon-inventory.1 +2 -2
  77. package/man/canon-ledger-compact.1 +2 -2
  78. package/man/canon-ledger.1 +2 -2
  79. package/man/canon-migrate.1 +20 -3
  80. package/man/canon-plugin-sync.1 +2 -2
  81. package/man/canon-plugin.1 +2 -2
  82. package/man/canon-policy-approve.1 +9 -3
  83. package/man/canon-policy-show.1 +2 -2
  84. package/man/canon-policy.1 +2 -2
  85. package/man/canon-prompt-add.1 +2 -2
  86. package/man/canon-prompt-show.1 +2 -2
  87. package/man/canon-prompt.1 +2 -2
  88. package/man/canon-purge.1 +2 -2
  89. package/man/canon-query.1 +5 -5
  90. package/man/canon-regime-show.1 +2 -2
  91. package/man/canon-regime.1 +2 -2
  92. package/man/canon-report-build.1 +2 -2
  93. package/man/canon-report-check.1 +2 -2
  94. package/man/canon-report-snapshot.1 +2 -2
  95. package/man/canon-report.1 +2 -2
  96. package/man/canon-retrieve.1 +5 -5
  97. package/man/canon-review-change.1 +6 -6
  98. package/man/canon-review-scenario.1 +6 -6
  99. package/man/canon-review.1 +2 -2
  100. package/man/canon-scenario-new.1 +10 -10
  101. package/man/canon-scenario.1 +2 -2
  102. package/man/canon-schema.1 +2 -2
  103. package/man/canon-search.1 +104 -0
  104. package/man/canon-selftest.1 +2 -2
  105. package/man/canon-skills-check.1 +2 -2
  106. package/man/canon-skills-doctor.1 +2 -2
  107. package/man/canon-skills-install.1 +2 -2
  108. package/man/canon-skills-show.1 +2 -2
  109. package/man/canon-skills.1 +2 -2
  110. package/man/canon-status.1 +7 -2
  111. package/man/canon-strategy-approval-payload.1 +2 -2
  112. package/man/canon-strategy-promote.1 +2 -2
  113. package/man/canon-strategy-rollback.1 +5 -5
  114. package/man/canon-strategy.1 +2 -2
  115. package/man/canon-subject-adopt.1 +4 -4
  116. package/man/canon-subject-move.1 +5 -5
  117. package/man/canon-subject-new.1 +5 -5
  118. package/man/canon-subject-show.1 +2 -2
  119. package/man/canon-subject-unadopt.1 +5 -5
  120. package/man/canon-subject.1 +2 -2
  121. package/man/canon-task-done.1 +2 -2
  122. package/man/canon-task.1 +2 -2
  123. package/man/canon-tier-age.1 +2 -2
  124. package/man/canon-tier.1 +2 -2
  125. package/man/canon-trace.1 +56 -0
  126. package/man/canon.1 +8 -2
  127. 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` and `divergence accept` refuse
8
- every agent role (`HUMAN_ONLY`, `retryable: false`), and no flag grants them. You never run them, and never remove or unset your role (`env -u CANON_ROLE`,
9
- dropping `--as`) to get past the refusal: report the exact call, slug filled in, and
10
- wait; the human runs it (or uses `canon dashboard`).
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-id <SUBJECT_ID> --title <TEXT> [--change-kind <feature|chore>] [--input]
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-id demo --title "Add search"
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-id <ACTOR_ID>] [--session-id <SESSION_ID>] [--project-id <PROJECT_ID>] [--input]
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-id <CHANGE_ID> [--open] [--limit <N> | --all] [--cursor <CURSOR>] [--fields <FIELDS>]
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-id add-login
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-id <PLUGIN_ID> | --history] [--change-id <CHANGE_ID>] [--status <STATUS>] [--domain <NAME>] [--include-sensitive] [--limit <N> | --all] [--cursor <CURSOR>] [--fields <FIELDS>]
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-id <SUBJECT_ID>] [--limit <N>]
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-id <SUBJECT_ID>] [--lane <NAME>] [--case <NAME>] [--flow <FLOW_ID>] [--change-id <CHANGE_ID> (with --flow)] [--actor-id <ACTOR_ID>] [--session-id <SESSION_ID>] [--feature <FILE>] [--project-id <PROJECT_ID>] [--input]
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-id <CHANGE_ID> [--dry-run] [--input]
147
+ canon subject adopt <SUBJECT_ID> --change <CHANGE_ID> [--dry-run] [--input]
139
148
  ```
140
149
  ```bash
141
- canon subject adopt demo --change-id add-login
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-id <ACTOR_ID>] [--session-id <SESSION_ID>] [--input]
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-id <CHANGE_ID> [--dry-run] [--input]
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 subject unadopt demo --change-id add-login
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 (a pending draft); once one
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. **Stop for the human.** Report the brief to the human, in the brief's
232
- language, asking once, and say they can approve it in `canon dashboard`
233
- (the briefs page, `/briefs.html`) or answer in chat. You never click
234
- Approve or fill that form yourself. Build nothing for that scope (no scenarios, code
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
- 5. **The human records the answer.** `brief approve` is the human's leaf: run
241
- by an agent role it is refused (`HUMAN_ONLY`) with a hint addressed to the
242
- human. Report the exact call, slug filled in, and wait: `canon brief approve
243
- add-login --approver <their name> --note "<their own words>"`; the human
244
- runs it in their own shell (`--approver` and `--note` are theirs to supply)
245
- or approves in the dashboard. Never approve in their name, never remove or
246
- unset your role (`env -u CANON_ROLE`, dropping `--as`) to run it, and never
247
- edit the policy to make the gate pass.
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` by the human. A follow-up that
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`: the brief is handed to the human and you
262
- stop. The scope is approved when the same command reports `state:
263
- approved`; read it in `data.state` of `canon brief show add-login --json`.
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 stop. A chore adds no scenarios: the
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. The brief is the report; stop, and put open questions into Questions and assumptions. |
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`. Name what the human has to decide in your report; never
8
- look for a flag that grants it. You never run them, and never remove or unset your role (`env -u CANON_ROLE`,
9
- dropping `--as`) to get past the refusal: report the exact call, slug filled in, and
10
- wait; the human runs it (or uses `canon dashboard`).
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-id <ACTOR_ID> [--project-id <PROJECT_ID>] [--rev <REV>] [--state <open|still-divergent|resolved|deferred>] [--reason <TEXT>] [--expiry <TIMESTAMP>] [--round <N>] [--session-id <SESSION_ID>] [--detail <TEXT>] [--role <ROLE>] [--promote | --no-promote] [--input]
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-id alice --role reviewer
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-id <ACTOR_ID> --reason <TEXT> --expiry <TIMESTAMP> [--project-id <PROJECT_ID>] [--rev <REV>] [--round <N>] [--session-id <SESSION_ID>] [--role <ROLE>] [--input]
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-id alice --reason "waiting on the vendor" --expiry 2030-01-01T00:00:00Z --role reviewer
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-id <ACTOR_ID> [--project-id <PROJECT_ID>] [--rev <REV>] [--round <N>] [--session-id <SESSION_ID>] [--detail <TEXT>] [--role <ROLE>] [--input]
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-id alice --role reviewer
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-id <CHANGE_ID> --round <N> --seq <N> --severity <blocker|should-fix|note> --actor-id <ACTOR_ID> --summary <TEXT> [--disposition <open|fixed|rejected|deferred>] [--rev <REV>] [--resolution-rev <REV>] [--introduced-rev <REV>] [--introduced-unknown] [--review-id <REVIEW_ID>] [--file-ref <TEXT>] [--scenario-id <SCENARIO_ID>]* [--role <ROLE>] [--session-id <SESSION_ID>] [--promote | --no-promote] [--input]
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-id add-login --round 1 --seq 2 --severity should-fix --introduced-unknown --actor-id alice --summary "Token is logged"
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-id <ACTOR_ID>] [--role <ROLE>] [--session-id <SESSION_ID>] [--promote | --no-promote] [--input]
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-id <CHANGE_ID> [--open] [--limit <N> | --all] [--cursor <CURSOR>] [--fields <FIELDS>]
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-id add-login
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-id <PLUGIN_ID> | --history] [--change-id <CHANGE_ID>] [--status <STATUS>] [--domain <NAME>] [--include-sensitive] [--limit <N> | --all] [--cursor <CURSOR>] [--fields <FIELDS>]
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-id <SUBJECT_ID>] [--limit <N>]
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-id <ACTOR_ID> (--upstream-ref <TEXT> | --original-spec-ref <TEXT>) [--project-id <PROJECT_ID>] [--rev <REV>] [--role <ROLE>] [--session-id <SESSION_ID>] [--review-outcome <signed|indeterminate|unavailable>] [--reviewer-provider <NAME>] [--reviewer-model <NAME>] [--reviewer-harness <NAME>] [--artifact <PATH>]* [--max-artifact-mib <N>] [--input]
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-id alice --role reviewer --original-spec-ref docs/prd.md
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-id <ACTOR_ID> (--upstream-ref <TEXT> | --original-spec-ref <TEXT>) [--project-id <PROJECT_ID>] [--rev <REV>] [--role <ROLE>] [--session-id <SESSION_ID>] [--review-outcome <signed|indeterminate|unavailable>] [--reviewer-provider <NAME>] [--reviewer-model <NAME>] [--reviewer-harness <NAME>] [--artifact <PATH>]* [--max-artifact-mib <N>] [--input]
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-id alice --role reviewer --original-spec-ref docs/prd.md
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-id reviewer-1 --session-id session-7 --original-spec-ref docs/prd.md
178
- canon review scenario auth.login.01 --actor-id reviewer-1 --session-id session-7 --review-outcome indeterminate --original-spec-ref docs/prd.md
179
- canon review change add-login --actor-id reviewer-1 --session-id session-7 --original-spec-ref docs/prd.md
180
- canon finding add --change-id add-login --round 1 --seq 2 --severity blocker --actor-id reviewer-1 --session-id session-7 --summary "No rate limit" --scenario-id auth.login.01 --scenario-id auth.login.02 --introduced-rev HEAD~3
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-id add-login --open
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 '[{"changeId":"add-login","round":1,"seq":3,"severity":"note","actorId":"reviewer-1","summary":"Token is logged"},{"changeId":"add-login","round":1,"seq":4,"severity":"should-fix","introducedUnknown":true,"actorId":"reviewer-1","summary":"Error text leaks the user name"}]'
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-id` or
214
- `--session-id` label. Pass your real session id as `--session-id` on
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. What you do:
273
- confirm the evidence really is divergent and the limit is outside this
274
- change, then report to the human the scenario ids, the reason, the
275
- tracking reference and an expiry when the limit should be gone by a date.
276
- Give the exact call, ids filled in: the human runs `canon divergence accept
277
- <ids> --actor-id <name> --reason "<why>" --tracking <ref>` themselves in their
278
- own shell, from a session that did not attest the evidence
279
- (`DIVERGENCE_ACCEPT_REFUSED` otherwise); you never run it or unset your role to. Never suggest it to skip
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-id` for each scenario a finding is about. A blocker you
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-id <id>`); the
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-id <me> --session-id <session>
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-id add-login --open` shows the
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." | `divergence accept` refuses agent roles; report the gap to the human. |
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.30.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.30.0
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.30.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.30.0
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 1 "adapter 0.30.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.30.0
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.30.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.30.0
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.30.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.30.0
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.30.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.30.0
48
+ v0.32.0